[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "uint256", "name": "dustLimit", "type": "uint256" } ], "name": "AmountBelowDustLimit", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "fee", "type": "uint256" } ], "name": "AmountLessThanCommission", "type": "error" }, { "inputs": [], "name": "ECDSAInvalidSignature", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "length", "type": "uint256" } ], "name": "ECDSAInvalidSignatureLength", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "ECDSAInvalidSignatureS", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "ERC2612ExpiredSignature", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "signer", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC2612InvalidSigner", "type": "error" }, { "inputs": [], "name": "EnforcedPause", "type": "error" }, { "inputs": [], "name": "ExpectedPause", "type": "error" }, { "inputs": [], "name": "FeeGreaterThanAmount", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "currentNonce", "type": "uint256" } ], "name": "InvalidAccountNonce", "type": "error" }, { "inputs": [], "name": "InvalidDustFeeRate", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "InvalidInputLength", "type": "error" }, { "inputs": [], "name": "InvalidUserSignature", "type": "error" }, { "inputs": [], "name": "KnownDestination", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnableInvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "OwnableUnauthorizedAccount", "type": "error" }, { "inputs": [], "name": "PayloadAlreadyUsed", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [], "name": "ScriptPubkeyUnsupported", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "UnauthorizedAccount", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "action", "type": "bytes4" } ], "name": "UnexpectedAction", "type": "error" }, { "inputs": [], "name": "UnknownDestination", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "fromChainId", "type": "uint256" }, { "internalType": "address", "name": "fromContract", "type": "address" } ], "name": "UnknownOriginContract", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "expiry", "type": "uint256" } ], "name": "UserSignatureExpired", "type": "error" }, { "inputs": [], "name": "WithdrawalsDisabled", "type": "error" }, { "inputs": [], "name": "WrongChainId", "type": "error" }, { "inputs": [], "name": "ZeroAddress", "type": "error" }, { "inputs": [], "name": "ZeroAddress", "type": "error" }, { "inputs": [], "name": "ZeroAmount", "type": "error" }, { "inputs": [], "name": "ZeroChainId", "type": "error" }, { "inputs": [], "name": "ZeroContractHash", "type": "error" }, { "inputs": [], "name": "ZeroFee", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "prevVal", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newVal", "type": "address" } ], "name": "BasculeChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "prevVal", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newVal", "type": "address" } ], "name": "BridgeChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint64", "name": "prevValue", "type": "uint64" }, { "indexed": true, "internalType": "uint64", "name": "newValue", "type": "uint64" } ], "name": "BurnCommissionChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "claimer", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isClaimer", "type": "bool" } ], "name": "ClaimerUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "prevVal", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newVal", "type": "address" } ], "name": "ConsortiumChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "oldRate", "type": "uint256" }, { "indexed": true, "internalType": "uint256", "name": "newRate", "type": "uint256" } ], "name": "DustFeeRateChanged", "type": "event" }, { "anonymous": false, "inputs": [], "name": "EIP712DomainChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "oldFee", "type": "uint256" }, { "indexed": true, "internalType": "uint256", "name": "newFee", "type": "uint256" } ], "name": "FeeChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "fee", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "userSignature", "type": "bytes" } ], "name": "FeeCharged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "bytes32", "name": "payloadHash", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "payload", "type": "bytes" } ], "name": "MintProofConsumed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "minter", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isMinter", "type": "bool" } ], "name": "MinterUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, { "indexed": false, "internalType": "string", "name": "symbol", "type": "string" } ], "name": "NameAndSymbolChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOperator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newPauser", "type": "address" } ], "name": "OperatorRoleTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferStarted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousPauser", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newPauser", "type": "address" } ], "name": "PauserRoleTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "prevValue", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newValue", "type": "address" } ], "name": "TreasuryAddressChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Unpaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "fromAddress", "type": "address" }, { "indexed": false, "internalType": "bytes", "name": "scriptPubKey", "type": "bytes" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "UnstakeRequest", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "", "type": "bool" } ], "name": "WithdrawalsEnabled", "type": "event" }, { "inputs": [], "name": "Bascule", "outputs": [ { "internalType": "contract IBascule", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newClaimer", "type": "address" } ], "name": "addClaimer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newMinter", "type": "address" } ], "name": "addMinter", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "to", "type": "address[]" }, { "internalType": "uint256[]", "name": "amount", "type": "uint256[]" } ], "name": "batchMint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "payload", "type": "bytes[]" }, { "internalType": "bytes[]", "name": "proof", "type": "bytes[]" } ], "name": "batchMint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "mintPayload", "type": "bytes[]" }, { "internalType": "bytes[]", "name": "proof", "type": "bytes[]" }, { "internalType": "bytes[]", "name": "feePayload", "type": "bytes[]" }, { "internalType": "bytes[]", "name": "userSignature", "type": "bytes[]" } ], "name": "batchMintWithFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "scriptPubkey", "type": "bytes" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "calcUnstakeRequestAmount", "outputs": [ { "internalType": "uint256", "name": "amountAfterFee", "type": "uint256" }, { "internalType": "bool", "name": "isAboveDust", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newVal", "type": "address" } ], "name": "changeBascule", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint64", "name": "newValue", "type": "uint64" } ], "name": "changeBurnCommission", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newVal", "type": "address" } ], "name": "changeConsortium", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newRate", "type": "uint256" } ], "name": "changeDustFeeRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" } ], "name": "changeNameAndSymbol", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newValue", "type": "address" } ], "name": "changeTreasuryAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "consortium", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "eip712Domain", "outputs": [ { "internalType": "bytes1", "name": "fields", "type": "bytes1" }, { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "string", "name": "version", "type": "string" }, { "internalType": "uint256", "name": "chainId", "type": "uint256" }, { "internalType": "address", "name": "verifyingContract", "type": "address" }, { "internalType": "bytes32", "name": "salt", "type": "bytes32" }, { "internalType": "uint256[]", "name": "extensions", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getBurnCommission", "outputs": [ { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getDustFeeRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getMintFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTreasury", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "consortium_", "type": "address" }, { "internalType": "uint64", "name": "burnCommission_", "type": "uint64" }, { "internalType": "address", "name": "owner_", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "claimer", "type": "address" } ], "name": "isClaimer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "minter", "type": "address" } ], "name": "isMinter", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "payload", "type": "bytes" }, { "internalType": "bytes", "name": "proof", "type": "bytes" } ], "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "mintPayload", "type": "bytes" }, { "internalType": "bytes", "name": "proof", "type": "bytes" }, { "internalType": "bytes", "name": "feePayload", "type": "bytes" }, { "internalType": "bytes", "name": "userSignature", "type": "bytes" } ], "name": "mintWithFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "operator", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "paused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pauser", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pendingOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "scriptPubkey", "type": "bytes" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "redeem", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "reinitialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "oldClaimer", "type": "address" } ], "name": "removeClaimer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "oldMinter", "type": "address" } ], "name": "removeMinter", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "fee", "type": "uint256" } ], "name": "setMintFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "toggleWithdrawals", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOperator", "type": "address" } ], "name": "transferOperatorRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newPauser", "type": "address" } ], "name": "transferPauserRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613e1f80620000e66000396000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80637a5caab3116101de578063a6f353f01161010f578063d6a02b6a116100ad578063eddd0d9c1161007c578063eddd0d9c14610731578063f0490b8a14610744578063f216acfb14610757578063f2fde38b1461077757600080fd5b8063d6a02b6a146106fb578063dd62ed3e14610703578063e30c397814610716578063e3248f9a1461071e57600080fd5b8063bad383a6116100e9578063bad383a6146106ba578063bcbe03df146106cd578063d239f003146106e0578063d505accf146106e857600080fd5b8063a6f353f014610681578063a9059cbb14610694578063aa271e1a146106a757600080fd5b806395d89b411161017c5780639b914470116101565780639b914470146106405780639dc29fac146106535780639fd0506d14610666578063a3622bf01461066e57600080fd5b806395d89b411461061d578063983b2d56146106255780639ad187651461063857600080fd5b806380e787df116101b857806380e787df146105ca5780638456cb59146105f257806384b0196e146105fa5780638da5cb5b1461061557600080fd5b80637a5caab31461059c5780637ecebe00146105a45780637f56945e146105b757600080fd5b80633b19e84a116102b85780635c975abb116102565780636c2eb350116102305780636c2eb3501461057157806370a0823114610579578063715018a61461058c57806379ba50971461059457600080fd5b80635c975abb14610533578063685731071461054b5780636bc638931461055e57600080fd5b806342966c681161029257806342966c68146104f25780635671213914610505578063570ca7351461051857806359aae4ba1461052057600080fd5b80633b19e84a146104b75780633f4ba83a146104d757806340c10f19146104df57600080fd5b80631721c6bc116103255780632ea66401116102ff5780632ea664011461047a5780633092afd51461048d578063313ce567146104a05780633644e515146104af57600080fd5b80631721c6bc1461042a57806318160ddd1461044057806323b872dd1461046757600080fd5b8063089bb99a11610361578063089bb99a146103ce578063095ea7b3146103e15780630d1213371461040457806310a8aecd1461041757600080fd5b806301d4038714610388578063066894951461039d57806306fdde03146103b0575b600080fd5b61039b61039636600461333a565b61078a565b005b61039b6103ab36600461339b565b6107fd565b6103b8610820565b6040516103c591906134a4565b60405180910390f35b61039b6103dc3660046134b7565b6108bb565b6103f46103ef366004613537565b61093c565b60405190151581526020016103c5565b61039b610412366004613563565b610956565b6103f4610425366004613563565b610991565b6104326109c0565b6040519081526020016103c5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610432565b6103f4610475366004613580565b6109d3565b61039b610488366004613563565b6109f9565b61039b61049b366004613563565b610a0c565b604051600881526020016103c5565b610432610a1f565b6104bf610a2e565b6040516001600160a01b0390911681526020016103c5565b61039b610a4a565b61039b6104ed366004613537565b610a5c565b61039b61050036600461333a565b610a73565b61039b610513366004613563565b610a7d565b6104bf610a8e565b61039b61052e366004613605565b610aaa565b600080516020613daa8339815191525460ff166103f4565b61039b6105593660046136b4565b610ba3565b61039b61056c3660046134b7565b610c2e565b61039b610d0b565b610432610587366004613563565b610e14565b61039b610e47565b61039b610e59565b610432610e9e565b6104326105b2366004613563565b610eb1565b61039b6105c5366004613563565b610ebc565b6105dd6105d8366004613713565b610ecd565b604080519283529015156020830152016103c5565b61039b610f7a565b610602610f8a565b6040516103c5979695949392919061375e565b6104bf611036565b6103b861106b565b61039b610633366004613563565b611083565b6104bf611096565b61039b61064e3660046136b4565b6110b7565b61039b610661366004613537565b611135565b6104bf611148565b61039b61067c366004613713565b611164565b61039b61068f366004613563565b6112d4565b6103f46106a2366004613537565b611363565b6103f46106b5366004613563565b611371565b61039b6106c8366004613563565b6113a0565b61039b6106db366004613813565b6113d8565b61039b6115db565b61039b6106f636600461385c565b611641565b6104bf61178e565b6104326107113660046138d3565b6117aa565b6104bf6117f4565b61039b61072c36600461390c565b61181d565b61039b61073f36600461333a565b61182e565b61039b610752366004613563565b6118ba565b61075f6118cd565b6040516001600160401b0390911681526020016103c5565b61039b610785366004613563565b6118e9565b61079261196e565b806000036107b35760405163a3a6ed8760e01b815260040160405180910390fd5b60006107bd6119a0565b600e810180549084905560405191925090839082907f78739e78c1e8bc1416322baf73f3397a683d656e9425f621050e243dc73ea03d90600090a3505050565b610806336119c4565b6108168888888888888888611a14565b5050505050505050565b606061082a6119a0565b600101805461083890613927565b80601f016020809104026020016040519081016040528092919081815260200182805461086490613927565b80156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905090565b6108c361196e565b61093684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f88018190048102820181019092528681529250869150859081908401838280828437600092019190915250611c8292505050565b50505050565b60003361094a818585611cea565b60019150505b92915050565b61095e61196e565b6001600160a01b0381166109855760405163d92e233d60e01b815260040160405180910390fd5b61098e81611cfc565b50565b600061099b6119a0565b6001600160a01b03909216600090815260129290920160205250604090205460ff1690565b60006109ca6119a0565b600e0154905090565b6000336109e1858285611d5c565b6109ec858585611dbc565b60019150505b9392505050565b610a0161196e565b61098e816001611e1b565b610a1461196e565b61098e816000611eb9565b6000610a29611f4b565b905090565b6000610a386119a0565b600501546001600160a01b0316919050565b610a52611f55565b610a5a611f72565b565b610a6533611fcc565b610a6f828261201c565b5050565b61098e3382612052565b610a8561196e565b61098e81612088565b6000610a986119a0565b601501546001600160a01b0316919050565b610ab3336119c4565b868581141580610ac35750808414155b80610ace5750808214155b15610aec57604051637db491eb60e01b815260040160405180910390fd5b60005b88811015610b9757610b8f8a8a83818110610b0c57610b0c613961565b9050602002810190610b1e9190613977565b8a8a85818110610b3057610b30613961565b9050602002810190610b429190613977565b8a8a87818110610b5457610b54613961565b9050602002810190610b669190613977565b8a8a89818110610b7857610b78613961565b9050602002810190610b8a9190613977565b611a14565b600101610aef565b50505050505050505050565b610bac33611fcc565b828114610bcc57604051637db491eb60e01b815260040160405180910390fd5b60005b83811015610c2757610c1f858583818110610bec57610bec613961565b9050602002016020810190610c019190613563565b848484818110610c1357610c13613961565b9050602002013561201c565b600101610bcf565b5050505050565b610c36612100565b633cb9cfdf60e21b610c4884866139bd565b6001600160e01b03191614610c8c57610c6183856139bd565b60405163f3c2729f60e01b81526001600160e01b031990911660048201526024015b60405180910390fd5b6000610cd8610c9e85600481896139ed565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213892505050565b60208101516040820151919250610cf391808888888861222a565b506109366001600080516020613dca83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d54575080546001600160401b03808416911610155b15610d725760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556040805180820190915260168152752637b6b130b9321029ba30b5b2b2102134ba31b7b4b760511b6020820152610dc9906123fe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050565b600080600080516020613d6a8339815191525b6001600160a01b0390931660009081526020939093525050604090205490565b610e4f61196e565b610a5a6000612429565b3380610e636117f4565b6001600160a01b031614610e955760405163118cdaa760e01b81526001600160a01b0382166004820152602401610c83565b61098e81612429565b6000610ea86119a0565b60130154905090565b600061095082612461565b610ec461196e565b61098e8161248a565b6000806000610edc86866124f7565b90506000816003811115610ef257610ef2613a17565b03610f1057604051632695fabb60e01b815260040160405180910390fd5b6000610f1a6119a0565b600d8101549091506001600160401b0316808611610f415760008094509450505050610f72565b610f546001600160401b03821687613a43565b94506000610f68848a8a86600e0154612665565b8610159450505050505b935093915050565b610f82611f55565b610a5a612708565b60006060808280808381600080516020613d8a8339815191528054909150158015610fb757506001810154155b610ffb5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610c83565b611003612751565b61100b612814565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b60606110756119a0565b600201805461083890613927565b61108b61196e565b61098e816001611eb9565b60006110a06119a0565b6003015461010090046001600160a01b0316919050565b8281146110d757604051637db491eb60e01b815260040160405180910390fd5b60005b83811015610c275761112d8585838181106110f7576110f7613961565b90506020028101906111099190613977565b85858581811061111b5761111b613961565b905060200281019061056c9190613977565b6001016110da565b61113e33611fcc565b610a6f8282612052565b60006111526119a0565b601001546001600160a01b0316919050565b600061117084846124f7565b9050600081600381111561118657611186613a17565b036111a457604051632695fabb60e01b815260040160405180910390fd5b60006111ae6119a0565b600381015490915060ff166111d6576040516346ee9e3560e01b815260040160405180910390fd5b600d8101546001600160401b031680841161120f57604051630a01b54160e11b81526001600160401b0382166004820152602401610c83565b60006112246001600160401b03831686613a43565b9050600061123885898987600e0154612665565b90508082101561125e576040516335558cfd60e21b815260048101829052602401610c83565b3361127a8161126b610a2e565b866001600160401b0316611dbc565b6112848184612052565b806001600160a01b03167f48396c786750ed570cc1b02085ad1b3c1ffb59fd39686c23a263c1e0d974af1b8a8a866040516112c193929190613a95565b60405180910390a2505050505050505050565b6112dc61196e565b6001600160a01b0381166113035760405163d92e233d60e01b815260040160405180910390fd5b600061130d6119a0565b6005810180546001600160a01b038581166001600160a01b031983168117909355604051939450169182907f4fc6e7a37aea21888550b60360992adb6a9b3b4da644d63e9f3a420c2d86e28290600090a3505050565b60003361094a818585611dbc565b600061137b6119a0565b6001600160a01b03909216600090815260119290920160205250604090205460ff1690565b6113a861196e565b6001600160a01b0381166113cf5760405163d92e233d60e01b815260040160405180910390fd5b61098e81612853565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561141d5750825b90506000826001600160401b031660011480156114395750303b155b905081158015611447575080155b156114655760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561148f57845460ff60401b1916600160401b1785555b6114d1604051806040016040528060048152602001634c42544360e01b815250604051806040016040528060048152602001634c42544360e01b8152506128b3565b6114d96128c5565b6114e2866128d5565b6114ea6128e6565b6114f26128ee565b611548604051806040016040528060168152602001752637b6b130b9321029ba30b5b2b2102134ba31b7b4b760511b815250604051806040016040528060048152602001634c42544360e01b8152508a8a6128fe565b60006115526119a0565b610bb8600e8201819055604051919250906000907f78739e78c1e8bc1416322baf73f3397a683d656e9425f621050e243dc73ea03d908290a350831561081657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050565b6115e361196e565b60006115ed6119a0565b60038101805460ff8082161560ff1990921682179092556040519116151581529091507f45e7e6146471a396eb58b618e88efd46f5c95bd1815b282ed75c5220a559ab10906020015b60405180910390a150565b834211156116655760405163313c898160e11b815260048101859052602401610c83565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886116d18c6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061172c82612922565b9050600061173c8287878761294f565b9050896001600160a01b0316816001600160a01b031614611783576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610c83565b610b978a8a8a611cea565b60006117986119a0565b600f01546001600160a01b0316919050565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0061105b565b61182561196e565b61098e8161297d565b336118376119a0565b601501546001600160a01b03161461187057335b6040516332b2baa360e01b81526001600160a01b039091166004820152602401610c83565b600061187a6119a0565b6013810180549084905560405191925090839082907f5fc463da23c1b063e66f9e352006a7fbe8db7223c455dc429e881a2dfe2f94f190600090a3505050565b6118c261196e565b61098e816000611e1b565b60006118d76119a0565b600d01546001600160401b0316919050565b6118f161196e565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255611935611036565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b33611977611036565b6001600160a01b031614610a5a5760405163118cdaa760e01b8152336004820152602401610c83565b7fa9a2395ec4edf6682d754acb293b04902817fdb5829dd13adb0367ab3a26c70090565b6119cc6119a0565b6001600160a01b0382166000908152601291909101602052604090205460ff1661098e576040516332b2baa360e01b81526001600160a01b0382166004820152602401610c83565b611a1c612100565b633cb9cfdf60e21b611a2e888a6139bd565b6001600160e01b03191614611a4757610c6187896139bd565b6000611a59610c9e896004818d6139ed565b905063205d72a560e21b611a6d85876139bd565b6001600160e01b03191614611a8657610c6184866139bd565b6000611ad2611a98866004818a6139ed565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129de92505050565b90506000611ade6119a0565b6013810154835191925090811115611af4575081515b83604001518110611b1857604051632405ab8160e11b815260040160405180910390fd5b8251602080850151604051600093611b8a93611b6f937f40ac9f6aa27075e64c1ed1ea2e831b20b8c25efdeb6b79fd0cf683c9a9c50725934693920193845260208401929092526040830152606082015260800190565b60405160208183030381529060405280519060200120612922565b9050611bd185602001518289898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a6a92505050565b611bee576040516338fed95f60e21b815260040160405180910390fd5b50611c158460200151828660400151611c079190613a43565b86604001518f8f8f8f61222a565b6005820154611c2d906001600160a01b03168261201c565b807fcd0d4a9ad4b364951764307d0ae7b0d2ea482965b258e2e2452ef396c53b20f08787604051611c5f929190613ab9565b60405180910390a2505050506108166001600080516020613dca83398151915255565b6000611c8c6119a0565b905060018101611c9c8482613b25565b5060028101611cab8382613b25565b507f4d807d72b2a493ff2c4e338967d3f82d3352481258457d12a4506a1762a44c698383604051611cdd929190613be4565b60405180910390a1505050565b611cf78383836001612b3d565b505050565b6000611d066119a0565b6015810180546001600160a01b038581166001600160a01b031983168117909355604051939450169182907fd90d696290df8da2e089fb9f5467201dc45d6fa26d4d8e7c8a239b745f510c6c90600090a3505050565b6000611d6884846117aa565b905060001981146109365781811015611dad57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610c83565b61093684848484036000612b3d565b6001600160a01b038316611de657604051634b637e8f60e11b815260006004820152602401610c83565b6001600160a01b038216611e105760405163ec442f0560e01b815260006004820152602401610c83565b611cf7838383612c24565b6001600160a01b038216611e425760405163d92e233d60e01b815260040160405180910390fd5b80611e4b6119a0565b6001600160a01b0384166000818152601292909201602052604091829020805493151560ff1990941693909317909255517f0d4de5cd7f05b154b7f42e4f1dd68f5c27ea0edaf9bd084309201cfa52e8592690611ead90841515815260200190565b60405180910390a25050565b6001600160a01b038216611ee05760405163d92e233d60e01b815260040160405180910390fd5b80611ee96119a0565b6001600160a01b0384166000818152601192909201602052604091829020805493151560ff1990941693909317909255517fb21afb9ce9be0a676f8f317ff0ca072fb89a4f8ce2d1b6fe80f8755c14f1cb1990611ead90841515815260200190565b6000610a29612c2f565b33611f5e611148565b6001600160a01b031614610a5a573361184b565b611f7a612ca3565b600080516020613daa833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001611636565b611fd46119a0565b6001600160a01b0382166000908152601191909101602052604090205460ff1661098e576040516332b2baa360e01b81526001600160a01b0382166004820152602401610c83565b6001600160a01b0382166120465760405163ec442f0560e01b815260006004820152602401610c83565b610a6f60008383612c24565b6001600160a01b03821661207c57604051634b637e8f60e11b815260006004820152602401610c83565b610a6f82600083612c24565b60006120926119a0565b60038101546040519192506001600160a01b038085169261010090920416907f146dd8feba84cdc776f012478adc764591d6c0c9570adbc49ff09c648282a0a090600090a360030180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080516020613dca83398151915280546001190161213257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915260008060008060008680602001905181019061217f9190613c12565b945094509450945094504685146121a8576040516217e1ef60ea1b815260040160405180910390fd5b6001600160a01b0384166121cf5760405163d92e233d60e01b815260040160405180910390fd5b826000036121f057604051631f2a200560e01b815260040160405180910390fd5b6040805160a0810182529586526001600160a01b03909416602086015292840191909152606083015263ffffffff16608082015292915050565b60006122346119a0565b905060006002868660405161224a929190613c73565b602060405180830381855afa158015612267573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061228a9190613c83565b600081815260148401602052604090205490915060ff16806122e357508160006122b7876004818b6139ed565b6040516122c5929190613c73565b604080519182900390912082526020820192909252016000205460ff165b1561230157604051637c4b379b60e01b815260040160405180910390fd5b6003820154604051631f68c5f560e11b81526101009091046001600160a01b031690633ed18bea9061233b90849088908890600401613c9c565b60006040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b50505060008281526014840160205260409020805460ff1916600117905550612391828289612cd3565b61239b898961201c565b80896001600160a01b03167f91f5c148b0f5ac9ddafe7030867f0d968adec49652c7ea760cf51fa233424b1488886040516123d7929190613ab9565b60405180910390a3505050505050505050565b6001600080516020613dca83398151915255565b612406612d44565b61098e81604051806040016040528060018152602001603160f81b815250612d8d565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319168155610a6f82612dee565b6000807f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00610e27565b60006124946119a0565b600f8101546040519192506001600160a01b03808516929116907fa0317ebf02283589c190260fcd549e3a6de71bef31204aeb5417c07fb65c089490600090a3600f0180546001600160a01b0319166001600160a01b0392909216919091179055565b600060168214801561252c575060008383828161251657612516613961565b9050013560f81c60f81b6001600160f81b031916145b80156125615750600560fa1b8383600181811061254b5761254b613961565b9050013560f81c60f81b6001600160f81b031916145b1561256e57506002610950565b6022821480156125a55750605160f81b838360008161258f5761258f613961565b9050013560f81c60f81b6001600160f81b031916145b80156125da5750600160fd1b838360018181106125c4576125c4613961565b9050013560f81c60f81b6001600160f81b031916145b156125e757506001610950565b60228214801561261a575060008383828161260457612604613961565b9050013560f81c60f81b6001600160f81b031916145b801561264f5750600160fd1b8383600181811061263957612639613961565b9050013560f81c60f81b6001600160f81b031916145b1561265c57506003610950565b50600092915050565b60006031600186600381111561267d5761267d613a17565b148061269a5750600286600381111561269857612698613a17565b145b806126b6575060038660038111156126b4576126b4613a17565b145b156126cd576126c6601a82613cb6565b90506126db565b6126d8606b82613cb6565b90505b6126e58482613cb6565b90506103e86126f48483613cc9565b6126fe9190613ce0565b9695505050505050565b612710612e5f565b600080516020613daa833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611fb4565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028054606091600080516020613d8a8339815191529161279090613927565b80601f01602080910402602001604051908101604052809291908181526020018280546127bc90613927565b80156128095780601f106127de57610100808354040283529160200191612809565b820191906000526020600020905b8154815290600101906020018083116127ec57829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1038054606091600080516020613d8a8339815191529161279090613927565b600061285d6119a0565b6010810180546001600160a01b038581166001600160a01b031983168117909355604051939450169182907ffb34c91b8734ef26ee8085a0fa11d2692042c6edac57dc40d8850cad2f1bc3ef90600090a3505050565b6128bb612d44565b610a6f8282612e90565b6128cd612d44565b610a5a612ee1565b6128dd612d44565b61098e81612f02565b610a5a612d44565b6128f6612d44565b610a5a612f34565b612906612d44565b6129108484611c82565b61291982612088565b6109368161297d565b600061095061292f611f4b565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060008061296188888888612f3c565b925092509250612971828261300b565b50909695505050505050565b60006129876119a0565b600d810180546001600160401b0385811667ffffffffffffffff1983168117909355604051939450169182907f2e7c1540076270015f38f524150bcb5d6ba9db14aca34c2e6d32e6ffad37941a90600090a3505050565b604080518082019091526000808252602082015260008083806020019051810190612a099190613d02565b9150915080421115612a315760405163954aba7160e01b815260048101829052602401610c83565b81600003612a525760405163af13986d60e01b815260040160405180910390fd5b60408051808201909152918252602082015292915050565b60006001600160a01b0384163b15612b0957604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e90612aac9087908790600401613d26565b602060405180830381865afa158015612ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aed9190613d3f565b6001600160e01b03191614612b04575060006109f2565b612b33565b836001600160a01b0316612b1d84846130c4565b6001600160a01b031614612b33575060006109f2565b5060019392505050565b600080516020613d6a8339815191526001600160a01b038516612b765760405163e602df0560e01b815260006004820152602401610c83565b6001600160a01b038416612ba057604051634a1406b160e11b815260006004820152602401610c83565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115610c2757836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612c1591815260200190565b60405180910390a35050505050565b611cf78383836130ee565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612c5a613101565b612c6261316b565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600080516020613daa8339815191525460ff16610a5a57604051638dfc202b60e01b815260040160405180910390fd5b600f8301546001600160a01b0316801561093657604051632f0d338d60e11b815260048101849052602481018390526001600160a01b03821690635e1a671a90604401600060405180830381600087803b158015612d3057600080fd5b505af1158015610816573d6000803e3d6000fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a5a57604051631afcd79f60e31b815260040160405180910390fd5b612d95612d44565b600080516020613d8a8339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102612dcf8482613b25565b5060038101612dde8382613b25565b5060008082556001909101555050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b600080516020613daa8339815191525460ff1615610a5a5760405163d93c066560e01b815260040160405180910390fd5b612e98612d44565b600080516020613d6a8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612ed28482613b25565b50600481016109368382613b25565b612ee9612d44565b600080516020613daa833981519152805460ff19169055565b612f0a612d44565b6001600160a01b038116610e9557604051631e4fbdf760e01b815260006004820152602401610c83565b6123ea612d44565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612f775750600091506003905082613001565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612fcb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ff757506000925060019150829050613001565b9250600091508190505b9450945094915050565b600082600381111561301f5761301f613a17565b03613028575050565b600182600381111561303c5761303c613a17565b0361305a5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561306e5761306e613a17565b0361308f5760405163fce698f760e01b815260048101829052602401610c83565b60038260038111156130a3576130a3613a17565b03610a6f576040516335e2f38360e21b815260048101829052602401610c83565b6000806000806130d486866131af565b9250925092506130e4828261300b565b5090949350505050565b6130f6612e5f565b611cf78383836131fc565b6000600080516020613d8a8339815191528161311b612751565b80519091501561313357805160209091012092915050565b81548015613142579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b6000600080516020613d8a83398151915281613185612814565b80519091501561319d57805160209091012092915050565b60018201548015613142579392505050565b600080600083516041036131e95760208401516040850151606086015160001a6131db88828585612f3c565b9550955095505050506131f5565b50508151600091506002905b9250925092565b600080516020613d6a8339815191526001600160a01b038416613238578181600201600082825461322d9190613cb6565b909155506132aa9050565b6001600160a01b0384166000908152602082905260409020548281101561328b5760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610c83565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b0383166132c85760028101805483900390556132e7565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161332c91815260200190565b60405180910390a350505050565b60006020828403121561334c57600080fd5b5035919050565b60008083601f84011261336557600080fd5b5081356001600160401b0381111561337c57600080fd5b60208301915083602082850101111561339457600080fd5b9250929050565b6000806000806000806000806080898b0312156133b757600080fd5b88356001600160401b03808211156133ce57600080fd5b6133da8c838d01613353565b909a50985060208b01359150808211156133f357600080fd5b6133ff8c838d01613353565b909850965060408b013591508082111561341857600080fd5b6134248c838d01613353565b909650945060608b013591508082111561343d57600080fd5b5061344a8b828c01613353565b999c989b5096995094979396929594505050565b6000815180845260005b8181101561348457602081850181015186830182015201613468565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006109f2602083018461345e565b600080600080604085870312156134cd57600080fd5b84356001600160401b03808211156134e457600080fd5b6134f088838901613353565b9096509450602087013591508082111561350957600080fd5b5061351687828801613353565b95989497509550505050565b6001600160a01b038116811461098e57600080fd5b6000806040838503121561354a57600080fd5b823561355581613522565b946020939093013593505050565b60006020828403121561357557600080fd5b81356109f281613522565b60008060006060848603121561359557600080fd5b83356135a081613522565b925060208401356135b081613522565b929592945050506040919091013590565b60008083601f8401126135d357600080fd5b5081356001600160401b038111156135ea57600080fd5b6020830191508360208260051b850101111561339457600080fd5b6000806000806000806000806080898b03121561362157600080fd5b88356001600160401b038082111561363857600080fd5b6136448c838d016135c1565b909a50985060208b013591508082111561365d57600080fd5b6136698c838d016135c1565b909850965060408b013591508082111561368257600080fd5b61368e8c838d016135c1565b909650945060608b01359150808211156136a757600080fd5b5061344a8b828c016135c1565b600080600080604085870312156136ca57600080fd5b84356001600160401b03808211156136e157600080fd5b6136ed888389016135c1565b9096509450602087013591508082111561370657600080fd5b50613516878288016135c1565b60008060006040848603121561372857600080fd5b83356001600160401b0381111561373e57600080fd5b61374a86828701613353565b909790965060209590950135949350505050565b60ff60f81b881681526000602060e0602084015261377f60e084018a61345e565b8381036040850152613791818a61345e565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156137e5578351835292840192918401916001016137c9565b50909c9b505050505050505050505050565b80356001600160401b038116811461380e57600080fd5b919050565b60008060006060848603121561382857600080fd5b833561383381613522565b9250613841602085016137f7565b9150604084013561385181613522565b809150509250925092565b600080600080600080600060e0888a03121561387757600080fd5b873561388281613522565b9650602088013561389281613522565b95506040880135945060608801359350608088013560ff811681146138b657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156138e657600080fd5b82356138f181613522565b9150602083013561390181613522565b809150509250929050565b60006020828403121561391e57600080fd5b6109f2826137f7565b600181811c9082168061393b57607f821691505b60208210810361395b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261398e57600080fd5b8301803591506001600160401b038211156139a857600080fd5b60200191503681900382131561339457600080fd5b6001600160e01b031981358181169160048510156139e55780818660040360031b1b83161692505b505092915050565b600080858511156139fd57600080fd5b83861115613a0a57600080fd5b5050820193919092039150565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561095057610950613a2d565b634e487b7160e01b600052604160045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000613aa9604083018587613a6c565b9050826020830152949350505050565b602081526000613acd602083018486613a6c565b949350505050565b601f821115611cf7576000816000526020600020601f850160051c81016020861015613afe5750805b601f850160051c820191505b81811015613b1d57828155600101613b0a565b505050505050565b81516001600160401b03811115613b3e57613b3e613a56565b613b5281613b4c8454613927565b84613ad5565b602080601f831160018114613b875760008415613b6f5750858301515b600019600386901b1c1916600185901b178555613b1d565b600085815260208120601f198616915b82811015613bb657888601518255948401946001909101908401613b97565b5085821015613bd45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613bf7604083018561345e565b8281036020840152613c09818561345e565b95945050505050565b600080600080600060a08688031215613c2a57600080fd5b855194506020860151613c3c81613522565b809450506040860151925060608601519150608086015163ffffffff81168114613c6557600080fd5b809150509295509295909350565b8183823760009101908152919050565b600060208284031215613c9557600080fd5b5051919050565b838152604060208201526000613c09604083018486613a6c565b8082018082111561095057610950613a2d565b808202811582820484141761095057610950613a2d565b600082613cfd57634e487b7160e01b600052601260045260246000fd5b500490565b60008060408385031215613d1557600080fd5b505080516020909101519092909150565b828152604060208201526000613acd604083018461345e565b600060208284031215613d5157600080fd5b81516001600160e01b0319811681146109f257600080fdfe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220d620ff850148c610275610d480cafce73526de90c664ae4ca1b283631845e65664736f6c63430008180033