From 896ddc52f740eeb8e04fb595ed2452ee6fdf1d3f Mon Sep 17 00:00:00 2001 From: VGau Date: Tue, 5 Nov 2024 16:45:56 +0100 Subject: [PATCH 1/2] feat: enable auto deposit for erc20 --- .../components/bridge/form/ClaimingType.tsx | 8 +- bridge-ui/src/hooks/useExecutionFee.ts | 166 +++++++------- bridge-ui/src/hooks/usePostmanFee.ts | 204 ++++++++++++++++++ bridge-ui/src/hooks/useReceivedAmount.tsx | 3 +- 4 files changed, 297 insertions(+), 84 deletions(-) create mode 100644 bridge-ui/src/hooks/usePostmanFee.ts diff --git a/bridge-ui/src/components/bridge/form/ClaimingType.tsx b/bridge-ui/src/components/bridge/form/ClaimingType.tsx index f574946ab..0338fb327 100644 --- a/bridge-ui/src/components/bridge/form/ClaimingType.tsx +++ b/bridge-ui/src/components/bridge/form/ClaimingType.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; import { useAccount } from "wagmi"; import { useFormContext } from "react-hook-form"; -import { NetworkLayer, TokenType } from "@/config"; +import { NetworkLayer } from "@/config"; import { useChainStore } from "@/stores/chainStore"; import ClaimingTypeOption from "./ClaimingTypeOption"; import { ModalContext } from "@/contexts/modal.context"; @@ -18,12 +18,12 @@ export function ClaimingType() { const selectedClaimType = watch("claim"); - const isAutoDisabled = networkLayer === NetworkLayer.L2 || token?.type !== TokenType.ETH || !isConnected; + const isAutoDisabled = networkLayer === NetworkLayer.L2 || !isConnected; useEffect(() => { - if (networkLayer === NetworkLayer.L2 || token?.type !== TokenType.ETH) { + if (networkLayer === NetworkLayer.L2) { setValue("claim", "manual"); - } else if (token?.type === TokenType.ETH && networkLayer === NetworkLayer.L1) { + } else if (networkLayer === NetworkLayer.L1) { setValue("claim", "auto"); } else if (isManualConfirmed) { setValue("claim", "manual"); diff --git a/bridge-ui/src/hooks/useExecutionFee.ts b/bridge-ui/src/hooks/useExecutionFee.ts index 1145729cf..55d7ff9a2 100644 --- a/bridge-ui/src/hooks/useExecutionFee.ts +++ b/bridge-ui/src/hooks/useExecutionFee.ts @@ -1,23 +1,91 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useCallback } from "react"; import { useBlockNumber, useEstimateFeesPerGas } from "wagmi"; -import { config, NetworkLayer, NetworkType, TokenInfo, TokenType } from "@/config"; +import { NetworkLayer, TokenInfo, TokenType } from "@/config"; import { useQueryClient } from "@tanstack/react-query"; import { useChainStore } from "@/stores/chainStore"; +import usePostmanFee from "./usePostmanFee"; +import { useFormContext } from "react-hook-form"; type useExecutionFeeProps = { token: TokenInfo | null; claim: string | undefined; - networkLayer: NetworkLayer | undefined; - networkType: NetworkType; + networkLayer: NetworkLayer; minimumFee: bigint; }; -const useExecutionFee = ({ token, claim, networkLayer, networkType, minimumFee }: useExecutionFeeProps) => { +const useExecutionFee = ({ token, claim, networkLayer, minimumFee }: useExecutionFeeProps) => { const [minFees, setMinFees] = useState(0n); const toChain = useChainStore((state) => state.toChain); const queryClient = useQueryClient(); const { data: blockNumber } = useBlockNumber({ watch: true }); const { data: feeData, queryKey } = useEstimateFeesPerGas({ chainId: toChain?.id, type: "legacy" }); + const { calculatePostmanFee } = usePostmanFee({ currentLayer: networkLayer, claimingType: claim }); + + const { watch } = useFormContext(); + + const [amount, recipient] = watch(["amount", "recipient"]); + + const calculateFee = useCallback( + async ({ + token, + claim, + networkLayer, + minimumFee, + gasPrice, + }: { + token: TokenInfo; + claim: string | undefined; + networkLayer: NetworkLayer | undefined; + minimumFee: bigint; + gasPrice: bigint | undefined; + }): Promise => { + const isETH = token.type === TokenType.ETH; + const isL1 = networkLayer === NetworkLayer.L1; + const isL2 = networkLayer === NetworkLayer.L2; + const isAutoClaim = claim === "auto"; + const isManualClaim = claim === "manual"; + const isERC20orUSDC = token.type === TokenType.ERC20 || token.type === TokenType.USDC; + + // postman fee + if (isETH && isL1 && isAutoClaim && gasPrice) { + return calculatePostmanFee(amount, recipient); + } + + // 0 + if (isETH && isL1 && isManualClaim) { + return BigInt(0); + } + + // anti-DDoS fee + postman fee + if (isETH && isL2 && isAutoClaim && gasPrice) { + const postmanFee = await calculatePostmanFee(amount, recipient); + return postmanFee + minimumFee; + } + + // anti-DDoS fee + if (isETH && isL2 && isManualClaim) { + return minimumFee; + } + + // Postman fee + if (isERC20orUSDC && isL1 && isAutoClaim && gasPrice) { + return calculatePostmanFee(amount, recipient); + } + + // 0 + if (isERC20orUSDC && isL1 && isManualClaim) { + return BigInt(0); + } + + // anti-DDoS fee + if (isERC20orUSDC && isL2) { + return minimumFee; + } + + return undefined; + }, + [amount, calculatePostmanFee, recipient], + ); useEffect(() => { if (blockNumber && blockNumber % 5n === 0n) { @@ -30,82 +98,24 @@ const useExecutionFee = ({ token, claim, networkLayer, networkType, minimumFee } setMinFees(0n); if (!token) return; - const fee = calculateFee({ - token, - claim, - networkLayer, - networkType, - minimumFee, - gasPrice: feeData?.gasPrice, - }); - - if (fee !== undefined) { - setMinFees(fee); + async function calculateExecutionFee(token: TokenInfo) { + const fee = await calculateFee({ + token, + claim, + networkLayer, + minimumFee, + gasPrice: feeData?.gasPrice, + }); + + if (fee !== undefined) { + setMinFees(fee); + } } - }, [claim, networkLayer, token, minimumFee, networkType, feeData?.gasPrice]); + + calculateExecutionFee(token); + }, [claim, networkLayer, token, minimumFee, feeData?.gasPrice, calculateFee]); return minFees; }; export default useExecutionFee; - -const calculateFee = ({ - token, - claim, - networkLayer, - networkType, - minimumFee, - gasPrice, -}: { - token: TokenInfo; - claim: string | undefined; - networkLayer: NetworkLayer | undefined; - networkType: NetworkType; - minimumFee: bigint; - gasPrice: bigint | undefined; -}): bigint | undefined => { - const isETH = token.type === TokenType.ETH; - const isL1 = networkLayer === NetworkLayer.L1; - const isL2 = networkLayer === NetworkLayer.L2; - const isAutoClaim = claim === "auto"; - const isManualClaim = claim === "manual"; - const isERC20orUSDC = token.type === TokenType.ERC20 || token.type === TokenType.USDC; - - // postman fee - if (isETH && isL1 && isAutoClaim && gasPrice) { - return calculatePostmanFee(gasPrice, networkType); - } - - // 0 - if (isETH && isL1 && isManualClaim) { - return BigInt(0); - } - - // anti-DDoS fee + postman fee - if (isETH && isL2 && isAutoClaim && gasPrice) { - return calculatePostmanFee(gasPrice, networkType) + minimumFee; - } - - // anti-DDoS fee - if (isETH && isL2 && isManualClaim) { - return minimumFee; - } - - // 0 - if (isERC20orUSDC && isL1) { - return BigInt(0); - } - - // anti-DDoS fee - if (isERC20orUSDC && isL2) { - return minimumFee; - } - - return undefined; -}; - -const calculatePostmanFee = (gasPrice: bigint, networkType: NetworkType) => - config.networks[networkType] && - gasPrice * - (config.networks[networkType].gasEstimated + config.networks[networkType].gasLimitSurplus) * - config.networks[networkType].profitMargin; diff --git a/bridge-ui/src/hooks/usePostmanFee.ts b/bridge-ui/src/hooks/usePostmanFee.ts new file mode 100644 index 000000000..3eea0344b --- /dev/null +++ b/bridge-ui/src/hooks/usePostmanFee.ts @@ -0,0 +1,204 @@ +import { useCallback, useEffect } from "react"; +import { useAccount, useBlockNumber, useEstimateFeesPerGas, useReadContract } from "wagmi"; +import { Address, concat, encodeFunctionData, keccak256, parseUnits, toHex, zeroAddress } from "viem"; +import { config, NetworkLayer, TokenType, wagmiConfig } from "@/config"; +import { useChainStore } from "@/stores/chainStore"; +import { getPublicClient } from "@wagmi/core"; +import { useQueryClient } from "@tanstack/react-query"; +import USDCBridge from "@/abis/USDCBridge.json"; +import TokenBridge from "@/abis/TokenBridge.json"; +import MessageService from "@/abis/MessageService.json"; + +type UsePostmanFeeProps = { + currentLayer: NetworkLayer; + claimingType?: string; +}; + +const usePostmanFee = ({ currentLayer, claimingType }: UsePostmanFeeProps) => { + const { address } = useAccount(); + + const token = useChainStore((state) => state.token); + const toChain = useChainStore((state) => state.toChain); + const fromChain = useChainStore((state) => state.fromChain); + const fromMessageServiceAddress = useChainStore((state) => state.messageServiceAddress); + const tokenBridgeAddress = useChainStore((state) => state.tokenBridgeAddress); + const networkType = useChainStore((state) => state.networkType); + + const queryClient = useQueryClient(); + const { data: blockNumber } = useBlockNumber({ watch: true }); + const { data: feeData, queryKey } = useEstimateFeesPerGas({ chainId: toChain?.id, type: "legacy" }); + + useEffect(() => { + if (blockNumber && blockNumber % 5n === 0n) { + queryClient.invalidateQueries({ queryKey }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [blockNumber, queryClient]); + + const { data: nextMessageNumber } = useReadContract({ + address: fromMessageServiceAddress ?? "0x", + abi: MessageService.abi, + functionName: "nextMessageNumber", + chainId: fromChain?.id, + query: { + enabled: + !!fromChain?.id && !!fromMessageServiceAddress && currentLayer === NetworkLayer.L1 && claimingType === "auto", + }, + }); + + const calculatePostmanFee = useCallback( + async (amount: string, recipient?: Address): Promise => { + if (!address || !tokenBridgeAddress || !token || !nextMessageNumber) { + return 0n; + } + + if (currentLayer !== NetworkLayer.L1) { + return 0n; + } + + try { + if (!feeData?.gasPrice) { + return 0n; + } + + const publicClient = getPublicClient(wagmiConfig, { + chainId: toChain?.id, + }); + + if (!publicClient) { + return 0n; + } + + const toMessageServiceAddress = config.networks[networkType][NetworkLayer.L2].messageServiceAddress; + const toUSDCBridgeAddress = config.networks[networkType][NetworkLayer.L2].usdcBridgeAddress; + const toTokenBridgeAddress = config.networks[networkType][NetworkLayer.L2].tokenBridgeAddress; + + const amountBigInt = parseUnits(amount, token.decimals); + const toAddress = recipient || address; + let estimatedGasFee; + + // If amount negative, return + if (amountBigInt <= BigInt(0)) { + return 0n; + } + + if (token.type === TokenType.USDC) { + const encodedData = encodeFunctionData({ + abi: USDCBridge.abi, + functionName: "receiveFromOtherLayer", + args: [toAddress, amountBigInt], + }); + + const storageSlot = keccak256( + concat([ + address, + toUSDCBridgeAddress, + toHex(0n), + toHex(0n), + toHex(nextMessageNumber as bigint), + encodedData, + ]), + ); + + estimatedGasFee = await publicClient.estimateContractGas({ + abi: MessageService.abi, + functionName: "claimMessage", + address: toMessageServiceAddress, + args: [address, toUSDCBridgeAddress, 0n, 0n, zeroAddress, encodedData, nextMessageNumber as bigint], + value: 0n, + account: address, + stateOverride: [ + { + address: toMessageServiceAddress, + stateDiff: [ + { + slot: storageSlot, + value: "0x0000000000000000000000000000000000000000000000000000000000000001", + }, + ], + }, + ], + }); + } else if (token.type === TokenType.ERC20) { + // TODO: fix encoded data + const encodedData = encodeFunctionData({ + abi: TokenBridge.abi, + functionName: "completeBridging", + args: [toAddress, amountBigInt], + }); + + const storageSlot = keccak256( + concat([ + address, + toTokenBridgeAddress, + toHex(0n), + toHex(0n), + toHex(nextMessageNumber as bigint), + encodedData, + ]), + ); + + estimatedGasFee = await publicClient.estimateContractGas({ + abi: MessageService.abi, + functionName: "claimMessage", + address: toMessageServiceAddress, + args: [address, toUSDCBridgeAddress, 0n, 0n, zeroAddress, encodedData, nextMessageNumber as bigint], + value: 0n, + account: address, + stateOverride: [ + { + address: toMessageServiceAddress, + stateDiff: [ + { + slot: storageSlot, + value: "0x0000000000000000000000000000000000000000000000000000000000000001", + }, + ], + }, + ], + }); + } else if (token.type === TokenType.ETH) { + const storageSlot = keccak256( + concat([address, toAddress, toHex(0n), toHex(amountBigInt), toHex(nextMessageNumber as bigint), "0x"]), + ); + + estimatedGasFee = await publicClient.estimateContractGas({ + abi: MessageService.abi, + functionName: "claimMessage", + address: toMessageServiceAddress, + args: [address, toAddress, 0n, amountBigInt, zeroAddress, "0x", nextMessageNumber as bigint], + value: 0n, + account: address, + stateOverride: [ + { + address: toMessageServiceAddress, + stateDiff: [ + { + slot: storageSlot, + value: "0x0000000000000000000000000000000000000000000000000000000000000001", + }, + ], + }, + ], + }); + } else { + return 0n; + } + + return ( + feeData.gasPrice * + (estimatedGasFee + config.networks[networkType].gasLimitSurplus) * + config.networks[networkType].profitMargin + ); + } catch (error) { + console.error(error); + return 0n; + } + }, + [address, currentLayer, nextMessageNumber, feeData?.gasPrice, networkType, toChain?.id, token, tokenBridgeAddress], + ); + + return { calculatePostmanFee }; +}; + +export default usePostmanFee; diff --git a/bridge-ui/src/hooks/useReceivedAmount.tsx b/bridge-ui/src/hooks/useReceivedAmount.tsx index cd22a665c..fd4e2652f 100644 --- a/bridge-ui/src/hooks/useReceivedAmount.tsx +++ b/bridge-ui/src/hooks/useReceivedAmount.tsx @@ -13,7 +13,7 @@ type UseReceivedAmountProps = { export function useReceivedAmount({ amount, enoughAllowance, claim }: UseReceivedAmountProps) { const [estimatedGasFee, setEstimatedGasFee] = useState(0n); - const { token, tokenBridgeAddress, networkLayer, networkType } = useChainStore((state) => ({ + const { token, tokenBridgeAddress, networkLayer } = useChainStore((state) => ({ token: state.token, tokenBridgeAddress: state.tokenBridgeAddress, networkLayer: state.networkLayer, @@ -28,7 +28,6 @@ export function useReceivedAmount({ amount, enoughAllowance, claim }: UseReceive token, claim, networkLayer, - networkType, minimumFee, }); From b239981e7f2292ed0702a8d6ae04febfba34f6c1 Mon Sep 17 00:00:00 2001 From: VGau Date: Mon, 20 Jan 2025 15:39:55 +0100 Subject: [PATCH 2/2] feat: enable erc20 auto deposit in bridge ui --- bridge-ui/src/abis/TokenBridge.json | 999 +++++++++++++++--- .../components/bridge/form/ApproveERC20.tsx | 11 +- bridge-ui/src/hooks/usePostmanFee.ts | 149 ++- 3 files changed, 991 insertions(+), 168 deletions(-) diff --git a/bridge-ui/src/abis/TokenBridge.json b/bridge-ui/src/abis/TokenBridge.json index c5103f0a5..834c86854 100644 --- a/bridge-ui/src/abis/TokenBridge.json +++ b/bridge-ui/src/abis/TokenBridge.json @@ -30,11 +30,27 @@ "name": "AlreadyBrigedToNativeTokenSet", "type": "error" }, + { + "inputs": [], + "name": "ArrayLengthsDoNotMatch", + "type": "error" + }, { "inputs": [], "name": "CallerIsNotMessageService", "type": "error" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "DecimalsAreUnknown", + "type": "error" + }, { "inputs": [ { @@ -51,6 +67,39 @@ "name": "InvalidPermitData", "type": "error" }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "IsNotPaused", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "IsPaused", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "NativeToBridgedTokenAlreadySet", + "type": "error" + }, { "inputs": [ { @@ -62,6 +111,11 @@ "name": "NotReserved", "type": "error" }, + { + "inputs": [], + "name": "PauseTypeNotUsed", + "type": "error" + }, { "inputs": [ { @@ -106,11 +160,21 @@ "name": "ReservedToken", "type": "error" }, + { + "inputs": [], + "name": "RolesNotDifferent", + "type": "error" + }, { "inputs": [], "name": "SenderNotAuthorized", "type": "error" }, + { + "inputs": [], + "name": "SourceChainSameAsTargetChain", + "type": "error" + }, { "inputs": [ { @@ -122,6 +186,11 @@ "name": "StatusAddressNotAllowed", "type": "error" }, + { + "inputs": [], + "name": "TokenListEmpty", + "type": "error" + }, { "inputs": [ { @@ -149,6 +218,47 @@ "name": "ZeroAmountNotAllowed", "type": "error" }, + { + "inputs": [], + "name": "ZeroChainIdNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroHashNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "nativeToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "bridgedToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "BridgingFinalized", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -177,7 +287,38 @@ "type": "address" } ], - "name": "BridgingFinalized", + "name": "BridgingFinalizedV2", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BridgingInitiated", "type": "event" }, { @@ -208,7 +349,7 @@ "type": "uint256" } ], - "name": "BridgingInitiated", + "name": "BridgingInitiatedV2", "type": "event" }, { @@ -330,18 +471,18 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "OwnershipTransferStarted", + "name": "PauseTypeRoleSet", "type": "event" }, { @@ -349,18 +490,24 @@ "inputs": [ { "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" }, { "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousRole", + "type": "bytes32" } ], - "name": "OwnershipTransferred", + "name": "PauseTypeRoleUpdated", "type": "event" }, { @@ -369,8 +516,14 @@ { "indexed": false, "internalType": "address", - "name": "account", + "name": "messageSender", "type": "address" + }, + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" } ], "name": "Paused", @@ -382,17 +535,17 @@ { "indexed": true, "internalType": "address", - "name": "remoteTokenBridge", + "name": "remoteSender", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "setBy", + "name": "setter", "type": "address" } ], - "name": "RemoteTokenBridgeSet", + "name": "RemoteSenderSet", "type": "event" }, { @@ -401,11 +554,17 @@ { "indexed": true, "internalType": "address", - "name": "token", + "name": "remoteTokenBridge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "setBy", "type": "address" } ], - "name": "TokenDeployed", + "name": "RemoteTokenBridgeSet", "type": "event" }, { @@ -418,141 +577,389 @@ "type": "address" } ], - "name": "TokenReserved", + "name": "ReservationRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" } ], - "name": "Unpaused", + "name": "RoleAdminChanged", "type": "event" }, { - "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "_token", - "type": "address" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" }, { + "indexed": true, "internalType": "address", - "name": "_recipient", + "name": "sender", "type": "address" } ], - "name": "bridgeToken", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "RoleGranted", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { + "indexed": true, "internalType": "address", - "name": "_recipient", + "name": "account", "type": "address" }, { - "internalType": "bytes", - "name": "_permitData", - "type": "bytes" + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "bridgeTokenWithPermit", - "outputs": [], - "stateMutability": "payable", - "type": "function" + "name": "RoleRevoked", + "type": "event" }, { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "token", "type": "address" } ], - "name": "bridgedToNativeToken", - "outputs": [ + "name": "TokenDeployed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "address", - "name": "", + "name": "token", "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "TokenReserved", + "type": "event" }, { + "anonymous": false, "inputs": [ { - "internalType": "address", - "name": "_nativeToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "unPauseType", + "type": "uint8" }, { - "internalType": "address", - "name": "_recipient", - "type": "address" - }, + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "UnPauseTypeRoleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "unPauseType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousRole", + "type": "bytes32" + } + ], + "name": "UnPauseTypeRoleUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "messageSender", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "UnPaused", + "type": "event" + }, + { + "inputs": [], + "name": "CONTRACT_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ALL_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_COMPLETE_TOKEN_BRIDGING_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INITIATE_TOKEN_BRIDGING_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REMOVE_RESERVED_TOKEN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_CUSTOM_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_MESSAGE_SERVICE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_REMOTE_TOKENBRIDGE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_RESERVED_TOKEN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_ALL_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_COMPLETE_TOKEN_BRIDGING_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_INITIATE_TOKEN_BRIDGING_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, { "internalType": "uint256", - "name": "_chainId", + "name": "_amount", "type": "uint256" }, { - "internalType": "bytes", - "name": "_tokenMetadata", - "type": "bytes" + "internalType": "address", + "name": "_recipient", + "type": "address" } ], - "name": "completeBridging", + "name": "bridgeToken", "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [ { - "internalType": "address[]", - "name": "_tokens", - "type": "address[]" + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_permitData", + "type": "bytes" } ], - "name": "confirmDeployment", + "name": "bridgeTokenWithPermit", "outputs": [], "stateMutability": "payable", "type": "function" @@ -561,40 +968,243 @@ "inputs": [ { "internalType": "address", - "name": "_securityCouncil", + "name": "bridged", "type": "address" - }, + } + ], + "name": "bridgedToNativeToken", + "outputs": [ { "internalType": "address", - "name": "_messageService", + "name": "native", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", - "name": "_tokenBeacon", + "name": "_nativeToken", "type": "address" }, { "internalType": "uint256", - "name": "_sourceChainId", + "name": "_amount", "type": "uint256" }, + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, { "internalType": "uint256", - "name": "_targetChainId", + "name": "_chainId", "type": "uint256" }, + { + "internalType": "bytes", + "name": "_tokenMetadata", + "type": "bytes" + } + ], + "name": "completeBridging", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address[]", - "name": "_reservedTokens", + "name": "_tokens", "type": "address[]" } ], + "name": "confirmDeployment", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "defaultAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "messageService", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenBeacon", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sourceChainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetChainId", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "reservedTokens", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "addressWithRole", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPermissionsManager.RoleAddress[]", + "name": "roleAddresses", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "pauseTypeRoles", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "unpauseTypeRoles", + "type": "tuple[]" + } + ], + "internalType": "struct ITokenBridge.InitializationData", + "name": "_initializationData", + "type": "tuple" + } + ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "pauseTypeIsPaused", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "messageService", @@ -612,12 +1222,12 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "chainId", "type": "uint256" }, { "internalType": "address", - "name": "", + "name": "native", "type": "address" } ], @@ -625,7 +1235,7 @@ "outputs": [ { "internalType": "address", - "name": "", + "name": "bridged", "type": "address" } ], @@ -633,32 +1243,31 @@ "type": "function" }, { - "inputs": [], - "name": "owner", - "outputs": [ + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", + "name": "pauseByType", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "paused", + "inputs": [ + { + "internalType": "bytes32", + "name": "pauseType", + "type": "bytes32" + } + ], + "name": "pauseTypeStatuses", "outputs": [ { "internalType": "bool", - "name": "", + "name": "pauseStatus", "type": "bool" } ], @@ -666,16 +1275,67 @@ "type": "function" }, { - "inputs": [], - "name": "pendingOwner", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_defaultAdmin", "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "addressWithRole", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPermissionsManager.RoleAddress[]", + "name": "_roleAddresses", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_pauseTypeRoles", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_unpauseTypeRoles", + "type": "tuple[]" } ], - "stateMutability": "view", + "name": "reinitializePauseTypesAndPermissions", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -705,8 +1365,37 @@ "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -794,6 +1483,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "targetChainId", @@ -823,26 +1531,55 @@ { "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" } ], - "name": "transferOwnership", + "name": "unPauseByType", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "unpause", + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_newRole", + "type": "bytes32" + } + ], + "name": "updatePauseTypeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_newRole", + "type": "bytes32" + } + ], + "name": "updateUnpauseTypeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b614b9480620000f36000396000f3fe608060405260043610620001c35760003560e01c80638dae45dd11620000f3578063ccf5a77c1162000095578063e30c3978116200006c578063e30c39781462000533578063e4d274511462000560578063edc42a221462000585578063f2fde38b14620005aa57600080fd5b8063ccf5a77c14620004c7578063cdd914c514620004f7578063dfa96efb146200051c57600080fd5b8063b0994f0811620000ca578063b0994f081462000435578063be46096f146200045a578063ca41a247146200047f57600080fd5b80638dae45dd14620003b2578063a676e8ab14620003e1578063a6ef995f146200040657600080fd5b80634bf98dce1162000169578063715018a61162000140578063715018a6146200033d57806379ba509714620003555780638456cb59146200036d5780638da5cb5b146200038557600080fd5b80634bf98dce14620002ea578063522ea81a14620003015780635c975abb146200031857600080fd5b80631754f301116200019e5780631754f30114620002865780632a564f3414620002ad5780633f4ba83a14620002d257600080fd5b80630f6f86ec14620001c8578063146ffb2614620002455780631544298e146200026d575b600080fd5b348015620001d557600080fd5b506200021b620001e736600462003a64565b61010860209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156200025257600080fd5b506200025e61010b5481565b6040519081526020016200023c565b3480156200027a57600080fd5b506200025e61010a5481565b3480156200029357600080fd5b50620002ab620002a536600462003a97565b620005cf565b005b348015620002ba57600080fd5b50620002ab620002cc36600462003b19565b6200090e565b348015620002df57600080fd5b50620002ab62000b9f565b620002ab620002fb36600462003be0565b62000bb5565b620002ab6200031236600462003c9f565b62000e51565b3480156200032557600080fd5b5060335460ff1660405190151581526020016200023c565b3480156200034a57600080fd5b50620002ab62001576565b3480156200036257600080fd5b50620002ab6200158c565b3480156200037a57600080fd5b50620002ab62001645565b3480156200039257600080fd5b5060655473ffffffffffffffffffffffffffffffffffffffff166200021b565b348015620003bf57600080fd5b5060c9546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b348015620003ee57600080fd5b50620002ab6200040036600462003ce6565b62001659565b3480156200041357600080fd5b5060ca546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200044257600080fd5b50620002ab6200045436600462003d0d565b62001722565b3480156200046757600080fd5b50620002ab6200047936600462003ce6565b62001aed565b3480156200048c57600080fd5b506200021b6200049e36600462003ce6565b6101096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004d457600080fd5b50610107546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200050457600080fd5b50620002ab6200051636600462003ce6565b62001bc0565b620002ab6200052d36600462003deb565b62001d62565b3480156200054057600080fd5b5060975473ffffffffffffffffffffffffffffffffffffffff166200021b565b3480156200056d57600080fd5b50620002ab6200057f36600462003e66565b62001e25565b3480156200059257600080fd5b50620002ab620005a436600462003ce6565b620021c0565b348015620005b757600080fd5b50620002ab620005c936600462003ce6565b62002301565b8173ffffffffffffffffffffffffffffffffffffffff81166200061e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166200066d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000677620023b4565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8089168552925290912054859116151580620006e5575073ffffffffffffffffffffffffffffffffffffffff818116600090815261010960205260409020541615155b156200073a576040517f12f3df0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815261010960205260409020541615620007b4576040517ff8fb7c2700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240162000731565b73ffffffffffffffffffffffffffffffffffffffff84166102221480620007f2575073ffffffffffffffffffffffffffffffffffffffff8416610333145b8062000815575073ffffffffffffffffffffffffffffffffffffffff8416610111145b1562000866576040517fd8ce8acb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240162000731565b61010b5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808a168086529184528285208054918a167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155808652610109909452828520805490911682179055905133937f844cb5c635052898ad92bea4ece14519111765d835105e76aa1f77ad0d0aa81f91a45050505050565b60c95473ffffffffffffffffffffffffffffffffffffffff16331462000960576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216916367e404ce916004808201926020929091908290030181865afa158015620009d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009fe919062003eea565b73ffffffffffffffffffffffffffffffffffffffff161462000a4c576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8281101562000b995783838281811062000a6e5762000a6e62003f0a565b905060200201602081019062000a85919062003ce6565b61010a54600090815261010860205260408120919350610333919086868581811062000ab55762000ab562003f0a565b905060200201602081019062000acc919062003ce6565b73ffffffffffffffffffffffffffffffffffffffff9081168252602082019290925260400160002080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290911691909117905583838281811062000b375762000b3762003f0a565b905060200201602081019062000b4e919062003ce6565b73ffffffffffffffffffffffffffffffffffffffff167f91d24864a084ab70b268a1f865e757ca12006cf298d763b6be697302ef86498c60405160405180910390a260010162000a50565b50505050565b62000ba9620023b4565b62000bb362002437565b565b60005b815181101562000cd9576000610109600084848151811062000bde5762000bde62003f0a565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835290820192909252604001600020541690508062000c885782828151811062000c305762000c3062003f0a565b60200260200101516040517fa5ea89da00000000000000000000000000000000000000000000000000000000815260040162000731919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b8083838151811062000c9e5762000c9e62003f0a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152508062000cd08162003f68565b91505062000bb8565b5060c95460ca5460405173ffffffffffffffffffffffffffffffffffffffff92831692639f3ce55a923492911690829062000d1990879060240162003fa3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2a564f3400000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815262000dca9392919060040162004071565b6000604051808303818588803b15801562000de457600080fd5b505af115801562000df9573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f59eab5b5f813ac9e0c10035dfb55b5e3419eff53c0f7a869fb3c22400ea036d68260405162000e46919062003fa3565b60405180910390a250565b8273ffffffffffffffffffffffffffffffffffffffff811662000ea0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff811662000eef576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838060000362000f2f576040517f4618044a0000000000000000000000000000000000000000000000000000000081526004810182905260240162000731565b62000f39620024b6565b62000f4362002525565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b168552925290912054167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeef810162000fed576040517f6dad9c7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816600482015260240162000731565b73ffffffffffffffffffffffffffffffffffffffff80881660009081526101096020526040812054909116908060608315620010ba576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8c1690639dc29fac90604401600060405180830381600087803b1580156200109257600080fd5b505af1158015620010a7573d6000803e3d6000fd5b5050505083925061010b5491506200137c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8d16906370a0823190602401602060405180830381865afa15801562001128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200114e9190620040b1565b90506200117473ffffffffffffffffffffffffffffffffffffffff8d1633308e6200259a565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819073ffffffffffffffffffffffffffffffffffffffff8e16906370a0823190602401602060405180830381865afa158015620011e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012079190620040b1565b620012139190620040cb565b9a508b935073ffffffffffffffffffffffffffffffffffffffff86166200130d57610222610108600061010a54815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b73ffffffffffffffffffffffffffffffffffffffff167f0f53e2a811b6fd2d6cd965fd6c27b44fb924ca39f7a7f321115705c22366d62360405160405180910390a25b73ffffffffffffffffffffffffffffffffffffffff8616610333146200137457620013388c62002678565b620013438d62002798565b6200134e8e620028a5565b6040516020016200136293929190620040e1565b60405160208183030381529060405291505b61010a549250505b60c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f3ce55a3460ca60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1634878f8f8989604051602401620013fa9594939291906200411e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe4d2745100000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152620014ab9392919060040162004071565b6000604051808303818588803b158015620014c557600080fd5b505af1158015620014da573d6000803e3d6000fd5b50505050508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fde5fcf0a1aebed387067eb25655de732ccfc43fe5b5a3d91d367c26e773fcd1c8d6040516200155691815260200190565b60405180910390a450505050506200156e600160d555565b505050505050565b62001580620023b4565b62000bb36000620029a8565b609754339073ffffffffffffffffffffffffffffffffffffffff16811462001637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e65720000000000000000000000000000000000000000000000606482015260840162000731565b6200164281620029a8565b50565b6200164f620023b4565b62000bb3620029db565b62001663620023b4565b60ca5473ffffffffffffffffffffffffffffffffffffffff1615620016d15760ca546040517f94fbfd2e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240162000731565b620016dc8162002a39565b604051339073ffffffffffffffffffffffffffffffffffffffff8316907fb044c1a1a05a729c402def784b4e4cb01612ff03eee6f0beb3eba0f0606260a190600090a350565b8673ffffffffffffffffffffffffffffffffffffffff811662001771576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff8116620017c0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff81166200180f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015620018305750600054600160ff909116105b806200184c5750303b1580156200184c575060005460ff166001145b620018da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840162000731565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200193957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6200194362002ace565b6200194d62002b71565b620019588a62002c14565b6200196262002d42565b61010780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b1617905561010a88905561010b87905560005b8581101562001a70576000878783818110620019d257620019d262003f0a565b9050602002016020810190620019e9919062003ce6565b73ffffffffffffffffffffffffffffffffffffffff160362001a37576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001a6787878381811062001a505762001a5062003f0a565b905060200201602081019062000516919062003ce6565b600101620019b2565b5062001a7c8b620029a8565b801562001ae057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff811662001b3c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001b46620023b4565b60c9805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560405191169133918391907fc96d462e42a71473da49a1d58c1754b9b2d319786692d621dc7f921331c517e990600090a4505050565b8073ffffffffffffffffffffffffffffffffffffffff811662001c0f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001c19620023b4565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808716855292529091205483911615158062001c87575073ffffffffffffffffffffffffffffffffffffffff818116600090815261010960205260409020541615155b1562001cd8576040517f12f3df0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240162000731565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166101111790555190917f5e023c7a09fa0534ce3199f65fc3e635a5e851c5adc88ebda3b9d332ae07cbe991a2505050565b8473ffffffffffffffffffffffffffffffffffffffff811662001db1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848060000362001df1576040517f4618044a0000000000000000000000000000000000000000000000000000000081526004810182905260240162000731565b62001dfb620024b6565b821562001e0f5762001e0f87858562002de5565b62001e1c87878762000e51565b50505050505050565b62001e2f62002525565b60c95473ffffffffffffffffffffffffffffffffffffffff16331462001e81576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216916367e404ce916004808201926020929091908290030181865afa15801562001ef9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f1f919062003eea565b73ffffffffffffffffffffffffffffffffffffffff161462001f6d576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001f77620024b6565b60008381526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b1685529252822054169061022282148062001fd2575073ffffffffffffffffffffffffffffffffffffffff8216610333145b15620020015762001ffb73ffffffffffffffffffffffffffffffffffffffff89168789620030b6565b62002134565b508073ffffffffffffffffffffffffffffffffffffffff8116620020a9576200203088858561010a5462003113565b73ffffffffffffffffffffffffffffffffffffffff8082166000818152610109602090815260408083208054958f167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716811790915561010b54845261010883528184209084529091529020805490921617905590505b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018990528216906340c10f1990604401600060405180830381600087803b1580156200211a57600080fd5b505af11580156200212f573d6000803e3d6000fd5b505050505b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fd28a2d30314c6a2f46b657c15ee4d7ffc33b2817e78f341a260e216cebfbdbef8a604051620021ab91815260200190565b60405180910390a450506200156e600160d555565b8073ffffffffffffffffffffffffffffffffffffffff81166200220f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62002219620023b4565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86811685529252909120541661011114620022a4576040517f82f5d0a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260240162000731565b5061010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6200230b620023b4565b6097805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556200236f60655473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60655473ffffffffffffffffffffffffffffffffffffffff16331462000bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000731565b62002441620032de565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60335460ff161562000bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640162000731565b600260d5540362002593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000731565b600260d555565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905262000b999085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526200334c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620026fc919062004165565b600060405180830381855afa9150503d806000811462002739576040519150601f19603f3d011682016040523d82523d6000602084013e6200273e565b606091505b50915091508162002785576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062002790565b620027908162003462565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916200281c919062004165565b600060405180830381855afa9150503d806000811462002859576040519150601f19603f3d011682016040523d82523d6000602084013e6200285e565b606091505b50915091508162002785576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062002790565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002928919062004165565b600060405180830381855afa9150503d806000811462002965576040519150601f19603f3d011682016040523d82523d6000602084013e6200296a565b606091505b50915091508180156200297e575080516020145b6200298b57601262002790565b8080602001905181019062002790919062004193565b600160d555565b609780547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562001642816200363b565b620029e5620024b6565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200248c3390565b73ffffffffffffffffffffffffffffffffffffffff811662002a87576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900460ff1662002b67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb3620036b2565b600054610100900460ff1662002c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb362003775565b600054610100900460ff1662002cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b73ffffffffffffffffffffffffffffffffffffffff811662002cfb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900460ff1662002ddb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb362003819565b7fd505accf0000000000000000000000000000000000000000000000000000000062002e16600460008486620041b3565b62002e2191620041df565b7fffffffff00000000000000000000000000000000000000000000000000000000161462002ee25762002e59600460008385620041b3565b62002e6491620041df565b6040517fcf9e29460000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000090911660048201527fd505accf00000000000000000000000000000000000000000000000000000000602482015260440162000731565b600080808080808062002ef9886004818c620041b3565b81019062002f08919062004228565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002f95576040517f200688cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816600482015260240162000731565b73ffffffffffffffffffffffffffffffffffffffff8616301462002ffe576040517f2911594800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716600482015260240162000731565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff8b169063d505accf9060e401600060405180830381600087803b1580156200309157600080fd5b505af1158015620030a6573d6000803e3d6000fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526200310e9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401620025f5565b505050565b60008082866040516020016200314992919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052805160209091012061010754909250600091839173ffffffffffffffffffffffffffffffffffffffff1690620031ae9062003a33565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190526000908201526060018190604051809103906000f5905080158015620031fb573d6000803e3d6000fd5b509050806000808062003211898b018b62004345565b9250925092508373ffffffffffffffffffffffffffffffffffffffff16631624f6c68484846040518463ffffffff1660e01b81526004016200325693929190620040e1565b600060405180830381600087803b1580156200327157600080fd5b505af115801562003286573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff808f169350871691507fd5d4920bb61e6141c8499d50a7bd617dae2b1818c9d6b995d3f2ba4975e32ea490600090a350919998505050505050505050565b60335460ff1662000bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640162000731565b6000620033b0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620038b29092919063ffffffff16565b9050805160001480620033d4575080806020019051810190620033d49190620043bb565b6200310e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000731565b606060408251106200348a5781806020019051810190620034849190620043df565b92915050565b8151602014620034cd57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60005b6020811080156200351b5750828181518110620034f157620034f162003f0a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156200352a57600101620034d0565b806000036200356e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156200358c576200358c62003b5f565b6040519080825280601f01601f191660200182016040528015620035b7576020820181803683370190505b50905060005b828110156200363357848181518110620035db57620035db62003f0a565b602001015160f81c60f81b828281518110620035fb57620035fb62003f0a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101620035bd565b509392505050565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166200374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600054610100900460ff166200380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb333620029a8565b600054610100900460ff16620029a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b6060620027908484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620038e9919062004165565b60006040518083038185875af1925050503d806000811462003928576040519150601f19603f3d011682016040523d82523d6000602084013e6200392d565b606091505b509150915062003940878383876200394b565b979650505050505050565b60608315620039e6578251600003620039de5773ffffffffffffffffffffffffffffffffffffffff85163b620039de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000731565b508162002790565b620027908383815115620039fd5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000731919062004456565b6106f3806200446c83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146200164257600080fd5b6000806040838503121562003a7857600080fd5b82359150602083013562003a8c8162003a41565b809150509250929050565b6000806040838503121562003aab57600080fd5b823562003ab88162003a41565b9150602083013562003a8c8162003a41565b60008083601f84011262003add57600080fd5b50813567ffffffffffffffff81111562003af657600080fd5b6020830191508360208260051b850101111562003b1257600080fd5b9250929050565b6000806020838503121562003b2d57600080fd5b823567ffffffffffffffff81111562003b4557600080fd5b62003b538582860162003aca565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003bd85762003bd862003b5f565b604052919050565b6000602080838503121562003bf457600080fd5b823567ffffffffffffffff8082111562003c0d57600080fd5b818501915085601f83011262003c2257600080fd5b81358181111562003c375762003c3762003b5f565b8060051b915062003c4a84830162003b8e565b818152918301840191848101908884111562003c6557600080fd5b938501935b8385101562003c93578435925062003c828362003a41565b828252938501939085019062003c6a565b98975050505050505050565b60008060006060848603121562003cb557600080fd5b833562003cc28162003a41565b925060208401359150604084013562003cdb8162003a41565b809150509250925092565b60006020828403121562003cf957600080fd5b813562003d068162003a41565b9392505050565b600080600080600080600060c0888a03121562003d2957600080fd5b873562003d368162003a41565b9650602088013562003d488162003a41565b9550604088013562003d5a8162003a41565b9450606088013593506080880135925060a088013567ffffffffffffffff81111562003d8557600080fd5b62003d938a828b0162003aca565b989b979a50959850939692959293505050565b60008083601f84011262003db957600080fd5b50813567ffffffffffffffff81111562003dd257600080fd5b60208301915083602082850101111562003b1257600080fd5b60008060008060006080868803121562003e0457600080fd5b853562003e118162003a41565b945060208601359350604086013562003e2a8162003a41565b9250606086013567ffffffffffffffff81111562003e4757600080fd5b62003e558882890162003da6565b969995985093965092949392505050565b60008060008060008060a0878903121562003e8057600080fd5b863562003e8d8162003a41565b955060208701359450604087013562003ea68162003a41565b935060608701359250608087013567ffffffffffffffff81111562003eca57600080fd5b62003ed889828a0162003da6565b979a9699509497509295939492505050565b60006020828403121562003efd57600080fd5b815162003d068162003a41565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f9c5762003f9c62003f39565b5060010190565b6020808252825182820181905260009190848201906040850190845b8181101562003ff357835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010162003fbf565b50909695505050505050565b60005b838110156200401c57818101518382015260200162004002565b50506000910152565b600081518084526200403f81602086016020860162003fff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000620040a8606083018462004025565b95945050505050565b600060208284031215620040c457600080fd5b5051919050565b8181038181111562003484576200348462003f39565b606081526000620040f6606083018662004025565b82810360208401526200410a818662004025565b91505060ff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835286602084015280861660408401525083606083015260a060808301526200394060a083018462004025565b600082516200417981846020870162003fff565b9190910192915050565b60ff811681146200164257600080fd5b600060208284031215620041a657600080fd5b815162003d068162004183565b60008085851115620041c457600080fd5b83861115620041d257600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042205780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200424457600080fd5b8735620042518162003a41565b96506020880135620042638162003a41565b955060408801359450606088013593506080880135620042838162004183565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff821115620042bd57620042bd62003b5f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620042fb57600080fd5b8135620043126200430c82620042a0565b62003b8e565b8181528460208386010111156200432857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156200435b57600080fd5b833567ffffffffffffffff808211156200437457600080fd5b6200438287838801620042e9565b945060208601359150808211156200439957600080fd5b50620043a886828701620042e9565b925050604084013562003cdb8162004183565b600060208284031215620043ce57600080fd5b8151801515811462003d0657600080fd5b600060208284031215620043f257600080fd5b815167ffffffffffffffff8111156200440a57600080fd5b8201601f810184136200441c57600080fd5b80516200442d6200430c82620042a0565b8181528560208385010111156200444357600080fd5b620040a882602083016020860162003fff565b60208152600062003d0660208301846200402556fe60806040526040516106f33803806106f383398101604081905261002291610420565b61002e82826000610035565b505061054a565b61003e836100f6565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100f1576100ef836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e991906104e0565b8361027a565b505b505050565b6001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101d4816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906104e0565b6001600160a01b03163b151590565b6102395760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610157565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029f83836040518060600160405280602781526020016106cc602791396102a6565b9392505050565b6060600080856001600160a01b0316856040516102c391906104fb565b600060405180830381855af49150503d80600081146102fe576040519150601f19603f3d011682016040523d82523d6000602084013e610303565b606091505b5090925090506103158683838761031f565b9695505050505050565b6060831561038e578251600003610387576001600160a01b0385163b6103875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610157565b5081610398565b61039883836103a0565b949350505050565b8151156103b05781518083602001fd5b8060405162461bcd60e51b81526004016101579190610517565b80516001600160a01b03811681146103e157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156104175781810151838201526020016103ff565b50506000910152565b6000806040838503121561043357600080fd5b61043c836103ca565b60208401519092506001600160401b038082111561045957600080fd5b818501915085601f83011261046d57600080fd5b81518181111561047f5761047f6103e6565b604051601f8201601f19908116603f011681019083821181831017156104a7576104a76103e6565b816040528281528860208487010111156104c057600080fd5b6104d18360208301602088016103fc565b80955050505050509250929050565b6000602082840312156104f257600080fd5b61029f826103ca565b6000825161050d8184602087016103fc565b9190910192915050565b60208152600082518060208401526105368160408501602087016103fc565b601f01601f19169190910160400192915050565b610173806105596000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610029565b6100dc565b565b60006100697fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d79190610100565b905090565b3660008037600080366000845af43d6000803e8080156100fb573d6000f35b3d6000fd5b60006020828403121561011257600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461013657600080fd5b939250505056fea26469706673582212208f09a843dea4ba2d675ef8526d536bd96a0b75b7d424c3ee02c3394d8c4cb4df64736f6c63430008130033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220eed90cb33266c3ef5bcb1ab4424859155be908cfe919f8d9c276105e081f32ee64736f6c63430008130033", - "deployedBytecode": "0x608060405260043610620001c35760003560e01c80638dae45dd11620000f3578063ccf5a77c1162000095578063e30c3978116200006c578063e30c39781462000533578063e4d274511462000560578063edc42a221462000585578063f2fde38b14620005aa57600080fd5b8063ccf5a77c14620004c7578063cdd914c514620004f7578063dfa96efb146200051c57600080fd5b8063b0994f0811620000ca578063b0994f081462000435578063be46096f146200045a578063ca41a247146200047f57600080fd5b80638dae45dd14620003b2578063a676e8ab14620003e1578063a6ef995f146200040657600080fd5b80634bf98dce1162000169578063715018a61162000140578063715018a6146200033d57806379ba509714620003555780638456cb59146200036d5780638da5cb5b146200038557600080fd5b80634bf98dce14620002ea578063522ea81a14620003015780635c975abb146200031857600080fd5b80631754f301116200019e5780631754f30114620002865780632a564f3414620002ad5780633f4ba83a14620002d257600080fd5b80630f6f86ec14620001c8578063146ffb2614620002455780631544298e146200026d575b600080fd5b348015620001d557600080fd5b506200021b620001e736600462003a64565b61010860209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156200025257600080fd5b506200025e61010b5481565b6040519081526020016200023c565b3480156200027a57600080fd5b506200025e61010a5481565b3480156200029357600080fd5b50620002ab620002a536600462003a97565b620005cf565b005b348015620002ba57600080fd5b50620002ab620002cc36600462003b19565b6200090e565b348015620002df57600080fd5b50620002ab62000b9f565b620002ab620002fb36600462003be0565b62000bb5565b620002ab6200031236600462003c9f565b62000e51565b3480156200032557600080fd5b5060335460ff1660405190151581526020016200023c565b3480156200034a57600080fd5b50620002ab62001576565b3480156200036257600080fd5b50620002ab6200158c565b3480156200037a57600080fd5b50620002ab62001645565b3480156200039257600080fd5b5060655473ffffffffffffffffffffffffffffffffffffffff166200021b565b348015620003bf57600080fd5b5060c9546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b348015620003ee57600080fd5b50620002ab6200040036600462003ce6565b62001659565b3480156200041357600080fd5b5060ca546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200044257600080fd5b50620002ab6200045436600462003d0d565b62001722565b3480156200046757600080fd5b50620002ab6200047936600462003ce6565b62001aed565b3480156200048c57600080fd5b506200021b6200049e36600462003ce6565b6101096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004d457600080fd5b50610107546200021b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200050457600080fd5b50620002ab6200051636600462003ce6565b62001bc0565b620002ab6200052d36600462003deb565b62001d62565b3480156200054057600080fd5b5060975473ffffffffffffffffffffffffffffffffffffffff166200021b565b3480156200056d57600080fd5b50620002ab6200057f36600462003e66565b62001e25565b3480156200059257600080fd5b50620002ab620005a436600462003ce6565b620021c0565b348015620005b757600080fd5b50620002ab620005c936600462003ce6565b62002301565b8173ffffffffffffffffffffffffffffffffffffffff81166200061e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166200066d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000677620023b4565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8089168552925290912054859116151580620006e5575073ffffffffffffffffffffffffffffffffffffffff818116600090815261010960205260409020541615155b156200073a576040517f12f3df0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600090815261010960205260409020541615620007b4576040517ff8fb7c2700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240162000731565b73ffffffffffffffffffffffffffffffffffffffff84166102221480620007f2575073ffffffffffffffffffffffffffffffffffffffff8416610333145b8062000815575073ffffffffffffffffffffffffffffffffffffffff8416610111145b1562000866576040517fd8ce8acb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240162000731565b61010b5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808a168086529184528285208054918a167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155808652610109909452828520805490911682179055905133937f844cb5c635052898ad92bea4ece14519111765d835105e76aa1f77ad0d0aa81f91a45050505050565b60c95473ffffffffffffffffffffffffffffffffffffffff16331462000960576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216916367e404ce916004808201926020929091908290030181865afa158015620009d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009fe919062003eea565b73ffffffffffffffffffffffffffffffffffffffff161462000a4c576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8281101562000b995783838281811062000a6e5762000a6e62003f0a565b905060200201602081019062000a85919062003ce6565b61010a54600090815261010860205260408120919350610333919086868581811062000ab55762000ab562003f0a565b905060200201602081019062000acc919062003ce6565b73ffffffffffffffffffffffffffffffffffffffff9081168252602082019290925260400160002080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290911691909117905583838281811062000b375762000b3762003f0a565b905060200201602081019062000b4e919062003ce6565b73ffffffffffffffffffffffffffffffffffffffff167f91d24864a084ab70b268a1f865e757ca12006cf298d763b6be697302ef86498c60405160405180910390a260010162000a50565b50505050565b62000ba9620023b4565b62000bb362002437565b565b60005b815181101562000cd9576000610109600084848151811062000bde5762000bde62003f0a565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835290820192909252604001600020541690508062000c885782828151811062000c305762000c3062003f0a565b60200260200101516040517fa5ea89da00000000000000000000000000000000000000000000000000000000815260040162000731919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b8083838151811062000c9e5762000c9e62003f0a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152508062000cd08162003f68565b91505062000bb8565b5060c95460ca5460405173ffffffffffffffffffffffffffffffffffffffff92831692639f3ce55a923492911690829062000d1990879060240162003fa3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2a564f3400000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815262000dca9392919060040162004071565b6000604051808303818588803b15801562000de457600080fd5b505af115801562000df9573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f59eab5b5f813ac9e0c10035dfb55b5e3419eff53c0f7a869fb3c22400ea036d68260405162000e46919062003fa3565b60405180910390a250565b8273ffffffffffffffffffffffffffffffffffffffff811662000ea0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff811662000eef576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b838060000362000f2f576040517f4618044a0000000000000000000000000000000000000000000000000000000081526004810182905260240162000731565b62000f39620024b6565b62000f4362002525565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b168552925290912054167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeef810162000fed576040517f6dad9c7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816600482015260240162000731565b73ffffffffffffffffffffffffffffffffffffffff80881660009081526101096020526040812054909116908060608315620010ba576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8c1690639dc29fac90604401600060405180830381600087803b1580156200109257600080fd5b505af1158015620010a7573d6000803e3d6000fd5b5050505083925061010b5491506200137c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8d16906370a0823190602401602060405180830381865afa15801562001128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200114e9190620040b1565b90506200117473ffffffffffffffffffffffffffffffffffffffff8d1633308e6200259a565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819073ffffffffffffffffffffffffffffffffffffffff8e16906370a0823190602401602060405180830381865afa158015620011e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012079190620040b1565b620012139190620040cb565b9a508b935073ffffffffffffffffffffffffffffffffffffffff86166200130d57610222610108600061010a54815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b73ffffffffffffffffffffffffffffffffffffffff167f0f53e2a811b6fd2d6cd965fd6c27b44fb924ca39f7a7f321115705c22366d62360405160405180910390a25b73ffffffffffffffffffffffffffffffffffffffff8616610333146200137457620013388c62002678565b620013438d62002798565b6200134e8e620028a5565b6040516020016200136293929190620040e1565b60405160208183030381529060405291505b61010a549250505b60c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f3ce55a3460ca60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1634878f8f8989604051602401620013fa9594939291906200411e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe4d2745100000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152620014ab9392919060040162004071565b6000604051808303818588803b158015620014c557600080fd5b505af1158015620014da573d6000803e3d6000fd5b50505050508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fde5fcf0a1aebed387067eb25655de732ccfc43fe5b5a3d91d367c26e773fcd1c8d6040516200155691815260200190565b60405180910390a450505050506200156e600160d555565b505050505050565b62001580620023b4565b62000bb36000620029a8565b609754339073ffffffffffffffffffffffffffffffffffffffff16811462001637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e65720000000000000000000000000000000000000000000000606482015260840162000731565b6200164281620029a8565b50565b6200164f620023b4565b62000bb3620029db565b62001663620023b4565b60ca5473ffffffffffffffffffffffffffffffffffffffff1615620016d15760ca546040517f94fbfd2e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240162000731565b620016dc8162002a39565b604051339073ffffffffffffffffffffffffffffffffffffffff8316907fb044c1a1a05a729c402def784b4e4cb01612ff03eee6f0beb3eba0f0606260a190600090a350565b8673ffffffffffffffffffffffffffffffffffffffff811662001771576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff8116620017c0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff81166200180f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015620018305750600054600160ff909116105b806200184c5750303b1580156200184c575060005460ff166001145b620018da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840162000731565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200193957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6200194362002ace565b6200194d62002b71565b620019588a62002c14565b6200196262002d42565b61010780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b1617905561010a88905561010b87905560005b8581101562001a70576000878783818110620019d257620019d262003f0a565b9050602002016020810190620019e9919062003ce6565b73ffffffffffffffffffffffffffffffffffffffff160362001a37576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001a6787878381811062001a505762001a5062003f0a565b905060200201602081019062000516919062003ce6565b600101620019b2565b5062001a7c8b620029a8565b801562001ae057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff811662001b3c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001b46620023b4565b60c9805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560405191169133918391907fc96d462e42a71473da49a1d58c1754b9b2d319786692d621dc7f921331c517e990600090a4505050565b8073ffffffffffffffffffffffffffffffffffffffff811662001c0f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001c19620023b4565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808716855292529091205483911615158062001c87575073ffffffffffffffffffffffffffffffffffffffff818116600090815261010960205260409020541615155b1562001cd8576040517f12f3df0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240162000731565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166101111790555190917f5e023c7a09fa0534ce3199f65fc3e635a5e851c5adc88ebda3b9d332ae07cbe991a2505050565b8473ffffffffffffffffffffffffffffffffffffffff811662001db1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848060000362001df1576040517f4618044a0000000000000000000000000000000000000000000000000000000081526004810182905260240162000731565b62001dfb620024b6565b821562001e0f5762001e0f87858562002de5565b62001e1c87878762000e51565b50505050505050565b62001e2f62002525565b60c95473ffffffffffffffffffffffffffffffffffffffff16331462001e81576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216916367e404ce916004808201926020929091908290030181865afa15801562001ef9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f1f919062003eea565b73ffffffffffffffffffffffffffffffffffffffff161462001f6d576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001f77620024b6565b60008381526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b1685529252822054169061022282148062001fd2575073ffffffffffffffffffffffffffffffffffffffff8216610333145b15620020015762001ffb73ffffffffffffffffffffffffffffffffffffffff89168789620030b6565b62002134565b508073ffffffffffffffffffffffffffffffffffffffff8116620020a9576200203088858561010a5462003113565b73ffffffffffffffffffffffffffffffffffffffff8082166000818152610109602090815260408083208054958f167fffffffffffffffffffffffff0000000000000000000000000000000000000000968716811790915561010b54845261010883528184209084529091529020805490921617905590505b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018990528216906340c10f1990604401600060405180830381600087803b1580156200211a57600080fd5b505af11580156200212f573d6000803e3d6000fd5b505050505b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fd28a2d30314c6a2f46b657c15ee4d7ffc33b2817e78f341a260e216cebfbdbef8a604051620021ab91815260200190565b60405180910390a450506200156e600160d555565b8073ffffffffffffffffffffffffffffffffffffffff81166200220f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62002219620023b4565b61010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86811685529252909120541661011114620022a4576040517f82f5d0a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260240162000731565b5061010a5460009081526101086020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6200230b620023b4565b6097805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556200236f60655473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60655473ffffffffffffffffffffffffffffffffffffffff16331462000bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000731565b62002441620032de565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60335460ff161562000bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640162000731565b600260d5540362002593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000731565b600260d555565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905262000b999085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526200334c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620026fc919062004165565b600060405180830381855afa9150503d806000811462002739576040519150601f19603f3d011682016040523d82523d6000602084013e6200273e565b606091505b50915091508162002785576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062002790565b620027908162003462565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916200281c919062004165565b600060405180830381855afa9150503d806000811462002859576040519150601f19603f3d011682016040523d82523d6000602084013e6200285e565b606091505b50915091508162002785576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062002790565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002928919062004165565b600060405180830381855afa9150503d806000811462002965576040519150601f19603f3d011682016040523d82523d6000602084013e6200296a565b606091505b50915091508180156200297e575080516020145b6200298b57601262002790565b8080602001905181019062002790919062004193565b600160d555565b609780547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562001642816200363b565b620029e5620024b6565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200248c3390565b73ffffffffffffffffffffffffffffffffffffffff811662002a87576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900460ff1662002b67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb3620036b2565b600054610100900460ff1662002c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb362003775565b600054610100900460ff1662002cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b73ffffffffffffffffffffffffffffffffffffffff811662002cfb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900460ff1662002ddb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb362003819565b7fd505accf0000000000000000000000000000000000000000000000000000000062002e16600460008486620041b3565b62002e2191620041df565b7fffffffff00000000000000000000000000000000000000000000000000000000161462002ee25762002e59600460008385620041b3565b62002e6491620041df565b6040517fcf9e29460000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000090911660048201527fd505accf00000000000000000000000000000000000000000000000000000000602482015260440162000731565b600080808080808062002ef9886004818c620041b3565b81019062002f08919062004228565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002f95576040517f200688cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816600482015260240162000731565b73ffffffffffffffffffffffffffffffffffffffff8616301462002ffe576040517f2911594800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716600482015260240162000731565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff8b169063d505accf9060e401600060405180830381600087803b1580156200309157600080fd5b505af1158015620030a6573d6000803e3d6000fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526200310e9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401620025f5565b505050565b60008082866040516020016200314992919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052805160209091012061010754909250600091839173ffffffffffffffffffffffffffffffffffffffff1690620031ae9062003a33565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190526000908201526060018190604051809103906000f5905080158015620031fb573d6000803e3d6000fd5b509050806000808062003211898b018b62004345565b9250925092508373ffffffffffffffffffffffffffffffffffffffff16631624f6c68484846040518463ffffffff1660e01b81526004016200325693929190620040e1565b600060405180830381600087803b1580156200327157600080fd5b505af115801562003286573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff808f169350871691507fd5d4920bb61e6141c8499d50a7bd617dae2b1818c9d6b995d3f2ba4975e32ea490600090a350919998505050505050505050565b60335460ff1662000bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640162000731565b6000620033b0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620038b29092919063ffffffff16565b9050805160001480620033d4575080806020019051810190620033d49190620043bb565b6200310e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000731565b606060408251106200348a5781806020019051810190620034849190620043df565b92915050565b8151602014620034cd57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60005b6020811080156200351b5750828181518110620034f157620034f162003f0a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156200352a57600101620034d0565b806000036200356e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156200358c576200358c62003b5f565b6040519080825280601f01601f191660200182016040528015620035b7576020820181803683370190505b50905060005b828110156200363357848181518110620035db57620035db62003f0a565b602001015160f81c60f81b828281518110620035fb57620035fb62003f0a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101620035bd565b509392505050565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166200374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600054610100900460ff166200380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b62000bb333620029a8565b600054610100900460ff16620029a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000731565b6060620027908484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620038e9919062004165565b60006040518083038185875af1925050503d806000811462003928576040519150601f19603f3d011682016040523d82523d6000602084013e6200392d565b606091505b509150915062003940878383876200394b565b979650505050505050565b60608315620039e6578251600003620039de5773ffffffffffffffffffffffffffffffffffffffff85163b620039de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000731565b508162002790565b620027908383815115620039fd5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000731919062004456565b6106f3806200446c83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146200164257600080fd5b6000806040838503121562003a7857600080fd5b82359150602083013562003a8c8162003a41565b809150509250929050565b6000806040838503121562003aab57600080fd5b823562003ab88162003a41565b9150602083013562003a8c8162003a41565b60008083601f84011262003add57600080fd5b50813567ffffffffffffffff81111562003af657600080fd5b6020830191508360208260051b850101111562003b1257600080fd5b9250929050565b6000806020838503121562003b2d57600080fd5b823567ffffffffffffffff81111562003b4557600080fd5b62003b538582860162003aca565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003bd85762003bd862003b5f565b604052919050565b6000602080838503121562003bf457600080fd5b823567ffffffffffffffff8082111562003c0d57600080fd5b818501915085601f83011262003c2257600080fd5b81358181111562003c375762003c3762003b5f565b8060051b915062003c4a84830162003b8e565b818152918301840191848101908884111562003c6557600080fd5b938501935b8385101562003c93578435925062003c828362003a41565b828252938501939085019062003c6a565b98975050505050505050565b60008060006060848603121562003cb557600080fd5b833562003cc28162003a41565b925060208401359150604084013562003cdb8162003a41565b809150509250925092565b60006020828403121562003cf957600080fd5b813562003d068162003a41565b9392505050565b600080600080600080600060c0888a03121562003d2957600080fd5b873562003d368162003a41565b9650602088013562003d488162003a41565b9550604088013562003d5a8162003a41565b9450606088013593506080880135925060a088013567ffffffffffffffff81111562003d8557600080fd5b62003d938a828b0162003aca565b989b979a50959850939692959293505050565b60008083601f84011262003db957600080fd5b50813567ffffffffffffffff81111562003dd257600080fd5b60208301915083602082850101111562003b1257600080fd5b60008060008060006080868803121562003e0457600080fd5b853562003e118162003a41565b945060208601359350604086013562003e2a8162003a41565b9250606086013567ffffffffffffffff81111562003e4757600080fd5b62003e558882890162003da6565b969995985093965092949392505050565b60008060008060008060a0878903121562003e8057600080fd5b863562003e8d8162003a41565b955060208701359450604087013562003ea68162003a41565b935060608701359250608087013567ffffffffffffffff81111562003eca57600080fd5b62003ed889828a0162003da6565b979a9699509497509295939492505050565b60006020828403121562003efd57600080fd5b815162003d068162003a41565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f9c5762003f9c62003f39565b5060010190565b6020808252825182820181905260009190848201906040850190845b8181101562003ff357835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010162003fbf565b50909695505050505050565b60005b838110156200401c57818101518382015260200162004002565b50506000910152565b600081518084526200403f81602086016020860162003fff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000620040a8606083018462004025565b95945050505050565b600060208284031215620040c457600080fd5b5051919050565b8181038181111562003484576200348462003f39565b606081526000620040f6606083018662004025565b82810360208401526200410a818662004025565b91505060ff83166040830152949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835286602084015280861660408401525083606083015260a060808301526200394060a083018462004025565b600082516200417981846020870162003fff565b9190910192915050565b60ff811681146200164257600080fd5b600060208284031215620041a657600080fd5b815162003d068162004183565b60008085851115620041c457600080fd5b83861115620041d257600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042205780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200424457600080fd5b8735620042518162003a41565b96506020880135620042638162003a41565b955060408801359450606088013593506080880135620042838162004183565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff821115620042bd57620042bd62003b5f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620042fb57600080fd5b8135620043126200430c82620042a0565b62003b8e565b8181528460208386010111156200432857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156200435b57600080fd5b833567ffffffffffffffff808211156200437457600080fd5b6200438287838801620042e9565b945060208601359150808211156200439957600080fd5b50620043a886828701620042e9565b925050604084013562003cdb8162004183565b600060208284031215620043ce57600080fd5b8151801515811462003d0657600080fd5b600060208284031215620043f257600080fd5b815167ffffffffffffffff8111156200440a57600080fd5b8201601f810184136200441c57600080fd5b80516200442d6200430c82620042a0565b8181528560208385010111156200444357600080fd5b620040a882602083016020860162003fff565b60208152600062003d0660208301846200402556fe60806040526040516106f33803806106f383398101604081905261002291610420565b61002e82826000610035565b505061054a565b61003e836100f6565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100f1576100ef836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e991906104e0565b8361027a565b505b505050565b6001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101d4816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906104e0565b6001600160a01b03163b151590565b6102395760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610157565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029f83836040518060600160405280602781526020016106cc602791396102a6565b9392505050565b6060600080856001600160a01b0316856040516102c391906104fb565b600060405180830381855af49150503d80600081146102fe576040519150601f19603f3d011682016040523d82523d6000602084013e610303565b606091505b5090925090506103158683838761031f565b9695505050505050565b6060831561038e578251600003610387576001600160a01b0385163b6103875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610157565b5081610398565b61039883836103a0565b949350505050565b8151156103b05781518083602001fd5b8060405162461bcd60e51b81526004016101579190610517565b80516001600160a01b03811681146103e157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156104175781810151838201526020016103ff565b50506000910152565b6000806040838503121561043357600080fd5b61043c836103ca565b60208401519092506001600160401b038082111561045957600080fd5b818501915085601f83011261046d57600080fd5b81518181111561047f5761047f6103e6565b604051601f8201601f19908116603f011681019083821181831017156104a7576104a76103e6565b816040528281528860208487010111156104c057600080fd5b6104d18360208301602088016103fc565b80955050505050509250929050565b6000602082840312156104f257600080fd5b61029f826103ca565b6000825161050d8184602087016103fc565b9190910192915050565b60208152600082518060208401526105368160408501602087016103fc565b601f01601f19169190910160400192915050565b610173806105596000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610029565b6100dc565b565b60006100697fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d79190610100565b905090565b3660008037600080366000845af43d6000803e8080156100fb573d6000f35b3d6000fd5b60006020828403121561011257600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461013657600080fd5b939250505056fea26469706673582212208f09a843dea4ba2d675ef8526d536bd96a0b75b7d424c3ee02c3394d8c4cb4df64736f6c63430008130033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220eed90cb33266c3ef5bcb1ab4424859155be908cfe919f8d9c276105e081f32ee64736f6c63430008130033", + "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615af380620000f36000396000f3fe608060405260043610620003235760003560e01c80638dae45dd11620001a3578063ca41a24711620000e7578063d547741f1162000095578063e4d27451116200006c578063e4d274511462000a55578063edc42a221462000a7a578063fe3c50a01462000a9f57600080fd5b8063d547741f14620009f4578063dfa96efb1462000a19578063e196fb5d1462000a3057600080fd5b8063ccf5a77c11620000ca578063ccf5a77c1462000976578063cdd914c51462000999578063cf4a720814620009be57600080fd5b8063ca41a2471462000907578063cc5782f6146200094257600080fd5b8063a6ef995f1162000151578063be46096f1162000128578063be46096f1462000876578063c483d838146200089b578063c986752a14620008d157600080fd5b8063a6ef995f146200080a578063b3232bdf146200082c578063bc61e733146200085157600080fd5b80639ac25d0811620001865780639ac25d081462000798578063a217fddf14620007ce578063a676e8ab14620007e557600080fd5b80638dae45dd146200072c57806391d14854146200074e57600080fd5b80633551237b116200026b578063522ea81a11620002195780635a06a42a11620001f05780635a06a42a146200068a5780636a906b8014620006c057806380efb43a14620006f657600080fd5b8063522ea81a146200061857806352abf32d146200062f5780635626fc25146200065457600080fd5b806338b90333116200024e57806338b9033314620005825780633e9ebfc214620005dc5780634bf98dce146200060157600080fd5b80633551237b146200052757806336568abe146200055d57600080fd5b80631544298e11620002d55780632a564f3411620002ac5780632a564f3414620004a75780632e4c3fff14620004cc5780632f2ff15d146200050257600080fd5b80631544298e14620004355780631754f301146200044e578063248a9ca3146200047357600080fd5b80630f6f86ec116200030a5780630f6f86ec14620003895780631065a39914620003e8578063146ffb26146200040d57600080fd5b806301941d39146200032857806301ffc9a7146200034f575b600080fd5b3480156200033557600080fd5b506200034d6200034736600462004715565b62000ad5565b005b3480156200035c57600080fd5b50620003746200036e366004620047ce565b62000c6c565b60405190151581526020015b60405180910390f35b3480156200039657600080fd5b50620003cf620003a836600462004812565b6101086020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200162000380565b348015620003f557600080fd5b506200034d620004073660046200485a565b62000d06565b3480156200041a57600080fd5b506200042661010b5481565b60405190815260200162000380565b3480156200044257600080fd5b506200042661010a5481565b3480156200045b57600080fd5b506200034d6200046d36600462004878565b62000e5f565b3480156200048057600080fd5b506200042662000492366004620048ab565b60009081526097602052604090206001015490565b348015620004b457600080fd5b506200034d620004c6366004620048c5565b6200115a565b348015620004d957600080fd5b50620004267f8a7b208fd13ab36d18025be4f62b53d46aeb2cbe8958d2e13de74c040dddcddd81565b3480156200050f57600080fd5b506200034d6200052136600462004812565b62001379565b3480156200053457600080fd5b50620004267f19bf281d118073c159a713666aba52e0d403520cd01e03f42e0f62a0b3bd4a3581565b3480156200056a57600080fd5b506200034d6200057c36600462004812565b620013a7565b3480156200058f57600080fd5b50620005cd6040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b60405162000380919062004993565b348015620005e957600080fd5b506200034d620005fb366004620049a8565b62001437565b6200034d6200061236600462004a38565b620015b3565b6200034d6200062936600462004af7565b6200182e565b3480156200063c57600080fd5b506200034d6200064e366004620049a8565b62001ddc565b3480156200066157600080fd5b50620004267f46e34517dc946faf87aabe65eb5b4fa06b974e5c8d72c5df73b9fb6ff7b6d80281565b3480156200069757600080fd5b50620004267f50962b2d10066f5051f78d5ea04a3ab09b9c87dd1002962f0b1e30e66eeb80a581565b348015620006cd57600080fd5b50620004267fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b3480156200070357600080fd5b50620004267fbf094fe3c005c553ff0d33c7dff9d1273add12fb3f258b992f8d36224dd35b2481565b3480156200073957600080fd5b5060c954620003cf906001600160a01b031681565b3480156200075b57600080fd5b50620003746200076d36600462004812565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015620007a557600080fd5b50620004267f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015620007db57600080fd5b5062000426600081565b348015620007f257600080fd5b506200034d6200080436600462004b3e565b62001f58565b3480156200081757600080fd5b5060ca54620003cf906001600160a01b031681565b3480156200083957600080fd5b506200034d6200084b36600462004b5e565b6200201d565b3480156200085e57600080fd5b5062000374620008703660046200485a565b62002578565b3480156200088357600080fd5b506200034d6200089536600462004b3e565b620025a0565b348015620008a857600080fd5b50620004267feaf25fcc6b7d45bda16c56628df3f435e20319ef53b065c11ee4510083f0ae2d81565b348015620008de57600080fd5b50620004267f550554a677c8e7b73b62db78b0ef06c5f237da4ef30b88196a899ccf591041fe81565b3480156200091457600080fd5b50620003cf6200092636600462004b3e565b610109602052600090815260409020546001600160a01b031681565b3480156200094f57600080fd5b506200037462000961366004620048ab565b60d56020526000908152604090205460ff1681565b3480156200098357600080fd5b5061010754620003cf906001600160a01b031681565b348015620009a657600080fd5b506200034d620009b836600462004b3e565b62002663565b348015620009cb57600080fd5b50620004267f3900d9d72d5177a154375317154fdc0e08377e3134a8a5d21cadccf831cc231c81565b34801562000a0157600080fd5b506200034d62000a1336600462004812565b620027ce565b6200034d62000a2a36600462004be2565b620027f7565b34801562000a3d57600080fd5b506200034d62000a4f3660046200485a565b6200281f565b34801562000a6257600080fd5b506200034d62000a7436600462004c5d565b6200295d565b34801562000a8757600080fd5b506200034d62000a9936600462004b3e565b62002ca0565b34801562000aac57600080fd5b50620004267f77974cc9cb5bafc9bb265be792d93fa46355c05701895b82f6d3b4b448c8ce0081565b600054600290610100900460ff1615801562000af8575060005460ff8083169116105b62000b705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556001600160a01b03881662000bc9576040516342bcdf7f60e11b815260040160405180910390fd5b62000bd660008962002ddc565b6000606555600060d55562000bea62002e9e565b62000bf88585858562002f29565b62000c0487876200320f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148062000d0057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b80600081600881111562000d1e5762000d1e62004ce1565b0362000d56576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60d8600083600881111562000d6f5762000d6f62004ce1565b600881111562000d835762000d8362004ce1565b81526020019081526020016000205462000d9d81620033b1565b62000da88362002578565b62000de357826040517f1865965400000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b82600881111562000df85762000df862004ce1565b60d68054600190921b19909116905582600881111562000e1c5762000e1c62004ce1565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b6040516001600160a01b03909116815260200160405180910390a2505050565b816001600160a01b03811662000e88576040516342bcdf7f60e11b815260040160405180910390fd5b816001600160a01b03811662000eb1576040516342bcdf7f60e11b815260040160405180910390fd5b7f550554a677c8e7b73b62db78b0ef06c5f237da4ef30b88196a899ccf591041fe62000edd81620033b1565b6001600160a01b038086166000908152610109602052604090205486911615158062000f31575061010a546000908152610108602090815260408083206001600160a01b0385811685529252909120541615155b1562000f75576040517f12f3df090000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240162000b67565b6001600160a01b0385811660009081526101096020526040902054161562000fd5576040517ff8fb7c270000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260240162000b67565b6001600160a01b038516610222148062000ff957506001600160a01b038516610333145b806200100f57506001600160a01b038516610111145b1562001053576040517fd8ce8acb0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260240162000b67565b61010b546000818152610108602090815260408083206001600160a01b038b811685529252909120541615620010c1576040517f022bc8410000000000000000000000000000000000000000000000000000000081526001600160a01b038816600482015260240162000b67565b6000818152610108602090815260408083206001600160a01b03808c168086529184528285208054918c167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155808652610109909452828520805490911682179055905133937f844cb5c635052898ad92bea4ece14519111765d835105e76aa1f77ad0d0aa81f91a450505050505050565b60c9546001600160a01b031633146200119f576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216916367e404ce916004808201926020929091908290030181865afa1580156200120a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001230919062004d52565b6001600160a01b03161462001271576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010a5460005b82811015620013735760008281526101086020526040812061033391868685818110620012a957620012a962004d72565b9050602002016020810190620012c0919062004b3e565b6001600160a01b039081168252602082019290925260400160002080547fffffffffffffffffffffffff000000000000000000000000000000000000000016929091169190911790558383828181106200131e576200131e62004d72565b905060200201602081019062001335919062004b3e565b6001600160a01b03167f91d24864a084ab70b268a1f865e757ca12006cf298d763b6be697302ef86498c60405160405180910390a260010162001278565b50505050565b6000828152609760205260409020600101546200139681620033b1565b620013a2838362002ddc565b505050565b6001600160a01b0381163314620014275760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840162000b67565b620014338282620033c0565b5050565b8160008160088111156200144f576200144f62004ce1565b0362001487576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa77620014b381620033b1565b600060d76000866008811115620014ce57620014ce62004ce1565b6008811115620014e257620014e262004ce1565b81526020019081526020016000205490508381036200152d576040517f1b807f5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360d7600087600881111562001547576200154762004ce1565b60088111156200155b576200155b62004ce1565b8152602081019190915260400160002055808486600881111562001583576200158362004ce1565b6040517f074bfc3728ef1e98bde10bcb5bd8cde59cff190c2bfda5d22f879f865a07bac590600090a45050505050565b80516000819003620015f1576040517f10cbd58300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015620016ed576000610109600085848151811062001619576200161962004d72565b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416905080620016a9578382815181106200165e576200165e62004d72565b60200260200101516040517fa5ea89da00000000000000000000000000000000000000000000000000000000815260040162000b6791906001600160a01b0391909116815260200190565b80848381518110620016bf57620016bf62004d72565b6001600160a01b03909216602092830291909101909101525080620016e48162004dd0565b915050620015f4565b5060c95460ca546040516001600160a01b0392831692639f3ce55a92349291169082906200172090889060240162004e0b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2a564f3400000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152620017b39392919060040162004e5a565b6000604051808303818588803b158015620017cd57600080fd5b505af1158015620017e2573d6000803e3d6000fd5b5050505050336001600160a01b03167f59eab5b5f813ac9e0c10035dfb55b5e3419eff53c0f7a869fb3c22400ea036d68360405162001822919062004e0b565b60405180910390a25050565b826001600160a01b03811662001857576040516342bcdf7f60e11b815260040160405180910390fd5b816001600160a01b03811662001880576040516342bcdf7f60e11b815260040160405180910390fd5b8380600003620018c0576040517f4618044a0000000000000000000000000000000000000000000000000000000081526004810182905260240162000b67565b620018ca62003462565b620018d66007620034bd565b61010a546000818152610108602090815260408083206001600160a01b03808c168552925290912054167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeef810162001966576040517f6dad9c780000000000000000000000000000000000000000000000000000000081526001600160a01b038916600482015260240162000b67565b6001600160a01b0380891660009081526101096020526040812054909116906060821562001a15576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038c1690639dc29fac90604401600060405180830381600087803b158015620019f057600080fd5b505af115801562001a05573d6000803e3d6000fd5b5050505061010b54915062001c4f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038d16906370a0823190602401602060405180830381865afa15801562001a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a9c919062004e8d565b905062001ab56001600160a01b038d1633308e62003558565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906001600160a01b038e16906370a0823190602401602060405180830381865afa15801562001b15573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b3b919062004e8d565b62001b47919062004ea7565b9a508b93506001600160a01b03851662001bf057610222610108600088815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b6001600160a01b03167f0f53e2a811b6fd2d6cd965fd6c27b44fb924ca39f7a7f321115705c22366d62360405160405180910390a25b6001600160a01b0385166103331462001c4a5762001c0e8c6200360b565b62001c198d6200371e565b62001c248e6200381e565b60405160200162001c389392919062004ebd565b60405160208183030381529060405291505b859250505b60c960009054906101000a90046001600160a01b03166001600160a01b0316639f3ce55a3460ca60009054906101000a90046001600160a01b031634878f8f898960405160240162001ca695949392919062004efa565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe4d2745100000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815262001d399392919060040162004e5a565b6000604051808303818588803b15801562001d5357600080fd5b505af115801562001d68573d6000803e3d6000fd5b50505050508a6001600160a01b0316896001600160a01b0316336001600160a01b03167f8780a94875b70464f8ac6c28851501d32e7fd4ee574e4b94beb28923a3c42d9c8d60405162001dbd91815260200190565b60405180910390a4505050505062001dd460018055565b505050505050565b81600081600881111562001df45762001df462004ce1565b0362001e2c576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b62001e5881620033b1565b600060d8600086600881111562001e735762001e7362004ce1565b600881111562001e875762001e8762004ce1565b815260200190815260200160002054905083810362001ed2576040517f1b807f5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360d8600087600881111562001eec5762001eec62004ce1565b600881111562001f005762001f0062004ce1565b8152602081019190915260400160002055808486600881111562001f285762001f2862004ce1565b6040517ff8ef9f1cde7c2c0d3aeb696678f76d7c1c3e13c3b79ea3c5160a2d9eaa821cfd90600090a45050505050565b7fbf094fe3c005c553ff0d33c7dff9d1273add12fb3f258b992f8d36224dd35b2462001f8481620033b1565b60ca546001600160a01b03161562001fd85760ca546040517f94fbfd2e0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240162000b67565b62001fe3826200394a565b60405133906001600160a01b038416907fb044c1a1a05a729c402def784b4e4cb01612ff03eee6f0beb3eba0f0606260a190600090a35050565b6200202f604082016020830162004b3e565b6001600160a01b03811662002057576040516342bcdf7f60e11b815260040160405180910390fd5b62002069606083016040840162004b3e565b6001600160a01b03811662002091576040516342bcdf7f60e11b815260040160405180910390fd5b826060013580600003620020d1576040517f488d765100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83608001358060000362002111576040517f488d765100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015620021325750600054600160ff909116105b806200214e5750303b1580156200214e575060005460ff166001145b620021c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840162000b67565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200222157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6200224a6200223460e088018862004f34565b620022446101008a018a62004f34565b62002f29565b6200226662002260604088016020890162004b3e565b620039d7565b6200227062002e9e565b600062002281602088018862004b3e565b6001600160a01b031603620022a9576040516342bcdf7f60e11b815260040160405180910390fd5b620022c46000620022be602089018962004b3e565b62002ddc565b620022dd620022d760c088018862004f34565b6200320f565b620022ef606087016040880162004b3e565b61010780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560808601356060870135036200236a576040517fac867a5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086013561010a55608086013561010b5560005b6200238e60a088018862004f9f565b90508110156200250c576000620023a960a089018962004f9f565b83818110620023bc57620023bc62004d72565b9050602002016020810190620023d3919062004b3e565b6001600160a01b031603620023fb576040516342bcdf7f60e11b815260040160405180910390fd5b6060870135600090815261010860205260408120610111916200242260a08b018b62004f9f565b8581811062002435576200243562004d72565b90506020020160208101906200244c919062004b3e565b6001600160a01b039081168252602082019290925260400160002080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692909116919091179055620024a460a088018862004f9f565b82818110620024b757620024b762004d72565b9050602002016020810190620024ce919062004b3e565b6001600160a01b03167f5e023c7a09fa0534ce3199f65fc3e635a5e851c5adc88ebda3b9d332ae07cbe960405160405180910390a26001016200237f565b50801562001dd457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b60008160088111156200258f576200258f62004ce1565b60d654600190911b16151592915050565b806001600160a01b038116620025c9576040516342bcdf7f60e11b815260040160405180910390fd5b7f77974cc9cb5bafc9bb265be792d93fa46355c05701895b82f6d3b4b448c8ce00620025f581620033b1565b60c980546001600160a01b038581167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560405191169133918391907fc96d462e42a71473da49a1d58c1754b9b2d319786692d621dc7f921331c517e990600090a450505050565b806001600160a01b0381166200268c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0380831660009081526101096020526040902054839116151580620026e0575061010a546000908152610108602090815260408083206001600160a01b0385811685529252909120541615155b1562002724576040517f12f3df090000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240162000b67565b7feaf25fcc6b7d45bda16c56628df3f435e20319ef53b065c11ee4510083f0ae2d6200275081620033b1565b61010a546000908152610108602090815260408083206001600160a01b038816808552925280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166101111790555190917f5e023c7a09fa0534ce3199f65fc3e635a5e851c5adc88ebda3b9d332ae07cbe991a250505050565b600082815260976020526040902060010154620027eb81620033b1565b620013a28383620033c0565b80156200280b576200280b85838362003ab8565b620028188585856200182e565b5050505050565b80600081600881111562002837576200283762004ce1565b036200286f576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60d7600083600881111562002888576200288862004ce1565b60088111156200289c576200289c62004ce1565b815260200190815260200160002054620028b681620033b1565b620028c18362002578565b15620028fd57826040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b82600881111562002912576200291262004ce1565b60d68054600190921b909117905582600881111562002935576200293562004ce1565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d45593362000e3f565b6200296762003462565b60c9546001600160a01b03163314620029ac576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216916367e404ce916004808201926020929091908290030181865afa15801562002a17573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a3d919062004d52565b6001600160a01b03161462002a7e576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600862002a8b81620034bd565b6000848152610108602090815260408083206001600160a01b03808c1685529252822054169061022282148062002acc57506001600160a01b038216610333145b1562002aee5762002ae86001600160a01b038a16888a62003dd4565b62002c3b565b50806001600160a01b03811662002bbd5762002b1089868661010a5462003e1f565b9050886101096000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080610108600061010b54815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018a90528216906340c10f1990604401600060405180830381600087803b15801562002c2157600080fd5b505af115801562002c36573d6000803e3d6000fd5b505050505b866001600160a01b0316816001600160a01b03168a6001600160a01b03167f6ed06519caca659cdefa71015c79a561928d3cf8cc4a3e9739fde9fb5fb38d648b60405162002c8b91815260200190565b60405180910390a450505062001dd460018055565b806001600160a01b03811662002cc9576040516342bcdf7f60e11b815260040160405180910390fd5b7f19bf281d118073c159a713666aba52e0d403520cd01e03f42e0f62a0b3bd4a3562002cf581620033b1565b61010a546000818152610108602090815260408083206001600160a01b038881168552925290912054166101111462002d66576040517f82f5d0a50000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240162000b67565b6000818152610108602090815260408083206001600160a01b038816808552925280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555190917f0145163d8d460d1ab21463758d147fdfe79d4b57c81ca3d1439996104ae6895991a250505050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16620014335760008281526097602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905562002e5a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600054610100900460ff1662002f1d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b62002f2762003f4f565b565b600054610100900460ff1662002fa85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b60005b83811015620030db5784848281811062002fc95762002fc962004d72565b9050604002016020013560d7600087878581811062002fec5762002fec62004d72565b6200300492602060409092020190810191506200485a565b600881111562003018576200301862004ce1565b60088111156200302c576200302c62004ce1565b815260208101919091526040016000205584848281811062003052576200305262004d72565b9050604002016020013585858381811062003071576200307162004d72565b6200308992602060409092020190810191506200485a565b60088111156200309d576200309d62004ce1565b6040517f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec609190600090a380620030d28162004dd0565b91505062002fab565b5060005b818110156200281857828282818110620030fd57620030fd62004d72565b9050604002016020013560d8600085858581811062003120576200312062004d72565b6200313892602060409092020190810191506200485a565b60088111156200314c576200314c62004ce1565b600881111562003160576200316062004ce1565b815260208101919091526040016000205582828281811062003186576200318662004d72565b90506040020160200135838383818110620031a557620031a562004d72565b620031bd92602060409092020190810191506200485a565b6008811115620031d157620031d162004ce1565b6040517fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c290600090a380620032068162004dd0565b915050620030df565b600054610100900460ff166200328e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b60005b81811015620013a2576000838383818110620032b157620032b162004d72565b620032c9926020604090920201908101915062004b3e565b6001600160a01b031603620032f1576040516342bcdf7f60e11b815260040160405180910390fd5b82828281811062003306576200330662004d72565b905060400201602001356000801b036200334c576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200339c83838381811062003365576200336562004d72565b9050604002016020013584848481811062003384576200338462004d72565b620022be926020604090920201908101915062004b3e565b80620033a88162004dd0565b91505062003291565b620033bd813362003fce565b50565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff1615620014335760008281526097602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600260015403620034b65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b67565b6002600155565b60d654816008811115620034d557620034d562004ce1565b6001901b8116156200351757816040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b6002811615620014335760016040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b6040516001600160a01b0380851660248301528316604482015260648101829052620013739085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526200404c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b038616916200368291906200500a565b600060405180830381855afa9150503d8060008114620036bf576040519150601f19603f3d011682016040523d82523d6000602084013e620036c4565b606091505b5091509150816200370b576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062003716565b62003716816200413b565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b038616916200379591906200500a565b600060405180830381855afa9150503d8060008114620037d2576040519150601f19603f3d011682016040523d82523d6000602084013e620037d7565b606091505b5091509150816200370b576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062003716565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b038616916200389491906200500a565b600060405180830381855afa9150503d8060008114620038d1576040519150601f19603f3d011682016040523d82523d6000602084013e620038d6565b606091505b5091509150818015620038ea575060208151145b1562003906578080602001905181019062003716919062005038565b6040517fb5a2f1c60000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240162000b67565b60018055565b6001600160a01b03811662003972576040516342bcdf7f60e11b815260040160405180910390fd5b60ca80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040513391907fe68b208814fdb633b222cd15e73d5a27fb4ef9eef4cae78c623bc27702141d2890600090a350565b600054610100900460ff1662003a565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b6001600160a01b03811662003a7e576040516342bcdf7f60e11b815260040160405180910390fd5b60c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7fd505accf0000000000000000000000000000000000000000000000000000000062003ae960046000848662005058565b62003af49162005084565b7fffffffff00000000000000000000000000000000000000000000000000000000161462003bb55762003b2c60046000838562005058565b62003b379162005084565b6040517fcf9e29460000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000090911660048201527fd505accf00000000000000000000000000000000000000000000000000000000602482015260440162000b67565b600080808080808062003bcc886004818c62005058565b81019062003bdb9190620050cd565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462003c41576040517f200688cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038816600482015260240162000b67565b6001600160a01b038616301462003c90576040517f291159480000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260240162000b67565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301528691908c169063dd62ed3e90604401602060405180830381865afa15801562003cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003d21919062004e8d565b101562003dc8576040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b038b169063d505accf9060e401600060405180830381600087803b15801562003dae57600080fd5b505af115801562003dc3573d6000803e3d6000fd5b505050505b50505050505050505050565b6040516001600160a01b038316602482015260448101829052620013a29084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401620035a6565b6000818152602085905260408120610107546040516001600160a01b039091169062003e4b90620046a2565b6001600160a01b0390911681526040602082018190526000908201526060018190604051809103906000f590508015801562003e8b573d6000803e3d6000fd5b5090506000808062003ea086880188620051cc565b925092509250836001600160a01b0316631624f6c68484846040518463ffffffff1660e01b815260040162003ed89392919062004ebd565b600060405180830381600087803b15801562003ef357600080fd5b505af115801562003f08573d6000803e3d6000fd5b50506040516001600160a01b03808c169350871691507fd5d4920bb61e6141c8499d50a7bd617dae2b1818c9d6b995d3f2ba4975e32ea490600090a3505050949350505050565b600054610100900460ff16620039445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16620014335762004004816200430e565b6200401183602062004321565b6040516020016200402492919062005242565b60408051601f198184030181529082905262461bcd60e51b825262000b679160040162004993565b6000620040a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200456f9092919063ffffffff16565b9050805160001480620040c7575080806020019051810190620040c79190620052c7565b620013a25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000b67565b606060408251106200415d578180602001905181019062000d009190620052eb565b6020825114620041a057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60005b602081108015620041ee5750828181518110620041c457620041c462004d72565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620041fd57600101620041a3565b806000036200424157505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156200425f576200425f620049d5565b6040519080825280601f01601f1916602001820160405280156200428a576020820181803683370190505b50905060005b828110156200430657848181518110620042ae57620042ae62004d72565b602001015160f81c60f81b828281518110620042ce57620042ce62004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060010162004290565b509392505050565b606062000d006001600160a01b03831660145b606060006200433283600262005362565b6200433f9060026200537c565b67ffffffffffffffff8111156200435a576200435a620049d5565b6040519080825280601f01601f19166020018201604052801562004385576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110620043bf57620043bf62004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062004425576200442562004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006200446384600262005362565b620044709060016200537c565b90505b600181111562004517577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110620044b557620044b562004d72565b1a60f81b828281518110620044ce57620044ce62004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936200450f8162005392565b905062004473565b508315620045685760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000b67565b9392505050565b606062003716848460008585600080866001600160a01b031685876040516200459991906200500a565b60006040518083038185875af1925050503d8060008114620045d8576040519150601f19603f3d011682016040523d82523d6000602084013e620045dd565b606091505b5091509150620045f087838387620045fb565b979650505050505050565b606083156200466f57825160000362004667576001600160a01b0385163b620046675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b67565b508162003716565b620037168383815115620046865781518083602001fd5b8060405162461bcd60e51b815260040162000b67919062004993565b6106f380620053cb83390190565b6001600160a01b0381168114620033bd57600080fd5b60008083601f840112620046d957600080fd5b50813567ffffffffffffffff811115620046f257600080fd5b6020830191508360208260061b85010111156200470e57600080fd5b9250929050565b60008060008060008060006080888a0312156200473157600080fd5b87356200473e81620046b0565b9650602088013567ffffffffffffffff808211156200475c57600080fd5b6200476a8b838c01620046c6565b909850965060408a01359150808211156200478457600080fd5b620047928b838c01620046c6565b909650945060608a0135915080821115620047ac57600080fd5b50620047bb8a828b01620046c6565b989b979a50959850939692959293505050565b600060208284031215620047e157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200456857600080fd5b600080604083850312156200482657600080fd5b8235915060208301356200483a81620046b0565b809150509250929050565b8035600981106200485557600080fd5b919050565b6000602082840312156200486d57600080fd5b620045688262004845565b600080604083850312156200488c57600080fd5b82356200489981620046b0565b915060208301356200483a81620046b0565b600060208284031215620048be57600080fd5b5035919050565b60008060208385031215620048d957600080fd5b823567ffffffffffffffff80821115620048f257600080fd5b818501915085601f8301126200490757600080fd5b8135818111156200491757600080fd5b8660208260051b85010111156200492d57600080fd5b60209290920196919550909350505050565b60005b838110156200495c57818101518382015260200162004942565b50506000910152565b600081518084526200497f8160208601602086016200493f565b601f01601f19169290920160200192915050565b60208152600062004568602083018462004965565b60008060408385031215620049bc57600080fd5b620049c78362004845565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562004a305762004a30620049d5565b604052919050565b6000602080838503121562004a4c57600080fd5b823567ffffffffffffffff8082111562004a6557600080fd5b818501915085601f83011262004a7a57600080fd5b81358181111562004a8f5762004a8f620049d5565b8060051b915062004aa284830162004a04565b818152918301840191848101908884111562004abd57600080fd5b938501935b8385101562004aeb578435925062004ada83620046b0565b828252938501939085019062004ac2565b98975050505050505050565b60008060006060848603121562004b0d57600080fd5b833562004b1a81620046b0565b925060208401359150604084013562004b3381620046b0565b809150509250925092565b60006020828403121562004b5157600080fd5b81356200456881620046b0565b60006020828403121562004b7157600080fd5b813567ffffffffffffffff81111562004b8957600080fd5b820161012081850312156200456857600080fd5b60008083601f84011262004bb057600080fd5b50813567ffffffffffffffff81111562004bc957600080fd5b6020830191508360208285010111156200470e57600080fd5b60008060008060006080868803121562004bfb57600080fd5b853562004c0881620046b0565b945060208601359350604086013562004c2181620046b0565b9250606086013567ffffffffffffffff81111562004c3e57600080fd5b62004c4c8882890162004b9d565b969995985093965092949392505050565b60008060008060008060a0878903121562004c7757600080fd5b863562004c8481620046b0565b955060208701359450604087013562004c9d81620046b0565b935060608701359250608087013567ffffffffffffffff81111562004cc157600080fd5b62004ccf89828a0162004b9d565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016009831062004d4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60006020828403121562004d6557600080fd5b81516200456881620046b0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362004e045762004e0462004da1565b5060010190565b6020808252825182820181905260009190848201906040850190845b8181101562004e4e5783516001600160a01b03168352928401929184019160010162004e27565b50909695505050505050565b6001600160a01b038416815282602082015260606040820152600062004e84606083018462004965565b95945050505050565b60006020828403121562004ea057600080fd5b5051919050565b8181038181111562000d005762000d0062004da1565b60608152600062004ed2606083018662004965565b828103602084015262004ee6818662004965565b91505060ff83166040830152949350505050565b60006001600160a01b03808816835286602084015280861660408401525083606083015260a06080830152620045f060a083018462004965565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811262004f6a57600080fd5b83018035915067ffffffffffffffff82111562004f8657600080fd5b6020019150600681901b36038213156200470e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811262004fd557600080fd5b83018035915067ffffffffffffffff82111562004ff157600080fd5b6020019150600581901b36038213156200470e57600080fd5b600082516200501e8184602087016200493f565b9190910192915050565b60ff81168114620033bd57600080fd5b6000602082840312156200504b57600080fd5b8151620045688162005028565b600080858511156200506957600080fd5b838611156200507757600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620050c55780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a031215620050e957600080fd5b8735620050f681620046b0565b965060208801356200510881620046b0565b955060408801359450606088013593506080880135620051288162005028565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff821115620051625762005162620049d5565b50601f01601f191660200190565b600082601f8301126200518257600080fd5b813562005199620051938262005145565b62004a04565b818152846020838601011115620051af57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215620051e257600080fd5b833567ffffffffffffffff80821115620051fb57600080fd5b620052098783880162005170565b945060208601359150808211156200522057600080fd5b506200522f8682870162005170565b925050604084013562004b338162005028565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516200527c8160178501602088016200493f565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351620052bb8160288401602088016200493f565b01602801949350505050565b600060208284031215620052da57600080fd5b815180151581146200456857600080fd5b600060208284031215620052fe57600080fd5b815167ffffffffffffffff8111156200531657600080fd5b8201601f810184136200532857600080fd5b805162005339620051938262005145565b8181528560208385010111156200534f57600080fd5b62004e848260208301602086016200493f565b808202811582820484141762000d005762000d0062004da1565b8082018082111562000d005762000d0062004da1565b600081620053a457620053a462004da1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fe60806040526040516106f33803806106f383398101604081905261002291610420565b61002e82826000610035565b505061054a565b61003e836100f6565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100f1576100ef836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e991906104e0565b8361027a565b505b505050565b6001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101d4816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906104e0565b6001600160a01b03163b151590565b6102395760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610157565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029f83836040518060600160405280602781526020016106cc602791396102a6565b9392505050565b6060600080856001600160a01b0316856040516102c391906104fb565b600060405180830381855af49150503d80600081146102fe576040519150601f19603f3d011682016040523d82523d6000602084013e610303565b606091505b5090925090506103158683838761031f565b9695505050505050565b6060831561038e578251600003610387576001600160a01b0385163b6103875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610157565b5081610398565b61039883836103a0565b949350505050565b8151156103b05781518083602001fd5b8060405162461bcd60e51b81526004016101579190610517565b80516001600160a01b03811681146103e157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156104175781810151838201526020016103ff565b50506000910152565b6000806040838503121561043357600080fd5b61043c836103ca565b60208401519092506001600160401b038082111561045957600080fd5b818501915085601f83011261046d57600080fd5b81518181111561047f5761047f6103e6565b604051601f8201601f19908116603f011681019083821181831017156104a7576104a76103e6565b816040528281528860208487010111156104c057600080fd5b6104d18360208301602088016103fc565b80955050505050509250929050565b6000602082840312156104f257600080fd5b61029f826103ca565b6000825161050d8184602087016103fc565b9190910192915050565b60208152600082518060208401526105368160408501602087016103fc565b601f01601f19169190910160400192915050565b610173806105596000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610029565b6100dc565b565b60006100697fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d79190610100565b905090565b3660008037600080366000845af43d6000803e8080156100fb573d6000f35b3d6000fd5b60006020828403121561011257600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461013657600080fd5b939250505056fea2646970667358221220662c40b76fc0d477a291a78deacd27f4cddd7512dea18087244e38acb2fd99dd64736f6c63430008130033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122017127dbd91dad7d7cea4f8ba3f5f77b3fca5fb0083bfdd6b2d059d4213c0e90a64736f6c63430008130033", + "deployedBytecode": "0x608060405260043610620003235760003560e01c80638dae45dd11620001a3578063ca41a24711620000e7578063d547741f1162000095578063e4d27451116200006c578063e4d274511462000a55578063edc42a221462000a7a578063fe3c50a01462000a9f57600080fd5b8063d547741f14620009f4578063dfa96efb1462000a19578063e196fb5d1462000a3057600080fd5b8063ccf5a77c11620000ca578063ccf5a77c1462000976578063cdd914c51462000999578063cf4a720814620009be57600080fd5b8063ca41a2471462000907578063cc5782f6146200094257600080fd5b8063a6ef995f1162000151578063be46096f1162000128578063be46096f1462000876578063c483d838146200089b578063c986752a14620008d157600080fd5b8063a6ef995f146200080a578063b3232bdf146200082c578063bc61e733146200085157600080fd5b80639ac25d0811620001865780639ac25d081462000798578063a217fddf14620007ce578063a676e8ab14620007e557600080fd5b80638dae45dd146200072c57806391d14854146200074e57600080fd5b80633551237b116200026b578063522ea81a11620002195780635a06a42a11620001f05780635a06a42a146200068a5780636a906b8014620006c057806380efb43a14620006f657600080fd5b8063522ea81a146200061857806352abf32d146200062f5780635626fc25146200065457600080fd5b806338b90333116200024e57806338b9033314620005825780633e9ebfc214620005dc5780634bf98dce146200060157600080fd5b80633551237b146200052757806336568abe146200055d57600080fd5b80631544298e11620002d55780632a564f3411620002ac5780632a564f3414620004a75780632e4c3fff14620004cc5780632f2ff15d146200050257600080fd5b80631544298e14620004355780631754f301146200044e578063248a9ca3146200047357600080fd5b80630f6f86ec116200030a5780630f6f86ec14620003895780631065a39914620003e8578063146ffb26146200040d57600080fd5b806301941d39146200032857806301ffc9a7146200034f575b600080fd5b3480156200033557600080fd5b506200034d6200034736600462004715565b62000ad5565b005b3480156200035c57600080fd5b50620003746200036e366004620047ce565b62000c6c565b60405190151581526020015b60405180910390f35b3480156200039657600080fd5b50620003cf620003a836600462004812565b6101086020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200162000380565b348015620003f557600080fd5b506200034d620004073660046200485a565b62000d06565b3480156200041a57600080fd5b506200042661010b5481565b60405190815260200162000380565b3480156200044257600080fd5b506200042661010a5481565b3480156200045b57600080fd5b506200034d6200046d36600462004878565b62000e5f565b3480156200048057600080fd5b506200042662000492366004620048ab565b60009081526097602052604090206001015490565b348015620004b457600080fd5b506200034d620004c6366004620048c5565b6200115a565b348015620004d957600080fd5b50620004267f8a7b208fd13ab36d18025be4f62b53d46aeb2cbe8958d2e13de74c040dddcddd81565b3480156200050f57600080fd5b506200034d6200052136600462004812565b62001379565b3480156200053457600080fd5b50620004267f19bf281d118073c159a713666aba52e0d403520cd01e03f42e0f62a0b3bd4a3581565b3480156200056a57600080fd5b506200034d6200057c36600462004812565b620013a7565b3480156200058f57600080fd5b50620005cd6040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b60405162000380919062004993565b348015620005e957600080fd5b506200034d620005fb366004620049a8565b62001437565b6200034d6200061236600462004a38565b620015b3565b6200034d6200062936600462004af7565b6200182e565b3480156200063c57600080fd5b506200034d6200064e366004620049a8565b62001ddc565b3480156200066157600080fd5b50620004267f46e34517dc946faf87aabe65eb5b4fa06b974e5c8d72c5df73b9fb6ff7b6d80281565b3480156200069757600080fd5b50620004267f50962b2d10066f5051f78d5ea04a3ab09b9c87dd1002962f0b1e30e66eeb80a581565b348015620006cd57600080fd5b50620004267fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b3480156200070357600080fd5b50620004267fbf094fe3c005c553ff0d33c7dff9d1273add12fb3f258b992f8d36224dd35b2481565b3480156200073957600080fd5b5060c954620003cf906001600160a01b031681565b3480156200075b57600080fd5b50620003746200076d36600462004812565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015620007a557600080fd5b50620004267f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015620007db57600080fd5b5062000426600081565b348015620007f257600080fd5b506200034d6200080436600462004b3e565b62001f58565b3480156200081757600080fd5b5060ca54620003cf906001600160a01b031681565b3480156200083957600080fd5b506200034d6200084b36600462004b5e565b6200201d565b3480156200085e57600080fd5b5062000374620008703660046200485a565b62002578565b3480156200088357600080fd5b506200034d6200089536600462004b3e565b620025a0565b348015620008a857600080fd5b50620004267feaf25fcc6b7d45bda16c56628df3f435e20319ef53b065c11ee4510083f0ae2d81565b348015620008de57600080fd5b50620004267f550554a677c8e7b73b62db78b0ef06c5f237da4ef30b88196a899ccf591041fe81565b3480156200091457600080fd5b50620003cf6200092636600462004b3e565b610109602052600090815260409020546001600160a01b031681565b3480156200094f57600080fd5b506200037462000961366004620048ab565b60d56020526000908152604090205460ff1681565b3480156200098357600080fd5b5061010754620003cf906001600160a01b031681565b348015620009a657600080fd5b506200034d620009b836600462004b3e565b62002663565b348015620009cb57600080fd5b50620004267f3900d9d72d5177a154375317154fdc0e08377e3134a8a5d21cadccf831cc231c81565b34801562000a0157600080fd5b506200034d62000a1336600462004812565b620027ce565b6200034d62000a2a36600462004be2565b620027f7565b34801562000a3d57600080fd5b506200034d62000a4f3660046200485a565b6200281f565b34801562000a6257600080fd5b506200034d62000a7436600462004c5d565b6200295d565b34801562000a8757600080fd5b506200034d62000a9936600462004b3e565b62002ca0565b34801562000aac57600080fd5b50620004267f77974cc9cb5bafc9bb265be792d93fa46355c05701895b82f6d3b4b448c8ce0081565b600054600290610100900460ff1615801562000af8575060005460ff8083169116105b62000b705760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556001600160a01b03881662000bc9576040516342bcdf7f60e11b815260040160405180910390fd5b62000bd660008962002ddc565b6000606555600060d55562000bea62002e9e565b62000bf88585858562002f29565b62000c0487876200320f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148062000d0057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b80600081600881111562000d1e5762000d1e62004ce1565b0362000d56576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60d8600083600881111562000d6f5762000d6f62004ce1565b600881111562000d835762000d8362004ce1565b81526020019081526020016000205462000d9d81620033b1565b62000da88362002578565b62000de357826040517f1865965400000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b82600881111562000df85762000df862004ce1565b60d68054600190921b19909116905582600881111562000e1c5762000e1c62004ce1565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b6040516001600160a01b03909116815260200160405180910390a2505050565b816001600160a01b03811662000e88576040516342bcdf7f60e11b815260040160405180910390fd5b816001600160a01b03811662000eb1576040516342bcdf7f60e11b815260040160405180910390fd5b7f550554a677c8e7b73b62db78b0ef06c5f237da4ef30b88196a899ccf591041fe62000edd81620033b1565b6001600160a01b038086166000908152610109602052604090205486911615158062000f31575061010a546000908152610108602090815260408083206001600160a01b0385811685529252909120541615155b1562000f75576040517f12f3df090000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240162000b67565b6001600160a01b0385811660009081526101096020526040902054161562000fd5576040517ff8fb7c270000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260240162000b67565b6001600160a01b038516610222148062000ff957506001600160a01b038516610333145b806200100f57506001600160a01b038516610111145b1562001053576040517fd8ce8acb0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260240162000b67565b61010b546000818152610108602090815260408083206001600160a01b038b811685529252909120541615620010c1576040517f022bc8410000000000000000000000000000000000000000000000000000000081526001600160a01b038816600482015260240162000b67565b6000818152610108602090815260408083206001600160a01b03808c168086529184528285208054918c167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155808652610109909452828520805490911682179055905133937f844cb5c635052898ad92bea4ece14519111765d835105e76aa1f77ad0d0aa81f91a450505050505050565b60c9546001600160a01b031633146200119f576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216916367e404ce916004808201926020929091908290030181865afa1580156200120a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001230919062004d52565b6001600160a01b03161462001271576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010a5460005b82811015620013735760008281526101086020526040812061033391868685818110620012a957620012a962004d72565b9050602002016020810190620012c0919062004b3e565b6001600160a01b039081168252602082019290925260400160002080547fffffffffffffffffffffffff000000000000000000000000000000000000000016929091169190911790558383828181106200131e576200131e62004d72565b905060200201602081019062001335919062004b3e565b6001600160a01b03167f91d24864a084ab70b268a1f865e757ca12006cf298d763b6be697302ef86498c60405160405180910390a260010162001278565b50505050565b6000828152609760205260409020600101546200139681620033b1565b620013a2838362002ddc565b505050565b6001600160a01b0381163314620014275760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840162000b67565b620014338282620033c0565b5050565b8160008160088111156200144f576200144f62004ce1565b0362001487576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa77620014b381620033b1565b600060d76000866008811115620014ce57620014ce62004ce1565b6008811115620014e257620014e262004ce1565b81526020019081526020016000205490508381036200152d576040517f1b807f5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360d7600087600881111562001547576200154762004ce1565b60088111156200155b576200155b62004ce1565b8152602081019190915260400160002055808486600881111562001583576200158362004ce1565b6040517f074bfc3728ef1e98bde10bcb5bd8cde59cff190c2bfda5d22f879f865a07bac590600090a45050505050565b80516000819003620015f1576040517f10cbd58300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015620016ed576000610109600085848151811062001619576200161962004d72565b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416905080620016a9578382815181106200165e576200165e62004d72565b60200260200101516040517fa5ea89da00000000000000000000000000000000000000000000000000000000815260040162000b6791906001600160a01b0391909116815260200190565b80848381518110620016bf57620016bf62004d72565b6001600160a01b03909216602092830291909101909101525080620016e48162004dd0565b915050620015f4565b5060c95460ca546040516001600160a01b0392831692639f3ce55a92349291169082906200172090889060240162004e0b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2a564f3400000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152620017b39392919060040162004e5a565b6000604051808303818588803b158015620017cd57600080fd5b505af1158015620017e2573d6000803e3d6000fd5b5050505050336001600160a01b03167f59eab5b5f813ac9e0c10035dfb55b5e3419eff53c0f7a869fb3c22400ea036d68360405162001822919062004e0b565b60405180910390a25050565b826001600160a01b03811662001857576040516342bcdf7f60e11b815260040160405180910390fd5b816001600160a01b03811662001880576040516342bcdf7f60e11b815260040160405180910390fd5b8380600003620018c0576040517f4618044a0000000000000000000000000000000000000000000000000000000081526004810182905260240162000b67565b620018ca62003462565b620018d66007620034bd565b61010a546000818152610108602090815260408083206001600160a01b03808c168552925290912054167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeef810162001966576040517f6dad9c780000000000000000000000000000000000000000000000000000000081526001600160a01b038916600482015260240162000b67565b6001600160a01b0380891660009081526101096020526040812054909116906060821562001a15576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038c1690639dc29fac90604401600060405180830381600087803b158015620019f057600080fd5b505af115801562001a05573d6000803e3d6000fd5b5050505061010b54915062001c4f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038d16906370a0823190602401602060405180830381865afa15801562001a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a9c919062004e8d565b905062001ab56001600160a01b038d1633308e62003558565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906001600160a01b038e16906370a0823190602401602060405180830381865afa15801562001b15573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b3b919062004e8d565b62001b47919062004ea7565b9a508b93506001600160a01b03851662001bf057610222610108600088815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b6001600160a01b03167f0f53e2a811b6fd2d6cd965fd6c27b44fb924ca39f7a7f321115705c22366d62360405160405180910390a25b6001600160a01b0385166103331462001c4a5762001c0e8c6200360b565b62001c198d6200371e565b62001c248e6200381e565b60405160200162001c389392919062004ebd565b60405160208183030381529060405291505b859250505b60c960009054906101000a90046001600160a01b03166001600160a01b0316639f3ce55a3460ca60009054906101000a90046001600160a01b031634878f8f898960405160240162001ca695949392919062004efa565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe4d2745100000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815262001d399392919060040162004e5a565b6000604051808303818588803b15801562001d5357600080fd5b505af115801562001d68573d6000803e3d6000fd5b50505050508a6001600160a01b0316896001600160a01b0316336001600160a01b03167f8780a94875b70464f8ac6c28851501d32e7fd4ee574e4b94beb28923a3c42d9c8d60405162001dbd91815260200190565b60405180910390a4505050505062001dd460018055565b505050505050565b81600081600881111562001df45762001df462004ce1565b0362001e2c576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b62001e5881620033b1565b600060d8600086600881111562001e735762001e7362004ce1565b600881111562001e875762001e8762004ce1565b815260200190815260200160002054905083810362001ed2576040517f1b807f5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360d8600087600881111562001eec5762001eec62004ce1565b600881111562001f005762001f0062004ce1565b8152602081019190915260400160002055808486600881111562001f285762001f2862004ce1565b6040517ff8ef9f1cde7c2c0d3aeb696678f76d7c1c3e13c3b79ea3c5160a2d9eaa821cfd90600090a45050505050565b7fbf094fe3c005c553ff0d33c7dff9d1273add12fb3f258b992f8d36224dd35b2462001f8481620033b1565b60ca546001600160a01b03161562001fd85760ca546040517f94fbfd2e0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240162000b67565b62001fe3826200394a565b60405133906001600160a01b038416907fb044c1a1a05a729c402def784b4e4cb01612ff03eee6f0beb3eba0f0606260a190600090a35050565b6200202f604082016020830162004b3e565b6001600160a01b03811662002057576040516342bcdf7f60e11b815260040160405180910390fd5b62002069606083016040840162004b3e565b6001600160a01b03811662002091576040516342bcdf7f60e11b815260040160405180910390fd5b826060013580600003620020d1576040517f488d765100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83608001358060000362002111576040517f488d765100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015620021325750600054600160ff909116105b806200214e5750303b1580156200214e575060005460ff166001145b620021c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840162000b67565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200222157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6200224a6200223460e088018862004f34565b620022446101008a018a62004f34565b62002f29565b6200226662002260604088016020890162004b3e565b620039d7565b6200227062002e9e565b600062002281602088018862004b3e565b6001600160a01b031603620022a9576040516342bcdf7f60e11b815260040160405180910390fd5b620022c46000620022be602089018962004b3e565b62002ddc565b620022dd620022d760c088018862004f34565b6200320f565b620022ef606087016040880162004b3e565b61010780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560808601356060870135036200236a576040517fac867a5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086013561010a55608086013561010b5560005b6200238e60a088018862004f9f565b90508110156200250c576000620023a960a089018962004f9f565b83818110620023bc57620023bc62004d72565b9050602002016020810190620023d3919062004b3e565b6001600160a01b031603620023fb576040516342bcdf7f60e11b815260040160405180910390fd5b6060870135600090815261010860205260408120610111916200242260a08b018b62004f9f565b8581811062002435576200243562004d72565b90506020020160208101906200244c919062004b3e565b6001600160a01b039081168252602082019290925260400160002080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692909116919091179055620024a460a088018862004f9f565b82818110620024b757620024b762004d72565b9050602002016020810190620024ce919062004b3e565b6001600160a01b03167f5e023c7a09fa0534ce3199f65fc3e635a5e851c5adc88ebda3b9d332ae07cbe960405160405180910390a26001016200237f565b50801562001dd457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b60008160088111156200258f576200258f62004ce1565b60d654600190911b16151592915050565b806001600160a01b038116620025c9576040516342bcdf7f60e11b815260040160405180910390fd5b7f77974cc9cb5bafc9bb265be792d93fa46355c05701895b82f6d3b4b448c8ce00620025f581620033b1565b60c980546001600160a01b038581167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560405191169133918391907fc96d462e42a71473da49a1d58c1754b9b2d319786692d621dc7f921331c517e990600090a450505050565b806001600160a01b0381166200268c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0380831660009081526101096020526040902054839116151580620026e0575061010a546000908152610108602090815260408083206001600160a01b0385811685529252909120541615155b1562002724576040517f12f3df090000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240162000b67565b7feaf25fcc6b7d45bda16c56628df3f435e20319ef53b065c11ee4510083f0ae2d6200275081620033b1565b61010a546000908152610108602090815260408083206001600160a01b038816808552925280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166101111790555190917f5e023c7a09fa0534ce3199f65fc3e635a5e851c5adc88ebda3b9d332ae07cbe991a250505050565b600082815260976020526040902060010154620027eb81620033b1565b620013a28383620033c0565b80156200280b576200280b85838362003ab8565b620028188585856200182e565b5050505050565b80600081600881111562002837576200283762004ce1565b036200286f576040517f85994c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60d7600083600881111562002888576200288862004ce1565b60088111156200289c576200289c62004ce1565b815260200190815260200160002054620028b681620033b1565b620028c18362002578565b15620028fd57826040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b82600881111562002912576200291262004ce1565b60d68054600190921b909117905582600881111562002935576200293562004ce1565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d45593362000e3f565b6200296762003462565b60c9546001600160a01b03163314620029ac576040517f8c56efb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ca5460c954604080517f67e404ce00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216916367e404ce916004808201926020929091908290030181865afa15801562002a17573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002a3d919062004d52565b6001600160a01b03161462002a7e576040517f79d1e58f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600862002a8b81620034bd565b6000848152610108602090815260408083206001600160a01b03808c1685529252822054169061022282148062002acc57506001600160a01b038216610333145b1562002aee5762002ae86001600160a01b038a16888a62003dd4565b62002c3b565b50806001600160a01b03811662002bbd5762002b1089868661010a5462003e1f565b9050886101096000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080610108600061010b54815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018a90528216906340c10f1990604401600060405180830381600087803b15801562002c2157600080fd5b505af115801562002c36573d6000803e3d6000fd5b505050505b866001600160a01b0316816001600160a01b03168a6001600160a01b03167f6ed06519caca659cdefa71015c79a561928d3cf8cc4a3e9739fde9fb5fb38d648b60405162002c8b91815260200190565b60405180910390a450505062001dd460018055565b806001600160a01b03811662002cc9576040516342bcdf7f60e11b815260040160405180910390fd5b7f19bf281d118073c159a713666aba52e0d403520cd01e03f42e0f62a0b3bd4a3562002cf581620033b1565b61010a546000818152610108602090815260408083206001600160a01b038881168552925290912054166101111462002d66576040517f82f5d0a50000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240162000b67565b6000818152610108602090815260408083206001600160a01b038816808552925280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555190917f0145163d8d460d1ab21463758d147fdfe79d4b57c81ca3d1439996104ae6895991a250505050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16620014335760008281526097602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905562002e5a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600054610100900460ff1662002f1d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b62002f2762003f4f565b565b600054610100900460ff1662002fa85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b60005b83811015620030db5784848281811062002fc95762002fc962004d72565b9050604002016020013560d7600087878581811062002fec5762002fec62004d72565b6200300492602060409092020190810191506200485a565b600881111562003018576200301862004ce1565b60088111156200302c576200302c62004ce1565b815260208101919091526040016000205584848281811062003052576200305262004d72565b9050604002016020013585858381811062003071576200307162004d72565b6200308992602060409092020190810191506200485a565b60088111156200309d576200309d62004ce1565b6040517f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec609190600090a380620030d28162004dd0565b91505062002fab565b5060005b818110156200281857828282818110620030fd57620030fd62004d72565b9050604002016020013560d8600085858581811062003120576200312062004d72565b6200313892602060409092020190810191506200485a565b60088111156200314c576200314c62004ce1565b600881111562003160576200316062004ce1565b815260208101919091526040016000205582828281811062003186576200318662004d72565b90506040020160200135838383818110620031a557620031a562004d72565b620031bd92602060409092020190810191506200485a565b6008811115620031d157620031d162004ce1565b6040517fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c290600090a380620032068162004dd0565b915050620030df565b600054610100900460ff166200328e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b60005b81811015620013a2576000838383818110620032b157620032b162004d72565b620032c9926020604090920201908101915062004b3e565b6001600160a01b031603620032f1576040516342bcdf7f60e11b815260040160405180910390fd5b82828281811062003306576200330662004d72565b905060400201602001356000801b036200334c576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200339c83838381811062003365576200336562004d72565b9050604002016020013584848481811062003384576200338462004d72565b620022be926020604090920201908101915062004b3e565b80620033a88162004dd0565b91505062003291565b620033bd813362003fce565b50565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff1615620014335760008281526097602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600260015403620034b65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b67565b6002600155565b60d654816008811115620034d557620034d562004ce1565b6001901b8116156200351757816040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b6002811615620014335760016040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040162000b67919062004d10565b6040516001600160a01b0380851660248301528316604482015260648101829052620013739085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526200404c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b038616916200368291906200500a565b600060405180830381855afa9150503d8060008114620036bf576040519150601f19603f3d011682016040523d82523d6000602084013e620036c4565b606091505b5091509150816200370b576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062003716565b62003716816200413b565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b038616916200379591906200500a565b600060405180830381855afa9150503d8060008114620037d2576040519150601f19603f3d011682016040523d82523d6000602084013e620037d7565b606091505b5091509150816200370b576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062003716565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b038616916200389491906200500a565b600060405180830381855afa9150503d8060008114620038d1576040519150601f19603f3d011682016040523d82523d6000602084013e620038d6565b606091505b5091509150818015620038ea575060208151145b1562003906578080602001905181019062003716919062005038565b6040517fb5a2f1c60000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240162000b67565b60018055565b6001600160a01b03811662003972576040516342bcdf7f60e11b815260040160405180910390fd5b60ca80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040513391907fe68b208814fdb633b222cd15e73d5a27fb4ef9eef4cae78c623bc27702141d2890600090a350565b600054610100900460ff1662003a565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b6001600160a01b03811662003a7e576040516342bcdf7f60e11b815260040160405180910390fd5b60c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7fd505accf0000000000000000000000000000000000000000000000000000000062003ae960046000848662005058565b62003af49162005084565b7fffffffff00000000000000000000000000000000000000000000000000000000161462003bb55762003b2c60046000838562005058565b62003b379162005084565b6040517fcf9e29460000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000090911660048201527fd505accf00000000000000000000000000000000000000000000000000000000602482015260440162000b67565b600080808080808062003bcc886004818c62005058565b81019062003bdb9190620050cd565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462003c41576040517f200688cc0000000000000000000000000000000000000000000000000000000081526001600160a01b038816600482015260240162000b67565b6001600160a01b038616301462003c90576040517f291159480000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260240162000b67565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301528691908c169063dd62ed3e90604401602060405180830381865afa15801562003cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003d21919062004e8d565b101562003dc8576040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b038b169063d505accf9060e401600060405180830381600087803b15801562003dae57600080fd5b505af115801562003dc3573d6000803e3d6000fd5b505050505b50505050505050505050565b6040516001600160a01b038316602482015260448101829052620013a29084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401620035a6565b6000818152602085905260408120610107546040516001600160a01b039091169062003e4b90620046a2565b6001600160a01b0390911681526040602082018190526000908201526060018190604051809103906000f590508015801562003e8b573d6000803e3d6000fd5b5090506000808062003ea086880188620051cc565b925092509250836001600160a01b0316631624f6c68484846040518463ffffffff1660e01b815260040162003ed89392919062004ebd565b600060405180830381600087803b15801562003ef357600080fd5b505af115801562003f08573d6000803e3d6000fd5b50506040516001600160a01b03808c169350871691507fd5d4920bb61e6141c8499d50a7bd617dae2b1818c9d6b995d3f2ba4975e32ea490600090a3505050949350505050565b600054610100900460ff16620039445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000b67565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16620014335762004004816200430e565b6200401183602062004321565b6040516020016200402492919062005242565b60408051601f198184030181529082905262461bcd60e51b825262000b679160040162004993565b6000620040a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200456f9092919063ffffffff16565b9050805160001480620040c7575080806020019051810190620040c79190620052c7565b620013a25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000b67565b606060408251106200415d578180602001905181019062000d009190620052eb565b6020825114620041a057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60005b602081108015620041ee5750828181518110620041c457620041c462004d72565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620041fd57600101620041a3565b806000036200424157505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156200425f576200425f620049d5565b6040519080825280601f01601f1916602001820160405280156200428a576020820181803683370190505b50905060005b828110156200430657848181518110620042ae57620042ae62004d72565b602001015160f81c60f81b828281518110620042ce57620042ce62004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060010162004290565b509392505050565b606062000d006001600160a01b03831660145b606060006200433283600262005362565b6200433f9060026200537c565b67ffffffffffffffff8111156200435a576200435a620049d5565b6040519080825280601f01601f19166020018201604052801562004385576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110620043bf57620043bf62004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062004425576200442562004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006200446384600262005362565b620044709060016200537c565b90505b600181111562004517577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110620044b557620044b562004d72565b1a60f81b828281518110620044ce57620044ce62004d72565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936200450f8162005392565b905062004473565b508315620045685760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000b67565b9392505050565b606062003716848460008585600080866001600160a01b031685876040516200459991906200500a565b60006040518083038185875af1925050503d8060008114620045d8576040519150601f19603f3d011682016040523d82523d6000602084013e620045dd565b606091505b5091509150620045f087838387620045fb565b979650505050505050565b606083156200466f57825160000362004667576001600160a01b0385163b620046675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b67565b508162003716565b620037168383815115620046865781518083602001fd5b8060405162461bcd60e51b815260040162000b67919062004993565b6106f380620053cb83390190565b6001600160a01b0381168114620033bd57600080fd5b60008083601f840112620046d957600080fd5b50813567ffffffffffffffff811115620046f257600080fd5b6020830191508360208260061b85010111156200470e57600080fd5b9250929050565b60008060008060008060006080888a0312156200473157600080fd5b87356200473e81620046b0565b9650602088013567ffffffffffffffff808211156200475c57600080fd5b6200476a8b838c01620046c6565b909850965060408a01359150808211156200478457600080fd5b620047928b838c01620046c6565b909650945060608a0135915080821115620047ac57600080fd5b50620047bb8a828b01620046c6565b989b979a50959850939692959293505050565b600060208284031215620047e157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200456857600080fd5b600080604083850312156200482657600080fd5b8235915060208301356200483a81620046b0565b809150509250929050565b8035600981106200485557600080fd5b919050565b6000602082840312156200486d57600080fd5b620045688262004845565b600080604083850312156200488c57600080fd5b82356200489981620046b0565b915060208301356200483a81620046b0565b600060208284031215620048be57600080fd5b5035919050565b60008060208385031215620048d957600080fd5b823567ffffffffffffffff80821115620048f257600080fd5b818501915085601f8301126200490757600080fd5b8135818111156200491757600080fd5b8660208260051b85010111156200492d57600080fd5b60209290920196919550909350505050565b60005b838110156200495c57818101518382015260200162004942565b50506000910152565b600081518084526200497f8160208601602086016200493f565b601f01601f19169290920160200192915050565b60208152600062004568602083018462004965565b60008060408385031215620049bc57600080fd5b620049c78362004845565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562004a305762004a30620049d5565b604052919050565b6000602080838503121562004a4c57600080fd5b823567ffffffffffffffff8082111562004a6557600080fd5b818501915085601f83011262004a7a57600080fd5b81358181111562004a8f5762004a8f620049d5565b8060051b915062004aa284830162004a04565b818152918301840191848101908884111562004abd57600080fd5b938501935b8385101562004aeb578435925062004ada83620046b0565b828252938501939085019062004ac2565b98975050505050505050565b60008060006060848603121562004b0d57600080fd5b833562004b1a81620046b0565b925060208401359150604084013562004b3381620046b0565b809150509250925092565b60006020828403121562004b5157600080fd5b81356200456881620046b0565b60006020828403121562004b7157600080fd5b813567ffffffffffffffff81111562004b8957600080fd5b820161012081850312156200456857600080fd5b60008083601f84011262004bb057600080fd5b50813567ffffffffffffffff81111562004bc957600080fd5b6020830191508360208285010111156200470e57600080fd5b60008060008060006080868803121562004bfb57600080fd5b853562004c0881620046b0565b945060208601359350604086013562004c2181620046b0565b9250606086013567ffffffffffffffff81111562004c3e57600080fd5b62004c4c8882890162004b9d565b969995985093965092949392505050565b60008060008060008060a0878903121562004c7757600080fd5b863562004c8481620046b0565b955060208701359450604087013562004c9d81620046b0565b935060608701359250608087013567ffffffffffffffff81111562004cc157600080fd5b62004ccf89828a0162004b9d565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016009831062004d4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60006020828403121562004d6557600080fd5b81516200456881620046b0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362004e045762004e0462004da1565b5060010190565b6020808252825182820181905260009190848201906040850190845b8181101562004e4e5783516001600160a01b03168352928401929184019160010162004e27565b50909695505050505050565b6001600160a01b038416815282602082015260606040820152600062004e84606083018462004965565b95945050505050565b60006020828403121562004ea057600080fd5b5051919050565b8181038181111562000d005762000d0062004da1565b60608152600062004ed2606083018662004965565b828103602084015262004ee6818662004965565b91505060ff83166040830152949350505050565b60006001600160a01b03808816835286602084015280861660408401525083606083015260a06080830152620045f060a083018462004965565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811262004f6a57600080fd5b83018035915067ffffffffffffffff82111562004f8657600080fd5b6020019150600681901b36038213156200470e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811262004fd557600080fd5b83018035915067ffffffffffffffff82111562004ff157600080fd5b6020019150600581901b36038213156200470e57600080fd5b600082516200501e8184602087016200493f565b9190910192915050565b60ff81168114620033bd57600080fd5b6000602082840312156200504b57600080fd5b8151620045688162005028565b600080858511156200506957600080fd5b838611156200507757600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620050c55780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a031215620050e957600080fd5b8735620050f681620046b0565b965060208801356200510881620046b0565b955060408801359450606088013593506080880135620051288162005028565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff821115620051625762005162620049d5565b50601f01601f191660200190565b600082601f8301126200518257600080fd5b813562005199620051938262005145565b62004a04565b818152846020838601011115620051af57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215620051e257600080fd5b833567ffffffffffffffff80821115620051fb57600080fd5b620052098783880162005170565b945060208601359150808211156200522057600080fd5b506200522f8682870162005170565b925050604084013562004b338162005028565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516200527c8160178501602088016200493f565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351620052bb8160288401602088016200493f565b01602801949350505050565b600060208284031215620052da57600080fd5b815180151581146200456857600080fd5b600060208284031215620052fe57600080fd5b815167ffffffffffffffff8111156200531657600080fd5b8201601f810184136200532857600080fd5b805162005339620051938262005145565b8181528560208385010111156200534f57600080fd5b62004e848260208301602086016200493f565b808202811582820484141762000d005762000d0062004da1565b8082018082111562000d005762000d0062004da1565b600081620053a457620053a462004da1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fe60806040526040516106f33803806106f383398101604081905261002291610420565b61002e82826000610035565b505061054a565b61003e836100f6565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100f1576100ef836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e991906104e0565b8361027a565b505b505050565b6001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101d4816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906104e0565b6001600160a01b03163b151590565b6102395760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610157565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029f83836040518060600160405280602781526020016106cc602791396102a6565b9392505050565b6060600080856001600160a01b0316856040516102c391906104fb565b600060405180830381855af49150503d80600081146102fe576040519150601f19603f3d011682016040523d82523d6000602084013e610303565b606091505b5090925090506103158683838761031f565b9695505050505050565b6060831561038e578251600003610387576001600160a01b0385163b6103875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610157565b5081610398565b61039883836103a0565b949350505050565b8151156103b05781518083602001fd5b8060405162461bcd60e51b81526004016101579190610517565b80516001600160a01b03811681146103e157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156104175781810151838201526020016103ff565b50506000910152565b6000806040838503121561043357600080fd5b61043c836103ca565b60208401519092506001600160401b038082111561045957600080fd5b818501915085601f83011261046d57600080fd5b81518181111561047f5761047f6103e6565b604051601f8201601f19908116603f011681019083821181831017156104a7576104a76103e6565b816040528281528860208487010111156104c057600080fd5b6104d18360208301602088016103fc565b80955050505050509250929050565b6000602082840312156104f257600080fd5b61029f826103ca565b6000825161050d8184602087016103fc565b9190910192915050565b60208152600082518060208401526105368160408501602087016103fc565b601f01601f19169190910160400192915050565b610173806105596000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610029565b6100dc565b565b60006100697fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d79190610100565b905090565b3660008037600080366000845af43d6000803e8080156100fb573d6000f35b3d6000fd5b60006020828403121561011257600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461013657600080fd5b939250505056fea2646970667358221220662c40b76fc0d477a291a78deacd27f4cddd7512dea18087244e38acb2fd99dd64736f6c63430008130033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122017127dbd91dad7d7cea4f8ba3f5f77b3fca5fb0083bfdd6b2d059d4213c0e90a64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/bridge-ui/src/components/bridge/form/ApproveERC20.tsx b/bridge-ui/src/components/bridge/form/ApproveERC20.tsx index 170b15470..e8f19d55c 100644 --- a/bridge-ui/src/components/bridge/form/ApproveERC20.tsx +++ b/bridge-ui/src/components/bridge/form/ApproveERC20.tsx @@ -100,17 +100,8 @@ export default function Approve() { if (token) { const amount = getValues("amount"); const amountBigInt = parseUnits(amount, token.decimals); - let amountToApprove = amountBigInt; - if (allowance && allowance > 0n) { - if (allowance >= amountBigInt) { - amountToApprove = allowance - amountBigInt; - } else { - amountToApprove = amountBigInt - allowance; - } - } - - writeApprove(amountToApprove, tokenBridgeAddress); + writeApprove(amountBigInt, tokenBridgeAddress); } }; diff --git a/bridge-ui/src/hooks/usePostmanFee.ts b/bridge-ui/src/hooks/usePostmanFee.ts index 3eea0344b..90a9e5fee 100644 --- a/bridge-ui/src/hooks/usePostmanFee.ts +++ b/bridge-ui/src/hooks/usePostmanFee.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect } from "react"; import { useAccount, useBlockNumber, useEstimateFeesPerGas, useReadContract } from "wagmi"; -import { Address, concat, encodeFunctionData, keccak256, parseUnits, toHex, zeroAddress } from "viem"; +import { Address, encodeAbiParameters, encodeFunctionData, keccak256, parseUnits, zeroAddress } from "viem"; import { config, NetworkLayer, TokenType, wagmiConfig } from "@/config"; import { useChainStore } from "@/stores/chainStore"; import { getPublicClient } from "@wagmi/core"; @@ -22,6 +22,7 @@ const usePostmanFee = ({ currentLayer, claimingType }: UsePostmanFeeProps) => { const fromChain = useChainStore((state) => state.fromChain); const fromMessageServiceAddress = useChainStore((state) => state.messageServiceAddress); const tokenBridgeAddress = useChainStore((state) => state.tokenBridgeAddress); + const networkType = useChainStore((state) => state.networkType); const queryClient = useQueryClient(); @@ -61,11 +62,11 @@ const usePostmanFee = ({ currentLayer, claimingType }: UsePostmanFeeProps) => { return 0n; } - const publicClient = getPublicClient(wagmiConfig, { + const destinationChainPublicClient = getPublicClient(wagmiConfig, { chainId: toChain?.id, }); - if (!publicClient) { + if (!destinationChainPublicClient) { return 0n; } @@ -89,22 +90,43 @@ const usePostmanFee = ({ currentLayer, claimingType }: UsePostmanFeeProps) => { args: [toAddress, amountBigInt], }); + const messageHash = keccak256( + encodeAbiParameters( + [ + { name: "from", type: "address" }, + { name: "to", type: "address" }, + { name: "fee", type: "uint256" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "calldata", type: "bytes" }, + ], + [tokenBridgeAddress, toUSDCBridgeAddress, 0n, 0n, nextMessageNumber as bigint, encodedData], + ), + ); + const storageSlot = keccak256( - concat([ - address, - toUSDCBridgeAddress, - toHex(0n), - toHex(0n), - toHex(nextMessageNumber as bigint), - encodedData, - ]), + encodeAbiParameters( + [ + { name: "messagehash", type: "bytes32" }, + { name: "mappingSlot", type: "uint256" }, + ], + [messageHash, 176n], + ), ); - estimatedGasFee = await publicClient.estimateContractGas({ + estimatedGasFee = await destinationChainPublicClient.estimateContractGas({ abi: MessageService.abi, functionName: "claimMessage", address: toMessageServiceAddress, - args: [address, toUSDCBridgeAddress, 0n, 0n, zeroAddress, encodedData, nextMessageNumber as bigint], + args: [ + tokenBridgeAddress, + toUSDCBridgeAddress, + 0n, + 0n, + zeroAddress, + encodedData, + nextMessageNumber as bigint, + ], value: 0n, account: address, stateOverride: [ @@ -120,29 +142,82 @@ const usePostmanFee = ({ currentLayer, claimingType }: UsePostmanFeeProps) => { ], }); } else if (token.type === TokenType.ERC20) { - // TODO: fix encoded data + const originChainPublicClient = getPublicClient(wagmiConfig, { + chainId: fromChain?.id, + }); + + if (!originChainPublicClient) { + return 0n; + } + + const nativeToken = (await originChainPublicClient.readContract({ + account: address, + address: tokenBridgeAddress, + abi: TokenBridge.abi, + functionName: "bridgedToNativeToken", + args: [token[currentLayer]], + })) as Address; + + let tokenAddress = token[currentLayer]; + let chainId = fromChain?.id; + let tokenMetadata = encodeAbiParameters( + [ + { name: "tokenName", type: "string" }, + { name: "tokenSymbol", type: "string" }, + { name: "tokenDecimals", type: "uint8" }, + ], + [token.name, token.symbol, token.decimals], + ); + + if (nativeToken !== zeroAddress) { + tokenAddress = nativeToken; + chainId = toChain?.id; + tokenMetadata = "0x"; + } + const encodedData = encodeFunctionData({ abi: TokenBridge.abi, functionName: "completeBridging", - args: [toAddress, amountBigInt], + args: [tokenAddress, amountBigInt, toAddress, chainId, tokenMetadata], }); + const messageHash = keccak256( + encodeAbiParameters( + [ + { name: "from", type: "address" }, + { name: "to", type: "address" }, + { name: "fee", type: "uint256" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "calldata", type: "bytes" }, + ], + [tokenBridgeAddress, toTokenBridgeAddress, 0n, 0n, nextMessageNumber as bigint, encodedData], + ), + ); + const storageSlot = keccak256( - concat([ - address, - toTokenBridgeAddress, - toHex(0n), - toHex(0n), - toHex(nextMessageNumber as bigint), - encodedData, - ]), + encodeAbiParameters( + [ + { name: "messageHash", type: "bytes32" }, + { name: "mappingSlot", type: "uint256" }, + ], + [messageHash, 176n], + ), ); - estimatedGasFee = await publicClient.estimateContractGas({ + estimatedGasFee = await destinationChainPublicClient.estimateContractGas({ abi: MessageService.abi, functionName: "claimMessage", address: toMessageServiceAddress, - args: [address, toUSDCBridgeAddress, 0n, 0n, zeroAddress, encodedData, nextMessageNumber as bigint], + args: [ + tokenBridgeAddress, + toTokenBridgeAddress, + 0n, + 0n, + zeroAddress, + encodedData, + nextMessageNumber as bigint, + ], value: 0n, account: address, stateOverride: [ @@ -158,11 +233,31 @@ const usePostmanFee = ({ currentLayer, claimingType }: UsePostmanFeeProps) => { ], }); } else if (token.type === TokenType.ETH) { + const messageHash = keccak256( + encodeAbiParameters( + [ + { name: "from", type: "address" }, + { name: "to", type: "address" }, + { name: "fee", type: "uint256" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "calldata", type: "bytes" }, + ], + [address, toAddress, 0n, amountBigInt, nextMessageNumber as bigint, "0x"], + ), + ); + const storageSlot = keccak256( - concat([address, toAddress, toHex(0n), toHex(amountBigInt), toHex(nextMessageNumber as bigint), "0x"]), + encodeAbiParameters( + [ + { name: "messageHash", type: "bytes32" }, + { name: "mappingSlot", type: "uint256" }, + ], + [messageHash, 176n], + ), ); - estimatedGasFee = await publicClient.estimateContractGas({ + estimatedGasFee = await destinationChainPublicClient.estimateContractGas({ abi: MessageService.abi, functionName: "claimMessage", address: toMessageServiceAddress,