diff --git a/packages/contract-artifacts/artifacts/DevUtils.json b/packages/contract-artifacts/artifacts/DevUtils.json index 27ed08e891..d3928a64c4 100644 --- a/packages/contract-artifacts/artifacts/DevUtils.json +++ b/packages/contract-artifacts/artifacts/DevUtils.json @@ -1,2362 +1,1073 @@ { - "schemaVersion": "2.0.0", - "contractName": "DevUtils", - "compilerOutput": { - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_exchange", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "constant": true, - "inputs": [], - "name": "EIP712_EXCHANGE_DOMAIN_HASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeAssetProxyDispatchError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.AssetProxyDispatchErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeAssetProxyExistsError", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "assetProxyAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "decodeAssetProxyId", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeAssetProxyTransferError", - "outputs": [ - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "errorData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeEIP1271SignatureError", - "outputs": [ - { - "internalType": "address", - "name": "verifyingContractAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "errorData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "decodeERC1155AssetData", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "tokenIds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "tokenValues", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "callbackData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "decodeERC20AssetData", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "decodeERC721AssetData", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeExchangeInvalidContextError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.ExchangeContextErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "contextAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeFillError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.FillErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeIncompleteFillError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.IncompleteFillErrorCode", - "name": "errorCode", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "expectedAssetFillAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "actualAssetFillAmount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "decodeMultiAssetData", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - }, - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "nestedAssetData", - "type": "bytes[]" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeNegativeSpreadError", - "outputs": [ - { - "internalType": "bytes32", - "name": "leftOrderHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "rightOrderHash", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeOrderEpochError", - "outputs": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "orderSenderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "currentEpoch", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeOrderStatusError", - "outputs": [ - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - }, - { - "internalType": "enum LibOrder.OrderStatus", - "name": "orderStatus", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeSignatureError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.SignatureErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "signerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeSignatureValidatorNotApprovedError", - "outputs": [ - { - "internalType": "address", - "name": "signerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "validatorAddress", - "type": "address" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeSignatureWalletError", - "outputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "signerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "errorData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "decodeStaticCallAssetData", - "outputs": [ - { - "internalType": "bytes4", - "name": "assetProxyId", - "type": "bytes4" - }, - { - "internalType": "address", - "name": "staticCallTargetAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "staticCallData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "expectedReturnDataHash", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeTransactionError", - "outputs": [ - { - "internalType": "enum LibExchangeRichErrors.TransactionErrorCodes", - "name": "errorCode", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "transactionHash", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "name": "decodeTransactionExecutionError", - "outputs": [ - { - "internalType": "bytes32", - "name": "transactionHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "errorData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "transactionData", - "type": "bytes" - } - ], - "name": "decodeZeroExTransactionData", - "outputs": [ - { - "internalType": "string", - "name": "functionName", - "type": "string" - }, - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "uint256[]", - "name": "takerAssetFillAmounts", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "signatures", - "type": "bytes[]" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "tokenIds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "tokenValues", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "callbackData", - "type": "bytes" - } - ], - "name": "encodeERC1155AssetData", - "outputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - } - ], - "name": "encodeERC20AssetData", - "outputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "encodeERC721AssetData", - "outputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "nestedAssetData", - "type": "bytes[]" - } - ], - "name": "encodeMultiAssetData", - "outputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "staticCallTargetAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "staticCallData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "expectedReturnDataHash", - "type": "bytes32" - } - ], - "name": "encodeStaticCallAssetData", - "outputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "getAssetProxyAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "allowance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "getBalance", - "outputs": [ - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "getBalanceAndAssetProxyAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "allowance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes[]", - "name": "assetData", - "type": "bytes[]" - } - ], - "name": "getBatchAssetProxyAllowances", - "outputs": [ - { - "internalType": "uint256[]", - "name": "allowances", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes[]", - "name": "assetData", - "type": "bytes[]" - } - ], - "name": "getBatchBalances", - "outputs": [ - { - "internalType": "uint256[]", - "name": "balances", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes[]", - "name": "assetData", - "type": "bytes[]" - } - ], - "name": "getBatchBalancesAndAssetProxyAllowances", - "outputs": [ - { - "internalType": "uint256[]", - "name": "balances", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "allowances", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address[]", - "name": "addresses", - "type": "address[]" - } - ], - "name": "getEthBalances", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order", - "name": "order", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "exchange", - "type": "address" - } - ], - "name": "getOrderHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order", - "name": "order", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "name": "getOrderRelevantState", - "outputs": [ - { - "components": [ - { - "internalType": "uint8", - "name": "orderStatus", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "orderTakerAssetFilledAmount", - "type": "uint256" - } - ], - "internalType": "struct LibOrder.OrderInfo", - "name": "orderInfo", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "fillableTakerAssetAmount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isValidSignature", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "bytes[]", - "name": "signatures", - "type": "bytes[]" - } - ], - "name": "getOrderRelevantStates", - "outputs": [ - { - "components": [ - { - "internalType": "uint8", - "name": "orderStatus", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "orderTakerAssetFilledAmount", - "type": "uint256" - } - ], - "internalType": "struct LibOrder.OrderInfo[]", - "name": "ordersInfo", - "type": "tuple[]" - }, - { - "internalType": "uint256[]", - "name": "fillableTakerAssetAmounts", - "type": "uint256[]" - }, - { - "internalType": "bool[]", - "name": "isValidSignature", - "type": "bool[]" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order", - "name": "order", - "type": "tuple" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "takerAssetFillAmount", - "type": "uint256" - } - ], - "name": "getSimulatedOrderMakerTransferResults", - "outputs": [ - { - "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", - "name": "orderTransferResults", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order", - "name": "order", - "type": "tuple" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "takerAssetFillAmount", - "type": "uint256" - } - ], - "name": "getSimulatedOrderTransferResults", - "outputs": [ - { - "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", - "name": "orderTransferResults", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "makerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "takerAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "feeRecipientAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "senderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "makerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerAssetAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "makerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "takerFee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "makerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "makerFeeAssetData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "takerFeeAssetData", - "type": "bytes" - } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { - "internalType": "address[]", - "name": "takerAddresses", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "takerAssetFillAmounts", - "type": "uint256[]" - } - ], - "name": "getSimulatedOrdersTransferResults", - "outputs": [ - { - "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults[]", - "name": "orderTransferResults", - "type": "uint8[]" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "salt", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expirationTimeSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "signerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct LibZeroExTransaction.ZeroExTransaction", - "name": "transaction", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "exchange", - "type": "address" - } - ], - "name": "getTransactionHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "transactionHash", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "getTransferableAssetAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "transferableAssetAmount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "assetData", - "type": "bytes" - } - ], - "name": "revertIfInvalidAssetData", - "outputs": [], - "payable": false, - "stateMutability": "pure", - "type": "function" - } - ], - "devdoc": { - "methods": { - "decodeAssetProxyDispatchError(bytes)": { - "details": "Decompose an ABI-encoded AssetProxyDispatchError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "errorCode The error code.orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched." - }, - "decodeAssetProxyExistsError(bytes)": { - "details": "Decompose an ABI-encoded AssetProxyExistsError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "assetProxyId Id of asset proxy.assetProxyAddress The address of the asset proxy." - }, - "decodeAssetProxyId(bytes)": { - "details": "Decode AssetProxy identifier", - "params": { - "assetData": "AssetProxy-compliant asset data describing an ERC-20, ERC-721, ERC1155, or MultiAsset asset." - }, - "return": "The AssetProxy identifier" - }, - "decodeAssetProxyTransferError(bytes)": { - "details": "Decompose an ABI-encoded AssetProxyTransferError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched.errorData ABI-encoded revert data from the asset proxy." - }, - "decodeEIP1271SignatureError(bytes)": { - "details": "Decompose an ABI-encoded SignatureValidatorError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." - }, - "decodeERC1155AssetData(bytes)": { - "details": "Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.", - "params": { - "assetData": "AssetProxy-compliant asset data describing an ERC-1155 set of assets." - }, - "return": "The ERC-1155 AssetProxy identifier, the address of the ERC-1155 contract hosting the assets, an array of the identifiers of the assets to be traded, an array of asset amounts to be traded, and callback data. Each element of the arrays corresponds to the same-indexed element of the other array. Return values specified as `memory` are returned as pointers to locations within the memory of the input parameter `assetData`." - }, - "decodeERC20AssetData(bytes)": { - "details": "Decode ERC-20 asset data from the format described in the AssetProxy contract specification.", - "params": { - "assetData": "AssetProxy-compliant asset data describing an ERC-20 asset." - }, - "return": "The AssetProxy identifier, and the address of the ERC-20 contract hosting this asset." - }, - "decodeERC721AssetData(bytes)": { - "details": "Decode ERC-721 asset data from the format described in the AssetProxy contract specification.", - "params": { - "assetData": "AssetProxy-compliant asset data describing an ERC-721 asset." - }, - "return": "The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded." - }, - "decodeExchangeInvalidContextError(bytes)": { - "details": "Decompose an ABI-encoded OrderStatusError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "errorCode Error code that corresponds to invalid maker, taker, or sender.orderHash The order hash.contextAddress The maker, taker, or sender address" - }, - "decodeFillError(bytes)": { - "details": "Decompose an ABI-encoded FillError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "errorCode The error code.orderHash The order hash." - }, - "decodeIncompleteFillError(bytes)": { - "details": "Decompose an ABI-encoded IncompleteFillError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "orderHash Hash of the order being filled." - }, - "decodeMultiAssetData(bytes)": { - "details": "Decode multi-asset data from the format described in the AssetProxy contract specification.", - "params": { - "assetData": "AssetProxy-compliant data describing a multi-asset basket." - }, - "return": "The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded. Each element of the arrays corresponds to the same-indexed element of the other array." - }, - "decodeNegativeSpreadError(bytes)": { - "details": "Decompose an ABI-encoded NegativeSpreadError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "leftOrderHash Hash of the left order being matched.rightOrderHash Hash of the right order being matched." - }, - "decodeOrderEpochError(bytes)": { - "details": "Decompose an ABI-encoded OrderEpochError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "makerAddress The order maker.orderSenderAddress The order sender.currentEpoch The current epoch for the maker." - }, - "decodeOrderStatusError(bytes)": { - "details": "Decompose an ABI-encoded OrderStatusError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "orderHash The order hash.orderStatus The order status." - }, - "decodeSignatureError(bytes)": { - "details": "Decompose an ABI-encoded SignatureError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature." - }, - "decodeSignatureValidatorNotApprovedError(bytes)": { - "details": "Decompose an ABI-encoded SignatureValidatorNotApprovedError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "signerAddress The expected signer of the hash.validatorAddress The expected validator." - }, - "decodeSignatureWalletError(bytes)": { - "details": "Decompose an ABI-encoded SignatureWalletError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." - }, - "decodeStaticCallAssetData(bytes)": { - "details": "Decode StaticCall asset data from the format described in the AssetProxy contract specification.", - "params": { - "assetData": "AssetProxy-compliant asset data describing a StaticCall asset" - }, - "return": "The StaticCall AssetProxy identifier, the target address of the StaticCAll, the data to be passed to the target address, and the expected Keccak-256 hash of the static call return data." - }, - "decodeTransactionError(bytes)": { - "details": "Decompose an ABI-encoded TransactionError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "errorCode The error code.transactionHash Hash of the transaction." - }, - "decodeTransactionExecutionError(bytes)": { - "details": "Decompose an ABI-encoded TransactionExecutionError.", - "params": { - "encoded": "ABI-encoded revert error." - }, - "return": "transactionHash Hash of the transaction.errorData Error thrown by exeucteTransaction()." - }, - "decodeZeroExTransactionData(bytes)": { - "details": "Decodes the call data for an Exchange contract method call.", - "params": { - "transactionData": "ABI-encoded calldata for an Exchange contract method call." - }, - "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." - }, - "encodeERC1155AssetData(address,uint256[],uint256[],bytes)": { - "details": "Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.", - "params": { - "callbackData": "Data to be passed to receiving contracts when a transfer is performed.", - "tokenAddress": "The address of the ERC-1155 contract hosting the asset(s) to be traded.", - "tokenIds": "The identifiers of the specific assets to be traded.", - "tokenValues": "The amounts of each asset to be traded." - }, - "return": "AssetProxy-compliant asset data describing the set of assets." - }, - "encodeERC20AssetData(address)": { - "details": "Encode ERC-20 asset data into the format described in the AssetProxy contract specification.", - "params": { - "tokenAddress": "The address of the ERC-20 contract hosting the asset to be traded." - }, - "return": "AssetProxy-compliant data describing the asset." - }, - "encodeERC721AssetData(address,uint256)": { - "details": "Encode ERC-721 asset data into the format described in the AssetProxy specification.", - "params": { - "tokenAddress": "The address of the ERC-721 contract hosting the asset to be traded.", - "tokenId": "The identifier of the specific asset to be traded." - }, - "return": "AssetProxy-compliant asset data describing the asset." - }, - "encodeMultiAssetData(uint256[],bytes[])": { - "details": "Encode data for multiple assets, per the AssetProxy contract specification.", - "params": { - "amounts": "The amounts of each asset to be traded.", - "nestedAssetData": "AssetProxy-compliant data describing each asset to be traded." - }, - "return": "AssetProxy-compliant data describing the set of assets." - }, - "encodeStaticCallAssetData(address,bytes,bytes32)": { - "details": "Encode StaticCall asset data into the format described in the AssetProxy contract specification.", - "params": { - "expectedReturnDataHash": "Expected Keccak-256 hash of the StaticCall return data.", - "staticCallData": "Data that will be passed to staticCallTargetAddress in the StaticCall.", - "staticCallTargetAddress": "Target address of StaticCall." - }, - "return": "AssetProxy-compliant asset data describing the set of assets." - }, - "getAssetProxyAllowance(address,bytes)": { - "details": "Returns the number of asset(s) (described by assetData) that the corresponding AssetProxy contract is authorized to spend. When the asset data contains multiple assets (eg for Multi-Asset), the return value indicates how many complete \"baskets\" of those assets may be spent by all of the corresponding AssetProxy contracts.", - "params": { - "assetData": "Details of asset, encoded per the AssetProxy contract specification.", - "ownerAddress": "Owner of the assets specified by assetData." - }, - "return": "Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend." - }, - "getBalance(address,bytes)": { - "details": "Returns the owner's balance of the assets(s) specified in assetData. When the asset data contains multiple assets (eg in ERC1155 or Multi-Asset), the return value indicates how many complete \"baskets\" of those assets are owned by owner.", - "params": { - "assetData": "Details of asset, encoded per the AssetProxy contract specification.", - "ownerAddress": "Owner of the assets specified by assetData." - }, - "return": "Number of assets (or asset baskets) held by owner." - }, - "getBalanceAndAssetProxyAllowance(address,bytes)": { - "details": "Calls getBalance() and getAllowance() for assetData.", - "params": { - "assetData": "Details of asset, encoded per the AssetProxy contract specification.", - "ownerAddress": "Owner of the assets specified by assetData." - }, - "return": "Number of assets (or asset baskets) held by owner, and number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend." - }, - "getBatchAssetProxyAllowances(address,bytes[])": { - "details": "Calls getAssetProxyAllowance() for each element of assetData.", - "params": { - "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", - "ownerAddress": "Owner of the assets specified by assetData." - }, - "return": "An array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." - }, - "getBatchBalances(address,bytes[])": { - "details": "Calls getBalance() for each element of assetData.", - "params": { - "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", - "ownerAddress": "Owner of the assets specified by assetData." - }, - "return": "Array of asset balances from getBalance(), with each element corresponding to the same-indexed element in the assetData input." - }, - "getBatchBalancesAndAssetProxyAllowances(address,bytes[])": { - "details": "Calls getBatchBalances() and getBatchAllowances() for each element of assetData.", - "params": { - "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", - "ownerAddress": "Owner of the assets specified by assetData." - }, - "return": "An array of asset balances from getBalance(), and an array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." - }, - "getEthBalances(address[])": { - "details": "Batch fetches ETH balances", - "params": { - "addresses": "Array of addresses." - }, - "return": "Array of ETH balances." - }, - "getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)": { - "details": "Fetches all order-relevant information needed to validate if the supplied order is fillable.", - "params": { - "order": "The order structure.", - "signature": "Signature provided by maker that proves the order's authenticity. `0x01` can always be provided if the signature does not need to be validated." - }, - "return": "The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order), fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (validity of the provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." - }, - "getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { - "details": "Fetches all order-relevant information needed to validate if the supplied orders are fillable.", - "params": { - "orders": "Array of order structures.", - "signatures": "Array of signatures provided by makers that prove the authenticity of the orders. `0x01` can always be provided if a signature does not need to be validated." - }, - "return": "The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order), fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (array containing the validity of each provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." - }, - "getSimulatedOrderMakerTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),address,uint256)": { - "details": "Simulates the maker transfers within an order and returns the index of the first failed transfer.", - "params": { - "order": "The order to simulate transfers for.", - "takerAddress": "The address of the taker that will fill the order.", - "takerAssetFillAmount": "The amount of takerAsset that the taker wished to fill." - }, - "return": "The index of the first failed transfer (or 4 if all transfers are successful)." - }, - "getSimulatedOrderTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),address,uint256)": { - "details": "Simulates all of the transfers within an order and returns the index of the first failed transfer.", - "params": { - "order": "The order to simulate transfers for.", - "takerAddress": "The address of the taker that will fill the order.", - "takerAssetFillAmount": "The amount of takerAsset that the taker wished to fill." - }, - "return": "The index of the first failed transfer (or 4 if all transfers are successful)." - }, - "getSimulatedOrdersTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],address[],uint256[])": { - "details": "Simulates all of the transfers for each given order and returns the indices of each first failed transfer.", - "params": { - "orders": "Array of orders to individually simulate transfers for.", - "takerAddresses": "Array of addresses of takers that will fill each order.", - "takerAssetFillAmounts": "Array of amounts of takerAsset that will be filled for each order." - }, - "return": "The indices of the first failed transfer (or 4 if all transfers are successful) for each order." - }, - "getTransferableAssetAmount(address,bytes)": { - "details": "Gets the amount of an asset transferable by the owner.", - "params": { - "assetData": "Description of tokens, per the AssetProxy contract specification.", - "ownerAddress": "Address of the owner of the asset." - }, - "return": "The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`." - } - } - }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x60806040523480156200001157600080fd5b5060405162005d5238038062005d528339810160408190526200003491620004b7565b600080546001600160a01b0319166001600160a01b03838116919091178083556040517f6070410800000000000000000000000000000000000000000000000000000000815283928592839283929190911690636070410890620000bd907ff47261b00000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b158015620000d657600080fd5b505afa158015620000eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001119190810190620004b7565b600180546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200018f907f025717920000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b158015620001a857600080fd5b505afa158015620001bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001e39190810190620004b7565b600280546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000261907fa7cb5fb70000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b1580156200027a57600080fd5b505afa1580156200028f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002b59190810190620004b7565b600380546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000333907fc339d10a0000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b1580156200034c57600080fd5b505afa15801562000361573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620003879190810190620004b7565b600480546001600160a01b03199081166001600160a01b039384161790915560058054909116938216939093179092555060009150821615620003cb5781620003cd565b305b9050620004526040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525085846200046060201b6200358a1760201c565b600655506200051492505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620004c9578081fd5b81516001600160a01b0381168114620004e0578182fd5b9392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b61582e80620005246000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80639a7e752611610151578063ca49f47c116100c3578063d3d862d111610087578063d3d862d1146106a9578063d4695028146106bc578063e25cabf7146106dc578063e4e6e7da146106fe578063e77286eb1461071f578063ee4f5a941461074157610274565b8063ca49f47c1461062c578063cafd3a071461064f578063d001c5dc14610670578063d186037f14610683578063d36379051461069657610274565b8063a6627e9f11610115578063a6627e9f14610598578063acaedc74146105ab578063b43cffe1146105ce578063bbb2dcf6146105e1578063bc03f96414610603578063c26cfecd1461062457610274565b80639a7e75261461050b5780639eadc8351461052e578063a070cac814610552578063a0901e5114610565578063a5cd62ba1461057857610274565b80634dfdac20116101ea5780637914b2ec116101ae5780637914b2ec146104705780637982653e1461049157806379c9c426146104b15780637b66ad34146104c45780637d727512146104e55780638f4ce479146104f857610274565b80634dfdac20146103d8578063590aa875146103f857806363eb399214610418578063651290421461042b5780636f83188e1461044d57610274565b8063314853ff1161023c578063314853ff14610328578063327d30541461034a57806332aae3ad1461035d5780633db6dc611461037f578063459be5e2146103a257806346eb65cb146103c357610274565b806302d0aec31461027957806304a5618a146102a35780630d7b7d76146102c5578063165979e1146102e65780632322cf7614610308575b600080fd5b61028c610287366004614851565b610763565b60405161029a92919061528b565b60405180910390f35b6102b66102b1366004614851565b6107bf565b60405161029a9392919061537d565b6102d86102d336600461438f565b61083a565b60405161029a929190615239565b6102f96102f4366004614851565b61085c565b60405161029a939291906154b7565b61031b61031636600461438f565b6108b9565b60405161029a91906151f4565b61033b610336366004614851565b6108e1565b60405161029a93929190615260565b6102d8610358366004614851565b610928565b61037061036b366004614851565b61096a565b60405161029a9392919061542d565b61039261038d366004614851565b6109bd565b60405161029a94939291906151fd565b6103b56103b0366004614851565b610a07565b60405161029a9291906154a0565b6103d66103d1366004614851565b610a5d565b005b6103eb6103e63660046142b8565b610b59565b60405161029a919061518e565b61040b610406366004614133565b610bdc565b60405161029a91906153dc565b61040b6104263660046143d2565b610c32565b61043e610439366004614851565b610c8f565b60405161029a93929190614f43565b61046061045b366004614851565b610cc9565b60405161029a949392919061552c565b61048361047e366004614851565b6114d6565b60405161029a9291906152bd565b6104a461049f3660046148fa565b61150e565b60405161029a91906154d2565b61031b6104bf366004614aa9565b611795565b6104d76104d2366004614851565b6117f4565b60405161029a929190614f29565b61031b6104f336600461438f565b61182c565b610483610506366004614851565b611daf565b61051e610519366004614851565b611e0c565b60405161029a94939291906154e6565b61054161053c366004614851565b611e6d565b60405161029a9594939291906152e0565b61031b6105603660046149a7565b611ee5565b6103eb610573366004614453565b611f3c565b61058b6105863660046144b7565b611fb5565b60405161029a9190615095565b61040b6105a6366004614428565b612078565b6105be6105b9366004614851565b6120d1565b60405161029a9493929190614fef565b61040b6105dc366004614305565b61210d565b6105f46105ef366004614851565b61216c565b60405161029a939291906153a8565b610616610611366004614851565b6121e6565b60405161029a929190615247565b61031b61221f565b61063f61063a366004614851565b612225565b60405161029a9493929190615338565b61066261065d366004614851565b6122a3565b60405161029a92919061551f565b6103eb61067e3660046142b8565b6122f1565b61031b61069136600461438f565b61235f565b6104a46106a43660046148fa565b6127e9565b61040b6106b736600461465b565b612b49565b6106cf6106ca366004614851565b612b68565b60405161029a91906152a8565b6106ef6106ea36600461453a565b612c1d565b60405161029a939291906150e2565b61071161070c3660046142b8565b612d55565b60405161029a9291906151cf565b61073261072d366004614951565b612d6e565b60405161029a93929190615692565b61075461074f366004614851565b612fa6565b60405161029a93929190615476565b60008061077783610772612fe3565b612fee565b6000610790600485518661302e9092919063ffffffff16565b8060200190516107a39190810190614804565b909350905060ff811660068111156107b757fe5b915050915091565b600080806107d3848263ffffffff61307116565b92506001600160e01b0319831663012b8bc960e11b1461080e5760405162461bcd60e51b81526004016108059061566a565b60405180910390fd5b61081f84601063ffffffff6130a516565b915061083284602463ffffffff6130d816565b929491935050565b600080610847848461182c565b9150610853848461235f565b90509250929050565b600080600061086d846107726130e4565b6000610886600486518761302e9092919063ffffffff16565b8060200190516108999190810190614c84565b9094509250905060ff811660028111156108af57fe5b9350509193909250565b60008060006108c8858561083a565b915091506108d682826130ef565b925050505b92915050565b60006060806108f284610772613105565b835161090890859060049063ffffffff61302e16565b80602001905161091b91908101906147a5565b9196909550909350915050565b60008061093783610772613110565b825161094d90849060049063ffffffff61302e16565b8060200190516109609190810190614748565b9094909350915050565b600080606061097b8461077261311b565b6000610994600486518761302e9092919063ffffffff16565b8060200190516109a79190810190614c39565b9094509250905060ff811660018111156108af57fe5b6000806060806109cf85610772613126565b84516109e590869060049063ffffffff61302e16565b8060200190516109f89190810190614705565b92989197509550909350915050565b600080610a1683610772613131565b6000610a2f600485518661302e9092919063ffffffff16565b806020019051610a429190810190614b78565b9250905060ff81166003811115610a5557fe5b925050915091565b6000610a6f828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1415610a9a57610a9382611daf565b5050610b55565b6001600160e01b0319811663012b8bc960e11b1415610ac457610abc826107bf565b505050610b55565b6001600160e01b0319811663a7cb5fb760e01b1415610af057610ae682611e6d565b5050505050610b55565b6001600160e01b031981166394cfcdd760e01b1415610b1257610abc8261216c565b6001600160e01b0319811663619ce88560e11b1415610b3d57610b3482612225565b50505050610b55565b60405162461bcd60e51b81526004016108059061566a565b5050565b606060008251905080604051908082528060200260200182016040528015610b8b578160200160208202803883390190505b50915060005b818114610bd457610bb585858381518110610ba857fe5b602002602001015161235f565b838281518110610bc157fe5b6020908102919091010152600101610b91565b505092915050565b604051606090630f47261b60e41b90610bf9908490602401614f15565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610c5390869086908690602401614fbb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610ca08461077261313c565b8351610cb690859060049063ffffffff61302e16565b80602001905161091b9190810190614188565b60608080806000610ce0868263ffffffff61307116565b90506001600160e01b0319811663dedfc1f160e01b1415610d2c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b81525094506110d8565b6001600160e01b03198116634b4a520160e11b1415610d74576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b81525094506110d8565b6001600160e01b031981166323aa37f960e21b1415610dc35760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b03198116632fbb8b8560e21b1415610e115760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b81525094506110d8565b6001600160e01b03198116632da6298760e01b1415610e55576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b81525094506110d8565b6001600160e01b03198116634da26aab60e11b1415610e9757604051806040016040528060098152602001683334b63627b93232b960b91b81525094506110d8565b6001600160e01b03198116633852d63160e21b1415610edf576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b81525094506110d8565b6001600160e01b031981166378d29ac160e01b1415610f2e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b0319811663369da09960e01b1415610f84576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f7700000000000000000081525094506110d8565b6001600160e01b03198116638bc8efb360e01b1415610fda576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c0000000000000081525094506110d8565b6001600160e01b0319811663a6c3bf3360e01b1415611030576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c00000000000081525094506110d8565b6001600160e01b031981166388ec79fb60e01b1415611074576040518060400160405280600b81526020016a6d617463684f726465727360a81b81525094506110d8565b6001600160e01b03198116634f9559b160e01b14806110a357506001600160e01b031981166302280c9160e41b145b156110c05760405162461bcd60e51b81526004016108059061561d565b60405162461bcd60e51b8152600401610805906155e6565b6001600160e01b0319811663dedfc1f160e01b141561116457855161110790879060049063ffffffff61314716565b80602001905161111a9190810190614485565b604080516000808252602082019092529195505b506040805160008082526020820190925291945061115c565b60608152602001906001900390816111475790505b5091506114ce565b6001600160e01b03198116632fbb8b8560e21b148061119357506001600160e01b03198116634b4a520160e11b145b806111ae57506001600160e01b031981166323aa37f960e21b145b156111c8576111bc866131c7565b919550935091506114ce565b6001600160e01b03198116632da6298760e01b14156112975760408051600180825281830190925290816020015b6111fe613a68565b8152602001906001900390816111f6575050865190945061122990879060049063ffffffff61314716565b80602001905161123c91908101906148c8565b8460008151811061124957fe5b6020026020010181905250600060405190808252806020026020018201604052801561112e57816020016020820280388339019050506040805160008082526020820190925291945061115c565b6001600160e01b03198116633852d63160e21b14806112c657506001600160e01b03198116634da26aab60e11b145b156112d4576111bc866131f6565b6001600160e01b031981166378d29ac160e01b148061130357506001600160e01b0319811663369da09960e01b145b8061131e57506001600160e01b03198116638bc8efb360e01b145b8061133957506001600160e01b0319811663a6c3bf3360e01b145b15611347576111bc866132f0565b6001600160e01b031981166388ec79fb60e01b14156114ce57611368613a68565b611370613a68565b60608061138a60048b518c6131479092919063ffffffff16565b80602001905161139d91908101906149ff565b604080516002808252606082019092529498509296509094509250816020015b6113c5613a68565b8152602001906001900390816113bd57905050975083886000815181106113e857fe5b6020026020010181905250828860018151811061140157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061144157fe5b6020026020010181815250508260a001518760018151811061145f57fe5b60209081029190910101526040805160028082526060820190925290816020015b606081526020019060019003908161148057905050955081866000815181106114a557fe5b602002602001018190525080866001815181106114be57fe5b6020026020010181905250505050505b509193509193565b6000806114e583610772613364565b82516114fb90849060049063ffffffff61302e16565b8060200190516109609190810190614828565b6000611518613afb565b6115a98584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b505afa15801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115a39190810190614b60565b3a61336e565b60408051600280825260608281019093529293509091816020015b60608152602001906001900390816115c457505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061165357fe5b602002602001018190525088600001518360008151811061167057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061169e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106116d057fe5b602002602001018181525050886101800151846001815181106116ef57fe5b602002602001018190525088600001518360018151811061170c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061177057fe5b602002602001018181525050611788848484846133e5565b9998505050505050505050565b60006117ec846117e76040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b6135e1565b949350505050565b600080611803836107726135f5565b825161181990849060049063ffffffff61302e16565b806020019051610960919081019061414f565b60008061183f838263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b141561195857600061186d84601063ffffffff6130a516565b6040519091506060906370a0823160e01b9061188d908890602401614f15565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516118de9190614ef9565b600060405180830381855afa9150503d8060008114611919576040519150601f19603f3d011682016040523d82523d6000602084013e61191e565b606091505b5091509150818015611931575080516020145b61193c57600061194d565b61194d81600063ffffffff6130d816565b955050505050611da8565b6001600160e01b0319811663012b8bc960e11b1415611a975760008061197d856107bf565b6040519194509250606091506331a9108f60e11b906119a09084906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119f19190614ef9565b600060405180830381855afa9150503d8060008114611a2c576040519150601f19603f3d011682016040523d82523d6000602084013e611a31565b606091505b50915091506000828015611a46575081516020145b611a51576000611a62565b611a6282600c63ffffffff6130a516565b9050896001600160a01b0316816001600160a01b031614611a84576000611a87565b60015b60ff169750505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b1415611c1e576000606080611abe86611e6d565b5081519296509094509250905060005b818114611c14578351606090627eeac760e11b908b90879085908110611af057fe5b6020026020010151604051602401611b09929190615025565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b5a9190614ef9565b600060405180830381855afa9150503d8060008114611b95576040519150601f19603f3d011682016040523d82523d6000602084013e611b9a565b606091505b50915091506000828015611baf575081516020145b611bba576000611bcb565b611bcb82600063ffffffff6130d816565b90506000878681518110611bdb57fe5b60200260200101518281611beb57fe5b0490508b811080611bfa57508b155b15611c0357809b505b505060019093019250611ace915050565b5050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611d0a57604051606090632a17967960e21b90611c5b908690600090819081906024016153ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cad908490614ef9565b600060405180830381855afa9150503d8060008114611ce8576040519150601f19603f3d011682016040523d82523d6000602084013e611ced565b606091505b5050905080611cfd576000611d01565b6000195b93505050611da8565b6001600160e01b031981166394cfcdd760e01b1415611da857606080611d2f8561216c565b80519194509250905060005b818114611da3576000611d6189858481518110611d5457fe5b602002602001015161182c565b90506000858381518110611d7157fe5b60200260200101518281611d8157fe5b04905087811080611d90575087155b15611d99578097505b5050600101611d3b565b505050505b5092915050565b600080611dc2838263ffffffff61307116565b91506001600160e01b03198216630f47261b60e41b14611df45760405162461bcd60e51b81526004016108059061566a565b611e0583601063ffffffff6130a516565b9050915091565b60008060006060611e1f85610772613600565b6000611e38600487518861302e9092919063ffffffff16565b806020019051611e4b9190810190614bdc565b91965094509250905060ff81166006811115611e6357fe5b9450509193509193565b60008060608080611e84868563ffffffff61307116565b94506001600160e01b0319851663a7cb5fb760e01b14611eb65760405162461bcd60e51b81526004016108059061566a565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006117ec84611f376040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b61360b565b6060808251604051908082528060200260200182016040528015611f6a578160200160208202803883390190505b50905060005b83518114611da857838181518110611f8457fe5b60200260200101516001600160a01b031631828281518110611fa257fe5b6020908102919091010152600101611f70565b606060008451905080604051908082528060200260200182016040528015611fe7578160200160208202803883390190505b50915060005b81811461206f5761203886828151811061200357fe5b602002602001015186838151811061201757fe5b602002602001015186848151811061202b57fe5b60200260200101516127e9565b83828151811061204457fe5b6020026020010190600481111561205757fe5b9081600481111561206457fe5b905250600101611fed565b50509392505050565b60405160609063012b8bc960e11b906120979085908590602401615025565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606120e48561077261361a565b84516120fa90869060049063ffffffff61302e16565b8060200190516109f89190810190614221565b60405160609063a7cb5fb760e01b90612130908790879087908790602401614f67565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612181848463ffffffff61307116565b92506001600160e01b031983166394cfcdd760e01b146121b35760405162461bcd60e51b81526004016108059061566a565b83516121c990859060049063ffffffff61314716565b8060200190516121dc919081019061468f565b9395909450915050565b600060606121f683610772613625565b825161220c90849060049063ffffffff61302e16565b806020019051610960919081019061476b565b60065481565b60008060608161223b858263ffffffff61307116565b93506001600160e01b0319841663619ce88560e11b1461226d5760405162461bcd60e51b81526004016108059061566a565b845161228390869060049063ffffffff61314716565b80602001905161229691908101906141ca565b9597919650949350915050565b6000806122b283610772613630565b60006122cb600485518661302e9092919063ffffffff16565b8060200190516122de9190810190614b78565b9250905060ff81166001811115610a5557fe5b606060008251905080604051908082528060200260200182016040528015612323578160200160208202803883390190505b50915060005b818114610bd45761234085858381518110611d5457fe5b83828151811061234c57fe5b6020908102919091010152600101612329565b600080612372838263ffffffff61307116565b90506001600160e01b031981166394cfcdd760e01b141561240b576060806123998561216c565b80519194509250905060005b8181146124005760006123be89858481518110610ba857fe5b905060008583815181106123ce57fe5b602002602001015182816123de57fe5b049050878110806123ed575087155b156123f6578097505b50506001016123a5565b506108db9350505050565b6001600160e01b03198116630f47261b60e41b141561246457600061243784601063ffffffff6130a516565b600154604051919250606091636eb1769f60e11b9161188d9189916001600160a01b031690602401614f29565b6001600160e01b0319811663012b8bc960e11b141561269757600080612489856107bf565b6002546040519295509093506060925063e985e9c560e01b916124bc918a916001600160a01b0390911690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161250d9190614ef9565b600060405180830381855afa9150503d8060008114612548576040519150601f19603f3d011682016040523d82523d6000602084013e61254d565b606091505b509150915081158061256157508051602014155b8061257d575061257881600063ffffffff6130d816565b600114155b156126885760405160609063020604bf60e21b9061259f9087906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516125ec9190614ef9565b600060405180830381855afa9150503d8060008114612627576040519150601f19603f3d011682016040523d82523d6000602084013e61262c565b606091505b509093509150828015612640575081516020145b801561266f57506002546001600160a01b031661266483600c63ffffffff6130a516565b6001600160a01b0316145b61267a57600061267d565b60015b60ff16975050611c14565b60001996505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b14156127c55760006126bb84611e6d565b50506003546040519294506060935063e985e9c560e01b926126ec925089916001600160a01b031690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161273d9190614ef9565b600060405180830381855afa9150503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b5091509150818015612790575080516020145b80156127ac57506127a881600063ffffffff6130d816565b6001145b6127b757600061194d565b600019955050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611da857506000199392505050565b60006127f3613afb565b6128468584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161286257505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106128f857fe5b6020026020010181905250878360008151811061291157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061294357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061297157fe5b6020026020010181815250508861014001518460018151811061299057fe5b60200260200101819052508860000151836001815181106129ad57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087826001815181106129db57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612a0d57fe5b602002602001018181525050886101a0015184600281518110612a2c57fe5b60200260200101819052508783600281518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612a7757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612aa957fe5b60200260200101818152505088610180015184600381518110612ac857fe5b6020026020010181905250886000015183600381518110612ae557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612b1757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061177057fe5b6040516060906394cfcdd760e01b9061209790859085906024016151a1565b6000612b7a828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1480612bab57506001600160e01b0319811663012b8bc960e11b145b80612bc657506001600160e01b0319811663a7cb5fb760e01b145b80612be157506001600160e01b031981166394cfcdd760e01b145b80612bfc57506001600160e01b0319811663619ce88560e11b145b612c185760405162461bcd60e51b81526004016108059061566a565b919050565b606080606060008551905080604051908082528060200260200182016040528015612c6257816020015b612c4f613b2a565b815260200190600190039081612c475790505b50935080604051908082528060200260200182016040528015612c8f578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612cbc578160200160208202803883390190505b50915060005b818114612d4c57612cf9878281518110612cd857fe5b6020026020010151878381518110612cec57fe5b6020026020010151612d6e565b8751889085908110612d0757fe5b60200260200101878581518110612d1a57fe5b60200260200101878681518110612d2d57fe5b9315156020948502919091019093019290925291905252600101612cc2565b50509250925092565b606080612d6284846122f1565b91506108538484610b59565b612d76613b2a565b600554604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990612dab9088906004016156b6565b60606040518083038186803b158015612dc357600080fd5b505afa158015612dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612dfb9190810190614883565b855160055460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f90612e3490899089906004016156c9565b60206040518083038186803b158015612e4c57600080fd5b505afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e8491908101906146e5565b91506000612e97828861014001516108b9565b60a088015160c08901516101808a01516101408b015193945091929091600091612ec69163ffffffff61363b16565b15612ef357612eec84612ee6848d6080015161366090919063ffffffff16565b8561367c565b9050612f4c565b81612f0757612eec848b608001518561367c565b6000612f18868c61018001516108b9565b90506000612f2b868d608001518761367c565b90506000612f3a83868861367c565b9050612f4682826130ef565b93505050505b612f6c612f6689604001518561369e90919063ffffffff16565b826130ef565b96506004612f7f8b8c602001518a61150e565b6004811115612f8a57fe5b14612f96576000612f98565b865b965050505050509250925092565b6000806000612fb7846107726136bd565b6000612fd0600486518761302e9092919063ffffffff16565b8060200190516108999190810190614ba5565b63fdb6ca8d60e01b90565b6000612ffb836000613071565b90506001600160e01b0319808216908316146130295760405162461bcd60e51b815260040161080590615644565b505050565b60608183111561304c5761304c613047600085856136c8565b6136e7565b83518211156130655761306561304760018487516136c8565b50819003910190815290565b600081600401835110156130925761309261304760038551856004016136c8565b5001602001516001600160e01b03191690565b600081601401835110156130c6576130c661304760048551856014016136c8565b5001601401516001600160a01b031690565b6000610c8883836136ef565b6318e4b14160e01b90565b60008183106130fe5781610c88565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b60608183111561316057613160613047600085856136c8565b83518211156131795761317961304760018487516136c8565b8282036040519080825280601f01601f1916602001820160405280156131a6576020820181803883390190505b509050610c886131b582613719565b846131bf87613719565b01835161371f565b60608060606131e360048551866131479092919063ffffffff16565b80602001905161091b9190810190614590565b60408051600180825281830190925260609182918291816020015b613219613a68565b8152602001906001900390816132115750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081613262575050845190915061328f90859060049063ffffffff61314716565b8060200190516132a29190810190614a57565b856000815181106132af57fe5b60200260200101856000815181106132c357fe5b60200260200101856000815181106132d757fe5b6020908102919091010192909252919052529193909250565b60408051600180825281830190925260609182918291602080830190803883395050855191935061332c9186915060049063ffffffff61314716565b80602001905161333f9190810190614609565b8451859060009061334c57fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b613376613afb565b6020810184905260a085015160808601516133929186916137c4565b815260a085015160c08601516133a99186916137c4565b604082015260a085015160e08601516133c39186916137c4565b60608201526133d8828463ffffffff6137f816565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061340b90889088908890889060240161503e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260055491519092506060916001600160a01b03169061345d908490614ef9565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b509150600090506134b6828263ffffffff61307116565b90506134c061311b565b6001600160e01b0319828116911614156134fd5760006134df8361096a565b5091505060ff811660048111156134f257fe5b9450505050506117ec565b613505613105565b6001600160e01b031982811691161415613538576000613524836108e1565b509091505060ff811660048111156134f257fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0141561357257600493505050506117ec565b60405162461bcd60e51b8152600401610805906155b9565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610c88826135f085613829565b6138a4565b6350ae068360e11b90565b630fcb446360e31b90565b6000610c88826135f0856138c3565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610c885750508051602091820120825192909101919091201490565b600082820183811015610c8857610c886130476000868661397c565b60006117ec83613692868563ffffffff6137f816565b9063ffffffff61399b16565b6000828211156136b7576136b76130476002858561397c565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610c53939291906154c4565b805160208201fd5b600081602001835110156137105761371061304760058551856020016136c8565b50016020015190565b60200190565b6020811015613749576001816020036101000a038019835116818551168082178652505050613029565b8282141561375657613029565b828211156137905760208103905080820181840181515b8285101561378857845186526020958601959094019361376d565b905250613029565b60208103905080820181840183515b818612156137bb5782518252601f19928301929091019061379f565b85525050505050565b60006137d18484846139c5565b156137e4576137e4613047858585613a2b565b6117ec83613692868563ffffffff6137f816565b600082613807575060006108db565b8282028284828161381457fe5b0414610c8857610c886130476001868661397c565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a75349390929091602087101561390f57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610c5393929190615455565b6000816139b1576139b16130476003858561397c565b60008284816139bc57fe5b04949350505050565b6000826139d7576139d7613047613a4a565b8115806139e2575083155b156139ef57506000610c88565b600083806139f957fe5b8584099050613a0e858463ffffffff6137f816565b613a20826103e863ffffffff6137f816565b101595945050505050565b606063339f3de260e01b848484604051602401610c53939291906156ee565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b80356108db816157c7565b80516108db816157c7565b600082601f830112613b70578081fd5b8135613b83613b7e8261572a565b615704565b818152915060208083019084810181840286018201871015613ba457600080fd5b60005b84811015611da3578135613bba816157c7565b84529282019290820190600101613ba7565b600082601f830112613bdc578081fd5b8151613bea613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c128760208451890101613e4c565b83526020928301929190910190600101613bfa565b5050505092915050565b600082601f830112613c41578081fd5b8135613c4f613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c778760208435890101613dfe565b83526020928301929190910190600101613c5f565b600082601f830112613c9c578081fd5b8151613caa613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613cd28760208451890101613fe0565b83526020928301929190910190600101613cba565b600082601f830112613cf7578081fd5b8135613d05613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613d2d8760208435890101613e92565b83526020928301929190910190600101613d15565b600082601f830112613d52578081fd5b8151613d60613b7e8261572a565b818152915060208083019084810181840286018201871015613d8157600080fd5b60005b84811015611da357815184529282019290820190600101613d84565b600082601f830112613db0578081fd5b8135613dbe613b7e8261572a565b818152915060208083019084810181840286018201871015613ddf57600080fd5b60005b84811015611da357813584529282019290820190600101613de2565b600082601f830112613e0e578081fd5b8135613e1c613b7e82615749565b9150808252836020828501011115613e3357600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613e5c578081fd5b8151613e6a613b7e82615749565b9150808252836020828501011115613e8157600080fd5b611da881602084016020860161576c565b60006101c0808385031215613ea5578182fd5b613eae81615704565b915050613ebb8383613b4a565b8152613eca8360208401613b4a565b6020820152613edc8360408401613b4a565b6040820152613eee8360608401613b4a565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b0380821115613f4f57600080fd5b613f5b86838701613dfe565b83850152610160925082850135915080821115613f7757600080fd5b613f8386838701613dfe565b83850152610180925082850135915080821115613f9f57600080fd5b613fab86838701613dfe565b838501526101a0925082850135915080821115613fc757600080fd5b50613fd485828601613dfe565b82840152505092915050565b60006101c0808385031215613ff3578182fd5b613ffc81615704565b9150506140098383613b55565b81526140188360208401613b55565b602082015261402a8360408401613b55565b604082015261403c8360608401613b55565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561409d57600080fd5b6140a986838701613e4c565b838501526101609250828501519150808211156140c557600080fd5b6140d186838701613e4c565b838501526101809250828501519150808211156140ed57600080fd5b6140f986838701613e4c565b838501526101a092508285015191508082111561411557600080fd5b50613fd485828601613e4c565b805160ff811681146108db57600080fd5b600060208284031215614144578081fd5b8135610c88816157c7565b60008060408385031215614161578081fd5b825161416c816157c7565b602084015190925061417d816157c7565b809150509250929050565b60008060006060848603121561419c578081fd5b83516141a7816157c7565b60208501519093506141b8816157c7565b80925050604084015190509250925092565b6000806000606084860312156141de578081fd5b83516141e9816157c7565b60208501519093506001600160401b03811115614204578182fd5b61421086828701613e4c565b925050604084015190509250925092565b60008060008060808587031215614236578182fd5b8451614241816157c7565b60208601519094506001600160401b038082111561425d578384fd5b61426988838901613e4c565b9450604087015191508082111561427e578384fd5b61428a88838901613e4c565b9350606087015191508082111561429f578283fd5b506142ac87828801613e4c565b91505092959194509250565b600080604083850312156142ca578182fd5b82356142d5816157c7565b915060208301356001600160401b038111156142ef578182fd5b6142fb85828601613c31565b9150509250929050565b6000806000806080858703121561431a578182fd5b8435614325816157c7565b935060208501356001600160401b0380821115614340578384fd5b61434c88838901613da0565b94506040870135915080821115614361578384fd5b61436d88838901613da0565b93506060870135915080821115614382578283fd5b506142ac87828801613dfe565b600080604083850312156143a1578182fd5b82356143ac816157c7565b915060208301356001600160401b038111156143c6578182fd5b6142fb85828601613dfe565b6000806000606084860312156143e6578081fd5b83356143f1816157c7565b925060208401356001600160401b0381111561440b578182fd5b61441786828701613dfe565b925050604084013590509250925092565b6000806040838503121561443a578182fd5b8235614445816157c7565b946020939093013593505050565b600060208284031215614464578081fd5b81356001600160401b03811115614479578182fd5b6117ec84828501613b60565b600060208284031215614496578081fd5b81516001600160401b038111156144ab578182fd5b6117ec84828501613c8c565b6000806000606084860312156144cb578081fd5b83356001600160401b03808211156144e1578283fd5b6144ed87838801613ce7565b94506020860135915080821115614502578283fd5b61450e87838801613b60565b93506040860135915080821115614523578283fd5b5061453086828701613da0565b9150509250925092565b6000806040838503121561454c578182fd5b82356001600160401b0380821115614562578384fd5b61456e86838701613ce7565b93506020850135915080821115614583578283fd5b506142fb85828601613c31565b6000806000606084860312156145a4578081fd5b83516001600160401b03808211156145ba578283fd5b6145c687838801613c8c565b945060208601519150808211156145db578283fd5b6145e787838801613d42565b935060408601519150808211156145fc578283fd5b5061453086828701613bcc565b60008060006060848603121561461d578081fd5b83516001600160401b0380821115614633578283fd5b61463f87838801613c8c565b94506020860151935060408601519150808211156145fc578283fd5b6000806040838503121561466d578182fd5b82356001600160401b0380821115614683578384fd5b61456e86838701613da0565b600080604083850312156146a1578182fd5b82516001600160401b03808211156146b7578384fd5b6146c386838701613d42565b935060208501519150808211156146d8578283fd5b506142fb85828601613bcc565b6000602082840312156146f6578081fd5b81518015158114610c88578182fd5b6000806000806080858703121561471a578182fd5b84519350602085015161472c816157c7565b60408601519093506001600160401b038082111561427e578384fd5b6000806040838503121561475a578182fd5b505080516020909101519092909150565b6000806040838503121561477d578182fd5b8251915060208301516001600160401b03811115614799578182fd5b6142fb85828601613e4c565b6000806000606084860312156147b9578081fd5b8351925060208401516001600160401b03808211156147d6578283fd5b6147e287838801613e4c565b935060408601519150808211156147f7578283fd5b5061453086828701613e4c565b60008060408385031215614816578182fd5b82519150602083015161417d816157dc565b6000806040838503121561483a578182fd5b82516001600160e01b03198116811461416c578283fd5b600060208284031215614862578081fd5b81356001600160401b03811115614877578182fd5b6117ec84828501613dfe565b600060608284031215614894578081fd5b61489e6060615704565b6148a88484614122565b815260208301516020820152604083015160408201528091505092915050565b6000602082840312156148d9578081fd5b81516001600160401b038111156148ee578182fd5b6117ec84828501613fe0565b60008060006060848603121561490e578081fd5b83356001600160401b03811115614923578182fd5b61492f86828701613e92565b9350506020840135614940816157c7565b929592945050506040919091013590565b60008060408385031215614963578182fd5b82356001600160401b0380821115614979578384fd5b61498586838701613e92565b9350602085013591508082111561499a578283fd5b506142fb85828601613dfe565b6000806000606084860312156149bb578081fd5b83356001600160401b038111156149d0578182fd5b6149dc86828701613e92565b9350506020840135915060408401356149f4816157c7565b809150509250925092565b60008060008060808587031215614a14578182fd5b84516001600160401b0380821115614a2a578384fd5b614a3688838901613fe0565b95506020870151915080821115614a4b578384fd5b61426988838901613fe0565b600080600060608486031215614a6b578081fd5b83516001600160401b0380821115614a81578283fd5b614a8d87838801613fe0565b94506020860151935060408601519150808211156147f7578283fd5b600080600060608486031215614abd578081fd5b83356001600160401b0380821115614ad3578283fd5b81860160a08189031215614ae5578384fd5b614aef60a0615704565b9250803583526020810135602084015260408101356040840152614b168860608301613b4a565b6060840152608081013582811115614b2c578485fd5b614b3889828401613dfe565b608085015250919450505060208401359150614b578560408601613b4a565b90509250925092565b600060208284031215614b71578081fd5b5051919050565b60008060408385031215614b8a578182fd5b8251614b95816157dc565b6020939093015192949293505050565b600080600060608486031215614bb9578081fd5b8351614bc4816157dc565b6020850151604086015191945092506149f4816157c7565b60008060008060808587031215614bf1578182fd5b614bfb8686614122565b9350602085015192506040850151614c12816157c7565b60608601519092506001600160401b03811115614c2d578182fd5b6142ac87828801613e4c565b600080600060608486031215614c4d578081fd5b614c578585614122565b92506020840151915060408401516001600160401b03811115614c78578182fd5b61453086828701613e4c565b600080600060608486031215614c98578081fd5b614ca28585614122565b925060208401519150604084015190509250925092565b1515815260200190565b6000614ccf8383614ddc565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614d1e5781516001600160a01b0316865260209586019590910190600101614cf7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614d73578284038852614d5d848351614db0565b6020988901989094509190910190600101614d45565b50919695505050505050565b6000815180845260208401935060208301825b82811015614d1e578151865260209586019590910190600101614d92565b60008151808452614dc881602086016020860161576c565b601f01601f19169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b60006101c0614e08848451614cd7565b6020830151614e1a6020860182614cd7565b506040830151614e2d6040860182614cd7565b506060830151614e406060860182614cd7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614e9983870182614db0565b91505061016091508184015185820383870152614eb68282614db0565b925050506101808084015185830382870152614ed28382614db0565b9150506101a091508184015185820383870152614eef8282614db0565b9695505050505050565b60008251614f0b81846020870161576c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385168152608060208201819052600090614f8b90830186614d7f565b8281036040840152614f9d8186614d7f565b8381036060850152614faf8186614db0565b98975050505050505050565b6001600160a01b0384168152606060208201819052600090614fdf90830185614db0565b9050826040830152949350505050565b6001600160a01b038516815260806020820181905260009061501390830186614db0565b8281036040840152614f9d8186614db0565b6001600160a01b03929092168252602082015260400190565b6000608082526150516080830187614d28565b82810360208401526150638187614ce4565b83810360408501526150758187614ce4565b915050828103606084015261508a8185614d7f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156150d7578351600581106150c357fe5b8352602093840193909201916001016150af565b509095945050505050565b600060608201606083528086516150f981846151f4565b9150602088019250835b8181101561512757615116838551614cc3565b602094909401939250600101615103565b5050838103602085015261513b8187614d7f565b915050828103604084015280845161515381846151f4565b9150602086019250835b8181101561518157615170838551614cb9565b60209490940193925060010161515d565b5090979650505050505050565b600060208252610c886020830184614d7f565b6000604082526151b46040830185614d7f565b82810360208401526151c68185614d28565b95945050505050565b6000604082526151e26040830185614d7f565b82810360208401526151c68185614d7f565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061522790830185614db0565b828103606084015261508a8185614db0565b918252602082015260400190565b6000838252604060208301526117ec6040830184614db0565b6000848252606060208301526152796060830185614db0565b8281036040840152614eef8185614db0565b8281526040810161529b836157bd565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319861681526001600160a01b038516602082015260a06040820181905260009061531490830186614d7f565b82810360608401526153268186614d7f565b83810360808501526117888186614db0565b6001600160e01b0319851681526001600160a01b038416602082015260806040820181905260009061536c90830185614db0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b85168252606060208301526153ca6060830185614d7f565b8281036040840152614eef8185614d28565b600060208252610c886020830184614db0565b6000608082526154026080830187614db0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b60006154388561579c565b848252836020830152606060408301526151c66060830184614db0565b60608101615462856157a9565b938152602081019290925260409091015290565b60608101615483856157b3565b93815260208101929092526001600160a01b031660409091015290565b604081016154ad846157a9565b9281526020015290565b60608101615462856157b3565b606081016008851061546257fe5b60208101600583106154e057fe5b91905290565b60006154f1866157bd565b858252602082018590526001600160a01b0384166040830152608060608301819052614eef90830184614db0565b604081016154ad8461579c565b60006080825261553f6080830187614db0565b602083820381850152818751808452828401915082838202850101838a01865b8381101561558d57601f1987840301855261557b838351614df8565b9486019492509085019060010161555f565b505086810360408801526155a1818a614d7f565b945050505050828103606084015261508a8185614d28565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a081016156a08286614ddc565b8360608301528215156080830152949350505050565b600060208252610c886020830184614df8565b6000604082526156dc6040830185614df8565b82810360208401526151c68185614db0565b9283526020830191909152604082015260600190565b6040518181016001600160401b038111828210171561572257600080fd5b604052919050565b60006001600160401b0382111561573f578081fd5b5060209081020190565b60006001600160401b0382111561575e578081fd5b50601f01601f191660200190565b60005b8381101561578757818101518382015260200161576f565b83811115615796576000848401525b50505050565b600281106157a657fe5b50565b600481106157a657fe5b600381106157a657fe5b600781106157a657fe5b6001600160a01b03811681146157a657600080fd5b60ff811681146157a657600080fdfea365627a7a723158204793664dee66dcabc4a710b9901a17d347a2ff1fb84df266b96a650f614b87756c6578706572696d656e74616cf564736f6c634300050f0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5D52 CODESIZE SUB DUP1 PUSH3 0x5D52 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x4B7 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR DUP1 DUP4 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP4 SWAP3 DUP6 SWAP3 DUP4 SWAP3 DUP4 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH3 0xBD SWAP1 PUSH32 0xF47261B000000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x4 ADD PUSH3 0x4E7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0xD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0xEB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x111 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4B7 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH3 0x18F SWAP1 PUSH32 0x257179200000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x4 ADD PUSH3 0x4E7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x1A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x1BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x1E3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4B7 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH3 0x261 SWAP1 PUSH32 0xA7CB5FB700000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x4 ADD PUSH3 0x4E7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x28F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x2B5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4B7 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 PUSH4 0x60704108 SWAP1 PUSH3 0x333 SWAP1 PUSH32 0xC339D10A00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH1 0x4 ADD PUSH3 0x4E7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x34C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x361 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x387 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4B7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x5 DUP1 SLOAD SWAP1 SWAP2 AND SWAP4 DUP3 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE POP PUSH1 0x0 SWAP2 POP DUP3 AND ISZERO PUSH3 0x3CB JUMPI DUP2 PUSH3 0x3CD JUMP JUMPDEST ADDRESS JUMPDEST SWAP1 POP PUSH3 0x452 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x332E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP6 DUP5 PUSH3 0x460 PUSH1 0x20 SHL PUSH3 0x358A OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x6 SSTORE POP PUSH3 0x514 SWAP3 POP POP POP JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x4C9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x4E0 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x582E DUP1 PUSH3 0x524 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x274 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9A7E7526 GT PUSH2 0x151 JUMPI DUP1 PUSH4 0xCA49F47C GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xD3D862D1 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xD3D862D1 EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0xD4695028 EQ PUSH2 0x6BC JUMPI DUP1 PUSH4 0xE25CABF7 EQ PUSH2 0x6DC JUMPI DUP1 PUSH4 0xE4E6E7DA EQ PUSH2 0x6FE JUMPI DUP1 PUSH4 0xE77286EB EQ PUSH2 0x71F JUMPI DUP1 PUSH4 0xEE4F5A94 EQ PUSH2 0x741 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0xCA49F47C EQ PUSH2 0x62C JUMPI DUP1 PUSH4 0xCAFD3A07 EQ PUSH2 0x64F JUMPI DUP1 PUSH4 0xD001C5DC EQ PUSH2 0x670 JUMPI DUP1 PUSH4 0xD186037F EQ PUSH2 0x683 JUMPI DUP1 PUSH4 0xD3637905 EQ PUSH2 0x696 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0xA6627E9F GT PUSH2 0x115 JUMPI DUP1 PUSH4 0xA6627E9F EQ PUSH2 0x598 JUMPI DUP1 PUSH4 0xACAEDC74 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0xB43CFFE1 EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0xBBB2DCF6 EQ PUSH2 0x5E1 JUMPI DUP1 PUSH4 0xBC03F964 EQ PUSH2 0x603 JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0x624 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x9A7E7526 EQ PUSH2 0x50B JUMPI DUP1 PUSH4 0x9EADC835 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0xA070CAC8 EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0xA0901E51 EQ PUSH2 0x565 JUMPI DUP1 PUSH4 0xA5CD62BA EQ PUSH2 0x578 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x4DFDAC20 GT PUSH2 0x1EA JUMPI DUP1 PUSH4 0x7914B2EC GT PUSH2 0x1AE JUMPI DUP1 PUSH4 0x7914B2EC EQ PUSH2 0x470 JUMPI DUP1 PUSH4 0x7982653E EQ PUSH2 0x491 JUMPI DUP1 PUSH4 0x79C9C426 EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0x7B66AD34 EQ PUSH2 0x4C4 JUMPI DUP1 PUSH4 0x7D727512 EQ PUSH2 0x4E5 JUMPI DUP1 PUSH4 0x8F4CE479 EQ PUSH2 0x4F8 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x4DFDAC20 EQ PUSH2 0x3D8 JUMPI DUP1 PUSH4 0x590AA875 EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0x63EB3992 EQ PUSH2 0x418 JUMPI DUP1 PUSH4 0x65129042 EQ PUSH2 0x42B JUMPI DUP1 PUSH4 0x6F83188E EQ PUSH2 0x44D JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x314853FF GT PUSH2 0x23C JUMPI DUP1 PUSH4 0x314853FF EQ PUSH2 0x328 JUMPI DUP1 PUSH4 0x327D3054 EQ PUSH2 0x34A JUMPI DUP1 PUSH4 0x32AAE3AD EQ PUSH2 0x35D JUMPI DUP1 PUSH4 0x3DB6DC61 EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0x459BE5E2 EQ PUSH2 0x3A2 JUMPI DUP1 PUSH4 0x46EB65CB EQ PUSH2 0x3C3 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x2D0AEC3 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x4A5618A EQ PUSH2 0x2A3 JUMPI DUP1 PUSH4 0xD7B7D76 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x165979E1 EQ PUSH2 0x2E6 JUMPI DUP1 PUSH4 0x2322CF76 EQ PUSH2 0x308 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28C PUSH2 0x287 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x763 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x528B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2B6 PUSH2 0x2B1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x7BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x537D JUMP JUMPDEST PUSH2 0x2D8 PUSH2 0x2D3 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x83A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x5239 JUMP JUMPDEST PUSH2 0x2F9 PUSH2 0x2F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x85C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54B7 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x316 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x8B9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x51F4 JUMP JUMPDEST PUSH2 0x33B PUSH2 0x336 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x8E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5260 JUMP JUMPDEST PUSH2 0x2D8 PUSH2 0x358 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x928 JUMP JUMPDEST PUSH2 0x370 PUSH2 0x36B CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x96A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x542D JUMP JUMPDEST PUSH2 0x392 PUSH2 0x38D CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x9BD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x51FD JUMP JUMPDEST PUSH2 0x3B5 PUSH2 0x3B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xA07 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x54A0 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x3D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xA5D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x3EB PUSH2 0x3E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x42B8 JUMP JUMPDEST PUSH2 0xB59 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x518E JUMP JUMPDEST PUSH2 0x40B PUSH2 0x406 CALLDATASIZE PUSH1 0x4 PUSH2 0x4133 JUMP JUMPDEST PUSH2 0xBDC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x53DC JUMP JUMPDEST PUSH2 0x40B PUSH2 0x426 CALLDATASIZE PUSH1 0x4 PUSH2 0x43D2 JUMP JUMPDEST PUSH2 0xC32 JUMP JUMPDEST PUSH2 0x43E PUSH2 0x439 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xC8F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4F43 JUMP JUMPDEST PUSH2 0x460 PUSH2 0x45B CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xCC9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x552C JUMP JUMPDEST PUSH2 0x483 PUSH2 0x47E CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x14D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x52BD JUMP JUMPDEST PUSH2 0x4A4 PUSH2 0x49F CALLDATASIZE PUSH1 0x4 PUSH2 0x48FA JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x54D2 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x4BF CALLDATASIZE PUSH1 0x4 PUSH2 0x4AA9 JUMP JUMPDEST PUSH2 0x1795 JUMP JUMPDEST PUSH2 0x4D7 PUSH2 0x4D2 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x17F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x4F29 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x4F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x182C JUMP JUMPDEST PUSH2 0x483 PUSH2 0x506 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x1DAF JUMP JUMPDEST PUSH2 0x51E PUSH2 0x519 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x1E0C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54E6 JUMP JUMPDEST PUSH2 0x541 PUSH2 0x53C CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x1E6D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x52E0 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x560 CALLDATASIZE PUSH1 0x4 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x1EE5 JUMP JUMPDEST PUSH2 0x3EB PUSH2 0x573 CALLDATASIZE PUSH1 0x4 PUSH2 0x4453 JUMP JUMPDEST PUSH2 0x1F3C JUMP JUMPDEST PUSH2 0x58B PUSH2 0x586 CALLDATASIZE PUSH1 0x4 PUSH2 0x44B7 JUMP JUMPDEST PUSH2 0x1FB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x5095 JUMP JUMPDEST PUSH2 0x40B PUSH2 0x5A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4428 JUMP JUMPDEST PUSH2 0x2078 JUMP JUMPDEST PUSH2 0x5BE PUSH2 0x5B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x20D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4FEF JUMP JUMPDEST PUSH2 0x40B PUSH2 0x5DC CALLDATASIZE PUSH1 0x4 PUSH2 0x4305 JUMP JUMPDEST PUSH2 0x210D JUMP JUMPDEST PUSH2 0x5F4 PUSH2 0x5EF CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x216C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53A8 JUMP JUMPDEST PUSH2 0x616 PUSH2 0x611 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x21E6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x5247 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x221F JUMP JUMPDEST PUSH2 0x63F PUSH2 0x63A CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x2225 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST PUSH2 0x662 PUSH2 0x65D CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x22A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x551F JUMP JUMPDEST PUSH2 0x3EB PUSH2 0x67E CALLDATASIZE PUSH1 0x4 PUSH2 0x42B8 JUMP JUMPDEST PUSH2 0x22F1 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x691 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x235F JUMP JUMPDEST PUSH2 0x4A4 PUSH2 0x6A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x48FA JUMP JUMPDEST PUSH2 0x27E9 JUMP JUMPDEST PUSH2 0x40B PUSH2 0x6B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x465B JUMP JUMPDEST PUSH2 0x2B49 JUMP JUMPDEST PUSH2 0x6CF PUSH2 0x6CA CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x2B68 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x52A8 JUMP JUMPDEST PUSH2 0x6EF PUSH2 0x6EA CALLDATASIZE PUSH1 0x4 PUSH2 0x453A JUMP JUMPDEST PUSH2 0x2C1D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x50E2 JUMP JUMPDEST PUSH2 0x711 PUSH2 0x70C CALLDATASIZE PUSH1 0x4 PUSH2 0x42B8 JUMP JUMPDEST PUSH2 0x2D55 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x51CF JUMP JUMPDEST PUSH2 0x732 PUSH2 0x72D CALLDATASIZE PUSH1 0x4 PUSH2 0x4951 JUMP JUMPDEST PUSH2 0x2D6E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5692 JUMP JUMPDEST PUSH2 0x754 PUSH2 0x74F CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x2FA6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5476 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x777 DUP4 PUSH2 0x772 PUSH2 0x2FE3 JUMP JUMPDEST PUSH2 0x2FEE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x790 PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x7A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4804 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x7B7 JUMPI INVALID JUMPDEST SWAP2 POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x7D3 DUP5 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ PUSH2 0x80E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x81F DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST SWAP2 POP PUSH2 0x832 DUP5 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST SWAP3 SWAP5 SWAP2 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x847 DUP5 DUP5 PUSH2 0x182C JUMP JUMPDEST SWAP2 POP PUSH2 0x853 DUP5 DUP5 PUSH2 0x235F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x86D DUP5 PUSH2 0x772 PUSH2 0x30E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x886 PUSH1 0x4 DUP7 MLOAD DUP8 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x899 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4C84 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x8AF JUMPI INVALID JUMPDEST SWAP4 POP POP SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x8C8 DUP6 DUP6 PUSH2 0x83A JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x8D6 DUP3 DUP3 PUSH2 0x30EF JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x8F2 DUP5 PUSH2 0x772 PUSH2 0x3105 JUMP JUMPDEST DUP4 MLOAD PUSH2 0x908 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x91B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x47A5 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x937 DUP4 PUSH2 0x772 PUSH2 0x3110 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x94D SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4748 JUMP JUMPDEST SWAP1 SWAP5 SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x97B DUP5 PUSH2 0x772 PUSH2 0x311B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x994 PUSH1 0x4 DUP7 MLOAD DUP8 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x9A7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4C39 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x8AF JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 PUSH2 0x9CF DUP6 PUSH2 0x772 PUSH2 0x3126 JUMP JUMPDEST DUP5 MLOAD PUSH2 0x9E5 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x9F8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4705 JUMP JUMPDEST SWAP3 SWAP9 SWAP2 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA16 DUP4 PUSH2 0x772 PUSH2 0x3131 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA2F PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xA42 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4B78 JUMP JUMPDEST SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0xA55 JUMPI INVALID JUMPDEST SWAP3 POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA6F DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ ISZERO PUSH2 0xA9A JUMPI PUSH2 0xA93 DUP3 PUSH2 0x1DAF JUMP JUMPDEST POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xAC4 JUMPI PUSH2 0xABC DUP3 PUSH2 0x7BF JUMP JUMPDEST POP POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xAF0 JUMPI PUSH2 0xAE6 DUP3 PUSH2 0x1E6D JUMP JUMPDEST POP POP POP POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xB12 JUMPI PUSH2 0xABC DUP3 PUSH2 0x216C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xB3D JUMPI PUSH2 0xB34 DUP3 PUSH2 0x2225 JUMP JUMPDEST POP POP POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xB8B JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xBD4 JUMPI PUSH2 0xBB5 DUP6 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xBA8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x235F JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xBC1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xB91 JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0xF47261B PUSH1 0xE4 SHL SWAP1 PUSH2 0xBF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x619CE885 PUSH1 0xE1 SHL SWAP1 PUSH2 0xC53 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x4FBB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xCA0 DUP5 PUSH2 0x772 PUSH2 0x313C JUMP JUMPDEST DUP4 MLOAD PUSH2 0xCB6 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x91B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4188 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP1 DUP1 PUSH1 0x0 PUSH2 0xCE0 DUP7 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xDEDFC1F1 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xD2C JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x11 DUP2 MSTORE PUSH1 0x20 ADD PUSH17 0x626174636843616E63656C4F7264657273 PUSH1 0x78 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4B4A5201 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xD74 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH15 0x626174636846696C6C4F7264657273 PUSH1 0x88 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x23AA37F9 PUSH1 0xE2 SHL EQ ISZERO PUSH2 0xDC3 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD PUSH22 0x626174636846696C6C4F72646572734E6F5468726F77 PUSH1 0x50 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2FBB8B85 PUSH1 0xE2 SHL EQ ISZERO PUSH2 0xE11 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD PUSH21 0x626174636846696C6C4F724B696C6C4F7264657273 PUSH1 0x58 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2DA62987 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xE55 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0x31B0B731B2B627B93232B9 PUSH1 0xA9 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4DA26AAB PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xE97 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x9 DUP2 MSTORE PUSH1 0x20 ADD PUSH9 0x3334B63627B93232B9 PUSH1 0xB9 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x3852D631 PUSH1 0xE2 SHL EQ ISZERO PUSH2 0xEDF JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH15 0x3334B63627B925B4B63627B93232B9 PUSH1 0x89 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x78D29AC1 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xF2E JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD PUSH22 0x6D61726B65744275794F72646572734E6F5468726F77 PUSH1 0x50 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x369DA099 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xF84 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D61726B657453656C6C4F72646572734E6F5468726F77000000000000000000 DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x8BC8EFB3 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xFDA JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D61726B65744275794F726465727346696C6C4F724B696C6C00000000000000 DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA6C3BF33 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1030 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D61726B657453656C6C4F726465727346696C6C4F724B696C6C000000000000 DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x88EC79FB PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1074 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0x6D617463684F7264657273 PUSH1 0xA8 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4F9559B1 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x10A3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2280C91 PUSH1 0xE4 SHL EQ JUMPDEST ISZERO PUSH2 0x10C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x561D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x55E6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xDEDFC1F1 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1164 JUMPI DUP6 MLOAD PUSH2 0x1107 SWAP1 DUP8 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x111A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4485 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP6 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP5 POP PUSH2 0x115C JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1147 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0x14CE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2FBB8B85 PUSH1 0xE2 SHL EQ DUP1 PUSH2 0x1193 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4B4A5201 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x11AE JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x23AA37F9 PUSH1 0xE2 SHL EQ JUMPDEST ISZERO PUSH2 0x11C8 JUMPI PUSH2 0x11BC DUP7 PUSH2 0x31C7 JUMP JUMPDEST SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP PUSH2 0x14CE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2DA62987 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1297 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x11FE PUSH2 0x3A68 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x11F6 JUMPI POP POP DUP7 MLOAD SWAP1 SWAP5 POP PUSH2 0x1229 SWAP1 DUP8 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x123C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x48C8 JUMP JUMPDEST DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1249 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x112E JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP5 POP PUSH2 0x115C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x3852D631 PUSH1 0xE2 SHL EQ DUP1 PUSH2 0x12C6 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4DA26AAB PUSH1 0xE1 SHL EQ JUMPDEST ISZERO PUSH2 0x12D4 JUMPI PUSH2 0x11BC DUP7 PUSH2 0x31F6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x78D29AC1 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x1303 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x369DA099 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x131E JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x8BC8EFB3 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x1339 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA6C3BF33 PUSH1 0xE0 SHL EQ JUMPDEST ISZERO PUSH2 0x1347 JUMPI PUSH2 0x11BC DUP7 PUSH2 0x32F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x88EC79FB PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x14CE JUMPI PUSH2 0x1368 PUSH2 0x3A68 JUMP JUMPDEST PUSH2 0x1370 PUSH2 0x3A68 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH2 0x138A PUSH1 0x4 DUP12 MLOAD DUP13 PUSH2 0x3147 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x139D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x49FF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP5 SWAP9 POP SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x13C5 PUSH2 0x3A68 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x13BD JUMPI SWAP1 POP POP SWAP8 POP DUP4 DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x13E8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP3 DUP9 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x1401 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP7 POP DUP4 PUSH1 0xA0 ADD MLOAD DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1441 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP3 PUSH1 0xA0 ADD MLOAD DUP8 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x145F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1480 JUMPI SWAP1 POP POP SWAP6 POP DUP2 DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x14A5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP1 DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x14BE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP POP POP JUMPDEST POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x14E5 DUP4 PUSH2 0x772 PUSH2 0x3364 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x14FB SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4828 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1518 PUSH2 0x3AFB JUMP JUMPDEST PUSH2 0x15A9 DUP6 DUP5 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1CE4C78B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x156B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x157F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x15A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4B60 JUMP JUMPDEST GASPRICE PUSH2 0x336E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 DUP2 ADD SWAP1 SWAP4 MSTORE SWAP3 SWAP4 POP SWAP1 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x15C4 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP4 SWAP5 POP SWAP1 SWAP2 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP5 SWAP6 POP SWAP1 SWAP3 POP SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP5 SWAP6 POP SWAP1 SWAP3 POP SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP DUP9 PUSH2 0x140 ADD MLOAD DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1653 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1670 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP8 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x169E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x0 ADD MLOAD DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x16D0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x180 ADD MLOAD DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x16EF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x170C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x173E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x40 ADD MLOAD DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x1770 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x1788 DUP5 DUP5 DUP5 DUP5 PUSH2 0x33E5 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17EC DUP5 PUSH2 0x17E7 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0xC1E08141C9BDD1BD8DBDB PUSH1 0xAA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP8 DUP8 PUSH2 0x358A JUMP JUMPDEST PUSH2 0x35E1 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1803 DUP4 PUSH2 0x772 PUSH2 0x35F5 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x1819 SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x414F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x183F DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ ISZERO PUSH2 0x1958 JUMPI PUSH1 0x0 PUSH2 0x186D DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH1 0x60 SWAP1 PUSH4 0x70A08231 PUSH1 0xE0 SHL SWAP1 PUSH2 0x188D SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x18DE SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1919 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x191E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x1931 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x193C JUMPI PUSH1 0x0 PUSH2 0x194D JUMP JUMPDEST PUSH2 0x194D DUP2 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x1A97 JUMPI PUSH1 0x0 DUP1 PUSH2 0x197D DUP6 PUSH2 0x7BF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x60 SWAP2 POP PUSH4 0x31A9108F PUSH1 0xE1 SHL SWAP1 PUSH2 0x19A0 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH2 0x51F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x19F1 SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A2C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A31 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x0 DUP3 DUP1 ISZERO PUSH2 0x1A46 JUMPI POP DUP2 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x1A51 JUMPI PUSH1 0x0 PUSH2 0x1A62 JUMP JUMPDEST PUSH2 0x1A62 DUP3 PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A84 JUMPI PUSH1 0x0 PUSH2 0x1A87 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP8 POP POP POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1C1E JUMPI PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x1ABE DUP7 PUSH2 0x1E6D JUMP JUMPDEST POP DUP2 MLOAD SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1C14 JUMPI DUP4 MLOAD PUSH1 0x60 SWAP1 PUSH3 0x7EEAC7 PUSH1 0xE1 SHL SWAP1 DUP12 SWAP1 DUP8 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1AF0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1B09 SWAP3 SWAP2 SWAP1 PUSH2 0x5025 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x1B5A SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1B95 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1B9A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x0 DUP3 DUP1 ISZERO PUSH2 0x1BAF JUMPI POP DUP2 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x1BBA JUMPI PUSH1 0x0 PUSH2 0x1BCB JUMP JUMPDEST PUSH2 0x1BCB DUP3 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x1BDB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP3 DUP2 PUSH2 0x1BEB JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP12 DUP2 LT DUP1 PUSH2 0x1BFA JUMPI POP DUP12 ISZERO JUMPDEST ISZERO PUSH2 0x1C03 JUMPI DUP1 SWAP12 POP JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0x1ACE SWAP2 POP POP JUMP JUMPDEST POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x1D0A JUMPI PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x2A179679 PUSH1 0xE2 SHL SWAP1 PUSH2 0x1C5B SWAP1 DUP7 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x24 ADD PUSH2 0x53EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x4 SLOAD SWAP2 MLOAD SWAP1 SWAP3 POP PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x1CAD SWAP1 DUP5 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1CE8 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1CED JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x1CFD JUMPI PUSH1 0x0 PUSH2 0x1D01 JUMP JUMPDEST PUSH1 0x0 NOT JUMPDEST SWAP4 POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1DA8 JUMPI PUSH1 0x60 DUP1 PUSH2 0x1D2F DUP6 PUSH2 0x216C JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1DA3 JUMPI PUSH1 0x0 PUSH2 0x1D61 DUP10 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1D54 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x182C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1D71 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP3 DUP2 PUSH2 0x1D81 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP8 DUP2 LT DUP1 PUSH2 0x1D90 JUMPI POP DUP8 ISZERO JUMPDEST ISZERO PUSH2 0x1D99 JUMPI DUP1 SWAP8 POP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x1D3B JUMP JUMPDEST POP POP POP POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1DC2 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ PUSH2 0x1DF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST PUSH2 0x1E05 DUP4 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH2 0x1E1F DUP6 PUSH2 0x772 PUSH2 0x3600 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E38 PUSH1 0x4 DUP8 MLOAD DUP9 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1E4B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4BDC JUMP JUMPDEST SWAP2 SWAP7 POP SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1E63 JUMPI INVALID JUMPDEST SWAP5 POP POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP1 PUSH2 0x1E84 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP6 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ PUSH2 0x1EB6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST POP POP POP POP PUSH1 0x24 DUP3 DUP2 ADD MLOAD PUSH1 0x44 DUP5 ADD MLOAD PUSH1 0x64 DUP6 ADD MLOAD PUSH1 0x84 DUP7 ADD MLOAD SWAP5 SWAP7 SWAP3 SWAP6 SWAP2 DUP3 ADD DUP5 ADD SWAP5 SWAP1 DUP3 ADD DUP5 ADD SWAP4 SWAP2 ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17EC DUP5 PUSH2 0x1F37 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0xC1E08141C9BDD1BD8DBDB PUSH1 0xAA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP8 DUP8 PUSH2 0x358A JUMP JUMPDEST PUSH2 0x360B JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1F6A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 EQ PUSH2 0x1DA8 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1F84 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND BALANCE DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1FA2 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1F70 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1FE7 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x206F JUMPI PUSH2 0x2038 DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2003 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2017 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x202B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x27E9 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2044 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2057 JUMPI INVALID JUMPDEST SWAP1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2064 JUMPI INVALID JUMPDEST SWAP1 MSTORE POP PUSH1 0x1 ADD PUSH2 0x1FED JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x12B8BC9 PUSH1 0xE1 SHL SWAP1 PUSH2 0x2097 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x5025 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x60 PUSH2 0x20E4 DUP6 PUSH2 0x772 PUSH2 0x361A JUMP JUMPDEST DUP5 MLOAD PUSH2 0x20FA SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x9F8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4221 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL SWAP1 PUSH2 0x2130 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x4F67 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x2181 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ PUSH2 0x21B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST DUP4 MLOAD PUSH2 0x21C9 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x21DC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x468F JUMP JUMPDEST SWAP4 SWAP6 SWAP1 SWAP5 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x21F6 DUP4 PUSH2 0x772 PUSH2 0x3625 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x220C SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x476B JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP2 PUSH2 0x223B DUP6 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP5 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ PUSH2 0x226D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST DUP5 MLOAD PUSH2 0x2283 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x2296 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x41CA JUMP JUMPDEST SWAP6 SWAP8 SWAP2 SWAP7 POP SWAP5 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x22B2 DUP4 PUSH2 0x772 PUSH2 0x3630 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x22CB PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x22DE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4B78 JUMP JUMPDEST SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xA55 JUMPI INVALID JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2323 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xBD4 JUMPI PUSH2 0x2340 DUP6 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1D54 JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x234C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x2329 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2372 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x240B JUMPI PUSH1 0x60 DUP1 PUSH2 0x2399 DUP6 PUSH2 0x216C JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x2400 JUMPI PUSH1 0x0 PUSH2 0x23BE DUP10 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xBA8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x23CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP3 DUP2 PUSH2 0x23DE JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP8 DUP2 LT DUP1 PUSH2 0x23ED JUMPI POP DUP8 ISZERO JUMPDEST ISZERO PUSH2 0x23F6 JUMPI DUP1 SWAP8 POP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x23A5 JUMP JUMPDEST POP PUSH2 0x8DB SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ ISZERO PUSH2 0x2464 JUMPI PUSH1 0x0 PUSH2 0x2437 DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP2 SWAP3 POP PUSH1 0x60 SWAP2 PUSH4 0x6EB1769F PUSH1 0xE1 SHL SWAP2 PUSH2 0x188D SWAP2 DUP10 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH1 0x24 ADD PUSH2 0x4F29 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x2697 JUMPI PUSH1 0x0 DUP1 PUSH2 0x2489 DUP6 PUSH2 0x7BF JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP3 SWAP6 POP SWAP1 SWAP4 POP PUSH1 0x60 SWAP3 POP PUSH4 0xE985E9C5 PUSH1 0xE0 SHL SWAP2 PUSH2 0x24BC SWAP2 DUP11 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH1 0x24 ADD PUSH2 0x4F29 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x250D SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2548 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x254D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO DUP1 PUSH2 0x2561 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ ISZERO JUMPDEST DUP1 PUSH2 0x257D JUMPI POP PUSH2 0x2578 DUP2 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x2688 JUMPI PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x20604BF PUSH1 0xE2 SHL SWAP1 PUSH2 0x259F SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x51F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x40 MLOAD PUSH2 0x25EC SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2627 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x262C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP4 POP SWAP2 POP DUP3 DUP1 ISZERO PUSH2 0x2640 JUMPI POP DUP2 MLOAD PUSH1 0x20 EQ JUMPDEST DUP1 ISZERO PUSH2 0x266F JUMPI POP PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2664 DUP4 PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x267A JUMPI PUSH1 0x0 PUSH2 0x267D JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP8 POP POP PUSH2 0x1C14 JUMP JUMPDEST PUSH1 0x0 NOT SWAP7 POP POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x27C5 JUMPI PUSH1 0x0 PUSH2 0x26BB DUP5 PUSH2 0x1E6D JUMP JUMPDEST POP POP PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP3 SWAP5 POP PUSH1 0x60 SWAP4 POP PUSH4 0xE985E9C5 PUSH1 0xE0 SHL SWAP3 PUSH2 0x26EC SWAP3 POP DUP10 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH1 0x24 ADD PUSH2 0x4F29 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x273D SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2778 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x277D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2790 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST DUP1 ISZERO PUSH2 0x27AC JUMPI POP PUSH2 0x27A8 DUP2 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST PUSH1 0x1 EQ JUMPDEST PUSH2 0x27B7 JUMPI PUSH1 0x0 PUSH2 0x194D JUMP JUMPDEST PUSH1 0x0 NOT SWAP6 POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x1DA8 JUMPI POP PUSH1 0x0 NOT SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F3 PUSH2 0x3AFB JUMP JUMPDEST PUSH2 0x2846 DUP6 DUP5 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1CE4C78B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x156B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x60 SWAP2 SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2862 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x60 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD PUSH1 0x80 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP4 POP PUSH1 0x60 SWAP3 SWAP2 POP PUSH1 0x20 DUP3 ADD PUSH1 0x80 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP4 POP PUSH1 0x60 SWAP3 SWAP2 POP PUSH1 0x20 DUP3 ADD PUSH1 0x80 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP DUP9 PUSH2 0x160 ADD MLOAD DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x28F8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP8 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2911 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2943 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP7 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2971 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x140 ADD MLOAD DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x2990 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x29AD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP8 DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x29DB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x0 ADD MLOAD DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x2A0D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x1A0 ADD MLOAD DUP5 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2A2C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP8 DUP4 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2A45 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2A77 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x60 ADD MLOAD DUP2 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2AA9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x180 ADD MLOAD DUP5 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x2AC8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x2AE5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x2B17 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x40 ADD MLOAD DUP2 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x1770 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL SWAP1 PUSH2 0x2097 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x51A1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B7A DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ DUP1 PUSH2 0x2BAB JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x2BC6 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x2BE1 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x2BFC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ JUMPDEST PUSH2 0x2C18 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2C62 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x2C4F PUSH2 0x3B2A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2C47 JUMPI SWAP1 POP JUMPDEST POP SWAP4 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2C8F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2CBC JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x2D4C JUMPI PUSH2 0x2CF9 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2CD8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2CEC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2D6E JUMP JUMPDEST DUP8 MLOAD DUP9 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x2D07 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x2D1A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP8 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x2D2D JUMPI INVALID JUMPDEST SWAP4 ISZERO ISZERO PUSH1 0x20 SWAP5 DUP6 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 MSTORE MSTORE PUSH1 0x1 ADD PUSH2 0x2CC2 JUMP JUMPDEST POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH2 0x2D62 DUP5 DUP5 PUSH2 0x22F1 JUMP JUMPDEST SWAP2 POP PUSH2 0x853 DUP5 DUP5 PUSH2 0xB59 JUMP JUMPDEST PUSH2 0x2D76 PUSH2 0x3B2A JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH4 0x9D3FA4B9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x9D3FA4B9 SWAP1 PUSH2 0x2DAB SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x56B6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DD7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x2DFB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4883 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH4 0xA12DCC6F PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP6 POP SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xA12DCC6F SWAP1 PUSH2 0x2E34 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56C9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x2E84 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x46E5 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 PUSH2 0x2E97 DUP3 DUP9 PUSH2 0x140 ADD MLOAD PUSH2 0x8B9 JUMP JUMPDEST PUSH1 0xA0 DUP9 ADD MLOAD PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x180 DUP11 ADD MLOAD PUSH2 0x140 DUP12 ADD MLOAD SWAP4 SWAP5 POP SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2EC6 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x363B AND JUMP JUMPDEST ISZERO PUSH2 0x2EF3 JUMPI PUSH2 0x2EEC DUP5 PUSH2 0x2EE6 DUP5 DUP14 PUSH1 0x80 ADD MLOAD PUSH2 0x3660 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP6 PUSH2 0x367C JUMP JUMPDEST SWAP1 POP PUSH2 0x2F4C JUMP JUMPDEST DUP2 PUSH2 0x2F07 JUMPI PUSH2 0x2EEC DUP5 DUP12 PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x367C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F18 DUP7 DUP13 PUSH2 0x180 ADD MLOAD PUSH2 0x8B9 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2F2B DUP7 DUP14 PUSH1 0x80 ADD MLOAD DUP8 PUSH2 0x367C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2F3A DUP4 DUP7 DUP9 PUSH2 0x367C JUMP JUMPDEST SWAP1 POP PUSH2 0x2F46 DUP3 DUP3 PUSH2 0x30EF JUMP JUMPDEST SWAP4 POP POP POP POP JUMPDEST PUSH2 0x2F6C PUSH2 0x2F66 DUP10 PUSH1 0x40 ADD MLOAD DUP6 PUSH2 0x369E SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP3 PUSH2 0x30EF JUMP JUMPDEST SWAP7 POP PUSH1 0x4 PUSH2 0x2F7F DUP12 DUP13 PUSH1 0x20 ADD MLOAD DUP11 PUSH2 0x150E JUMP JUMPDEST PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2F8A JUMPI INVALID JUMPDEST EQ PUSH2 0x2F96 JUMPI PUSH1 0x0 PUSH2 0x2F98 JUMP JUMPDEST DUP7 JUMPDEST SWAP7 POP POP POP POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2FB7 DUP5 PUSH2 0x772 PUSH2 0x36BD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2FD0 PUSH1 0x4 DUP7 MLOAD DUP8 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x899 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4BA5 JUMP JUMPDEST PUSH4 0xFDB6CA8D PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2FFB DUP4 PUSH1 0x0 PUSH2 0x3071 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND SWAP1 DUP4 AND EQ PUSH2 0x3029 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x5644 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x304C JUMPI PUSH2 0x304C PUSH2 0x3047 PUSH1 0x0 DUP6 DUP6 PUSH2 0x36C8 JUMP JUMPDEST PUSH2 0x36E7 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x3065 JUMPI PUSH2 0x3065 PUSH2 0x3047 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0x36C8 JUMP JUMPDEST POP DUP2 SWAP1 SUB SWAP2 ADD SWAP1 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3092 JUMPI PUSH2 0x3092 PUSH2 0x3047 PUSH1 0x3 DUP6 MLOAD DUP6 PUSH1 0x4 ADD PUSH2 0x36C8 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH2 0x30C6 JUMPI PUSH2 0x30C6 PUSH2 0x3047 PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x36C8 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC88 DUP4 DUP4 PUSH2 0x36EF JUMP JUMPDEST PUSH4 0x18E4B141 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x30FE JUMPI DUP2 PUSH2 0xC88 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4678472B PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0xB6555D6F PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0x24410CD3 PUSH1 0xE1 SHL SWAP1 JUMP JUMPDEST PUSH4 0x1B8388F7 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0xE94A7ED PUSH1 0xE4 SHL SWAP1 JUMP JUMPDEST PUSH4 0x4AD31275 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x3160 JUMPI PUSH2 0x3160 PUSH2 0x3047 PUSH1 0x0 DUP6 DUP6 PUSH2 0x36C8 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x3179 JUMPI PUSH2 0x3179 PUSH2 0x3047 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0x36C8 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x31A6 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0xC88 PUSH2 0x31B5 DUP3 PUSH2 0x3719 JUMP JUMPDEST DUP5 PUSH2 0x31BF DUP8 PUSH2 0x3719 JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x371F JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x60 PUSH2 0x31E3 PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x3147 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x91B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4590 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x3219 PUSH2 0x3A68 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3211 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP5 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP4 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3262 JUMPI POP POP DUP5 MLOAD SWAP1 SWAP2 POP PUSH2 0x328F SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x32A2 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4A57 JUMP JUMPDEST DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x32AF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x32C3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x32D7 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 MSTORE MSTORE SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY POP POP DUP6 MLOAD SWAP2 SWAP4 POP PUSH2 0x332C SWAP2 DUP7 SWAP2 POP PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x333F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4609 JUMP JUMPDEST DUP5 MLOAD DUP6 SWAP1 PUSH1 0x0 SWAP1 PUSH2 0x334C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP6 SWAP3 SWAP5 POP SWAP3 POP POP JUMP JUMPDEST PUSH3 0x8E3DB9 PUSH1 0xE5 SHL SWAP1 JUMP JUMPDEST PUSH2 0x3376 PUSH2 0x3AFB JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH2 0x3392 SWAP2 DUP7 SWAP2 PUSH2 0x37C4 JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xC0 DUP7 ADD MLOAD PUSH2 0x33A9 SWAP2 DUP7 SWAP2 PUSH2 0x37C4 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xE0 DUP7 ADD MLOAD PUSH2 0x33C3 SWAP2 DUP7 SWAP2 PUSH2 0x37C4 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x33D8 DUP3 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH4 0xB04FBDDD PUSH1 0xE0 SHL SWAP1 PUSH2 0x340B SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x503E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x5 SLOAD SWAP2 MLOAD SWAP1 SWAP3 POP PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x345D SWAP1 DUP5 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x349A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x349F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP PUSH2 0x34B6 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH2 0x34C0 PUSH2 0x311B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x34FD JUMPI PUSH1 0x0 PUSH2 0x34DF DUP4 PUSH2 0x96A JUMP JUMPDEST POP SWAP2 POP POP PUSH1 0xFF DUP2 AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x34F2 JUMPI INVALID JUMPDEST SWAP5 POP POP POP POP POP PUSH2 0x17EC JUMP JUMPDEST PUSH2 0x3505 PUSH2 0x3105 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x3538 JUMPI PUSH1 0x0 PUSH2 0x3524 DUP4 PUSH2 0x8E1 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP PUSH1 0xFF DUP2 AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x34F2 JUMPI INVALID JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD KECCAK256 PUSH32 0xF43F26EA5A94B478394A975E856464913DC1A8A1CA70939D974AA7C238AA0CE0 EQ ISZERO PUSH2 0x3572 JUMPI PUSH1 0x4 SWAP4 POP POP POP POP PUSH2 0x17EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x55B9 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC88 DUP3 PUSH2 0x35F0 DUP6 PUSH2 0x3829 JUMP JUMPDEST PUSH2 0x38A4 JUMP JUMPDEST PUSH4 0x50AE0683 PUSH1 0xE1 SHL SWAP1 JUMP JUMPDEST PUSH4 0xFCB4463 PUSH1 0xE3 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC88 DUP3 PUSH2 0x35F0 DUP6 PUSH2 0x38C3 JUMP JUMPDEST PUSH4 0x5BD0428D PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0x20D11F61 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0x3D661461 PUSH1 0xE2 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0xC88 JUMPI POP POP DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 DUP3 MLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 EQ SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xC88 JUMPI PUSH2 0xC88 PUSH2 0x3047 PUSH1 0x0 DUP7 DUP7 PUSH2 0x397C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17EC DUP4 PUSH2 0x3692 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x399B AND JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x36B7 JUMPI PUSH2 0x36B7 PUSH2 0x3047 PUSH1 0x2 DUP6 DUP6 PUSH2 0x397C JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH4 0x1CA78ED9 PUSH1 0xE3 SHL SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xC53 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54C4 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3710 JUMPI PUSH2 0x3710 PUSH2 0x3047 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x36C8 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3749 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x3029 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x3756 JUMPI PUSH2 0x3029 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x3790 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x3788 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x376D JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x3029 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x37BB JUMPI DUP3 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x379F JUMP JUMPDEST DUP6 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37D1 DUP5 DUP5 DUP5 PUSH2 0x39C5 JUMP JUMPDEST ISZERO PUSH2 0x37E4 JUMPI PUSH2 0x37E4 PUSH2 0x3047 DUP6 DUP6 DUP6 PUSH2 0x3A2B JUMP JUMPDEST PUSH2 0x17EC DUP4 PUSH2 0x3692 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3807 JUMPI POP PUSH1 0x0 PUSH2 0x8DB JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3814 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xC88 JUMPI PUSH2 0xC88 PUSH2 0x3047 PUSH1 0x1 DUP7 DUP7 PUSH2 0x397C JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD PUSH1 0x60 SWAP8 DUP9 ADD MLOAD DUP7 MLOAD SWAP7 DUP6 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP3 MLOAD PUSH32 0xEC69816980A3A3CA4554410E60253953E9FF375BA4536A98ADFA15CC71541508 DUP2 MSTORE SWAP5 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x140 DUP2 ADD MLOAD PUSH2 0x160 DUP3 ADD MLOAD PUSH2 0x180 DUP4 ADD MLOAD PUSH2 0x1A0 DUP5 ADD MLOAD PUSH1 0x0 SWAP4 PUSH32 0xF80322EB8376AAFB64EADF8F0D7623F22130FD9491A221E902B713CB984A7534 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x20 DUP8 LT ISZERO PUSH2 0x390F JUMPI INVALID JUMPDEST PUSH1 0x1F NOT DUP8 ADD DUP1 MLOAD PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x160 DUP12 ADD DUP1 MLOAD PUSH2 0x180 DUP14 ADD DUP1 MLOAD PUSH2 0x1A0 DUP16 ADD DUP1 MLOAD SWAP14 DUP10 MSTORE DUP13 MLOAD PUSH1 0x20 SWAP14 DUP15 ADD KECCAK256 DUP8 MSTORE DUP12 MLOAD SWAP12 DUP14 ADD SWAP12 SWAP1 SWAP12 KECCAK256 DUP5 MSTORE DUP10 MLOAD SWAP10 DUP13 ADD SWAP10 SWAP1 SWAP10 KECCAK256 DUP2 MSTORE DUP8 MLOAD SWAP8 SWAP1 SWAP11 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP9 MSTORE PUSH2 0x1E0 DUP6 KECCAK256 SWAP4 SWAP1 SWAP5 MSTORE SWAP1 MSTORE SWAP2 SWAP1 MSTORE SWAP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xC53 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5455 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x39B1 JUMPI PUSH2 0x39B1 PUSH2 0x3047 PUSH1 0x3 DUP6 DUP6 PUSH2 0x397C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x39BC JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x39D7 JUMPI PUSH2 0x39D7 PUSH2 0x3047 PUSH2 0x3A4A JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x39E2 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x39EF JUMPI POP PUSH1 0x0 PUSH2 0xC88 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x39F9 JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x3A0E DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST PUSH2 0x3A20 DUP3 PUSH2 0x3E8 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST LT ISZERO SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x339F3DE2 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xC53 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56EE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH4 0x29E460DF PUSH1 0xE2 SHL PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x8DB DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x8DB DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3B70 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B83 PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST PUSH2 0x5704 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3BA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DA3 JUMPI DUP2 CALLDATALOAD PUSH2 0x3BBA DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3BDC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3BEA PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3C12 DUP8 PUSH1 0x20 DUP5 MLOAD DUP10 ADD ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3BFA JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3C41 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C4F PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3C77 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3C5F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3C9C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3CAA PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3CD2 DUP8 PUSH1 0x20 DUP5 MLOAD DUP10 ADD ADD PUSH2 0x3FE0 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CBA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3CF7 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D05 PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3D2D DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x3E92 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D15 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3D52 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3D60 PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3D81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DA3 JUMPI DUP2 MLOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D84 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3DB0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3DBE PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3DDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DA3 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3DE2 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3E0E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3E1C PUSH2 0x3B7E DUP3 PUSH2 0x5749 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x3E33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3E5C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3E6A PUSH2 0x3B7E DUP3 PUSH2 0x5749 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x3E81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DA8 DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x576C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3EA5 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3EAE DUP2 PUSH2 0x5704 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3EBB DUP4 DUP4 PUSH2 0x3B4A JUMP JUMPDEST DUP2 MSTORE PUSH2 0x3ECA DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3EDC DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x3EEE DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x3F4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F5B DUP7 DUP4 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3F77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F83 DUP7 DUP4 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3F9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FAB DUP7 DUP4 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3FC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FD4 DUP6 DUP3 DUP7 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3FF3 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3FFC DUP2 PUSH2 0x5704 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x4009 DUP4 DUP4 PUSH2 0x3B55 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x4018 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x402A DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x403C DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x409D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40A9 DUP7 DUP4 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x40C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40D1 DUP7 DUP4 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x40ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40F9 DUP7 DUP4 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4115 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FD4 DUP6 DUP3 DUP7 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP1 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4144 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC88 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4161 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x416C DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x417D DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x419C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x41A7 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x41B8 DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x41DE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x41E9 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4204 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4210 DUP7 DUP3 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4236 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD PUSH2 0x4241 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x425D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4269 DUP9 DUP4 DUP10 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x427E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x428A DUP9 DUP4 DUP10 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x429F JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42AC DUP8 DUP3 DUP9 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x42CA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x42D5 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x42EF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3C31 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x431A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4325 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4340 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x434C DUP9 DUP4 DUP10 ADD PUSH2 0x3DA0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4361 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x436D DUP9 DUP4 DUP10 ADD PUSH2 0x3DA0 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4382 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42AC DUP8 DUP3 DUP9 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x43A1 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x43AC DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x43C6 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x43E6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x43F1 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x440B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4417 DUP7 DUP3 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x443A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4445 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4464 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4479 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3B60 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4496 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x44AB JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3C8C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x44CB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x44E1 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x44ED DUP8 DUP4 DUP9 ADD PUSH2 0x3CE7 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4502 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x450E DUP8 DUP4 DUP9 ADD PUSH2 0x3B60 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4523 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3DA0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x454C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4562 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x456E DUP7 DUP4 DUP8 ADD PUSH2 0x3CE7 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4583 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3C31 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x45A4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x45BA JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x45C6 DUP8 DUP4 DUP9 ADD PUSH2 0x3C8C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x45DB JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x45E7 DUP8 DUP4 DUP9 ADD PUSH2 0x3D42 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x45FC JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3BCC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x461D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4633 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x463F DUP8 DUP4 DUP9 ADD PUSH2 0x3C8C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD MLOAD SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x45FC JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x466D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4683 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x456E DUP7 DUP4 DUP8 ADD PUSH2 0x3DA0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46A1 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x46B7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x46C3 DUP7 DUP4 DUP8 ADD PUSH2 0x3D42 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x46D8 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3BCC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x46F6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xC88 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x471A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD PUSH2 0x472C DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD SWAP1 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x427E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x475A JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 SWAP1 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x477D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4799 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x47B9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD SWAP3 POP PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x47D6 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x47E2 DUP8 DUP4 DUP9 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x47F7 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4816 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x417D DUP2 PUSH2 0x57DC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x483A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x416C JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4862 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4877 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4894 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x489E PUSH1 0x60 PUSH2 0x5704 JUMP JUMPDEST PUSH2 0x48A8 DUP5 DUP5 PUSH2 0x4122 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48D9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x48EE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3FE0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x490E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4923 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x492F DUP7 DUP3 DUP8 ADD PUSH2 0x3E92 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4940 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4963 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4979 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4985 DUP7 DUP4 DUP8 ADD PUSH2 0x3E92 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x499A JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x49BB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x49D0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x49DC DUP7 DUP3 DUP8 ADD PUSH2 0x3E92 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x49F4 DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4A14 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4A2A JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4A36 DUP9 DUP4 DUP10 ADD PUSH2 0x3FE0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A4B JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4269 DUP9 DUP4 DUP10 ADD PUSH2 0x3FE0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4A6B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4A81 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4A8D DUP8 DUP4 DUP9 ADD PUSH2 0x3FE0 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD MLOAD SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x47F7 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4ABD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4AD3 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP7 ADD PUSH1 0xA0 DUP2 DUP10 SUB SLT ISZERO PUSH2 0x4AE5 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4AEF PUSH1 0xA0 PUSH2 0x5704 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4B16 DUP9 PUSH1 0x60 DUP4 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x4B2C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4B38 DUP10 DUP3 DUP5 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x80 DUP6 ADD MSTORE POP SWAP2 SWAP5 POP POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH2 0x4B57 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x3B4A JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4B71 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B8A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4B95 DUP2 PUSH2 0x57DC JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4BB9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x4BC4 DUP2 PUSH2 0x57DC JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x40 DUP7 ADD MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH2 0x49F4 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4BF1 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4BFB DUP7 DUP7 PUSH2 0x4122 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP3 POP PUSH1 0x40 DUP6 ADD MLOAD PUSH2 0x4C12 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4C2D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42AC DUP8 DUP3 DUP9 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4C4D JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4C57 DUP6 DUP6 PUSH2 0x4122 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD MLOAD SWAP2 POP PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4C78 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4C98 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4CA2 DUP6 DUP6 PUSH2 0x4122 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD MLOAD SWAP2 POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CCF DUP4 DUP4 PUSH2 0x4DDC JUMP JUMPDEST POP POP PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD DUP3 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4D1E JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4CF7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD DUP1 DUP2 SWAP6 POP PUSH1 0x20 DUP4 MUL DUP2 ADD SWAP2 POP PUSH1 0x20 DUP6 ADD DUP5 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x4D73 JUMPI DUP3 DUP5 SUB DUP9 MSTORE PUSH2 0x4D5D DUP5 DUP4 MLOAD PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x20 SWAP9 DUP10 ADD SWAP9 SWAP1 SWAP5 POP SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4D45 JUMP JUMPDEST POP SWAP2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD DUP3 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4D1E JUMPI DUP2 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4D92 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x4DC8 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x576C JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0xFF AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 PUSH2 0x4E08 DUP5 DUP5 MLOAD PUSH2 0x4CD7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x4E1A PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x4CD7 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x4E2D PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x4CD7 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x4E40 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x4CD7 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP3 DUP3 DUP8 ADD MSTORE PUSH2 0x4E99 DUP4 DUP8 ADD DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x4EB6 DUP3 DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x180 DUP1 DUP5 ADD MLOAD DUP6 DUP4 SUB DUP3 DUP8 ADD MSTORE PUSH2 0x4ED2 DUP4 DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1A0 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x4EEF DUP3 DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4F0B DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x576C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x4F8B SWAP1 DUP4 ADD DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4F9D DUP2 DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x4FAF DUP2 DUP7 PUSH2 0x4DB0 JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP2 MSTORE PUSH1 0x60 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x4FDF SWAP1 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x5013 SWAP1 DUP4 ADD DUP7 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4F9D DUP2 DUP7 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x5051 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4D28 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x5063 DUP2 DUP8 PUSH2 0x4CE4 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x5075 DUP2 DUP8 PUSH2 0x4CE4 JUMP JUMPDEST SWAP2 POP POP DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x508A DUP2 DUP6 PUSH2 0x4D7F JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x50D7 JUMPI DUP4 MLOAD PUSH1 0x5 DUP2 LT PUSH2 0x50C3 JUMPI INVALID JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x50AF JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD PUSH1 0x60 DUP4 MSTORE DUP1 DUP7 MLOAD PUSH2 0x50F9 DUP2 DUP5 PUSH2 0x51F4 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP3 POP DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5127 JUMPI PUSH2 0x5116 DUP4 DUP6 MLOAD PUSH2 0x4CC3 JUMP JUMPDEST PUSH1 0x20 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x5103 JUMP JUMPDEST POP POP DUP4 DUP2 SUB PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x513B DUP2 DUP8 PUSH2 0x4D7F JUMP JUMPDEST SWAP2 POP POP DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP5 MLOAD PUSH2 0x5153 DUP2 DUP5 PUSH2 0x51F4 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP7 ADD SWAP3 POP DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5181 JUMPI PUSH2 0x5170 DUP4 DUP6 MLOAD PUSH2 0x4CB9 JUMP JUMPDEST PUSH1 0x20 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x515D JUMP JUMPDEST POP SWAP1 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xC88 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4D7F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x51B4 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x51C6 DUP2 DUP6 PUSH2 0x4D28 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x51E2 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x51C6 DUP2 DUP6 PUSH2 0x4D7F JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x5227 SWAP1 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x508A DUP2 DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x17EC PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x5279 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4EEF DUP2 DUP6 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 DUP2 ADD PUSH2 0x529B DUP4 PUSH2 0x57BD JUMP JUMPDEST DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP7 AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x5314 SWAP1 DUP4 ADD DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x5326 DUP2 DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x80 DUP6 ADD MSTORE PUSH2 0x1788 DUP2 DUP7 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP6 AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x536C SWAP1 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL DUP6 AND DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x53CA PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4EEF DUP2 DUP6 PUSH2 0x4D28 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xC88 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x5402 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP4 SWAP1 SWAP5 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5438 DUP6 PUSH2 0x579C JUMP JUMPDEST DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x51C6 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5462 DUP6 PUSH2 0x57A9 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5483 DUP6 PUSH2 0x57B3 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x54AD DUP5 PUSH2 0x57A9 JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5462 DUP6 PUSH2 0x57B3 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x5462 JUMPI INVALID JUMPDEST PUSH1 0x20 DUP2 ADD PUSH1 0x5 DUP4 LT PUSH2 0x54E0 JUMPI INVALID JUMPDEST SWAP2 SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x54F1 DUP7 PUSH2 0x57BD JUMP JUMPDEST DUP6 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP4 ADD DUP2 SWAP1 MSTORE PUSH2 0x4EEF SWAP1 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x54AD DUP5 PUSH2 0x579C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x553F PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP3 SUB DUP2 DUP6 ADD MSTORE DUP2 DUP8 MLOAD DUP1 DUP5 MSTORE DUP3 DUP5 ADD SWAP2 POP DUP3 DUP4 DUP3 MUL DUP6 ADD ADD DUP4 DUP11 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x558D JUMPI PUSH1 0x1F NOT DUP8 DUP5 SUB ADD DUP6 MSTORE PUSH2 0x557B DUP4 DUP4 MLOAD PUSH2 0x4DF8 JUMP JUMPDEST SWAP5 DUP7 ADD SWAP5 SWAP3 POP SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x555F JUMP JUMPDEST POP POP DUP7 DUP2 SUB PUSH1 0x40 DUP9 ADD MSTORE PUSH2 0x55A1 DUP2 DUP11 PUSH2 0x4D7F JUMP JUMPDEST SWAP5 POP POP POP POP POP DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x508A DUP2 DUP6 PUSH2 0x4D28 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x554E4B4E4F574E5F52455455524E5F44415441 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x554E4B4E4F574E5F46554E4354494F4E5F53454C4543544F5200000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x15539253541311535153951151 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x2120A22FA9A2A622A1AA27A9 PUSH1 0xA1 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH14 0x15D493D391D7D41493D61657D251 PUSH1 0x92 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH2 0x56A0 DUP3 DUP7 PUSH2 0x4DDC JUMP JUMPDEST DUP4 PUSH1 0x60 DUP4 ADD MSTORE DUP3 ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xC88 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4DF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x56DC PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4DF8 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x51C6 DUP2 DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5722 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x573F JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x575E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5787 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x576F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x5796 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST PUSH1 0x4 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST PUSH1 0x3 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST PUSH1 0x7 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x57A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x57A6 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 SELFBALANCE SWAP4 PUSH7 0x4DEE66DCABC4A7 LT 0xB9 SWAP1 BYTE OR 0xD3 SELFBALANCE LOG2 SELFDESTRUCT 0x1F 0xB8 0x4D CALLCODE PUSH7 0xB96A650F614B87 PUSH22 0x6C6578706572696D656E74616CF564736F6C63430005 0xF STOP BLOCKHASH ", - "sourceMap": "1167:1191:0:-;;;1298:248;8:9:-1;5:2;;;30:1;27;20:12;5:2;1298:248:0;;;;;;;;;;;;;;;;;;;;;1473:1;1633:32:2;;-1:-1:-1;;;;;;1633:32:2;-1:-1:-1;;;;;1633:32:2;;;;;;;;;;1698:67;;;;;1473:1:0;;1633:32:2;;;;;;1698:9;;;;;:23;;:67;;1722:42;;1698:67;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1698:67:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1698:67:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1698:67:2;;;;;;;;;1675:20;:90;;-1:-1:-1;;;;;;1675:90:2;-1:-1:-1;;;;;1675:90:2;;;;;;-1:-1:-1;1799:9:2;:68;;;;;:9;;;:23;;:68;;1823:43;;1799:68;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1799:68:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1799:68:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1799:68:2;;;;;;;;;1775:21;:92;;-1:-1:-1;;;;;;1775:92:2;-1:-1:-1;;;;;1775:92:2;;;;;;-1:-1:-1;1902:9:2;:70;;;;;:9;;;:23;;:70;;1926:45;;1902:70;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1902:70:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1902:70:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1902:70:2;;;;;;;;;1877:22;:95;;-1:-1:-1;;;;;;1877:95:2;-1:-1:-1;;;;;1877:95:2;;;;;;-1:-1:-1;2011:9:2;:67;;;;;:9;;;:23;;:67;;2035:42;;2011:67;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2011:67:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2011:67:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2011:67:2;;;;;;;;;1982:26;:96;;-1:-1:-1;;;;;;1982:96:2;;;-1:-1:-1;;;;;1982:96:2;;;;;;;1970:9:4;:32;;;;;;;;;;;;;;;-1:-1:-1;;;;1444:46:11;;;:97;;1509:32;1444:97;;;1501:4;1444:97;1409:132;;1581:182;1621:28;;;;;;;;;;;;;;;;;1663:31;;;;;;;;;;;;;;;;;1708:7;1729:24;1581:26;;;;;:182;;:::i;:::-;1551:27;:212;-1:-1:-1;1167:1191:0;;-1:-1:-1;;;1167:1191:0;1285:1263:30;1997:11;;1992:2;1982:13;;;1972:37;2069:14;;2051:16;;;2041:43;;;;2158:2;2152:9;;962:66;2213:26;;2259:15;;;2252:33;;;;2305:15;;;2298:36;;;;2366:2;2354:15;;2347:32;2411:3;2399:16;;2392:43;2505:3;2487:22;;;1285:1263::o;146:263:-1:-;;261:2;249:9;240:7;236:23;232:32;229:2;;;-1:-1;;267:12;229:2;83:13;;-1:-1;;;;;1060:54;;1185:35;;1175:2;;-1:-1;;1224:12;1175:2;319:74;223:186;-1:-1;;;223:186;533:209;919:66;908:78;;;;485:36;;649:2;634:18;;620:122;;1167:1191:0;;;;;;" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c80639a7e752611610151578063ca49f47c116100c3578063d3d862d111610087578063d3d862d1146106a9578063d4695028146106bc578063e25cabf7146106dc578063e4e6e7da146106fe578063e77286eb1461071f578063ee4f5a941461074157610274565b8063ca49f47c1461062c578063cafd3a071461064f578063d001c5dc14610670578063d186037f14610683578063d36379051461069657610274565b8063a6627e9f11610115578063a6627e9f14610598578063acaedc74146105ab578063b43cffe1146105ce578063bbb2dcf6146105e1578063bc03f96414610603578063c26cfecd1461062457610274565b80639a7e75261461050b5780639eadc8351461052e578063a070cac814610552578063a0901e5114610565578063a5cd62ba1461057857610274565b80634dfdac20116101ea5780637914b2ec116101ae5780637914b2ec146104705780637982653e1461049157806379c9c426146104b15780637b66ad34146104c45780637d727512146104e55780638f4ce479146104f857610274565b80634dfdac20146103d8578063590aa875146103f857806363eb399214610418578063651290421461042b5780636f83188e1461044d57610274565b8063314853ff1161023c578063314853ff14610328578063327d30541461034a57806332aae3ad1461035d5780633db6dc611461037f578063459be5e2146103a257806346eb65cb146103c357610274565b806302d0aec31461027957806304a5618a146102a35780630d7b7d76146102c5578063165979e1146102e65780632322cf7614610308575b600080fd5b61028c610287366004614851565b610763565b60405161029a92919061528b565b60405180910390f35b6102b66102b1366004614851565b6107bf565b60405161029a9392919061537d565b6102d86102d336600461438f565b61083a565b60405161029a929190615239565b6102f96102f4366004614851565b61085c565b60405161029a939291906154b7565b61031b61031636600461438f565b6108b9565b60405161029a91906151f4565b61033b610336366004614851565b6108e1565b60405161029a93929190615260565b6102d8610358366004614851565b610928565b61037061036b366004614851565b61096a565b60405161029a9392919061542d565b61039261038d366004614851565b6109bd565b60405161029a94939291906151fd565b6103b56103b0366004614851565b610a07565b60405161029a9291906154a0565b6103d66103d1366004614851565b610a5d565b005b6103eb6103e63660046142b8565b610b59565b60405161029a919061518e565b61040b610406366004614133565b610bdc565b60405161029a91906153dc565b61040b6104263660046143d2565b610c32565b61043e610439366004614851565b610c8f565b60405161029a93929190614f43565b61046061045b366004614851565b610cc9565b60405161029a949392919061552c565b61048361047e366004614851565b6114d6565b60405161029a9291906152bd565b6104a461049f3660046148fa565b61150e565b60405161029a91906154d2565b61031b6104bf366004614aa9565b611795565b6104d76104d2366004614851565b6117f4565b60405161029a929190614f29565b61031b6104f336600461438f565b61182c565b610483610506366004614851565b611daf565b61051e610519366004614851565b611e0c565b60405161029a94939291906154e6565b61054161053c366004614851565b611e6d565b60405161029a9594939291906152e0565b61031b6105603660046149a7565b611ee5565b6103eb610573366004614453565b611f3c565b61058b6105863660046144b7565b611fb5565b60405161029a9190615095565b61040b6105a6366004614428565b612078565b6105be6105b9366004614851565b6120d1565b60405161029a9493929190614fef565b61040b6105dc366004614305565b61210d565b6105f46105ef366004614851565b61216c565b60405161029a939291906153a8565b610616610611366004614851565b6121e6565b60405161029a929190615247565b61031b61221f565b61063f61063a366004614851565b612225565b60405161029a9493929190615338565b61066261065d366004614851565b6122a3565b60405161029a92919061551f565b6103eb61067e3660046142b8565b6122f1565b61031b61069136600461438f565b61235f565b6104a46106a43660046148fa565b6127e9565b61040b6106b736600461465b565b612b49565b6106cf6106ca366004614851565b612b68565b60405161029a91906152a8565b6106ef6106ea36600461453a565b612c1d565b60405161029a939291906150e2565b61071161070c3660046142b8565b612d55565b60405161029a9291906151cf565b61073261072d366004614951565b612d6e565b60405161029a93929190615692565b61075461074f366004614851565b612fa6565b60405161029a93929190615476565b60008061077783610772612fe3565b612fee565b6000610790600485518661302e9092919063ffffffff16565b8060200190516107a39190810190614804565b909350905060ff811660068111156107b757fe5b915050915091565b600080806107d3848263ffffffff61307116565b92506001600160e01b0319831663012b8bc960e11b1461080e5760405162461bcd60e51b81526004016108059061566a565b60405180910390fd5b61081f84601063ffffffff6130a516565b915061083284602463ffffffff6130d816565b929491935050565b600080610847848461182c565b9150610853848461235f565b90509250929050565b600080600061086d846107726130e4565b6000610886600486518761302e9092919063ffffffff16565b8060200190516108999190810190614c84565b9094509250905060ff811660028111156108af57fe5b9350509193909250565b60008060006108c8858561083a565b915091506108d682826130ef565b925050505b92915050565b60006060806108f284610772613105565b835161090890859060049063ffffffff61302e16565b80602001905161091b91908101906147a5565b9196909550909350915050565b60008061093783610772613110565b825161094d90849060049063ffffffff61302e16565b8060200190516109609190810190614748565b9094909350915050565b600080606061097b8461077261311b565b6000610994600486518761302e9092919063ffffffff16565b8060200190516109a79190810190614c39565b9094509250905060ff811660018111156108af57fe5b6000806060806109cf85610772613126565b84516109e590869060049063ffffffff61302e16565b8060200190516109f89190810190614705565b92989197509550909350915050565b600080610a1683610772613131565b6000610a2f600485518661302e9092919063ffffffff16565b806020019051610a429190810190614b78565b9250905060ff81166003811115610a5557fe5b925050915091565b6000610a6f828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1415610a9a57610a9382611daf565b5050610b55565b6001600160e01b0319811663012b8bc960e11b1415610ac457610abc826107bf565b505050610b55565b6001600160e01b0319811663a7cb5fb760e01b1415610af057610ae682611e6d565b5050505050610b55565b6001600160e01b031981166394cfcdd760e01b1415610b1257610abc8261216c565b6001600160e01b0319811663619ce88560e11b1415610b3d57610b3482612225565b50505050610b55565b60405162461bcd60e51b81526004016108059061566a565b5050565b606060008251905080604051908082528060200260200182016040528015610b8b578160200160208202803883390190505b50915060005b818114610bd457610bb585858381518110610ba857fe5b602002602001015161235f565b838281518110610bc157fe5b6020908102919091010152600101610b91565b505092915050565b604051606090630f47261b60e41b90610bf9908490602401614f15565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610c5390869086908690602401614fbb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610ca08461077261313c565b8351610cb690859060049063ffffffff61302e16565b80602001905161091b9190810190614188565b60608080806000610ce0868263ffffffff61307116565b90506001600160e01b0319811663dedfc1f160e01b1415610d2c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b81525094506110d8565b6001600160e01b03198116634b4a520160e11b1415610d74576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b81525094506110d8565b6001600160e01b031981166323aa37f960e21b1415610dc35760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b03198116632fbb8b8560e21b1415610e115760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b81525094506110d8565b6001600160e01b03198116632da6298760e01b1415610e55576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b81525094506110d8565b6001600160e01b03198116634da26aab60e11b1415610e9757604051806040016040528060098152602001683334b63627b93232b960b91b81525094506110d8565b6001600160e01b03198116633852d63160e21b1415610edf576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b81525094506110d8565b6001600160e01b031981166378d29ac160e01b1415610f2e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b0319811663369da09960e01b1415610f84576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f7700000000000000000081525094506110d8565b6001600160e01b03198116638bc8efb360e01b1415610fda576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c0000000000000081525094506110d8565b6001600160e01b0319811663a6c3bf3360e01b1415611030576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c00000000000081525094506110d8565b6001600160e01b031981166388ec79fb60e01b1415611074576040518060400160405280600b81526020016a6d617463684f726465727360a81b81525094506110d8565b6001600160e01b03198116634f9559b160e01b14806110a357506001600160e01b031981166302280c9160e41b145b156110c05760405162461bcd60e51b81526004016108059061561d565b60405162461bcd60e51b8152600401610805906155e6565b6001600160e01b0319811663dedfc1f160e01b141561116457855161110790879060049063ffffffff61314716565b80602001905161111a9190810190614485565b604080516000808252602082019092529195505b506040805160008082526020820190925291945061115c565b60608152602001906001900390816111475790505b5091506114ce565b6001600160e01b03198116632fbb8b8560e21b148061119357506001600160e01b03198116634b4a520160e11b145b806111ae57506001600160e01b031981166323aa37f960e21b145b156111c8576111bc866131c7565b919550935091506114ce565b6001600160e01b03198116632da6298760e01b14156112975760408051600180825281830190925290816020015b6111fe613a68565b8152602001906001900390816111f6575050865190945061122990879060049063ffffffff61314716565b80602001905161123c91908101906148c8565b8460008151811061124957fe5b6020026020010181905250600060405190808252806020026020018201604052801561112e57816020016020820280388339019050506040805160008082526020820190925291945061115c565b6001600160e01b03198116633852d63160e21b14806112c657506001600160e01b03198116634da26aab60e11b145b156112d4576111bc866131f6565b6001600160e01b031981166378d29ac160e01b148061130357506001600160e01b0319811663369da09960e01b145b8061131e57506001600160e01b03198116638bc8efb360e01b145b8061133957506001600160e01b0319811663a6c3bf3360e01b145b15611347576111bc866132f0565b6001600160e01b031981166388ec79fb60e01b14156114ce57611368613a68565b611370613a68565b60608061138a60048b518c6131479092919063ffffffff16565b80602001905161139d91908101906149ff565b604080516002808252606082019092529498509296509094509250816020015b6113c5613a68565b8152602001906001900390816113bd57905050975083886000815181106113e857fe5b6020026020010181905250828860018151811061140157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061144157fe5b6020026020010181815250508260a001518760018151811061145f57fe5b60209081029190910101526040805160028082526060820190925290816020015b606081526020019060019003908161148057905050955081866000815181106114a557fe5b602002602001018190525080866001815181106114be57fe5b6020026020010181905250505050505b509193509193565b6000806114e583610772613364565b82516114fb90849060049063ffffffff61302e16565b8060200190516109609190810190614828565b6000611518613afb565b6115a98584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b505afa15801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115a39190810190614b60565b3a61336e565b60408051600280825260608281019093529293509091816020015b60608152602001906001900390816115c457505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061165357fe5b602002602001018190525088600001518360008151811061167057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061169e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106116d057fe5b602002602001018181525050886101800151846001815181106116ef57fe5b602002602001018190525088600001518360018151811061170c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061177057fe5b602002602001018181525050611788848484846133e5565b9998505050505050505050565b60006117ec846117e76040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b6135e1565b949350505050565b600080611803836107726135f5565b825161181990849060049063ffffffff61302e16565b806020019051610960919081019061414f565b60008061183f838263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b141561195857600061186d84601063ffffffff6130a516565b6040519091506060906370a0823160e01b9061188d908890602401614f15565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516118de9190614ef9565b600060405180830381855afa9150503d8060008114611919576040519150601f19603f3d011682016040523d82523d6000602084013e61191e565b606091505b5091509150818015611931575080516020145b61193c57600061194d565b61194d81600063ffffffff6130d816565b955050505050611da8565b6001600160e01b0319811663012b8bc960e11b1415611a975760008061197d856107bf565b6040519194509250606091506331a9108f60e11b906119a09084906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119f19190614ef9565b600060405180830381855afa9150503d8060008114611a2c576040519150601f19603f3d011682016040523d82523d6000602084013e611a31565b606091505b50915091506000828015611a46575081516020145b611a51576000611a62565b611a6282600c63ffffffff6130a516565b9050896001600160a01b0316816001600160a01b031614611a84576000611a87565b60015b60ff169750505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b1415611c1e576000606080611abe86611e6d565b5081519296509094509250905060005b818114611c14578351606090627eeac760e11b908b90879085908110611af057fe5b6020026020010151604051602401611b09929190615025565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b5a9190614ef9565b600060405180830381855afa9150503d8060008114611b95576040519150601f19603f3d011682016040523d82523d6000602084013e611b9a565b606091505b50915091506000828015611baf575081516020145b611bba576000611bcb565b611bcb82600063ffffffff6130d816565b90506000878681518110611bdb57fe5b60200260200101518281611beb57fe5b0490508b811080611bfa57508b155b15611c0357809b505b505060019093019250611ace915050565b5050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611d0a57604051606090632a17967960e21b90611c5b908690600090819081906024016153ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cad908490614ef9565b600060405180830381855afa9150503d8060008114611ce8576040519150601f19603f3d011682016040523d82523d6000602084013e611ced565b606091505b5050905080611cfd576000611d01565b6000195b93505050611da8565b6001600160e01b031981166394cfcdd760e01b1415611da857606080611d2f8561216c565b80519194509250905060005b818114611da3576000611d6189858481518110611d5457fe5b602002602001015161182c565b90506000858381518110611d7157fe5b60200260200101518281611d8157fe5b04905087811080611d90575087155b15611d99578097505b5050600101611d3b565b505050505b5092915050565b600080611dc2838263ffffffff61307116565b91506001600160e01b03198216630f47261b60e41b14611df45760405162461bcd60e51b81526004016108059061566a565b611e0583601063ffffffff6130a516565b9050915091565b60008060006060611e1f85610772613600565b6000611e38600487518861302e9092919063ffffffff16565b806020019051611e4b9190810190614bdc565b91965094509250905060ff81166006811115611e6357fe5b9450509193509193565b60008060608080611e84868563ffffffff61307116565b94506001600160e01b0319851663a7cb5fb760e01b14611eb65760405162461bcd60e51b81526004016108059061566a565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006117ec84611f376040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b61360b565b6060808251604051908082528060200260200182016040528015611f6a578160200160208202803883390190505b50905060005b83518114611da857838181518110611f8457fe5b60200260200101516001600160a01b031631828281518110611fa257fe5b6020908102919091010152600101611f70565b606060008451905080604051908082528060200260200182016040528015611fe7578160200160208202803883390190505b50915060005b81811461206f5761203886828151811061200357fe5b602002602001015186838151811061201757fe5b602002602001015186848151811061202b57fe5b60200260200101516127e9565b83828151811061204457fe5b6020026020010190600481111561205757fe5b9081600481111561206457fe5b905250600101611fed565b50509392505050565b60405160609063012b8bc960e11b906120979085908590602401615025565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606120e48561077261361a565b84516120fa90869060049063ffffffff61302e16565b8060200190516109f89190810190614221565b60405160609063a7cb5fb760e01b90612130908790879087908790602401614f67565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612181848463ffffffff61307116565b92506001600160e01b031983166394cfcdd760e01b146121b35760405162461bcd60e51b81526004016108059061566a565b83516121c990859060049063ffffffff61314716565b8060200190516121dc919081019061468f565b9395909450915050565b600060606121f683610772613625565b825161220c90849060049063ffffffff61302e16565b806020019051610960919081019061476b565b60065481565b60008060608161223b858263ffffffff61307116565b93506001600160e01b0319841663619ce88560e11b1461226d5760405162461bcd60e51b81526004016108059061566a565b845161228390869060049063ffffffff61314716565b80602001905161229691908101906141ca565b9597919650949350915050565b6000806122b283610772613630565b60006122cb600485518661302e9092919063ffffffff16565b8060200190516122de9190810190614b78565b9250905060ff81166001811115610a5557fe5b606060008251905080604051908082528060200260200182016040528015612323578160200160208202803883390190505b50915060005b818114610bd45761234085858381518110611d5457fe5b83828151811061234c57fe5b6020908102919091010152600101612329565b600080612372838263ffffffff61307116565b90506001600160e01b031981166394cfcdd760e01b141561240b576060806123998561216c565b80519194509250905060005b8181146124005760006123be89858481518110610ba857fe5b905060008583815181106123ce57fe5b602002602001015182816123de57fe5b049050878110806123ed575087155b156123f6578097505b50506001016123a5565b506108db9350505050565b6001600160e01b03198116630f47261b60e41b141561246457600061243784601063ffffffff6130a516565b600154604051919250606091636eb1769f60e11b9161188d9189916001600160a01b031690602401614f29565b6001600160e01b0319811663012b8bc960e11b141561269757600080612489856107bf565b6002546040519295509093506060925063e985e9c560e01b916124bc918a916001600160a01b0390911690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161250d9190614ef9565b600060405180830381855afa9150503d8060008114612548576040519150601f19603f3d011682016040523d82523d6000602084013e61254d565b606091505b509150915081158061256157508051602014155b8061257d575061257881600063ffffffff6130d816565b600114155b156126885760405160609063020604bf60e21b9061259f9087906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516125ec9190614ef9565b600060405180830381855afa9150503d8060008114612627576040519150601f19603f3d011682016040523d82523d6000602084013e61262c565b606091505b509093509150828015612640575081516020145b801561266f57506002546001600160a01b031661266483600c63ffffffff6130a516565b6001600160a01b0316145b61267a57600061267d565b60015b60ff16975050611c14565b60001996505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b14156127c55760006126bb84611e6d565b50506003546040519294506060935063e985e9c560e01b926126ec925089916001600160a01b031690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161273d9190614ef9565b600060405180830381855afa9150503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b5091509150818015612790575080516020145b80156127ac57506127a881600063ffffffff6130d816565b6001145b6127b757600061194d565b600019955050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611da857506000199392505050565b60006127f3613afb565b6128468584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161286257505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106128f857fe5b6020026020010181905250878360008151811061291157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061294357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061297157fe5b6020026020010181815250508861014001518460018151811061299057fe5b60200260200101819052508860000151836001815181106129ad57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087826001815181106129db57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612a0d57fe5b602002602001018181525050886101a0015184600281518110612a2c57fe5b60200260200101819052508783600281518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612a7757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612aa957fe5b60200260200101818152505088610180015184600381518110612ac857fe5b6020026020010181905250886000015183600381518110612ae557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612b1757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061177057fe5b6040516060906394cfcdd760e01b9061209790859085906024016151a1565b6000612b7a828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1480612bab57506001600160e01b0319811663012b8bc960e11b145b80612bc657506001600160e01b0319811663a7cb5fb760e01b145b80612be157506001600160e01b031981166394cfcdd760e01b145b80612bfc57506001600160e01b0319811663619ce88560e11b145b612c185760405162461bcd60e51b81526004016108059061566a565b919050565b606080606060008551905080604051908082528060200260200182016040528015612c6257816020015b612c4f613b2a565b815260200190600190039081612c475790505b50935080604051908082528060200260200182016040528015612c8f578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612cbc578160200160208202803883390190505b50915060005b818114612d4c57612cf9878281518110612cd857fe5b6020026020010151878381518110612cec57fe5b6020026020010151612d6e565b8751889085908110612d0757fe5b60200260200101878581518110612d1a57fe5b60200260200101878681518110612d2d57fe5b9315156020948502919091019093019290925291905252600101612cc2565b50509250925092565b606080612d6284846122f1565b91506108538484610b59565b612d76613b2a565b600554604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990612dab9088906004016156b6565b60606040518083038186803b158015612dc357600080fd5b505afa158015612dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612dfb9190810190614883565b855160055460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f90612e3490899089906004016156c9565b60206040518083038186803b158015612e4c57600080fd5b505afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e8491908101906146e5565b91506000612e97828861014001516108b9565b60a088015160c08901516101808a01516101408b015193945091929091600091612ec69163ffffffff61363b16565b15612ef357612eec84612ee6848d6080015161366090919063ffffffff16565b8561367c565b9050612f4c565b81612f0757612eec848b608001518561367c565b6000612f18868c61018001516108b9565b90506000612f2b868d608001518761367c565b90506000612f3a83868861367c565b9050612f4682826130ef565b93505050505b612f6c612f6689604001518561369e90919063ffffffff16565b826130ef565b96506004612f7f8b8c602001518a61150e565b6004811115612f8a57fe5b14612f96576000612f98565b865b965050505050509250925092565b6000806000612fb7846107726136bd565b6000612fd0600486518761302e9092919063ffffffff16565b8060200190516108999190810190614ba5565b63fdb6ca8d60e01b90565b6000612ffb836000613071565b90506001600160e01b0319808216908316146130295760405162461bcd60e51b815260040161080590615644565b505050565b60608183111561304c5761304c613047600085856136c8565b6136e7565b83518211156130655761306561304760018487516136c8565b50819003910190815290565b600081600401835110156130925761309261304760038551856004016136c8565b5001602001516001600160e01b03191690565b600081601401835110156130c6576130c661304760048551856014016136c8565b5001601401516001600160a01b031690565b6000610c8883836136ef565b6318e4b14160e01b90565b60008183106130fe5781610c88565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b60608183111561316057613160613047600085856136c8565b83518211156131795761317961304760018487516136c8565b8282036040519080825280601f01601f1916602001820160405280156131a6576020820181803883390190505b509050610c886131b582613719565b846131bf87613719565b01835161371f565b60608060606131e360048551866131479092919063ffffffff16565b80602001905161091b9190810190614590565b60408051600180825281830190925260609182918291816020015b613219613a68565b8152602001906001900390816132115750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081613262575050845190915061328f90859060049063ffffffff61314716565b8060200190516132a29190810190614a57565b856000815181106132af57fe5b60200260200101856000815181106132c357fe5b60200260200101856000815181106132d757fe5b6020908102919091010192909252919052529193909250565b60408051600180825281830190925260609182918291602080830190803883395050855191935061332c9186915060049063ffffffff61314716565b80602001905161333f9190810190614609565b8451859060009061334c57fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b613376613afb565b6020810184905260a085015160808601516133929186916137c4565b815260a085015160c08601516133a99186916137c4565b604082015260a085015160e08601516133c39186916137c4565b60608201526133d8828463ffffffff6137f816565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061340b90889088908890889060240161503e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260055491519092506060916001600160a01b03169061345d908490614ef9565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b509150600090506134b6828263ffffffff61307116565b90506134c061311b565b6001600160e01b0319828116911614156134fd5760006134df8361096a565b5091505060ff811660048111156134f257fe5b9450505050506117ec565b613505613105565b6001600160e01b031982811691161415613538576000613524836108e1565b509091505060ff811660048111156134f257fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0141561357257600493505050506117ec565b60405162461bcd60e51b8152600401610805906155b9565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610c88826135f085613829565b6138a4565b6350ae068360e11b90565b630fcb446360e31b90565b6000610c88826135f0856138c3565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610c885750508051602091820120825192909101919091201490565b600082820183811015610c8857610c886130476000868661397c565b60006117ec83613692868563ffffffff6137f816565b9063ffffffff61399b16565b6000828211156136b7576136b76130476002858561397c565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610c53939291906154c4565b805160208201fd5b600081602001835110156137105761371061304760058551856020016136c8565b50016020015190565b60200190565b6020811015613749576001816020036101000a038019835116818551168082178652505050613029565b8282141561375657613029565b828211156137905760208103905080820181840181515b8285101561378857845186526020958601959094019361376d565b905250613029565b60208103905080820181840183515b818612156137bb5782518252601f19928301929091019061379f565b85525050505050565b60006137d18484846139c5565b156137e4576137e4613047858585613a2b565b6117ec83613692868563ffffffff6137f816565b600082613807575060006108db565b8282028284828161381457fe5b0414610c8857610c886130476001868661397c565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a75349390929091602087101561390f57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610c5393929190615455565b6000816139b1576139b16130476003858561397c565b60008284816139bc57fe5b04949350505050565b6000826139d7576139d7613047613a4a565b8115806139e2575083155b156139ef57506000610c88565b600083806139f957fe5b8584099050613a0e858463ffffffff6137f816565b613a20826103e863ffffffff6137f816565b101595945050505050565b606063339f3de260e01b848484604051602401610c53939291906156ee565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b80356108db816157c7565b80516108db816157c7565b600082601f830112613b70578081fd5b8135613b83613b7e8261572a565b615704565b818152915060208083019084810181840286018201871015613ba457600080fd5b60005b84811015611da3578135613bba816157c7565b84529282019290820190600101613ba7565b600082601f830112613bdc578081fd5b8151613bea613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c128760208451890101613e4c565b83526020928301929190910190600101613bfa565b5050505092915050565b600082601f830112613c41578081fd5b8135613c4f613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c778760208435890101613dfe565b83526020928301929190910190600101613c5f565b600082601f830112613c9c578081fd5b8151613caa613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613cd28760208451890101613fe0565b83526020928301929190910190600101613cba565b600082601f830112613cf7578081fd5b8135613d05613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613d2d8760208435890101613e92565b83526020928301929190910190600101613d15565b600082601f830112613d52578081fd5b8151613d60613b7e8261572a565b818152915060208083019084810181840286018201871015613d8157600080fd5b60005b84811015611da357815184529282019290820190600101613d84565b600082601f830112613db0578081fd5b8135613dbe613b7e8261572a565b818152915060208083019084810181840286018201871015613ddf57600080fd5b60005b84811015611da357813584529282019290820190600101613de2565b600082601f830112613e0e578081fd5b8135613e1c613b7e82615749565b9150808252836020828501011115613e3357600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613e5c578081fd5b8151613e6a613b7e82615749565b9150808252836020828501011115613e8157600080fd5b611da881602084016020860161576c565b60006101c0808385031215613ea5578182fd5b613eae81615704565b915050613ebb8383613b4a565b8152613eca8360208401613b4a565b6020820152613edc8360408401613b4a565b6040820152613eee8360608401613b4a565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b0380821115613f4f57600080fd5b613f5b86838701613dfe565b83850152610160925082850135915080821115613f7757600080fd5b613f8386838701613dfe565b83850152610180925082850135915080821115613f9f57600080fd5b613fab86838701613dfe565b838501526101a0925082850135915080821115613fc757600080fd5b50613fd485828601613dfe565b82840152505092915050565b60006101c0808385031215613ff3578182fd5b613ffc81615704565b9150506140098383613b55565b81526140188360208401613b55565b602082015261402a8360408401613b55565b604082015261403c8360608401613b55565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561409d57600080fd5b6140a986838701613e4c565b838501526101609250828501519150808211156140c557600080fd5b6140d186838701613e4c565b838501526101809250828501519150808211156140ed57600080fd5b6140f986838701613e4c565b838501526101a092508285015191508082111561411557600080fd5b50613fd485828601613e4c565b805160ff811681146108db57600080fd5b600060208284031215614144578081fd5b8135610c88816157c7565b60008060408385031215614161578081fd5b825161416c816157c7565b602084015190925061417d816157c7565b809150509250929050565b60008060006060848603121561419c578081fd5b83516141a7816157c7565b60208501519093506141b8816157c7565b80925050604084015190509250925092565b6000806000606084860312156141de578081fd5b83516141e9816157c7565b60208501519093506001600160401b03811115614204578182fd5b61421086828701613e4c565b925050604084015190509250925092565b60008060008060808587031215614236578182fd5b8451614241816157c7565b60208601519094506001600160401b038082111561425d578384fd5b61426988838901613e4c565b9450604087015191508082111561427e578384fd5b61428a88838901613e4c565b9350606087015191508082111561429f578283fd5b506142ac87828801613e4c565b91505092959194509250565b600080604083850312156142ca578182fd5b82356142d5816157c7565b915060208301356001600160401b038111156142ef578182fd5b6142fb85828601613c31565b9150509250929050565b6000806000806080858703121561431a578182fd5b8435614325816157c7565b935060208501356001600160401b0380821115614340578384fd5b61434c88838901613da0565b94506040870135915080821115614361578384fd5b61436d88838901613da0565b93506060870135915080821115614382578283fd5b506142ac87828801613dfe565b600080604083850312156143a1578182fd5b82356143ac816157c7565b915060208301356001600160401b038111156143c6578182fd5b6142fb85828601613dfe565b6000806000606084860312156143e6578081fd5b83356143f1816157c7565b925060208401356001600160401b0381111561440b578182fd5b61441786828701613dfe565b925050604084013590509250925092565b6000806040838503121561443a578182fd5b8235614445816157c7565b946020939093013593505050565b600060208284031215614464578081fd5b81356001600160401b03811115614479578182fd5b6117ec84828501613b60565b600060208284031215614496578081fd5b81516001600160401b038111156144ab578182fd5b6117ec84828501613c8c565b6000806000606084860312156144cb578081fd5b83356001600160401b03808211156144e1578283fd5b6144ed87838801613ce7565b94506020860135915080821115614502578283fd5b61450e87838801613b60565b93506040860135915080821115614523578283fd5b5061453086828701613da0565b9150509250925092565b6000806040838503121561454c578182fd5b82356001600160401b0380821115614562578384fd5b61456e86838701613ce7565b93506020850135915080821115614583578283fd5b506142fb85828601613c31565b6000806000606084860312156145a4578081fd5b83516001600160401b03808211156145ba578283fd5b6145c687838801613c8c565b945060208601519150808211156145db578283fd5b6145e787838801613d42565b935060408601519150808211156145fc578283fd5b5061453086828701613bcc565b60008060006060848603121561461d578081fd5b83516001600160401b0380821115614633578283fd5b61463f87838801613c8c565b94506020860151935060408601519150808211156145fc578283fd5b6000806040838503121561466d578182fd5b82356001600160401b0380821115614683578384fd5b61456e86838701613da0565b600080604083850312156146a1578182fd5b82516001600160401b03808211156146b7578384fd5b6146c386838701613d42565b935060208501519150808211156146d8578283fd5b506142fb85828601613bcc565b6000602082840312156146f6578081fd5b81518015158114610c88578182fd5b6000806000806080858703121561471a578182fd5b84519350602085015161472c816157c7565b60408601519093506001600160401b038082111561427e578384fd5b6000806040838503121561475a578182fd5b505080516020909101519092909150565b6000806040838503121561477d578182fd5b8251915060208301516001600160401b03811115614799578182fd5b6142fb85828601613e4c565b6000806000606084860312156147b9578081fd5b8351925060208401516001600160401b03808211156147d6578283fd5b6147e287838801613e4c565b935060408601519150808211156147f7578283fd5b5061453086828701613e4c565b60008060408385031215614816578182fd5b82519150602083015161417d816157dc565b6000806040838503121561483a578182fd5b82516001600160e01b03198116811461416c578283fd5b600060208284031215614862578081fd5b81356001600160401b03811115614877578182fd5b6117ec84828501613dfe565b600060608284031215614894578081fd5b61489e6060615704565b6148a88484614122565b815260208301516020820152604083015160408201528091505092915050565b6000602082840312156148d9578081fd5b81516001600160401b038111156148ee578182fd5b6117ec84828501613fe0565b60008060006060848603121561490e578081fd5b83356001600160401b03811115614923578182fd5b61492f86828701613e92565b9350506020840135614940816157c7565b929592945050506040919091013590565b60008060408385031215614963578182fd5b82356001600160401b0380821115614979578384fd5b61498586838701613e92565b9350602085013591508082111561499a578283fd5b506142fb85828601613dfe565b6000806000606084860312156149bb578081fd5b83356001600160401b038111156149d0578182fd5b6149dc86828701613e92565b9350506020840135915060408401356149f4816157c7565b809150509250925092565b60008060008060808587031215614a14578182fd5b84516001600160401b0380821115614a2a578384fd5b614a3688838901613fe0565b95506020870151915080821115614a4b578384fd5b61426988838901613fe0565b600080600060608486031215614a6b578081fd5b83516001600160401b0380821115614a81578283fd5b614a8d87838801613fe0565b94506020860151935060408601519150808211156147f7578283fd5b600080600060608486031215614abd578081fd5b83356001600160401b0380821115614ad3578283fd5b81860160a08189031215614ae5578384fd5b614aef60a0615704565b9250803583526020810135602084015260408101356040840152614b168860608301613b4a565b6060840152608081013582811115614b2c578485fd5b614b3889828401613dfe565b608085015250919450505060208401359150614b578560408601613b4a565b90509250925092565b600060208284031215614b71578081fd5b5051919050565b60008060408385031215614b8a578182fd5b8251614b95816157dc565b6020939093015192949293505050565b600080600060608486031215614bb9578081fd5b8351614bc4816157dc565b6020850151604086015191945092506149f4816157c7565b60008060008060808587031215614bf1578182fd5b614bfb8686614122565b9350602085015192506040850151614c12816157c7565b60608601519092506001600160401b03811115614c2d578182fd5b6142ac87828801613e4c565b600080600060608486031215614c4d578081fd5b614c578585614122565b92506020840151915060408401516001600160401b03811115614c78578182fd5b61453086828701613e4c565b600080600060608486031215614c98578081fd5b614ca28585614122565b925060208401519150604084015190509250925092565b1515815260200190565b6000614ccf8383614ddc565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614d1e5781516001600160a01b0316865260209586019590910190600101614cf7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614d73578284038852614d5d848351614db0565b6020988901989094509190910190600101614d45565b50919695505050505050565b6000815180845260208401935060208301825b82811015614d1e578151865260209586019590910190600101614d92565b60008151808452614dc881602086016020860161576c565b601f01601f19169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b60006101c0614e08848451614cd7565b6020830151614e1a6020860182614cd7565b506040830151614e2d6040860182614cd7565b506060830151614e406060860182614cd7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614e9983870182614db0565b91505061016091508184015185820383870152614eb68282614db0565b925050506101808084015185830382870152614ed28382614db0565b9150506101a091508184015185820383870152614eef8282614db0565b9695505050505050565b60008251614f0b81846020870161576c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385168152608060208201819052600090614f8b90830186614d7f565b8281036040840152614f9d8186614d7f565b8381036060850152614faf8186614db0565b98975050505050505050565b6001600160a01b0384168152606060208201819052600090614fdf90830185614db0565b9050826040830152949350505050565b6001600160a01b038516815260806020820181905260009061501390830186614db0565b8281036040840152614f9d8186614db0565b6001600160a01b03929092168252602082015260400190565b6000608082526150516080830187614d28565b82810360208401526150638187614ce4565b83810360408501526150758187614ce4565b915050828103606084015261508a8185614d7f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156150d7578351600581106150c357fe5b8352602093840193909201916001016150af565b509095945050505050565b600060608201606083528086516150f981846151f4565b9150602088019250835b8181101561512757615116838551614cc3565b602094909401939250600101615103565b5050838103602085015261513b8187614d7f565b915050828103604084015280845161515381846151f4565b9150602086019250835b8181101561518157615170838551614cb9565b60209490940193925060010161515d565b5090979650505050505050565b600060208252610c886020830184614d7f565b6000604082526151b46040830185614d7f565b82810360208401526151c68185614d28565b95945050505050565b6000604082526151e26040830185614d7f565b82810360208401526151c68185614d7f565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061522790830185614db0565b828103606084015261508a8185614db0565b918252602082015260400190565b6000838252604060208301526117ec6040830184614db0565b6000848252606060208301526152796060830185614db0565b8281036040840152614eef8185614db0565b8281526040810161529b836157bd565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319861681526001600160a01b038516602082015260a06040820181905260009061531490830186614d7f565b82810360608401526153268186614d7f565b83810360808501526117888186614db0565b6001600160e01b0319851681526001600160a01b038416602082015260806040820181905260009061536c90830185614db0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b85168252606060208301526153ca6060830185614d7f565b8281036040840152614eef8185614d28565b600060208252610c886020830184614db0565b6000608082526154026080830187614db0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b60006154388561579c565b848252836020830152606060408301526151c66060830184614db0565b60608101615462856157a9565b938152602081019290925260409091015290565b60608101615483856157b3565b93815260208101929092526001600160a01b031660409091015290565b604081016154ad846157a9565b9281526020015290565b60608101615462856157b3565b606081016008851061546257fe5b60208101600583106154e057fe5b91905290565b60006154f1866157bd565b858252602082018590526001600160a01b0384166040830152608060608301819052614eef90830184614db0565b604081016154ad8461579c565b60006080825261553f6080830187614db0565b602083820381850152818751808452828401915082838202850101838a01865b8381101561558d57601f1987840301855261557b838351614df8565b9486019492509085019060010161555f565b505086810360408801526155a1818a614d7f565b945050505050828103606084015261508a8185614d28565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a081016156a08286614ddc565b8360608301528215156080830152949350505050565b600060208252610c886020830184614df8565b6000604082526156dc6040830185614df8565b82810360208401526151c68185614db0565b9283526020830191909152604082015260600190565b6040518181016001600160401b038111828210171561572257600080fd5b604052919050565b60006001600160401b0382111561573f578081fd5b5060209081020190565b60006001600160401b0382111561575e578081fd5b50601f01601f191660200190565b60005b8381101561578757818101518382015260200161576f565b83811115615796576000848401525b50505050565b600281106157a657fe5b50565b600481106157a657fe5b600381106157a657fe5b600781106157a657fe5b6001600160a01b03811681146157a657600080fd5b60ff811681146157a657600080fdfea365627a7a723158204793664dee66dcabc4a710b9901a17d347a2ff1fb84df266b96a650f614b87756c6578706572696d656e74616cf564736f6c634300050f0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x274 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9A7E7526 GT PUSH2 0x151 JUMPI DUP1 PUSH4 0xCA49F47C GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xD3D862D1 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xD3D862D1 EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0xD4695028 EQ PUSH2 0x6BC JUMPI DUP1 PUSH4 0xE25CABF7 EQ PUSH2 0x6DC JUMPI DUP1 PUSH4 0xE4E6E7DA EQ PUSH2 0x6FE JUMPI DUP1 PUSH4 0xE77286EB EQ PUSH2 0x71F JUMPI DUP1 PUSH4 0xEE4F5A94 EQ PUSH2 0x741 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0xCA49F47C EQ PUSH2 0x62C JUMPI DUP1 PUSH4 0xCAFD3A07 EQ PUSH2 0x64F JUMPI DUP1 PUSH4 0xD001C5DC EQ PUSH2 0x670 JUMPI DUP1 PUSH4 0xD186037F EQ PUSH2 0x683 JUMPI DUP1 PUSH4 0xD3637905 EQ PUSH2 0x696 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0xA6627E9F GT PUSH2 0x115 JUMPI DUP1 PUSH4 0xA6627E9F EQ PUSH2 0x598 JUMPI DUP1 PUSH4 0xACAEDC74 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0xB43CFFE1 EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0xBBB2DCF6 EQ PUSH2 0x5E1 JUMPI DUP1 PUSH4 0xBC03F964 EQ PUSH2 0x603 JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0x624 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x9A7E7526 EQ PUSH2 0x50B JUMPI DUP1 PUSH4 0x9EADC835 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0xA070CAC8 EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0xA0901E51 EQ PUSH2 0x565 JUMPI DUP1 PUSH4 0xA5CD62BA EQ PUSH2 0x578 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x4DFDAC20 GT PUSH2 0x1EA JUMPI DUP1 PUSH4 0x7914B2EC GT PUSH2 0x1AE JUMPI DUP1 PUSH4 0x7914B2EC EQ PUSH2 0x470 JUMPI DUP1 PUSH4 0x7982653E EQ PUSH2 0x491 JUMPI DUP1 PUSH4 0x79C9C426 EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0x7B66AD34 EQ PUSH2 0x4C4 JUMPI DUP1 PUSH4 0x7D727512 EQ PUSH2 0x4E5 JUMPI DUP1 PUSH4 0x8F4CE479 EQ PUSH2 0x4F8 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x4DFDAC20 EQ PUSH2 0x3D8 JUMPI DUP1 PUSH4 0x590AA875 EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0x63EB3992 EQ PUSH2 0x418 JUMPI DUP1 PUSH4 0x65129042 EQ PUSH2 0x42B JUMPI DUP1 PUSH4 0x6F83188E EQ PUSH2 0x44D JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x314853FF GT PUSH2 0x23C JUMPI DUP1 PUSH4 0x314853FF EQ PUSH2 0x328 JUMPI DUP1 PUSH4 0x327D3054 EQ PUSH2 0x34A JUMPI DUP1 PUSH4 0x32AAE3AD EQ PUSH2 0x35D JUMPI DUP1 PUSH4 0x3DB6DC61 EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0x459BE5E2 EQ PUSH2 0x3A2 JUMPI DUP1 PUSH4 0x46EB65CB EQ PUSH2 0x3C3 JUMPI PUSH2 0x274 JUMP JUMPDEST DUP1 PUSH4 0x2D0AEC3 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x4A5618A EQ PUSH2 0x2A3 JUMPI DUP1 PUSH4 0xD7B7D76 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x165979E1 EQ PUSH2 0x2E6 JUMPI DUP1 PUSH4 0x2322CF76 EQ PUSH2 0x308 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28C PUSH2 0x287 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x763 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x528B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2B6 PUSH2 0x2B1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x7BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x537D JUMP JUMPDEST PUSH2 0x2D8 PUSH2 0x2D3 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x83A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x5239 JUMP JUMPDEST PUSH2 0x2F9 PUSH2 0x2F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x85C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54B7 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x316 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x8B9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x51F4 JUMP JUMPDEST PUSH2 0x33B PUSH2 0x336 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x8E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5260 JUMP JUMPDEST PUSH2 0x2D8 PUSH2 0x358 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x928 JUMP JUMPDEST PUSH2 0x370 PUSH2 0x36B CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x96A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x542D JUMP JUMPDEST PUSH2 0x392 PUSH2 0x38D CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x9BD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x51FD JUMP JUMPDEST PUSH2 0x3B5 PUSH2 0x3B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xA07 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x54A0 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x3D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xA5D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x3EB PUSH2 0x3E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x42B8 JUMP JUMPDEST PUSH2 0xB59 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x518E JUMP JUMPDEST PUSH2 0x40B PUSH2 0x406 CALLDATASIZE PUSH1 0x4 PUSH2 0x4133 JUMP JUMPDEST PUSH2 0xBDC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x53DC JUMP JUMPDEST PUSH2 0x40B PUSH2 0x426 CALLDATASIZE PUSH1 0x4 PUSH2 0x43D2 JUMP JUMPDEST PUSH2 0xC32 JUMP JUMPDEST PUSH2 0x43E PUSH2 0x439 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xC8F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4F43 JUMP JUMPDEST PUSH2 0x460 PUSH2 0x45B CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0xCC9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x552C JUMP JUMPDEST PUSH2 0x483 PUSH2 0x47E CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x14D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x52BD JUMP JUMPDEST PUSH2 0x4A4 PUSH2 0x49F CALLDATASIZE PUSH1 0x4 PUSH2 0x48FA JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x54D2 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x4BF CALLDATASIZE PUSH1 0x4 PUSH2 0x4AA9 JUMP JUMPDEST PUSH2 0x1795 JUMP JUMPDEST PUSH2 0x4D7 PUSH2 0x4D2 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x17F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x4F29 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x4F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x182C JUMP JUMPDEST PUSH2 0x483 PUSH2 0x506 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x1DAF JUMP JUMPDEST PUSH2 0x51E PUSH2 0x519 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x1E0C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54E6 JUMP JUMPDEST PUSH2 0x541 PUSH2 0x53C CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x1E6D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x52E0 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x560 CALLDATASIZE PUSH1 0x4 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x1EE5 JUMP JUMPDEST PUSH2 0x3EB PUSH2 0x573 CALLDATASIZE PUSH1 0x4 PUSH2 0x4453 JUMP JUMPDEST PUSH2 0x1F3C JUMP JUMPDEST PUSH2 0x58B PUSH2 0x586 CALLDATASIZE PUSH1 0x4 PUSH2 0x44B7 JUMP JUMPDEST PUSH2 0x1FB5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x5095 JUMP JUMPDEST PUSH2 0x40B PUSH2 0x5A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4428 JUMP JUMPDEST PUSH2 0x2078 JUMP JUMPDEST PUSH2 0x5BE PUSH2 0x5B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x20D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4FEF JUMP JUMPDEST PUSH2 0x40B PUSH2 0x5DC CALLDATASIZE PUSH1 0x4 PUSH2 0x4305 JUMP JUMPDEST PUSH2 0x210D JUMP JUMPDEST PUSH2 0x5F4 PUSH2 0x5EF CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x216C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53A8 JUMP JUMPDEST PUSH2 0x616 PUSH2 0x611 CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x21E6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x5247 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x221F JUMP JUMPDEST PUSH2 0x63F PUSH2 0x63A CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x2225 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST PUSH2 0x662 PUSH2 0x65D CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x22A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x551F JUMP JUMPDEST PUSH2 0x3EB PUSH2 0x67E CALLDATASIZE PUSH1 0x4 PUSH2 0x42B8 JUMP JUMPDEST PUSH2 0x22F1 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x691 CALLDATASIZE PUSH1 0x4 PUSH2 0x438F JUMP JUMPDEST PUSH2 0x235F JUMP JUMPDEST PUSH2 0x4A4 PUSH2 0x6A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x48FA JUMP JUMPDEST PUSH2 0x27E9 JUMP JUMPDEST PUSH2 0x40B PUSH2 0x6B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x465B JUMP JUMPDEST PUSH2 0x2B49 JUMP JUMPDEST PUSH2 0x6CF PUSH2 0x6CA CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x2B68 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP2 SWAP1 PUSH2 0x52A8 JUMP JUMPDEST PUSH2 0x6EF PUSH2 0x6EA CALLDATASIZE PUSH1 0x4 PUSH2 0x453A JUMP JUMPDEST PUSH2 0x2C1D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x50E2 JUMP JUMPDEST PUSH2 0x711 PUSH2 0x70C CALLDATASIZE PUSH1 0x4 PUSH2 0x42B8 JUMP JUMPDEST PUSH2 0x2D55 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP3 SWAP2 SWAP1 PUSH2 0x51CF JUMP JUMPDEST PUSH2 0x732 PUSH2 0x72D CALLDATASIZE PUSH1 0x4 PUSH2 0x4951 JUMP JUMPDEST PUSH2 0x2D6E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5692 JUMP JUMPDEST PUSH2 0x754 PUSH2 0x74F CALLDATASIZE PUSH1 0x4 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x2FA6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x29A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5476 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x777 DUP4 PUSH2 0x772 PUSH2 0x2FE3 JUMP JUMPDEST PUSH2 0x2FEE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x790 PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x7A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4804 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x7B7 JUMPI INVALID JUMPDEST SWAP2 POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x7D3 DUP5 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ PUSH2 0x80E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x81F DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST SWAP2 POP PUSH2 0x832 DUP5 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST SWAP3 SWAP5 SWAP2 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x847 DUP5 DUP5 PUSH2 0x182C JUMP JUMPDEST SWAP2 POP PUSH2 0x853 DUP5 DUP5 PUSH2 0x235F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x86D DUP5 PUSH2 0x772 PUSH2 0x30E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x886 PUSH1 0x4 DUP7 MLOAD DUP8 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x899 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4C84 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x8AF JUMPI INVALID JUMPDEST SWAP4 POP POP SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x8C8 DUP6 DUP6 PUSH2 0x83A JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x8D6 DUP3 DUP3 PUSH2 0x30EF JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x8F2 DUP5 PUSH2 0x772 PUSH2 0x3105 JUMP JUMPDEST DUP4 MLOAD PUSH2 0x908 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x91B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x47A5 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x937 DUP4 PUSH2 0x772 PUSH2 0x3110 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x94D SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4748 JUMP JUMPDEST SWAP1 SWAP5 SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x97B DUP5 PUSH2 0x772 PUSH2 0x311B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x994 PUSH1 0x4 DUP7 MLOAD DUP8 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x9A7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4C39 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x8AF JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 PUSH2 0x9CF DUP6 PUSH2 0x772 PUSH2 0x3126 JUMP JUMPDEST DUP5 MLOAD PUSH2 0x9E5 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x9F8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4705 JUMP JUMPDEST SWAP3 SWAP9 SWAP2 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA16 DUP4 PUSH2 0x772 PUSH2 0x3131 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA2F PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xA42 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4B78 JUMP JUMPDEST SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0xA55 JUMPI INVALID JUMPDEST SWAP3 POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA6F DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ ISZERO PUSH2 0xA9A JUMPI PUSH2 0xA93 DUP3 PUSH2 0x1DAF JUMP JUMPDEST POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xAC4 JUMPI PUSH2 0xABC DUP3 PUSH2 0x7BF JUMP JUMPDEST POP POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xAF0 JUMPI PUSH2 0xAE6 DUP3 PUSH2 0x1E6D JUMP JUMPDEST POP POP POP POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xB12 JUMPI PUSH2 0xABC DUP3 PUSH2 0x216C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xB3D JUMPI PUSH2 0xB34 DUP3 PUSH2 0x2225 JUMP JUMPDEST POP POP POP POP PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xB8B JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xBD4 JUMPI PUSH2 0xBB5 DUP6 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xBA8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x235F JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xBC1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xB91 JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0xF47261B PUSH1 0xE4 SHL SWAP1 PUSH2 0xBF9 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x619CE885 PUSH1 0xE1 SHL SWAP1 PUSH2 0xC53 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x4FBB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xCA0 DUP5 PUSH2 0x772 PUSH2 0x313C JUMP JUMPDEST DUP4 MLOAD PUSH2 0xCB6 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x91B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4188 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP1 DUP1 PUSH1 0x0 PUSH2 0xCE0 DUP7 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xDEDFC1F1 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xD2C JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x11 DUP2 MSTORE PUSH1 0x20 ADD PUSH17 0x626174636843616E63656C4F7264657273 PUSH1 0x78 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4B4A5201 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xD74 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH15 0x626174636846696C6C4F7264657273 PUSH1 0x88 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x23AA37F9 PUSH1 0xE2 SHL EQ ISZERO PUSH2 0xDC3 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD PUSH22 0x626174636846696C6C4F72646572734E6F5468726F77 PUSH1 0x50 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2FBB8B85 PUSH1 0xE2 SHL EQ ISZERO PUSH2 0xE11 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD PUSH21 0x626174636846696C6C4F724B696C6C4F7264657273 PUSH1 0x58 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2DA62987 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xE55 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0x31B0B731B2B627B93232B9 PUSH1 0xA9 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4DA26AAB PUSH1 0xE1 SHL EQ ISZERO PUSH2 0xE97 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x9 DUP2 MSTORE PUSH1 0x20 ADD PUSH9 0x3334B63627B93232B9 PUSH1 0xB9 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x3852D631 PUSH1 0xE2 SHL EQ ISZERO PUSH2 0xEDF JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH15 0x3334B63627B925B4B63627B93232B9 PUSH1 0x89 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x78D29AC1 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xF2E JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD PUSH22 0x6D61726B65744275794F72646572734E6F5468726F77 PUSH1 0x50 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x369DA099 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xF84 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D61726B657453656C6C4F72646572734E6F5468726F77000000000000000000 DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x8BC8EFB3 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0xFDA JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D61726B65744275794F726465727346696C6C4F724B696C6C00000000000000 DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA6C3BF33 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1030 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D61726B657453656C6C4F726465727346696C6C4F724B696C6C000000000000 DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x88EC79FB PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1074 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0x6D617463684F7264657273 PUSH1 0xA8 SHL DUP2 MSTORE POP SWAP5 POP PUSH2 0x10D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4F9559B1 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x10A3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2280C91 PUSH1 0xE4 SHL EQ JUMPDEST ISZERO PUSH2 0x10C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x561D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x55E6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xDEDFC1F1 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1164 JUMPI DUP6 MLOAD PUSH2 0x1107 SWAP1 DUP8 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x111A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4485 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP6 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP5 POP PUSH2 0x115C JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1147 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0x14CE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2FBB8B85 PUSH1 0xE2 SHL EQ DUP1 PUSH2 0x1193 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4B4A5201 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x11AE JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x23AA37F9 PUSH1 0xE2 SHL EQ JUMPDEST ISZERO PUSH2 0x11C8 JUMPI PUSH2 0x11BC DUP7 PUSH2 0x31C7 JUMP JUMPDEST SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP PUSH2 0x14CE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x2DA62987 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1297 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x11FE PUSH2 0x3A68 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x11F6 JUMPI POP POP DUP7 MLOAD SWAP1 SWAP5 POP PUSH2 0x1229 SWAP1 DUP8 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x123C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x48C8 JUMP JUMPDEST DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1249 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x112E JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP5 POP PUSH2 0x115C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x3852D631 PUSH1 0xE2 SHL EQ DUP1 PUSH2 0x12C6 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x4DA26AAB PUSH1 0xE1 SHL EQ JUMPDEST ISZERO PUSH2 0x12D4 JUMPI PUSH2 0x11BC DUP7 PUSH2 0x31F6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x78D29AC1 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x1303 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x369DA099 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x131E JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x8BC8EFB3 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x1339 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA6C3BF33 PUSH1 0xE0 SHL EQ JUMPDEST ISZERO PUSH2 0x1347 JUMPI PUSH2 0x11BC DUP7 PUSH2 0x32F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x88EC79FB PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x14CE JUMPI PUSH2 0x1368 PUSH2 0x3A68 JUMP JUMPDEST PUSH2 0x1370 PUSH2 0x3A68 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH2 0x138A PUSH1 0x4 DUP12 MLOAD DUP13 PUSH2 0x3147 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x139D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x49FF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP5 SWAP9 POP SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x13C5 PUSH2 0x3A68 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x13BD JUMPI SWAP1 POP POP SWAP8 POP DUP4 DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x13E8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP3 DUP9 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x1401 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP7 POP DUP4 PUSH1 0xA0 ADD MLOAD DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1441 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP3 PUSH1 0xA0 ADD MLOAD DUP8 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x145F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1480 JUMPI SWAP1 POP POP SWAP6 POP DUP2 DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x14A5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP1 DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x14BE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP POP POP JUMPDEST POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x14E5 DUP4 PUSH2 0x772 PUSH2 0x3364 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x14FB SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4828 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1518 PUSH2 0x3AFB JUMP JUMPDEST PUSH2 0x15A9 DUP6 DUP5 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1CE4C78B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x156B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x157F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x15A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4B60 JUMP JUMPDEST GASPRICE PUSH2 0x336E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 DUP2 ADD SWAP1 SWAP4 MSTORE SWAP3 SWAP4 POP SWAP1 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x15C4 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP4 SWAP5 POP SWAP1 SWAP2 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP5 SWAP6 POP SWAP1 SWAP3 POP SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP5 SWAP6 POP SWAP1 SWAP3 POP SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP DUP9 PUSH2 0x140 ADD MLOAD DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1653 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1670 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP8 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x169E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x0 ADD MLOAD DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x16D0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x180 ADD MLOAD DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x16EF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x170C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x173E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x40 ADD MLOAD DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x1770 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x1788 DUP5 DUP5 DUP5 DUP5 PUSH2 0x33E5 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17EC DUP5 PUSH2 0x17E7 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0xC1E08141C9BDD1BD8DBDB PUSH1 0xAA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP8 DUP8 PUSH2 0x358A JUMP JUMPDEST PUSH2 0x35E1 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1803 DUP4 PUSH2 0x772 PUSH2 0x35F5 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x1819 SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x414F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x183F DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ ISZERO PUSH2 0x1958 JUMPI PUSH1 0x0 PUSH2 0x186D DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH1 0x60 SWAP1 PUSH4 0x70A08231 PUSH1 0xE0 SHL SWAP1 PUSH2 0x188D SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x18DE SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1919 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x191E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x1931 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x193C JUMPI PUSH1 0x0 PUSH2 0x194D JUMP JUMPDEST PUSH2 0x194D DUP2 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x1A97 JUMPI PUSH1 0x0 DUP1 PUSH2 0x197D DUP6 PUSH2 0x7BF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x60 SWAP2 POP PUSH4 0x31A9108F PUSH1 0xE1 SHL SWAP1 PUSH2 0x19A0 SWAP1 DUP5 SWAP1 PUSH1 0x24 ADD PUSH2 0x51F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x19F1 SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A2C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A31 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x0 DUP3 DUP1 ISZERO PUSH2 0x1A46 JUMPI POP DUP2 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x1A51 JUMPI PUSH1 0x0 PUSH2 0x1A62 JUMP JUMPDEST PUSH2 0x1A62 DUP3 PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A84 JUMPI PUSH1 0x0 PUSH2 0x1A87 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP8 POP POP POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1C1E JUMPI PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x1ABE DUP7 PUSH2 0x1E6D JUMP JUMPDEST POP DUP2 MLOAD SWAP3 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1C14 JUMPI DUP4 MLOAD PUSH1 0x60 SWAP1 PUSH3 0x7EEAC7 PUSH1 0xE1 SHL SWAP1 DUP12 SWAP1 DUP8 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1AF0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1B09 SWAP3 SWAP2 SWAP1 PUSH2 0x5025 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x1B5A SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1B95 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1B9A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x0 DUP3 DUP1 ISZERO PUSH2 0x1BAF JUMPI POP DUP2 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x1BBA JUMPI PUSH1 0x0 PUSH2 0x1BCB JUMP JUMPDEST PUSH2 0x1BCB DUP3 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x1BDB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP3 DUP2 PUSH2 0x1BEB JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP12 DUP2 LT DUP1 PUSH2 0x1BFA JUMPI POP DUP12 ISZERO JUMPDEST ISZERO PUSH2 0x1C03 JUMPI DUP1 SWAP12 POP JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0x1ACE SWAP2 POP POP JUMP JUMPDEST POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x1D0A JUMPI PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x2A179679 PUSH1 0xE2 SHL SWAP1 PUSH2 0x1C5B SWAP1 DUP7 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x24 ADD PUSH2 0x53EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x4 SLOAD SWAP2 MLOAD SWAP1 SWAP3 POP PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x1CAD SWAP1 DUP5 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1CE8 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1CED JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x1CFD JUMPI PUSH1 0x0 PUSH2 0x1D01 JUMP JUMPDEST PUSH1 0x0 NOT JUMPDEST SWAP4 POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x1DA8 JUMPI PUSH1 0x60 DUP1 PUSH2 0x1D2F DUP6 PUSH2 0x216C JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1DA3 JUMPI PUSH1 0x0 PUSH2 0x1D61 DUP10 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1D54 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x182C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1D71 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP3 DUP2 PUSH2 0x1D81 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP8 DUP2 LT DUP1 PUSH2 0x1D90 JUMPI POP DUP8 ISZERO JUMPDEST ISZERO PUSH2 0x1D99 JUMPI DUP1 SWAP8 POP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x1D3B JUMP JUMPDEST POP POP POP POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1DC2 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ PUSH2 0x1DF4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST PUSH2 0x1E05 DUP4 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH2 0x1E1F DUP6 PUSH2 0x772 PUSH2 0x3600 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E38 PUSH1 0x4 DUP8 MLOAD DUP9 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1E4B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4BDC JUMP JUMPDEST SWAP2 SWAP7 POP SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1E63 JUMPI INVALID JUMPDEST SWAP5 POP POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP1 PUSH2 0x1E84 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP6 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ PUSH2 0x1EB6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST POP POP POP POP PUSH1 0x24 DUP3 DUP2 ADD MLOAD PUSH1 0x44 DUP5 ADD MLOAD PUSH1 0x64 DUP6 ADD MLOAD PUSH1 0x84 DUP7 ADD MLOAD SWAP5 SWAP7 SWAP3 SWAP6 SWAP2 DUP3 ADD DUP5 ADD SWAP5 SWAP1 DUP3 ADD DUP5 ADD SWAP4 SWAP2 ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17EC DUP5 PUSH2 0x1F37 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0xC1E08141C9BDD1BD8DBDB PUSH1 0xAA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP8 DUP8 PUSH2 0x358A JUMP JUMPDEST PUSH2 0x360B JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1F6A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 EQ PUSH2 0x1DA8 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x1F84 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND BALANCE DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1FA2 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1F70 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1FE7 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x206F JUMPI PUSH2 0x2038 DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2003 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2017 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x202B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x27E9 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2044 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2057 JUMPI INVALID JUMPDEST SWAP1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2064 JUMPI INVALID JUMPDEST SWAP1 MSTORE POP PUSH1 0x1 ADD PUSH2 0x1FED JUMP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x12B8BC9 PUSH1 0xE1 SHL SWAP1 PUSH2 0x2097 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x5025 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x60 PUSH2 0x20E4 DUP6 PUSH2 0x772 PUSH2 0x361A JUMP JUMPDEST DUP5 MLOAD PUSH2 0x20FA SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x9F8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4221 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL SWAP1 PUSH2 0x2130 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x4F67 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x2181 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ PUSH2 0x21B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST DUP4 MLOAD PUSH2 0x21C9 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x21DC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x468F JUMP JUMPDEST SWAP4 SWAP6 SWAP1 SWAP5 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x21F6 DUP4 PUSH2 0x772 PUSH2 0x3625 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x220C SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x302E AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x960 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x476B JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP2 PUSH2 0x223B DUP6 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP5 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ PUSH2 0x226D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST DUP5 MLOAD PUSH2 0x2283 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x2296 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x41CA JUMP JUMPDEST SWAP6 SWAP8 SWAP2 SWAP7 POP SWAP5 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x22B2 DUP4 PUSH2 0x772 PUSH2 0x3630 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x22CB PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x22DE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4B78 JUMP JUMPDEST SWAP3 POP SWAP1 POP PUSH1 0xFF DUP2 AND PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xA55 JUMPI INVALID JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP3 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2323 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xBD4 JUMPI PUSH2 0x2340 DUP6 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1D54 JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x234C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x2329 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2372 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x240B JUMPI PUSH1 0x60 DUP1 PUSH2 0x2399 DUP6 PUSH2 0x216C JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x2400 JUMPI PUSH1 0x0 PUSH2 0x23BE DUP10 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xBA8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x23CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP3 DUP2 PUSH2 0x23DE JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP8 DUP2 LT DUP1 PUSH2 0x23ED JUMPI POP DUP8 ISZERO JUMPDEST ISZERO PUSH2 0x23F6 JUMPI DUP1 SWAP8 POP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x23A5 JUMP JUMPDEST POP PUSH2 0x8DB SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ ISZERO PUSH2 0x2464 JUMPI PUSH1 0x0 PUSH2 0x2437 DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP2 SWAP3 POP PUSH1 0x60 SWAP2 PUSH4 0x6EB1769F PUSH1 0xE1 SHL SWAP2 PUSH2 0x188D SWAP2 DUP10 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH1 0x24 ADD PUSH2 0x4F29 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x2697 JUMPI PUSH1 0x0 DUP1 PUSH2 0x2489 DUP6 PUSH2 0x7BF JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP3 SWAP6 POP SWAP1 SWAP4 POP PUSH1 0x60 SWAP3 POP PUSH4 0xE985E9C5 PUSH1 0xE0 SHL SWAP2 PUSH2 0x24BC SWAP2 DUP11 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH1 0x24 ADD PUSH2 0x4F29 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x250D SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2548 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x254D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO DUP1 PUSH2 0x2561 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ ISZERO JUMPDEST DUP1 PUSH2 0x257D JUMPI POP PUSH2 0x2578 DUP2 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x2688 JUMPI PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x20604BF PUSH1 0xE2 SHL SWAP1 PUSH2 0x259F SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x51F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x40 MLOAD PUSH2 0x25EC SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2627 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x262C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP4 POP SWAP2 POP DUP3 DUP1 ISZERO PUSH2 0x2640 JUMPI POP DUP2 MLOAD PUSH1 0x20 EQ JUMPDEST DUP1 ISZERO PUSH2 0x266F JUMPI POP PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2664 DUP4 PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x30A5 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x267A JUMPI PUSH1 0x0 PUSH2 0x267D JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND SWAP8 POP POP PUSH2 0x1C14 JUMP JUMPDEST PUSH1 0x0 NOT SWAP7 POP POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ ISZERO PUSH2 0x27C5 JUMPI PUSH1 0x0 PUSH2 0x26BB DUP5 PUSH2 0x1E6D JUMP JUMPDEST POP POP PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP3 SWAP5 POP PUSH1 0x60 SWAP4 POP PUSH4 0xE985E9C5 PUSH1 0xE0 SHL SWAP3 PUSH2 0x26EC SWAP3 POP DUP10 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH1 0x24 ADD PUSH2 0x4F29 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x273D SWAP2 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2778 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x277D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2790 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST DUP1 ISZERO PUSH2 0x27AC JUMPI POP PUSH2 0x27A8 DUP2 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x30D8 AND JUMP JUMPDEST PUSH1 0x1 EQ JUMPDEST PUSH2 0x27B7 JUMPI PUSH1 0x0 PUSH2 0x194D JUMP JUMPDEST PUSH1 0x0 NOT SWAP6 POP POP POP POP POP PUSH2 0x1DA8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ ISZERO PUSH2 0x1DA8 JUMPI POP PUSH1 0x0 NOT SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F3 PUSH2 0x3AFB JUMP JUMPDEST PUSH2 0x2846 DUP6 DUP5 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1CE4C78B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x156B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x60 SWAP2 SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2862 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP PUSH1 0x60 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD PUSH1 0x80 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP4 POP PUSH1 0x60 SWAP3 SWAP2 POP PUSH1 0x20 DUP3 ADD PUSH1 0x80 DUP1 CODESIZE DUP4 CODECOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP1 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP4 POP PUSH1 0x60 SWAP3 SWAP2 POP PUSH1 0x20 DUP3 ADD PUSH1 0x80 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP DUP9 PUSH2 0x160 ADD MLOAD DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x28F8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP8 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2911 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2943 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP7 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2971 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x140 ADD MLOAD DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x2990 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x29AD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP8 DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x29DB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x0 ADD MLOAD DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x2A0D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x1A0 ADD MLOAD DUP5 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2A2C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP8 DUP4 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2A45 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2A77 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x60 ADD MLOAD DUP2 PUSH1 0x2 DUP2 MLOAD DUP2 LT PUSH2 0x2AA9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP9 PUSH2 0x180 ADD MLOAD DUP5 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x2AC8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP9 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x2AE5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP9 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x2B17 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP5 PUSH1 0x40 ADD MLOAD DUP2 PUSH1 0x3 DUP2 MLOAD DUP2 LT PUSH2 0x1770 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL SWAP1 PUSH2 0x2097 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x51A1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B7A DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xF47261B PUSH1 0xE4 SHL EQ DUP1 PUSH2 0x2BAB JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x12B8BC9 PUSH1 0xE1 SHL EQ JUMPDEST DUP1 PUSH2 0x2BC6 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0xA7CB5FB7 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x2BE1 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x94CFCDD7 PUSH1 0xE0 SHL EQ JUMPDEST DUP1 PUSH2 0x2BFC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH4 0x619CE885 PUSH1 0xE1 SHL EQ JUMPDEST PUSH2 0x2C18 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x566A JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD SWAP1 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2C62 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x2C4F PUSH2 0x3B2A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2C47 JUMPI SWAP1 POP JUMPDEST POP SWAP4 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2C8F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2CBC JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x2D4C JUMPI PUSH2 0x2CF9 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2CD8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2CEC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2D6E JUMP JUMPDEST DUP8 MLOAD DUP9 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x2D07 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x2D1A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP8 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x2D2D JUMPI INVALID JUMPDEST SWAP4 ISZERO ISZERO PUSH1 0x20 SWAP5 DUP6 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 MSTORE MSTORE PUSH1 0x1 ADD PUSH2 0x2CC2 JUMP JUMPDEST POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH2 0x2D62 DUP5 DUP5 PUSH2 0x22F1 JUMP JUMPDEST SWAP2 POP PUSH2 0x853 DUP5 DUP5 PUSH2 0xB59 JUMP JUMPDEST PUSH2 0x2D76 PUSH2 0x3B2A JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH4 0x9D3FA4B9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x9D3FA4B9 SWAP1 PUSH2 0x2DAB SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x56B6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DD7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x2DFB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4883 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD PUSH4 0xA12DCC6F PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP6 POP SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xA12DCC6F SWAP1 PUSH2 0x2E34 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56C9 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x2E84 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x46E5 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 PUSH2 0x2E97 DUP3 DUP9 PUSH2 0x140 ADD MLOAD PUSH2 0x8B9 JUMP JUMPDEST PUSH1 0xA0 DUP9 ADD MLOAD PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x180 DUP11 ADD MLOAD PUSH2 0x140 DUP12 ADD MLOAD SWAP4 SWAP5 POP SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2EC6 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x363B AND JUMP JUMPDEST ISZERO PUSH2 0x2EF3 JUMPI PUSH2 0x2EEC DUP5 PUSH2 0x2EE6 DUP5 DUP14 PUSH1 0x80 ADD MLOAD PUSH2 0x3660 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP6 PUSH2 0x367C JUMP JUMPDEST SWAP1 POP PUSH2 0x2F4C JUMP JUMPDEST DUP2 PUSH2 0x2F07 JUMPI PUSH2 0x2EEC DUP5 DUP12 PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x367C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F18 DUP7 DUP13 PUSH2 0x180 ADD MLOAD PUSH2 0x8B9 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2F2B DUP7 DUP14 PUSH1 0x80 ADD MLOAD DUP8 PUSH2 0x367C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2F3A DUP4 DUP7 DUP9 PUSH2 0x367C JUMP JUMPDEST SWAP1 POP PUSH2 0x2F46 DUP3 DUP3 PUSH2 0x30EF JUMP JUMPDEST SWAP4 POP POP POP POP JUMPDEST PUSH2 0x2F6C PUSH2 0x2F66 DUP10 PUSH1 0x40 ADD MLOAD DUP6 PUSH2 0x369E SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP3 PUSH2 0x30EF JUMP JUMPDEST SWAP7 POP PUSH1 0x4 PUSH2 0x2F7F DUP12 DUP13 PUSH1 0x20 ADD MLOAD DUP11 PUSH2 0x150E JUMP JUMPDEST PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2F8A JUMPI INVALID JUMPDEST EQ PUSH2 0x2F96 JUMPI PUSH1 0x0 PUSH2 0x2F98 JUMP JUMPDEST DUP7 JUMPDEST SWAP7 POP POP POP POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2FB7 DUP5 PUSH2 0x772 PUSH2 0x36BD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2FD0 PUSH1 0x4 DUP7 MLOAD DUP8 PUSH2 0x302E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x899 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4BA5 JUMP JUMPDEST PUSH4 0xFDB6CA8D PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2FFB DUP4 PUSH1 0x0 PUSH2 0x3071 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND SWAP1 DUP4 AND EQ PUSH2 0x3029 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x5644 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x304C JUMPI PUSH2 0x304C PUSH2 0x3047 PUSH1 0x0 DUP6 DUP6 PUSH2 0x36C8 JUMP JUMPDEST PUSH2 0x36E7 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x3065 JUMPI PUSH2 0x3065 PUSH2 0x3047 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0x36C8 JUMP JUMPDEST POP DUP2 SWAP1 SUB SWAP2 ADD SWAP1 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3092 JUMPI PUSH2 0x3092 PUSH2 0x3047 PUSH1 0x3 DUP6 MLOAD DUP6 PUSH1 0x4 ADD PUSH2 0x36C8 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH2 0x30C6 JUMPI PUSH2 0x30C6 PUSH2 0x3047 PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x36C8 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC88 DUP4 DUP4 PUSH2 0x36EF JUMP JUMPDEST PUSH4 0x18E4B141 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x30FE JUMPI DUP2 PUSH2 0xC88 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4678472B PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0xB6555D6F PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0x24410CD3 PUSH1 0xE1 SHL SWAP1 JUMP JUMPDEST PUSH4 0x1B8388F7 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0xE94A7ED PUSH1 0xE4 SHL SWAP1 JUMP JUMPDEST PUSH4 0x4AD31275 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x3160 JUMPI PUSH2 0x3160 PUSH2 0x3047 PUSH1 0x0 DUP6 DUP6 PUSH2 0x36C8 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x3179 JUMPI PUSH2 0x3179 PUSH2 0x3047 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0x36C8 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x31A6 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0xC88 PUSH2 0x31B5 DUP3 PUSH2 0x3719 JUMP JUMPDEST DUP5 PUSH2 0x31BF DUP8 PUSH2 0x3719 JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x371F JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x60 PUSH2 0x31E3 PUSH1 0x4 DUP6 MLOAD DUP7 PUSH2 0x3147 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x91B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4590 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x3219 PUSH2 0x3A68 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3211 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP5 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP4 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3262 JUMPI POP POP DUP5 MLOAD SWAP1 SWAP2 POP PUSH2 0x328F SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x32A2 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4A57 JUMP JUMPDEST DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x32AF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x32C3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x32D7 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 MSTORE MSTORE SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CODESIZE DUP4 CODECOPY POP POP DUP6 MLOAD SWAP2 SWAP4 POP PUSH2 0x332C SWAP2 DUP7 SWAP2 POP PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3147 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x333F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4609 JUMP JUMPDEST DUP5 MLOAD DUP6 SWAP1 PUSH1 0x0 SWAP1 PUSH2 0x334C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP6 SWAP3 SWAP5 POP SWAP3 POP POP JUMP JUMPDEST PUSH3 0x8E3DB9 PUSH1 0xE5 SHL SWAP1 JUMP JUMPDEST PUSH2 0x3376 PUSH2 0x3AFB JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH2 0x3392 SWAP2 DUP7 SWAP2 PUSH2 0x37C4 JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xC0 DUP7 ADD MLOAD PUSH2 0x33A9 SWAP2 DUP7 SWAP2 PUSH2 0x37C4 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xE0 DUP7 ADD MLOAD PUSH2 0x33C3 SWAP2 DUP7 SWAP2 PUSH2 0x37C4 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x33D8 DUP3 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH4 0xB04FBDDD PUSH1 0xE0 SHL SWAP1 PUSH2 0x340B SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x503E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x5 SLOAD SWAP2 MLOAD SWAP1 SWAP3 POP PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x345D SWAP1 DUP5 SWAP1 PUSH2 0x4EF9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x349A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x349F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP PUSH2 0x34B6 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3071 AND JUMP JUMPDEST SWAP1 POP PUSH2 0x34C0 PUSH2 0x311B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x34FD JUMPI PUSH1 0x0 PUSH2 0x34DF DUP4 PUSH2 0x96A JUMP JUMPDEST POP SWAP2 POP POP PUSH1 0xFF DUP2 AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x34F2 JUMPI INVALID JUMPDEST SWAP5 POP POP POP POP POP PUSH2 0x17EC JUMP JUMPDEST PUSH2 0x3505 PUSH2 0x3105 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x3538 JUMPI PUSH1 0x0 PUSH2 0x3524 DUP4 PUSH2 0x8E1 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP PUSH1 0xFF DUP2 AND PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x34F2 JUMPI INVALID JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD KECCAK256 PUSH32 0xF43F26EA5A94B478394A975E856464913DC1A8A1CA70939D974AA7C238AA0CE0 EQ ISZERO PUSH2 0x3572 JUMPI PUSH1 0x4 SWAP4 POP POP POP POP PUSH2 0x17EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x805 SWAP1 PUSH2 0x55B9 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC88 DUP3 PUSH2 0x35F0 DUP6 PUSH2 0x3829 JUMP JUMPDEST PUSH2 0x38A4 JUMP JUMPDEST PUSH4 0x50AE0683 PUSH1 0xE1 SHL SWAP1 JUMP JUMPDEST PUSH4 0xFCB4463 PUSH1 0xE3 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC88 DUP3 PUSH2 0x35F0 DUP6 PUSH2 0x38C3 JUMP JUMPDEST PUSH4 0x5BD0428D PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0x20D11F61 PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH4 0x3D661461 PUSH1 0xE2 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0xC88 JUMPI POP POP DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 DUP3 MLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 EQ SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xC88 JUMPI PUSH2 0xC88 PUSH2 0x3047 PUSH1 0x0 DUP7 DUP7 PUSH2 0x397C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17EC DUP4 PUSH2 0x3692 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x399B AND JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x36B7 JUMPI PUSH2 0x36B7 PUSH2 0x3047 PUSH1 0x2 DUP6 DUP6 PUSH2 0x397C JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH4 0x1CA78ED9 PUSH1 0xE3 SHL SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xC53 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54C4 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3710 JUMPI PUSH2 0x3710 PUSH2 0x3047 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x36C8 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3749 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x3029 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x3756 JUMPI PUSH2 0x3029 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x3790 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x3788 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x376D JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x3029 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x37BB JUMPI DUP3 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x379F JUMP JUMPDEST DUP6 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37D1 DUP5 DUP5 DUP5 PUSH2 0x39C5 JUMP JUMPDEST ISZERO PUSH2 0x37E4 JUMPI PUSH2 0x37E4 PUSH2 0x3047 DUP6 DUP6 DUP6 PUSH2 0x3A2B JUMP JUMPDEST PUSH2 0x17EC DUP4 PUSH2 0x3692 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3807 JUMPI POP PUSH1 0x0 PUSH2 0x8DB JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3814 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xC88 JUMPI PUSH2 0xC88 PUSH2 0x3047 PUSH1 0x1 DUP7 DUP7 PUSH2 0x397C JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD PUSH1 0x60 SWAP8 DUP9 ADD MLOAD DUP7 MLOAD SWAP7 DUP6 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP3 MLOAD PUSH32 0xEC69816980A3A3CA4554410E60253953E9FF375BA4536A98ADFA15CC71541508 DUP2 MSTORE SWAP5 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x140 DUP2 ADD MLOAD PUSH2 0x160 DUP3 ADD MLOAD PUSH2 0x180 DUP4 ADD MLOAD PUSH2 0x1A0 DUP5 ADD MLOAD PUSH1 0x0 SWAP4 PUSH32 0xF80322EB8376AAFB64EADF8F0D7623F22130FD9491A221E902B713CB984A7534 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x20 DUP8 LT ISZERO PUSH2 0x390F JUMPI INVALID JUMPDEST PUSH1 0x1F NOT DUP8 ADD DUP1 MLOAD PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x160 DUP12 ADD DUP1 MLOAD PUSH2 0x180 DUP14 ADD DUP1 MLOAD PUSH2 0x1A0 DUP16 ADD DUP1 MLOAD SWAP14 DUP10 MSTORE DUP13 MLOAD PUSH1 0x20 SWAP14 DUP15 ADD KECCAK256 DUP8 MSTORE DUP12 MLOAD SWAP12 DUP14 ADD SWAP12 SWAP1 SWAP12 KECCAK256 DUP5 MSTORE DUP10 MLOAD SWAP10 DUP13 ADD SWAP10 SWAP1 SWAP10 KECCAK256 DUP2 MSTORE DUP8 MLOAD SWAP8 SWAP1 SWAP11 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP9 MSTORE PUSH2 0x1E0 DUP6 KECCAK256 SWAP4 SWAP1 SWAP5 MSTORE SWAP1 MSTORE SWAP2 SWAP1 MSTORE SWAP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xC53 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5455 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x39B1 JUMPI PUSH2 0x39B1 PUSH2 0x3047 PUSH1 0x3 DUP6 DUP6 PUSH2 0x397C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x39BC JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x39D7 JUMPI PUSH2 0x39D7 PUSH2 0x3047 PUSH2 0x3A4A JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x39E2 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x39EF JUMPI POP PUSH1 0x0 PUSH2 0xC88 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x39F9 JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x3A0E DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST PUSH2 0x3A20 DUP3 PUSH2 0x3E8 PUSH4 0xFFFFFFFF PUSH2 0x37F8 AND JUMP JUMPDEST LT ISZERO SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x339F3DE2 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xC53 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56EE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH4 0x29E460DF PUSH1 0xE2 SHL PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x8DB DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x8DB DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3B70 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B83 PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST PUSH2 0x5704 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3BA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DA3 JUMPI DUP2 CALLDATALOAD PUSH2 0x3BBA DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3BDC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3BEA PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3C12 DUP8 PUSH1 0x20 DUP5 MLOAD DUP10 ADD ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3BFA JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3C41 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C4F PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3C77 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3C5F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3C9C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3CAA PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3CD2 DUP8 PUSH1 0x20 DUP5 MLOAD DUP10 ADD ADD PUSH2 0x3FE0 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CBA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3CF7 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D05 PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3C27 JUMPI PUSH2 0x3D2D DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x3E92 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D15 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3D52 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3D60 PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3D81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DA3 JUMPI DUP2 MLOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D84 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3DB0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3DBE PUSH2 0x3B7E DUP3 PUSH2 0x572A JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3DDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DA3 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3DE2 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3E0E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3E1C PUSH2 0x3B7E DUP3 PUSH2 0x5749 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x3E33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3E5C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3E6A PUSH2 0x3B7E DUP3 PUSH2 0x5749 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x3E81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DA8 DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x576C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3EA5 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3EAE DUP2 PUSH2 0x5704 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3EBB DUP4 DUP4 PUSH2 0x3B4A JUMP JUMPDEST DUP2 MSTORE PUSH2 0x3ECA DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3EDC DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x3EEE DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x3F4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F5B DUP7 DUP4 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3F77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F83 DUP7 DUP4 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3F9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FAB DUP7 DUP4 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x3FC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FD4 DUP6 DUP3 DUP7 ADD PUSH2 0x3DFE JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3FF3 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3FFC DUP2 PUSH2 0x5704 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x4009 DUP4 DUP4 PUSH2 0x3B55 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x4018 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x402A DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x403C DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x409D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40A9 DUP7 DUP4 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x40C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40D1 DUP7 DUP4 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x40ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40F9 DUP7 DUP4 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4115 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FD4 DUP6 DUP3 DUP7 ADD PUSH2 0x3E4C JUMP JUMPDEST DUP1 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4144 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC88 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4161 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x416C DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x417D DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x419C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x41A7 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x41B8 DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x41DE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x41E9 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4204 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4210 DUP7 DUP3 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4236 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD PUSH2 0x4241 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x425D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4269 DUP9 DUP4 DUP10 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x427E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x428A DUP9 DUP4 DUP10 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x429F JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42AC DUP8 DUP3 DUP9 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x42CA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x42D5 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x42EF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3C31 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x431A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4325 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4340 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x434C DUP9 DUP4 DUP10 ADD PUSH2 0x3DA0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4361 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x436D DUP9 DUP4 DUP10 ADD PUSH2 0x3DA0 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4382 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42AC DUP8 DUP3 DUP9 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x43A1 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x43AC DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x43C6 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x43E6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x43F1 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x440B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4417 DUP7 DUP3 DUP8 ADD PUSH2 0x3DFE JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x443A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4445 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4464 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4479 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3B60 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4496 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x44AB JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3C8C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x44CB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x44E1 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x44ED DUP8 DUP4 DUP9 ADD PUSH2 0x3CE7 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4502 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x450E DUP8 DUP4 DUP9 ADD PUSH2 0x3B60 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4523 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3DA0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x454C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4562 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x456E DUP7 DUP4 DUP8 ADD PUSH2 0x3CE7 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4583 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3C31 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x45A4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x45BA JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x45C6 DUP8 DUP4 DUP9 ADD PUSH2 0x3C8C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x45DB JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x45E7 DUP8 DUP4 DUP9 ADD PUSH2 0x3D42 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x45FC JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3BCC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x461D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4633 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x463F DUP8 DUP4 DUP9 ADD PUSH2 0x3C8C JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD MLOAD SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x45FC JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x466D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4683 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x456E DUP7 DUP4 DUP8 ADD PUSH2 0x3DA0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46A1 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x46B7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x46C3 DUP7 DUP4 DUP8 ADD PUSH2 0x3D42 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x46D8 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3BCC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x46F6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xC88 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x471A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD PUSH2 0x472C DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD SWAP1 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x427E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x475A JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 SWAP1 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x477D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4799 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x47B9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD SWAP3 POP PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x47D6 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x47E2 DUP8 DUP4 DUP9 ADD PUSH2 0x3E4C JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x47F7 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4816 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x417D DUP2 PUSH2 0x57DC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x483A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x416C JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4862 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4877 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4894 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x489E PUSH1 0x60 PUSH2 0x5704 JUMP JUMPDEST PUSH2 0x48A8 DUP5 DUP5 PUSH2 0x4122 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48D9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x48EE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x17EC DUP5 DUP3 DUP6 ADD PUSH2 0x3FE0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x490E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4923 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x492F DUP7 DUP3 DUP8 ADD PUSH2 0x3E92 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4940 DUP2 PUSH2 0x57C7 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4963 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4979 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4985 DUP7 DUP4 DUP8 ADD PUSH2 0x3E92 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x499A JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x42FB DUP6 DUP3 DUP7 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x49BB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x49D0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x49DC DUP7 DUP3 DUP8 ADD PUSH2 0x3E92 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x49F4 DUP2 PUSH2 0x57C7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4A14 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4A2A JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4A36 DUP9 DUP4 DUP10 ADD PUSH2 0x3FE0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A4B JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4269 DUP9 DUP4 DUP10 ADD PUSH2 0x3FE0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4A6B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4A81 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4A8D DUP8 DUP4 DUP9 ADD PUSH2 0x3FE0 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD MLOAD SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x47F7 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4ABD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4AD3 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP7 ADD PUSH1 0xA0 DUP2 DUP10 SUB SLT ISZERO PUSH2 0x4AE5 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4AEF PUSH1 0xA0 PUSH2 0x5704 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4B16 DUP9 PUSH1 0x60 DUP4 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x4B2C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4B38 DUP10 DUP3 DUP5 ADD PUSH2 0x3DFE JUMP JUMPDEST PUSH1 0x80 DUP6 ADD MSTORE POP SWAP2 SWAP5 POP POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH2 0x4B57 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x3B4A JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4B71 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B8A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4B95 DUP2 PUSH2 0x57DC JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4BB9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x4BC4 DUP2 PUSH2 0x57DC JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x40 DUP7 ADD MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH2 0x49F4 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4BF1 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4BFB DUP7 DUP7 PUSH2 0x4122 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP3 POP PUSH1 0x40 DUP6 ADD MLOAD PUSH2 0x4C12 DUP2 PUSH2 0x57C7 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4C2D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x42AC DUP8 DUP3 DUP9 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4C4D JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4C57 DUP6 DUP6 PUSH2 0x4122 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD MLOAD SWAP2 POP PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4C78 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4530 DUP7 DUP3 DUP8 ADD PUSH2 0x3E4C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4C98 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4CA2 DUP6 DUP6 PUSH2 0x4122 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD MLOAD SWAP2 POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4CCF DUP4 DUP4 PUSH2 0x4DDC JUMP JUMPDEST POP POP PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD DUP3 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4D1E JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4CF7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD DUP1 DUP2 SWAP6 POP PUSH1 0x20 DUP4 MUL DUP2 ADD SWAP2 POP PUSH1 0x20 DUP6 ADD DUP5 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x4D73 JUMPI DUP3 DUP5 SUB DUP9 MSTORE PUSH2 0x4D5D DUP5 DUP4 MLOAD PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x20 SWAP9 DUP10 ADD SWAP9 SWAP1 SWAP5 POP SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4D45 JUMP JUMPDEST POP SWAP2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD DUP3 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4D1E JUMPI DUP2 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4D92 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x4DC8 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x576C JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0xFF AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 PUSH2 0x4E08 DUP5 DUP5 MLOAD PUSH2 0x4CD7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x4E1A PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x4CD7 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x4E2D PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x4CD7 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x4E40 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x4CD7 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP3 DUP3 DUP8 ADD MSTORE PUSH2 0x4E99 DUP4 DUP8 ADD DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x4EB6 DUP3 DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x180 DUP1 DUP5 ADD MLOAD DUP6 DUP4 SUB DUP3 DUP8 ADD MSTORE PUSH2 0x4ED2 DUP4 DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1A0 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x4EEF DUP3 DUP3 PUSH2 0x4DB0 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4F0B DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x576C JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x4F8B SWAP1 DUP4 ADD DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4F9D DUP2 DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x4FAF DUP2 DUP7 PUSH2 0x4DB0 JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP2 MSTORE PUSH1 0x60 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x4FDF SWAP1 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND DUP2 MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x5013 SWAP1 DUP4 ADD DUP7 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4F9D DUP2 DUP7 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x5051 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4D28 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x5063 DUP2 DUP8 PUSH2 0x4CE4 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x5075 DUP2 DUP8 PUSH2 0x4CE4 JUMP JUMPDEST SWAP2 POP POP DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x508A DUP2 DUP6 PUSH2 0x4D7F JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x50D7 JUMPI DUP4 MLOAD PUSH1 0x5 DUP2 LT PUSH2 0x50C3 JUMPI INVALID JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x50AF JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD PUSH1 0x60 DUP4 MSTORE DUP1 DUP7 MLOAD PUSH2 0x50F9 DUP2 DUP5 PUSH2 0x51F4 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP3 POP DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5127 JUMPI PUSH2 0x5116 DUP4 DUP6 MLOAD PUSH2 0x4CC3 JUMP JUMPDEST PUSH1 0x20 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x5103 JUMP JUMPDEST POP POP DUP4 DUP2 SUB PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x513B DUP2 DUP8 PUSH2 0x4D7F JUMP JUMPDEST SWAP2 POP POP DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP5 MLOAD PUSH2 0x5153 DUP2 DUP5 PUSH2 0x51F4 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP7 ADD SWAP3 POP DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5181 JUMPI PUSH2 0x5170 DUP4 DUP6 MLOAD PUSH2 0x4CB9 JUMP JUMPDEST PUSH1 0x20 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x515D JUMP JUMPDEST POP SWAP1 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xC88 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4D7F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x51B4 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x51C6 DUP2 DUP6 PUSH2 0x4D28 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x51E2 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x51C6 DUP2 DUP6 PUSH2 0x4D7F JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x5227 SWAP1 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x508A DUP2 DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x17EC PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x5279 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4EEF DUP2 DUP6 PUSH2 0x4DB0 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 DUP2 ADD PUSH2 0x529B DUP4 PUSH2 0x57BD JUMP JUMPDEST DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP7 AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x5314 SWAP1 DUP4 ADD DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x5326 DUP2 DUP7 PUSH2 0x4D7F JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x80 DUP6 ADD MSTORE PUSH2 0x1788 DUP2 DUP7 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP6 AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x536C SWAP1 DUP4 ADD DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x60 DUP4 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL DUP6 AND DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x53CA PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x4D7F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x4EEF DUP2 DUP6 PUSH2 0x4D28 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xC88 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x5402 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP4 SWAP1 SWAP5 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5438 DUP6 PUSH2 0x579C JUMP JUMPDEST DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x51C6 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5462 DUP6 PUSH2 0x57A9 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5483 DUP6 PUSH2 0x57B3 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x54AD DUP5 PUSH2 0x57A9 JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5462 DUP6 PUSH2 0x57B3 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x5462 JUMPI INVALID JUMPDEST PUSH1 0x20 DUP2 ADD PUSH1 0x5 DUP4 LT PUSH2 0x54E0 JUMPI INVALID JUMPDEST SWAP2 SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x54F1 DUP7 PUSH2 0x57BD JUMP JUMPDEST DUP6 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP4 ADD DUP2 SWAP1 MSTORE PUSH2 0x4EEF SWAP1 DUP4 ADD DUP5 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x54AD DUP5 PUSH2 0x579C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x553F PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x4DB0 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP3 SUB DUP2 DUP6 ADD MSTORE DUP2 DUP8 MLOAD DUP1 DUP5 MSTORE DUP3 DUP5 ADD SWAP2 POP DUP3 DUP4 DUP3 MUL DUP6 ADD ADD DUP4 DUP11 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x558D JUMPI PUSH1 0x1F NOT DUP8 DUP5 SUB ADD DUP6 MSTORE PUSH2 0x557B DUP4 DUP4 MLOAD PUSH2 0x4DF8 JUMP JUMPDEST SWAP5 DUP7 ADD SWAP5 SWAP3 POP SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x555F JUMP JUMPDEST POP POP DUP7 DUP2 SUB PUSH1 0x40 DUP9 ADD MSTORE PUSH2 0x55A1 DUP2 DUP11 PUSH2 0x4D7F JUMP JUMPDEST SWAP5 POP POP POP POP POP DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x508A DUP2 DUP6 PUSH2 0x4D28 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x554E4B4E4F574E5F52455455524E5F44415441 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x554E4B4E4F574E5F46554E4354494F4E5F53454C4543544F5200000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x15539253541311535153951151 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x2120A22FA9A2A622A1AA27A9 PUSH1 0xA1 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH14 0x15D493D391D7D41493D61657D251 PUSH1 0x92 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH2 0x56A0 DUP3 DUP7 PUSH2 0x4DDC JUMP JUMPDEST DUP4 PUSH1 0x60 DUP4 ADD MSTORE DUP3 ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xC88 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4DF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x56DC PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x4DF8 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x51C6 DUP2 DUP6 PUSH2 0x4DB0 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5722 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x573F JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x575E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5787 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x576F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x5796 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST PUSH1 0x4 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST PUSH1 0x3 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST PUSH1 0x7 DUP2 LT PUSH2 0x57A6 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x57A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x57A6 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 SELFBALANCE SWAP4 PUSH7 0x4DEE66DCABC4A7 LT 0xB9 SWAP1 BYTE OR 0xD3 SELFBALANCE LOG2 SELFDESTRUCT 0x1F 0xB8 0x4D CALLCODE PUSH7 0xB96A650F614B87 PUSH22 0x6C6578706572696D656E74616CF564736F6C63430005 0xF STOP BLOCKHASH ", - "sourceMap": "1167:1191:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1167:1191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4447:517:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18439:546:2;;;;;;;;;:::i;:::-;;;;;;;;;;13999:341;;;;;;;;;:::i;:::-;;;;;;;;;12108:666:27;;;;;;;;;:::i;:::-;;;;;;;;;;8405:391:5;;;;;;;;;:::i;:::-;;;;;;;;9295:486:27;;;;;;;;;:::i;:::-;;;;;;;;;;10033:439;;;;;;;;;:::i;8340:635::-;;;;;;;;;:::i;:::-;;;;;;;;;;3719:529;;;;;;;;;:::i;:::-;;;;;;;;;;;6106:525;;;;;;;;;:::i;:::-;;;;;;;;;25761:853:2;;;;;;;;;:::i;:::-;;13165:423;;;;;;;;;:::i;:::-;;;;;;;;16356:260;;;;;;;;;:::i;:::-;;;;;;;;24212:476;;;;;;;;;:::i;6902:494:27:-;;;;;;;;;:::i;:::-;;;;;;;;;;1261:5129:3;;;;;;;;;:::i;:::-;;;;;;;;;;;7626:424:27;;;;;;;;;:::i;:::-;;;;;;;;;2450:1343:4;;;;;;;;;:::i;:::-;;;;;;;;1912:444:0;;;;;;;;;:::i;2898:473:27:-;;;;;;;;;:::i;:::-;;;;;;;;;2599:4454:2;;;;;;;;;:::i;16923:461::-;;;;;;;;;:::i;1136:648:27:-;;;;;;;;;:::i;:::-;;;;;;;;;;;20712:1245:2;;;;;;;;;:::i;:::-;;;;;;;;;;;;1552:354:0;;;;;;;;;:::i;764:336:1:-;;;;;;;;;:::i;6590:665:4:-;;;;;;;;;:::i;:::-;;;;;;;;17728:334:2;;;;;;;;;:::i;2093:556:27:-;;;;;;;;;:::i;:::-;;;;;;;;;;;19520:494:2;;;;;;;;;:::i;23130:624::-;;;;;;;;;:::i;:::-;;;;;;;;;;11488:448:27;;;;;;;;;:::i;:::-;;;;;;;;;1039:42:11;;;:::i;25101:654:2:-;;;;;;;;;:::i;:::-;;;;;;;;;;;10682:565:27;;;;;;;;;:::i;:::-;;;;;;;;;7450:391:2;;;;;;;;;:::i;8493:4256::-;;;;;;;;;:::i;4235:1849:4:-;;;;;;;;;:::i;22280:354:2:-;;;;;;;;;:::i;15427:658::-;;;;;;;;;:::i;:::-;;;;;;;;6933:807:5;;;;;;;;;:::i;:::-;;;;;;;;;;14833:386:2;;;;;;;;;:::i;:::-;;;;;;;;;2197:3728:5;;;;;;;;;:::i;:::-;;;;;;;;;;5274:644:27;;;;;;;;;:::i;:::-;;;;;;;;;;4447:517;4559:17;4590:32;4647:79;4668:7;4677:48;:46;:48::i;:::-;4647:20;:79::i;:::-;4736:18;4816:43;4841:1;4844:7;:14;4816:7;:24;;:43;;;;;:::i;:::-;4792:107;;;;;;;;;;;;;;4764:135;;-1:-1:-1;4764:135:27;-1:-1:-1;4923:34:27;;;;;;;;;;;4909:48;;4447:517;;;;:::o;18439:546:2:-;18552:19;;;18674:23;:9;18552:19;18674:23;:20;:23;:::i;:::-;18659:38;-1:-1:-1;;;;;;;18729:59:2;;-1:-1:-1;;;18729:59:2;18708:120;;;;-1:-1:-1;;;18708:120:2;;;;;;;;;;;;;;;;;18854:25;:9;18876:2;18854:25;:21;:25;:::i;:::-;18839:40;-1:-1:-1;18899:25:2;:9;18921:2;18899:25;:21;:25;:::i;:::-;18439:546;;;;-1:-1:-1;;18439:546:2:o;13999:341::-;14132:15;14149:17;14192:35;14203:12;14217:9;14192:10;:35::i;:::-;14182:45;;14249:47;14272:12;14286:9;14249:22;:47::i;:::-;14237:59;-1:-1:-1;13999:341:2;;;;;:::o;12108:666:27:-;12223:55;12292:31;12337:29;12391:82;12412:7;12421:51;:49;:51::i;12391:82::-;12483:16;12596:43;12621:1;12624:7;:14;12596:7;:24;;:43;;;;;:::i;:::-;12572:116;;;;;;;;;;;;;;12509:179;;-1:-1:-1;12509:179:27;-1:-1:-1;12509:179:27;-1:-1:-1;12710:57:27;;;;;;;;;;;12698:69;;12108:666;;;;;;:::o;8405:391:5:-;8532:31;8580:15;8597:17;8618:57;8651:12;8665:9;8618:32;:57::i;:::-;8579:96;;;;8711:38;8730:7;8739:9;8711:18;:38::i;:::-;8685:64;-1:-1:-1;;;8405:391:5;;;;;:::o;9295:486:27:-;9414:17;9445:22;9481;9528:86;9549:7;9558:55;:53;:55::i;9528:86::-;9712:14;;9684:43;;9712:7;;9709:1;;9684:43;:24;:43;:::i;:::-;9660:114;;;;;;;;;;;;;;9624:150;;;;-1:-1:-1;9624:150:27;;-1:-1:-1;9295:486:27;-1:-1:-1;;9295:486:27:o;10033:439::-;10148:21;10183:22;10230:82;10251:7;10260:51;:49;:51::i;10230:82::-;10408:14;;10380:43;;10408:7;;10405:1;;10380:43;:24;:43;:::i;:::-;10356:109;;;;;;;;;;;;;;10322:143;;;;-1:-1:-1;10033:439:27;-1:-1:-1;;10033:439:27:o;8340:635::-;8459:60;8533:17;8564:22;8611:86;8632:7;8641:55;:53;:55::i;8611:86::-;8707:16;8794:43;8819:1;8822:7;:14;8794:7;:24;;:43;;;;;:::i;:::-;8770:114;;;;;;;;;;;;;;8733:151;;-1:-1:-1;8733:151:27;-1:-1:-1;8733:151:27;-1:-1:-1;8906:62:27;;;;;;;;;;3719:529;3835:12;3861:21;3896:22;3932;3979:83;4000:7;4009:52;:50;:52::i;3979:83::-;4170:14;;4142:43;;4170:7;;4167:1;;4142:43;:24;:43;:::i;:::-;4118:123;;;;;;;;;;;;;;4072:169;;;;-1:-1:-1;4072:169:27;-1:-1:-1;4072:169:27;;-1:-1:-1;3719:529:27;-1:-1:-1;;3719:529:27:o;6106:525::-;6211:46;6271:17;6313:72;6334:7;6343:41;:39;:41::i;6313:72::-;6395:16;6471:43;6496:1;6499:7;:14;6471:7;:24;;:43;;;;;:::i;:::-;6447:107;;;;;;;;;;;;;;6421:133;-1:-1:-1;6421:133:27;-1:-1:-1;6576:48:27;;;;;;;;;;;6564:60;;6106:525;;;;:::o;25761:853:2:-;25861:19;25883:23;:9;25861:19;25883:23;:20;:23;:::i;:::-;25861:45;-1:-1:-1;;;;;;;25921:58:2;;-1:-1:-1;;;25921:58:2;25917:691;;;25995:31;26016:9;25995:20;:31::i;:::-;;;25917:691;;;-1:-1:-1;;;;;;26047:59:2;;-1:-1:-1;;;26047:59:2;26043:565;;;26122:32;26144:9;26122:21;:32::i;:::-;;;;26043:565;;;-1:-1:-1;;;;;;26175:61:2;;-1:-1:-1;;;26175:61:2;26171:437;;;26252:33;26275:9;26252:22;:33::i;:::-;;;;;;26171:437;;;-1:-1:-1;;;;;;26306:58:2;;-1:-1:-1;;;26306:58:2;26302:306;;;26380:31;26401:9;26380:20;:31::i;26302:306::-;-1:-1:-1;;;;;;26432:58:2;;-1:-1:-1;;;26432:58:2;26428:180;;;26506:36;26532:9;26506:25;:36::i;:::-;;;;;26428:180;;;26573:24;;-1:-1:-1;;;26573:24:2;;;;;;;;26428:180;25761:853;;:::o;13165:423::-;13296:27;13339:14;13356:9;:16;13339:33;;13409:6;13395:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;13395:21:2;-1:-1:-1;13382:34:2;-1:-1:-1;13431:9:2;13426:129;13451:6;13446:1;:11;13426:129;;13494:50;13517:12;13531:9;13541:1;13531:12;;;;;;;;;;;;;;13494:22;:50::i;:::-;13478:10;13489:1;13478:13;;;;;;;;;;;;;;;;;:66;13459:3;;13426:129;;;-1:-1:-1;;13165:423:2;;;;:::o;16356:260::-;16503:80;;16453:22;;-1:-1:-1;;;16526:42:2;16503:80;;16570:12;;16503:80;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;16503:80:2;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;16503:80:2;;;179:29:-1;;;;160:49;;;16503:80:2;-1:-1:-1;16356:260:2;;;:::o;24212:476::-;24466:189;;24416:22;;-1:-1:-1;;;24502:42:2;24466:189;;24558:23;;24595:14;;24623:22;;24466:189;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;24466:189:2;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;24466:189:2;;;179:29:-1;;;;160:49;;;24466:189:2;-1:-1:-1;24212:476:2;;;;;;:::o;6902:494:27:-;7013:20;7047:26;7087:20;7132:78;7153:7;7162:47;:45;:47::i;7132:78::-;7323:14;;7295:43;;7323:7;;7320:1;;7295:43;:24;:43;:::i;:::-;7271:118;;;;;;;;;;;;;1261:5129:3;1385:26;;;;1571:23;1597:29;:15;1571:23;1597:29;:26;:29;:::i;:::-;1571:55;-1:-1:-1;;;;;;;1641:68:3;;-1:-1:-1;;;1641:68:3;1637:1988;;;1725:34;;;;;;;;;;;;;-1:-1:-1;;;1725:34:3;;;;;1637:1988;;;-1:-1:-1;;;;;;1780:66:3;;-1:-1:-1;;;1780:66:3;1776:1849;;;1862:32;;;;;;;;;;;;;-1:-1:-1;;;1862:32:3;;;;;1776:1849;;;-1:-1:-1;;;;;;1915:73:3;;-1:-1:-1;;;1915:73:3;1911:1714;;;2004:39;;;;;;;;;;;;;-1:-1:-1;;;2004:39:3;;;;;1911:1714;;;-1:-1:-1;;;;;;2064:72:3;;-1:-1:-1;;;2064:72:3;2060:1565;;;2152:38;;;;;;;;;;;;;-1:-1:-1;;;2152:38:3;;;;;2060:1565;;;-1:-1:-1;;;;;;2211:62:3;;-1:-1:-1;;;2211:62:3;2207:1418;;;2289:28;;;;;;;;;;;;;-1:-1:-1;;;2289:28:3;;;;;2207:1418;;;-1:-1:-1;;;;;;2338:60:3;;-1:-1:-1;;;2338:60:3;2334:1291;;;2414:26;;;;;;;;;;;;;-1:-1:-1;;;2414:26:3;;;;;2334:1291;;;-1:-1:-1;;;;;;2461:66:3;;-1:-1:-1;;;2461:66:3;2457:1168;;;2543:32;;;;;;;;;;;;;-1:-1:-1;;;2543:32:3;;;;;2457:1168;;;-1:-1:-1;;;;;;2596:73:3;;-1:-1:-1;;;2596:73:3;2592:1033;;;2685:39;;;;;;;;;;;;;-1:-1:-1;;;2685:39:3;;;;;2592:1033;;;-1:-1:-1;;;;;;2745:74:3;;-1:-1:-1;;;2745:74:3;2741:884;;;2835:40;;;;;;;;;;;;;;;;;;;2741:884;;;-1:-1:-1;;;;;;2896:76:3;;-1:-1:-1;;;2896:76:3;2892:733;;;2988:42;;;;;;;;;;;;;;;;;;;2892:733;;;-1:-1:-1;;;;;;3051:77:3;;-1:-1:-1;;;3051:77:3;3047:578;;;3144:43;;;;;;;;;;;;;;;;;;;3047:578;;;-1:-1:-1;;;;;;3208:62:3;;-1:-1:-1;;;3208:62:3;3204:421;;;3286:28;;;;;;;;;;;;;-1:-1:-1;;;3286:28:3;;;;;3204:421;;;-1:-1:-1;;;;;;3348:67:3;;-1:-1:-1;;;3348:67:3;;:152;;-1:-1:-1;;;;;;;3431:69:3;;-1:-1:-1;;;3431:69:3;3348:152;3331:294;;;3525:23;;-1:-1:-1;;;3525:23:3;;;;;;;;3331:294;3579:35;;-1:-1:-1;;;3579:35:3;;;;;;;;3331:294;-1:-1:-1;;;;;;3639:68:3;;-1:-1:-1;;;3639:68:3;3635:2749;;;3816:22;;3791:48;;3816:15;;3813:1;;3791:48;:21;:48;:::i;:::-;3780:80;;;;;;;;;;;;;;3898:16;;;3912:1;3898:16;;;;;;;;;3771:89;;-1:-1:-1;3898:16:3;-1:-1:-1;3941:14:3;;;3953:1;3941:14;;;;;;;;;3874:40;;-1:-1:-1;3941:14:3;;;;;;;;;;;;;;;;;;;;3928:27;;3635:2749;;;-1:-1:-1;;;;;;3989:72:3;;-1:-1:-1;;;3989:72:3;;:154;;-1:-1:-1;;;;;;;4077:66:3;;-1:-1:-1;;;4077:66:3;3989:154;:243;;;-1:-1:-1;;;;;;;4159:73:3;;-1:-1:-1;;;4159:73:3;3989:243;3972:2412;;;4303:46;4333:15;4303:29;:46::i;:::-;4257:92;;-1:-1:-1;4257:92:3;-1:-1:-1;4257:92:3;-1:-1:-1;3972:2412:3;;;-1:-1:-1;;;;;;4370:62:3;;-1:-1:-1;;;4370:62:3;4366:2018;;;4457:23;;;4478:1;4457:23;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;4542:22:3;;4448:32;;-1:-1:-1;4517:48:3;;4542:15;;4539:1;;4517:48;:21;:48;:::i;:::-;4506:78;;;;;;;;;;;;;;4494:6;4501:1;4494:9;;;;;;;;;;;;;:90;;;;4636:1;4622:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;;4665:14:3;;;4677:1;4665:14;;;;;;;;;4598:40;;-1:-1:-1;4665:14:3;;4366:2018;-1:-1:-1;;;;;;4713:66:3;;-1:-1:-1;;;4713:66:3;;:142;;-1:-1:-1;;;;;;;4795:60:3;;-1:-1:-1;;;4795:60:3;4713:142;4696:1688;;;4926:52;4962:15;4926:35;:52::i;4696:1688::-;-1:-1:-1;;;;;;5012:73:3;;-1:-1:-1;;;5012:73:3;;:163;;-1:-1:-1;;;;;;;5101:74:3;;-1:-1:-1;;;5101:74:3;5012:163;:255;;;-1:-1:-1;;;;;;;5191:76:3;;-1:-1:-1;;;5191:76:3;5012:255;:348;;;-1:-1:-1;;;;;;;5283:77:3;;-1:-1:-1;;;5283:77:3;5012:348;4995:1389;;;5431:47;5462:15;5431:30;:47::i;4995:1389::-;-1:-1:-1;;;;;;5499:62:3;;-1:-1:-1;;;5499:62:3;5495:889;;;5595:31;;:::i;:::-;5644:32;;:::i;:::-;5694:26;5738:27;5810:48;5832:1;5835:15;:22;5810:15;:21;;:48;;;;;:::i;:::-;5782:154;;;;;;;;;;;;;;5960:23;;;5981:1;5960:23;;;;;;;;;5577:359;;-1:-1:-1;5577:359:3;;-1:-1:-1;5577:359:3;;-1:-1:-1;5577:359:3;-1:-1:-1;5960:23:3;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5951:32;;6009:9;5997:6;6004:1;5997:9;;;;;;;;;;;;;:21;;;;6044:10;6032:6;6039:1;6032:9;;;;;;;;;;;;;;;;;:22;6093:16;;;6107:1;6093:16;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;6093:16:3;6069:40;;6150:9;:26;;;6123:21;6145:1;6123:24;;;;;;;;;;;;;:53;;;;;6217:10;:27;;;6190:21;6212:1;6190:24;;;;;;;;;;;;;;;;;:54;6272:14;;;6284:1;6272:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6259:27;;6316:13;6300:10;6311:1;6300:13;;;;;;;;;;;;;:29;;;;6359:14;6343:10;6354:1;6343:13;;;;;;;;;;;;;:30;;;;5495:889;;;;;1261:5129;;;;;;:::o;7626:424:27:-;7743:19;7764:25;7805:84;7826:7;7835:53;:51;:53::i;7805:84::-;7987:14;;7959:43;;7987:7;;7984:1;;7959:43;:24;:43;:::i;:::-;7935:108;;;;;;;;;;;;;2450:1343:4;2640:41;2697:45;;:::i;:::-;2745:170;2794:5;2813:20;2847:9;;;;;;;;;-1:-1:-1;;;;;2847:9:4;-1:-1:-1;;;;;2847:31:4;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2847:33:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2847:33:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2847:33:4;;;;;;;;;2894:11;2745:35;:170::i;:::-;2953:14;;;2965:1;2953:14;;;2926:24;2953:14;;;;;;2697:218;;-1:-1:-1;2926:24:4;;2953:14;;;;;;;;;;;;;;;;;-1:-1:-1;;3010:16:4;;;3024:1;3010:16;;;2977:30;3010:16;;;;;2926:41;;-1:-1:-1;3010:16:4;;;;;;;105:10:-1;3010:16:4;88:34:-1;-1:-1;;3067:16:4;;;3081:1;3067:16;;;3036:28;3067:16;;;;;2977:49;;-1:-1:-1;3067:16:4;;-1:-1:-1;3081:1:4;3067:16;;;;;105:10:-1;3067:16:4;88:34:-1;-1:-1;;3120:16:4;;;3134:1;3120:16;;;3093:24;3120:16;;;;;3036:47;;-1:-1:-1;3120:16:4;;-1:-1:-1;3134:1:4;3120:16;;;;;105:10:-1;3120:16:4;88:34:-1;136:17;;-1:-1;3120:16:4;3093:43;;3215:5;:20;;;3200:9;3210:1;3200:12;;;;;;;;;;;;;:35;;;;3264:5;:18;;;3245:13;3259:1;3245:16;;;;;;;;;;;;;:37;-1:-1:-1;;;;;3245:37:4;;;-1:-1:-1;;;;;3245:37:4;;;;;3309:12;3292:11;3304:1;3292:14;;;;;;;;;;;;;:29;-1:-1:-1;;;;;3292:29:4;;;-1:-1:-1;;;;;3292:29:4;;;;;3344:11;:34;;;3331:7;3339:1;3331:10;;;;;;;;;;;;;:47;;;;;3467:5;:23;;;3452:9;3462:1;3452:12;;;;;;;;;;;;;:38;;;;3519:5;:18;;;3500:13;3514:1;3500:16;;;;;;;;;;;;;:37;-1:-1:-1;;;;;3500:37:4;;;-1:-1:-1;;;;;3500:37:4;;;;;3564:5;:25;;;3547:11;3559:1;3547:14;;;;;;;;;;;;;:42;-1:-1:-1;;;;;3547:42:4;;;-1:-1:-1;;;;;3547:42:4;;;;;3612:11;:24;;;3599:7;3607:1;3599:10;;;;;;;;;;;;;:37;;;;;3654:132;3694:9;3717:13;3744:11;3769:7;3654:26;:132::i;:::-;3647:139;2450:1343;-1:-1:-1;;;;;;;;;2450:1343:4:o;1912:444:0:-;2109:23;2155:194;2206:11;2231:108;2258:28;;;;;;;;;;;;;-1:-1:-1;;;2258:28:0;;;2288:31;;;;;;;;;;;;;-1:-1:-1;;;2288:31:0;;;2321:7;2330:8;2231:26;:108::i;:::-;2155:37;:194::i;:::-;2148:201;1912:444;-1:-1:-1;;;;1912:444:0:o;2898:473:27:-;3028:21;3063:24;3112:97;3133:7;3142:66;:64;:66::i;3112:97::-;3307:14;;3279:43;;3307:7;;3304:1;;3279:43;:24;:43;:::i;:::-;3255:109;;;;;;;;;;;;;2599:4454:2;2710:15;;2804:23;:9;2710:15;2804:23;:20;:23;:::i;:::-;2782:45;-1:-1:-1;;;;;;;2842:58:2;;-1:-1:-1;;;2842:58:2;2838:4128;;;2955:20;2978:25;:9;3000:2;2978:25;:21;:25;:::i;:::-;3104:126;;2955:48;;-1:-1:-1;3075:26:2;;-1:-1:-1;;;3144:42:2;3104:126;;3204:12;;3104:126;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3104:126:2;;;;-1:-1:-1;;;;;3104:126:2;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;3104:126:2;3075:155;;3275:12;3289:23;3316:12;-1:-1:-1;;;;;3316:23:2;3340:13;3316:38;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3274:80:2;;;;3378:7;:34;;;;;3389:10;:17;3410:2;3389:23;3378:34;:66;;3443:1;3378:66;;;3415:25;:10;3438:1;3415:25;:22;:25;:::i;:::-;3368:76;;2838:4128;;;;;;;-1:-1:-1;;;;;;3465:59:2;;-1:-1:-1;;;3465:59:2;3461:3505;;;3590:20;3612:15;3631:32;3653:9;3631:21;:32::i;:::-;3761:120;;3587:76;;-1:-1:-1;3587:76:2;-1:-1:-1;3730:28:2;;-1:-1:-1;;;;3801:41:2;3761:120;;3587:76;;3761:120;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3761:120:2;;;;-1:-1:-1;;;;;3761:120:2;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;3761:120:2;3730:151;;3897:12;3911:23;3938:12;-1:-1:-1;;;;;3938:23:2;3962:15;3938:40;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3896:82:2;;;;3992:27;4023:7;:34;;;;;4034:10;:17;4055:2;4034:23;4023:34;4022:78;;4098:1;4022:78;;;4061:26;:10;4084:2;4061:26;:22;:26;:::i;:::-;3992:108;;4147:12;-1:-1:-1;;;;;4124:35:2;:19;-1:-1:-1;;;;;4124:35:2;;:43;;4166:1;4124:43;;;4162:1;4124:43;4114:53;;;;3461:3505;;;;;;;;;-1:-1:-1;;;;;;4188:61:2;;-1:-1:-1;;;4188:61:2;4184:2782;;;4344:20;4366:25;4393:28;4426:33;4449:9;4426:22;:33::i;:::-;-1:-1:-1;4491:15:2;;4341:118;;-1:-1:-1;4341:118:2;;-1:-1:-1;4341:118:2;-1:-1:-1;4491:15:2;-1:-1:-1;4474:14:2;4520:858;4545:6;4540:1;:11;4520:858;;4817:11;;4649:26;;-1:-1:-1;;;4722:39:2;4783:12;;4817:8;;4826:1;;4817:11;;;;;;;;;;;;4678:168;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4678:168:2;;;;-1:-1:-1;;;;;4678:168:2;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;4678:168:2;4649:197;;4899:12;4913:23;4940:12;-1:-1:-1;;;;;4940:23:2;4964:13;4940:38;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;4898:80:2;;;;4996:20;5019:7;:34;;;;;5030:10;:17;5051:2;5030:23;5019:34;:66;;5084:1;5019:66;;;5056:25;:10;5079:1;5056:25;:22;:25;:::i;:::-;4996:89;;5184:21;5223:11;5235:1;5223:14;;;;;;;;;;;;;;5208:12;:29;;;;;;5184:53;;5275:7;5259:13;:23;:39;;;-1:-1:-1;5286:12:2;;5259:39;5255:109;;;5332:13;5322:23;;5255:109;-1:-1:-1;;4553:3:2;;;;;-1:-1:-1;4520:858:2;;-1:-1:-1;;4520:858:2;;;4184:2782;;;;;;;-1:-1:-1;;;;;;5398:58:2;;-1:-1:-1;;;5398:58:2;5394:1572;;;5581:296;;5549:29;;-1:-1:-1;;;5621:45:2;5581:296;;5684:9;;5641:1;;;;;;5581:296;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;5581:296:2;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;5581:296:2;;;179:29:-1;;;;160:49;;;5965:26:2;;:55;;5581:296;;-1:-1:-1;;;;;;;;5965:26:2;;:55;;5581:296;;5965:55;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5947:73:2;;;6135:7;:26;;6160:1;6135:26;;;-1:-1:-1;;6135:26:2;6125:36;;5394:1572;;;;;-1:-1:-1;;;;;;6182:58:2;;-1:-1:-1;;;6182:58:2;6178:788;;;6318:29;6349:30;6383:31;6404:9;6383:20;:31::i;:::-;6446:22;;6315:99;;-1:-1:-1;6315:99:2;-1:-1:-1;6446:22:2;-1:-1:-1;6429:14:2;6482:474;6507:6;6502:1;:11;6482:474;;6595:20;6618:44;6629:12;6643:15;6659:1;6643:18;;;;;;;;;;;;;;6618:10;:44::i;:::-;6595:67;;6761:21;6800:12;6813:1;6800:15;;;;;;;;;;;;;;6785:12;:30;;;;;;6761:54;;6853:7;6837:13;:23;:39;;;-1:-1:-1;6864:12:2;;6837:39;6833:109;;;6910:13;6900:23;;6833:109;-1:-1:-1;;6515:3:2;;6482:474;;;;6178:788;;;;-1:-1:-1;2599:4454:2;;;;:::o;16923:461::-;17035:19;;17128:23;:9;17035:19;17128:23;:20;:23;:::i;:::-;17113:38;-1:-1:-1;;;;;;;17183:58:2;;-1:-1:-1;;;17183:58:2;17162:119;;;;-1:-1:-1;;;17162:119:2;;;;;;;;;17307:25;:9;17329:2;17307:25;:21;:25;:::i;:::-;17292:40;-1:-1:-1;16923:461:2;;;:::o;1136:648:27:-;1246:51;1311:12;1337:21;1372:22;1419:77;1440:7;1449:46;:44;:46::i;1419:77::-;1506:16;1603:43;1628:1;1631:7;:14;1603:7;:24;;:43;;;;;:::i;:::-;1579:123;;;;;;;;;;;;;;1532:170;;-1:-1:-1;1532:170:27;-1:-1:-1;1532:170:27;-1:-1:-1;1532:170:27;-1:-1:-1;1724:53:27;;;;;;;;;;;1712:65;;1136:648;;;;;;:::o;20712:1245:2:-;20826:19;;20893:25;;;21039:23;:9;20826:19;21039:23;:20;:23;:::i;:::-;21024:38;-1:-1:-1;;;;;;;21094:61:2;;-1:-1:-1;;;21094:61:2;21073:122;;;;-1:-1:-1;;;21073:122:2;;;;;;;;;-1:-1:-1;;;;21328:2:2;21313:18;;;21414:16;21527:18;;;21521:25;21647:18;;;21641:25;21768:18;;;21762:25;20712:1245;;21414:16;;21506:41;;;;;;21626;;;;;;21747;;;;20712:1245::o;1552:354:0:-;1683:17;1723:176;1762:5;1781:108;1808:28;;;;;;;;;;;;;-1:-1:-1;;;1808:28:0;;;1838:31;;;;;;;;;;;;;-1:-1:-1;;;1838:31:0;;;1871:7;1880:8;1781:26;:108::i;:::-;1723:25;:176::i;764:336:1:-;861:16;893:25;935:9;:16;921:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;921:31:1;-1:-1:-1;893:59:1;-1:-1:-1;967:9:1;962:107;987:9;:16;982:1;:21;962:107;;1038:9;1048:1;1038:12;;;;;;;;;;;;;;-1:-1:-1;;;;;1038:20:1;;1024:8;1033:1;1024:11;;;;;;;;;;;;;;;;;:34;1005:3;;962:107;;6590:665:4;6800:50;6866:14;6883:6;:13;6866:30;;6956:6;6929:34;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;6929:34:4;-1:-1:-1;6906:57:4;-1:-1:-1;6978:9:4;6973:239;6998:6;6993:1;:11;6973:239;;7051:150;7101:6;7108:1;7101:9;;;;;;;;;;;;;;7128:14;7143:1;7128:17;;;;;;;;;;;;;;7163:21;7185:1;7163:24;;;;;;;;;;;;;;7051:32;:150::i;:::-;7025:20;7046:1;7025:23;;;;;;;;;;;;;:176;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7006:3:4;;6973:239;;;-1:-1:-1;;6590:665:4;;;;;:::o;17728:334:2:-;17893:136;;17843:22;;-1:-1:-1;;;17929:43:2;17893:136;;17986:12;;18012:7;;17893:136;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;17893:136:2;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17893:136:2;;;179:29:-1;;;;160:49;;;17893:136:2;-1:-1:-1;17728:334:2;;;;:::o;2093:556:27:-;2210:32;2256:17;2287:22;2323;2370:84;2391:7;2400:53;:51;:53::i;2370:84::-;2573:14;;2545:43;;2573:7;;2570:1;;2545:43;:24;:43;:::i;:::-;2521:121;;;;;;;;;;;;;19520:494:2;19791:190;;19741:22;;-1:-1:-1;;;19827:45:2;19791:190;;19886:12;;19912:8;;19934:11;;19959:12;;19791:190;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;19791:190:2;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;19791:190:2;;;179:29:-1;;;;160:49;;;19791:190:2;-1:-1:-1;19520:494:2;;;;;;:::o;23130:624::-;23242:19;23275:24;;23383:23;:9;23242:19;23383:23;:20;:23;:::i;:::-;23368:38;-1:-1:-1;;;;;;;23438:58:2;;-1:-1:-1;;;23438:58:2;23417:119;;;;-1:-1:-1;;;23417:119:2;;;;;;;;;23653:16;;23634:36;;23653:9;;23650:1;;23634:36;:15;:36;:::i;:::-;23610:104;;;;;;;;;;;;;;23130:624;;23581:133;;-1:-1:-1;23130:624:2;-1:-1:-1;;23130:624:2:o;11488:448:27:-;11609:23;11646:22;11693:88;11714:7;11723:57;:55;:57::i;11693:88::-;11874:14;;11846:43;;11874:7;;11871:1;;11846:43;:24;:43;:::i;:::-;11822:107;;;;;;;;;;;;;1039:42:11;;;;:::o;25101:654:2:-;25218:19;;25296:27;25218:19;25407:23;:9;25218:19;25407:23;:20;:23;:::i;:::-;25392:38;-1:-1:-1;;;;;;;25462:58:2;;-1:-1:-1;;;25462:58:2;25441:119;;;;-1:-1:-1;;;25441:119:2;;;;;;;;;25682:16;;25663:36;;25682:9;;25679:1;;25663:36;:15;:36;:::i;:::-;25639:109;;;;;;;;;;;;;;25101:654;;25571:177;;-1:-1:-1;25571:177:2;;-1:-1:-1;25101:654:2;-1:-1:-1;;25101:654:2:o;10682:565:27:-;10794:53;10861:23;10909:79;10930:7;10939:48;:46;:48::i;10909:79::-;10998:16;11080:43;11105:1;11108:7;:14;11080:7;:24;;:43;;;;;:::i;:::-;11056:107;;;;;;;;;;;;;;11024:139;-1:-1:-1;11024:139:27;-1:-1:-1;11185:55:27;;;;;;;;;;7450:391:2;7569:25;7610:14;7627:9;:16;7610:33;;7678:6;7664:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7664:21:2;-1:-1:-1;7653:32:2;-1:-1:-1;7700:9:2;7695:115;7720:6;7715:1;:11;7695:115;;7761:38;7772:12;7786:9;7796:1;7786:12;;;;;;;7761:38;7747:8;7756:1;7747:11;;;;;;;;;;;;;;;;;:52;7728:3;;7695:115;;8493:4256;8616:17;;8712:23;:9;8616:17;8712:23;:20;:23;:::i;:::-;8690:45;-1:-1:-1;;;;;;;8750:58:2;;-1:-1:-1;;;8750:58:2;8746:840;;;8886:24;8912:30;8946:31;8967:9;8946:20;:31::i;:::-;9009:22;;8883:94;;-1:-1:-1;8883:94:2;-1:-1:-1;9009:22:2;-1:-1:-1;8992:14:2;9045:501;9070:6;9065:1;:11;9045:501;;9160:22;9185:56;9208:12;9222:15;9238:1;9222:18;;;;;;;9185:56;9160:81;;9342:23;9385:7;9393:1;9385:10;;;;;;;;;;;;;;9368:14;:27;;;;;;9342:53;;9435:9;9417:15;:27;:45;;;-1:-1:-1;9448:14:2;;9417:45;9413:119;;;9498:15;9486:27;;9413:119;-1:-1:-1;;9078:3:2;;9045:501;;;-1:-1:-1;9559:16:2;;-1:-1:-1;;;;9559:16:2;8746:840;-1:-1:-1;;;;;;9600:58:2;;-1:-1:-1;;;9600:58:2;9596:3058;;;9713:20;9736:25;:9;9758:2;9736:25;:21;:25;:::i;:::-;10014:20;;9884:164;;9713:48;;-1:-1:-1;9855:26:2;;-1:-1:-1;;;9924:42:2;9884:164;;9984:12;;-1:-1:-1;;;;;10014:20:2;;9884:164;;;;9596:3058;-1:-1:-1;;;;;;10287:59:2;;-1:-1:-1;;;10287:59:2;10283:2371;;;10412:20;10434:15;10453:32;10475:9;10453:21;:32::i;:::-;10761:21;;10623:173;;10409:76;;-1:-1:-1;10409:76:2;;-1:-1:-1;10587:33:2;;-1:-1:-1;;;;10663:50:2;10623:173;;10731:12;;-1:-1:-1;;;;;10761:21:2;;;;10623:173;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10623:173:2;;;;-1:-1:-1;;;;;10623:173:2;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;10623:173:2;10587:209;;10812:12;10826:23;10853:12;-1:-1:-1;;;;;10853:23:2;10877:20;10853:45;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;10811:87:2;;;;10986:7;10985:8;:35;;;;10997:10;:17;11018:2;10997:23;;10985:35;:69;;;-1:-1:-1;11024:25:2;:10;11047:1;11024:25;:22;:25;:::i;:::-;11053:1;11024:30;;10985:69;10981:718;;;11163:78;;11132:28;;-1:-1:-1;;;11186:45:2;11163:78;;11233:7;;11163:78;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11163:78:2;;;;-1:-1:-1;;;;;11163:78:2;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;11163:78:2;11132:109;;11283:12;-1:-1:-1;;;;;11283:23:2;11307:15;11283:40;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;11259:64:2;;-1:-1:-1;11259:64:2;-1:-1:-1;11259:64:2;11446:34;;;;;11457:10;:17;11478:2;11457:23;11446:34;:89;;;;-1:-1:-1;11514:21:2;;-1:-1:-1;;;;;11514:21:2;11484:26;:10;11507:2;11484:26;:22;:26;:::i;:::-;-1:-1:-1;;;;;11484:51:2;;11446:89;:97;;11542:1;11446:97;;;11538:1;11446:97;11434:109;;;;10981:718;;;;-1:-1:-1;;11660:24:2;;10283:2371;;;;;;;;-1:-1:-1;;;;;;11719:61:2;;-1:-1:-1;;;11719:61:2;11715:939;;;11840:20;11870:33;11893:9;11870:22;:33::i;:::-;-1:-1:-1;;12176:22:2;;12042:170;;11837:66;;-1:-1:-1;12006:33:2;;-1:-1:-1;;;;12082:46:2;12042:170;;-1:-1:-1;12146:12:2;;-1:-1:-1;;;;;12176:22:2;;12042:170;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12042:170:2;;;;-1:-1:-1;;;;;12042:170:2;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;12042:170:2;12006:206;;12259:12;12273:23;12300:12;-1:-1:-1;;;;;12300:23:2;12324:20;12300:45;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;12258:87:2;;;;12371:7;:34;;;;;12382:10;:17;12403:2;12382:23;12371:34;:68;;;;-1:-1:-1;12409:25:2;:10;12432:1;12409:25;:22;:25;:::i;:::-;12438:1;12409:30;12371:68;:87;;12457:1;12371:87;;;-1:-1:-1;;12359:99:2;;11715:939;;;;;;;-1:-1:-1;;;;;;12479:58:2;;-1:-1:-1;;;12479:58:2;12475:179;;;-1:-1:-1;;;1232:2:2;8493:4256;-1:-1:-1;;;8493:4256:2:o;4235:1849:4:-;4420:41;4477:45;;:::i;:::-;4525:170;4574:5;4593:20;4627:9;;;;;;;;;-1:-1:-1;;;;;4627:9:4;-1:-1:-1;;;;;4627:31:4;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;4525:170:4;4764:14;;;4776:1;4764:14;;;;;;;;;4477:218;;-1:-1:-1;4737:24:4;;4764:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;4821:16:4;;;4835:1;4821:16;;;;;;;;;4737:41;;-1:-1:-1;4788:30:4;;4821:16;;;;17:15:-1;;105:10;4821:16:4;88:34:-1;-1:-1;;4878:16:4;;;4892:1;4878:16;;;;;;;;;4788:49;;-1:-1:-1;4847:28:4;;4878:16;-1:-1:-1;4878:16:4;;;17:15:-1;;105:10;4878:16:4;88:34:-1;-1:-1;;4931:16:4;;;4945:1;4931:16;;;;;;;;;4847:47;;-1:-1:-1;4904:24:4;;4931:16;-1:-1:-1;4931:16:4;;;17:15:-1;;105:10;4931:16:4;88:34:-1;136:17;;-1:-1;4931:16:4;4904:43;;5026:5;:20;;;5011:9;5021:1;5011:12;;;;;;;;;;;;;:35;;;;5075:12;5056:13;5070:1;5056:16;;;;;;;;;;;;;:31;-1:-1:-1;;;;;5056:31:4;;;-1:-1:-1;;;;;5056:31:4;;;;;5114:5;:18;;;5097:11;5109:1;5097:14;;;;;;;;;;;;;:35;-1:-1:-1;;;;;5097:35:4;;;-1:-1:-1;;;;;5097:35:4;;;;;5155:20;5142:7;5150:1;5142:10;;;;;;;;;;;;;:33;;;;;5254:5;:20;;;5239:9;5249:1;5239:12;;;;;;;;;;;;;:35;;;;5303:5;:18;;;5284:13;5298:1;5284:16;;;;;;;;;;;;;:37;-1:-1:-1;;;;;5284:37:4;;;-1:-1:-1;;;;;5284:37:4;;;;;5348:12;5331:11;5343:1;5331:14;;;;;;;;;;;;;:29;-1:-1:-1;;;;;5331:29:4;;;-1:-1:-1;;;;;5331:29:4;;;;;5383:11;:34;;;5370:7;5378:1;5370:10;;;;;;;;;;;;;:47;;;;;5506:5;:23;;;5491:9;5501:1;5491:12;;;;;;;;;;;;;:38;;;;5558:12;5539:13;5553:1;5539:16;;;;;;;;;;;;;:31;-1:-1:-1;;;;;5539:31:4;;;-1:-1:-1;;;;;5539:31:4;;;;;5597:5;:25;;;5580:11;5592:1;5580:14;;;;;;;;;;;;;:42;-1:-1:-1;;;;;5580:42:4;;;-1:-1:-1;;;;;5580:42:4;;;;;5645:11;:24;;;5632:7;5640:1;5632:10;;;;;;;;;;;;;:37;;;;;5758:5;:23;;;5743:9;5753:1;5743:12;;;;;;;;;;;;;:38;;;;5810:5;:18;;;5791:13;5805:1;5791:16;;;;;;;;;;;;;:37;-1:-1:-1;;;;;5791:37:4;;;-1:-1:-1;;;;;5791:37:4;;;;;5855:5;:25;;;5838:11;5850:1;5838:14;;;;;;;;;;;;;:42;-1:-1:-1;;;;;5838:42:4;;;-1:-1:-1;;;;;5838:42:4;;;;;5903:11;:24;;;5890:7;5898:1;5890:10;;;;;;;22280:354:2;22463:138;;22413:22;;-1:-1:-1;;;22499:42:2;22463:138;;22555:7;;22576:15;;22463:138;;;;15427:658;15537:19;15596:23;:9;15537:19;15596:23;:20;:23;:::i;:::-;15581:38;-1:-1:-1;;;;;;;15651:58:2;;-1:-1:-1;;;15651:58:2;;:133;;-1:-1:-1;;;;;;;15725:59:2;;-1:-1:-1;;;15725:59:2;15651:133;:210;;;-1:-1:-1;;;;;;;15800:61:2;;-1:-1:-1;;;15800:61:2;15651:210;:284;;;-1:-1:-1;;;;;;;15877:58:2;;-1:-1:-1;;;15877:58:2;15651:284;:358;;;-1:-1:-1;;;;;;;15951:58:2;;-1:-1:-1;;;15951:58:2;15651:358;15630:419;;;;-1:-1:-1;;;15630:419:2;;;;;;;;;15427:658;;;:::o;6933:807:5:-;7069:38;7121:42;7177:30;7232:14;7249:6;:13;7232:30;;7310:6;7285:32;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7272:45;;7369:6;7355:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7355:21:5;;7327:49;;7416:6;7405:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7405:18:5;-1:-1:-1;7386:37:5;-1:-1:-1;7439:9:5;7434:225;7459:6;7454:1;:11;7434:225;;7555:93;7594:6;7601:1;7594:9;;;;;;;;;;;;;;7621:10;7632:1;7621:13;;;;;;;;;;;;;;7555:21;:93::i;:::-;7487:13;;:10;;7498:1;;7487:13;;;;;;;;;;;7502:25;7528:1;7502:28;;;;;;;;;;;;;7532:16;7549:1;7532:19;;;;;;;;7486:162;;;7532:19;;;;;;;;;;;7486:162;;;;;;;;7467:3;;7434:225;;;-1:-1:-1;;6933:807:5;;;;;:::o;14833:386:2:-;14975:25;15002:27;15056:41;15073:12;15087:9;15056:16;:41::i;:::-;15045:52;;15120:53;15149:12;15163:9;15120:28;:53::i;2197:3728:5:-;2326:35;;:::i;:::-;2517:9;;:29;;-1:-1:-1;;;2517:29:5;;2375:32;;;;-1:-1:-1;;;;;2517:9:5;;;;:22;;:29;;2540:5;;2517:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2517:29:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2517:29:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2517:29:5;;;;;;;;;2622:18;;2669:9;;:83;;-1:-1:-1;;;2669:83:5;;2505:41;;-1:-1:-1;2622:18:5;;-1:-1:-1;;;;;2669:9:5;;;;:31;;:83;;2622:5;;2733:9;;2669:83;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2669:83:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2669:83:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2669:83:5;;;;;;;;;2650:102;;2822:36;2861:62;2888:12;2902:5;:20;;;2861:26;:62::i;:::-;3032:22;;;;3083:14;;;;3374:23;;;;3346:20;;;;2822:101;;-1:-1:-1;3032:22:5;;3083:14;;3005:24;;3346:52;;;:27;:52;:::i;:::-;3342:1896;;;3604:181;3651:28;3697:40;3728:8;3697:5;:22;;;:30;;:40;;;;:::i;:::-;3755:16;3604:29;:181::i;:::-;3573:212;;3342:1896;;;3933:13;3929:1299;;3997:179;4048:28;4098:5;:22;;;4142:16;3997:29;:179::i;3929:1299::-;4504:39;4546:65;4573:12;4587:5;:23;;;4546:26;:65::i;:::-;4504:107;;4629:38;4670:179;4721:28;4771:5;:22;;;4815:16;4670:29;:179::i;:::-;4629:220;;4867:41;4911:168;4962:31;5015:8;5045:16;4911:29;:168::i;:::-;4867:212;;5128:85;5147:30;5179:33;5128:18;:85::i;:::-;5097:116;;3929:1299;;;;5409:147;5441:63;5466:9;:37;;;5441:16;:24;;:63;;;;:::i;:::-;5518:28;5409:18;:147::i;:::-;5382:174;-1:-1:-1;5774:40:5;5634:136;5685:5;5704;:18;;;5736:24;5634:37;:136::i;:::-;:180;;;;;;;;;:211;;5844:1;5634:211;;;5817:24;5634:211;5607:238;-1:-1:-1;;;;;;2197:3728:5;;;;;:::o;5274:644:27:-;5397:57;5468:17;5499:22;5546:90;5567:7;5576:59;:57;:59::i;5546:90::-;5646:16;5738:43;5763:1;5766:7;:14;5738:7;:24;;:43;;;;;:::i;:::-;5714:116;;;;;;;;;;;;;5387:146:12;-1:-1:-1;;;5387:146:12;:::o;12855:269:27:-;12967:21;12991:31;13011:7;13020:1;12991:19;:31::i;:::-;12967:55;-1:-1:-1;;;;;;;13053:26:27;;;;;;;13032:85;;;;-1:-1:-1;;;13032:85:27;;;;;;;;;12855:269;;;:::o;8062:1059:28:-;8207:19;8387:2;8380:4;:9;8376:261;;;8405:221;8427:198;8489:80;8587:4;8609:2;8427:44;:198::i;:::-;8405:21;:221::i;:::-;8655:1;:8;8650:2;:13;8646:271;;;8679:227;8701:204;8763:82;8863:2;8883:1;:8;8701:44;:204::i;8679:227::-;-1:-1:-1;9068:13:28;;;9028:12;;9053:29;;;9028:12;8062:1059::o;16814:871::-;16934:13;16978:5;16986:1;16978:9;16967:1;:8;:20;16963:290;;;17003:239;17025:216;17087:87;17192:1;:8;17218:5;17226:1;17218:9;17025:44;:216::i;17003:239::-;-1:-1:-1;17426:13:28;17329:2;17426:13;17420:20;-1:-1:-1;;;;;;17567:79:28;;16814:871::o;10753:1071::-;10874:14;10919:5;10927:2;10919:10;10908:1;:8;:21;10904:321;;;10945:269;10967:246;11029:89;11136:1;:8;11162:5;11170:2;11162:10;10967:44;:246::i;10945:269::-;-1:-1:-1;11726:13:28;11471:2;11726:13;11720:20;-1:-1:-1;;;;;11716:69:28;;10753:1071::o;15929:220::-;16050:14;16097:21;16109:1;16112:5;16097:11;:21::i;6977:152:12:-;-1:-1:-1;;;6977:152:12;:::o;1866:135:32:-;1951:7;1985:1;1981;:5;:13;;1993:1;1981:13;;;-1:-1:-1;1989:1:32;;1974:20;-1:-1:-1;1866:135:32:o;6331:161:12:-;-1:-1:-1;;;6331:161:12;:::o;6498:152::-;-1:-1:-1;;;6498:152:12;:::o;6164:161::-;-1:-1:-1;;;6164:161:12;:::o;5227:154::-;-1:-1:-1;;;5227:154:12;:::o;5714:131::-;-1:-1:-1;;;5714:131:12;:::o;5851:144::-;-1:-1:-1;;;5851:144:12;:::o;6475:1101:28:-;6609:19;6789:2;6782:4;:9;6778:261;;;6807:221;6829:198;6891:80;6989:4;7011:2;6829:44;:198::i;6807:221::-;7057:1;:8;7052:2;:13;7048:271;;;7081:227;7103:204;7165:82;7265:2;7285:1;:8;7103:44;:204::i;7081:227::-;7411:4;7406:2;:9;7396:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;7396:20:28;87:34:-1;135:17;;-1:-1;7396:20:28;;7387:29;;7426:120;7447:23;:6;:21;:23::i;:::-;7505:4;7484:18;:1;:16;:18::i;:::-;:25;7523:6;:13;7426:7;:120::i;7044:552:3:-;7171:30;7215:38;7267:25;7431:48;7453:1;7456:15;:22;7431:15;:21;;:48;;;;;:::i;:::-;7407:182;;;;;;;;;;;;;6396:642;6684:23;;;6705:1;6684:23;;;;;;;;;6529:30;;;;;;6684:23;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;6741:16:3;;;6755:1;6741:16;;;;;;;;;6675:32;;-1:-1:-1;6741:16:3;;;;;;105:10:-1;6741:16:3;88:34:-1;136:17;;-1:-1;;6780:14:3;;;6792:1;6780:14;;;;;;;;;6717:40;;-1:-1:-1;6780:14:3;;;;;;;;;;;;;;;;;-1:-1:-1;;6952:22:3;;6767:27;;-1:-1:-1;6927:48:3;;6952:15;;6949:1;;6927:48;:21;:48;:::i;:::-;6903:128;;;;;;;;;;;;;;6849:6;6856:1;6849:9;;;;;;;;;;;;;6860:21;6882:1;6860:24;;;;;;;;;;;;;6886:10;6897:1;6886:13;;;;;;;;;;;;;;;;;6848:183;;;;;;;;6396:642;;;;-1:-1:-1;6396:642:3:o;7602:604::-;7900:16;;;7914:1;7900:16;;;;;;;;;7730:30;;;;;;7900:16;;;;;;105:10:-1;7900:16:3;88:34:-1;-1:-1;;8068:22:3;;7876:40;;-1:-1:-1;8043:48:3;;8068:15;;-1:-1:-1;8065:1:3;;8043:48;:21;:48;:::i;:::-;8019:180;;;;;;;;;;;;;;7979:24;;:21;;8001:1;;7979:24;;;;;;;;;;;;;7970:229;;;;;;7602:604;;-1:-1:-1;7970:229:3;-1:-1:-1;;7602:604:3:o;6001:157:12:-;-1:-1:-1;;;6001:157:12;:::o;2505:1128:13:-;2730:30;;:::i;:::-;2825:34;;;:59;;;3014:22;;;;3050;;;;2931:151;;2862:22;;2931:33;:151::i;:::-;2894:188;;3202:22;;;;3238:14;;;;3119:143;;3166:22;;3119:33;:143::i;:::-;3092:24;;;:170;3382:22;;;;3418:14;;;;3299:143;;3346:22;;3299:33;:143::i;:::-;3272:24;;;:170;3558:39;:8;3575:21;3558:39;:16;:39;:::i;:::-;3528:27;;;:69;2505:1128;;;;;;:::o;7633:1783:4:-;8076:206;;7855:41;;8023:50;;-1:-1:-1;;;8112:64:4;8076:206;;8190:9;;8213:13;;8240:11;;8265:7;;8076:206;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;8076:206:4;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;8076:206:4;;;179:29:-1;;;;160:49;;;8372:9:4;;8364:62;;8076:206;;-1:-1:-1;8337:23:4;;-1:-1:-1;;;;;8372:9:4;;8364:62;;8076:206;;8364:62;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;8334:92:4;-1:-1:-1;8437:15:4;;-1:-1:-1;8455:24:4;8334:92;8437:15;8455:24;:21;:24;:::i;:::-;8437:42;;8505:55;:53;:55::i;:::-;-1:-1:-1;;;;;;8493:67:4;;;;;;8489:921;;;8661:27;8693:41;8723:10;8693:29;:41::i;:::-;-1:-1:-1;8658:76:4;-1:-1:-1;;8755:57:4;;;;;;;;;;;8748:64;;;;;;;;8489:921;8845:55;:53;:55::i;:::-;-1:-1:-1;;;;;;8833:67:4;;;;;;8829:581;;;8999:27;9033:41;9063:10;9033:29;:41::i;:::-;-1:-1:-1;8998:76:4;;-1:-1:-1;;9095:57:4;;;;;;;;;;8829:581;9173:21;;;;;;1718:66;9173:58;9169:241;;;9299:40;9292:47;;;;;;;9169:241;9370:29;;-1:-1:-1;;;9370:29:4;;;;;;;;1285:1263:30;1997:11;;1992:2;1982:13;;;1972:37;2069:14;;2051:16;;;2041:43;;;;2158:2;2152:9;;962:66;2213:26;;2259:15;;;2252:33;;;;2305:15;;;2298:36;;;;2366:2;2354:15;;2347:32;2411:3;2399:16;;2392:43;2505:3;2487:22;;;1285:1263::o;1921:441:17:-;2066:23;2207:116;2248:24;2286:27;:11;:25;:27::i;:::-;2207;:116::i;4875:184:12:-;-1:-1:-1;;;4875:184:12;:::o;4728:141::-;-1:-1:-1;;;4728:141:12;:::o;4703:315:16:-;4830:17;4875:110;4916:24;4954:21;:5;:19;:21::i;5065:156:12:-;-1:-1:-1;;;5065:156:12;:::o;6807:164::-;-1:-1:-1;;;6807:164:12;:::o;6656:145::-;-1:-1:-1;;;6656:145:12;:::o;10136:403:28:-;10257:10;10486:3;:10;10472:3;:10;:24;:60;;;;-1:-1:-1;;10518:14:28;;;;;;;10500;;;;;;;;;;:32;;10136:403::o;1335:383:32:-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;3189:300:14:-;3353:21;3406:46;3440:11;3406:25;:9;3424:6;3406:25;:17;:25;:::i;:::-;:33;:46;:33;:46;:::i;965:364:32:-;1051:7;1082:1;1078;:5;1074:227;;;1099:191;1121:168;1178:59;1255:1;1274;1121:39;:168::i;1099:191::-;-1:-1:-1;1317:5:32;;;965:364::o;5539:169:12:-;-1:-1:-1;;;5539:169:12;:::o;1292:378:29:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;1511:170:31;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;14133:679:28;14254:14;14299:5;14307:2;14299:10;14288:1;:8;:21;14284:297;;;14325:245;14347:222;14409:92;14519:1;:8;14545:5;14553:2;14545:10;14347:44;:222::i;14325:245::-;-1:-1:-1;14759:13:28;14661:2;14759:13;14753:20;;14133:679::o;1403:228::-;1582:2;1571:14;;1403:228::o;1870:4297::-;2020:2;2011:6;:11;2007:4154;;;2309:1;2299:6;2295:2;2291:15;2286:3;2282:25;2278:33;2360:4;2356:9;2347:6;2341:13;2337:29;2409:4;2402;2396:11;2392:22;2450:1;2447;2444:8;2438:4;2431:22;;;;2248:219;;;2571:4;2561:6;:14;2557:59;;;2595:7;;2557:59;3305:4;3296:6;:13;3292:2859;;;3631:2;3623:6;3619:15;3609:25;;3679:6;3671;3667:19;3729:6;3723:4;3719:17;4036:4;4030:11;4304:198;4322:4;4314:6;4311:16;4304:198;;;4370:13;;4357:27;;4431:2;4467:13;;;;4419:15;;;;4304:198;;;4571:18;;-1:-1:-1;3338:1269:28;;;4852:2;4844:6;4840:15;4830:25;;4900:6;4892;4888:19;4950:6;4944:4;4940:17;5260:6;5254:13;5839:191;5856:4;5850;5846:15;5839:191;;;5904:11;;5891:25;;-1:-1:-1;;5949:13:28;;;;5995;;;;5839:191;;;6100:19;;-1:-1:-1;;1870:4297:28;;;:::o;1141:603:14:-;1309:21;1350:110;1388:9;1415:11;1444:6;1350:20;:110::i;:::-;1346:289;;;1476:148;1498:125;1547:9;1574:11;1603:6;1498:31;:125::i;1476:148::-;1661:46;1695:11;1661:25;:9;1679:6;1661:25;:17;:25;:::i;122:448:32:-;208:7;235:6;231:45;;-1:-1:-1;264:1:32;257:8;;231:45;297:5;;;301:1;297;:5;:1;316:5;;;;;:10;312:234;;342:193;364:170;421:61;500:1;519;364:39;:170::i;2542:1786:17:-;2769:16;;;;;2810;;2868:33;;;;;2930:20;;;;;2749:17;2984:25;;;;3417:11;;3402:13;;;3392:37;;;;3497:9;;1160:66;3520:26;;3647:15;;;3640:29;;;;3757:15;;;3750:46;;;;3884:15;;;3877:33;;;;-1:-1:-1;;;;;4016:62:17;;;3998:16;;;3991:88;;;;4129:3;4117:16;;4110:34;4285:3;4267:22;;;2542:1786::o;2889:890:30:-;3318:2;3312:9;-1:-1:-1;;;3335:82:30;;3467:1;3455:14;;3448:40;;;;3585:2;3573:15;;3566:35;3737:2;3719:21;;;2889:890::o;5172:2665:16:-;5378:20;;;;5438;;;;5501:23;;;;5567;;;;5262:14;;1422:66;;5378:20;;5438;;6471:2;6461:13;;6458:2;;;6493:9;6458:2;-1:-1:-1;;6624:14:16;;6847:11;;6674:3;6663:15;;6884:11;;6714:3;6703:15;;6921:11;;6754:3;6743:15;;6958:11;;6794:3;6783:15;;6995:11;;7049:24;;;7134:21;;6635:2;7109:23;;;7099:57;7086:71;;7257:21;;7232:23;;;7222:57;;;;7209:71;;7383:24;;7355:26;;;7345:63;;;;7332:77;;7509:24;;7481:26;;;;7471:63;;;;7458:77;;7610:3;7594:20;;7651:19;;;;7683;;7715;;;7747;;7779;;;;7594:20;-1:-1:-1;5172:2665:16;;;:::o;731:322:33:-;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;576:383:32;662:7;689:6;685:223;;711:186;733:163;790:54;862:1;881;733:39;:163::i;711:186::-;917:9;933:1;929;:5;;;;;;;576:383;-1:-1:-1;;;;576:383:32:o;4566:1880:14:-;4729:12;4761:16;4757:109;;4793:62;4815:39;:37;:39::i;4793:62::-;5676:11;;;:29;;-1:-1:-1;5691:14:14;;5676:29;5672:72;;;-1:-1:-1;5728:5:14;5721:12;;5672:72;6239:17;6322:11;6259:84;;;;;6299:9;6279:6;6259:84;6239:104;-1:-1:-1;6390:25:14;:9;6408:6;6390:25;:17;:25;:::i;:::-;6363:23;:9;6381:4;6363:23;:17;:23;:::i;:::-;:52;;;4566:1880;-1:-1:-1;;;;;4566:1880:14:o;520:335:15:-;676:12;312:10;747:23;;784:9;807:11;832:6;711:137;;;;;;;;;;;372:142;485:22;;;;;;;;;;;;-1:-1:-1;;;485:22:15;;;;372:142;:::o;1167:1191:0:-;;;;;;;;;;-1:-1:-1;;;;;1167:1191:0;;;;;;-1:-1:-1;;;;;1167:1191:0;;;;;;-1:-1:-1;;;;;1167:1191:0;;;;;;-1:-1:-1;;;;;1167:1191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;1167:1191:0;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;458:707;;575:3;568:4;560:6;556:17;552:27;542:2;;-1:-1;;583:12;542:2;630:6;617:20;652:80;667:64;724:6;667:64;;;652:80;;;760:21;;;643:89;-1:-1;804:4;817:14;;;;792:17;;;906;;;897:27;;;;894:36;-1:-1;891:2;;;943:1;;933:12;891:2;968:1;953:206;978:6;975:1;972:13;953:206;;;85:6;72:20;97:33;124:5;97:33;;;1046:50;;1110:14;;;;1138;;;;1000:1;993:9;953:206;;1189:693;;1318:3;1311:4;1303:6;1299:17;1295:27;1285:2;;-1:-1;;1326:12;1285:2;1366:6;1360:13;1388:81;1403:65;1461:6;1403:65;;1388:81;1497:21;;;1379:90;-1:-1;1541:4;1554:14;;;;1529:17;;1649:1;1634:242;1659:6;1656:1;1653:13;1634:242;;;1759:53;1808:3;1541:4;1735:3;1729:10;1533:6;1717:23;;1759:53;;;1747:66;;1541:4;1827:14;;;;1855;;;;;1681:1;1674:9;1634:242;;;1638:14;;;;1278:604;;;;;1906:693;;2028:3;2021:4;2013:6;2009:17;2005:27;1995:2;;-1:-1;;2036:12;1995:2;2083:6;2070:20;2105:85;2120:69;2182:6;2120:69;;2105:85;2218:21;;;2096:94;-1:-1;2262:4;2275:14;;;;2250:17;;2370:1;2355:238;2380:6;2377:1;2374:13;2355:238;;;2487:42;2525:3;2262:4;2463:3;2450:17;2254:6;2438:30;;2487:42;;;2475:55;;2262:4;2544:14;;;;2572;;;;;2402:1;2395:9;2355:238;;2639:735;;2782:3;2775:4;2767:6;2763:17;2759:27;2749:2;;-1:-1;;2790:12;2749:2;2830:6;2824:13;2852:95;2867:79;2939:6;2867:79;;2852:95;2975:21;;;2843:104;-1:-1;3019:4;3032:14;;;;3007:17;;3127:1;3112:256;3137:6;3134:1;3131:13;3112:256;;;3237:67;3300:3;3019:4;3213:3;3207:10;3011:6;3195:23;;3237:67;;;3225:80;;3019:4;3319:14;;;;3347;;;;;3159:1;3152:9;3112:256;;3414:735;;3550:3;3543:4;3535:6;3531:17;3527:27;3517:2;;-1:-1;;3558:12;3517:2;3605:6;3592:20;3627:99;3642:83;3718:6;3642:83;;3627:99;3754:21;;;3618:108;-1:-1;3798:4;3811:14;;;;3786:17;;3906:1;3891:252;3916:6;3913:1;3910:13;3891:252;;;4023:56;4075:3;3798:4;3999:3;3986:17;3790:6;3974:30;;4023:56;;;4011:69;;3798:4;4094:14;;;;4122;;;;;3938:1;3931:9;3891:252;;4175:714;;4299:3;4292:4;4284:6;4280:17;4276:27;4266:2;;-1:-1;;4307:12;4266:2;4347:6;4341:13;4369:76;4384:60;4437:6;4384:60;;4369:76;4473:21;;;4360:85;-1:-1;4517:4;4530:14;;;;4505:17;;;4619;;;4610:27;;;;4607:36;-1:-1;4604:2;;;4656:1;;4646:12;4604:2;4681:1;4666:217;4691:6;4688:1;4685:13;4666:217;;;17937:13;;4759:61;;4834:14;;;;4862;;;;4713:1;4706:9;4666:217;;4915:707;;5032:3;5025:4;5017:6;5013:17;5009:27;4999:2;;-1:-1;;5040:12;4999:2;5087:6;5074:20;5109:80;5124:64;5181:6;5124:64;;5109:80;5217:21;;;5100:89;-1:-1;5261:4;5274:14;;;;5249:17;;;5363;;;5354:27;;;;5351:36;-1:-1;5348:2;;;5400:1;;5390:12;5348:2;5425:1;5410:206;5435:6;5432:1;5429:13;5410:206;;;17789:20;;5503:50;;5567:14;;;;5595;;;;5457:1;5450:9;5410:206;;6183:432;;6280:3;6273:4;6265:6;6261:17;6257:27;6247:2;;-1:-1;;6288:12;6247:2;6335:6;6322:20;6357:60;6372:44;6409:6;6372:44;;6357:60;6348:69;;6437:6;6430:5;6423:21;6541:3;6473:4;6532:6;6465;6523:16;;6520:25;6517:2;;;6558:1;;6548:12;6517:2;100716:6;6473:4;6465:6;6461:17;6473:4;6499:5;6495:16;100693:30;100772:1;100754:16;;;6473:4;100754:16;100747:27;6499:5;6240:375;-1:-1;;6240:375;6624:434;;6732:3;6725:4;6717:6;6713:17;6709:27;6699:2;;-1:-1;;6740:12;6699:2;6780:6;6774:13;6802:60;6817:44;6854:6;6817:44;;6802:60;6793:69;;6882:6;6875:5;6868:21;6986:3;6918:4;6977:6;6910;6968:16;;6965:25;6962:2;;;7003:1;;6993:12;6962:2;7013:39;7045:6;6918:4;6944:5;6940:16;6918:4;6910:6;6906:17;7013:39;;8272:2714;;8380:6;;8368:9;8363:3;8359:19;8355:32;8352:2;;;-1:-1;;8390:12;8352:2;8418:22;8380:6;8418:22;;;8409:31;;;8530:49;8575:3;8551:22;8530:49;;;8512:16;8505:75;8682:49;8727:3;8649:2;8707:9;8703:22;8682:49;;;8649:2;8668:5;8664:16;8657:75;8841:49;8886:3;8808:2;8866:9;8862:22;8841:49;;;8808:2;8827:5;8823:16;8816:75;8994:49;9039:3;8961:2;9019:9;9015:22;8994:49;;;8961:2;8980:5;8976:16;8969:75;9117:3;9176:9;9172:22;17789:20;9117:3;9137:5;9133:16;9126:75;9274:3;9333:9;9329:22;17789:20;9274:3;9294:5;9290:16;9283:75;9423:3;9482:9;9478:22;17789:20;9423:3;9443:5;9439:16;9432:75;9572:3;9631:9;9627:22;17789:20;9572:3;9592:5;9588:16;9581:75;9734:3;;9795:9;9791:22;17789:20;9734:3;9754:5;9750:18;9743:77;;9881:3;;9942:9;9938:22;17789:20;9881:3;9901:5;9897:18;9890:77;;10066:3;;10055:9;10051:19;10038:33;-1:-1;;;;;10091:18;10083:6;10080:30;10077:2;;;8498:1;;10113:12;10077:2;10160:54;10210:3;10201:6;10190:9;10186:22;10160:54;;;10066:3;10144:5;10140:18;10133:82;10314:3;;;;10303:9;10299:19;10286:33;10272:47;;10091:18;10331:6;10328:30;10325:2;;;8498:1;;10361:12;10325:2;10408:54;10458:3;10449:6;10438:9;10434:22;10408:54;;;10314:3;10392:5;10388:18;10381:82;10565:3;;;;10554:9;10550:19;10537:33;10523:47;;10091:18;10582:6;10579:30;10576:2;;;8498:1;;10612:12;10576:2;10659:54;10709:3;10700:6;10689:9;10685:22;10659:54;;;10565:3;10643:5;10639:18;10632:82;10816:3;;;;10805:9;10801:19;10788:33;10774:47;;10091:18;10833:6;10830:30;10827:2;;;8498:1;;10863:12;10827:2;;10910:54;10960:3;10951:6;10940:9;10936:22;10910:54;;;10816:3;10894:5;10890:18;10883:82;;;8346:2640;;;;;11021:2851;;11140:6;;11128:9;11123:3;11119:19;11115:32;11112:2;;;-1:-1;;11150:12;11112:2;11178:22;11140:6;11178:22;;;11169:31;;;11290:60;11346:3;11322:22;11290:60;;;11272:16;11265:86;11453:60;11509:3;11420:2;11489:9;11485:22;11453:60;;;11420:2;11439:5;11435:16;11428:86;11623:60;11679:3;11590:2;11659:9;11655:22;11623:60;;;11590:2;11609:5;11605:16;11598:86;11787:60;11843:3;11754:2;11823:9;11819:22;11787:60;;;11754:2;11773:5;11769:16;11762:86;11921:3;11991:9;11987:22;17937:13;11921:3;11941:5;11937:16;11930:86;12089:3;12159:9;12155:22;17937:13;12089:3;12109:5;12105:16;12098:86;12249:3;12319:9;12315:22;17937:13;12249:3;12269:5;12265:16;12258:86;12409:3;12479:9;12475:22;17937:13;12409:3;12429:5;12425:16;12418:86;12582:3;;12654:9;12650:22;17937:13;12582:3;12602:5;12598:18;12591:88;;12740:3;;12812:9;12808:22;17937:13;12740:3;12760:5;12756:18;12749:88;;12929:3;;12918:9;12914:19;12908:26;-1:-1;;;;;12954:18;12946:6;12943:30;12940:2;;;11258:1;;12976:12;12940:2;13023:65;13084:3;13075:6;13064:9;13060:22;13023:65;;;12929:3;13007:5;13003:18;12996:93;13181:3;;;;13170:9;13166:19;13160:26;13146:40;;12954:18;13198:6;13195:30;13192:2;;;11258:1;;13228:12;13192:2;13275:65;13336:3;13327:6;13316:9;13312:22;13275:65;;;13181:3;13259:5;13255:18;13248:93;13436:3;;;;13425:9;13421:19;13415:26;13401:40;;12954:18;13453:6;13450:30;13447:2;;;11258:1;;13483:12;13447:2;13530:65;13591:3;13582:6;13571:9;13567:22;13530:65;;;13436:3;13514:5;13510:18;13503:93;13691:3;;;;13680:9;13676:19;13670:26;13656:40;;12954:18;13708:6;13705:30;13702:2;;;11258:1;;13738:12;13702:2;;13785:65;13846:3;13837:6;13826:9;13822:22;13785:65;;18000:130;18076:13;;98856:4;98845:16;;103215:33;;103205:2;;103262:1;;103252:12;18137:241;;18241:2;18229:9;18220:7;18216:23;18212:32;18209:2;;;-1:-1;;18247:12;18209:2;85:6;72:20;97:33;124:5;97:33;;18385:431;;;18533:2;18521:9;18512:7;18508:23;18504:32;18501:2;;;-1:-1;;18539:12;18501:2;375:6;369:13;387:41;422:5;387:41;;;18710:2;18768:22;;369:13;18591:82;;-1:-1;387:41;369:13;387:41;;;18718:82;;;;18495:321;;;;;;18823:567;;;;18988:2;18976:9;18967:7;18963:23;18959:32;18956:2;;;-1:-1;;18994:12;18956:2;375:6;369:13;387:41;422:5;387:41;;;19165:2;19223:22;;369:13;19046:82;;-1:-1;387:41;369:13;387:41;;;19173:82;;;;19292:2;19346:9;19342:22;17937:13;19300:74;;18950:440;;;;;;19397:640;;;;19559:2;19547:9;19538:7;19534:23;19530:32;19527:2;;;-1:-1;;19565:12;19527:2;375:6;369:13;387:41;422:5;387:41;;;19757:2;19742:18;;19736:25;19617:82;;-1:-1;;;;;;19770:30;;19767:2;;;-1:-1;;19803:12;19767:2;19833:69;19894:7;19885:6;19874:9;19870:22;19833:69;;;19823:79;;;19939:2;19993:9;19989:22;5980:13;19947:74;;19521:516;;;;;;20044:955;;;;;20233:3;20221:9;20212:7;20208:23;20204:33;20201:2;;;-1:-1;;20240:12;20201:2;375:6;369:13;387:41;422:5;387:41;;;20432:2;20417:18;;20411:25;20292:82;;-1:-1;;;;;;20445:30;;;20442:2;;;-1:-1;;20478:12;20442:2;20508:69;20569:7;20560:6;20549:9;20545:22;20508:69;;;20498:79;;20635:2;20624:9;20620:18;20614:25;20600:39;;20456:18;20651:6;20648:30;20645:2;;;-1:-1;;20681:12;20645:2;20711:69;20772:7;20763:6;20752:9;20748:22;20711:69;;;20701:79;;20838:2;20827:9;20823:18;20817:25;20803:39;;20456:18;20854:6;20851:30;20848:2;;;-1:-1;;20884:12;20848:2;;20914:69;20975:7;20966:6;20955:9;20951:22;20914:69;;;20904:79;;;20195:804;;;;;;;;21006:512;;;21157:2;21145:9;21136:7;21132:23;21128:32;21125:2;;;-1:-1;;21163:12;21125:2;85:6;72:20;97:33;124:5;97:33;;;21215:63;-1:-1;21343:2;21328:18;;21315:32;-1:-1;;;;;21356:30;;21353:2;;;-1:-1;;21389:12;21353:2;21419:83;21494:7;21485:6;21474:9;21470:22;21419:83;;;21409:93;;;21119:399;;;;;;21525:993;;;;;21739:3;21727:9;21718:7;21714:23;21710:33;21707:2;;;-1:-1;;21746:12;21707:2;85:6;72:20;97:33;124:5;97:33;;;21798:63;-1:-1;21926:2;21911:18;;21898:32;-1:-1;;;;;21939:30;;;21936:2;;;-1:-1;;21972:12;21936:2;22002:78;22072:7;22063:6;22052:9;22048:22;22002:78;;;21992:88;;22145:2;22134:9;22130:18;22117:32;22103:46;;21950:18;22161:6;22158:30;22155:2;;;-1:-1;;22191:12;22155:2;22221:78;22291:7;22282:6;22271:9;22267:22;22221:78;;;22211:88;;22364:2;22353:9;22349:18;22336:32;22322:46;;21950:18;22380:6;22377:30;22374:2;;;-1:-1;;22410:12;22374:2;;22440:62;22494:7;22485:6;22474:9;22470:22;22440:62;;22525:470;;;22655:2;22643:9;22634:7;22630:23;22626:32;22623:2;;;-1:-1;;22661:12;22623:2;85:6;72:20;97:33;124:5;97:33;;;22713:63;-1:-1;22841:2;22826:18;;22813:32;-1:-1;;;;;22854:30;;22851:2;;;-1:-1;;22887:12;22851:2;22917:62;22971:7;22962:6;22951:9;22947:22;22917:62;;23002:595;;;;23149:2;23137:9;23128:7;23124:23;23120:32;23117:2;;;-1:-1;;23155:12;23117:2;85:6;72:20;97:33;124:5;97:33;;;23207:63;-1:-1;23335:2;23320:18;;23307:32;-1:-1;;;;;23348:30;;23345:2;;;-1:-1;;23381:12;23345:2;23411:62;23465:7;23456:6;23445:9;23441:22;23411:62;;;23401:72;;;23510:2;23553:9;23549:22;5832:20;23518:63;;23111:486;;;;;;23604:366;;;23725:2;23713:9;23704:7;23700:23;23696:32;23693:2;;;-1:-1;;23731:12;23693:2;85:6;72:20;97:33;124:5;97:33;;;23783:63;23883:2;23922:22;;;;17789:20;;-1:-1;;;23687:283;23977:377;;24106:2;24094:9;24085:7;24081:23;24077:32;24074:2;;;-1:-1;;24112:12;24074:2;24170:17;24157:31;-1:-1;;;;;24200:6;24197:30;24194:2;;;-1:-1;;24230:12;24194:2;24260:78;24330:7;24321:6;24310:9;24306:22;24260:78;;24361:422;;24516:2;24504:9;24495:7;24491:23;24487:32;24484:2;;;-1:-1;;24522:12;24484:2;24573:17;24567:24;-1:-1;;;;;24603:6;24600:30;24597:2;;;-1:-1;;24633:12;24597:2;24663:104;24759:7;24750:6;24739:9;24735:22;24663:104;;24790:937;;;;25022:2;25010:9;25001:7;24997:23;24993:32;24990:2;;;-1:-1;;25028:12;24990:2;25086:17;25073:31;-1:-1;;;;;25124:18;25116:6;25113:30;25110:2;;;-1:-1;;25146:12;25110:2;25176:97;25265:7;25256:6;25245:9;25241:22;25176:97;;;25166:107;;25338:2;25327:9;25323:18;25310:32;25296:46;;25124:18;25354:6;25351:30;25348:2;;;-1:-1;;25384:12;25348:2;25414:78;25484:7;25475:6;25464:9;25460:22;25414:78;;;25404:88;;25557:2;25546:9;25542:18;25529:32;25515:46;;25124:18;25573:6;25570:30;25567:2;;;-1:-1;;25603:12;25567:2;;25633:78;25703:7;25694:6;25683:9;25679:22;25633:78;;;25623:88;;;24984:743;;;;;;25734:686;;;25929:2;25917:9;25908:7;25904:23;25900:32;25897:2;;;-1:-1;;25935:12;25897:2;25993:17;25980:31;-1:-1;;;;;26031:18;26023:6;26020:30;26017:2;;;-1:-1;;26053:12;26017:2;26083:97;26172:7;26163:6;26152:9;26148:22;26083:97;;;26073:107;;26245:2;26234:9;26230:18;26217:32;26203:46;;26031:18;26261:6;26258:30;26255:2;;;-1:-1;;26291:12;26255:2;;26321:83;26396:7;26387:6;26376:9;26372:22;26321:83;;26427:946;;;;26663:2;26651:9;26642:7;26638:23;26634:32;26631:2;;;-1:-1;;26669:12;26631:2;26720:17;26714:24;-1:-1;;;;;26758:18;26750:6;26747:30;26744:2;;;-1:-1;;26780:12;26744:2;26810:104;26906:7;26897:6;26886:9;26882:22;26810:104;;;26800:114;;26972:2;26961:9;26957:18;26951:25;26937:39;;26758:18;26988:6;26985:30;26982:2;;;-1:-1;;27018:12;26982:2;27048:85;27125:7;27116:6;27105:9;27101:22;27048:85;;;27038:95;;27191:2;27180:9;27176:18;27170:25;27156:39;;26758:18;27207:6;27204:30;27201:2;;;-1:-1;;27237:12;27201:2;;27267:90;27349:7;27340:6;27329:9;27325:22;27267:90;;27380:825;;;;27595:2;27583:9;27574:7;27570:23;27566:32;27563:2;;;-1:-1;;27601:12;27563:2;27652:17;27646:24;-1:-1;;;;;27690:18;27682:6;27679:30;27676:2;;;-1:-1;;27712:12;27676:2;27742:104;27838:7;27829:6;27818:9;27814:22;27742:104;;;27732:114;;27883:2;27937:9;27933:22;17937:13;27891:74;;28023:2;28012:9;28008:18;28002:25;27988:39;;27690:18;28039:6;28036:30;28033:2;;;-1:-1;;28069:12;28212:648;;;28388:2;28376:9;28367:7;28363:23;28359:32;28356:2;;;-1:-1;;28394:12;28356:2;28452:17;28439:31;-1:-1;;;;;28490:18;28482:6;28479:30;28476:2;;;-1:-1;;28512:12;28476:2;28542:78;28612:7;28603:6;28592:9;28588:22;28542:78;;28867:651;;;29046:2;29034:9;29025:7;29021:23;29017:32;29014:2;;;-1:-1;;29052:12;29014:2;29103:17;29097:24;-1:-1;;;;;29141:18;29133:6;29130:30;29127:2;;;-1:-1;;29163:12;29127:2;29193:85;29270:7;29261:6;29250:9;29246:22;29193:85;;;29183:95;;29336:2;29325:9;29321:18;29315:25;29301:39;;29141:18;29352:6;29349:30;29346:2;;;-1:-1;;29382:12;29346:2;;29412:90;29494:7;29485:6;29474:9;29470:22;29412:90;;29525:257;;29637:2;29625:9;29616:7;29612:23;29608:32;29605:2;;;-1:-1;;29643:12;29605:2;5711:6;5705:13;102751:5;96680:13;96673:21;102729:5;102726:32;102716:2;;-1:-1;;102762:12;29789:866;;;;;29973:3;29961:9;29952:7;29948:23;29944:33;29941:2;;;-1:-1;;29980:12;29941:2;5986:6;5980:13;30032:74;;30143:2;30205:9;30201:22;369:13;387:41;422:5;387:41;;;30291:2;30276:18;;30270:25;30151:82;;-1:-1;;;;;;30304:30;;;30301:2;;;-1:-1;;30337:12;30662:399;;;30794:2;30782:9;30773:7;30769:23;30765:32;30762:2;;;-1:-1;;30800:12;30762:2;-1:-1;;5980:13;;30963:2;31013:22;;;5980:13;;;;;-1:-1;30756:305;31068:488;;;31205:2;31193:9;31184:7;31180:23;31176:32;31173:2;;;-1:-1;;31211:12;31173:2;5986:6;5980:13;31263:74;;31395:2;31384:9;31380:18;31374:25;-1:-1;;;;;31411:6;31408:30;31405:2;;;-1:-1;;31441:12;31405:2;31471:69;31532:7;31523:6;31512:9;31508:22;31471:69;;31563:713;;;;31722:2;31710:9;31701:7;31697:23;31693:32;31690:2;;;-1:-1;;31728:12;31690:2;5986:6;5980:13;31780:74;;31912:2;31901:9;31897:18;31891:25;-1:-1;;;;;31936:18;31928:6;31925:30;31922:2;;;-1:-1;;31958:12;31922:2;31988:69;32049:7;32040:6;32029:9;32025:22;31988:69;;;31978:79;;32115:2;32104:9;32100:18;32094:25;32080:39;;31936:18;32131:6;32128:30;32125:2;;;-1:-1;;32161:12;32125:2;;32191:69;32252:7;32243:6;32232:9;32228:22;32191:69;;32283:395;;;32413:2;32401:9;32392:7;32388:23;32384:32;32381:2;;;-1:-1;;32419:12;32381:2;5986:6;5980:13;32471:74;;32582:2;32634:9;32630:22;18076:13;18094:31;18119:5;18094:31;;32685:413;;;32824:2;32812:9;32803:7;32799:23;32795:32;32792:2;;;-1:-1;;32830:12;32792:2;6120:13;;-1:-1;;;;;;96846:78;;102970:34;;102960:2;;-1:-1;;103008:12;33105:345;;33218:2;33206:9;33197:7;33193:23;33189:32;33186:2;;;-1:-1;;33224:12;33186:2;33282:17;33269:31;-1:-1;;;;;33312:6;33309:30;33306:2;;;-1:-1;;33342:12;33306:2;33372:62;33426:7;33417:6;33406:9;33402:22;33372:62;;33457:317;;33599:2;33587:9;33578:7;33574:23;33570:32;33567:2;;;-1:-1;;33605:12;33567:2;7710:20;33599:2;7710:20;;;7819:58;7873:3;7849:22;7819:58;;;7801:16;7794:84;7944:2;8013:9;8009:22;5980:13;7944:2;7963:5;7959:16;7952:86;8122:2;8191:9;8187:22;17937:13;8122:2;8141:5;8137:16;8130:86;33657:101;;;;33561:213;;;;;33781:380;;33915:2;33903:9;33894:7;33890:23;33886:32;33883:2;;;-1:-1;;33921:12;33883:2;33972:17;33966:24;-1:-1;;;;;34002:6;33999:30;33996:2;;;-1:-1;;34032:12;33996:2;34062:83;34137:7;34128:6;34117:9;34113:22;34062:83;;34168:623;;;;34329:2;34317:9;34308:7;34304:23;34300:32;34297:2;;;-1:-1;;34335:12;34297:2;34393:17;34380:31;-1:-1;;;;;34423:6;34420:30;34417:2;;;-1:-1;;34453:12;34417:2;34483:76;34551:7;34542:6;34531:9;34527:22;34483:76;;;34473:86;;;34596:2;34639:9;34635:22;72:20;97:33;124:5;97:33;;;34291:500;;34604:63;;-1:-1;;;34704:2;34743:22;;;;17789:20;;34291:500;34798:602;;;34951:2;34939:9;34930:7;34926:23;34922:32;34919:2;;;-1:-1;;34957:12;34919:2;35015:17;35002:31;-1:-1;;;;;35053:18;35045:6;35042:30;35039:2;;;-1:-1;;35075:12;35039:2;35105:76;35173:7;35164:6;35153:9;35149:22;35105:76;;;35095:86;;35246:2;35235:9;35231:18;35218:32;35204:46;;35053:18;35262:6;35259:30;35256:2;;;-1:-1;;35292:12;35256:2;;35322:62;35376:7;35367:6;35356:9;35352:22;35322:62;;35407:623;;;;35568:2;35556:9;35547:7;35543:23;35539:32;35536:2;;;-1:-1;;35574:12;35536:2;35632:17;35619:31;-1:-1;;;;;35662:6;35659:30;35656:2;;;-1:-1;;35692:12;35656:2;35722:76;35790:7;35781:6;35770:9;35766:22;35722:76;;;35712:86;;;35835:2;35878:9;35874:22;17789:20;35843:63;;35943:2;35986:9;35982:22;72:20;97:33;124:5;97:33;;;35951:63;;;;35530:500;;;;;;36037:1084;;;;;36251:3;36239:9;36230:7;36226:23;36222:33;36219:2;;;-1:-1;;36258:12;36219:2;36309:17;36303:24;-1:-1;;;;;36347:18;36339:6;36336:30;36333:2;;;-1:-1;;36369:12;36333:2;36399:83;36474:7;36465:6;36454:9;36450:22;36399:83;;;36389:93;;36540:2;36529:9;36525:18;36519:25;36505:39;;36347:18;36556:6;36553:30;36550:2;;;-1:-1;;36586:12;36550:2;36616:83;36691:7;36682:6;36671:9;36667:22;36616:83;;37128:741;;;;37301:2;37289:9;37280:7;37276:23;37272:32;37269:2;;;-1:-1;;37307:12;37269:2;37358:17;37352:24;-1:-1;;;;;37396:18;37388:6;37385:30;37382:2;;;-1:-1;;37418:12;37382:2;37448:83;37523:7;37514:6;37503:9;37499:22;37448:83;;;37438:93;;37568:2;37622:9;37618:22;17937:13;37576:74;;37708:2;37697:9;37693:18;37687:25;37673:39;;37396:18;37724:6;37721:30;37718:2;;;-1:-1;;37754:12;37876:647;;;;38049:2;38037:9;38028:7;38024:23;38020:32;38017:2;;;-1:-1;;38055:12;38017:2;38113:17;38100:31;-1:-1;;;;;38151:18;38143:6;38140:30;38137:2;;;-1:-1;;38173:12;38137:2;38274:6;38263:9;38259:22;16808:4;16796:9;16791:3;16787:19;16783:30;16780:2;;;-1:-1;;16816:12;16780:2;16844:20;16808:4;16844:20;;;16835:29;;16967:22;17789:20;16928:16;16921:75;17074:2;17132:9;17128:22;17789:20;17074:2;17093:5;17089:16;17082:75;17222:2;17280:9;17276:22;17789:20;17222:2;17241:5;17237:16;17230:75;17408:49;17453:3;38049:2;17433:9;17429:22;17408:49;;;38049:2;17394:5;17390:16;17383:75;17547:3;17536:9;17532:19;17519:33;38151:18;17564:6;17561:30;17558:2;;;-1:-1;;17594:12;17558:2;17639:54;17689:3;17680:6;17669:9;17665:22;17639:54;;;17547:3;17621:16;;17614:80;-1:-1;17625:5;;-1:-1;;;17074:2;38367:22;;17789:20;;-1:-1;38454:53;38499:7;17222:2;38475:22;;38454:53;;;38444:63;;38011:512;;;;;;38530:263;;38645:2;38633:9;38624:7;38620:23;38616:32;38613:2;;;-1:-1;;38651:12;38613:2;-1:-1;17937:13;;38607:186;-1:-1;38607:186;38800:395;;;38930:2;38918:9;38909:7;38905:23;38901:32;38898:2;;;-1:-1;;38936:12;38898:2;18082:6;18076:13;18094:31;18119:5;18094:31;;;39097:2;39147:22;;;;5980:13;38988:72;;5980:13;;-1:-1;;;38892:303;39202:547;;;;39357:2;39345:9;39336:7;39332:23;39328:32;39325:2;;;-1:-1;;39363:12;39325:2;18082:6;18076:13;18094:31;18119:5;18094:31;;;39524:2;39574:22;;5980:13;39643:2;39701:22;;369:13;39415:72;;-1:-1;5980:13;-1:-1;387:41;369:13;387:41;;39756:773;;;;;39933:3;39921:9;39912:7;39908:23;39904:33;39901:2;;;-1:-1;;39940:12;39901:2;40002:62;40056:7;40032:22;40002:62;;;39992:72;;40101:2;40155:9;40151:22;5980:13;40109:74;;40220:2;40282:9;40278:22;369:13;387:41;422:5;387:41;;;40368:2;40353:18;;40347:25;40228:82;;-1:-1;;;;;;40381:30;;40378:2;;;-1:-1;;40414:12;40378:2;40444:69;40505:7;40496:6;40485:9;40481:22;40444:69;;40536:620;;;;40688:2;40676:9;40667:7;40663:23;40659:32;40656:2;;;-1:-1;;40694:12;40656:2;40756:62;40810:7;40786:22;40756:62;;;40746:72;;40855:2;40909:9;40905:22;5980:13;40863:74;;40995:2;40984:9;40980:18;40974:25;-1:-1;;;;;41011:6;41008:30;41005:2;;;-1:-1;;41041:12;41005:2;41071:69;41132:7;41123:6;41112:9;41108:22;41071:69;;41163:531;;;;41310:2;41298:9;41289:7;41285:23;41281:32;41278:2;;;-1:-1;;41316:12;41278:2;41378:62;41432:7;41408:22;41378:62;;;41368:72;;41477:2;41531:9;41527:22;17937:13;41485:74;;41596:2;41650:9;41646:22;17937:13;41604:74;;41272:422;;;;;;41884:161;96680:13;96673:21;49587:34;;42034:4;42025:14;;41958:87;42468:269;;42601:96;42693:3;42685:6;42601:96;;;-1:-1;;42726:4;42717:14;;42594:143;43169:137;-1:-1;;;;;98640:54;43256:45;;43250:56;43574:690;;43767:5;92173:12;94533:6;94528:3;94521:19;94570:4;94565:3;94561:14;43779:93;;94570:4;43943:5;91010:14;-1:-1;43982:260;44007:6;44004:1;44001:13;43982:260;;;44068:13;;-1:-1;;;;;98640:54;43256:45;;94570:4;41855:14;;;;93617;;;;10091:18;44022:9;43982:260;;;-1:-1;44248:10;;43698:566;-1:-1;;;;43698:566;44998:888;;45206:5;92173:12;94533:6;94528:3;94521:19;94570:4;94565:3;94561:14;45218:98;;;;94570:4;45373:6;45369:17;45364:3;45360:27;45348:39;;94570:4;45463:5;91010:14;-1:-1;45502:345;45527:6;45524:1;45521:13;45502:345;;;45589:9;45583:4;45579:20;45574:3;45567:33;42165:60;42221:3;45634:6;45628:13;42165:60;;;94570:4;45826:14;;;;45648:82;;-1:-1;93617:14;;;;;45549:1;45542:9;45502:345;;;-1:-1;45870:10;;45132:754;-1:-1;;;;;;45132:754;48834:690;;49027:5;92173:12;94533:6;94528:3;94521:19;94570:4;94565:3;94561:14;49039:93;;94570:4;49203:5;91010:14;-1:-1;49242:260;49267:6;49264:1;49261:13;49242:260;;;49328:13;;49805:37;;94570:4;43141:14;;;;93617;;;;49289:1;49282:9;49242:260;;50091:343;;50233:5;92173:12;94533:6;94528:3;94521:19;50326:52;50371:6;94570:4;94565:3;94561:14;94570:4;50352:5;50348:16;50326:52;;;101149:7;101133:14;-1:-1;;101129:28;50390:39;;;;94570:4;50390:39;;50181:253;-1:-1;;50181:253;55285:665;55505:23;;98856:4;98845:16;62629:35;;55677:4;55666:16;;;55660:23;55737:14;;;49805:37;55854:4;55843:16;;;55837:23;55914:14;;49805:37;55405:545;56729:2780;;56876:6;56981:63;57029:14;56958:16;56952:23;56981:63;;;57131:4;57124:5;57120:16;57114:23;57143:63;57131:4;57195:3;57191:14;57177:12;57143:63;;;;57300:4;57293:5;57289:16;57283:23;57312:63;57300:4;57364:3;57360:14;57346:12;57312:63;;;;57463:4;57456:5;57452:16;57446:23;57475:63;57463:4;57527:3;57523:14;57509:12;57475:63;;;;57629:4;57622:5;57618:16;57612:23;57629:4;57693:3;57689:14;49805:37;57795:4;57788:5;57784:16;57778:23;57795:4;57859:3;57855:14;49805:37;57953:4;57946:5;57942:16;57936:23;57953:4;58017:3;58013:14;49805:37;58111:4;58104:5;58100:16;58094:23;58111:4;58175:3;58171:14;49805:37;58282:6;;58275:5;58271:18;58265:25;58282:6;58348:3;58344:16;49805:37;;58440:6;;58433:5;58429:18;58423:25;58440:6;58506:3;58502:16;49805:37;;58608:6;;58601:5;58597:18;58591:25;56876:6;58608;58640:3;58636:16;58629:40;58684:67;56876:6;56871:3;56867:16;58732:12;58684:67;;;58676:75;;;58846:6;;;;58839:5;58835:18;58829:25;58902:3;58896:4;58892:14;58846:6;58878:3;58874:16;58867:40;58922:67;58984:4;58970:12;58922:67;;;58914:75;;;;59087:6;;59080:5;59076:18;59070:25;59143:3;59137:4;59133:14;59087:6;59119:3;59115:16;59108:40;59163:67;59225:4;59211:12;59163:67;;;59155:75;;;59328:6;;;;59321:5;59317:18;59311:25;59384:3;59378:4;59374:14;59328:6;59360:3;59356:16;59349:40;59404:67;59466:4;59452:12;59404:67;;;59493:11;56849:2660;-1:-1;;;;;;56849:2660;62676:262;;50601:5;92173:12;50712:52;50757:6;50752:3;50745:4;50738:5;50734:16;50712:52;;;50776:16;;;;;62801:137;-1:-1;;62801:137;62945:213;-1:-1;;;;;98640:54;;;;43256:45;;63063:2;63048:18;;63034:124;63165:324;-1:-1;;;;;98640:54;;;43256:45;;98640:54;;63475:2;63460:18;;43256:45;63311:2;63296:18;;63282:207;63496:435;-1:-1;;;;;98640:54;;;43256:45;;98640:54;;;;63834:2;63819:18;;43256:45;63917:2;63902:18;;49805:37;;;;63670:2;63655:18;;63641:290;63938:927;-1:-1;;;;;98640:54;;43256:45;;64258:3;64377:2;64362:18;;64355:48;;;63938:927;;64417:108;;64243:19;;64511:6;64417:108;;;64573:9;64567:4;64563:20;64558:2;64547:9;64543:18;64536:48;64598:108;64701:4;64692:6;64598:108;;;64754:9;64748:4;64744:20;64739:2;64728:9;64724:18;64717:48;64779:76;64850:4;64841:6;64779:76;;;64771:84;64229:636;-1:-1;;;;;;;;64229:636;64872:519;-1:-1;;;;;98640:54;;43256:45;;65064:2;65182;65167:18;;65160:48;;;64872:519;;65222:76;;65049:18;;65284:6;65222:76;;;65214:84;;49835:5;65377:2;65366:9;65362:18;49805:37;65035:356;;;;;;;65398:799;-1:-1;;;;;98640:54;;43256:45;;65654:3;65773:2;65758:18;;65751:48;;;65398:799;;65813:76;;65639:19;;65875:6;65813:76;;;65937:9;65931:4;65927:20;65922:2;65911:9;65907:18;65900:48;65962:76;66033:4;66024:6;65962:76;;66204:324;-1:-1;;;;;98640:54;;;;43256:45;;66514:2;66499:18;;49805:37;66350:2;66335:18;;66321:207;66535:1159;;66947:3;66969:17;66962:47;67023:118;66947:3;66936:9;66932:19;67127:6;67023:118;;;67189:9;67183:4;67179:20;67174:2;67163:9;67159:18;67152:48;67214:108;67317:4;67308:6;67214:108;;;67370:9;67364:4;67360:20;67355:2;67344:9;67340:18;67333:48;67395:108;67498:4;67489:6;67395:108;;;67387:116;;;67551:9;67545:4;67541:20;67536:2;67525:9;67521:18;67514:48;67576:108;67679:4;67670:6;67576:108;;;67568:116;66918:776;-1:-1;;;;;;;66918:776;67701:407;67892:2;67906:47;;;92173:12;;67877:18;;;94521:19;;;67701:407;;91010:14;;;94561;;;;67701:407;46449:308;46474:6;46471:1;46468:13;46449:308;;;46541:6;46535:13;102131:1;102124:5;102121:12;102111:2;;102137:9;102111:2;52475:73;;67892:2;93617:14;;;;42439;;;;46496:1;46489:9;46449:308;;;-1:-1;67959:139;;67863:245;-1:-1;;;;;67863:245;68115:959;;68479:2;68468:9;68464:18;68479:2;68500:17;68493:47;68554:154;47116:5;92173:12;47135:109;47237:6;47232:3;47135:109;;;47128:116;;91019:4;47338:5;91010:14;47350:21;;-1:-1;47377:329;47402:6;47399:1;47396:13;47377:329;;;47490:109;47595:3;47469:6;47463:13;47490:109;;;91019:4;93617:14;;;;;47483:116;-1:-1;47424:1;47417:9;47377:329;;;47381:14;;68756:9;68750:4;68746:20;91019:4;68730:9;68726:18;68719:48;68781:108;68884:4;68875:6;68781:108;;;68773:116;;;68937:9;68931:4;68927:20;68922:2;68911:9;68907:18;68900:48;68962:102;44481:5;92173:12;44500:83;44576:6;44571:3;44500:83;;;44493:90;;91019:4;44651:5;91010:14;44663:21;;-1:-1;44690:251;44715:6;44712:1;44709:13;44690:251;;;44803:57;44856:3;44782:6;44776:13;44803:57;;;91019:4;93617:14;;;;;44796:64;-1:-1;47424:1;44730:9;44690:251;;;-1:-1;68954:110;;68450:624;-1:-1;;;;;;;68450:624;69081:361;;69249:2;69270:17;69263:47;69324:108;69249:2;69238:9;69234:18;69418:6;69324:108;;69449:640;;69705:2;69726:17;69719:47;69780:108;69705:2;69694:9;69690:18;69874:6;69780:108;;;69936:9;69930:4;69926:20;69921:2;69910:9;69906:18;69899:48;69961:118;70074:4;70065:6;69961:118;;;69953:126;69676:413;-1:-1;;;;;69676:413;70096:620;;70342:2;70363:17;70356:47;70417:108;70342:2;70331:9;70327:18;70511:6;70417:108;;;70573:9;70567:4;70563:20;70558:2;70547:9;70543:18;70536:48;70598:108;70701:4;70692:6;70598:108;;70723:213;49805:37;;;70841:2;70826:18;;70812:124;70943:715;49805:37;;;-1:-1;;;;;98640:54;;71346:2;71331:18;;43256:45;71181:3;71383:2;71368:18;;71361:48;;;70943:715;;71423:76;;71166:19;;71485:6;71423:76;;;71547:9;71541:4;71537:20;71532:2;71521:9;71517:18;71510:48;71572:76;71643:4;71634:6;71572:76;;71665:324;49805:37;;;71975:2;71960:18;;49805:37;71811:2;71796:18;;71782:207;71996:408;;49835:5;49812:3;49805:37;72160:2;72278;72267:9;72263:18;72256:48;72318:76;72160:2;72149:9;72145:18;72380:6;72318:76;;72411:603;;49835:5;49812:3;49805:37;72621:2;72739;72728:9;72724:18;72717:48;72779:76;72621:2;72610:9;72606:18;72841:6;72779:76;;;72903:9;72897:4;72893:20;72888:2;72877:9;72873:18;72866:48;72928:76;72999:4;72990:6;72928:76;;73021:352;49805:37;;;73181:2;73166:18;;98028:49;98071:5;98028:49;;;99974:40;73359:2;73348:9;73344:18;52315:64;73152:221;;;;;;73380:209;-1:-1;;;;;;96846:78;;;;50043:36;;73496:2;73481:18;;73467:122;73596:320;-1:-1;;;;;;96846:78;;;;50043:36;;-1:-1;;;;;98640:54;73902:2;73887:18;;43256:45;73740:2;73725:18;;73711:205;73923:1035;-1:-1;;;;;;96846:78;;50043:36;;-1:-1;;;;;98640:54;;74432:2;74417:18;;43256:45;98651:42;74469:2;74454:18;;74447:48;;;73923:1035;;74509:108;;74254:19;;74603:6;74509:108;;;74665:9;74659:4;74655:20;74650:2;74639:9;74635:18;74628:48;74690:108;74793:4;74784:6;74690:108;;;74847:9;74841:4;74837:20;74831:3;74820:9;74816:19;74809:49;74872:76;74943:4;74934:6;74872:76;;74965:627;-1:-1;;;;;;96846:78;;50043:36;;-1:-1;;;;;98640:54;;75346:2;75331:18;;43256:45;75183:3;75383:2;75368:18;;75361:48;;;74965:627;;75423:76;;75168:19;;75485:6;75423:76;;;75415:84;;49835:5;75578:2;75567:9;75563:18;49805:37;75154:438;;;;;;;;75599:431;-1:-1;;;;;;96846:78;;;;50043:36;;-1:-1;;;;;98640:54;;;;75933:2;75918:18;;43256:45;76016:2;76001:18;;49805:37;75771:2;75756:18;;75742:288;76037:747;;96857:66;;;50072:5;96846:78;50050:3;50043:36;76319:2;76435;76424:9;76420:18;76413:48;76475:108;76319:2;76308:9;76304:18;76569:6;76475:108;;;76631:9;76625:4;76621:20;76616:2;76605:9;76601:18;76594:48;76656:118;76769:4;76760:6;76656:118;;76791:297;;76927:2;76948:17;76941:47;77002:76;76927:2;76916:9;76912:18;77064:6;77002:76;;77095:707;;77353:3;77375:17;77368:47;77429:76;77353:3;77342:9;77338:19;77491:6;77429:76;;;-1:-1;;;;;98640:54;;;77600:2;77585:18;;43256:45;98640:54;;;;77699:2;77684:18;;43256:45;98856:4;98845:16;;;;77788:2;77773:18;;;53174:56;77421:84;77324:478;-1:-1;;77324:478;77809:581;;97037:66;97097:5;97037:66;;;98983:57;51235:3;51228:81;49835:5;78227:2;78216:9;78212:18;49805:37;78032:2;78264;78253:9;78249:18;78242:48;78304:76;78032:2;78021:9;78017:18;78366:6;78304:76;;78397:471;78589:2;78574:18;;97203:53;97250:5;97203:53;;;51410:68;;;78771:2;78756:18;;49805:37;;;;78854:2;78839:18;;;49805:37;78560:308;;78875:491;79077:2;79062:18;;97366:63;97423:5;97366:63;;;51589:78;;;79269:2;79254:18;;49805:37;;;;-1:-1;;;;;98640:54;79352:2;79337:18;;;43256:45;79048:318;;79373:358;79536:2;79521:18;;97203:53;97250:5;97203:53;;;51767:67;;;79717:2;79702:18;49805:37;79507:224;;79738:487;79938:2;79923:18;;97366:63;97423:5;97366:63;;80232:501;80439:2;80424:18;;101894:1;101884:12;;101874:2;;101900:9;80740:259;80881:2;80866:18;;102131:1;102121:12;;102111:2;;102137:9;102111:2;52475:73;;;80852:147;;81006:675;;98028:49;98071:5;98028:49;;;52832:72;;;81435:2;81420:18;;49805:37;;;-1:-1;;;;;98640:54;;81518:2;81503:18;;43256:45;81248:3;81555:2;81540:18;;81533:48;;;81595:76;;81233:19;;81657:6;81595:76;;81688:372;81858:2;81843:18;;97037:66;97097:5;97037:66;;82067:1175;;82487:3;82509:17;82502:47;82563:78;82487:3;82476:9;82472:19;82627:6;82563:78;;;82674:2;82689:9;82683:4;82679:20;82674:2;82663:9;82659:18;82652:48;82714:146;48045:5;92173:12;94533:6;94528:3;94521:19;82674:2;94565:3;94561:14;48057:112;;82674:2;;48226:6;48222:17;94565:3;48213:27;;82674:2;48330:5;91010:14;-1:-1;48369:387;48394:6;48391:1;48388:13;48369:387;;;101149:7;;94565:3;48450:4;48446:20;;48441:3;48434:33;42885:88;42969:3;48501:6;48495:13;42885:88;;;48735:14;;;;48515:110;-1:-1;93617:14;;;;48416:1;48409:9;48369:387;;;48373:14;;82908:9;82902:4;82898:20;82893:2;82882:9;82878:18;82871:48;82933:108;83036:4;83027:6;82933:108;;;82925:116;;;;;;83089:9;83083:4;83079:20;83074:2;83063:9;83059:18;83052:48;83114:118;83227:4;83218:6;83114:118;;83249:407;83440:2;83454:47;;;53821:2;83425:18;;;94521:19;-1:-1;;;94561:14;;;53837:42;53898:12;;;83411:245;83663:407;83854:2;83868:47;;;54149:2;83839:18;;;94521:19;54185:27;94561:14;;;54165:48;54232:12;;;83825:245;84077:407;84268:2;84282:47;;;54483:2;84253:18;;;94521:19;-1:-1;;;94561:14;;;54499:36;54554:12;;;84239:245;84491:407;84682:2;84696:47;;;54805:2;84667:18;;;94521:19;-1:-1;;;94561:14;;;54821:35;54875:12;;;84653:245;84905:407;85096:2;85110:47;;;55126:2;85081:18;;;94521:19;-1:-1;;;94561:14;;;55142:37;55198:12;;;85067:245;85319:533;85541:3;85526:19;;85556:125;85530:9;85654:6;85556:125;;;49835:5;85760:2;85749:9;85745:18;49805:37;49614:5;96680:13;96673:21;85837:3;85826:9;85822:19;49587:34;85512:340;;;;;;;85859:353;;86023:2;86044:17;86037:47;86098:104;86023:2;86012:9;86008:18;86188:6;86098:104;;86219:548;;86429:2;86450:17;86443:47;86504:104;86429:2;86418:9;86414:18;86594:6;86504:104;;;86656:9;86650:4;86646:20;86641:2;86630:9;86626:18;86619:48;86681:76;86752:4;86743:6;86681:76;;87325:435;49805:37;;;87663:2;87648:18;;49805:37;;;;87746:2;87731:18;;49805:37;87499:2;87484:18;;87470:290;87767:256;87829:2;87823:9;87855:17;;;-1:-1;;;;;87915:34;;87951:22;;;87912:62;87909:2;;;87987:1;;87977:12;87909:2;87829;87996:22;87807:216;;-1:-1;87807:216;88030:304;;-1:-1;;;;;88181:6;88178:30;88175:2;;;-1:-1;;88211:12;88175:2;-1:-1;88256:4;88244:17;;;88309:15;;88112:222;90243:317;;-1:-1;;;;;90374:6;90371:30;90368:2;;;-1:-1;;90404:12;90368:2;-1:-1;101149:7;90458:17;-1:-1;;90454:33;90545:4;90535:15;;90305:255;100789:268;100854:1;100861:101;100875:6;100872:1;100869:13;100861:101;;;100942:11;;;100936:18;100923:11;;;100916:39;100897:2;100890:10;100861:101;;;100977:6;100974:1;100971:13;100968:2;;;100854:1;101033:6;101028:3;101024:16;101017:27;100968:2;;100838:219;;;;101170:124;101272:1;101265:5;101262:12;101252:2;;101278:9;101252:2;101246:48;;101301:111;101390:1;101383:5;101380:12;101370:2;;101396:9;101419:121;101518:1;101511:5;101508:12;101498:2;;101524:9;101923:107;102008:1;102001:5;101998:12;101988:2;;102014:9;102406:117;-1:-1;;;;;98640:54;;102465:35;;102455:2;;102514:1;;102504:12;103158:113;98856:4;103241:5;98845:16;103218:5;103215:33;103205:2;;103262:1;;103252:12" - } - } - }, - "sources": { - "src/DevUtils.sol": { - "id": 0 - }, - "@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol": { - "id": 11 - }, - "@0x/contracts-utils/contracts/src/LibEIP712.sol": { - "id": 30 - }, - "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": { - "id": 16 - }, - "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol": { - "id": 17 - }, - "@0x/contracts-utils/contracts/src/LibBytes.sol": { - "id": 28 - }, - "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": { - "id": 29 - }, - "@0x/contracts-utils/contracts/src/LibRichErrors.sol": { - "id": 31 - }, - "src/OrderValidationUtils.sol": { - "id": 5 - }, - "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol": { - "id": 19 - }, - "@0x/contracts-exchange/contracts/src/interfaces/IExchangeCore.sol": { - "id": 20 - }, - "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": { - "id": 13 - }, - "@0x/contracts-utils/contracts/src/LibSafeMath.sol": { - "id": 32 - }, - "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": { - "id": 33 - }, - "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": { - "id": 14 - }, - "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": { - "id": 15 - }, - "@0x/contracts-exchange/contracts/src/interfaces/IProtocolFees.sol": { - "id": 22 - }, - "@0x/contracts-exchange/contracts/src/interfaces/IMatchOrders.sol": { - "id": 21 - }, - "@0x/contracts-exchange/contracts/src/interfaces/ISignatureValidator.sol": { - "id": 23 - }, - "@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol": { - "id": 24 - }, - "@0x/contracts-exchange/contracts/src/interfaces/IAssetProxyDispatcher.sol": { - "id": 18 - }, - "@0x/contracts-exchange/contracts/src/interfaces/IWrapperFunctions.sol": { - "id": 26 - }, - "@0x/contracts-exchange/contracts/src/interfaces/ITransferSimulator.sol": { - "id": 25 - }, - "src/LibAssetData.sol": { - "id": 2 - }, - "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol": { - "id": 6 - }, - "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetProxy.sol": { - "id": 7 - }, - "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": { - "id": 9 - }, - "@0x/contracts-erc721/contracts/src/interfaces/IERC721Token.sol": { - "id": 10 - }, - "@0x/contracts-erc1155/contracts/src/interfaces/IERC1155.sol": { - "id": 8 - }, - "src/OrderTransferSimulationUtils.sol": { - "id": 4 - }, - "@0x/contracts-exchange/contracts/src/libs/LibExchangeRichErrorDecoder.sol": { - "id": 27 - }, - "@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol": { - "id": 12 - }, - "src/LibTransactionDecoder.sol": { - "id": 3 - }, - "src/EthBalanceChecker.sol": { - "id": 1 - } - }, - "sourceCodes": { - "src/DevUtils.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"./OrderValidationUtils.sol\";\nimport \"./OrderTransferSimulationUtils.sol\";\nimport \"./LibTransactionDecoder.sol\";\nimport \"./EthBalanceChecker.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract DevUtils is\n OrderValidationUtils,\n LibTransactionDecoder,\n LibEIP712ExchangeDomain,\n EthBalanceChecker\n{\n constructor (address _exchange)\n public\n OrderValidationUtils(_exchange)\n OrderTransferSimulationUtils(_exchange)\n LibEIP712ExchangeDomain(uint256(0), address(0)) // null args because because we only use constants\n {}\n\n function getOrderHash(LibOrder.Order memory order, uint256 chainId, address exchange)\n public\n pure\n returns (bytes32 orderHash)\n {\n return LibOrder.getTypedDataHash(\n order,\n LibEIP712.hashEIP712Domain(_EIP712_EXCHANGE_DOMAIN_NAME, _EIP712_EXCHANGE_DOMAIN_VERSION, chainId, exchange)\n );\n }\n\n function getTransactionHash(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n uint256 chainId,\n address exchange\n )\n public\n pure\n returns (bytes32 transactionHash)\n {\n return LibZeroExTransaction.getTypedDataHash(\n transaction,\n LibEIP712.hashEIP712Domain(_EIP712_EXCHANGE_DOMAIN_NAME, _EIP712_EXCHANGE_DOMAIN_VERSION, chainId, exchange)\n );\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712ExchangeDomain {\n\n // EIP712 Exchange Domain Name value\n string constant internal _EIP712_EXCHANGE_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Exchange Domain Version value\n string constant internal _EIP712_EXCHANGE_DOMAIN_VERSION = \"3.0.0\";\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_EXCHANGE_DOMAIN_HASH;\n\n /// @param chainId Chain ID of the network this contract is deployed on.\n /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n constructor (\n uint256 chainId,\n address verifyingContractAddressIfExists\n )\n public\n {\n address verifyingContractAddress = verifyingContractAddressIfExists == address(0) ? address(this) : verifyingContractAddressIfExists;\n EIP712_EXCHANGE_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n _EIP712_EXCHANGE_DOMAIN_NAME,\n _EIP712_EXCHANGE_DOMAIN_VERSION,\n chainId,\n verifyingContractAddress\n );\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibEIP712.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n // Hash of the EIP712 Domain Separator Schema\n // keccak256(abi.encodePacked(\n // \"EIP712Domain(\",\n // \"string name,\",\n // \"string version,\",\n // \"uint256 chainId,\",\n // \"address verifyingContract\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n /// @dev Calculates a EIP712 domain separator.\n /// @param name The EIP712 domain name.\n /// @param version The EIP712 domain version.\n /// @param verifyingContract The EIP712 verifying contract.\n /// @return EIP712 domain separator.\n function hashEIP712Domain(\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n // keccak256(bytes(name)),\n // keccak256(bytes(version)),\n // chainId,\n // uint256(verifyingContract)\n // ))\n\n assembly {\n // Calculate hashes of dynamic data\n let nameHash := keccak256(add(name, 32), mload(name))\n let versionHash := keccak256(add(version, 32), mload(version))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n // Store params in memory\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), nameHash)\n mstore(add(memPtr, 64), versionHash)\n mstore(add(memPtr, 96), chainId)\n mstore(add(memPtr, 128), verifyingContract)\n\n // Compute hash\n result := keccak256(memPtr, 160)\n }\n return result;\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n /// @param eip712DomainHash Hash of the domain domain separator data, computed\n /// with getDomainHash().\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to the given EIP712 Domain.\n function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n internal\n pure\n returns (bytes32 result)\n {\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n using LibOrder for Order;\n\n // Hash for the EIP712 Order Schema:\n // keccak256(abi.encodePacked(\n // \"Order(\",\n // \"address makerAddress,\",\n // \"address takerAddress,\",\n // \"address feeRecipientAddress,\",\n // \"address senderAddress,\",\n // \"uint256 makerAssetAmount,\",\n // \"uint256 takerAssetAmount,\",\n // \"uint256 makerFee,\",\n // \"uint256 takerFee,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 salt,\",\n // \"bytes makerAssetData,\",\n // \"bytes takerAssetData,\",\n // \"bytes makerFeeAssetData,\",\n // \"bytes takerFeeAssetData\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n 0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's status is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order.\n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n address feeRecipientAddress; // Address that will recieve fees when order is filled.\n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0.\n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0.\n uint256 makerFee; // Fee paid to feeRecipient by maker when order is filled.\n uint256 takerFee; // Fee paid to feeRecipient by taker when order is filled.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires.\n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash.\n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n bytes makerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n /// @param order The order structure.\n /// @return EIP712 typed data hash of the order.\n function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 orderHash)\n {\n orderHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n order.getStructHash()\n );\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order struct.\n /// @param order The order structure.\n /// @return EIP712 hash of the order struct.\n function getStructHash(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n bytes memory makerAssetData = order.makerAssetData;\n bytes memory takerAssetData = order.takerAssetData;\n bytes memory makerFeeAssetData = order.makerFeeAssetData;\n bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // uint256(order.makerAddress),\n // uint256(order.takerAddress),\n // uint256(order.feeRecipientAddress),\n // uint256(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData),\n // keccak256(order.makerFeeAssetData),\n // keccak256(order.takerFeeAssetData)\n // ));\n\n assembly {\n // Assert order offset (this is an internal error that should never be triggered)\n if lt(order, 32) {\n invalid()\n }\n\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n let pos4 := add(order, 384)\n let pos5 := add(order, 416)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n let temp4 := mload(pos4)\n let temp5 := mload(pos5)\n\n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData))) // store hash of makerAssetData\n mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData))) // store hash of takerAssetData\n mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData))) // store hash of makerFeeAssetData\n mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData))) // store hash of takerFeeAssetData\n result := keccak256(pos1, 480)\n\n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n mstore(pos4, temp4)\n mstore(pos5, temp5)\n }\n return result;\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibZeroExTransaction {\n\n using LibZeroExTransaction for ZeroExTransaction;\n\n // Hash for the EIP712 0x transaction schema\n // keccak256(abi.encodePacked(\n // \"ZeroExTransaction(\",\n // \"uint256 salt,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 gasPrice,\",\n // \"address signerAddress,\",\n // \"bytes data\",\n // \")\"\n // ));\n bytes32 constant internal _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = 0xec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508;\n\n struct ZeroExTransaction {\n uint256 salt; // Arbitrary number to ensure uniqueness of transaction hash.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which transaction expires.\n uint256 gasPrice; // gasPrice that transaction is required to be executed with.\n address signerAddress; // Address of transaction signer.\n bytes data; // AbiV2 encoded calldata.\n }\n\n /// @dev Calculates the EIP712 typed data hash of a transaction with a given domain separator.\n /// @param transaction 0x transaction structure.\n /// @return EIP712 typed data hash of the transaction.\n function getTypedDataHash(ZeroExTransaction memory transaction, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 transactionHash)\n {\n // Hash the transaction with the domain separator of the Exchange contract.\n transactionHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n transaction.getStructHash()\n );\n return transactionHash;\n }\n\n /// @dev Calculates EIP712 hash of the 0x transaction struct.\n /// @param transaction 0x transaction structure.\n /// @return EIP712 hash of the transaction struct.\n function getStructHash(ZeroExTransaction memory transaction)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes memory data = transaction.data;\n uint256 salt = transaction.salt;\n uint256 expirationTimeSeconds = transaction.expirationTimeSeconds;\n uint256 gasPrice = transaction.gasPrice;\n address signerAddress = transaction.signerAddress;\n\n // Assembly for more efficiently computing:\n // result = keccak256(abi.encodePacked(\n // schemaHash,\n // salt,\n // expirationTimeSeconds,\n // gasPrice,\n // uint256(signerAddress),\n // keccak256(data)\n // ));\n\n assembly {\n // Compute hash of data\n let dataHash := keccak256(add(data, 32), mload(data))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), expirationTimeSeconds) // expirationTimeSeconds\n mstore(add(memPtr, 96), gasPrice) // gasPrice\n mstore(add(memPtr, 128), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 160), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 192)\n }\n return result;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n\n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n if (b.length == 0) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n b.length,\n 0\n ));\n }\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n\n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n if (b.length < index + 4) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n b.length,\n index + 4\n ));\n }\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Writes a new length to a byte array.\n /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n /// @param b Bytes array to write new length to.\n /// @param length New length of byte array.\n function writeLength(bytes memory b, uint256 length)\n internal\n pure\n {\n assembly {\n mstore(b, length)\n }\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n enum InvalidByteOperationErrorCodes {\n FromLessThanOrEqualsToRequired,\n ToLessThanOrEqualsLengthRequired,\n LengthGreaterThanZeroRequired,\n LengthGreaterThanOrEqualsFourRequired,\n LengthGreaterThanOrEqualsTwentyRequired,\n LengthGreaterThanOrEqualsThirtyTwoRequired,\n LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n DestinationLengthGreaterThanOrEqualSourceLengthRequired\n }\n\n // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n 0x28006595;\n\n // solhint-disable func-name-mixedcase\n function InvalidByteOperationError(\n InvalidByteOperationErrorCodes errorCode,\n uint256 offset,\n uint256 required\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n errorCode,\n offset,\n required\n );\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR =\n 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(\n string memory message\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n", - "src/OrderValidationUtils.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./LibAssetData.sol\";\nimport \"./OrderTransferSimulationUtils.sol\";\n\n\ncontract OrderValidationUtils is\n LibAssetData,\n OrderTransferSimulationUtils\n{\n using LibBytes for bytes;\n using LibSafeMath for uint256;\n\n constructor (address _exchange)\n public\n LibAssetData(_exchange)\n {}\n\n /// @dev Fetches all order-relevant information needed to validate if the supplied order is fillable.\n /// @param order The order structure.\n /// @param signature Signature provided by maker that proves the order's authenticity.\n /// `0x01` can always be provided if the signature does not need to be validated.\n /// @return The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order),\n /// fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state),\n /// and isValidSignature (validity of the provided signature).\n /// NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\"\n /// amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final\n /// amount of each asset that can be filled.\n function getOrderRelevantState(LibOrder.Order memory order, bytes memory signature)\n public\n returns (\n LibOrder.OrderInfo memory orderInfo,\n uint256 fillableTakerAssetAmount,\n bool isValidSignature\n )\n {\n // Get info specific to order\n orderInfo = _EXCHANGE.getOrderInfo(order);\n\n // Validate the maker's signature\n address makerAddress = order.makerAddress;\n isValidSignature = _EXCHANGE.isValidOrderSignature(\n order,\n signature\n );\n\n // Get the transferable amount of the `makerAsset`\n uint256 transferableMakerAssetAmount = getTransferableAssetAmount(makerAddress, order.makerAssetData);\n\n // Assign to stack variables to reduce redundant mloads/sloads\n uint256 takerAssetAmount = order.takerAssetAmount;\n uint256 makerFee = order.makerFee;\n\n // Get the amount of `takerAsset` that is transferable to maker given the transferability of `makerAsset`, `makerFeeAsset`,\n // and the total amounts specified in the order\n uint256 transferableTakerAssetAmount;\n if (order.makerAssetData.equals(order.makerFeeAssetData)) {\n // If `makerAsset` equals `makerFeeAsset`, the % that can be filled is\n // transferableMakerAssetAmount / (makerAssetAmount + makerFee)\n transferableTakerAssetAmount = LibMath.getPartialAmountFloor(\n transferableMakerAssetAmount,\n order.makerAssetAmount.safeAdd(makerFee),\n takerAssetAmount\n );\n } else {\n // If `makerFee` is 0, the % that can be filled is (transferableMakerAssetAmount / makerAssetAmount)\n if (makerFee == 0) {\n transferableTakerAssetAmount = LibMath.getPartialAmountFloor(\n transferableMakerAssetAmount,\n order.makerAssetAmount,\n takerAssetAmount\n );\n\n // If `makerAsset` does not equal `makerFeeAsset`, the % that can be filled is the lower of\n // (transferableMakerAssetAmount / makerAssetAmount) and (transferableMakerAssetFeeAmount / makerFee)\n } else {\n // Get the transferable amount of the `makerFeeAsset`\n uint256 transferableMakerFeeAssetAmount = getTransferableAssetAmount(makerAddress, order.makerFeeAssetData);\n uint256 transferableMakerToTakerAmount = LibMath.getPartialAmountFloor(\n transferableMakerAssetAmount,\n order.makerAssetAmount,\n takerAssetAmount\n );\n uint256 transferableMakerFeeToTakerAmount = LibMath.getPartialAmountFloor(\n transferableMakerFeeAssetAmount,\n makerFee,\n takerAssetAmount\n );\n transferableTakerAssetAmount = LibSafeMath.min256(transferableMakerToTakerAmount, transferableMakerFeeToTakerAmount);\n }\n }\n\n // `fillableTakerAssetAmount` is the lower of the order's remaining `takerAssetAmount` and the `transferableTakerAssetAmount`\n fillableTakerAssetAmount = LibSafeMath.min256(\n takerAssetAmount.safeSub(orderInfo.orderTakerAssetFilledAmount),\n transferableTakerAssetAmount\n );\n\n // Execute the maker transfers.\n fillableTakerAssetAmount = getSimulatedOrderMakerTransferResults(\n order,\n order.takerAddress,\n fillableTakerAssetAmount\n ) == OrderTransferResults.TransfersSuccessful ? fillableTakerAssetAmount : 0;\n\n return (orderInfo, fillableTakerAssetAmount, isValidSignature);\n }\n\n /// @dev Fetches all order-relevant information needed to validate if the supplied orders are fillable.\n /// @param orders Array of order structures.\n /// @param signatures Array of signatures provided by makers that prove the authenticity of the orders.\n /// `0x01` can always be provided if a signature does not need to be validated.\n /// @return The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order),\n /// fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state),\n /// and isValidSignature (array containing the validity of each provided signature).\n /// NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts`\n /// will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within\n /// the `takerAssetData` to get the final amount of each asset that can be filled.\n function getOrderRelevantStates(LibOrder.Order[] memory orders, bytes[] memory signatures)\n public\n returns (\n LibOrder.OrderInfo[] memory ordersInfo,\n uint256[] memory fillableTakerAssetAmounts,\n bool[] memory isValidSignature\n )\n {\n uint256 length = orders.length;\n ordersInfo = new LibOrder.OrderInfo[](length);\n fillableTakerAssetAmounts = new uint256[](length);\n isValidSignature = new bool[](length);\n\n for (uint256 i = 0; i != length; i++) {\n (ordersInfo[i], fillableTakerAssetAmounts[i], isValidSignature[i]) = getOrderRelevantState(\n orders[i],\n signatures[i]\n );\n }\n\n return (ordersInfo, fillableTakerAssetAmounts, isValidSignature);\n }\n\n /// @dev Gets the amount of an asset transferable by the owner.\n /// @param ownerAddress Address of the owner of the asset.\n /// @param assetData Description of tokens, per the AssetProxy contract specification.\n /// @return The amount of the asset tranferable by the owner.\n /// NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount`\n /// will represent the amount of times the entire `assetData` can be transferred. To calculate\n /// the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by\n /// the individual asset amounts located within the `assetData`.\n function getTransferableAssetAmount(address ownerAddress, bytes memory assetData)\n public\n view\n returns (uint256 transferableAssetAmount)\n {\n (uint256 balance, uint256 allowance) = getBalanceAndAssetProxyAllowance(ownerAddress, assetData);\n transferableAssetAmount = LibSafeMath.min256(balance, allowance);\n return transferableAssetAmount;\n }\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IProtocolFees.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\nimport \"./ITransferSimulator.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IProtocolFees,\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n ITransferSimulator,\n IWrapperFunctions\n{}\n", - "@0x/contracts-exchange/contracts/src/interfaces/IExchangeCore.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n // Fill event is emitted whenever an order is filled.\n event Fill(\n address indexed makerAddress, // Address that created the order.\n address indexed feeRecipientAddress, // Address that received fees.\n bytes makerAssetData, // Encoded data specific to makerAsset.\n bytes takerAssetData, // Encoded data specific to takerAsset.\n bytes makerFeeAssetData, // Encoded data specific to makerFeeAsset.\n bytes takerFeeAssetData, // Encoded data specific to takerFeeAsset.\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getTypedDataHash).\n address takerAddress, // Address that filled the order.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n uint256 makerAssetFilledAmount, // Amount of makerAsset sold by maker and bought by taker.\n uint256 takerAssetFilledAmount, // Amount of takerAsset sold by taker and bought by maker.\n uint256 makerFeePaid, // Amount of makerFeeAssetData paid to feeRecipient by maker.\n uint256 takerFeePaid, // Amount of takerFeeAssetData paid to feeRecipient by taker.\n uint256 protocolFeePaid // Amount of eth or weth paid to the staking contract.\n );\n\n // Cancel event is emitted whenever an individual order is cancelled.\n event Cancel(\n address indexed makerAddress, // Address that created the order.\n address indexed feeRecipientAddress, // Address that would have recieved fees if order was filled.\n bytes makerAssetData, // Encoded data specific to makerAsset.\n bytes takerAssetData, // Encoded data specific to takerAsset.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n bytes32 indexed orderHash // EIP712 hash of order (see LibOrder.getTypedDataHash).\n );\n\n // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n event CancelUpTo(\n address indexed makerAddress, // Orders cancelled must have been created by this address.\n address indexed orderSenderAddress, // Orders cancelled must have a `senderAddress` equal to this address.\n uint256 orderEpoch // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.\n );\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n payable;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public\n payable;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./LibMath.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibFillResults {\n\n using LibSafeMath for uint256;\n\n struct BatchMatchedFillResults {\n FillResults[] left; // Fill results for left orders\n FillResults[] right; // Fill results for right orders\n uint256 profitInLeftMakerAsset; // Profit taken from left makers\n uint256 profitInRightMakerAsset; // Profit taken from right makers\n }\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of fees paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of fees paid by taker to feeRecipients(s).\n uint256 protocolFeePaid; // Total amount of fees paid by taker to the staking contract.\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 profitInLeftMakerAsset; // Profit taken from the left maker\n uint256 profitInRightMakerAsset; // Profit taken from the right maker\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n /// to be pure rather than view.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount,\n uint256 protocolFeeMultiplier,\n uint256 gasPrice\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n // Compute the protocol fee that should be paid for a single fill.\n fillResults.protocolFeePaid = gasPrice.safeMul(protocolFeeMultiplier);\n\n return fillResults;\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n /// to be pure rather than view.\n /// @param shouldMaximallyFillOrders A value that indicates whether or not this calculation should use\n /// the maximal fill order matching strategy.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount,\n uint256 protocolFeeMultiplier,\n uint256 gasPrice,\n bool shouldMaximallyFillOrders\n )\n internal\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Derive maker asset amounts for left & right orders, given store taker assert amounts\n uint256 leftTakerAssetAmountRemaining = leftOrder.takerAssetAmount.safeSub(leftOrderTakerAssetFilledAmount);\n uint256 leftMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n leftOrder.makerAssetAmount,\n leftOrder.takerAssetAmount,\n leftTakerAssetAmountRemaining\n );\n uint256 rightTakerAssetAmountRemaining = rightOrder.takerAssetAmount.safeSub(rightOrderTakerAssetFilledAmount);\n uint256 rightMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetAmountRemaining\n );\n\n // Maximally fill the orders and pay out profits to the matcher in one or both of the maker assets.\n if (shouldMaximallyFillOrders) {\n matchedFillResults = _calculateMatchedFillResultsWithMaximalFill(\n leftOrder,\n rightOrder,\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else {\n matchedFillResults = _calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Compute fees for left order\n matchedFillResults.left.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.left.makerAssetFilledAmount,\n leftOrder.makerAssetAmount,\n leftOrder.makerFee\n );\n matchedFillResults.left.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.left.takerAssetFilledAmount,\n leftOrder.takerAssetAmount,\n leftOrder.takerFee\n );\n\n // Compute fees for right order\n matchedFillResults.right.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.right.makerAssetFilledAmount,\n rightOrder.makerAssetAmount,\n rightOrder.makerFee\n );\n matchedFillResults.right.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.right.takerAssetFilledAmount,\n rightOrder.takerAssetAmount,\n rightOrder.takerFee\n );\n\n // Compute the protocol fee that should be paid for a single fill. In this\n // case this should be made the protocol fee for both the left and right orders.\n uint256 protocolFee = gasPrice.safeMul(protocolFeeMultiplier);\n matchedFillResults.left.protocolFeePaid = protocolFee;\n matchedFillResults.right.protocolFeePaid = protocolFee;\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// @param fillResults1 The first FillResults.\n /// @param fillResults2 The second FillResults.\n /// @return The sum of both fill results.\n function addFillResults(\n FillResults memory fillResults1,\n FillResults memory fillResults2\n )\n internal\n pure\n returns (FillResults memory totalFillResults)\n {\n totalFillResults.makerAssetFilledAmount = fillResults1.makerAssetFilledAmount.safeAdd(fillResults2.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = fillResults1.takerAssetFilledAmount.safeAdd(fillResults2.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = fillResults1.makerFeePaid.safeAdd(fillResults2.makerFeePaid);\n totalFillResults.takerFeePaid = fillResults1.takerFeePaid.safeAdd(fillResults2.takerFeePaid);\n totalFillResults.protocolFeePaid = fillResults1.protocolFeePaid.safeAdd(fillResults2.protocolFeePaid);\n\n return totalFillResults;\n }\n\n /// @dev Calculates part of the matched fill results for a given situation using the fill strategy that only\n /// awards profit denominated in the left maker asset.\n /// @param leftOrder The left order in the order matching situation.\n /// @param rightOrder The right order in the order matching situation.\n /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n /// @return MatchFillResults struct that does not include fees paid.\n function _calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Calculate fill results for maker and taker assets: at least one order will be fully filled.\n // The maximum amount the left maker can buy is `leftTakerAssetAmountRemaining`\n // The maximum amount the right maker can sell is `rightMakerAssetAmountRemaining`\n // We have two distinct cases for calculating the fill results:\n // Case 1.\n // If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n // If the left maker can buy exactly what the right maker can sell, then both orders are fully filled.\n // Case 2.\n // If the left maker cannot buy more than the right maker can sell, then only the left order is fully filled.\n // Case 3.\n // If the left maker can buy exactly as much as the right maker can sell, then both orders are fully filled.\n if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n // Case 1: Right order is fully filled\n matchedFillResults = _calculateCompleteRightFill(\n leftOrder,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else if (leftTakerAssetAmountRemaining < rightMakerAssetAmountRemaining) {\n // Case 2: Left order is fully filled\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n matchedFillResults.right.makerAssetFilledAmount = leftTakerAssetAmountRemaining;\n // Round up to ensure the maker's exchange rate does not exceed the price specified by the order.\n // We favor the maker when the exchange rate must be rounded.\n matchedFillResults.right.takerAssetFilledAmount = LibMath.safeGetPartialAmountCeil(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetAmountRemaining // matchedFillResults.right.makerAssetFilledAmount\n );\n } else {\n // leftTakerAssetAmountRemaining == rightMakerAssetAmountRemaining\n // Case 3: Both orders are fully filled. Technically, this could be captured by the above cases, but\n // this calculation will be more precise since it does not include rounding.\n matchedFillResults = _calculateCompleteFillBoth(\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Calculate amount given to taker\n matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n return matchedFillResults;\n }\n\n /// @dev Calculates part of the matched fill results for a given situation using the maximal fill order matching\n /// strategy.\n /// @param leftOrder The left order in the order matching situation.\n /// @param rightOrder The right order in the order matching situation.\n /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n /// @return MatchFillResults struct that does not include fees paid.\n function _calculateMatchedFillResultsWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // If a maker asset is greater than the opposite taker asset, than there will be a spread denominated in that maker asset.\n bool doesLeftMakerAssetProfitExist = leftMakerAssetAmountRemaining > rightTakerAssetAmountRemaining;\n bool doesRightMakerAssetProfitExist = rightMakerAssetAmountRemaining > leftTakerAssetAmountRemaining;\n\n // Calculate the maximum fill results for the maker and taker assets. At least one of the orders will be fully filled.\n //\n // The maximum that the left maker can possibly buy is the amount that the right order can sell.\n // The maximum that the right maker can possibly buy is the amount that the left order can sell.\n //\n // If the left order is fully filled, profit will be paid out in the left maker asset. If the right order is fully filled,\n // the profit will be out in the right maker asset.\n //\n // There are three cases to consider:\n // Case 1.\n // If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n // Case 2.\n // If the right maker can buy more than the left maker can sell, then only the right order is fully filled.\n // Case 3.\n // If the right maker can sell the max of what the left maker can buy and the left maker can sell the max of\n // what the right maker can buy, then both orders are fully filled.\n if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n // Case 1: Right order is fully filled with the profit paid in the left makerAsset\n matchedFillResults = _calculateCompleteRightFill(\n leftOrder,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else if (rightTakerAssetAmountRemaining > leftMakerAssetAmountRemaining) {\n // Case 2: Left order is fully filled with the profit paid in the right makerAsset.\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n // Round down to ensure the right maker's exchange rate does not exceed the price specified by the order.\n // We favor the right maker when the exchange rate must be rounded and the profit is being paid in the\n // right maker asset.\n matchedFillResults.right.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n leftMakerAssetAmountRemaining\n );\n matchedFillResults.right.takerAssetFilledAmount = leftMakerAssetAmountRemaining;\n } else {\n // Case 3: The right and left orders are fully filled\n matchedFillResults = _calculateCompleteFillBoth(\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Calculate amount given to taker in the left order's maker asset if the left spread will be part of the profit.\n if (doesLeftMakerAssetProfitExist) {\n matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n matchedFillResults.right.takerAssetFilledAmount\n );\n }\n\n // Calculate amount given to taker in the right order's maker asset if the right spread will be part of the profit.\n if (doesRightMakerAssetProfitExist) {\n matchedFillResults.profitInRightMakerAsset = matchedFillResults.right.makerAssetFilledAmount.safeSub(\n matchedFillResults.left.takerAssetFilledAmount\n );\n }\n\n return matchedFillResults;\n }\n\n /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n /// to the fillResults that are being collected on the order. Both orders will be fully filled in this\n /// case.\n /// @param leftMakerAssetAmountRemaining The amount of the left maker asset that is remaining to be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left taker asset that is remaining to be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n function _calculateCompleteFillBoth(\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Calculate the fully filled results for both orders.\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n return matchedFillResults;\n }\n\n /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n /// to the fillResults that are being collected on the order.\n /// @param leftOrder The left order that is being maximally filled. All of the information about fill amounts\n /// can be derived from this order and the right asset remaining fields.\n /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n function _calculateCompleteRightFill(\n LibOrder.Order memory leftOrder,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = rightMakerAssetAmountRemaining;\n // Round down to ensure the left maker's exchange rate does not exceed the price specified by the order.\n // We favor the left maker when the exchange rate must be rounded and the profit is being paid in the\n // left maker asset.\n matchedFillResults.left.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n leftOrder.makerAssetAmount,\n leftOrder.takerAssetAmount,\n rightMakerAssetAmountRemaining\n );\n\n return matchedFillResults;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n", - "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n using LibSafeMath for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/IProtocolFees.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IProtocolFees {\n\n // Logs updates to the protocol fee multiplier.\n event ProtocolFeeMultiplier(uint256 oldProtocolFeeMultiplier, uint256 updatedProtocolFeeMultiplier);\n\n // Logs updates to the protocolFeeCollector address.\n event ProtocolFeeCollectorAddress(address oldProtocolFeeCollector, address updatedProtocolFeeCollector);\n\n /// @dev Allows the owner to update the protocol fee multiplier.\n /// @param updatedProtocolFeeMultiplier The updated protocol fee multiplier.\n function setProtocolFeeMultiplier(uint256 updatedProtocolFeeMultiplier)\n external;\n\n /// @dev Allows the owner to update the protocolFeeCollector address.\n /// @param updatedProtocolFeeCollector The updated protocolFeeCollector contract address.\n function setProtocolFeeCollectorAddress(address updatedProtocolFeeCollector)\n external;\n\n /// @dev Returns the protocolFeeMultiplier\n function protocolFeeMultiplier()\n external\n view\n returns (uint256);\n\n /// @dev Returns the protocolFeeCollector address\n function protocolFeeCollector()\n external\n view\n returns (address);\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point, and\n /// the matcher receives a profit denominated in the left maker asset.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrders(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrdersWithMaximalFill(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled by maker and taker of matched orders.\n function matchOrdersWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ISignatureValidator {\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Wallet, // 0x04\n Validator, // 0x05\n PreSigned, // 0x06\n EIP1271Wallet, // 0x07\n NSignatureTypes // 0x08, number of signature types. Always leave at end.\n }\n\n event SignatureValidatorApproval(\n address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.\n address indexed validatorAddress, // Address of signature validator contract.\n bool isApproved // Approval or disapproval of validator contract.\n );\n\n /// @dev Approves a hash on-chain.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param hash Any 32-byte hash.\n function preSign(bytes32 hash)\n external\n payable;\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n payable;\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32-byte hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid `true` if the signature is valid for the given hash and signer.\n function isValidHashSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n\n /// @dev Verifies that a signature for an order is valid.\n /// @param order The order.\n /// @param signature Proof that the order has been signed by signer.\n /// @return isValid true if the signature is valid for the given order and signer.\n function isValidOrderSignature(\n LibOrder.Order memory order,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n\n /// @dev Verifies that a signature for a transaction is valid.\n /// @param transaction The transaction.\n /// @param signature Proof that the order has been signed by signer.\n /// @return isValid true if the signature is valid for the given transaction and signer.\n function isValidTransactionSignature(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n\n /// @dev Verifies that an order, with provided order hash, has been signed\n /// by the given signer.\n /// @param order The order.\n /// @param orderHash The hash of the order.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid True if the signature is valid for the given order and signer.\n function _isValidOrderWithHashSignature(\n LibOrder.Order memory order,\n bytes32 orderHash,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid);\n\n /// @dev Verifies that a transaction, with provided order hash, has been signed\n /// by the given signer.\n /// @param transaction The transaction.\n /// @param transactionHash The hash of the transaction.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid True if the signature is valid for the given transaction and signer.\n function _isValidTransactionWithHashSignature(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes32 transactionHash,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid);\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ITransactions {\n\n // TransactionExecution event is emitted when a ZeroExTransaction is executed.\n event TransactionExecution(bytes32 indexed transactionHash);\n\n /// @dev Executes an Exchange method call in the context of signer.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param signature Proof that transaction has been signed by signer.\n /// @return ABI encoded return data of the underlying Exchange function call.\n function executeTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n public\n payable\n returns (bytes memory);\n\n /// @dev Executes a batch of Exchange method calls in the context of signer(s).\n /// @param transactions Array of 0x transactions containing salt, signerAddress, and data.\n /// @param signatures Array of proofs that transactions have been signed by signer(s).\n /// @return Array containing ABI encoded return data for each of the underlying Exchange function calls.\n function batchExecuteTransactions(\n LibZeroExTransaction.ZeroExTransaction[] memory transactions,\n bytes[] memory signatures\n )\n public\n payable\n returns (bytes[] memory);\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function _getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/IAssetProxyDispatcher.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IAssetProxyDispatcher {\n\n // Logs registration of new asset proxy\n event AssetProxyRegistered(\n bytes4 id, // Id of new registered AssetProxy.\n address assetProxy // Address of new registered AssetProxy.\n );\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Array of amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults[] memory fillResults);\n\n /// @dev Executes multiple calls of fillOrKillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Array of amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults[] memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Array of amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults[] memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// If any fill reverts, the error is caught and ignored.\n /// NOTE: This function does not enforce that the takerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// If any fill reverts, the error is caught and ignored.\n /// NOTE: This function does not enforce that the makerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.\n /// NOTE: This function does not enforce that the takerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Minimum amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersFillOrKill(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.\n /// NOTE: This function does not enforce that the makerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Minimum amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersFillOrKill(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Executes multiple calls of cancelOrder.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n payable;\n}\n", - "@0x/contracts-exchange/contracts/src/interfaces/ITransferSimulator.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ncontract ITransferSimulator {\n\n /// @dev This function may be used to simulate any amount of transfers\n /// As they would occur through the Exchange contract. Note that this function\n /// will always revert, even if all transfers are successful. However, it may\n /// be used with eth_call or with a try/catch pattern in order to simulate\n /// the results of the transfers.\n /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n /// @param fromAddresses Array containing the `from` addresses that correspond with each transfer.\n /// @param toAddresses Array containing the `to` addresses that correspond with each transfer.\n /// @param amounts Array containing the amounts that correspond to each transfer.\n /// @return This function does not return a value. However, it will always revert with\n /// `Error(\"TRANSFERS_SUCCESSFUL\")` if all of the transfers were successful.\n function simulateDispatchTransferFromCalls(\n bytes[] memory assetData,\n address[] memory fromAddresses,\n address[] memory toAddresses,\n uint256[] memory amounts\n )\n public;\n}\n", - "src/LibAssetData.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol\";\nimport \"@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetProxy.sol\";\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"@0x/contracts-erc721/contracts/src/interfaces/IERC721Token.sol\";\nimport \"@0x/contracts-erc1155/contracts/src/interfaces/IERC1155.sol\";\n\n\ncontract LibAssetData {\n\n // 2^256 - 1\n uint256 constant internal _MAX_UINT256 = uint256(-1);\n\n using LibBytes for bytes;\n\n // solhint-disable var-name-mixedcase\n IExchange internal _EXCHANGE;\n address internal _ERC20_PROXY_ADDRESS;\n address internal _ERC721_PROXY_ADDRESS;\n address internal _ERC1155_PROXY_ADDRESS;\n address internal _STATIC_CALL_PROXY_ADDRESS;\n // solhint-enable var-name-mixedcase\n\n constructor (address _exchange)\n public\n {\n _EXCHANGE = IExchange(_exchange);\n _ERC20_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).ERC20Token.selector);\n _ERC721_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).ERC721Token.selector);\n _ERC1155_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).ERC1155Assets.selector);\n _STATIC_CALL_PROXY_ADDRESS = _EXCHANGE.getAssetProxy(IAssetData(address(0)).StaticCall.selector);\n }\n\n /// @dev Returns the owner's balance of the assets(s) specified in\n /// assetData. When the asset data contains multiple assets (eg in\n /// ERC1155 or Multi-Asset), the return value indicates how many\n /// complete \"baskets\" of those assets are owned by owner.\n /// @param ownerAddress Owner of the assets specified by assetData.\n /// @param assetData Details of asset, encoded per the AssetProxy contract specification.\n /// @return Number of assets (or asset baskets) held by owner.\n function getBalance(address ownerAddress, bytes memory assetData)\n public\n view\n returns (uint256 balance)\n {\n // Get id of AssetProxy contract\n bytes4 assetProxyId = assetData.readBytes4(0);\n\n if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) {\n // Get ERC20 token address\n address tokenAddress = assetData.readAddress(16);\n\n // Encode data for `balanceOf(ownerAddress)`\n bytes memory balanceOfData = abi.encodeWithSelector(\n IERC20Token(address(0)).balanceOf.selector,\n ownerAddress\n );\n\n // Query balance\n (bool success, bytes memory returnData) = tokenAddress.staticcall(balanceOfData);\n balance = success && returnData.length == 32 ? returnData.readUint256(0) : 0;\n } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) {\n // Get ERC721 token address and id\n (, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData);\n\n // Check if id is owned by ownerAddress\n bytes memory ownerOfCalldata = abi.encodeWithSelector(\n IERC721Token(address(0)).ownerOf.selector,\n tokenId\n );\n\n (bool success, bytes memory returnData) = tokenAddress.staticcall(ownerOfCalldata);\n address currentOwnerAddress = (success && returnData.length == 32) ? returnData.readAddress(12) : address(0);\n balance = currentOwnerAddress == ownerAddress ? 1 : 0;\n } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) {\n // Get ERC1155 token address, array of ids, and array of values\n (, address tokenAddress, uint256[] memory tokenIds, uint256[] memory tokenValues,) = decodeERC1155AssetData(assetData);\n\n uint256 length = tokenIds.length;\n for (uint256 i = 0; i != length; i++) {\n // Encode data for `balanceOf(ownerAddress, tokenIds[i])\n bytes memory balanceOfData = abi.encodeWithSelector(\n IERC1155(address(0)).balanceOf.selector,\n ownerAddress,\n tokenIds[i]\n );\n\n // Query balance\n (bool success, bytes memory returnData) = tokenAddress.staticcall(balanceOfData);\n uint256 totalBalance = success && returnData.length == 32 ? returnData.readUint256(0) : 0;\n\n // Scale total balance down by corresponding value in assetData\n uint256 scaledBalance = totalBalance / tokenValues[i];\n if (scaledBalance < balance || balance == 0) {\n balance = scaledBalance;\n }\n }\n } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) {\n // Encode data for `staticCallProxy.transferFrom(assetData,...)`\n bytes memory transferFromData = abi.encodeWithSelector(\n IAssetProxy(address(0)).transferFrom.selector,\n assetData,\n address(0), // `from` address is not used\n address(0), // `to` address is not used\n 0 // `amount` is not used\n );\n\n // Check if staticcall would be successful\n (bool success,) = _STATIC_CALL_PROXY_ADDRESS.staticcall(transferFromData);\n\n // Success means that the staticcall can be made an unlimited amount of times\n balance = success ? _MAX_UINT256 : 0;\n } else if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) {\n // Get array of values and array of assetDatas\n (, uint256[] memory assetAmounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData);\n\n uint256 length = nestedAssetData.length;\n for (uint256 i = 0; i != length; i++) {\n // Query balance of individual assetData\n uint256 totalBalance = getBalance(ownerAddress, nestedAssetData[i]);\n\n // Scale total balance down by corresponding value in assetData\n uint256 scaledBalance = totalBalance / assetAmounts[i];\n if (scaledBalance < balance || balance == 0) {\n balance = scaledBalance;\n }\n }\n }\n\n // Balance will be 0 if assetProxyId is unknown\n return balance;\n }\n\n /// @dev Calls getBalance() for each element of assetData.\n /// @param ownerAddress Owner of the assets specified by assetData.\n /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n /// @return Array of asset balances from getBalance(), with each element\n /// corresponding to the same-indexed element in the assetData input.\n function getBatchBalances(address ownerAddress, bytes[] memory assetData)\n public\n view\n returns (uint256[] memory balances)\n {\n uint256 length = assetData.length;\n balances = new uint256[](length);\n for (uint256 i = 0; i != length; i++) {\n balances[i] = getBalance(ownerAddress, assetData[i]);\n }\n return balances;\n }\n\n /// @dev Returns the number of asset(s) (described by assetData) that\n /// the corresponding AssetProxy contract is authorized to spend. When the asset data contains\n /// multiple assets (eg for Multi-Asset), the return value indicates\n /// how many complete \"baskets\" of those assets may be spent by all of the corresponding\n /// AssetProxy contracts.\n /// @param ownerAddress Owner of the assets specified by assetData.\n /// @param assetData Details of asset, encoded per the AssetProxy contract specification.\n /// @return Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend.\n function getAssetProxyAllowance(address ownerAddress, bytes memory assetData)\n public\n view\n returns (uint256 allowance)\n {\n // Get id of AssetProxy contract\n bytes4 assetProxyId = assetData.readBytes4(0);\n\n if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) {\n // Get array of values and array of assetDatas\n (, uint256[] memory amounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData);\n\n uint256 length = nestedAssetData.length;\n for (uint256 i = 0; i != length; i++) {\n // Query allowance of individual assetData\n uint256 totalAllowance = getAssetProxyAllowance(ownerAddress, nestedAssetData[i]);\n\n // Scale total allowance down by corresponding value in assetData\n uint256 scaledAllowance = totalAllowance / amounts[i];\n if (scaledAllowance < allowance || allowance == 0) {\n allowance = scaledAllowance;\n }\n }\n return allowance;\n }\n\n if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) {\n // Get ERC20 token address\n address tokenAddress = assetData.readAddress(16);\n\n // Encode data for `allowance(ownerAddress, _ERC20_PROXY_ADDRESS)`\n bytes memory allowanceData = abi.encodeWithSelector(\n IERC20Token(address(0)).allowance.selector,\n ownerAddress,\n _ERC20_PROXY_ADDRESS\n );\n\n // Query allowance\n (bool success, bytes memory returnData) = tokenAddress.staticcall(allowanceData);\n allowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0;\n } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) {\n // Get ERC721 token address and id\n (, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData);\n\n // Encode data for `isApprovedForAll(ownerAddress, _ERC721_PROXY_ADDRESS)`\n bytes memory isApprovedForAllData = abi.encodeWithSelector(\n IERC721Token(address(0)).isApprovedForAll.selector,\n ownerAddress,\n _ERC721_PROXY_ADDRESS\n );\n\n (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData);\n\n // If not approved for all, call `getApproved(tokenId)`\n if (!success || returnData.length != 32 || returnData.readUint256(0) != 1) {\n // Encode data for `getApproved(tokenId)`\n bytes memory getApprovedData = abi.encodeWithSelector(IERC721Token(address(0)).getApproved.selector, tokenId);\n (success, returnData) = tokenAddress.staticcall(getApprovedData);\n\n // Allowance is 1 if successful and the approved address is the ERC721Proxy\n allowance = success && returnData.length == 32 && returnData.readAddress(12) == _ERC721_PROXY_ADDRESS ? 1 : 0;\n } else {\n // Allowance is 2^256 - 1 if `isApprovedForAll` returned true\n allowance = _MAX_UINT256;\n }\n } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) {\n // Get ERC1155 token address\n (, address tokenAddress, , , ) = decodeERC1155AssetData(assetData);\n\n // Encode data for `isApprovedForAll(ownerAddress, _ERC1155_PROXY_ADDRESS)`\n bytes memory isApprovedForAllData = abi.encodeWithSelector(\n IERC1155(address(0)).isApprovedForAll.selector,\n ownerAddress,\n _ERC1155_PROXY_ADDRESS\n );\n\n // Query allowance\n (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData);\n allowance = success && returnData.length == 32 && returnData.readUint256(0) == 1 ? _MAX_UINT256 : 0;\n } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) {\n // The StaticCallProxy does not require any approvals\n allowance = _MAX_UINT256;\n }\n\n // Allowance will be 0 if the assetProxyId is unknown\n return allowance;\n }\n\n /// @dev Calls getAssetProxyAllowance() for each element of assetData.\n /// @param ownerAddress Owner of the assets specified by assetData.\n /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n /// @return An array of asset allowances from getAllowance(), with each\n /// element corresponding to the same-indexed element in the assetData input.\n function getBatchAssetProxyAllowances(address ownerAddress, bytes[] memory assetData)\n public\n view\n returns (uint256[] memory allowances)\n {\n uint256 length = assetData.length;\n allowances = new uint256[](length);\n for (uint256 i = 0; i != length; i++) {\n allowances[i] = getAssetProxyAllowance(ownerAddress, assetData[i]);\n }\n return allowances;\n }\n\n /// @dev Calls getBalance() and getAllowance() for assetData.\n /// @param ownerAddress Owner of the assets specified by assetData.\n /// @param assetData Details of asset, encoded per the AssetProxy contract specification.\n /// @return Number of assets (or asset baskets) held by owner, and number\n /// of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend.\n function getBalanceAndAssetProxyAllowance(address ownerAddress, bytes memory assetData)\n public\n view\n returns (uint256 balance, uint256 allowance)\n {\n balance = getBalance(ownerAddress, assetData);\n allowance = getAssetProxyAllowance(ownerAddress, assetData);\n return (balance, allowance);\n }\n\n /// @dev Calls getBatchBalances() and getBatchAllowances() for each element of assetData.\n /// @param ownerAddress Owner of the assets specified by assetData.\n /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n /// @return An array of asset balances from getBalance(), and an array of\n /// asset allowances from getAllowance(), with each element\n /// corresponding to the same-indexed element in the assetData input.\n function getBatchBalancesAndAssetProxyAllowances(address ownerAddress, bytes[] memory assetData)\n public\n view\n returns (uint256[] memory balances, uint256[] memory allowances)\n {\n balances = getBatchBalances(ownerAddress, assetData);\n allowances = getBatchAssetProxyAllowances(ownerAddress, assetData);\n return (balances, allowances);\n }\n\n /// @dev Decode AssetProxy identifier\n /// @param assetData AssetProxy-compliant asset data describing an ERC-20, ERC-721, ERC1155, or MultiAsset asset.\n /// @return The AssetProxy identifier\n function decodeAssetProxyId(bytes memory assetData)\n public\n pure\n returns (\n bytes4 assetProxyId\n )\n {\n assetProxyId = assetData.readBytes4(0);\n\n require(\n assetProxyId == IAssetData(address(0)).ERC20Token.selector ||\n assetProxyId == IAssetData(address(0)).ERC721Token.selector ||\n assetProxyId == IAssetData(address(0)).ERC1155Assets.selector ||\n assetProxyId == IAssetData(address(0)).MultiAsset.selector ||\n assetProxyId == IAssetData(address(0)).StaticCall.selector,\n \"WRONG_PROXY_ID\"\n );\n return assetProxyId;\n }\n\n /// @dev Encode ERC-20 asset data into the format described in the AssetProxy contract specification.\n /// @param tokenAddress The address of the ERC-20 contract hosting the asset to be traded.\n /// @return AssetProxy-compliant data describing the asset.\n function encodeERC20AssetData(address tokenAddress)\n public\n pure\n returns (bytes memory assetData)\n {\n assetData = abi.encodeWithSelector(IAssetData(address(0)).ERC20Token.selector, tokenAddress);\n return assetData;\n }\n\n /// @dev Decode ERC-20 asset data from the format described in the AssetProxy contract specification.\n /// @param assetData AssetProxy-compliant asset data describing an ERC-20 asset.\n /// @return The AssetProxy identifier, and the address of the ERC-20\n /// contract hosting this asset.\n function decodeERC20AssetData(bytes memory assetData)\n public\n pure\n returns (\n bytes4 assetProxyId,\n address tokenAddress\n )\n {\n assetProxyId = assetData.readBytes4(0);\n\n require(\n assetProxyId == IAssetData(address(0)).ERC20Token.selector,\n \"WRONG_PROXY_ID\"\n );\n\n tokenAddress = assetData.readAddress(16);\n return (assetProxyId, tokenAddress);\n }\n\n /// @dev Encode ERC-721 asset data into the format described in the AssetProxy specification.\n /// @param tokenAddress The address of the ERC-721 contract hosting the asset to be traded.\n /// @param tokenId The identifier of the specific asset to be traded.\n /// @return AssetProxy-compliant asset data describing the asset.\n function encodeERC721AssetData(address tokenAddress, uint256 tokenId)\n public\n pure\n returns (bytes memory assetData)\n {\n assetData = abi.encodeWithSelector(\n IAssetData(address(0)).ERC721Token.selector,\n tokenAddress,\n tokenId\n );\n return assetData;\n }\n\n /// @dev Decode ERC-721 asset data from the format described in the AssetProxy contract specification.\n /// @param assetData AssetProxy-compliant asset data describing an ERC-721 asset.\n /// @return The ERC-721 AssetProxy identifier, the address of the ERC-721\n /// contract hosting this asset, and the identifier of the specific\n /// asset to be traded.\n function decodeERC721AssetData(bytes memory assetData)\n public\n pure\n returns (\n bytes4 assetProxyId,\n address tokenAddress,\n uint256 tokenId\n )\n {\n assetProxyId = assetData.readBytes4(0);\n\n require(\n assetProxyId == IAssetData(address(0)).ERC721Token.selector,\n \"WRONG_PROXY_ID\"\n );\n\n tokenAddress = assetData.readAddress(16);\n tokenId = assetData.readUint256(36);\n return (assetProxyId, tokenAddress, tokenId);\n }\n\n /// @dev Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.\n /// @param tokenAddress The address of the ERC-1155 contract hosting the asset(s) to be traded.\n /// @param tokenIds The identifiers of the specific assets to be traded.\n /// @param tokenValues The amounts of each asset to be traded.\n /// @param callbackData Data to be passed to receiving contracts when a transfer is performed.\n /// @return AssetProxy-compliant asset data describing the set of assets.\n function encodeERC1155AssetData(\n address tokenAddress,\n uint256[] memory tokenIds,\n uint256[] memory tokenValues,\n bytes memory callbackData\n )\n public\n pure\n returns (bytes memory assetData)\n {\n assetData = abi.encodeWithSelector(\n IAssetData(address(0)).ERC1155Assets.selector,\n tokenAddress,\n tokenIds,\n tokenValues,\n callbackData\n );\n return assetData;\n }\n\n /// @dev Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.\n /// @param assetData AssetProxy-compliant asset data describing an ERC-1155 set of assets.\n /// @return The ERC-1155 AssetProxy identifier, the address of the ERC-1155\n /// contract hosting the assets, an array of the identifiers of the\n /// assets to be traded, an array of asset amounts to be traded, and\n /// callback data. Each element of the arrays corresponds to the\n /// same-indexed element of the other array. Return values specified as\n /// `memory` are returned as pointers to locations within the memory of\n /// the input parameter `assetData`.\n function decodeERC1155AssetData(bytes memory assetData)\n public\n pure\n returns (\n bytes4 assetProxyId,\n address tokenAddress,\n uint256[] memory tokenIds,\n uint256[] memory tokenValues,\n bytes memory callbackData\n )\n {\n assetProxyId = assetData.readBytes4(0);\n\n require(\n assetProxyId == IAssetData(address(0)).ERC1155Assets.selector,\n \"WRONG_PROXY_ID\"\n );\n\n assembly {\n // Skip selector and length to get to the first parameter:\n assetData := add(assetData, 36)\n // Read the value of the first parameter:\n tokenAddress := mload(assetData)\n // Point to the next parameter's data:\n tokenIds := add(assetData, mload(add(assetData, 32)))\n // Point to the next parameter's data:\n tokenValues := add(assetData, mload(add(assetData, 64)))\n // Point to the next parameter's data:\n callbackData := add(assetData, mload(add(assetData, 96)))\n }\n\n return (\n assetProxyId,\n tokenAddress,\n tokenIds,\n tokenValues,\n callbackData\n );\n }\n\n /// @dev Encode data for multiple assets, per the AssetProxy contract specification.\n /// @param amounts The amounts of each asset to be traded.\n /// @param nestedAssetData AssetProxy-compliant data describing each asset to be traded.\n /// @return AssetProxy-compliant data describing the set of assets.\n function encodeMultiAssetData(uint256[] memory amounts, bytes[] memory nestedAssetData)\n public\n pure\n returns (bytes memory assetData)\n {\n assetData = abi.encodeWithSelector(\n IAssetData(address(0)).MultiAsset.selector,\n amounts,\n nestedAssetData\n );\n return assetData;\n }\n\n /// @dev Decode multi-asset data from the format described in the AssetProxy contract specification.\n /// @param assetData AssetProxy-compliant data describing a multi-asset basket.\n /// @return The Multi-Asset AssetProxy identifier, an array of the amounts\n /// of the assets to be traded, and an array of the\n /// AssetProxy-compliant data describing each asset to be traded. Each\n /// element of the arrays corresponds to the same-indexed element of the other array.\n function decodeMultiAssetData(bytes memory assetData)\n public\n pure\n returns (\n bytes4 assetProxyId,\n uint256[] memory amounts,\n bytes[] memory nestedAssetData\n )\n {\n assetProxyId = assetData.readBytes4(0);\n\n require(\n assetProxyId == IAssetData(address(0)).MultiAsset.selector,\n \"WRONG_PROXY_ID\"\n );\n\n // solhint-disable indent\n (amounts, nestedAssetData) = abi.decode(\n assetData.slice(4, assetData.length),\n (uint256[], bytes[])\n );\n // solhint-enable indent\n }\n\n /// @dev Encode StaticCall asset data into the format described in the AssetProxy contract specification.\n /// @param staticCallTargetAddress Target address of StaticCall.\n /// @param staticCallData Data that will be passed to staticCallTargetAddress in the StaticCall.\n /// @param expectedReturnDataHash Expected Keccak-256 hash of the StaticCall return data.\n /// @return AssetProxy-compliant asset data describing the set of assets.\n function encodeStaticCallAssetData(\n address staticCallTargetAddress,\n bytes memory staticCallData,\n bytes32 expectedReturnDataHash\n )\n public\n pure\n returns (bytes memory assetData)\n {\n assetData = abi.encodeWithSelector(\n IAssetData(address(0)).StaticCall.selector,\n staticCallTargetAddress,\n staticCallData,\n expectedReturnDataHash\n );\n return assetData;\n }\n\n /// @dev Decode StaticCall asset data from the format described in the AssetProxy contract specification.\n /// @param assetData AssetProxy-compliant asset data describing a StaticCall asset\n /// @return The StaticCall AssetProxy identifier, the target address of the StaticCAll, the data to be\n /// passed to the target address, and the expected Keccak-256 hash of the static call return data.\n function decodeStaticCallAssetData(bytes memory assetData)\n public\n pure\n returns (\n bytes4 assetProxyId,\n address staticCallTargetAddress,\n bytes memory staticCallData,\n bytes32 expectedReturnDataHash\n )\n {\n assetProxyId = assetData.readBytes4(0);\n\n require(\n assetProxyId == IAssetData(address(0)).StaticCall.selector,\n \"WRONG_PROXY_ID\"\n );\n\n (staticCallTargetAddress, staticCallData, expectedReturnDataHash) = abi.decode(\n assetData.slice(4, assetData.length),\n (address, bytes, bytes32)\n );\n }\n\n function revertIfInvalidAssetData(bytes memory assetData)\n public\n pure\n {\n bytes4 assetProxyId = assetData.readBytes4(0);\n\n if (assetProxyId == IAssetData(address(0)).ERC20Token.selector) {\n decodeERC20AssetData(assetData);\n } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) {\n decodeERC721AssetData(assetData);\n } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) {\n decodeERC1155AssetData(assetData);\n } else if (assetProxyId == IAssetData(address(0)).MultiAsset.selector) {\n decodeMultiAssetData(assetData);\n } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) {\n decodeStaticCallAssetData(assetData);\n } else {\n revert(\"WRONG_PROXY_ID\");\n }\n }\n}\n", - "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetData.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\n// solhint-disable\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\n// @dev Interface of the asset proxy's assetData.\n// The asset proxies take an ABI encoded `bytes assetData` as argument.\n// This argument is ABI encoded as one of the methods of this interface.\ninterface IAssetData {\n\n /// @dev Function signature for encoding ERC20 assetData.\n /// @param tokenAddress Address of ERC20Token contract.\n function ERC20Token(address tokenAddress)\n external;\n\n /// @dev Function signature for encoding ERC721 assetData.\n /// @param tokenAddress Address of ERC721 token contract.\n /// @param tokenId Id of ERC721 token to be transferred.\n function ERC721Token(\n address tokenAddress,\n uint256 tokenId\n )\n external;\n\n /// @dev Function signature for encoding ERC1155 assetData.\n /// @param tokenAddress Address of ERC1155 token contract.\n /// @param tokenIds Array of ids of tokens to be transferred.\n /// @param values Array of values that correspond to each token id to be transferred.\n /// Note that each value will be multiplied by the amount being filled in the order before transferring.\n /// @param callbackData Extra data to be passed to receiver's `onERC1155Received` callback function.\n function ERC1155Assets(\n address tokenAddress,\n uint256[] calldata tokenIds,\n uint256[] calldata values,\n bytes calldata callbackData\n )\n external;\n\n /// @dev Function signature for encoding MultiAsset assetData.\n /// @param values Array of amounts that correspond to each asset to be transferred.\n /// Note that each value will be multiplied by the amount being filled in the order before transferring.\n /// @param nestedAssetData Array of assetData fields that will be be dispatched to their correspnding AssetProxy contract.\n function MultiAsset(\n uint256[] calldata values,\n bytes[] calldata nestedAssetData\n )\n external;\n\n /// @dev Function signature for encoding StaticCall assetData.\n /// @param staticCallTargetAddress Address that will execute the staticcall.\n /// @param staticCallData Data that will be executed via staticcall on the staticCallTargetAddress.\n /// @param expectedReturnDataHash Keccak-256 hash of the expected staticcall return data.\n function StaticCall(\n address staticCallTargetAddress,\n bytes calldata staticCallData,\n bytes32 expectedReturnDataHash\n )\n external;\n\n /// @dev Function signature for encoding ERC20Bridge assetData.\n /// @param tokenAddress Address of token to transfer.\n /// @param bridgeAddress Address of the bridge contract.\n /// @param bridgeData Arbitrary data to be passed to the bridge contract.\n function ERC20Bridge(\n address tokenAddress,\n address bridgeAddress,\n bytes calldata bridgeData\n )\n external;\n}\n", - "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetProxy.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IAssetProxy {\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes calldata assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n", - "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address _to, uint256 _value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address _spender, uint256 _value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256);\n}\n", - "@0x/contracts-erc721/contracts/src/interfaces/IERC721Token.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC721Token {\n\n /// @dev This emits when ownership of any NFT changes by any mechanism.\n /// This event emits when NFTs are created (`from` == 0) and destroyed\n /// (`to` == 0). Exception: during contract creation, any number of NFTs\n /// may be created and assigned without emitting Transfer. At the time of\n /// any transfer, the approved address for that NFT (if any) is reset to none.\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 indexed _tokenId\n );\n\n /// @dev This emits when the approved address for an NFT is changed or\n /// reaffirmed. The zero address indicates there is no approved address.\n /// When a Transfer event emits, this also indicates that the approved\n /// address for that NFT (if any) is reset to none.\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 indexed _tokenId\n );\n\n /// @dev This emits when an operator is enabled or disabled for an owner.\n /// The operator can manage all NFTs of the owner.\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// perator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT. When transfer is complete, this function\n /// checks if `_to` is a smart contract (code size > 0). If so, it calls\n /// `onERC721Received` on `_to` and throws if the return value is not\n /// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n /// @param _data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes calldata _data\n )\n external;\n\n /// @notice Transfers the ownership of an NFT from one address to another address\n /// @dev This works identically to the other function with an extra data parameter,\n /// except this function just sets data to \"\".\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external;\n\n /// @notice Change or reaffirm the approved address for an NFT\n /// @dev The zero address indicates there is no approved address.\n /// Throws unless `msg.sender` is the current NFT owner, or an authorized\n /// operator of the current owner.\n /// @param _approved The new approved NFT controller\n /// @param _tokenId The NFT to approve\n function approve(address _approved, uint256 _tokenId)\n external;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage\n /// all of `msg.sender`'s assets\n /// @dev Emits the ApprovalForAll event. The contract MUST allow\n /// multiple operators per owner.\n /// @param _operator Address to add to the set of authorized operators\n /// @param _approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address _operator, bool _approved)\n external;\n\n /// @notice Count all NFTs assigned to an owner\n /// @dev NFTs assigned to the zero address are considered invalid, and this\n /// function throws for queries about the zero address.\n /// @param _owner An address for whom to query the balance\n /// @return The number of NFTs owned by `_owner`, possibly zero\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE\n /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE\n /// THEY MAY BE PERMANENTLY LOST\n /// @dev Throws unless `msg.sender` is the current owner, an authorized\n /// operator, or the approved address for this NFT. Throws if `_from` is\n /// not the current owner. Throws if `_to` is the zero address. Throws if\n /// `_tokenId` is not a valid NFT.\n /// @param _from The current owner of the NFT\n /// @param _to The new owner\n /// @param _tokenId The NFT to transfer\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n /// @notice Find the owner of an NFT\n /// @dev NFTs assigned to zero address are considered invalid, and queries\n /// about them do throw.\n /// @param _tokenId The identifier for an NFT\n /// @return The address of the owner of the NFT\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address);\n\n /// @notice Get the approved address for a single NFT\n /// @dev Throws if `_tokenId` is not a valid NFT.\n /// @param _tokenId The NFT to find the approved address for\n /// @return The approved address for this NFT, or the zero address if there is none\n function getApproved(uint256 _tokenId) \n public\n view\n returns (address);\n \n /// @notice Query if an address is an authorized operator for another address\n /// @param _owner The address that owns the NFTs\n /// @param _operator The address that acts on behalf of the owner\n /// @return True if `_operator` is an approved operator for `_owner`, false otherwise\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n}\n", - "@0x/contracts-erc1155/contracts/src/interfaces/IERC1155.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\n/// @title ERC-1155 Multi Token Standard\n/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md\n/// Note: The ERC-165 identifier for this interface is 0xd9b67a26.\ninterface IERC1155 {\n \n /// @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred,\n /// including zero value transfers as well as minting or burning.\n /// Operator will always be msg.sender.\n /// Either event from address `0x0` signifies a minting operation.\n /// An event to address `0x0` signifies a burning or melting operation.\n /// The total value transferred from address 0x0 minus the total value transferred to 0x0 may\n /// be used by clients and exchanges to be added to the \"circulating supply\" for a given token ID.\n /// To define a token ID with no initial balance, the contract SHOULD emit the TransferSingle event\n /// from `0x0` to `0x0`, with the token creator as `_operator`.\n event TransferSingle(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256 id,\n uint256 value\n );\n\n /// @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred,\n /// including zero value transfers as well as minting or burning.\n ///Operator will always be msg.sender.\n /// Either event from address `0x0` signifies a minting operation.\n /// An event to address `0x0` signifies a burning or melting operation.\n /// The total value transferred from address 0x0 minus the total value transferred to 0x0 may\n /// be used by clients and exchanges to be added to the \"circulating supply\" for a given token ID.\n /// To define multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event\n /// from `0x0` to `0x0`, with the token creator as `_operator`.\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /// @dev MUST emit when an approval is updated.\n event ApprovalForAll(\n address indexed owner,\n address indexed operator,\n bool approved\n );\n\n /// @dev MUST emit when the URI is updated for a token ID.\n /// URIs are defined in RFC 3986.\n /// The URI MUST point a JSON file that conforms to the \"ERC-1155 Metadata JSON Schema\".\n event URI(\n string value,\n uint256 indexed id\n );\n\n /// @notice Transfers value amount of an _id from the _from address to the _to address specified.\n /// @dev MUST emit TransferSingle event on success.\n /// Caller must be approved to manage the _from account's tokens (see isApprovedForAll).\n /// MUST throw if `_to` is the zero address.\n /// MUST throw if balance of sender for token `_id` is lower than the `_value` sent.\n /// MUST throw on any other error.\n /// When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0).\n /// If so, it MUST call `onERC1155Received` on `_to` and revert if the return value\n /// is not `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`.\n /// @param from Source address\n /// @param to Target address\n /// @param id ID of the token type\n /// @param value Transfer amount\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 value,\n bytes calldata data\n )\n external;\n\n /// @notice Send multiple types of Tokens from a 3rd party in one transfer (with safety call).\n /// @dev MUST emit TransferBatch event on success.\n /// Caller must be approved to manage the _from account's tokens (see isApprovedForAll).\n /// MUST throw if `_to` is the zero address.\n /// MUST throw if length of `_ids` is not the same as length of `_values`.\n /// MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_values` sent.\n /// MUST throw on any other error.\n /// When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0).\n /// If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return value\n /// is not `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`.\n /// @param from Source addresses\n /// @param to Target addresses\n /// @param ids IDs of each token type\n /// @param values Transfer amounts per token type\n /// @param data Additional data with no specified format, sent in call to `_to`\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n )\n external;\n\n /// @notice Enable or disable approval for a third party (\"operator\") to manage all of the caller's tokens.\n /// @dev MUST emit the ApprovalForAll event on success.\n /// @param operator Address to add to the set of authorized operators\n /// @param approved True if the operator is approved, false to revoke approval\n function setApprovalForAll(address operator, bool approved) external;\n\n /// @notice Queries the approval status of an operator for a given owner.\n /// @param owner The owner of the Tokens\n /// @param operator Address of authorized operator\n /// @return True if the operator is approved, false if not\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n\n /// @notice Get the balance of an account's Tokens.\n /// @param owner The address of the token holder\n /// @param id ID of the Token\n /// @return The _owner's balance of the Token type requested\n function balanceOf(address owner, uint256 id) external view returns (uint256);\n\n /// @notice Get the balance of multiple account/token pairs\n /// @param owners The addresses of the token holders\n /// @param ids ID of the Tokens\n /// @return The _owner's balance of the Token types requested\n function balanceOfBatch(\n address[] calldata owners,\n uint256[] calldata ids\n )\n external\n view\n returns (uint256[] memory balances_);\n}\n", - "src/OrderTransferSimulationUtils.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.5;\npragma experimental ABIEncoderV2;\n\n\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"@0x/contracts-exchange/contracts/src/libs/LibExchangeRichErrorDecoder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\n\n\ncontract OrderTransferSimulationUtils is\n LibExchangeRichErrorDecoder\n{\n using LibBytes for bytes;\n\n enum OrderTransferResults {\n TakerAssetDataFailed, // Transfer of takerAsset failed\n MakerAssetDataFailed, // Transfer of makerAsset failed\n TakerFeeAssetDataFailed, // Transfer of takerFeeAsset failed\n MakerFeeAssetDataFailed, // Transfer of makerFeeAsset failed\n TransfersSuccessful // All transfers in the order were successful\n }\n\n // keccak256(abi.encodeWithSignature(\"Error(string)\", \"TRANSFERS_SUCCESSFUL\"));\n bytes32 constant internal _TRANSFERS_SUCCESSFUL_RESULT_HASH = 0xf43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0;\n\n // solhint-disable var-name-mixedcase\n IExchange internal _EXCHANGE;\n // solhint-enable var-name-mixedcase\n\n constructor (address _exchange)\n public\n {\n _EXCHANGE = IExchange(_exchange);\n }\n\n /// @dev Simulates the maker transfers within an order and returns the index of the first failed transfer.\n /// @param order The order to simulate transfers for.\n /// @param takerAddress The address of the taker that will fill the order.\n /// @param takerAssetFillAmount The amount of takerAsset that the taker wished to fill.\n /// @return The index of the first failed transfer (or 4 if all transfers are successful).\n function getSimulatedOrderMakerTransferResults(\n LibOrder.Order memory order,\n address takerAddress,\n uint256 takerAssetFillAmount\n )\n public\n returns (OrderTransferResults orderTransferResults)\n {\n LibFillResults.FillResults memory fillResults = LibFillResults.calculateFillResults(\n order,\n takerAssetFillAmount,\n _EXCHANGE.protocolFeeMultiplier(),\n tx.gasprice\n );\n\n bytes[] memory assetData = new bytes[](2);\n address[] memory fromAddresses = new address[](2);\n address[] memory toAddresses = new address[](2);\n uint256[] memory amounts = new uint256[](2);\n\n // Transfer `makerAsset` from maker to taker\n assetData[0] = order.makerAssetData;\n fromAddresses[0] = order.makerAddress;\n toAddresses[0] = takerAddress;\n amounts[0] = fillResults.makerAssetFilledAmount;\n\n // Transfer `makerFeeAsset` from maker to feeRecipient\n assetData[1] = order.makerFeeAssetData;\n fromAddresses[1] = order.makerAddress;\n toAddresses[1] = order.feeRecipientAddress;\n amounts[1] = fillResults.makerFeePaid;\n\n return _simulateTransferFromCalls(\n assetData,\n fromAddresses,\n toAddresses,\n amounts\n );\n }\n\n /// @dev Simulates all of the transfers within an order and returns the index of the first failed transfer.\n /// @param order The order to simulate transfers for.\n /// @param takerAddress The address of the taker that will fill the order.\n /// @param takerAssetFillAmount The amount of takerAsset that the taker wished to fill.\n /// @return The index of the first failed transfer (or 4 if all transfers are successful).\n function getSimulatedOrderTransferResults(\n LibOrder.Order memory order,\n address takerAddress,\n uint256 takerAssetFillAmount\n )\n public\n returns (OrderTransferResults orderTransferResults)\n {\n LibFillResults.FillResults memory fillResults = LibFillResults.calculateFillResults(\n order,\n takerAssetFillAmount,\n _EXCHANGE.protocolFeeMultiplier(),\n tx.gasprice\n );\n\n // Create input arrays\n bytes[] memory assetData = new bytes[](4);\n address[] memory fromAddresses = new address[](4);\n address[] memory toAddresses = new address[](4);\n uint256[] memory amounts = new uint256[](4);\n\n // Transfer `takerAsset` from taker to maker\n assetData[0] = order.takerAssetData;\n fromAddresses[0] = takerAddress;\n toAddresses[0] = order.makerAddress;\n amounts[0] = takerAssetFillAmount;\n\n // Transfer `makerAsset` from maker to taker\n assetData[1] = order.makerAssetData;\n fromAddresses[1] = order.makerAddress;\n toAddresses[1] = takerAddress;\n amounts[1] = fillResults.makerAssetFilledAmount;\n\n // Transfer `takerFeeAsset` from taker to feeRecipient\n assetData[2] = order.takerFeeAssetData;\n fromAddresses[2] = takerAddress;\n toAddresses[2] = order.feeRecipientAddress;\n amounts[2] = fillResults.takerFeePaid;\n\n // Transfer `makerFeeAsset` from maker to feeRecipient\n assetData[3] = order.makerFeeAssetData;\n fromAddresses[3] = order.makerAddress;\n toAddresses[3] = order.feeRecipientAddress;\n amounts[3] = fillResults.makerFeePaid;\n\n return _simulateTransferFromCalls(\n assetData,\n fromAddresses,\n toAddresses,\n amounts\n );\n }\n\n /// @dev Simulates all of the transfers for each given order and returns the indices of each first failed transfer.\n /// @param orders Array of orders to individually simulate transfers for.\n /// @param takerAddresses Array of addresses of takers that will fill each order.\n /// @param takerAssetFillAmounts Array of amounts of takerAsset that will be filled for each order.\n /// @return The indices of the first failed transfer (or 4 if all transfers are successful) for each order.\n function getSimulatedOrdersTransferResults(\n LibOrder.Order[] memory orders,\n address[] memory takerAddresses,\n uint256[] memory takerAssetFillAmounts\n )\n public\n returns (OrderTransferResults[] memory orderTransferResults)\n {\n uint256 length = orders.length;\n orderTransferResults = new OrderTransferResults[](length);\n for (uint256 i = 0; i != length; i++) {\n orderTransferResults[i] = getSimulatedOrderTransferResults(\n orders[i],\n takerAddresses[i],\n takerAssetFillAmounts[i]\n );\n }\n return orderTransferResults;\n }\n\n /// @dev Makes the simulation call with information about the transfers and processes\n /// the returndata.\n /// @param assetData The assetdata to use to make transfers.\n /// @param fromAddresses The addresses to transfer funds.\n /// @param toAddresses The addresses that will receive funds\n /// @param amounts The amounts involved in the transfer.\n function _simulateTransferFromCalls(\n bytes[] memory assetData,\n address[] memory fromAddresses,\n address[] memory toAddresses,\n uint256[] memory amounts\n )\n internal\n returns (OrderTransferResults orderTransferResults)\n {\n // Encode data for `simulateDispatchTransferFromCalls(assetData, fromAddresses, toAddresses, amounts)`\n bytes memory simulateDispatchTransferFromCallsData = abi.encodeWithSelector(\n IExchange(address(0)).simulateDispatchTransferFromCalls.selector,\n assetData,\n fromAddresses,\n toAddresses,\n amounts\n );\n\n // Perform call and catch revert\n (, bytes memory returnData) = address(_EXCHANGE).call(simulateDispatchTransferFromCallsData);\n\n bytes4 selector = returnData.readBytes4(0);\n if (selector == LibExchangeRichErrors.AssetProxyDispatchErrorSelector()) {\n // Decode AssetProxyDispatchError and return index of failed transfer\n (, bytes32 failedTransferIndex,) = decodeAssetProxyDispatchError(returnData);\n return OrderTransferResults(uint8(uint256(failedTransferIndex)));\n } else if (selector == LibExchangeRichErrors.AssetProxyTransferErrorSelector()) {\n // Decode AssetProxyTransferError and return index of failed transfer\n (bytes32 failedTransferIndex, ,) = decodeAssetProxyTransferError(returnData);\n return OrderTransferResults(uint8(uint256(failedTransferIndex)));\n } else if (keccak256(returnData) == _TRANSFERS_SUCCESSFUL_RESULT_HASH) {\n // All transfers were successful\n return OrderTransferResults.TransfersSuccessful;\n } else {\n revert(\"UNKNOWN_RETURN_DATA\");\n }\n }\n}\n", - "@0x/contracts-exchange/contracts/src/libs/LibExchangeRichErrorDecoder.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\n\n\ncontract LibExchangeRichErrorDecoder {\n\n using LibBytes for bytes;\n\n /// @dev Decompose an ABI-encoded SignatureError.\n /// @param encoded ABI-encoded revert error.\n /// @return errorCode The error code.\n /// @return signerAddress The expected signer of the hash.\n /// @return signature The full signature.\n function decodeSignatureError(bytes memory encoded)\n public\n pure\n returns (\n LibExchangeRichErrors.SignatureErrorCodes errorCode,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.SignatureErrorSelector());\n uint8 _errorCode;\n (_errorCode, hash, signerAddress, signature) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (uint8, bytes32, address, bytes)\n );\n errorCode = LibExchangeRichErrors.SignatureErrorCodes(_errorCode);\n }\n\n /// @dev Decompose an ABI-encoded SignatureValidatorError.\n /// @param encoded ABI-encoded revert error.\n /// @return signerAddress The expected signer of the hash.\n /// @return signature The full signature bytes.\n /// @return errorData The revert data thrown by the validator contract.\n function decodeEIP1271SignatureError(bytes memory encoded)\n public\n pure\n returns (\n address verifyingContractAddress,\n bytes memory data,\n bytes memory signature,\n bytes memory errorData\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.EIP1271SignatureErrorSelector());\n (verifyingContractAddress, data, signature, errorData) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (address, bytes, bytes, bytes)\n );\n }\n\n /// @dev Decompose an ABI-encoded SignatureValidatorNotApprovedError.\n /// @param encoded ABI-encoded revert error.\n /// @return signerAddress The expected signer of the hash.\n /// @return validatorAddress The expected validator.\n function decodeSignatureValidatorNotApprovedError(bytes memory encoded)\n public\n pure\n returns (\n address signerAddress,\n address validatorAddress\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.SignatureValidatorNotApprovedErrorSelector());\n (signerAddress, validatorAddress) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (address, address)\n );\n }\n\n /// @dev Decompose an ABI-encoded SignatureWalletError.\n /// @param encoded ABI-encoded revert error.\n /// @return errorCode The error code.\n /// @return signerAddress The expected signer of the hash.\n /// @return signature The full signature bytes.\n /// @return errorData The revert data thrown by the validator contract.\n function decodeSignatureWalletError(bytes memory encoded)\n public\n pure\n returns (\n bytes32 hash,\n address signerAddress,\n bytes memory signature,\n bytes memory errorData\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.SignatureWalletErrorSelector());\n (hash, signerAddress, signature, errorData) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (bytes32, address, bytes, bytes)\n );\n }\n\n /// @dev Decompose an ABI-encoded OrderStatusError.\n /// @param encoded ABI-encoded revert error.\n /// @return orderHash The order hash.\n /// @return orderStatus The order status.\n function decodeOrderStatusError(bytes memory encoded)\n public\n pure\n returns (\n bytes32 orderHash,\n LibOrder.OrderStatus orderStatus\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.OrderStatusErrorSelector());\n uint8 _orderStatus;\n (orderHash, _orderStatus) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (bytes32, uint8)\n );\n orderStatus = LibOrder.OrderStatus(_orderStatus);\n }\n\n /// @dev Decompose an ABI-encoded OrderStatusError.\n /// @param encoded ABI-encoded revert error.\n /// @return errorCode Error code that corresponds to invalid maker, taker, or sender.\n /// @return orderHash The order hash.\n /// @return contextAddress The maker, taker, or sender address\n function decodeExchangeInvalidContextError(bytes memory encoded)\n public\n pure\n returns (\n LibExchangeRichErrors.ExchangeContextErrorCodes errorCode,\n bytes32 orderHash,\n address contextAddress\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.ExchangeInvalidContextErrorSelector());\n uint8 _errorCode;\n (_errorCode, orderHash, contextAddress) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (uint8, bytes32, address)\n );\n errorCode = LibExchangeRichErrors.ExchangeContextErrorCodes(_errorCode);\n }\n\n /// @dev Decompose an ABI-encoded FillError.\n /// @param encoded ABI-encoded revert error.\n /// @return errorCode The error code.\n /// @return orderHash The order hash.\n function decodeFillError(bytes memory encoded)\n public\n pure\n returns (\n LibExchangeRichErrors.FillErrorCodes errorCode,\n bytes32 orderHash\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.FillErrorSelector());\n uint8 _errorCode;\n (_errorCode, orderHash) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (uint8, bytes32)\n );\n errorCode = LibExchangeRichErrors.FillErrorCodes(_errorCode);\n }\n\n /// @dev Decompose an ABI-encoded OrderEpochError.\n /// @param encoded ABI-encoded revert error.\n /// @return makerAddress The order maker.\n /// @return orderSenderAddress The order sender.\n /// @return currentEpoch The current epoch for the maker.\n function decodeOrderEpochError(bytes memory encoded)\n public\n pure\n returns (\n address makerAddress,\n address orderSenderAddress,\n uint256 currentEpoch\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.OrderEpochErrorSelector());\n (makerAddress, orderSenderAddress, currentEpoch) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (address, address, uint256)\n );\n }\n\n /// @dev Decompose an ABI-encoded AssetProxyExistsError.\n /// @param encoded ABI-encoded revert error.\n /// @return assetProxyId Id of asset proxy.\n /// @return assetProxyAddress The address of the asset proxy.\n function decodeAssetProxyExistsError(bytes memory encoded)\n public\n pure\n returns (\n bytes4 assetProxyId, address assetProxyAddress)\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.AssetProxyExistsErrorSelector());\n (assetProxyId, assetProxyAddress) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (bytes4, address)\n );\n }\n\n /// @dev Decompose an ABI-encoded AssetProxyDispatchError.\n /// @param encoded ABI-encoded revert error.\n /// @return errorCode The error code.\n /// @return orderHash Hash of the order being dispatched.\n /// @return assetData Asset data of the order being dispatched.\n function decodeAssetProxyDispatchError(bytes memory encoded)\n public\n pure\n returns (\n LibExchangeRichErrors.AssetProxyDispatchErrorCodes errorCode,\n bytes32 orderHash,\n bytes memory assetData\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.AssetProxyDispatchErrorSelector());\n uint8 _errorCode;\n (_errorCode, orderHash, assetData) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (uint8, bytes32, bytes)\n );\n errorCode = LibExchangeRichErrors.AssetProxyDispatchErrorCodes(_errorCode);\n }\n\n /// @dev Decompose an ABI-encoded AssetProxyTransferError.\n /// @param encoded ABI-encoded revert error.\n /// @return orderHash Hash of the order being dispatched.\n /// @return assetData Asset data of the order being dispatched.\n /// @return errorData ABI-encoded revert data from the asset proxy.\n function decodeAssetProxyTransferError(bytes memory encoded)\n public\n pure\n returns (\n bytes32 orderHash,\n bytes memory assetData,\n bytes memory errorData\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.AssetProxyTransferErrorSelector());\n (orderHash, assetData, errorData) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (bytes32, bytes, bytes)\n );\n }\n\n /// @dev Decompose an ABI-encoded NegativeSpreadError.\n /// @param encoded ABI-encoded revert error.\n /// @return leftOrderHash Hash of the left order being matched.\n /// @return rightOrderHash Hash of the right order being matched.\n function decodeNegativeSpreadError(bytes memory encoded)\n public\n pure\n returns (\n bytes32 leftOrderHash,\n bytes32 rightOrderHash\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.NegativeSpreadErrorSelector());\n (leftOrderHash, rightOrderHash) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (bytes32, bytes32)\n );\n }\n\n /// @dev Decompose an ABI-encoded TransactionError.\n /// @param encoded ABI-encoded revert error.\n /// @return errorCode The error code.\n /// @return transactionHash Hash of the transaction.\n function decodeTransactionError(bytes memory encoded)\n public\n pure\n returns (\n LibExchangeRichErrors.TransactionErrorCodes errorCode,\n bytes32 transactionHash\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.TransactionErrorSelector());\n uint8 _errorCode;\n (_errorCode, transactionHash) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (uint8, bytes32)\n );\n errorCode = LibExchangeRichErrors.TransactionErrorCodes(_errorCode);\n }\n\n /// @dev Decompose an ABI-encoded TransactionExecutionError.\n /// @param encoded ABI-encoded revert error.\n /// @return transactionHash Hash of the transaction.\n /// @return errorData Error thrown by exeucteTransaction().\n function decodeTransactionExecutionError(bytes memory encoded)\n public\n pure\n returns (\n bytes32 transactionHash,\n bytes memory errorData\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.TransactionExecutionErrorSelector());\n (transactionHash, errorData) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (bytes32, bytes)\n );\n }\n\n /// @dev Decompose an ABI-encoded IncompleteFillError.\n /// @param encoded ABI-encoded revert error.\n /// @return orderHash Hash of the order being filled.\n function decodeIncompleteFillError(bytes memory encoded)\n public\n pure\n returns (\n LibExchangeRichErrors.IncompleteFillErrorCode errorCode,\n uint256 expectedAssetFillAmount,\n uint256 actualAssetFillAmount\n )\n {\n _assertSelectorBytes(encoded, LibExchangeRichErrors.IncompleteFillErrorSelector());\n uint8 _errorCode;\n (_errorCode, expectedAssetFillAmount, actualAssetFillAmount) = abi.decode(\n encoded.sliceDestructive(4, encoded.length),\n (uint8, uint256, uint256)\n );\n errorCode = LibExchangeRichErrors.IncompleteFillErrorCode(_errorCode);\n }\n\n /// @dev Revert if the leading 4 bytes of `encoded` is not `selector`.\n function _assertSelectorBytes(bytes memory encoded, bytes4 selector)\n private\n pure\n {\n bytes4 actualSelector = LibBytes.readBytes4(encoded, 0);\n require(\n actualSelector == selector,\n \"BAD_SELECTOR\"\n );\n }\n}\n", - "@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibExchangeRichErrors {\n\n enum AssetProxyDispatchErrorCodes {\n INVALID_ASSET_DATA_LENGTH,\n UNKNOWN_ASSET_PROXY\n }\n\n enum BatchMatchOrdersErrorCodes {\n ZERO_LEFT_ORDERS,\n ZERO_RIGHT_ORDERS,\n INVALID_LENGTH_LEFT_SIGNATURES,\n INVALID_LENGTH_RIGHT_SIGNATURES\n }\n\n enum ExchangeContextErrorCodes {\n INVALID_MAKER,\n INVALID_TAKER,\n INVALID_SENDER\n }\n\n enum FillErrorCodes {\n INVALID_TAKER_AMOUNT,\n TAKER_OVERPAY,\n OVERFILL,\n INVALID_FILL_PRICE\n }\n\n enum SignatureErrorCodes {\n BAD_ORDER_SIGNATURE,\n BAD_TRANSACTION_SIGNATURE,\n INVALID_LENGTH,\n UNSUPPORTED,\n ILLEGAL,\n INAPPROPRIATE_SIGNATURE_TYPE,\n INVALID_SIGNER\n }\n\n enum TransactionErrorCodes {\n ALREADY_EXECUTED,\n EXPIRED\n }\n\n enum IncompleteFillErrorCode {\n INCOMPLETE_MARKET_BUY_ORDERS,\n INCOMPLETE_MARKET_SELL_ORDERS,\n INCOMPLETE_FILL_ORDER\n }\n\n // bytes4(keccak256(\"SignatureError(uint8,bytes32,address,bytes)\"))\n bytes4 internal constant SIGNATURE_ERROR_SELECTOR =\n 0x7e5a2318;\n\n // bytes4(keccak256(\"SignatureValidatorNotApprovedError(address,address)\"))\n bytes4 internal constant SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR =\n 0xa15c0d06;\n\n // bytes4(keccak256(\"EIP1271SignatureError(address,bytes,bytes,bytes)\"))\n bytes4 internal constant EIP1271_SIGNATURE_ERROR_SELECTOR =\n 0x5bd0428d;\n\n // bytes4(keccak256(\"SignatureWalletError(bytes32,address,bytes,bytes)\"))\n bytes4 internal constant SIGNATURE_WALLET_ERROR_SELECTOR =\n 0x1b8388f7;\n\n // bytes4(keccak256(\"OrderStatusError(bytes32,uint8)\"))\n bytes4 internal constant ORDER_STATUS_ERROR_SELECTOR =\n 0xfdb6ca8d;\n\n // bytes4(keccak256(\"ExchangeInvalidContextError(uint8,bytes32,address)\"))\n bytes4 internal constant EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR =\n 0xe53c76c8;\n\n // bytes4(keccak256(\"FillError(uint8,bytes32)\"))\n bytes4 internal constant FILL_ERROR_SELECTOR =\n 0xe94a7ed0;\n\n // bytes4(keccak256(\"OrderEpochError(address,address,uint256)\"))\n bytes4 internal constant ORDER_EPOCH_ERROR_SELECTOR =\n 0x4ad31275;\n\n // bytes4(keccak256(\"AssetProxyExistsError(bytes4,address)\"))\n bytes4 internal constant ASSET_PROXY_EXISTS_ERROR_SELECTOR =\n 0x11c7b720;\n\n // bytes4(keccak256(\"AssetProxyDispatchError(uint8,bytes32,bytes)\"))\n bytes4 internal constant ASSET_PROXY_DISPATCH_ERROR_SELECTOR =\n 0x488219a6;\n\n // bytes4(keccak256(\"AssetProxyTransferError(bytes32,bytes,bytes)\"))\n bytes4 internal constant ASSET_PROXY_TRANSFER_ERROR_SELECTOR =\n 0x4678472b;\n\n // bytes4(keccak256(\"NegativeSpreadError(bytes32,bytes32)\"))\n bytes4 internal constant NEGATIVE_SPREAD_ERROR_SELECTOR =\n 0xb6555d6f;\n\n // bytes4(keccak256(\"TransactionError(uint8,bytes32)\"))\n bytes4 internal constant TRANSACTION_ERROR_SELECTOR =\n 0xf5985184;\n\n // bytes4(keccak256(\"TransactionExecutionError(bytes32,bytes)\"))\n bytes4 internal constant TRANSACTION_EXECUTION_ERROR_SELECTOR =\n 0x20d11f61;\n \n // bytes4(keccak256(\"TransactionGasPriceError(bytes32,uint256,uint256)\"))\n bytes4 internal constant TRANSACTION_GAS_PRICE_ERROR_SELECTOR =\n 0xa26dac09;\n\n // bytes4(keccak256(\"TransactionInvalidContextError(bytes32,address)\"))\n bytes4 internal constant TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR =\n 0xdec4aedf;\n\n // bytes4(keccak256(\"IncompleteFillError(uint8,uint256,uint256)\"))\n bytes4 internal constant INCOMPLETE_FILL_ERROR_SELECTOR =\n 0x18e4b141;\n\n // bytes4(keccak256(\"BatchMatchOrdersError(uint8)\"))\n bytes4 internal constant BATCH_MATCH_ORDERS_ERROR_SELECTOR =\n 0xd4092f4f;\n\n // bytes4(keccak256(\"PayProtocolFeeError(bytes32,uint256,address,address,bytes)\"))\n bytes4 internal constant PAY_PROTOCOL_FEE_ERROR_SELECTOR =\n 0x87cb1e75;\n\n // solhint-disable func-name-mixedcase\n function SignatureErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_ERROR_SELECTOR;\n }\n\n function SignatureValidatorNotApprovedErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR;\n }\n\n function EIP1271SignatureErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return EIP1271_SIGNATURE_ERROR_SELECTOR;\n }\n\n function SignatureWalletErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_WALLET_ERROR_SELECTOR;\n }\n\n function OrderStatusErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ORDER_STATUS_ERROR_SELECTOR;\n }\n\n function ExchangeInvalidContextErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR;\n }\n\n function FillErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return FILL_ERROR_SELECTOR;\n }\n\n function OrderEpochErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ORDER_EPOCH_ERROR_SELECTOR;\n }\n\n function AssetProxyExistsErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_EXISTS_ERROR_SELECTOR;\n }\n\n function AssetProxyDispatchErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_DISPATCH_ERROR_SELECTOR;\n }\n\n function AssetProxyTransferErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_TRANSFER_ERROR_SELECTOR;\n }\n\n function NegativeSpreadErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return NEGATIVE_SPREAD_ERROR_SELECTOR;\n }\n\n function TransactionErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_ERROR_SELECTOR;\n }\n\n function TransactionExecutionErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_EXECUTION_ERROR_SELECTOR;\n }\n\n function IncompleteFillErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return INCOMPLETE_FILL_ERROR_SELECTOR;\n }\n\n function BatchMatchOrdersErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return BATCH_MATCH_ORDERS_ERROR_SELECTOR;\n }\n\n function TransactionGasPriceErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_GAS_PRICE_ERROR_SELECTOR;\n }\n\n function TransactionInvalidContextErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR;\n }\n\n function PayProtocolFeeErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return PAY_PROTOCOL_FEE_ERROR_SELECTOR;\n }\n \n function BatchMatchOrdersError(\n BatchMatchOrdersErrorCodes errorCode\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n BATCH_MATCH_ORDERS_ERROR_SELECTOR,\n errorCode\n );\n }\n\n function SignatureError(\n SignatureErrorCodes errorCode,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_ERROR_SELECTOR,\n errorCode,\n hash,\n signerAddress,\n signature\n );\n }\n\n function SignatureValidatorNotApprovedError(\n address signerAddress,\n address validatorAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR,\n signerAddress,\n validatorAddress\n );\n }\n\n function EIP1271SignatureError(\n address verifyingContractAddress,\n bytes memory data,\n bytes memory signature,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EIP1271_SIGNATURE_ERROR_SELECTOR,\n verifyingContractAddress,\n data,\n signature,\n errorData\n );\n }\n\n function SignatureWalletError(\n bytes32 hash,\n address walletAddress,\n bytes memory signature,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_WALLET_ERROR_SELECTOR,\n hash,\n walletAddress,\n signature,\n errorData\n );\n }\n\n function OrderStatusError(\n bytes32 orderHash,\n LibOrder.OrderStatus orderStatus\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ORDER_STATUS_ERROR_SELECTOR,\n orderHash,\n orderStatus\n );\n }\n\n function ExchangeInvalidContextError(\n ExchangeContextErrorCodes errorCode,\n bytes32 orderHash,\n address contextAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR,\n errorCode,\n orderHash,\n contextAddress\n );\n }\n\n function FillError(\n FillErrorCodes errorCode,\n bytes32 orderHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n FILL_ERROR_SELECTOR,\n errorCode,\n orderHash\n );\n }\n\n function OrderEpochError(\n address makerAddress,\n address orderSenderAddress,\n uint256 currentEpoch\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ORDER_EPOCH_ERROR_SELECTOR,\n makerAddress,\n orderSenderAddress,\n currentEpoch\n );\n }\n\n function AssetProxyExistsError(\n bytes4 assetProxyId,\n address assetProxyAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_EXISTS_ERROR_SELECTOR,\n assetProxyId,\n assetProxyAddress\n );\n }\n\n function AssetProxyDispatchError(\n AssetProxyDispatchErrorCodes errorCode,\n bytes32 orderHash,\n bytes memory assetData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_DISPATCH_ERROR_SELECTOR,\n errorCode,\n orderHash,\n assetData\n );\n }\n\n function AssetProxyTransferError(\n bytes32 orderHash,\n bytes memory assetData,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_TRANSFER_ERROR_SELECTOR,\n orderHash,\n assetData,\n errorData\n );\n }\n\n function NegativeSpreadError(\n bytes32 leftOrderHash,\n bytes32 rightOrderHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n NEGATIVE_SPREAD_ERROR_SELECTOR,\n leftOrderHash,\n rightOrderHash\n );\n }\n\n function TransactionError(\n TransactionErrorCodes errorCode,\n bytes32 transactionHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_ERROR_SELECTOR,\n errorCode,\n transactionHash\n );\n }\n\n function TransactionExecutionError(\n bytes32 transactionHash,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_EXECUTION_ERROR_SELECTOR,\n transactionHash,\n errorData\n );\n }\n\n function TransactionGasPriceError(\n bytes32 transactionHash,\n uint256 actualGasPrice,\n uint256 requiredGasPrice\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_GAS_PRICE_ERROR_SELECTOR,\n transactionHash,\n actualGasPrice,\n requiredGasPrice\n );\n }\n\n function TransactionInvalidContextError(\n bytes32 transactionHash,\n address currentContextAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR,\n transactionHash,\n currentContextAddress\n );\n }\n\n function IncompleteFillError(\n IncompleteFillErrorCode errorCode,\n uint256 expectedAssetFillAmount,\n uint256 actualAssetFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INCOMPLETE_FILL_ERROR_SELECTOR,\n errorCode,\n expectedAssetFillAmount,\n actualAssetFillAmount\n );\n }\n\n function PayProtocolFeeError(\n bytes32 orderHash,\n uint256 protocolFee,\n address makerAddress,\n address takerAddress,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n PAY_PROTOCOL_FEE_ERROR_SELECTOR,\n orderHash,\n protocolFee,\n makerAddress,\n takerAddress,\n errorData\n );\n }\n}\n", - "src/LibTransactionDecoder.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\n\n\ncontract LibTransactionDecoder {\n\n using LibBytes for bytes;\n\n /// @dev Decodes the call data for an Exchange contract method call.\n /// @param transactionData ABI-encoded calldata for an Exchange\n /// contract method call.\n /// @return The name of the function called, and the parameters it was\n /// given. For single-order fills and cancels, the arrays will have\n /// just one element.\n function decodeZeroExTransactionData(bytes memory transactionData)\n public\n pure\n returns(\n string memory functionName,\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n {\n bytes4 functionSelector = transactionData.readBytes4(0);\n\n if (functionSelector == IExchange(address(0)).batchCancelOrders.selector) {\n functionName = \"batchCancelOrders\";\n } else if (functionSelector == IExchange(address(0)).batchFillOrders.selector) {\n functionName = \"batchFillOrders\";\n } else if (functionSelector == IExchange(address(0)).batchFillOrdersNoThrow.selector) {\n functionName = \"batchFillOrdersNoThrow\";\n } else if (functionSelector == IExchange(address(0)).batchFillOrKillOrders.selector) {\n functionName = \"batchFillOrKillOrders\";\n } else if (functionSelector == IExchange(address(0)).cancelOrder.selector) {\n functionName = \"cancelOrder\";\n } else if (functionSelector == IExchange(address(0)).fillOrder.selector) {\n functionName = \"fillOrder\";\n } else if (functionSelector == IExchange(address(0)).fillOrKillOrder.selector) {\n functionName = \"fillOrKillOrder\";\n } else if (functionSelector == IExchange(address(0)).marketBuyOrdersNoThrow.selector) {\n functionName = \"marketBuyOrdersNoThrow\";\n } else if (functionSelector == IExchange(address(0)).marketSellOrdersNoThrow.selector) {\n functionName = \"marketSellOrdersNoThrow\";\n } else if (functionSelector == IExchange(address(0)).marketBuyOrdersFillOrKill.selector) {\n functionName = \"marketBuyOrdersFillOrKill\";\n } else if (functionSelector == IExchange(address(0)).marketSellOrdersFillOrKill.selector) {\n functionName = \"marketSellOrdersFillOrKill\";\n } else if (functionSelector == IExchange(address(0)).matchOrders.selector) {\n functionName = \"matchOrders\";\n } else if (\n functionSelector == IExchange(address(0)).cancelOrdersUpTo.selector ||\n functionSelector == IExchange(address(0)).executeTransaction.selector\n ) {\n revert(\"UNIMPLEMENTED\");\n } else {\n revert(\"UNKNOWN_FUNCTION_SELECTOR\");\n }\n\n if (functionSelector == IExchange(address(0)).batchCancelOrders.selector) {\n // solhint-disable-next-line indent\n orders = abi.decode(transactionData.slice(4, transactionData.length), (LibOrder.Order[]));\n takerAssetFillAmounts = new uint256[](0);\n signatures = new bytes[](0);\n } else if (\n functionSelector == IExchange(address(0)).batchFillOrKillOrders.selector ||\n functionSelector == IExchange(address(0)).batchFillOrders.selector ||\n functionSelector == IExchange(address(0)).batchFillOrdersNoThrow.selector\n ) {\n (orders, takerAssetFillAmounts, signatures) = _makeReturnValuesForBatchFill(transactionData);\n } else if (functionSelector == IExchange(address(0)).cancelOrder.selector) {\n orders = new LibOrder.Order[](1);\n orders[0] = abi.decode(transactionData.slice(4, transactionData.length), (LibOrder.Order));\n takerAssetFillAmounts = new uint256[](0);\n signatures = new bytes[](0);\n } else if (\n functionSelector == IExchange(address(0)).fillOrKillOrder.selector ||\n functionSelector == IExchange(address(0)).fillOrder.selector\n ) {\n (orders, takerAssetFillAmounts, signatures) = _makeReturnValuesForSingleOrderFill(transactionData);\n } else if (\n functionSelector == IExchange(address(0)).marketBuyOrdersNoThrow.selector ||\n functionSelector == IExchange(address(0)).marketSellOrdersNoThrow.selector ||\n functionSelector == IExchange(address(0)).marketBuyOrdersFillOrKill.selector ||\n functionSelector == IExchange(address(0)).marketSellOrdersFillOrKill.selector\n ) {\n (orders, takerAssetFillAmounts, signatures) = _makeReturnValuesForMarketFill(transactionData);\n } else if (functionSelector == IExchange(address(0)).matchOrders.selector) {\n (\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n ) = abi.decode(\n transactionData.slice(4, transactionData.length),\n (LibOrder.Order, LibOrder.Order, bytes, bytes)\n );\n\n orders = new LibOrder.Order[](2);\n orders[0] = leftOrder;\n orders[1] = rightOrder;\n\n takerAssetFillAmounts = new uint256[](2);\n takerAssetFillAmounts[0] = leftOrder.takerAssetAmount;\n takerAssetFillAmounts[1] = rightOrder.takerAssetAmount;\n\n signatures = new bytes[](2);\n signatures[0] = leftSignature;\n signatures[1] = rightSignature;\n }\n }\n\n function _makeReturnValuesForSingleOrderFill(bytes memory transactionData)\n private\n pure\n returns(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n {\n orders = new LibOrder.Order[](1);\n takerAssetFillAmounts = new uint256[](1);\n signatures = new bytes[](1);\n // solhint-disable-next-line indent\n (orders[0], takerAssetFillAmounts[0], signatures[0]) = abi.decode(\n transactionData.slice(4, transactionData.length),\n (LibOrder.Order, uint256, bytes)\n );\n }\n\n function _makeReturnValuesForBatchFill(bytes memory transactionData)\n private\n pure\n returns(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n {\n // solhint-disable-next-line indent\n (orders, takerAssetFillAmounts, signatures) = abi.decode(\n transactionData.slice(4, transactionData.length),\n // solhint-disable-next-line indent\n (LibOrder.Order[], uint256[], bytes[])\n );\n }\n\n function _makeReturnValuesForMarketFill(bytes memory transactionData)\n private\n pure\n returns(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n {\n takerAssetFillAmounts = new uint256[](1);\n // solhint-disable-next-line indent\n (orders, takerAssetFillAmounts[0], signatures) = abi.decode(\n transactionData.slice(4, transactionData.length),\n // solhint-disable-next-line indent\n (LibOrder.Order[], uint256, bytes[])\n );\n }\n}\n", - "src/EthBalanceChecker.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.5;\n\n\ncontract EthBalanceChecker {\n\n /// @dev Batch fetches ETH balances\n /// @param addresses Array of addresses.\n /// @return Array of ETH balances.\n function getEthBalances(address[] memory addresses)\n public\n view\n returns (uint256[] memory)\n {\n uint256[] memory balances = new uint256[](addresses.length);\n for (uint256 i = 0; i != addresses.length; i++) {\n balances[i] = addresses[i].balance;\n }\n return balances;\n }\n\n}\n" - }, - "sourceTreeHashHex": "0x9b2e4c827e0284f34188d86613358b001f396b5e94991cfad4ea8112fe92545d", - "compiler": { - "name": "solc", - "version": "soljson-v0.5.15+commit.6a57276f.js", - "settings": { - "optimizer": { - "enabled": true, - "runs": 200, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "devdoc", - "evm.bytecode.object", - "evm.bytecode.sourceMap", - "evm.deployedBytecode.object", - "evm.deployedBytecode.sourceMap" - ] - } - }, - "evmVersion": "constantinople", - "remappings": [ - "@0x/contracts-exchange-libs=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-exchange-libs", - "@0x/contracts-utils=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-utils", - "@0x/contracts-exchange=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-exchange", - "@0x/contracts-asset-proxy=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-asset-proxy", - "@0x/contracts-erc20=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-erc20", - "@0x/contracts-erc721=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-erc721", - "@0x/contracts-erc1155=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-erc1155" - ] - } - }, - "chains": {} -} \ No newline at end of file + "schemaVersion": "2.0.0", + "contractName": "DevUtils", + "compilerOutput": { + "abi": [ + { + "inputs": [{ "internalType": "address", "name": "_exchange", "type": "address" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "constant": true, + "inputs": [], + "name": "EIP712_EXCHANGE_DOMAIN_HASH", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeAssetProxyDispatchError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.AssetProxyDispatchErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeAssetProxyExistsError", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "assetProxyAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeAssetProxyId", + "outputs": [{ "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeAssetProxyTransferError", + "outputs": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeEIP1271SignatureError", + "outputs": [ + { "internalType": "address", "name": "verifyingContractAddress", "type": "address" }, + { "internalType": "bytes", "name": "data", "type": "bytes" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeERC1155AssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "tokenValues", "type": "uint256[]" }, + { "internalType": "bytes", "name": "callbackData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeERC20AssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "tokenAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeERC721AssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeExchangeInvalidContextError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.ExchangeContextErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "address", "name": "contextAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeFillError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.FillErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeIncompleteFillError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.IncompleteFillErrorCode", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "uint256", "name": "expectedAssetFillAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "actualAssetFillAmount", "type": "uint256" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeMultiAssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeNegativeSpreadError", + "outputs": [ + { "internalType": "bytes32", "name": "leftOrderHash", "type": "bytes32" }, + { "internalType": "bytes32", "name": "rightOrderHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeOrderEpochError", + "outputs": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "orderSenderAddress", "type": "address" }, + { "internalType": "uint256", "name": "currentEpoch", "type": "uint256" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeOrderStatusError", + "outputs": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "enum LibOrder.OrderStatus", "name": "orderStatus", "type": "uint8" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeSignatureError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.SignatureErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "hash", "type": "bytes32" }, + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeSignatureValidatorNotApprovedError", + "outputs": [ + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "address", "name": "validatorAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeSignatureWalletError", + "outputs": [ + { "internalType": "bytes32", "name": "hash", "type": "bytes32" }, + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeStaticCallAssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "staticCallTargetAddress", "type": "address" }, + { "internalType": "bytes", "name": "staticCallData", "type": "bytes" }, + { "internalType": "bytes32", "name": "expectedReturnDataHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeTransactionError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.TransactionErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeTransactionExecutionError", + "outputs": [ + { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }], + "name": "decodeZeroExTransactionData", + "outputs": [ + { "internalType": "string", "name": "functionName", "type": "string" }, + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "tokenValues", "type": "uint256[]" }, + { "internalType": "bytes", "name": "callbackData", "type": "bytes" } + ], + "name": "encodeERC1155AssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "tokenAddress", "type": "address" }], + "name": "encodeERC20AssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "encodeERC721AssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" } + ], + "name": "encodeMultiAssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "staticCallTargetAddress", "type": "address" }, + { "internalType": "bytes", "name": "staticCallData", "type": "bytes" }, + { "internalType": "bytes32", "name": "expectedReturnDataHash", "type": "bytes32" } + ], + "name": "encodeStaticCallAssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getAssetProxyAllowance", + "outputs": [{ "internalType": "uint256", "name": "allowance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getBalance", + "outputs": [{ "internalType": "uint256", "name": "balance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getBalanceAndAssetProxyAllowance", + "outputs": [ + { "internalType": "uint256", "name": "balance", "type": "uint256" }, + { "internalType": "uint256", "name": "allowance", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" } + ], + "name": "getBatchAssetProxyAllowances", + "outputs": [{ "internalType": "uint256[]", "name": "allowances", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" } + ], + "name": "getBatchBalances", + "outputs": [{ "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" } + ], + "name": "getBatchBalancesAndAssetProxyAllowances", + "outputs": [ + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "allowances", "type": "uint256[]" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address[]", "name": "addresses", "type": "address[]" }], + "name": "getEthBalances", + "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + }, + { "internalType": "uint256", "name": "chainId", "type": "uint256" }, + { "internalType": "address", "name": "exchange", "type": "address" } + ], + "name": "getOrderHash", + "outputs": [{ "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + }, + { "internalType": "bytes", "name": "signature", "type": "bytes" } + ], + "name": "getOrderRelevantState", + "outputs": [ + { + "components": [ + { "internalType": "uint8", "name": "orderStatus", "type": "uint8" }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" } + ], + "internalType": "struct LibOrder.OrderInfo", + "name": "orderInfo", + "type": "tuple" + }, + { "internalType": "uint256", "name": "fillableTakerAssetAmount", "type": "uint256" }, + { "internalType": "bool", "name": "isValidSignature", "type": "bool" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } + ], + "name": "getOrderRelevantStates", + "outputs": [ + { + "components": [ + { "internalType": "uint8", "name": "orderStatus", "type": "uint8" }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" } + ], + "internalType": "struct LibOrder.OrderInfo[]", + "name": "ordersInfo", + "type": "tuple[]" + }, + { "internalType": "uint256[]", "name": "fillableTakerAssetAmounts", "type": "uint256[]" }, + { "internalType": "bool[]", "name": "isValidSignature", "type": "bool[]" } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" } + ], + "name": "getSimulatedOrderMakerTransferResults", + "outputs": [ + { + "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", + "name": "orderTransferResults", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" } + ], + "name": "getSimulatedOrderTransferResults", + "outputs": [ + { + "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", + "name": "orderTransferResults", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "address[]", "name": "takerAddresses", "type": "address[]" }, + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" } + ], + "name": "getSimulatedOrdersTransferResults", + "outputs": [ + { + "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults[]", + "name": "orderTransferResults", + "type": "uint8[]" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "gasPrice", "type": "uint256" }, + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "internalType": "struct LibZeroExTransaction.ZeroExTransaction", + "name": "transaction", + "type": "tuple" + }, + { "internalType": "uint256", "name": "chainId", "type": "uint256" }, + { "internalType": "address", "name": "exchange", "type": "address" } + ], + "name": "getTransactionHash", + "outputs": [{ "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getTransferableAssetAmount", + "outputs": [{ "internalType": "uint256", "name": "transferableAssetAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "revertIfInvalidAssetData", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "devdoc": { + "methods": { + "decodeAssetProxyDispatchError(bytes)": { + "details": "Decompose an ABI-encoded AssetProxyDispatchError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched." + }, + "decodeAssetProxyExistsError(bytes)": { + "details": "Decompose an ABI-encoded AssetProxyExistsError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "assetProxyId Id of asset proxy.assetProxyAddress The address of the asset proxy." + }, + "decodeAssetProxyId(bytes)": { + "details": "Decode AssetProxy identifier", + "params": { + "assetData": "AssetProxy-compliant asset data describing an ERC-20, ERC-721, ERC1155, or MultiAsset asset." + }, + "return": "The AssetProxy identifier" + }, + "decodeAssetProxyTransferError(bytes)": { + "details": "Decompose an ABI-encoded AssetProxyTransferError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched.errorData ABI-encoded revert data from the asset proxy." + }, + "decodeEIP1271SignatureError(bytes)": { + "details": "Decompose an ABI-encoded SignatureValidatorError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." + }, + "decodeERC1155AssetData(bytes)": { + "details": "Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-1155 set of assets." }, + "return": "The ERC-1155 AssetProxy identifier, the address of the ERC-1155 contract hosting the assets, an array of the identifiers of the assets to be traded, an array of asset amounts to be traded, and callback data. Each element of the arrays corresponds to the same-indexed element of the other array. Return values specified as `memory` are returned as pointers to locations within the memory of the input parameter `assetData`." + }, + "decodeERC20AssetData(bytes)": { + "details": "Decode ERC-20 asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-20 asset." }, + "return": "The AssetProxy identifier, and the address of the ERC-20 contract hosting this asset." + }, + "decodeERC721AssetData(bytes)": { + "details": "Decode ERC-721 asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-721 asset." }, + "return": "The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded." + }, + "decodeExchangeInvalidContextError(bytes)": { + "details": "Decompose an ABI-encoded OrderStatusError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode Error code that corresponds to invalid maker, taker, or sender.orderHash The order hash.contextAddress The maker, taker, or sender address" + }, + "decodeFillError(bytes)": { + "details": "Decompose an ABI-encoded FillError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.orderHash The order hash." + }, + "decodeIncompleteFillError(bytes)": { + "details": "Decompose an ABI-encoded IncompleteFillError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "orderHash Hash of the order being filled." + }, + "decodeMultiAssetData(bytes)": { + "details": "Decode multi-asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant data describing a multi-asset basket." }, + "return": "The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded. Each element of the arrays corresponds to the same-indexed element of the other array." + }, + "decodeNegativeSpreadError(bytes)": { + "details": "Decompose an ABI-encoded NegativeSpreadError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "leftOrderHash Hash of the left order being matched.rightOrderHash Hash of the right order being matched." + }, + "decodeOrderEpochError(bytes)": { + "details": "Decompose an ABI-encoded OrderEpochError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "makerAddress The order maker.orderSenderAddress The order sender.currentEpoch The current epoch for the maker." + }, + "decodeOrderStatusError(bytes)": { + "details": "Decompose an ABI-encoded OrderStatusError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "orderHash The order hash.orderStatus The order status." + }, + "decodeSignatureError(bytes)": { + "details": "Decompose an ABI-encoded SignatureError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature." + }, + "decodeSignatureValidatorNotApprovedError(bytes)": { + "details": "Decompose an ABI-encoded SignatureValidatorNotApprovedError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "signerAddress The expected signer of the hash.validatorAddress The expected validator." + }, + "decodeSignatureWalletError(bytes)": { + "details": "Decompose an ABI-encoded SignatureWalletError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." + }, + "decodeStaticCallAssetData(bytes)": { + "details": "Decode StaticCall asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing a StaticCall asset" }, + "return": "The StaticCall AssetProxy identifier, the target address of the StaticCAll, the data to be passed to the target address, and the expected Keccak-256 hash of the static call return data." + }, + "decodeTransactionError(bytes)": { + "details": "Decompose an ABI-encoded TransactionError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.transactionHash Hash of the transaction." + }, + "decodeTransactionExecutionError(bytes)": { + "details": "Decompose an ABI-encoded TransactionExecutionError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "transactionHash Hash of the transaction.errorData Error thrown by exeucteTransaction()." + }, + "decodeZeroExTransactionData(bytes)": { + "details": "Decodes the call data for an Exchange contract method call.", + "params": { "transactionData": "ABI-encoded calldata for an Exchange contract method call." }, + "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." + }, + "encodeERC1155AssetData(address,uint256[],uint256[],bytes)": { + "details": "Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.", + "params": { + "callbackData": "Data to be passed to receiving contracts when a transfer is performed.", + "tokenAddress": "The address of the ERC-1155 contract hosting the asset(s) to be traded.", + "tokenIds": "The identifiers of the specific assets to be traded.", + "tokenValues": "The amounts of each asset to be traded." + }, + "return": "AssetProxy-compliant asset data describing the set of assets." + }, + "encodeERC20AssetData(address)": { + "details": "Encode ERC-20 asset data into the format described in the AssetProxy contract specification.", + "params": { "tokenAddress": "The address of the ERC-20 contract hosting the asset to be traded." }, + "return": "AssetProxy-compliant data describing the asset." + }, + "encodeERC721AssetData(address,uint256)": { + "details": "Encode ERC-721 asset data into the format described in the AssetProxy specification.", + "params": { + "tokenAddress": "The address of the ERC-721 contract hosting the asset to be traded.", + "tokenId": "The identifier of the specific asset to be traded." + }, + "return": "AssetProxy-compliant asset data describing the asset." + }, + "encodeMultiAssetData(uint256[],bytes[])": { + "details": "Encode data for multiple assets, per the AssetProxy contract specification.", + "params": { + "amounts": "The amounts of each asset to be traded.", + "nestedAssetData": "AssetProxy-compliant data describing each asset to be traded." + }, + "return": "AssetProxy-compliant data describing the set of assets." + }, + "encodeStaticCallAssetData(address,bytes,bytes32)": { + "details": "Encode StaticCall asset data into the format described in the AssetProxy contract specification.", + "params": { + "expectedReturnDataHash": "Expected Keccak-256 hash of the StaticCall return data.", + "staticCallData": "Data that will be passed to staticCallTargetAddress in the StaticCall.", + "staticCallTargetAddress": "Target address of StaticCall." + }, + "return": "AssetProxy-compliant asset data describing the set of assets." + }, + "getAssetProxyAllowance(address,bytes)": { + "details": "Returns the number of asset(s) (described by assetData) that the corresponding AssetProxy contract is authorized to spend. When the asset data contains multiple assets (eg for Multi-Asset), the return value indicates how many complete \"baskets\" of those assets may be spent by all of the corresponding AssetProxy contracts.", + "params": { + "assetData": "Details of asset, encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend." + }, + "getBalance(address,bytes)": { + "details": "Returns the owner's balance of the assets(s) specified in assetData. When the asset data contains multiple assets (eg in ERC1155 or Multi-Asset), the return value indicates how many complete \"baskets\" of those assets are owned by owner.", + "params": { + "assetData": "Details of asset, encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Number of assets (or asset baskets) held by owner." + }, + "getBalanceAndAssetProxyAllowance(address,bytes)": { + "details": "Calls getBalance() and getAllowance() for assetData.", + "params": { + "assetData": "Details of asset, encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Number of assets (or asset baskets) held by owner, and number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend." + }, + "getBatchAssetProxyAllowances(address,bytes[])": { + "details": "Calls getAssetProxyAllowance() for each element of assetData.", + "params": { + "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "An array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." + }, + "getBatchBalances(address,bytes[])": { + "details": "Calls getBalance() for each element of assetData.", + "params": { + "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Array of asset balances from getBalance(), with each element corresponding to the same-indexed element in the assetData input." + }, + "getBatchBalancesAndAssetProxyAllowances(address,bytes[])": { + "details": "Calls getBatchBalances() and getBatchAllowances() for each element of assetData.", + "params": { + "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "An array of asset balances from getBalance(), and an array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." + }, + "getEthBalances(address[])": { + "details": "Batch fetches ETH balances", + "params": { "addresses": "Array of addresses." }, + "return": "Array of ETH balances." + }, + "getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)": { + "details": "Fetches all order-relevant information needed to validate if the supplied order is fillable.", + "params": { + "order": "The order structure.", + "signature": "Signature provided by maker that proves the order's authenticity. `0x01` can always be provided if the signature does not need to be validated." + }, + "return": "The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order), fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (validity of the provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." + }, + "getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { + "details": "Fetches all order-relevant information needed to validate if the supplied orders are fillable.", + "params": { + "orders": "Array of order structures.", + "signatures": "Array of signatures provided by makers that prove the authenticity of the orders. `0x01` can always be provided if a signature does not need to be validated." + }, + "return": "The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order), fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (array containing the validity of each provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." + }, + "getSimulatedOrderMakerTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),address,uint256)": { + "details": "Simulates the maker transfers within an order and returns the index of the first failed transfer.", + "params": { + "order": "The order to simulate transfers for.", + "takerAddress": "The address of the taker that will fill the order.", + "takerAssetFillAmount": "The amount of takerAsset that the taker wished to fill." + }, + "return": "The index of the first failed transfer (or 4 if all transfers are successful)." + }, + "getSimulatedOrderTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),address,uint256)": { + "details": "Simulates all of the transfers within an order and returns the index of the first failed transfer.", + "params": { + "order": "The order to simulate transfers for.", + "takerAddress": "The address of the taker that will fill the order.", + "takerAssetFillAmount": "The amount of takerAsset that the taker wished to fill." + }, + "return": "The index of the first failed transfer (or 4 if all transfers are successful)." + }, + "getSimulatedOrdersTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],address[],uint256[])": { + "details": "Simulates all of the transfers for each given order and returns the indices of each first failed transfer.", + "params": { + "orders": "Array of orders to individually simulate transfers for.", + "takerAddresses": "Array of addresses of takers that will fill each order.", + "takerAssetFillAmounts": "Array of amounts of takerAsset that will be filled for each order." + }, + "return": "The indices of the first failed transfer (or 4 if all transfers are successful) for each order." + }, + "getTransferableAssetAmount(address,bytes)": { + "details": "Gets the amount of an asset transferable by the owner.", + "params": { + "assetData": "Description of tokens, per the AssetProxy contract specification.", + "ownerAddress": "Address of the owner of the asset." + }, + "return": "The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`." + } + } + }, + "evm": { + "bytecode": { + "object": "0x60806040523480156200001157600080fd5b5060405162005d5238038062005d528339810160408190526200003491620004b7565b600080546001600160a01b0319166001600160a01b03838116919091178083556040517f6070410800000000000000000000000000000000000000000000000000000000815283928592839283929190911690636070410890620000bd907ff47261b00000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b158015620000d657600080fd5b505afa158015620000eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001119190810190620004b7565b600180546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200018f907f025717920000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b158015620001a857600080fd5b505afa158015620001bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001e39190810190620004b7565b600280546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000261907fa7cb5fb70000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b1580156200027a57600080fd5b505afa1580156200028f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002b59190810190620004b7565b600380546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000333907fc339d10a0000000000000000000000000000000000000000000000000000000090600401620004e7565b60206040518083038186803b1580156200034c57600080fd5b505afa15801562000361573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620003879190810190620004b7565b600480546001600160a01b03199081166001600160a01b039384161790915560058054909116938216939093179092555060009150821615620003cb5781620003cd565b305b9050620004526040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525085846200046060201b6200358a1760201c565b600655506200051492505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620004c9578081fd5b81516001600160a01b0381168114620004e0578182fd5b9392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b61582e80620005246000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80639a7e752611610151578063ca49f47c116100c3578063d3d862d111610087578063d3d862d1146106a9578063d4695028146106bc578063e25cabf7146106dc578063e4e6e7da146106fe578063e77286eb1461071f578063ee4f5a941461074157610274565b8063ca49f47c1461062c578063cafd3a071461064f578063d001c5dc14610670578063d186037f14610683578063d36379051461069657610274565b8063a6627e9f11610115578063a6627e9f14610598578063acaedc74146105ab578063b43cffe1146105ce578063bbb2dcf6146105e1578063bc03f96414610603578063c26cfecd1461062457610274565b80639a7e75261461050b5780639eadc8351461052e578063a070cac814610552578063a0901e5114610565578063a5cd62ba1461057857610274565b80634dfdac20116101ea5780637914b2ec116101ae5780637914b2ec146104705780637982653e1461049157806379c9c426146104b15780637b66ad34146104c45780637d727512146104e55780638f4ce479146104f857610274565b80634dfdac20146103d8578063590aa875146103f857806363eb399214610418578063651290421461042b5780636f83188e1461044d57610274565b8063314853ff1161023c578063314853ff14610328578063327d30541461034a57806332aae3ad1461035d5780633db6dc611461037f578063459be5e2146103a257806346eb65cb146103c357610274565b806302d0aec31461027957806304a5618a146102a35780630d7b7d76146102c5578063165979e1146102e65780632322cf7614610308575b600080fd5b61028c610287366004614851565b610763565b60405161029a92919061528b565b60405180910390f35b6102b66102b1366004614851565b6107bf565b60405161029a9392919061537d565b6102d86102d336600461438f565b61083a565b60405161029a929190615239565b6102f96102f4366004614851565b61085c565b60405161029a939291906154b7565b61031b61031636600461438f565b6108b9565b60405161029a91906151f4565b61033b610336366004614851565b6108e1565b60405161029a93929190615260565b6102d8610358366004614851565b610928565b61037061036b366004614851565b61096a565b60405161029a9392919061542d565b61039261038d366004614851565b6109bd565b60405161029a94939291906151fd565b6103b56103b0366004614851565b610a07565b60405161029a9291906154a0565b6103d66103d1366004614851565b610a5d565b005b6103eb6103e63660046142b8565b610b59565b60405161029a919061518e565b61040b610406366004614133565b610bdc565b60405161029a91906153dc565b61040b6104263660046143d2565b610c32565b61043e610439366004614851565b610c8f565b60405161029a93929190614f43565b61046061045b366004614851565b610cc9565b60405161029a949392919061552c565b61048361047e366004614851565b6114d6565b60405161029a9291906152bd565b6104a461049f3660046148fa565b61150e565b60405161029a91906154d2565b61031b6104bf366004614aa9565b611795565b6104d76104d2366004614851565b6117f4565b60405161029a929190614f29565b61031b6104f336600461438f565b61182c565b610483610506366004614851565b611daf565b61051e610519366004614851565b611e0c565b60405161029a94939291906154e6565b61054161053c366004614851565b611e6d565b60405161029a9594939291906152e0565b61031b6105603660046149a7565b611ee5565b6103eb610573366004614453565b611f3c565b61058b6105863660046144b7565b611fb5565b60405161029a9190615095565b61040b6105a6366004614428565b612078565b6105be6105b9366004614851565b6120d1565b60405161029a9493929190614fef565b61040b6105dc366004614305565b61210d565b6105f46105ef366004614851565b61216c565b60405161029a939291906153a8565b610616610611366004614851565b6121e6565b60405161029a929190615247565b61031b61221f565b61063f61063a366004614851565b612225565b60405161029a9493929190615338565b61066261065d366004614851565b6122a3565b60405161029a92919061551f565b6103eb61067e3660046142b8565b6122f1565b61031b61069136600461438f565b61235f565b6104a46106a43660046148fa565b6127e9565b61040b6106b736600461465b565b612b49565b6106cf6106ca366004614851565b612b68565b60405161029a91906152a8565b6106ef6106ea36600461453a565b612c1d565b60405161029a939291906150e2565b61071161070c3660046142b8565b612d55565b60405161029a9291906151cf565b61073261072d366004614951565b612d6e565b60405161029a93929190615692565b61075461074f366004614851565b612fa6565b60405161029a93929190615476565b60008061077783610772612fe3565b612fee565b6000610790600485518661302e9092919063ffffffff16565b8060200190516107a39190810190614804565b909350905060ff811660068111156107b757fe5b915050915091565b600080806107d3848263ffffffff61307116565b92506001600160e01b0319831663012b8bc960e11b1461080e5760405162461bcd60e51b81526004016108059061566a565b60405180910390fd5b61081f84601063ffffffff6130a516565b915061083284602463ffffffff6130d816565b929491935050565b600080610847848461182c565b9150610853848461235f565b90509250929050565b600080600061086d846107726130e4565b6000610886600486518761302e9092919063ffffffff16565b8060200190516108999190810190614c84565b9094509250905060ff811660028111156108af57fe5b9350509193909250565b60008060006108c8858561083a565b915091506108d682826130ef565b925050505b92915050565b60006060806108f284610772613105565b835161090890859060049063ffffffff61302e16565b80602001905161091b91908101906147a5565b9196909550909350915050565b60008061093783610772613110565b825161094d90849060049063ffffffff61302e16565b8060200190516109609190810190614748565b9094909350915050565b600080606061097b8461077261311b565b6000610994600486518761302e9092919063ffffffff16565b8060200190516109a79190810190614c39565b9094509250905060ff811660018111156108af57fe5b6000806060806109cf85610772613126565b84516109e590869060049063ffffffff61302e16565b8060200190516109f89190810190614705565b92989197509550909350915050565b600080610a1683610772613131565b6000610a2f600485518661302e9092919063ffffffff16565b806020019051610a429190810190614b78565b9250905060ff81166003811115610a5557fe5b925050915091565b6000610a6f828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1415610a9a57610a9382611daf565b5050610b55565b6001600160e01b0319811663012b8bc960e11b1415610ac457610abc826107bf565b505050610b55565b6001600160e01b0319811663a7cb5fb760e01b1415610af057610ae682611e6d565b5050505050610b55565b6001600160e01b031981166394cfcdd760e01b1415610b1257610abc8261216c565b6001600160e01b0319811663619ce88560e11b1415610b3d57610b3482612225565b50505050610b55565b60405162461bcd60e51b81526004016108059061566a565b5050565b606060008251905080604051908082528060200260200182016040528015610b8b578160200160208202803883390190505b50915060005b818114610bd457610bb585858381518110610ba857fe5b602002602001015161235f565b838281518110610bc157fe5b6020908102919091010152600101610b91565b505092915050565b604051606090630f47261b60e41b90610bf9908490602401614f15565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610c5390869086908690602401614fbb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610ca08461077261313c565b8351610cb690859060049063ffffffff61302e16565b80602001905161091b9190810190614188565b60608080806000610ce0868263ffffffff61307116565b90506001600160e01b0319811663dedfc1f160e01b1415610d2c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b81525094506110d8565b6001600160e01b03198116634b4a520160e11b1415610d74576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b81525094506110d8565b6001600160e01b031981166323aa37f960e21b1415610dc35760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b03198116632fbb8b8560e21b1415610e115760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b81525094506110d8565b6001600160e01b03198116632da6298760e01b1415610e55576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b81525094506110d8565b6001600160e01b03198116634da26aab60e11b1415610e9757604051806040016040528060098152602001683334b63627b93232b960b91b81525094506110d8565b6001600160e01b03198116633852d63160e21b1415610edf576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b81525094506110d8565b6001600160e01b031981166378d29ac160e01b1415610f2e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b0319811663369da09960e01b1415610f84576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f7700000000000000000081525094506110d8565b6001600160e01b03198116638bc8efb360e01b1415610fda576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c0000000000000081525094506110d8565b6001600160e01b0319811663a6c3bf3360e01b1415611030576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c00000000000081525094506110d8565b6001600160e01b031981166388ec79fb60e01b1415611074576040518060400160405280600b81526020016a6d617463684f726465727360a81b81525094506110d8565b6001600160e01b03198116634f9559b160e01b14806110a357506001600160e01b031981166302280c9160e41b145b156110c05760405162461bcd60e51b81526004016108059061561d565b60405162461bcd60e51b8152600401610805906155e6565b6001600160e01b0319811663dedfc1f160e01b141561116457855161110790879060049063ffffffff61314716565b80602001905161111a9190810190614485565b604080516000808252602082019092529195505b506040805160008082526020820190925291945061115c565b60608152602001906001900390816111475790505b5091506114ce565b6001600160e01b03198116632fbb8b8560e21b148061119357506001600160e01b03198116634b4a520160e11b145b806111ae57506001600160e01b031981166323aa37f960e21b145b156111c8576111bc866131c7565b919550935091506114ce565b6001600160e01b03198116632da6298760e01b14156112975760408051600180825281830190925290816020015b6111fe613a68565b8152602001906001900390816111f6575050865190945061122990879060049063ffffffff61314716565b80602001905161123c91908101906148c8565b8460008151811061124957fe5b6020026020010181905250600060405190808252806020026020018201604052801561112e57816020016020820280388339019050506040805160008082526020820190925291945061115c565b6001600160e01b03198116633852d63160e21b14806112c657506001600160e01b03198116634da26aab60e11b145b156112d4576111bc866131f6565b6001600160e01b031981166378d29ac160e01b148061130357506001600160e01b0319811663369da09960e01b145b8061131e57506001600160e01b03198116638bc8efb360e01b145b8061133957506001600160e01b0319811663a6c3bf3360e01b145b15611347576111bc866132f0565b6001600160e01b031981166388ec79fb60e01b14156114ce57611368613a68565b611370613a68565b60608061138a60048b518c6131479092919063ffffffff16565b80602001905161139d91908101906149ff565b604080516002808252606082019092529498509296509094509250816020015b6113c5613a68565b8152602001906001900390816113bd57905050975083886000815181106113e857fe5b6020026020010181905250828860018151811061140157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061144157fe5b6020026020010181815250508260a001518760018151811061145f57fe5b60209081029190910101526040805160028082526060820190925290816020015b606081526020019060019003908161148057905050955081866000815181106114a557fe5b602002602001018190525080866001815181106114be57fe5b6020026020010181905250505050505b509193509193565b6000806114e583610772613364565b82516114fb90849060049063ffffffff61302e16565b8060200190516109609190810190614828565b6000611518613afb565b6115a98584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b505afa15801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115a39190810190614b60565b3a61336e565b60408051600280825260608281019093529293509091816020015b60608152602001906001900390816115c457505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061165357fe5b602002602001018190525088600001518360008151811061167057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061169e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106116d057fe5b602002602001018181525050886101800151846001815181106116ef57fe5b602002602001018190525088600001518360018151811061170c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061177057fe5b602002602001018181525050611788848484846133e5565b9998505050505050505050565b60006117ec846117e76040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b6135e1565b949350505050565b600080611803836107726135f5565b825161181990849060049063ffffffff61302e16565b806020019051610960919081019061414f565b60008061183f838263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b141561195857600061186d84601063ffffffff6130a516565b6040519091506060906370a0823160e01b9061188d908890602401614f15565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516118de9190614ef9565b600060405180830381855afa9150503d8060008114611919576040519150601f19603f3d011682016040523d82523d6000602084013e61191e565b606091505b5091509150818015611931575080516020145b61193c57600061194d565b61194d81600063ffffffff6130d816565b955050505050611da8565b6001600160e01b0319811663012b8bc960e11b1415611a975760008061197d856107bf565b6040519194509250606091506331a9108f60e11b906119a09084906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119f19190614ef9565b600060405180830381855afa9150503d8060008114611a2c576040519150601f19603f3d011682016040523d82523d6000602084013e611a31565b606091505b50915091506000828015611a46575081516020145b611a51576000611a62565b611a6282600c63ffffffff6130a516565b9050896001600160a01b0316816001600160a01b031614611a84576000611a87565b60015b60ff169750505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b1415611c1e576000606080611abe86611e6d565b5081519296509094509250905060005b818114611c14578351606090627eeac760e11b908b90879085908110611af057fe5b6020026020010151604051602401611b09929190615025565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b5a9190614ef9565b600060405180830381855afa9150503d8060008114611b95576040519150601f19603f3d011682016040523d82523d6000602084013e611b9a565b606091505b50915091506000828015611baf575081516020145b611bba576000611bcb565b611bcb82600063ffffffff6130d816565b90506000878681518110611bdb57fe5b60200260200101518281611beb57fe5b0490508b811080611bfa57508b155b15611c0357809b505b505060019093019250611ace915050565b5050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611d0a57604051606090632a17967960e21b90611c5b908690600090819081906024016153ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cad908490614ef9565b600060405180830381855afa9150503d8060008114611ce8576040519150601f19603f3d011682016040523d82523d6000602084013e611ced565b606091505b5050905080611cfd576000611d01565b6000195b93505050611da8565b6001600160e01b031981166394cfcdd760e01b1415611da857606080611d2f8561216c565b80519194509250905060005b818114611da3576000611d6189858481518110611d5457fe5b602002602001015161182c565b90506000858381518110611d7157fe5b60200260200101518281611d8157fe5b04905087811080611d90575087155b15611d99578097505b5050600101611d3b565b505050505b5092915050565b600080611dc2838263ffffffff61307116565b91506001600160e01b03198216630f47261b60e41b14611df45760405162461bcd60e51b81526004016108059061566a565b611e0583601063ffffffff6130a516565b9050915091565b60008060006060611e1f85610772613600565b6000611e38600487518861302e9092919063ffffffff16565b806020019051611e4b9190810190614bdc565b91965094509250905060ff81166006811115611e6357fe5b9450509193509193565b60008060608080611e84868563ffffffff61307116565b94506001600160e01b0319851663a7cb5fb760e01b14611eb65760405162461bcd60e51b81526004016108059061566a565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006117ec84611f376040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b61360b565b6060808251604051908082528060200260200182016040528015611f6a578160200160208202803883390190505b50905060005b83518114611da857838181518110611f8457fe5b60200260200101516001600160a01b031631828281518110611fa257fe5b6020908102919091010152600101611f70565b606060008451905080604051908082528060200260200182016040528015611fe7578160200160208202803883390190505b50915060005b81811461206f5761203886828151811061200357fe5b602002602001015186838151811061201757fe5b602002602001015186848151811061202b57fe5b60200260200101516127e9565b83828151811061204457fe5b6020026020010190600481111561205757fe5b9081600481111561206457fe5b905250600101611fed565b50509392505050565b60405160609063012b8bc960e11b906120979085908590602401615025565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606120e48561077261361a565b84516120fa90869060049063ffffffff61302e16565b8060200190516109f89190810190614221565b60405160609063a7cb5fb760e01b90612130908790879087908790602401614f67565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612181848463ffffffff61307116565b92506001600160e01b031983166394cfcdd760e01b146121b35760405162461bcd60e51b81526004016108059061566a565b83516121c990859060049063ffffffff61314716565b8060200190516121dc919081019061468f565b9395909450915050565b600060606121f683610772613625565b825161220c90849060049063ffffffff61302e16565b806020019051610960919081019061476b565b60065481565b60008060608161223b858263ffffffff61307116565b93506001600160e01b0319841663619ce88560e11b1461226d5760405162461bcd60e51b81526004016108059061566a565b845161228390869060049063ffffffff61314716565b80602001905161229691908101906141ca565b9597919650949350915050565b6000806122b283610772613630565b60006122cb600485518661302e9092919063ffffffff16565b8060200190516122de9190810190614b78565b9250905060ff81166001811115610a5557fe5b606060008251905080604051908082528060200260200182016040528015612323578160200160208202803883390190505b50915060005b818114610bd45761234085858381518110611d5457fe5b83828151811061234c57fe5b6020908102919091010152600101612329565b600080612372838263ffffffff61307116565b90506001600160e01b031981166394cfcdd760e01b141561240b576060806123998561216c565b80519194509250905060005b8181146124005760006123be89858481518110610ba857fe5b905060008583815181106123ce57fe5b602002602001015182816123de57fe5b049050878110806123ed575087155b156123f6578097505b50506001016123a5565b506108db9350505050565b6001600160e01b03198116630f47261b60e41b141561246457600061243784601063ffffffff6130a516565b600154604051919250606091636eb1769f60e11b9161188d9189916001600160a01b031690602401614f29565b6001600160e01b0319811663012b8bc960e11b141561269757600080612489856107bf565b6002546040519295509093506060925063e985e9c560e01b916124bc918a916001600160a01b0390911690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161250d9190614ef9565b600060405180830381855afa9150503d8060008114612548576040519150601f19603f3d011682016040523d82523d6000602084013e61254d565b606091505b509150915081158061256157508051602014155b8061257d575061257881600063ffffffff6130d816565b600114155b156126885760405160609063020604bf60e21b9061259f9087906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516125ec9190614ef9565b600060405180830381855afa9150503d8060008114612627576040519150601f19603f3d011682016040523d82523d6000602084013e61262c565b606091505b509093509150828015612640575081516020145b801561266f57506002546001600160a01b031661266483600c63ffffffff6130a516565b6001600160a01b0316145b61267a57600061267d565b60015b60ff16975050611c14565b60001996505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b14156127c55760006126bb84611e6d565b50506003546040519294506060935063e985e9c560e01b926126ec925089916001600160a01b031690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161273d9190614ef9565b600060405180830381855afa9150503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b5091509150818015612790575080516020145b80156127ac57506127a881600063ffffffff6130d816565b6001145b6127b757600061194d565b600019955050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611da857506000199392505050565b60006127f3613afb565b6128468584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161286257505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106128f857fe5b6020026020010181905250878360008151811061291157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061294357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061297157fe5b6020026020010181815250508861014001518460018151811061299057fe5b60200260200101819052508860000151836001815181106129ad57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087826001815181106129db57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612a0d57fe5b602002602001018181525050886101a0015184600281518110612a2c57fe5b60200260200101819052508783600281518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612a7757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612aa957fe5b60200260200101818152505088610180015184600381518110612ac857fe5b6020026020010181905250886000015183600381518110612ae557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612b1757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061177057fe5b6040516060906394cfcdd760e01b9061209790859085906024016151a1565b6000612b7a828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1480612bab57506001600160e01b0319811663012b8bc960e11b145b80612bc657506001600160e01b0319811663a7cb5fb760e01b145b80612be157506001600160e01b031981166394cfcdd760e01b145b80612bfc57506001600160e01b0319811663619ce88560e11b145b612c185760405162461bcd60e51b81526004016108059061566a565b919050565b606080606060008551905080604051908082528060200260200182016040528015612c6257816020015b612c4f613b2a565b815260200190600190039081612c475790505b50935080604051908082528060200260200182016040528015612c8f578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612cbc578160200160208202803883390190505b50915060005b818114612d4c57612cf9878281518110612cd857fe5b6020026020010151878381518110612cec57fe5b6020026020010151612d6e565b8751889085908110612d0757fe5b60200260200101878581518110612d1a57fe5b60200260200101878681518110612d2d57fe5b9315156020948502919091019093019290925291905252600101612cc2565b50509250925092565b606080612d6284846122f1565b91506108538484610b59565b612d76613b2a565b600554604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990612dab9088906004016156b6565b60606040518083038186803b158015612dc357600080fd5b505afa158015612dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612dfb9190810190614883565b855160055460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f90612e3490899089906004016156c9565b60206040518083038186803b158015612e4c57600080fd5b505afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e8491908101906146e5565b91506000612e97828861014001516108b9565b60a088015160c08901516101808a01516101408b015193945091929091600091612ec69163ffffffff61363b16565b15612ef357612eec84612ee6848d6080015161366090919063ffffffff16565b8561367c565b9050612f4c565b81612f0757612eec848b608001518561367c565b6000612f18868c61018001516108b9565b90506000612f2b868d608001518761367c565b90506000612f3a83868861367c565b9050612f4682826130ef565b93505050505b612f6c612f6689604001518561369e90919063ffffffff16565b826130ef565b96506004612f7f8b8c602001518a61150e565b6004811115612f8a57fe5b14612f96576000612f98565b865b965050505050509250925092565b6000806000612fb7846107726136bd565b6000612fd0600486518761302e9092919063ffffffff16565b8060200190516108999190810190614ba5565b63fdb6ca8d60e01b90565b6000612ffb836000613071565b90506001600160e01b0319808216908316146130295760405162461bcd60e51b815260040161080590615644565b505050565b60608183111561304c5761304c613047600085856136c8565b6136e7565b83518211156130655761306561304760018487516136c8565b50819003910190815290565b600081600401835110156130925761309261304760038551856004016136c8565b5001602001516001600160e01b03191690565b600081601401835110156130c6576130c661304760048551856014016136c8565b5001601401516001600160a01b031690565b6000610c8883836136ef565b6318e4b14160e01b90565b60008183106130fe5781610c88565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b60608183111561316057613160613047600085856136c8565b83518211156131795761317961304760018487516136c8565b8282036040519080825280601f01601f1916602001820160405280156131a6576020820181803883390190505b509050610c886131b582613719565b846131bf87613719565b01835161371f565b60608060606131e360048551866131479092919063ffffffff16565b80602001905161091b9190810190614590565b60408051600180825281830190925260609182918291816020015b613219613a68565b8152602001906001900390816132115750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081613262575050845190915061328f90859060049063ffffffff61314716565b8060200190516132a29190810190614a57565b856000815181106132af57fe5b60200260200101856000815181106132c357fe5b60200260200101856000815181106132d757fe5b6020908102919091010192909252919052529193909250565b60408051600180825281830190925260609182918291602080830190803883395050855191935061332c9186915060049063ffffffff61314716565b80602001905161333f9190810190614609565b8451859060009061334c57fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b613376613afb565b6020810184905260a085015160808601516133929186916137c4565b815260a085015160c08601516133a99186916137c4565b604082015260a085015160e08601516133c39186916137c4565b60608201526133d8828463ffffffff6137f816565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061340b90889088908890889060240161503e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260055491519092506060916001600160a01b03169061345d908490614ef9565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b509150600090506134b6828263ffffffff61307116565b90506134c061311b565b6001600160e01b0319828116911614156134fd5760006134df8361096a565b5091505060ff811660048111156134f257fe5b9450505050506117ec565b613505613105565b6001600160e01b031982811691161415613538576000613524836108e1565b509091505060ff811660048111156134f257fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0141561357257600493505050506117ec565b60405162461bcd60e51b8152600401610805906155b9565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610c88826135f085613829565b6138a4565b6350ae068360e11b90565b630fcb446360e31b90565b6000610c88826135f0856138c3565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610c885750508051602091820120825192909101919091201490565b600082820183811015610c8857610c886130476000868661397c565b60006117ec83613692868563ffffffff6137f816565b9063ffffffff61399b16565b6000828211156136b7576136b76130476002858561397c565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610c53939291906154c4565b805160208201fd5b600081602001835110156137105761371061304760058551856020016136c8565b50016020015190565b60200190565b6020811015613749576001816020036101000a038019835116818551168082178652505050613029565b8282141561375657613029565b828211156137905760208103905080820181840181515b8285101561378857845186526020958601959094019361376d565b905250613029565b60208103905080820181840183515b818612156137bb5782518252601f19928301929091019061379f565b85525050505050565b60006137d18484846139c5565b156137e4576137e4613047858585613a2b565b6117ec83613692868563ffffffff6137f816565b600082613807575060006108db565b8282028284828161381457fe5b0414610c8857610c886130476001868661397c565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a75349390929091602087101561390f57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610c5393929190615455565b6000816139b1576139b16130476003858561397c565b60008284816139bc57fe5b04949350505050565b6000826139d7576139d7613047613a4a565b8115806139e2575083155b156139ef57506000610c88565b600083806139f957fe5b8584099050613a0e858463ffffffff6137f816565b613a20826103e863ffffffff6137f816565b101595945050505050565b606063339f3de260e01b848484604051602401610c53939291906156ee565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b80356108db816157c7565b80516108db816157c7565b600082601f830112613b70578081fd5b8135613b83613b7e8261572a565b615704565b818152915060208083019084810181840286018201871015613ba457600080fd5b60005b84811015611da3578135613bba816157c7565b84529282019290820190600101613ba7565b600082601f830112613bdc578081fd5b8151613bea613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c128760208451890101613e4c565b83526020928301929190910190600101613bfa565b5050505092915050565b600082601f830112613c41578081fd5b8135613c4f613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c778760208435890101613dfe565b83526020928301929190910190600101613c5f565b600082601f830112613c9c578081fd5b8151613caa613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613cd28760208451890101613fe0565b83526020928301929190910190600101613cba565b600082601f830112613cf7578081fd5b8135613d05613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613d2d8760208435890101613e92565b83526020928301929190910190600101613d15565b600082601f830112613d52578081fd5b8151613d60613b7e8261572a565b818152915060208083019084810181840286018201871015613d8157600080fd5b60005b84811015611da357815184529282019290820190600101613d84565b600082601f830112613db0578081fd5b8135613dbe613b7e8261572a565b818152915060208083019084810181840286018201871015613ddf57600080fd5b60005b84811015611da357813584529282019290820190600101613de2565b600082601f830112613e0e578081fd5b8135613e1c613b7e82615749565b9150808252836020828501011115613e3357600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613e5c578081fd5b8151613e6a613b7e82615749565b9150808252836020828501011115613e8157600080fd5b611da881602084016020860161576c565b60006101c0808385031215613ea5578182fd5b613eae81615704565b915050613ebb8383613b4a565b8152613eca8360208401613b4a565b6020820152613edc8360408401613b4a565b6040820152613eee8360608401613b4a565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b0380821115613f4f57600080fd5b613f5b86838701613dfe565b83850152610160925082850135915080821115613f7757600080fd5b613f8386838701613dfe565b83850152610180925082850135915080821115613f9f57600080fd5b613fab86838701613dfe565b838501526101a0925082850135915080821115613fc757600080fd5b50613fd485828601613dfe565b82840152505092915050565b60006101c0808385031215613ff3578182fd5b613ffc81615704565b9150506140098383613b55565b81526140188360208401613b55565b602082015261402a8360408401613b55565b604082015261403c8360608401613b55565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561409d57600080fd5b6140a986838701613e4c565b838501526101609250828501519150808211156140c557600080fd5b6140d186838701613e4c565b838501526101809250828501519150808211156140ed57600080fd5b6140f986838701613e4c565b838501526101a092508285015191508082111561411557600080fd5b50613fd485828601613e4c565b805160ff811681146108db57600080fd5b600060208284031215614144578081fd5b8135610c88816157c7565b60008060408385031215614161578081fd5b825161416c816157c7565b602084015190925061417d816157c7565b809150509250929050565b60008060006060848603121561419c578081fd5b83516141a7816157c7565b60208501519093506141b8816157c7565b80925050604084015190509250925092565b6000806000606084860312156141de578081fd5b83516141e9816157c7565b60208501519093506001600160401b03811115614204578182fd5b61421086828701613e4c565b925050604084015190509250925092565b60008060008060808587031215614236578182fd5b8451614241816157c7565b60208601519094506001600160401b038082111561425d578384fd5b61426988838901613e4c565b9450604087015191508082111561427e578384fd5b61428a88838901613e4c565b9350606087015191508082111561429f578283fd5b506142ac87828801613e4c565b91505092959194509250565b600080604083850312156142ca578182fd5b82356142d5816157c7565b915060208301356001600160401b038111156142ef578182fd5b6142fb85828601613c31565b9150509250929050565b6000806000806080858703121561431a578182fd5b8435614325816157c7565b935060208501356001600160401b0380821115614340578384fd5b61434c88838901613da0565b94506040870135915080821115614361578384fd5b61436d88838901613da0565b93506060870135915080821115614382578283fd5b506142ac87828801613dfe565b600080604083850312156143a1578182fd5b82356143ac816157c7565b915060208301356001600160401b038111156143c6578182fd5b6142fb85828601613dfe565b6000806000606084860312156143e6578081fd5b83356143f1816157c7565b925060208401356001600160401b0381111561440b578182fd5b61441786828701613dfe565b925050604084013590509250925092565b6000806040838503121561443a578182fd5b8235614445816157c7565b946020939093013593505050565b600060208284031215614464578081fd5b81356001600160401b03811115614479578182fd5b6117ec84828501613b60565b600060208284031215614496578081fd5b81516001600160401b038111156144ab578182fd5b6117ec84828501613c8c565b6000806000606084860312156144cb578081fd5b83356001600160401b03808211156144e1578283fd5b6144ed87838801613ce7565b94506020860135915080821115614502578283fd5b61450e87838801613b60565b93506040860135915080821115614523578283fd5b5061453086828701613da0565b9150509250925092565b6000806040838503121561454c578182fd5b82356001600160401b0380821115614562578384fd5b61456e86838701613ce7565b93506020850135915080821115614583578283fd5b506142fb85828601613c31565b6000806000606084860312156145a4578081fd5b83516001600160401b03808211156145ba578283fd5b6145c687838801613c8c565b945060208601519150808211156145db578283fd5b6145e787838801613d42565b935060408601519150808211156145fc578283fd5b5061453086828701613bcc565b60008060006060848603121561461d578081fd5b83516001600160401b0380821115614633578283fd5b61463f87838801613c8c565b94506020860151935060408601519150808211156145fc578283fd5b6000806040838503121561466d578182fd5b82356001600160401b0380821115614683578384fd5b61456e86838701613da0565b600080604083850312156146a1578182fd5b82516001600160401b03808211156146b7578384fd5b6146c386838701613d42565b935060208501519150808211156146d8578283fd5b506142fb85828601613bcc565b6000602082840312156146f6578081fd5b81518015158114610c88578182fd5b6000806000806080858703121561471a578182fd5b84519350602085015161472c816157c7565b60408601519093506001600160401b038082111561427e578384fd5b6000806040838503121561475a578182fd5b505080516020909101519092909150565b6000806040838503121561477d578182fd5b8251915060208301516001600160401b03811115614799578182fd5b6142fb85828601613e4c565b6000806000606084860312156147b9578081fd5b8351925060208401516001600160401b03808211156147d6578283fd5b6147e287838801613e4c565b935060408601519150808211156147f7578283fd5b5061453086828701613e4c565b60008060408385031215614816578182fd5b82519150602083015161417d816157dc565b6000806040838503121561483a578182fd5b82516001600160e01b03198116811461416c578283fd5b600060208284031215614862578081fd5b81356001600160401b03811115614877578182fd5b6117ec84828501613dfe565b600060608284031215614894578081fd5b61489e6060615704565b6148a88484614122565b815260208301516020820152604083015160408201528091505092915050565b6000602082840312156148d9578081fd5b81516001600160401b038111156148ee578182fd5b6117ec84828501613fe0565b60008060006060848603121561490e578081fd5b83356001600160401b03811115614923578182fd5b61492f86828701613e92565b9350506020840135614940816157c7565b929592945050506040919091013590565b60008060408385031215614963578182fd5b82356001600160401b0380821115614979578384fd5b61498586838701613e92565b9350602085013591508082111561499a578283fd5b506142fb85828601613dfe565b6000806000606084860312156149bb578081fd5b83356001600160401b038111156149d0578182fd5b6149dc86828701613e92565b9350506020840135915060408401356149f4816157c7565b809150509250925092565b60008060008060808587031215614a14578182fd5b84516001600160401b0380821115614a2a578384fd5b614a3688838901613fe0565b95506020870151915080821115614a4b578384fd5b61426988838901613fe0565b600080600060608486031215614a6b578081fd5b83516001600160401b0380821115614a81578283fd5b614a8d87838801613fe0565b94506020860151935060408601519150808211156147f7578283fd5b600080600060608486031215614abd578081fd5b83356001600160401b0380821115614ad3578283fd5b81860160a08189031215614ae5578384fd5b614aef60a0615704565b9250803583526020810135602084015260408101356040840152614b168860608301613b4a565b6060840152608081013582811115614b2c578485fd5b614b3889828401613dfe565b608085015250919450505060208401359150614b578560408601613b4a565b90509250925092565b600060208284031215614b71578081fd5b5051919050565b60008060408385031215614b8a578182fd5b8251614b95816157dc565b6020939093015192949293505050565b600080600060608486031215614bb9578081fd5b8351614bc4816157dc565b6020850151604086015191945092506149f4816157c7565b60008060008060808587031215614bf1578182fd5b614bfb8686614122565b9350602085015192506040850151614c12816157c7565b60608601519092506001600160401b03811115614c2d578182fd5b6142ac87828801613e4c565b600080600060608486031215614c4d578081fd5b614c578585614122565b92506020840151915060408401516001600160401b03811115614c78578182fd5b61453086828701613e4c565b600080600060608486031215614c98578081fd5b614ca28585614122565b925060208401519150604084015190509250925092565b1515815260200190565b6000614ccf8383614ddc565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614d1e5781516001600160a01b0316865260209586019590910190600101614cf7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614d73578284038852614d5d848351614db0565b6020988901989094509190910190600101614d45565b50919695505050505050565b6000815180845260208401935060208301825b82811015614d1e578151865260209586019590910190600101614d92565b60008151808452614dc881602086016020860161576c565b601f01601f19169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b60006101c0614e08848451614cd7565b6020830151614e1a6020860182614cd7565b506040830151614e2d6040860182614cd7565b506060830151614e406060860182614cd7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614e9983870182614db0565b91505061016091508184015185820383870152614eb68282614db0565b925050506101808084015185830382870152614ed28382614db0565b9150506101a091508184015185820383870152614eef8282614db0565b9695505050505050565b60008251614f0b81846020870161576c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385168152608060208201819052600090614f8b90830186614d7f565b8281036040840152614f9d8186614d7f565b8381036060850152614faf8186614db0565b98975050505050505050565b6001600160a01b0384168152606060208201819052600090614fdf90830185614db0565b9050826040830152949350505050565b6001600160a01b038516815260806020820181905260009061501390830186614db0565b8281036040840152614f9d8186614db0565b6001600160a01b03929092168252602082015260400190565b6000608082526150516080830187614d28565b82810360208401526150638187614ce4565b83810360408501526150758187614ce4565b915050828103606084015261508a8185614d7f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156150d7578351600581106150c357fe5b8352602093840193909201916001016150af565b509095945050505050565b600060608201606083528086516150f981846151f4565b9150602088019250835b8181101561512757615116838551614cc3565b602094909401939250600101615103565b5050838103602085015261513b8187614d7f565b915050828103604084015280845161515381846151f4565b9150602086019250835b8181101561518157615170838551614cb9565b60209490940193925060010161515d565b5090979650505050505050565b600060208252610c886020830184614d7f565b6000604082526151b46040830185614d7f565b82810360208401526151c68185614d28565b95945050505050565b6000604082526151e26040830185614d7f565b82810360208401526151c68185614d7f565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061522790830185614db0565b828103606084015261508a8185614db0565b918252602082015260400190565b6000838252604060208301526117ec6040830184614db0565b6000848252606060208301526152796060830185614db0565b8281036040840152614eef8185614db0565b8281526040810161529b836157bd565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319861681526001600160a01b038516602082015260a06040820181905260009061531490830186614d7f565b82810360608401526153268186614d7f565b83810360808501526117888186614db0565b6001600160e01b0319851681526001600160a01b038416602082015260806040820181905260009061536c90830185614db0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b85168252606060208301526153ca6060830185614d7f565b8281036040840152614eef8185614d28565b600060208252610c886020830184614db0565b6000608082526154026080830187614db0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b60006154388561579c565b848252836020830152606060408301526151c66060830184614db0565b60608101615462856157a9565b938152602081019290925260409091015290565b60608101615483856157b3565b93815260208101929092526001600160a01b031660409091015290565b604081016154ad846157a9565b9281526020015290565b60608101615462856157b3565b606081016008851061546257fe5b60208101600583106154e057fe5b91905290565b60006154f1866157bd565b858252602082018590526001600160a01b0384166040830152608060608301819052614eef90830184614db0565b604081016154ad8461579c565b60006080825261553f6080830187614db0565b602083820381850152818751808452828401915082838202850101838a01865b8381101561558d57601f1987840301855261557b838351614df8565b9486019492509085019060010161555f565b505086810360408801526155a1818a614d7f565b945050505050828103606084015261508a8185614d28565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a081016156a08286614ddc565b8360608301528215156080830152949350505050565b600060208252610c886020830184614df8565b6000604082526156dc6040830185614df8565b82810360208401526151c68185614db0565b9283526020830191909152604082015260600190565b6040518181016001600160401b038111828210171561572257600080fd5b604052919050565b60006001600160401b0382111561573f578081fd5b5060209081020190565b60006001600160401b0382111561575e578081fd5b50601f01601f191660200190565b60005b8381101561578757818101518382015260200161576f565b83811115615796576000848401525b50505050565b600281106157a657fe5b50565b600481106157a657fe5b600381106157a657fe5b600781106157a657fe5b6001600160a01b03811681146157a657600080fd5b60ff811681146157a657600080fdfea365627a7a723158204793664dee66dcabc4a710b9901a17d347a2ff1fb84df266b96a650f614b87756c6578706572696d656e74616cf564736f6c634300050f0040" + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106102745760003560e01c80639a7e752611610151578063ca49f47c116100c3578063d3d862d111610087578063d3d862d1146106a9578063d4695028146106bc578063e25cabf7146106dc578063e4e6e7da146106fe578063e77286eb1461071f578063ee4f5a941461074157610274565b8063ca49f47c1461062c578063cafd3a071461064f578063d001c5dc14610670578063d186037f14610683578063d36379051461069657610274565b8063a6627e9f11610115578063a6627e9f14610598578063acaedc74146105ab578063b43cffe1146105ce578063bbb2dcf6146105e1578063bc03f96414610603578063c26cfecd1461062457610274565b80639a7e75261461050b5780639eadc8351461052e578063a070cac814610552578063a0901e5114610565578063a5cd62ba1461057857610274565b80634dfdac20116101ea5780637914b2ec116101ae5780637914b2ec146104705780637982653e1461049157806379c9c426146104b15780637b66ad34146104c45780637d727512146104e55780638f4ce479146104f857610274565b80634dfdac20146103d8578063590aa875146103f857806363eb399214610418578063651290421461042b5780636f83188e1461044d57610274565b8063314853ff1161023c578063314853ff14610328578063327d30541461034a57806332aae3ad1461035d5780633db6dc611461037f578063459be5e2146103a257806346eb65cb146103c357610274565b806302d0aec31461027957806304a5618a146102a35780630d7b7d76146102c5578063165979e1146102e65780632322cf7614610308575b600080fd5b61028c610287366004614851565b610763565b60405161029a92919061528b565b60405180910390f35b6102b66102b1366004614851565b6107bf565b60405161029a9392919061537d565b6102d86102d336600461438f565b61083a565b60405161029a929190615239565b6102f96102f4366004614851565b61085c565b60405161029a939291906154b7565b61031b61031636600461438f565b6108b9565b60405161029a91906151f4565b61033b610336366004614851565b6108e1565b60405161029a93929190615260565b6102d8610358366004614851565b610928565b61037061036b366004614851565b61096a565b60405161029a9392919061542d565b61039261038d366004614851565b6109bd565b60405161029a94939291906151fd565b6103b56103b0366004614851565b610a07565b60405161029a9291906154a0565b6103d66103d1366004614851565b610a5d565b005b6103eb6103e63660046142b8565b610b59565b60405161029a919061518e565b61040b610406366004614133565b610bdc565b60405161029a91906153dc565b61040b6104263660046143d2565b610c32565b61043e610439366004614851565b610c8f565b60405161029a93929190614f43565b61046061045b366004614851565b610cc9565b60405161029a949392919061552c565b61048361047e366004614851565b6114d6565b60405161029a9291906152bd565b6104a461049f3660046148fa565b61150e565b60405161029a91906154d2565b61031b6104bf366004614aa9565b611795565b6104d76104d2366004614851565b6117f4565b60405161029a929190614f29565b61031b6104f336600461438f565b61182c565b610483610506366004614851565b611daf565b61051e610519366004614851565b611e0c565b60405161029a94939291906154e6565b61054161053c366004614851565b611e6d565b60405161029a9594939291906152e0565b61031b6105603660046149a7565b611ee5565b6103eb610573366004614453565b611f3c565b61058b6105863660046144b7565b611fb5565b60405161029a9190615095565b61040b6105a6366004614428565b612078565b6105be6105b9366004614851565b6120d1565b60405161029a9493929190614fef565b61040b6105dc366004614305565b61210d565b6105f46105ef366004614851565b61216c565b60405161029a939291906153a8565b610616610611366004614851565b6121e6565b60405161029a929190615247565b61031b61221f565b61063f61063a366004614851565b612225565b60405161029a9493929190615338565b61066261065d366004614851565b6122a3565b60405161029a92919061551f565b6103eb61067e3660046142b8565b6122f1565b61031b61069136600461438f565b61235f565b6104a46106a43660046148fa565b6127e9565b61040b6106b736600461465b565b612b49565b6106cf6106ca366004614851565b612b68565b60405161029a91906152a8565b6106ef6106ea36600461453a565b612c1d565b60405161029a939291906150e2565b61071161070c3660046142b8565b612d55565b60405161029a9291906151cf565b61073261072d366004614951565b612d6e565b60405161029a93929190615692565b61075461074f366004614851565b612fa6565b60405161029a93929190615476565b60008061077783610772612fe3565b612fee565b6000610790600485518661302e9092919063ffffffff16565b8060200190516107a39190810190614804565b909350905060ff811660068111156107b757fe5b915050915091565b600080806107d3848263ffffffff61307116565b92506001600160e01b0319831663012b8bc960e11b1461080e5760405162461bcd60e51b81526004016108059061566a565b60405180910390fd5b61081f84601063ffffffff6130a516565b915061083284602463ffffffff6130d816565b929491935050565b600080610847848461182c565b9150610853848461235f565b90509250929050565b600080600061086d846107726130e4565b6000610886600486518761302e9092919063ffffffff16565b8060200190516108999190810190614c84565b9094509250905060ff811660028111156108af57fe5b9350509193909250565b60008060006108c8858561083a565b915091506108d682826130ef565b925050505b92915050565b60006060806108f284610772613105565b835161090890859060049063ffffffff61302e16565b80602001905161091b91908101906147a5565b9196909550909350915050565b60008061093783610772613110565b825161094d90849060049063ffffffff61302e16565b8060200190516109609190810190614748565b9094909350915050565b600080606061097b8461077261311b565b6000610994600486518761302e9092919063ffffffff16565b8060200190516109a79190810190614c39565b9094509250905060ff811660018111156108af57fe5b6000806060806109cf85610772613126565b84516109e590869060049063ffffffff61302e16565b8060200190516109f89190810190614705565b92989197509550909350915050565b600080610a1683610772613131565b6000610a2f600485518661302e9092919063ffffffff16565b806020019051610a429190810190614b78565b9250905060ff81166003811115610a5557fe5b925050915091565b6000610a6f828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1415610a9a57610a9382611daf565b5050610b55565b6001600160e01b0319811663012b8bc960e11b1415610ac457610abc826107bf565b505050610b55565b6001600160e01b0319811663a7cb5fb760e01b1415610af057610ae682611e6d565b5050505050610b55565b6001600160e01b031981166394cfcdd760e01b1415610b1257610abc8261216c565b6001600160e01b0319811663619ce88560e11b1415610b3d57610b3482612225565b50505050610b55565b60405162461bcd60e51b81526004016108059061566a565b5050565b606060008251905080604051908082528060200260200182016040528015610b8b578160200160208202803883390190505b50915060005b818114610bd457610bb585858381518110610ba857fe5b602002602001015161235f565b838281518110610bc157fe5b6020908102919091010152600101610b91565b505092915050565b604051606090630f47261b60e41b90610bf9908490602401614f15565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610c5390869086908690602401614fbb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610ca08461077261313c565b8351610cb690859060049063ffffffff61302e16565b80602001905161091b9190810190614188565b60608080806000610ce0868263ffffffff61307116565b90506001600160e01b0319811663dedfc1f160e01b1415610d2c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b81525094506110d8565b6001600160e01b03198116634b4a520160e11b1415610d74576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b81525094506110d8565b6001600160e01b031981166323aa37f960e21b1415610dc35760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b03198116632fbb8b8560e21b1415610e115760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b81525094506110d8565b6001600160e01b03198116632da6298760e01b1415610e55576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b81525094506110d8565b6001600160e01b03198116634da26aab60e11b1415610e9757604051806040016040528060098152602001683334b63627b93232b960b91b81525094506110d8565b6001600160e01b03198116633852d63160e21b1415610edf576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b81525094506110d8565b6001600160e01b031981166378d29ac160e01b1415610f2e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b81525094506110d8565b6001600160e01b0319811663369da09960e01b1415610f84576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f7700000000000000000081525094506110d8565b6001600160e01b03198116638bc8efb360e01b1415610fda576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c0000000000000081525094506110d8565b6001600160e01b0319811663a6c3bf3360e01b1415611030576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c00000000000081525094506110d8565b6001600160e01b031981166388ec79fb60e01b1415611074576040518060400160405280600b81526020016a6d617463684f726465727360a81b81525094506110d8565b6001600160e01b03198116634f9559b160e01b14806110a357506001600160e01b031981166302280c9160e41b145b156110c05760405162461bcd60e51b81526004016108059061561d565b60405162461bcd60e51b8152600401610805906155e6565b6001600160e01b0319811663dedfc1f160e01b141561116457855161110790879060049063ffffffff61314716565b80602001905161111a9190810190614485565b604080516000808252602082019092529195505b506040805160008082526020820190925291945061115c565b60608152602001906001900390816111475790505b5091506114ce565b6001600160e01b03198116632fbb8b8560e21b148061119357506001600160e01b03198116634b4a520160e11b145b806111ae57506001600160e01b031981166323aa37f960e21b145b156111c8576111bc866131c7565b919550935091506114ce565b6001600160e01b03198116632da6298760e01b14156112975760408051600180825281830190925290816020015b6111fe613a68565b8152602001906001900390816111f6575050865190945061122990879060049063ffffffff61314716565b80602001905161123c91908101906148c8565b8460008151811061124957fe5b6020026020010181905250600060405190808252806020026020018201604052801561112e57816020016020820280388339019050506040805160008082526020820190925291945061115c565b6001600160e01b03198116633852d63160e21b14806112c657506001600160e01b03198116634da26aab60e11b145b156112d4576111bc866131f6565b6001600160e01b031981166378d29ac160e01b148061130357506001600160e01b0319811663369da09960e01b145b8061131e57506001600160e01b03198116638bc8efb360e01b145b8061133957506001600160e01b0319811663a6c3bf3360e01b145b15611347576111bc866132f0565b6001600160e01b031981166388ec79fb60e01b14156114ce57611368613a68565b611370613a68565b60608061138a60048b518c6131479092919063ffffffff16565b80602001905161139d91908101906149ff565b604080516002808252606082019092529498509296509094509250816020015b6113c5613a68565b8152602001906001900390816113bd57905050975083886000815181106113e857fe5b6020026020010181905250828860018151811061140157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061144157fe5b6020026020010181815250508260a001518760018151811061145f57fe5b60209081029190910101526040805160028082526060820190925290816020015b606081526020019060019003908161148057905050955081866000815181106114a557fe5b602002602001018190525080866001815181106114be57fe5b6020026020010181905250505050505b509193509193565b6000806114e583610772613364565b82516114fb90849060049063ffffffff61302e16565b8060200190516109609190810190614828565b6000611518613afb565b6115a98584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b505afa15801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115a39190810190614b60565b3a61336e565b60408051600280825260608281019093529293509091816020015b60608152602001906001900390816115c457505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061165357fe5b602002602001018190525088600001518360008151811061167057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061169e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106116d057fe5b602002602001018181525050886101800151846001815181106116ef57fe5b602002602001018190525088600001518360018151811061170c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061177057fe5b602002602001018181525050611788848484846133e5565b9998505050505050505050565b60006117ec846117e76040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b6135e1565b949350505050565b600080611803836107726135f5565b825161181990849060049063ffffffff61302e16565b806020019051610960919081019061414f565b60008061183f838263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b141561195857600061186d84601063ffffffff6130a516565b6040519091506060906370a0823160e01b9061188d908890602401614f15565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516118de9190614ef9565b600060405180830381855afa9150503d8060008114611919576040519150601f19603f3d011682016040523d82523d6000602084013e61191e565b606091505b5091509150818015611931575080516020145b61193c57600061194d565b61194d81600063ffffffff6130d816565b955050505050611da8565b6001600160e01b0319811663012b8bc960e11b1415611a975760008061197d856107bf565b6040519194509250606091506331a9108f60e11b906119a09084906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119f19190614ef9565b600060405180830381855afa9150503d8060008114611a2c576040519150601f19603f3d011682016040523d82523d6000602084013e611a31565b606091505b50915091506000828015611a46575081516020145b611a51576000611a62565b611a6282600c63ffffffff6130a516565b9050896001600160a01b0316816001600160a01b031614611a84576000611a87565b60015b60ff169750505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b1415611c1e576000606080611abe86611e6d565b5081519296509094509250905060005b818114611c14578351606090627eeac760e11b908b90879085908110611af057fe5b6020026020010151604051602401611b09929190615025565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b5a9190614ef9565b600060405180830381855afa9150503d8060008114611b95576040519150601f19603f3d011682016040523d82523d6000602084013e611b9a565b606091505b50915091506000828015611baf575081516020145b611bba576000611bcb565b611bcb82600063ffffffff6130d816565b90506000878681518110611bdb57fe5b60200260200101518281611beb57fe5b0490508b811080611bfa57508b155b15611c0357809b505b505060019093019250611ace915050565b5050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611d0a57604051606090632a17967960e21b90611c5b908690600090819081906024016153ef565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cad908490614ef9565b600060405180830381855afa9150503d8060008114611ce8576040519150601f19603f3d011682016040523d82523d6000602084013e611ced565b606091505b5050905080611cfd576000611d01565b6000195b93505050611da8565b6001600160e01b031981166394cfcdd760e01b1415611da857606080611d2f8561216c565b80519194509250905060005b818114611da3576000611d6189858481518110611d5457fe5b602002602001015161182c565b90506000858381518110611d7157fe5b60200260200101518281611d8157fe5b04905087811080611d90575087155b15611d99578097505b5050600101611d3b565b505050505b5092915050565b600080611dc2838263ffffffff61307116565b91506001600160e01b03198216630f47261b60e41b14611df45760405162461bcd60e51b81526004016108059061566a565b611e0583601063ffffffff6130a516565b9050915091565b60008060006060611e1f85610772613600565b6000611e38600487518861302e9092919063ffffffff16565b806020019051611e4b9190810190614bdc565b91965094509250905060ff81166006811115611e6357fe5b9450509193509193565b60008060608080611e84868563ffffffff61307116565b94506001600160e01b0319851663a7cb5fb760e01b14611eb65760405162461bcd60e51b81526004016108059061566a565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006117ec84611f376040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b815250878761358a565b61360b565b6060808251604051908082528060200260200182016040528015611f6a578160200160208202803883390190505b50905060005b83518114611da857838181518110611f8457fe5b60200260200101516001600160a01b031631828281518110611fa257fe5b6020908102919091010152600101611f70565b606060008451905080604051908082528060200260200182016040528015611fe7578160200160208202803883390190505b50915060005b81811461206f5761203886828151811061200357fe5b602002602001015186838151811061201757fe5b602002602001015186848151811061202b57fe5b60200260200101516127e9565b83828151811061204457fe5b6020026020010190600481111561205757fe5b9081600481111561206457fe5b905250600101611fed565b50509392505050565b60405160609063012b8bc960e11b906120979085908590602401615025565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606120e48561077261361a565b84516120fa90869060049063ffffffff61302e16565b8060200190516109f89190810190614221565b60405160609063a7cb5fb760e01b90612130908790879087908790602401614f67565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612181848463ffffffff61307116565b92506001600160e01b031983166394cfcdd760e01b146121b35760405162461bcd60e51b81526004016108059061566a565b83516121c990859060049063ffffffff61314716565b8060200190516121dc919081019061468f565b9395909450915050565b600060606121f683610772613625565b825161220c90849060049063ffffffff61302e16565b806020019051610960919081019061476b565b60065481565b60008060608161223b858263ffffffff61307116565b93506001600160e01b0319841663619ce88560e11b1461226d5760405162461bcd60e51b81526004016108059061566a565b845161228390869060049063ffffffff61314716565b80602001905161229691908101906141ca565b9597919650949350915050565b6000806122b283610772613630565b60006122cb600485518661302e9092919063ffffffff16565b8060200190516122de9190810190614b78565b9250905060ff81166001811115610a5557fe5b606060008251905080604051908082528060200260200182016040528015612323578160200160208202803883390190505b50915060005b818114610bd45761234085858381518110611d5457fe5b83828151811061234c57fe5b6020908102919091010152600101612329565b600080612372838263ffffffff61307116565b90506001600160e01b031981166394cfcdd760e01b141561240b576060806123998561216c565b80519194509250905060005b8181146124005760006123be89858481518110610ba857fe5b905060008583815181106123ce57fe5b602002602001015182816123de57fe5b049050878110806123ed575087155b156123f6578097505b50506001016123a5565b506108db9350505050565b6001600160e01b03198116630f47261b60e41b141561246457600061243784601063ffffffff6130a516565b600154604051919250606091636eb1769f60e11b9161188d9189916001600160a01b031690602401614f29565b6001600160e01b0319811663012b8bc960e11b141561269757600080612489856107bf565b6002546040519295509093506060925063e985e9c560e01b916124bc918a916001600160a01b0390911690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161250d9190614ef9565b600060405180830381855afa9150503d8060008114612548576040519150601f19603f3d011682016040523d82523d6000602084013e61254d565b606091505b509150915081158061256157508051602014155b8061257d575061257881600063ffffffff6130d816565b600114155b156126885760405160609063020604bf60e21b9061259f9087906024016151f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516125ec9190614ef9565b600060405180830381855afa9150503d8060008114612627576040519150601f19603f3d011682016040523d82523d6000602084013e61262c565b606091505b509093509150828015612640575081516020145b801561266f57506002546001600160a01b031661266483600c63ffffffff6130a516565b6001600160a01b0316145b61267a57600061267d565b60015b60ff16975050611c14565b60001996505050505050611da8565b6001600160e01b0319811663a7cb5fb760e01b14156127c55760006126bb84611e6d565b50506003546040519294506060935063e985e9c560e01b926126ec925089916001600160a01b031690602401614f29565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161273d9190614ef9565b600060405180830381855afa9150503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b5091509150818015612790575080516020145b80156127ac57506127a881600063ffffffff6130d816565b6001145b6127b757600061194d565b600019955050505050611da8565b6001600160e01b0319811663619ce88560e11b1415611da857506000199392505050565b60006127f3613afb565b6128468584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156b57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161286257505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106128f857fe5b6020026020010181905250878360008151811061291157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061294357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061297157fe5b6020026020010181815250508861014001518460018151811061299057fe5b60200260200101819052508860000151836001815181106129ad57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505087826001815181106129db57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612a0d57fe5b602002602001018181525050886101a0015184600281518110612a2c57fe5b60200260200101819052508783600281518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612a7757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612aa957fe5b60200260200101818152505088610180015184600381518110612ac857fe5b6020026020010181905250886000015183600381518110612ae557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612b1757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061177057fe5b6040516060906394cfcdd760e01b9061209790859085906024016151a1565b6000612b7a828263ffffffff61307116565b90506001600160e01b03198116630f47261b60e41b1480612bab57506001600160e01b0319811663012b8bc960e11b145b80612bc657506001600160e01b0319811663a7cb5fb760e01b145b80612be157506001600160e01b031981166394cfcdd760e01b145b80612bfc57506001600160e01b0319811663619ce88560e11b145b612c185760405162461bcd60e51b81526004016108059061566a565b919050565b606080606060008551905080604051908082528060200260200182016040528015612c6257816020015b612c4f613b2a565b815260200190600190039081612c475790505b50935080604051908082528060200260200182016040528015612c8f578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612cbc578160200160208202803883390190505b50915060005b818114612d4c57612cf9878281518110612cd857fe5b6020026020010151878381518110612cec57fe5b6020026020010151612d6e565b8751889085908110612d0757fe5b60200260200101878581518110612d1a57fe5b60200260200101878681518110612d2d57fe5b9315156020948502919091019093019290925291905252600101612cc2565b50509250925092565b606080612d6284846122f1565b91506108538484610b59565b612d76613b2a565b600554604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990612dab9088906004016156b6565b60606040518083038186803b158015612dc357600080fd5b505afa158015612dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612dfb9190810190614883565b855160055460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f90612e3490899089906004016156c9565b60206040518083038186803b158015612e4c57600080fd5b505afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e8491908101906146e5565b91506000612e97828861014001516108b9565b60a088015160c08901516101808a01516101408b015193945091929091600091612ec69163ffffffff61363b16565b15612ef357612eec84612ee6848d6080015161366090919063ffffffff16565b8561367c565b9050612f4c565b81612f0757612eec848b608001518561367c565b6000612f18868c61018001516108b9565b90506000612f2b868d608001518761367c565b90506000612f3a83868861367c565b9050612f4682826130ef565b93505050505b612f6c612f6689604001518561369e90919063ffffffff16565b826130ef565b96506004612f7f8b8c602001518a61150e565b6004811115612f8a57fe5b14612f96576000612f98565b865b965050505050509250925092565b6000806000612fb7846107726136bd565b6000612fd0600486518761302e9092919063ffffffff16565b8060200190516108999190810190614ba5565b63fdb6ca8d60e01b90565b6000612ffb836000613071565b90506001600160e01b0319808216908316146130295760405162461bcd60e51b815260040161080590615644565b505050565b60608183111561304c5761304c613047600085856136c8565b6136e7565b83518211156130655761306561304760018487516136c8565b50819003910190815290565b600081600401835110156130925761309261304760038551856004016136c8565b5001602001516001600160e01b03191690565b600081601401835110156130c6576130c661304760048551856014016136c8565b5001601401516001600160a01b031690565b6000610c8883836136ef565b6318e4b14160e01b90565b60008183106130fe5781610c88565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b60608183111561316057613160613047600085856136c8565b83518211156131795761317961304760018487516136c8565b8282036040519080825280601f01601f1916602001820160405280156131a6576020820181803883390190505b509050610c886131b582613719565b846131bf87613719565b01835161371f565b60608060606131e360048551866131479092919063ffffffff16565b80602001905161091b9190810190614590565b60408051600180825281830190925260609182918291816020015b613219613a68565b8152602001906001900390816132115750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081613262575050845190915061328f90859060049063ffffffff61314716565b8060200190516132a29190810190614a57565b856000815181106132af57fe5b60200260200101856000815181106132c357fe5b60200260200101856000815181106132d757fe5b6020908102919091010192909252919052529193909250565b60408051600180825281830190925260609182918291602080830190803883395050855191935061332c9186915060049063ffffffff61314716565b80602001905161333f9190810190614609565b8451859060009061334c57fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b613376613afb565b6020810184905260a085015160808601516133929186916137c4565b815260a085015160c08601516133a99186916137c4565b604082015260a085015160e08601516133c39186916137c4565b60608201526133d8828463ffffffff6137f816565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061340b90889088908890889060240161503e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260055491519092506060916001600160a01b03169061345d908490614ef9565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b509150600090506134b6828263ffffffff61307116565b90506134c061311b565b6001600160e01b0319828116911614156134fd5760006134df8361096a565b5091505060ff811660048111156134f257fe5b9450505050506117ec565b613505613105565b6001600160e01b031982811691161415613538576000613524836108e1565b509091505060ff811660048111156134f257fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0141561357257600493505050506117ec565b60405162461bcd60e51b8152600401610805906155b9565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610c88826135f085613829565b6138a4565b6350ae068360e11b90565b630fcb446360e31b90565b6000610c88826135f0856138c3565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610c885750508051602091820120825192909101919091201490565b600082820183811015610c8857610c886130476000868661397c565b60006117ec83613692868563ffffffff6137f816565b9063ffffffff61399b16565b6000828211156136b7576136b76130476002858561397c565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610c53939291906154c4565b805160208201fd5b600081602001835110156137105761371061304760058551856020016136c8565b50016020015190565b60200190565b6020811015613749576001816020036101000a038019835116818551168082178652505050613029565b8282141561375657613029565b828211156137905760208103905080820181840181515b8285101561378857845186526020958601959094019361376d565b905250613029565b60208103905080820181840183515b818612156137bb5782518252601f19928301929091019061379f565b85525050505050565b60006137d18484846139c5565b156137e4576137e4613047858585613a2b565b6117ec83613692868563ffffffff6137f816565b600082613807575060006108db565b8282028284828161381457fe5b0414610c8857610c886130476001868661397c565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a75349390929091602087101561390f57fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610c5393929190615455565b6000816139b1576139b16130476003858561397c565b60008284816139bc57fe5b04949350505050565b6000826139d7576139d7613047613a4a565b8115806139e2575083155b156139ef57506000610c88565b600083806139f957fe5b8584099050613a0e858463ffffffff6137f816565b613a20826103e863ffffffff6137f816565b101595945050505050565b606063339f3de260e01b848484604051602401610c53939291906156ee565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b80356108db816157c7565b80516108db816157c7565b600082601f830112613b70578081fd5b8135613b83613b7e8261572a565b615704565b818152915060208083019084810181840286018201871015613ba457600080fd5b60005b84811015611da3578135613bba816157c7565b84529282019290820190600101613ba7565b600082601f830112613bdc578081fd5b8151613bea613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c128760208451890101613e4c565b83526020928301929190910190600101613bfa565b5050505092915050565b600082601f830112613c41578081fd5b8135613c4f613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613c778760208435890101613dfe565b83526020928301929190910190600101613c5f565b600082601f830112613c9c578081fd5b8151613caa613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613cd28760208451890101613fe0565b83526020928301929190910190600101613cba565b600082601f830112613cf7578081fd5b8135613d05613b7e8261572a565b8181529150602080830190840160005b83811015613c2757613d2d8760208435890101613e92565b83526020928301929190910190600101613d15565b600082601f830112613d52578081fd5b8151613d60613b7e8261572a565b818152915060208083019084810181840286018201871015613d8157600080fd5b60005b84811015611da357815184529282019290820190600101613d84565b600082601f830112613db0578081fd5b8135613dbe613b7e8261572a565b818152915060208083019084810181840286018201871015613ddf57600080fd5b60005b84811015611da357813584529282019290820190600101613de2565b600082601f830112613e0e578081fd5b8135613e1c613b7e82615749565b9150808252836020828501011115613e3357600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613e5c578081fd5b8151613e6a613b7e82615749565b9150808252836020828501011115613e8157600080fd5b611da881602084016020860161576c565b60006101c0808385031215613ea5578182fd5b613eae81615704565b915050613ebb8383613b4a565b8152613eca8360208401613b4a565b6020820152613edc8360408401613b4a565b6040820152613eee8360608401613b4a565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b0380821115613f4f57600080fd5b613f5b86838701613dfe565b83850152610160925082850135915080821115613f7757600080fd5b613f8386838701613dfe565b83850152610180925082850135915080821115613f9f57600080fd5b613fab86838701613dfe565b838501526101a0925082850135915080821115613fc757600080fd5b50613fd485828601613dfe565b82840152505092915050565b60006101c0808385031215613ff3578182fd5b613ffc81615704565b9150506140098383613b55565b81526140188360208401613b55565b602082015261402a8360408401613b55565b604082015261403c8360608401613b55565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561409d57600080fd5b6140a986838701613e4c565b838501526101609250828501519150808211156140c557600080fd5b6140d186838701613e4c565b838501526101809250828501519150808211156140ed57600080fd5b6140f986838701613e4c565b838501526101a092508285015191508082111561411557600080fd5b50613fd485828601613e4c565b805160ff811681146108db57600080fd5b600060208284031215614144578081fd5b8135610c88816157c7565b60008060408385031215614161578081fd5b825161416c816157c7565b602084015190925061417d816157c7565b809150509250929050565b60008060006060848603121561419c578081fd5b83516141a7816157c7565b60208501519093506141b8816157c7565b80925050604084015190509250925092565b6000806000606084860312156141de578081fd5b83516141e9816157c7565b60208501519093506001600160401b03811115614204578182fd5b61421086828701613e4c565b925050604084015190509250925092565b60008060008060808587031215614236578182fd5b8451614241816157c7565b60208601519094506001600160401b038082111561425d578384fd5b61426988838901613e4c565b9450604087015191508082111561427e578384fd5b61428a88838901613e4c565b9350606087015191508082111561429f578283fd5b506142ac87828801613e4c565b91505092959194509250565b600080604083850312156142ca578182fd5b82356142d5816157c7565b915060208301356001600160401b038111156142ef578182fd5b6142fb85828601613c31565b9150509250929050565b6000806000806080858703121561431a578182fd5b8435614325816157c7565b935060208501356001600160401b0380821115614340578384fd5b61434c88838901613da0565b94506040870135915080821115614361578384fd5b61436d88838901613da0565b93506060870135915080821115614382578283fd5b506142ac87828801613dfe565b600080604083850312156143a1578182fd5b82356143ac816157c7565b915060208301356001600160401b038111156143c6578182fd5b6142fb85828601613dfe565b6000806000606084860312156143e6578081fd5b83356143f1816157c7565b925060208401356001600160401b0381111561440b578182fd5b61441786828701613dfe565b925050604084013590509250925092565b6000806040838503121561443a578182fd5b8235614445816157c7565b946020939093013593505050565b600060208284031215614464578081fd5b81356001600160401b03811115614479578182fd5b6117ec84828501613b60565b600060208284031215614496578081fd5b81516001600160401b038111156144ab578182fd5b6117ec84828501613c8c565b6000806000606084860312156144cb578081fd5b83356001600160401b03808211156144e1578283fd5b6144ed87838801613ce7565b94506020860135915080821115614502578283fd5b61450e87838801613b60565b93506040860135915080821115614523578283fd5b5061453086828701613da0565b9150509250925092565b6000806040838503121561454c578182fd5b82356001600160401b0380821115614562578384fd5b61456e86838701613ce7565b93506020850135915080821115614583578283fd5b506142fb85828601613c31565b6000806000606084860312156145a4578081fd5b83516001600160401b03808211156145ba578283fd5b6145c687838801613c8c565b945060208601519150808211156145db578283fd5b6145e787838801613d42565b935060408601519150808211156145fc578283fd5b5061453086828701613bcc565b60008060006060848603121561461d578081fd5b83516001600160401b0380821115614633578283fd5b61463f87838801613c8c565b94506020860151935060408601519150808211156145fc578283fd5b6000806040838503121561466d578182fd5b82356001600160401b0380821115614683578384fd5b61456e86838701613da0565b600080604083850312156146a1578182fd5b82516001600160401b03808211156146b7578384fd5b6146c386838701613d42565b935060208501519150808211156146d8578283fd5b506142fb85828601613bcc565b6000602082840312156146f6578081fd5b81518015158114610c88578182fd5b6000806000806080858703121561471a578182fd5b84519350602085015161472c816157c7565b60408601519093506001600160401b038082111561427e578384fd5b6000806040838503121561475a578182fd5b505080516020909101519092909150565b6000806040838503121561477d578182fd5b8251915060208301516001600160401b03811115614799578182fd5b6142fb85828601613e4c565b6000806000606084860312156147b9578081fd5b8351925060208401516001600160401b03808211156147d6578283fd5b6147e287838801613e4c565b935060408601519150808211156147f7578283fd5b5061453086828701613e4c565b60008060408385031215614816578182fd5b82519150602083015161417d816157dc565b6000806040838503121561483a578182fd5b82516001600160e01b03198116811461416c578283fd5b600060208284031215614862578081fd5b81356001600160401b03811115614877578182fd5b6117ec84828501613dfe565b600060608284031215614894578081fd5b61489e6060615704565b6148a88484614122565b815260208301516020820152604083015160408201528091505092915050565b6000602082840312156148d9578081fd5b81516001600160401b038111156148ee578182fd5b6117ec84828501613fe0565b60008060006060848603121561490e578081fd5b83356001600160401b03811115614923578182fd5b61492f86828701613e92565b9350506020840135614940816157c7565b929592945050506040919091013590565b60008060408385031215614963578182fd5b82356001600160401b0380821115614979578384fd5b61498586838701613e92565b9350602085013591508082111561499a578283fd5b506142fb85828601613dfe565b6000806000606084860312156149bb578081fd5b83356001600160401b038111156149d0578182fd5b6149dc86828701613e92565b9350506020840135915060408401356149f4816157c7565b809150509250925092565b60008060008060808587031215614a14578182fd5b84516001600160401b0380821115614a2a578384fd5b614a3688838901613fe0565b95506020870151915080821115614a4b578384fd5b61426988838901613fe0565b600080600060608486031215614a6b578081fd5b83516001600160401b0380821115614a81578283fd5b614a8d87838801613fe0565b94506020860151935060408601519150808211156147f7578283fd5b600080600060608486031215614abd578081fd5b83356001600160401b0380821115614ad3578283fd5b81860160a08189031215614ae5578384fd5b614aef60a0615704565b9250803583526020810135602084015260408101356040840152614b168860608301613b4a565b6060840152608081013582811115614b2c578485fd5b614b3889828401613dfe565b608085015250919450505060208401359150614b578560408601613b4a565b90509250925092565b600060208284031215614b71578081fd5b5051919050565b60008060408385031215614b8a578182fd5b8251614b95816157dc565b6020939093015192949293505050565b600080600060608486031215614bb9578081fd5b8351614bc4816157dc565b6020850151604086015191945092506149f4816157c7565b60008060008060808587031215614bf1578182fd5b614bfb8686614122565b9350602085015192506040850151614c12816157c7565b60608601519092506001600160401b03811115614c2d578182fd5b6142ac87828801613e4c565b600080600060608486031215614c4d578081fd5b614c578585614122565b92506020840151915060408401516001600160401b03811115614c78578182fd5b61453086828701613e4c565b600080600060608486031215614c98578081fd5b614ca28585614122565b925060208401519150604084015190509250925092565b1515815260200190565b6000614ccf8383614ddc565b505060600190565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614d1e5781516001600160a01b0316865260209586019590910190600101614cf7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614d73578284038852614d5d848351614db0565b6020988901989094509190910190600101614d45565b50919695505050505050565b6000815180845260208401935060208301825b82811015614d1e578151865260209586019590910190600101614d92565b60008151808452614dc881602086016020860161576c565b601f01601f19169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b60006101c0614e08848451614cd7565b6020830151614e1a6020860182614cd7565b506040830151614e2d6040860182614cd7565b506060830151614e406060860182614cd7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614e9983870182614db0565b91505061016091508184015185820383870152614eb68282614db0565b925050506101808084015185830382870152614ed28382614db0565b9150506101a091508184015185820383870152614eef8282614db0565b9695505050505050565b60008251614f0b81846020870161576c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385168152608060208201819052600090614f8b90830186614d7f565b8281036040840152614f9d8186614d7f565b8381036060850152614faf8186614db0565b98975050505050505050565b6001600160a01b0384168152606060208201819052600090614fdf90830185614db0565b9050826040830152949350505050565b6001600160a01b038516815260806020820181905260009061501390830186614db0565b8281036040840152614f9d8186614db0565b6001600160a01b03929092168252602082015260400190565b6000608082526150516080830187614d28565b82810360208401526150638187614ce4565b83810360408501526150758187614ce4565b915050828103606084015261508a8185614d7f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156150d7578351600581106150c357fe5b8352602093840193909201916001016150af565b509095945050505050565b600060608201606083528086516150f981846151f4565b9150602088019250835b8181101561512757615116838551614cc3565b602094909401939250600101615103565b5050838103602085015261513b8187614d7f565b915050828103604084015280845161515381846151f4565b9150602086019250835b8181101561518157615170838551614cb9565b60209490940193925060010161515d565b5090979650505050505050565b600060208252610c886020830184614d7f565b6000604082526151b46040830185614d7f565b82810360208401526151c68185614d28565b95945050505050565b6000604082526151e26040830185614d7f565b82810360208401526151c68185614d7f565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061522790830185614db0565b828103606084015261508a8185614db0565b918252602082015260400190565b6000838252604060208301526117ec6040830184614db0565b6000848252606060208301526152796060830185614db0565b8281036040840152614eef8185614db0565b8281526040810161529b836157bd565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319861681526001600160a01b038516602082015260a06040820181905260009061531490830186614d7f565b82810360608401526153268186614d7f565b83810360808501526117888186614db0565b6001600160e01b0319851681526001600160a01b038416602082015260806040820181905260009061536c90830185614db0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b85168252606060208301526153ca6060830185614d7f565b8281036040840152614eef8185614d28565b600060208252610c886020830184614db0565b6000608082526154026080830187614db0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b60006154388561579c565b848252836020830152606060408301526151c66060830184614db0565b60608101615462856157a9565b938152602081019290925260409091015290565b60608101615483856157b3565b93815260208101929092526001600160a01b031660409091015290565b604081016154ad846157a9565b9281526020015290565b60608101615462856157b3565b606081016008851061546257fe5b60208101600583106154e057fe5b91905290565b60006154f1866157bd565b858252602082018590526001600160a01b0384166040830152608060608301819052614eef90830184614db0565b604081016154ad8461579c565b60006080825261553f6080830187614db0565b602083820381850152818751808452828401915082838202850101838a01865b8381101561558d57601f1987840301855261557b838351614df8565b9486019492509085019060010161555f565b505086810360408801526155a1818a614d7f565b945050505050828103606084015261508a8185614d28565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a081016156a08286614ddc565b8360608301528215156080830152949350505050565b600060208252610c886020830184614df8565b6000604082526156dc6040830185614df8565b82810360208401526151c68185614db0565b9283526020830191909152604082015260600190565b6040518181016001600160401b038111828210171561572257600080fd5b604052919050565b60006001600160401b0382111561573f578081fd5b5060209081020190565b60006001600160401b0382111561575e578081fd5b50601f01601f191660200190565b60005b8381101561578757818101518382015260200161576f565b83811115615796576000848401525b50505050565b600281106157a657fe5b50565b600481106157a657fe5b600381106157a657fe5b600781106157a657fe5b6001600160a01b03811681146157a657600080fd5b60ff811681146157a657600080fdfea365627a7a723158204793664dee66dcabc4a710b9901a17d347a2ff1fb84df266b96a650f614b87756c6578706572696d656e74616cf564736f6c634300050f0040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.15+commit.6a57276f.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "constantinople" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/artifacts/IAssetData.json b/packages/contract-artifacts/artifacts/IAssetData.json index 01cef4c2ae..ddec3d856d 100644 --- a/packages/contract-artifacts/artifacts/IAssetData.json +++ b/packages/contract-artifacts/artifacts/IAssetData.json @@ -6,26 +6,10 @@ { "constant": false, "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "tokenIds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "callbackData", - "type": "bytes" - } + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, + { "internalType": "bytes", "name": "callbackData", "type": "bytes" } ], "name": "ERC1155Assets", "outputs": [], @@ -36,21 +20,9 @@ { "constant": false, "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "bridgeAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "bridgeData", - "type": "bytes" - } + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "address", "name": "bridgeAddress", "type": "address" }, + { "internalType": "bytes", "name": "bridgeData", "type": "bytes" } ], "name": "ERC20Bridge", "outputs": [], @@ -60,13 +32,7 @@ }, { "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - } - ], + "inputs": [{ "internalType": "address", "name": "tokenAddress", "type": "address" }], "name": "ERC20Token", "outputs": [], "payable": false, @@ -76,16 +42,8 @@ { "constant": false, "inputs": [ - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ERC721Token", "outputs": [], @@ -96,16 +54,8 @@ { "constant": false, "inputs": [ - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "nestedAssetData", - "type": "bytes[]" - } + { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" } ], "name": "MultiAsset", "outputs": [], @@ -116,21 +66,9 @@ { "constant": false, "inputs": [ - { - "internalType": "address", - "name": "staticCallTargetAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "staticCallData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "expectedReturnDataHash", - "type": "bytes32" - } + { "internalType": "address", "name": "staticCallTargetAddress", "type": "address" }, + { "internalType": "bytes", "name": "staticCallData", "type": "bytes" }, + { "internalType": "bytes32", "name": "expectedReturnDataHash", "type": "bytes32" } ], "name": "StaticCall", "outputs": [], @@ -160,9 +98,7 @@ }, "ERC20Token(address)": { "details": "Function signature for encoding ERC20 assetData.", - "params": { - "tokenAddress": "Address of ERC20Token contract." - } + "params": { "tokenAddress": "Address of ERC20Token contract." } }, "ERC721Token(address,uint256)": { "details": "Function signature for encoding ERC721 assetData.", @@ -188,30 +124,8 @@ } } }, - "evm": { - "bytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - }, - "deployedBytecode": { - "linkReferences": {}, - "object": "0x", - "opcodes": "", - "sourceMap": "" - } - } + "evm": { "bytecode": { "object": "0x" }, "deployedBytecode": { "object": "0x" } } }, - "sources": { - "src/interfaces/IAssetData.sol": { - "id": 11 - } - }, - "sourceCodes": { - "src/interfaces/IAssetData.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\n// solhint-disable\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\n// @dev Interface of the asset proxy's assetData.\n// The asset proxies take an ABI encoded `bytes assetData` as argument.\n// This argument is ABI encoded as one of the methods of this interface.\ninterface IAssetData {\n\n /// @dev Function signature for encoding ERC20 assetData.\n /// @param tokenAddress Address of ERC20Token contract.\n function ERC20Token(address tokenAddress)\n external;\n\n /// @dev Function signature for encoding ERC721 assetData.\n /// @param tokenAddress Address of ERC721 token contract.\n /// @param tokenId Id of ERC721 token to be transferred.\n function ERC721Token(\n address tokenAddress,\n uint256 tokenId\n )\n external;\n\n /// @dev Function signature for encoding ERC1155 assetData.\n /// @param tokenAddress Address of ERC1155 token contract.\n /// @param tokenIds Array of ids of tokens to be transferred.\n /// @param values Array of values that correspond to each token id to be transferred.\n /// Note that each value will be multiplied by the amount being filled in the order before transferring.\n /// @param callbackData Extra data to be passed to receiver's `onERC1155Received` callback function.\n function ERC1155Assets(\n address tokenAddress,\n uint256[] calldata tokenIds,\n uint256[] calldata values,\n bytes calldata callbackData\n )\n external;\n\n /// @dev Function signature for encoding MultiAsset assetData.\n /// @param values Array of amounts that correspond to each asset to be transferred.\n /// Note that each value will be multiplied by the amount being filled in the order before transferring.\n /// @param nestedAssetData Array of assetData fields that will be be dispatched to their correspnding AssetProxy contract.\n function MultiAsset(\n uint256[] calldata values,\n bytes[] calldata nestedAssetData\n )\n external;\n\n /// @dev Function signature for encoding StaticCall assetData.\n /// @param staticCallTargetAddress Address that will execute the staticcall.\n /// @param staticCallData Data that will be executed via staticcall on the staticCallTargetAddress.\n /// @param expectedReturnDataHash Keccak-256 hash of the expected staticcall return data.\n function StaticCall(\n address staticCallTargetAddress,\n bytes calldata staticCallData,\n bytes32 expectedReturnDataHash\n )\n external;\n\n /// @dev Function signature for encoding ERC20Bridge assetData.\n /// @param tokenAddress Address of token to transfer.\n /// @param bridgeAddress Address of the bridge contract.\n /// @param bridgeData Arbitrary data to be passed to the bridge contract.\n function ERC20Bridge(\n address tokenAddress,\n address bridgeAddress,\n bytes calldata bridgeData\n )\n external;\n}\n" - }, - "sourceTreeHashHex": "0x3ceff1522c201d446ee98d9ecd912ad2ca6adc6fae9fc10d458ff557d570decc", "compiler": { "name": "solc", "version": "soljson-v0.5.13+commit.5b0b510c.js", @@ -219,12 +133,7 @@ "optimizer": { "enabled": true, "runs": 1000000, - "details": { - "yul": true, - "deduplicate": true, - "cse": true, - "constantOptimizer": true - } + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } }, "outputSelection": { "*": { @@ -238,13 +147,7 @@ ] } }, - "evmVersion": "constantinople", - "remappings": [ - "@0x/contracts-utils=/Users/xianny/src/copy-0x-monorepo/contracts/asset-proxy/node_modules/@0x/contracts-utils", - "@0x/contracts-erc1155=/Users/xianny/src/copy-0x-monorepo/contracts/asset-proxy/node_modules/@0x/contracts-erc1155", - "@0x/contracts-erc20=/Users/xianny/src/copy-0x-monorepo/contracts/asset-proxy/node_modules/@0x/contracts-erc20", - "@0x/contracts-exchange-libs=/Users/xianny/src/copy-0x-monorepo/node_modules/@0x/contracts-exchange-libs" - ] + "evmVersion": "constantinople" } }, "chains": {}