0 txs
1.79m calls
constructor
constructor()
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
auctionLength
viewfunction auctionLength() view returns (uint256)
auctions
viewfunction auctions(uint256 id) view returns (uint256 rebalanceNonce, uint256 startTime, uint256 endTime)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
daoFeeRegistry
viewfunction daoFeeRegistry() view returns (address)
daoPendingFeeShares
viewfunction daoPendingFeeShares() view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
feeRecipients
viewfunction feeRecipients(uint256) view returns (address recipient, uint96 portion)
feeRecipientsPendingFeeShares
viewfunction feeRecipientsPendingFeeShares() view returns (uint256)
getAuctionPrice
viewfunction getAuctionPrice(uint256 auctionId, address token) view returns (tuple range)
getBid
viewfunction getBid(uint256 auctionId, address sellToken, address buyToken, uint256 maxSellAmount) view returns (uint256 sellAmount, uint256 bidAmount, uint256 price)
getPendingFeeShares
viewfunction getPendingFeeShares() view returns (uint256)
getRebalance
viewfunction getRebalance() view returns (uint256 nonce, address[] tokens, tuple[] weights, tuple[] initialPrices, bool[] inRebalance, tuple limits, uint256 startedAt, uint256 restrictedUntil, uint256 availableUntil, uint8 priceControl)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getRoleMember
viewfunction getRoleMember(bytes32 role, uint256 index) view returns (address)
getRoleMemberCount
viewfunction getRoleMemberCount(bytes32 role) view returns (uint256)
getRoleMembers
viewfunction getRoleMembers(bytes32 role) view returns (address[])
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isDeprecated
viewfunction isDeprecated() view returns (bool)
lastPoke
viewfunction lastPoke() view returns (uint256)
mandate
viewfunction mandate() view returns (string)
mintFee
viewfunction mintFee() view returns (uint256)
name
viewfunction name() view returns (string)
nextAuctionId
viewfunction nextAuctionId() view returns (uint256)
rebalanceControl
viewfunction rebalanceControl() view returns (bool weightControl, uint8 priceControl)
stateChangeActive
viewfunction stateChangeActive() view returns (bool syncStateChangeActive, bool asyncStateChangeActive)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
toAssets
viewfunction toAssets(uint256 shares, uint8 rounding) view returns (address[] _assets, uint256[] _amounts)
totalAssets
viewfunction totalAssets() view returns (address[] _assets, uint256[] _amounts)
totalSupply
viewfunction totalSupply() view returns (uint256)
trustedFillerEnabled
viewfunction trustedFillerEnabled() view returns (bool)
trustedFillerRegistry
viewfunction trustedFillerRegistry() view returns (address)
tvlFee
viewfunction tvlFee() view returns (uint256)
version
purefunction version() pure returns (string)
addToBasket
nonpayablefunction addToBasket(address token)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
bid
nonpayablefunction bid(uint256 auctionId, address sellToken, address buyToken, uint256 sellAmount, uint256 maxBuyAmount, bool withCallback, bytes data) returns (uint256 boughtAmt)
closeAuction
nonpayablefunction closeAuction(uint256 auctionId)
createTrustedFill
nonpayablefunction createTrustedFill(uint256 auctionId, address sellToken, address buyToken, address targetFiller, bytes32 deploymentSalt) returns (address filler)
deprecateFolio
nonpayablefunction deprecateFolio()
distributeFees
nonpayablefunction distributeFees()
endRebalance
nonpayablefunction endRebalance()
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(tuple _basicDetails, tuple _additionalDetails, tuple _folioRegistries, tuple _folioFlags, address _creator)
mint
nonpayablefunction mint(uint256 shares, address receiver, uint256 minSharesOut) returns (address[] _assets, uint256[] _amounts)
openAuction
nonpayablefunction openAuction(uint256 rebalanceNonce, address[] tokens, tuple[] newWeights, tuple[] newPrices, tuple newLimits) returns (uint256 auctionId)
openAuctionUnrestricted
nonpayablefunction openAuctionUnrestricted(uint256 rebalanceNonce) returns (uint256 auctionId)
poke
nonpayablefunction poke()
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address[] assets, uint256[] minAmountsOut) returns (uint256[] _amounts)
removeFromBasket
nonpayablefunction removeFromBasket(address token)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setAuctionLength
nonpayablefunction setAuctionLength(uint256 _newLength)
setFeeRecipients
nonpayablefunction setFeeRecipients(tuple[] _newRecipients)
setMandate
nonpayablefunction setMandate(string _newMandate)
setMintFee
nonpayablefunction setMintFee(uint256 _newFee)
setRebalanceControl
nonpayablefunction setRebalanceControl(tuple _rebalanceControl)
setTrustedFillerRegistry
nonpayablefunction setTrustedFillerRegistry(address _newFillerRegistry, bool _enabled)
setTVLFee
nonpayablefunction setTVLFee(uint256 _newFee)
startRebalance
nonpayablefunction startRebalance(address[] tokens, tuple[] weights, tuple[] prices, tuple limits, uint256 auctionLauncherWindow, uint256 ttl)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
AuctionBid
event AuctionBid(uint256 indexed auctionId, address indexed sellToken, address indexed buyToken, uint256 sellAmount, uint256 buyAmount)
AuctionClosed
event AuctionClosed(uint256 indexed auctionId)
AuctionLengthSet
event AuctionLengthSet(uint256 newAuctionLength)
AuctionOpened
event AuctionOpened(uint256 indexed rebalanceNonce, uint256 indexed auctionId, address[] tokens, (uint256 low, uint256 spot, uint256 high)[] weights, (uint256 low, uint256 high)[] prices, (uint256 low, uint256 spot, uint256 high) limits, uint256 startTime, uint256 endTime)
AuctionTrustedFillCreated
event AuctionTrustedFillCreated(uint256 indexed auctionId, address filler)
BasketTokenAdded
event BasketTokenAdded(address indexed token)
BasketTokenRemoved
event BasketTokenRemoved(address indexed token)
FeeRecipientsSet
event FeeRecipientsSet((address recipient, uint96 portion)[] recipients)
FolioDeprecated
event FolioDeprecated()
FolioFeePaid
event FolioFeePaid(address indexed recipient, uint256 amount)
Initialized
event Initialized(uint64 version)
MandateSet
event MandateSet(string newMandate)
MintFeeSet
event MintFeeSet(uint256 newFee)
ProtocolFeePaid
event ProtocolFeePaid(address indexed recipient, uint256 amount)
RebalanceControlSet
event RebalanceControlSet((bool weightControl, uint8 priceControl) newControl)
RebalanceEnded
event RebalanceEnded(uint256 nonce)
RebalanceStarted
event RebalanceStarted(uint256 nonce, uint8 priceControl, address[] tokens, (uint256 low, uint256 spot, uint256 high)[] weights, (uint256 low, uint256 high)[] prices, (uint256 low, uint256 spot, uint256 high) limits, uint256 restrictedUntil, uint256 availableUntil)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
TrustedFillerRegistrySet
event TrustedFillerRegistrySet(address trustedFillerRegistry, bool isEnabled)
TVLFeeSet
event TVLFeeSet(uint256 newFee, uint256 feeAnnually)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
Folio__AuctionCannotBeOpenedWithoutRestriction
error Folio__AuctionCannotBeOpenedWithoutRestriction()
Folio__AuctionNotOngoing
error Folio__AuctionNotOngoing()
Folio__BadFeeTotal
error Folio__BadFeeTotal()
Folio__BalanceNotRemovable
error Folio__BalanceNotRemovable()
Folio__BasketModificationFailed
error Folio__BasketModificationFailed()
Folio__DuplicateAsset
error Folio__DuplicateAsset()
Folio__EmptyAssets
error Folio__EmptyAssets()
Folio__FeeRecipientInvalidAddress
error Folio__FeeRecipientInvalidAddress()
Folio__FeeRecipientInvalidFeeShare
error Folio__FeeRecipientInvalidFeeShare()
Folio__FolioDeprecated
error Folio__FolioDeprecated()
Folio__InsufficientBid
error Folio__InsufficientBid()
Folio__InsufficientBuyAvailable
error Folio__InsufficientBuyAvailable()
Folio__InsufficientSellAvailable
error Folio__InsufficientSellAvailable()
Folio__InsufficientSharesOut
error Folio__InsufficientSharesOut()
Folio__InvalidArrayLengths
error Folio__InvalidArrayLengths()
Folio__InvalidAsset
error Folio__InvalidAsset()
Folio__InvalidAssetAmount
error Folio__InvalidAssetAmount(address asset)
Folio__InvalidAuctionLength
error Folio__InvalidAuctionLength()
Folio__InvalidLimits
error Folio__InvalidLimits()
Folio__InvalidPrices
error Folio__InvalidPrices()
Folio__InvalidRegistry
error Folio__InvalidRegistry()
Folio__InvalidTransferToSelf
error Folio__InvalidTransferToSelf()
Folio__InvalidTTL
error Folio__InvalidTTL()
Folio__InvalidWeights
error Folio__InvalidWeights()
Folio__MintFeeTooHigh
error Folio__MintFeeTooHigh()
Folio__MixedAtomicSwaps
error Folio__MixedAtomicSwaps()
Folio__NotRebalancing
error Folio__NotRebalancing()
Folio__SlippageExceeded
error Folio__SlippageExceeded()
Folio__TooManyFeeRecipients
error Folio__TooManyFeeRecipients()
Folio__TrustedFillerRegistryAlreadySet
error Folio__TrustedFillerRegistryAlreadySet()
Folio__TrustedFillerRegistryNotEnabled
error Folio__TrustedFillerRegistryNotEnabled()
Folio__TVLFeeTooHigh
error Folio__TVLFeeTooHigh()
Folio__TVLFeeTooLow
error Folio__TVLFeeTooLow()
Folio__Unauthorized
error Folio__Unauthorized()
Folio__ZeroInitialShares
error Folio__ZeroInitialShares()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x6080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615dcc806100d96000396000f3fe608060405234801561001057600080fd5b50600436106103ce5760003560e01c8063783e93f0116101ff578063b0384a0b1161011a578063ce923605116100ad578063dd62ed3e1161007c578063dd62ed3e146108c3578063e1e7bd59146108d6578063eddd0d9c146108e9578063fc528482146108fc57600080fd5b8063ce92360514610866578063d17618bf14610879578063d3ebe4ce1461088c578063d547741f146108b057600080fd5b8063bd7379c7116100e9578063bd7379c714610829578063c4ec22ad1461083d578063c717823014610846578063ca15c8731461085357600080fd5b8063b0384a0b146107e5578063b200deda14610805578063b579605b1461080e578063bb57ad201461082157600080fd5b8063979d509411610192578063a217fddf11610161578063a217fddf1461078c578063a3246ad314610794578063a9059cbb146107b4578063aa3b5568146107c757600080fd5b8063979d50941461074a5780639980cb23146107535780639f200bba146107665780639fa0bba41461077957600080fd5b80638cdf1288116101ce5780638cdf1288146107095780639010d07c1461071c57806391d148541461072f57806395d89b411461074257600080fd5b8063783e93f0146106dd5780637aeaafb3146106e6578063834e630f146106ee578063836a1040146106f657600080fd5b80632f2ff15d116102ef5780634b61ffeb11610282578063571a26a011610251578063571a26a01461062a578063591cb1fc1461067457806370a082311461069457806376990dcd146106ca57600080fd5b80634b61ffeb1461059d5780634d5369db146105bc57806351fe9eff146105cf57806354fd4d501461060957600080fd5b806336568abe116102be57806336568abe1461055c578063374cbb2c1461056f57806339b1b96d146105825780633c46570f1461058a57600080fd5b80632f2ff15d1461051e578063313ce56714610531578063320736bf14610540578063325c25a21461055357600080fd5b806318160ddd11610367578063235d714211610336578063235d7142146104d2578063236ed8f3146104e557806323b872dd146104f8578063248a9ca31461050b57600080fd5b806318160ddd14610484578063181783581461048c5780631fffacd81461049457806321903d79146104a757600080fd5b806306fdde03116103a357806306fdde0314610432578063072c2f1714610447578063095ea7b31461046857806313966db51461047b57600080fd5b806240718e146103d35780624aaa39146103dd57806301e1d114146103f057806301ffc9a71461040f575b600080fd5b6103db610905565b005b6103db6103eb3660046149a0565b6109d9565b6103f86109ff565b604051610406929190614a33565b60405180910390f35b61042261041d366004614a58565b610a12565b6040519015158152602001610406565b61043a610a3d565b6040516104069190614a82565b61045a610455366004614ad0565b610b00565b604051908152602001610406565b610422610476366004614afe565b610e63565b61045a60065481565b61045a610e7b565b6103db610ed2565b6103db6104a2366004614b38565b610eea565b6012546104ba906001600160a01b031681565b6040516001600160a01b039091168152602001610406565b6103db6104e0366004614c4f565b610f04565b6103db6104f3366004614ad0565b6110cc565b610422610506366004614d1a565b6111c8565b61045a610519366004614ad0565b6111ee565b6103db61052c366004614d5b565b611210565b60405160128152602001610406565b6104ba61054e366004614d80565b611232565b61045a600f5481565b6103db61056a366004614d5b565b611455565b6103db61057d366004614ddb565b611488565b61043a6114ca565b61045a610598366004614df8565b611558565b6105a561178f565b604080519215158352901515602083015201610406565b6103db6105ca366004614ec8565b611852565b6105e26105dd366004614ad0565b611d2c565b604080516001600160a01b0390931683526001600160601b03909116602083015201610406565b604080518082019091526005815264342e302e3160d81b602082015261043a565b610659610638366004614ad0565b601e6020526000908152604090208054600282015460039092015490919083565b60408051938452602084019290925290820152606001610406565b610687610682366004614d5b565b611d67565b6040516104069190614f68565b61045a6106a2366004614ddb565b6001600160a01b03166000908152600080516020615d80833981519152602052604090205490565b6106596106d8366004614f7f565b611dd2565b61045a60095481565b6103db611e04565b61045a611e56565b6103f8610704366004614fc7565b611e73565b6103db610717366004614ddb565b61211e565b6104ba61072a366004614fee565b612210565b61042261073d366004614d5b565b61223f565b61043a612277565b61045a60085481565b6000546104ba906001600160a01b031681565b6103db610774366004615051565b6122b6565b6103db610787366004614ad0565b612300565b61045a600081565b6107a76107a2366004614ad0565b61231c565b6040516104069190615092565b6104226107c2366004614afe565b612347565b6107cf612355565b6040516104069a99989796959493929190615158565b6107f86107f3366004615247565b61260a565b60405161040691906152d6565b61045a60055481565b6103db61081c366004614ad0565b6127d5565b6103db6127f1565b60125461042290600160a01b900460ff1681565b61045a60075481565b600a546104229060ff1681565b61045a610861366004614ad0565b612a02565b61045a6108743660046152e9565b612a28565b6103f8610887366004615380565b612b2a565b6014546108a29060ff8082169161010090041682565b6040516104069291906153a9565b6103db6108be366004614d5b565b612b43565b61045a6108d13660046153bf565b612b5f565b6103db6108e43660046154a9565b612ba9565b6103db6108f7366004614ad0565b612bc5565b61045a601f5481565b61090d612be1565b61091860003361223f565b8061094857506109487f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb1303361223f565b8061097857506109787f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df53361223f565b61099557604051637bdeee5360e11b815260040160405180910390fd5b6015546040519081527f4413e35d9a55c68763294e889871b8e17c9650f0db8fcfaf50690b4b02c943709060200160405180910390a142601c556109d7612c2b565b565b60006109e481612c51565b6109fb6109f636849003840184615558565b612c5b565b5050565b606080610a0a612cde565b915091509091565b60006001600160e01b03198216635a05180f60e01b1480610a375750610a3782612d8c565b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace038054606091600080516020615d8083398151915291610a7c9061559f565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa89061559f565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b505050505091505090565b6000610b0a612be1565b600a5460ff1615610b2e5760405163539409e360e11b815260040160405180910390fd5b610b36612dc1565b601b54421015610b59576040516346f80f1f60e01b815260040160405180910390fd5b6000610b656002612df4565b80519091506000805b82811015610bd15760156001016000858381518110610b8f57610b8f6155d3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615610bc95781610bc5816155ff565b9250505b600101610b6e565b506000816001600160401b03811115610bec57610bec6153ed565b604051908082528060200260200182016040528015610c15578160200160208202803683370190505b5090506000826001600160401b03811115610c3257610c326153ed565b604051908082528060200260200182016040528015610c8757816020015b610c7460405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610c505790505b5090506000836001600160401b03811115610ca457610ca46153ed565b604051908082528060200260200182016040528015610ce957816020015b6040805180820190915260008082526020820152815260200190600190039081610cc25790505b5090506000935060005b85811015610e1f57600060156001016000898481518110610d1657610d166155d3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805490915060ff1615610e1657878281518110610d5857610d586155d3565b6020026020010151858781518110610d7257610d726155d3565b6001600160a01b03909216602092830291909101820152604080516060810182526002840154808252928101839052908101919091528451859088908110610dbc57610dbc6155d3565b60200260200101819052508060040160405180604001604052908160008201548152602001600182015481525050838781518110610dfc57610dfc6155d3565b60200260200101819052508580610e12906155ff565b9650505b50600101610cf3565b50604080516060810182526018548082526020820181905291810191909152610e4d89858585856078612e01565b975050505050505050610e5e612c2b565b919050565b600033610e71818585612fa7565b5060019392505050565b6000806000610e88612fb4565b50915091508082610eb77f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b610ec19190615618565b610ecb9190615618565b9250505090565b610eda612be1565b610ee2612dc1565b6109d7612c2b565b6000610ef581612c51565b610eff8383613368565b505050565b7f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb130610f2e81612c51565b610f36612be1565b600a5460ff1615610f5a5760405163539409e360e11b815260040160405180910390fd5b610f62612dc1565b6000610f6e6002612df4565b805190915060005b81811015610ff05760156001016000848381518110610f9757610f976155d3565b6020908102919091018101516001600160a01b031682528101919091526040016000908120805460ff19168155600180820183905560028201839055600382018390556004820183905560059091019190915501610f76565b50736616e9d85e0f4ab3b8d7e92192b48267da1cbee463f22836d6601460158f8f8f8f8f8f8f8f8f6040518c63ffffffff1660e01b815260040161103e9b9a999897969594939291906156a3565b60006040518083038186803b15801561105657600080fd5b505af415801561106a573d6000803e3d6000fd5b508d93506000925050505b818110156110b5576110ac8d8d83818110611092576110926155d3565b90506020020160208101906110a79190614ddb565b613447565b50600101611075565b5050506110c0612c2b565b50505050505050505050565b6110d4612be1565b6110df60003361223f565b8061110f575061110f7f4ff6ae4d6a29e79ca45c6441bdc89b93878ac6118485b33c8baa3749fc3cb1303361223f565b8061113f575061113f7f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df53361223f565b61115c57604051637bdeee5360e11b815260040160405180910390fd5b6000818152601e602052604090206003015442116111bd5761117f60014261575f565b6000828152601e602052604080822060030192909255905182917fac4a907ec29adcc56774b757ecb1e1b4d597374fc9386107d05e2670259df7d391a25b6111c5612c2b565b50565b6000336111d68582856134c6565b6111e1858585613526565b60019150505b9392505050565b6000908152600080516020615da0833981519152602052604090206001015490565b611219826111ee565b61122281612c51565b61122c8383613585565b50505050565b600061123c612be1565b600a5460ff16156112605760405163539409e360e11b815260040160405180910390fd5b611268612dc1565b6012546001600160a01b03161580159061128b5750601254600160a01b900460ff165b6112a8576040516387db439760e01b815260040160405180910390fd5b6000868152601e6020526040812081906112c890888884600019806135ca565b5091509150806000036112ee57604051630ad5378760e01b815260040160405180910390fd5b6012546040516333f363a360e01b81523360048201526001600160a01b03878116602483015260448201879052909116906333f363a3906064016020604051808303816000875af1158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b9190615772565b92506113788784846136f8565b6040516314d6c7d760e31b81523060048201526001600160a01b0388811660248301528781166044830152606482018490526084820183905284169063a6b63eb89060a401600060405180830381600087803b1580156113d757600080fd5b505af11580156113eb573d6000803e3d6000fd5b5050601380546001600160a01b0319166001600160a01b0387169081179091556040519081528a92507f7e8e2491200fd9e2cf2541c7229d5bf89f4da14659c18fc31054176c339e310b915060200160405180910390a2505061144c612c2b565b95945050505050565b6001600160a01b038116331461147e5760405163334bd91960e11b815260040160405180910390fd5b610eff82826137b6565b611490612be1565b600061149b81612c51565b6114a482613447565b6114c15760405163420aca6760e01b815260040160405180910390fd5b506111c5612c2b565b600180546114d79061559f565b80601f01602080910402602001604051908101604052809291908181526020018280546115039061559f565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b505050505081565b60007f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df561158481612c51565b61158c612be1565b600a5460ff16156115b05760405163539409e360e11b815260040160405180910390fd5b6115b8612dc1565b8760005b8181101561163157601660008c8c848181106115da576115da6155d3565b90506020020160208101906115ef9190614ddb565b6001600160a01b0316815260208101919091526040016000205460ff166116295760405163445e1f2b60e11b815260040160405180910390fd5b6001016115bc565b506117358b8b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508a8a808060200260200160405190810160405280939291908181526020016000905b828210156116c6576116b7606083028601368190038101906157e7565b8152602001906001019061169a565b50505050508989808060200260200160405190810160405280939291908181526020016000905b828210156117195761170a60408302860136819003810190615803565b815260200190600101906116ed565b5061172e9350505050368a90038a018a6157e7565b6000612e01565b92506117766015600601546078601e600f54426117529190615618565b61175c9190615618565b6117669190615618565b611771906001615618565b6137f2565b601b5550611782612c2b565b5098975050505050505050565b6000806117bd7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460021490565b6013549092506001600160a01b03161580159061184c5750601360009054906101000a90046001600160a01b03166001600160a01b031663d6dacb446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184c9190615836565b90509091565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156118975750825b90506000826001600160401b031660011480156118b35750303b155b9050811580156118c1575080155b156118df5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561190957845460ff60401b1916600160401b1785555b6119926119168b80615853565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119589250505060208d018d615853565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061380292505050565b61199a613814565b6119a2613814565b6119aa61381c565b611a106119ba60208b018b615899565b808060200260200160405190810160405280939291908181526020016000905b82821015611a06576119f7604083028601368190038101906158e2565b815260200190600101906119da565b505050505061382c565b611a1d8960400135613a56565b611a2a8960600135613b8f565b611a348935613bec565b611a7e611a4460808b018b615853565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c5292505050565b611a936109f636899003890160208a01615558565b611ab8611aa660408a0160208b01614ddb565b611ab360208a018a6158fe565b613368565b611acd611ac860208a018a614ddb565b613c8e565b8960800135600003611af257604051631f6d979160e11b815260040160405180910390fd5b6000611b0160408c018c61591b565b9050905080600003611b265760405163e9eaf68960e01b815260040160405180910390fd5b60005b81811015611cbb576000611b4060408e018e61591b565b83818110611b5057611b506155d3565b9050602002016020810190611b659190614ddb565b6001600160a01b031603611b8c5760405163445e1f2b60e11b815260040160405180910390fd5b6000611b9b60408e018e61591b565b83818110611bab57611bab6155d3565b9050602002016020810190611bc09190614ddb565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a9190615964565b9050801515611c3c60408f018f61591b565b84818110611c4c57611c4c6155d3565b9050602002016020810190611c619190614ddb565b90611c9057604051631b58637360e21b81526001600160a01b0390911660048201526024015b60405180910390fd5b50611cb1611ca160408f018f61591b565b84818110611092576110926155d3565b5050600101611b29565b5042600755611cce8760808d0135613cd7565b611cd9600033613585565b505083156110c057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050505050565b60048181548110611d3c57600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b60408051808201825260008082526020918201819052848152601e82528281206001600160a01b038516825260019081018352838220845180860190955280548086529101549284019290925203610a375760405163445e1f2b60e11b815260040160405180910390fd5b6000848152601e6020526040812081908190611df490878784886000196135ca565b9250925092509450945094915050565b611e0c612be1565b6000611e1781612c51565b600a805460ff191660011790556040517f0896631e72e873e636ab9ad7599a61ddc2f96c7961fa8e19e00a926e6512312390600090a1506109d7612c2b565b6000806000611e63612fb4565b509092509050610ecb8183615618565b606080611e7e612be1565b600a5460ff1615611ea25760405163539409e360e11b815260040160405180910390fd5b611eaa612dc1565b600080546040516311a04fa160e11b8152306004820152829182916001600160a01b03909116906323409f4290602401608060405180830381865afa158015611ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1b919061597d565b93509350935050611f3381660110d9316ec0006137f2565b90506000670de0b6b3a76400006001670de0b6b3a76400006006548c611f5991906159bc565b611f639190615618565b611f6d919061575f565b611f7791906159e9565b9050600083600181611f8988866159bc565b611f939190615618565b611f9d919061575f565b611fa791906159e9565b90506000670de0b6b3a7640000600181611fc1878f6159bc565b611fcb9190615618565b611fd5919061575f565b611fdf91906159e9565b9050808210611fee5781611ff0565b805b9150818310611fff5782612001565b815b9250600061200f848d61575f565b905080158015906120205750898110155b61203d57604051632cf5f58f60e21b815260040160405180910390fd5b6120488c6001613d0d565b8151919a50985060005b818110156120c15789818151811061206c5761206c6155d3565b60200260200101516000146120b9576120b98b8281518110612090576120906155d3565b602002602001015133308d85815181106120ac576120ac6155d3565b6020026020010151613d8a565b600101612052565b506120cc8c83613cd7565b83600860008282546120de9190615618565b909155506120ee9050848661575f565b600960008282546120ff9190615618565b925050819055505050505050505050612116612c2b565b935093915050565b612126612be1565b61212e613dc3565b61213960003361223f565b806121cd57506001600160a01b0381166000908152601660205260409020600201541580156121cd57506040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa1580156121a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cb9190615964565b155b6121ea5760405163019b497f60e51b815260040160405180910390fd5b6121f381613e4e565b6111bd5760405163420aca6760e01b815260040160405180910390fd5b6000828152600080516020615d608339815191526020819052604082206122379084613ed4565b949350505050565b6000918252600080516020615da0833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020615d8083398151915291610a7c9061559f565b60006122c181612c51565b610eff83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c5292505050565b600061230b81612c51565b6123136127f1565b6109fb82613a56565b6000818152600080516020615d6083398151915260208190526040909120606091906111e790612df4565b600033610e71818585613526565b600060608060608061238160405180606001604052806000815260200160008152602001600081525090565b6000806000806123916002612df4565b8051909950806001600160401b038111156123ae576123ae6153ed565b60405190808252806020026020018201604052801561240357816020015b6123f060405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816123cc5790505b509850806001600160401b0381111561241e5761241e6153ed565b60405190808252806020026020018201604052801561246357816020015b604080518082019091526000808252602082015281526020019060019003908161243c5790505b509750806001600160401b0381111561247e5761247e6153ed565b6040519080825280602002602001820160405280156124a7578160200160208202803683370190505b50965060005b818110156125b9576000601560010160008d84815181106124d0576124d06155d3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090508060010160405180606001604052908160008201548152602001600182015481526020016002820154815250508b8381518110612539576125396155d3565b602002602001018190525080600401604051806040016040529081600082015481526020016001820154815250508a8381518110612579576125796155d3565b60209081029190910101528054895160ff909116908a90849081106125a0576125a06155d3565b91151560209283029190910190910152506001016124ad565b5050601554604080516060810182526017548152601854602082015260195491810191909152601a54601b54601c54601d54949f9d9e509b9c9a9b999a92999198509650945060ff90911692509050565b6060612614612be1565b61261c612dc1565b6060612629886000613d0d565b925090506126373389613ee0565b8051858114801561264757508084145b61266457604051635feae2b760e01b815260040160405180910390fd5b60005b818110156127c057878782818110612681576126816155d3565b90506020020160208101906126969190614ddb565b6001600160a01b03168382815181106126b1576126b16155d3565b60200260200101516001600160a01b0316146126e05760405163445e1f2b60e11b815260040160405180910390fd5b8585828181106126f2576126f26155d3565b9050602002013584828151811061270b5761270b6155d3565b60200260200101511015838281518110612727576127276155d3565b60200260200101519061275957604051631b58637360e21b81526001600160a01b039091166004820152602401611c87565b5083818151811061276c5761276c6155d3565b60200260200101516000146127b8576127b8838281518110612790576127906155d3565b60200260200101518a8684815181106127ab576127ab6155d3565b6020026020010151613f16565b600101612667565b5050506127cb612c2b565b9695505050505050565b6127dd612be1565b60006127e881612c51565b6114c182613bec565b6127f9612be1565b612801612dc1565b60098054600091829055600454909190815b8181101561290e576000670de0b6b3a764000060048381548110612839576128396155d3565b60009182526020909120015461285f90600160a01b90046001600160601b0316876159bc565b61286991906159e9565b90506128758185615618565b93506128a86004838154811061288d5761288d6155d3565b6000918252602090912001546001600160a01b031682613cd7565b600482815481106128bb576128bb6155d3565b600091825260209182902001546040518381526001600160a01b03909116917f168a65529db3a11aa555b702a0e4594e364bfeebed05918eeb405d36e744fa51910160405180910390a250600101612813565b50600082846008546129209190615618565b61292a919061575f565b600080546040516311a04fa160e11b815230600482015292935090916001600160a01b03909116906323409f4290602401608060405180830381865afa158015612978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299c919061597d565b50505090506129ab8183613cd7565b806001600160a01b03167fb87e607f6030a23ed9b7dac1a717610f3a3b07325269f18808ba763bdcefe7ae836040516129e691815260200190565b60405180910390a250506000600855506109d79150612c2b9050565b6000818152600080516020615d608339815191526020819052604082206111e790613f47565b6000612a32612be1565b600a5460ff1615612a565760405163539409e360e11b815260040160405180910390fd5b612a5e612dc1565b6000898152601e60205260409020612a7a818a8a8a808b6135ca565b50604051630a99082360e11b8152909350736616e9d85e0f4ab3b8d7e92192b48267da1cbee49150631532104690612ac4908d908d908d908d9089908d908d908d906004016159fd565b602060405180830381865af4158015612ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b059190615836565b15612b1557612b1389613e4e565b505b50612b1e612c2b565b98975050505050505050565b606080612b378484613d0d565b915091505b9250929050565b612b4c826111ee565b612b5581612c51565b61122c83836137b6565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6000612bb481612c51565b612bbc6127f1565b6109fb8261382c565b6000612bd081612c51565b612bd86127f1565b6109fb82613b8f565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901612c2557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6111c58133613f51565b80516014805491151560ff19831681178255602084015184939091839161ff001990911661ffff1990911617610100836002811115612c9c57612c9c615120565b02179055509050507f0aab3571baa3ce57a744138e4bb529992ae0398bbfc12b2ae79ecf1cc94ec25a81604051612cd39190615a68565b60405180910390a150565b606080612ceb6002612df4565b8051909250806001600160401b03811115612d0857612d086153ed565b604051908082528060200260200182016040528015612d31578160200160208202803683370190505b50915060005b81811015612d8657612d61848281518110612d5457612d546155d3565b6020026020010151613f8a565b838281518110612d7357612d736155d3565b6020908102919091010152600101612d37565b50509091565b60006001600160e01b03198216637965db0b60e01b1480610a3757506301ffc9a760e01b6001600160e01b0319831614610a37565b612dc9613dc3565b6000806000612dd6612fb4565b925092509250600754811115610eff57600892909255600955600755565b606060006111e783614183565b60155460009087148015612e225750601a54612e1e908390615618565b4210155b8015612e2f5750601c5442105b612e4c5760405163089b3fa160e31b815260040160405180910390fd5b601f54600003612e5e57600b54612e62565b601f545b9050612e6f816001615618565b601f558015612f25576000601e81612e8860018561575f565b81526020019081526020016000209050878160000154148015612eba575042838260030154612eb79190615618565b10155b15612f23578215612ede576040516346f80f1f60e01b815260040160405180910390fd5b612ee960014261575f565b6003820155612ef960018361575f565b6040517fac4a907ec29adcc56774b757ecb1e1b4d597374fc9386107d05e2670259df7d390600090a25b505b600f5460405163fba540c760e01b8152736616e9d85e0f4ab3b8d7e92192b48267da1cbee49163fba540c791612f6d91601591601e9187918d918d918d918d91600401615ad6565b60006040518083038186803b158015612f8557600080fd5b505af4158015612f99573d6000803e3d6000fd5b505050509695505050505050565b610eff83838360016141df565b6000808062015180612fc681426159e9565b612fd091906159bc565b905060006007548211612fe4576000612ff1565b600754612ff1908361575f565b9050806000036130105760085460095460075493509350935050909192565b60085493506009549250600083856130467f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b6130509190615618565b61305a9190615618565b600080546040516311a04fa160e11b81523060048201529293509091829182916001600160a01b03909116906323409f4290602401608060405180830381865afa1580156130ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d0919061597d565b935093509350506000731d84718cf856c82e71499ec02c8b52a392b8fce3632e4c697f83670de0b6b3a7640000613107919061575f565b6040516001600160e01b031960e084901b16815260048101919091526407620d06ef6024820152604401602060405180830381865af415801561314e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131729190615964565b61318490670de0b6b3a764000061575f565b9050600060055482116131995760055461319b565b815b9050600086731d84718cf856c82e71499ec02c8b52a392b8fce36399a04f2f6131cc85670de0b6b3a764000061575f565b8b6040518363ffffffff1660e01b81526004016131f3929190918252602082015260400190565b602060405180830381865af4158015613210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132349190615964565b613246670de0b6b3a76400008a6159bc565b61325091906159e9565b61325a919061575f565b9050600082600181613274670de0b6b3a7640000886159bc565b61327e9190615618565b613288919061575f565b61329291906159e9565b90506000866001816132ac670de0b6b3a76400008c6159bc565b6132b69190615618565b6132c0919061575f565b6132ca91906159e9565b821161330157866001816132de8b876159bc565b6132e89190615618565b6132f2919061575f565b6132fc91906159e9565b613335565b670de0b6b3a764000060018161331785876159bc565b6133219190615618565b61332b919061575f565b61333591906159e9565b9050613341818e615618565b9c5061334d818461575f565b613357908d615618565b9b5050505050505050505050909192565b6012546001600160a01b038381169116146133c3576012546001600160a01b0316156133a7576040516312794cc760e21b815260040160405180910390fd5b601280546001600160a01b0319166001600160a01b0384161790555b60125460ff600160a01b909104161515811515146133f3576012805460ff60a01b1916600160a01b831515021790555b601254604080516001600160a01b0383168152600160a01b90920460ff16151560208301527f5806f7ef7f8d6bafce97caf329ff62db253b61c867a1b2c4da9e79dbc4ec2f22910160405180910390a15050565b60006001600160a01b0382161580159061346a57506001600160a01b0382163014155b6134875760405163445e1f2b60e11b815260040160405180910390fd5b6040516001600160a01b038316907f59b7c8b22741836fc393dc21baa2e8157e039b28c3ee59310f38b2847a2dd29c90600090a2610a376002836142c7565b60006134d28484612b5f565b9050600019811461122c578181101561351757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611c87565b61122c848484840360006141df565b6001600160a01b03831661355057604051634b637e8f60e11b815260006004820152602401611c87565b6001600160a01b03821661357a5760405163ec442f0560e01b815260006004820152602401611c87565b610eff8383836142dc565b6000600080516020615d60833981519152816135a18585614310565b905080156122375760008581526020839052604090206135c190856142c7565b50949350505050565b6000806000806040518060c001604052806135e3610e7b565b81526020016135f18b613f8a565b81526020016135ff8a613f8a565b815260208082018a905260408083018a90526060928301899052805163ef27b38b60e01b815260156004820152602481018f90526001600160a01b03808f1660448301528d166064820152845160848201529184015160a483015283015160c48201529082015160e4820152608082015161010482015260a0820151610124820152909150736616e9d85e0f4ab3b8d7e92192b48267da1cbee49063ef27b38b9061014401606060405180830381865af41580156136c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e59190615b93565b919c909b50909950975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261374984826143bc565b61122c576040516001600160a01b038481166024830152600060448301526137ac91869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614406565b61122c8482614406565b6000600080516020615d60833981519152816137d28585614477565b905080156122375760008581526020839052604090206135c190856144f3565b60008282188284110282186111e7565b61380a614508565b6109fb8282614551565b6109d7614508565b613824614508565b6109d76145a2565b7fb8dde4be9101cab9d9d994925b7817605b5ce5834e63618484b8b4e5bef6a5488160405161385b9190615bc1565b60405180910390a160045460005b818110156138a257600480548061388257613882615c22565b600082815260208120820160001990810191909155019055600101613869565b5081519050806000036138b3575050565b60408111156138d557604051636516935760e11b815260040160405180910390fd5b60008060005b83811015613a2d57826001600160a01b03168582815181106138ff576138ff6155d3565b6020026020010151600001516001600160a01b031611613932576040516341dc215f60e11b815260040160405180910390fd5b848181518110613944576139446155d3565b6020026020010151602001516001600160601b03166000036139795760405163011becf960e01b815260040160405180910390fd5b84818151811061398b5761398b6155d3565b6020026020010151602001516001600160601b0316826139ab9190615618565b91508481815181106139bf576139bf6155d3565b602002602001015160000151925060048582815181106139e1576139e16155d3565b602090810291909101810151825460018181018555600094855293839020825192909301516001600160601b0316600160a01b026001600160a01b0390921691909117910155016138db565b50670de0b6b3a7640000811461122c5760405163f79b6e4960e01b815260040160405180910390fd5b67016345785d8a0000811115613a7f576040516302aec4d160e11b815260040160405180910390fd5b731d84718cf856c82e71499ec02c8b52a392b8fce3632e4c697f613aab83670de0b6b3a764000061575f565b6040516001600160e01b031960e084901b16815260048101919091526407620d06ef6024820152604401602060405180830381865af4158015613af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b169190615964565b613b2890670de0b6b3a764000061575f565b600555801580613b39575060055415155b613b5657604051637c379aa760e11b815260040160405180910390fd5b60055460408051918252602082018390527f504285076b3e8a5b35bb309459af128be9f7cf48f7aab9e599332a1e79cb541e9101612cd3565b66b1a2bc2ec50000811115613bb75760405163330e445d60e01b815260040160405180910390fd5b60068190556040518181527f97aee230ba41961438e908e115df76fa8113f85a0586d85b19ba5be50e6a227490602001612cd3565b603c8110158015613c00575062093a808111155b613c1d5760405163bb80f28f60e01b815260040160405180910390fd5b600f8190556040518181527f99578d7fe3e20e279feceaa076eb8032d475ca1a49391ec0a740445152a5971390602001612cd3565b6001613c5e8282615c7f565b507f7332b59e42a46838955f2abeac0a553dd3870441c46bbfb13728d9b2cc5fb6d481604051612cd39190614a82565b6001600160a01b038116613cb557604051635908381f60e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216613d015760405163ec442f0560e01b815260006004820152602401611c87565b6109fb600083836142dc565b6060806000613d1a610e7b565b9050613d24612cde565b8151919450925060005b81811015613d8057613d5b87858381518110613d4c57613d4c6155d3565b602002602001015185896145aa565b848281518110613d6d57613d6d6155d3565b6020908102919091010152600101613d2e565b5050509250929050565b6040516001600160a01b03848116602483015283811660448301526064820183905261122c9186918216906323b872dd9060840161377a565b6013546001600160a01b0316156109d757601360009054906101000a90046001600160a01b03166001600160a01b031663c8b58aab6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613e2457600080fd5b505af1158015613e38573d6000803e3d6000fd5b5050601380546001600160a01b03191690555050565b6040516000906001600160a01b038316907f4e3a022fa7a66b1e055fe6b819a1afe69dc1d44c43de4af7b32f095e603884ae908390a26001600160a01b0382166000908152601660205260408120805460ff191681556001810182905560028082018390556003820183905560048201839055600590910191909155610a3790836144f3565b60006111e783836145ee565b6001600160a01b038216613f0a57604051634b637e8f60e11b815260006004820152602401611c87565b6109fb826000836142dc565b6040516001600160a01b03838116602483015260448201839052610eff91859182169063a9059cbb9060640161377a565b6000610a37825490565b613f5b828261223f565b6109fb5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611c87565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015613fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff59190615964565b6013549091506001600160a01b0316158015906141065750601354604080516309769f0b60e41b815290516001600160a01b03808616931691639769f0b09160048083019260209291908290030181865afa158015614058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407c9190615772565b6001600160a01b0316148061410657506013546040805163a482171960e01b815290516001600160a01b0380861693169163a48217199160048083019260209291908290030181865afa1580156140d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fb9190615772565b6001600160a01b0316145b15610e5e576013546040516370a0823160e01b81526001600160a01b039182166004820152908316906370a0823190602401602060405180830381865afa158015614155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141799190615964565b610a379082615618565b6060816000018054806020026020016040519081016040528092919081815260200182805480156141d357602002820191906000526020600020905b8154815260200190600101908083116141bf575b50505050509050919050565b600080516020615d808339815191526001600160a01b0385166142185760405163e602df0560e01b815260006004820152602401611c87565b6001600160a01b03841661424257604051634a1406b160e11b815260006004820152602401611c87565b6001600160a01b038086166000908152600183016020908152604080832093881683529290522083905581156142c057836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516142b791815260200190565b60405180910390a35b5050505050565b60006111e7836001600160a01b038416614618565b306001600160a01b0383160361430557604051631df47fd760e11b815260040160405180910390fd5b610eff838383614667565b6000600080516020615da083398151915261432b848461223f565b6143ab576000848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556143613390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610a37565b6000915050610a37565b5092915050565b6000806000806020600086516020880160008a5af192503d915060005190508280156127cb575081156143f257806001146127cb565b50505050506001600160a01b03163b151590565b600080602060008451602086016000885af180614429576040513d6000823e3d81fd5b50506000513d9150811561444157806001141561444e565b6001600160a01b0384163b155b1561122c57604051635274afe760e01b81526001600160a01b0385166004820152602401611c87565b6000600080516020615da0833981519152614492848461223f565b156143ab576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610a37565b60006111e7836001600160a01b0384166147a5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166109d757604051631afcd79f60e31b815260040160405180910390fd5b614559614508565b600080516020615d808339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036145938482615c7f565b506004810161122c8382615c7f565b612c2b614508565b60006145d96145b88361488e565b80156145d45750600084806145cf576145cf6159d3565b868809115b151590565b6145e48686866148bb565b61144c9190615618565b6000826000018281548110614605576146056155d3565b9060005260206000200154905092915050565b600081815260018301602052604081205461465f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a37565b506000610a37565b600080516020615d808339815191526001600160a01b0384166146a357818160020160008282546146989190615618565b909155506147159050565b6001600160a01b038416600090815260208290526040902054828110156146f65760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401611c87565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316614733576002810180548390039055614752565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161479791815260200190565b60405180910390a350505050565b600081815260018301602052604081205480156143ab5760006147c960018361575f565b85549091506000906147dd9060019061575f565b90508082146148425760008660000182815481106147fd576147fd6155d3565b9060005260206000200154905080876000018481548110614820576148206155d3565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061485357614853615c22565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a37565b600060028260038111156148a4576148a4615120565b6148ae9190615d3d565b60ff166001149050919050565b60008383028160001985870982811083820303915050806000036148f2578382816148e8576148e86159d3565b04925050506111e7565b808411614909576149096003851502601118614976565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b634e487b71600052806020526024601cfd5b60006040828403121561499a57600080fd5b50919050565b6000604082840312156149b257600080fd5b6111e78383614988565b600081518084526020840193506020830160005b828110156149f75781516001600160a01b03168652602095860195909101906001016149d0565b5093949350505050565b600081518084526020840193506020830160005b828110156149f7578151865260209586019590910190600101614a15565b604081526000614a4660408301856149bc565b828103602084015261144c8185614a01565b600060208284031215614a6a57600080fd5b81356001600160e01b0319811681146111e757600080fd5b602081526000825180602084015260005b81811015614ab05760208186018101516040868401015201614a93565b506000604082850101526040601f19601f83011684010191505092915050565b600060208284031215614ae257600080fd5b5035919050565b6001600160a01b03811681146111c557600080fd5b60008060408385031215614b1157600080fd5b8235614b1c81614ae9565b946020939093013593505050565b80151581146111c557600080fd5b60008060408385031215614b4b57600080fd5b8235614b5681614ae9565b91506020830135614b6681614b2a565b809150509250929050565b60008083601f840112614b8357600080fd5b5081356001600160401b03811115614b9a57600080fd5b6020830191508360208260051b8501011115612b3c57600080fd5b60008083601f840112614bc757600080fd5b5081356001600160401b03811115614bde57600080fd5b602083019150836020606083028501011115612b3c57600080fd5b60008083601f840112614c0b57600080fd5b5081356001600160401b03811115614c2257600080fd5b6020830191508360208260061b8501011115612b3c57600080fd5b60006060828403121561499a57600080fd5b60008060008060008060008060006101008a8c031215614c6e57600080fd5b89356001600160401b03811115614c8457600080fd5b614c908c828d01614b71565b909a5098505060208a01356001600160401b03811115614caf57600080fd5b614cbb8c828d01614bb5565b90985096505060408a01356001600160401b03811115614cda57600080fd5b614ce68c828d01614bf9565b9096509450614cfa90508b60608c01614c3d565b989b979a50959894979396929550929360c0810135935060e00135919050565b600080600060608486031215614d2f57600080fd5b8335614d3a81614ae9565b92506020840135614d4a81614ae9565b929592945050506040919091013590565b60008060408385031215614d6e57600080fd5b823591506020830135614b6681614ae9565b600080600080600060a08688031215614d9857600080fd5b853594506020860135614daa81614ae9565b93506040860135614dba81614ae9565b92506060860135614dca81614ae9565b949793965091946080013592915050565b600060208284031215614ded57600080fd5b81356111e781614ae9565b60008060008060008060008060e0898b031215614e1457600080fd5b8835975060208901356001600160401b03811115614e3157600080fd5b614e3d8b828c01614b71565b90985096505060408901356001600160401b03811115614e5c57600080fd5b614e688b828c01614bb5565b90965094505060608901356001600160401b03811115614e8757600080fd5b614e938b828c01614bf9565b9094509250614ea790508a60808b01614c3d565b90509295985092959890939650565b600060a0828403121561499a57600080fd5b60008060008060006101008688031215614ee157600080fd5b85356001600160401b03811115614ef757600080fd5b614f0388828901614eb6565b95505060208601356001600160401b03811115614f1f57600080fd5b614f2b88828901614eb6565b945050614f3b8760408801614988565b9250614f4a8760808801614c3d565b915060e0860135614f5a81614ae9565b809150509295509295909350565b815181526020808301519082015260408101610a37565b60008060008060808587031215614f9557600080fd5b843593506020850135614fa781614ae9565b92506040850135614fb781614ae9565b9396929550929360600135925050565b600080600060608486031215614fdc57600080fd5b833592506020840135614d4a81614ae9565b6000806040838503121561500157600080fd5b50508035926020909101359150565b60008083601f84011261502257600080fd5b5081356001600160401b0381111561503957600080fd5b602083019150836020828501011115612b3c57600080fd5b6000806020838503121561506457600080fd5b82356001600160401b0381111561507a57600080fd5b61508685828601615010565b90969095509350505050565b6020815260006111e760208301846149bc565b600081518084526020840193506020830160005b828110156149f7576150d686835180518252602090810151910152565b60409590950194602091909101906001016150b9565b600081518084526020840193506020830160005b828110156149f75781511515865260209586019590910190600101615100565b634e487b7160e01b600052602160045260246000fd5b6003811061515457634e487b7160e01b600052602160045260246000fd5b9052565b8a81526101806020820152600061517361018083018c6149bc565b82810360408401528a518082526020808d0192019060005b818110156151c8576151b28385518051825260208082015190830152604090810151910152565b602093909301926060929092019160010161518b565b505083810360608501526151dc818c6150a5565b91505082810360808401526151f1818a6150ec565b885160a0850152602089015160c0850152604089015160e085015291506152159050565b856101008301528461012083015283610140830152615238610160830184615136565b9b9a5050505050505050505050565b6000806000806000806080878903121561526057600080fd5b86359550602087013561527281614ae9565b945060408701356001600160401b0381111561528d57600080fd5b61529989828a01614b71565b90955093505060608701356001600160401b038111156152b857600080fd5b6152c489828a01614b71565b979a9699509497509295939492505050565b6020815260006111e76020830184614a01565b60008060008060008060008060e0898b03121561530557600080fd5b88359750602089013561531781614ae9565b9650604089013561532781614ae9565b9550606089013594506080890135935060a089013561534581614b2a565b925060c08901356001600160401b0381111561536057600080fd5b61536c8b828c01615010565b999c989b5096995094979396929594505050565b6000806040838503121561539357600080fd5b82359150602083013560048110614b6657600080fd5b8215158152604081016111e76020830184615136565b600080604083850312156153d257600080fd5b82356153dd81614ae9565b91506020830135614b6681614ae9565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715615425576154256153ed565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615453576154536153ed565b604052919050565b60006040828403121561546d57600080fd5b615475615403565b9050813561548281614ae9565b815260208201356001600160601b038116811461549e57600080fd5b602082015292915050565b6000602082840312156154bb57600080fd5b81356001600160401b038111156154d157600080fd5b8201601f810184136154e257600080fd5b80356001600160401b038111156154fb576154fb6153ed565b61550a60208260051b0161542b565b8082825260208201915060208360061b85010192508683111561552c57600080fd5b6020840193505b828410156127cb57615545878561545b565b8252602082019150604084019350615533565b6000604082840312801561556b57600080fd5b50615574615403565b823561557f81614b2a565b815260208301356003811061559357600080fd5b60208201529392505050565b600181811c908216806155b357607f821691505b60208210810361499a57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615611576156116155e9565b5060010190565b80820180821115610a3757610a376155e9565b81835260208301925060008160005b848110156149f7578135865260208083013590870152604080830135908701526060958601959091019060010161563a565b81835260208301925060008160005b848110156149f75781358652602080830135908701526040958601959091019060010161567b565b8b8152602081018b905261014060408201819052810189905260008a6101608301825b8c8110156156f65782356156d981614ae9565b6001600160a01b03168252602092830192909101906001016156c6565b50838103606085015261570a818b8d61562b565b915050828103608084015261572081888a61566c565b863560a0850152602087013560c0850152604087013560e085015291506157449050565b61010082019390935261012001529998505050505050505050565b81810381811115610a3757610a376155e9565b60006020828403121561578457600080fd5b81516111e781614ae9565b6000606082840312156157a157600080fd5b604051606081016001600160401b03811182821017156157c3576157c36153ed565b60409081528335825260208085013590830152928301359281019290925250919050565b6000606082840312156157f957600080fd5b6111e7838361578f565b6000604082840312801561581657600080fd5b5061581f615403565b823581526020928301359281019290925250919050565b60006020828403121561584857600080fd5b81516111e781614b2a565b6000808335601e1984360301811261586a57600080fd5b8301803591506001600160401b0382111561588457600080fd5b602001915036819003821315612b3c57600080fd5b6000808335601e198436030181126158b057600080fd5b8301803591506001600160401b038211156158ca57600080fd5b6020019150600681901b3603821315612b3c57600080fd5b6000604082840312156158f457600080fd5b6111e7838361545b565b60006020828403121561591057600080fd5b81356111e781614b2a565b6000808335601e1984360301811261593257600080fd5b8301803591506001600160401b0382111561594c57600080fd5b6020019150600581901b3603821315612b3c57600080fd5b60006020828403121561597657600080fd5b5051919050565b6000806000806080858703121561599357600080fd5b845161599e81614ae9565b60208601516040870151606090970151919890975090945092505050565b8082028115828204841417610a3757610a376155e9565b634e487b7160e01b600052601260045260246000fd5b6000826159f8576159f86159d3565b500490565b8881526001600160a01b03888116602083015287166040820152606081018690526080810185905283151560a082015260e060c0820181905281018290528183610100830137600081830161010090810191909152601f909201601f19160101979650505050505050565b81511515815260208083015160408301916143b590840182615136565b600081518084526020840193506020830160005b828110156149f757615ac08683518051825260208082015190830152604090810151910152565b6060959095019460209190910190600101615a99565b600061014082018a835289602084015288604084015261014060608401528088518083526101608501915060208a01925060005b81811015615b315783516001600160a01b0316835260209384019390920191600101615b0a565b50508381036080850152615b458189615a85565b91505082810360a0840152615b5a81876150a5565b855160c0850152602086015160e085015260408601516101008501529150615b7f9050565b826101208301529998505050505050505050565b600080600060608486031215615ba857600080fd5b5050815160208301516040909301519094929350919050565b602080825282518282018190526000918401906040840190835b81811015615c1757835180516001600160a01b031684526020908101516001600160601b03168185015290930192604090920191600101615bdb565b509095945050505050565b634e487b7160e01b600052603160045260246000fd5b601f821115610eff57806000526020600020601f840160051c81016020851015615c5f5750805b601f840160051c820191505b818110156142c05760008155600101615c6b565b81516001600160401b03811115615c9857615c986153ed565b615cac81615ca6845461559f565b84615c38565b6020601f821160018114615ce05760008315615cc85750848201515b600019600385901b1c1916600184901b1784556142c0565b600084815260208120601f198516915b82811015615d105787850151825560209485019460019092019101615cf0565b5084821015615d2e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b600060ff831680615d5057615d506159d3565b8060ff8416069150509291505056fec1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a164736f6c634300081c000a