3 txs
4 calls
constructor
constructor(address _forwardVault)
functions
_solveForAmountWithIncentive
viewfunction _solveForAmountWithIncentive(uint256 _amount, int256 _incentive) view returns (uint256[] fullOrderIds, uint256[] partialOrderIds)
activeOrderCountByIncentive
viewfunction activeOrderCountByIncentive(int256) view returns (uint256)
currentOrderIdByIncentive
viewfunction currentOrderIdByIncentive(int256) view returns (uint256)
earliestValidQueMemberByIncentive
viewfunction earliestValidQueMemberByIncentive(int256) view returns (uint256)
forwardVault
viewfunction forwardVault() view returns (address)
getAllOrdersfromAddress
viewfunction getAllOrdersfromAddress(address _user) view returns (tuple[], int256[])
getAllOrdersOverall
viewfunction getAllOrdersOverall() view returns (tuple[], int256[])
getFulfillmentPlanForIncentive
viewfunction getFulfillmentPlanForIncentive(uint256 _amount, int256 _incentive, uint256 _maxOrdersToConsider) view returns (uint256[] fullOrderIds, uint256[] partialOrderIds, uint256 nextStartingId)
IERC20Decimals
viewfunction IERC20Decimals() view returns (bytes4)
incentiveAllowed
viewfunction incentiveAllowed(int256) view returns (bool)
master
viewfunction master() view returns (address)
minDepositAmount
viewfunction minDepositAmount() view returns (uint256)
negativeIncentivesNotAllowed
viewfunction negativeIncentivesNotAllowed() view returns (bool)
predictCostForTokens
viewfunction predictCostForTokens(uint256 _tokensToReceive) view returns (uint256 costInUsd, uint256 tokensAcquirable)
predictDiscountedAmount
purefunction predictDiscountedAmount(uint256 _amount, int256 _incentive) pure returns (uint256 discountedAmount)
predictTokensForCost
viewfunction predictTokensForCost(uint256 _costInUsd) view returns (uint256 tokensReceived)
proposedMaster
viewfunction proposedMaster() view returns (address)
QueMemberByIdAndIncentive
viewfunction QueMemberByIdAndIncentive(uint256, int256) view returns (address member, uint256 amount, uint256 tailPointer, uint256 headPointer)
solveForAmount
viewfunction solveForAmount(uint256 _amount) view returns (int256[] incentives, uint256[] orders, uint256[] partials)
solveForAmountWithIncentive
viewfunction solveForAmountWithIncentive(uint256 _amount, int256 _incentive) view returns (uint256[] fullOrderIds, uint256[] partialOrderIds)
totalActiveOrders
viewfunction totalActiveOrders() view returns (uint256)
usdToken
viewfunction usdToken() view returns (address)
changeMinDepositAmount
nonpayablefunction changeMinDepositAmount(uint256 _minDepositAmount)
claimOwnership
nonpayablefunction claimOwnership()
fulfillOrder
nonpayablefunction fulfillOrder(uint256 _queMemberId, int256 _incentive) returns (uint256 forwardVaultTokenAmount, uint256 stableCoinTokenAmount)
fulfillOrderBulk
nonpayablefunction fulfillOrderBulk(int256[] _incentives, uint256[] _memberIds, uint256[] _partialId, uint256 _partialAmount, uint256 _minReceiveAmount, uint256 _maxUsdToSpend) returns (uint256 vaultTokensReceived, uint256 usdSpent)
joinQue
nonpayablefunction joinQue(uint256 _amount, int256 _incentive) returns (tuple, uint256)
leaveQue
nonpayablefunction leaveQue(uint256 _queMemberId, int256 _incentive) returns (tuple, uint256 leftOverAmount)
partiallyFulfillOrder
nonpayablefunction partiallyFulfillOrder(uint256 _queMemberId, int256 _incentive, uint256 _amount) returns (uint256 forwardVaultTokenAmount, uint256 stableCoinTokenAmount)
proposeOwner
nonpayablefunction proposeOwner(address _proposedOwner)
reduceQueAmount
nonpayablefunction reduceQueAmount(uint256 _queMemberId, int256 _incentive, uint256 _reduceBy) returns (tuple, uint256 leftOverAmount)
renounceOwnership
nonpayablefunction renounceOwnership()
setNegativeIncentivesNotAllowed
nonpayablefunction setNegativeIncentivesNotAllowed(bool _negativeIncentivesNotAllowed)
events
JoinQue
event JoinQue(address indexed member, uint256 amount, int256 incentive, uint256 queMemberId)
LeaveQue
event LeaveQue(address indexed member, uint256 queMemberId, int256 incentive, uint256 amount)
MasterProposed
event MasterProposed(address indexed proposer, address indexed proposedMaster)
OrderProcessed
event OrderProcessed(address indexed fulfiller, address indexed member, uint256 queMemberId, int256 incentive, uint256 amount, bool isFullFulfill)
ReduceQueAmount
event ReduceQueAmount(address indexed member, uint256 queMemberId, int256 incentive, uint256 reduceBy)
RenouncedOwnership
event RenouncedOwnership(address indexed previousMaster)
errors
AmountReceivedTooLow
error AmountReceivedTooLow()
AmountSpentTooHigh
error AmountSpentTooHigh()
AmountTooHigh
error AmountTooHigh()
AmountTooLow
error AmountTooLow()
IncentiveMismatch
error IncentiveMismatch()
IncentiveNotAllowed
error IncentiveNotAllowed()
MemberAlreadyLeft
error MemberAlreadyLeft()
NegativeIncentiveNotAllowed
error NegativeIncentiveNotAllowed()
NoOrdersPresent
error NoOrdersPresent()
NotMaster
error NotMaster()
NotMember
error NotMember()
NotProposed
error NotProposed()
NotProxyBenefactor
error NotProxyBenefactor()
NoValue
error NoValue()
OrderNotReady
error OrderNotReady()
QueMemberIdTooHigh
error QueMemberIdTooHigh()
ZeroAmount
error ZeroAmount()
creation bytecode
0x60c060405234801561000f575f5ffd5b5060405161464938038061464983398101604081905261002e916104b4565b80338061004e5760405163f2365b5b60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0392909216919091179055600160025561007a6101f8565b6001600160a01b038116608081905260408051634e91e40960e11b81529051639d23c812916004808201926020929091908290030181865afa1580156100c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e691906104b4565b6001600160a01b031660a081905260408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f928392909161012e91906104e1565b5f60405180830381855afa9150503d805f8114610166576040519150601f19603f3d011682016040523d82523d5f602084013e61016b565b606091505b5091509150816101c15760405162461bcd60e51b815260206004820152601660248201527f4661696c656420746f2067657420646563696d616c7300000000000000000000604482015260640160405180910390fd5b808060200190518101906101d591906104f7565b6101e090600a610610565b6101eb90603261061e565b6009555061064992505050565b60408051601180825261024082019092525f9160208201610220803683370190505090505f815f8151811061022f5761022f610635565b60200260200101818152505060648160018151811061025057610250610635565b60200260200101818152505060c88160028151811061027157610271610635565b60200260200101818152505061012c8160038151811061029357610293610635565b6020026020010181815250506101f4816004815181106102b5576102b5610635565b6020026020010181815250506103e8816005815181106102d7576102d7610635565b6020026020010181815250506105dc816006815181106102f9576102f9610635565b6020026020010181815250506109c48160078151811061031b5761031b610635565b6020026020010181815250506113888160088151811061033d5761033d610635565b6020026020010181815250506063198160098151811061035f5761035f610635565b60200260200101818152505060c71981600a8151811061038157610381610635565b60200260200101818152505061012b1981600b815181106103a4576103a4610635565b6020026020010181815250506101f31981600c815181106103c7576103c7610635565b6020026020010181815250506103e71981600d815181106103ea576103ea610635565b6020026020010181815250506105db1981600e8151811061040d5761040d610635565b6020026020010181815250506109c31981600f8151811061043057610430610635565b602002602001018181525050611387198160108151811061045357610453610635565b60209081029190910101525f5b81518110156104b057600160065f84848151811061048057610480610635565b60209081029190910181015182528101919091526040015f20805460ff1916911515919091179055600101610460565b5050565b5f602082840312156104c4575f5ffd5b81516001600160a01b03811681146104da575f5ffd5b9392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215610507575f5ffd5b815160ff811681146104da575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156105665780850481111561054a5761054a610517565b600184161561055857908102905b60019390931c92800261052f565b935093915050565b5f8261057c5750600161060a565b8161058857505f61060a565b816001811461059e57600281146105a8576105c4565b600191505061060a565b60ff8411156105b9576105b9610517565b50506001821b61060a565b5060208310610133831016604e8410600b84101617156105e7575081810a61060a565b6105f35f19848461052b565b805f190482111561060657610606610517565b0290505b92915050565b5f6104da60ff84168361056e565b808202811582820484141761060a5761060a610517565b634e487b7160e01b5f52603260045260245ffd5b60805160a051613fa76106a25f395f81816106240152612e3901525f818161023501528181611669015281816116dd0152818161213401528181612a3d01528181612ade01528181612b78015261367a0152613fa75ff3fe608060405234801561000f575f5ffd5b5060043610610201575f3560e01c80639c92ce8a11610123578063d3573a33116100b8578063edf8378111610088578063f57cca911161006e578063f57cca911461060c578063f897a22b1461061f578063fd60e7b514610646575f5ffd5b8063edf8378114610595578063ee97f7f3146105ed575f5ffd5b8063d3573a33146104b7578063d4f1bc58146104d7578063dc4d5e95146104ea578063e604994e14610509575f5ffd5b8063b5ed298a116100f3578063b5ed298a1461045f578063be3ac30914610472578063c67dd64014610485578063d0262ed014610498575f5ffd5b80639c92ce8a146104105780639d90ac8d14610431578063a2544c6d14610444578063a8bff6921461044c575f5ffd5b80634dd38ae411610199578063715018a611610169578063715018a6146103c157806386074f04146103c95780638caad7b5146103dc5780638e5a1a9f146103ef575f5ffd5b80634dd38ae4146103835780634e71e0c8146103a5578063535391a0146103af578063645006ca146103b8575f5ffd5b806337efa730116101d457806337efa730146102f95780633973b98f146103215780633ef1700714610334578063492d7b1c14610356575f5ffd5b80631d9eaedb14610205578063265b1a12146102305780632c6a9b4f1461027c578063325eb232146102dc575b5f5ffd5b610218610213366004613a5e565b610659565b60405161022793929190613aaf565b60405180910390f35b6102577f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610227565b61028f61028a366004613ae7565b610676565b60408051835173ffffffffffffffffffffffffffffffffffffffff16815260208085015190820152838201519181019190915260609283015192810192909252608082015260a001610227565b600a546102e99060ff1681565b6040519015158152602001610227565b61030c610307366004613b07565b6107bd565b60408051928352602083019190915201610227565b61030c61032f366004613b71565b6107f2565b610347610342366004613b07565b610b1e565b60405161022793929190613c26565b610375610364366004613a5e565b60056020525f908152604090205481565b604051908152602001610227565b6102e9610391366004613a5e565b60066020525f908152604090205460ff1681565b6103ad610c33565b005b61037560085481565b61037560095481565b6103ad610c66565b6103756103d7366004613ae7565b610cca565b6103ad6103ea366004613a5e565b610cde565b6104026103fd366004613ae7565b610ceb565b604051610227929190613c5b565b61042361041e366004613c88565b610d03565b604051610227929190613cbb565b6103ad61043f366004613d57565b610d1a565b610423610d53565b61028f61045a366004613b07565b610d68565b6103ad61046d366004613c88565b610e9a565b610375610480366004613a5e565b610f5f565b61028f610493366004613ae7565b610fd1565b6103756104a6366004613a5e565b60076020525f908152604090205481565b6001546102579073ffffffffffffffffffffffffffffffffffffffff1681565b6104026104e5366004613ae7565b6110e8565b6103756104f8366004613a5e565b60046020525f908152604090205481565b61055e610517366004613ae7565b600360208181525f93845260408085209091529183529120805460018201546002830154929093015473ffffffffffffffffffffffffffffffffffffffff90911692919084565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152608001610227565b6105bc7f313ce567add4d438edf58b94ff345d7d38c45b17dfc0f947988d7819dca364f981565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610227565b5f546102579073ffffffffffffffffffffffffffffffffffffffff1681565b61030c61061a366004613a5e565b6111f6565b6102577f000000000000000000000000000000000000000000000000000000000000000081565b61030c610654366004613ae7565b611255565b60608060606106698460016112a1565b9250925092509193909250565b6106b360405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f6106bc611452565b6106c684846114c8565b505f83815260036020908152604080832085845290915290206001810154906106ee816114df565b6106f9858583611532565b610706858286600161155f565b61070f33611624565b61071933836116c3565b604080518681526020810186905290810183905233907fb9b571dd75d5201e8de3446f4c75e8568cbf1c0cc0580e55f81a14d5b9903d609060600160405180910390a260408051608081018252825473ffffffffffffffffffffffffffffffffffffffff16815260018301546020820152600283015491810191909152600390910154606082015291506107ad6001600255565b6107b65f611624565b9250929050565b5f5f6107c7611452565b6107d38585855f611704565b915091506107e05f611624565b6107ea6001600255565b935093915050565b5f5f6107fc611452565b5f6040518060c001604052808d8d808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505050908252506040805160208d810282810182019093528d82529283019290918e918e9182918501908490808284375f920191909152505050908252506040805160208b810282810182019093528b82529283019290918c918c9182918501908490808284375f92019190915250505090825250602080820189905260408083018990526060909201879052820151908201519192506108d69161183e565b1561090d576040517f981d21c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8160200151518110156109ea575f5f6109c08460200151848151811061093757610937613d72565b6020026020010151855f0151858151811061095457610954613d72565b602002602001015160035f8860200151888151811061097557610975613d72565b602002602001015181526020019081526020015f205f885f015188815181106109a0576109a0613d72565b602002602001015181526020019081526020015f20600101546001611704565b90925090506109cf8287613dcc565b95506109db8186613dcc565b9450505080600101905061090f565b505f816040015151118015610a0257505f8160600151115b15610a80575f5f610a6083604001515f81518110610a2257610a22613d72565b602090810291909101015184518051610a3d90600190613ddf565b81518110610a4d57610a4d613d72565b602002602001015185606001515f611704565b9092509050610a6f8286613dcc565b9450610a7b8185613dcc565b935050505b8060800151831015610abe576040517f72c05dff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060a00151821115610afc576040517f0daa287b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50610b065f611624565b610b106001600255565b995099975050505050505050565b6060805f83801580610b305750606481115b15610b39575060645b5f8681526007602052604081205490819003610b7f575050604080515f808252602080830182815283850185528983526005909152929020549094509092509050610c2a565b5f610b8a8288611852565b90505f815f015167ffffffffffffffff811115610ba957610ba9613df2565b604051908082528060200260200182016040528015610bd2578160200160208202803683370190505b505f8a8152600560205260409020546060840181905295509050895b610bfb81848c8c896118ad565b15610c1557610c0c8383838d6118fe565b96509050610bee565b610c1f83836119e7565b909850965050505050505b93509350939050565b610c3b611aeb565b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b610c6e611b3e565b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116825560018054909116905560405133917f6172baf984ea013d88b784409f46655b96ba7f2ff91bca1ac9bcd27b113e6eb091a2565b5f610cd58383611b90565b90505b92915050565b610ce6611b3e565b600955565b606080610cf884846110e8565b915091509250929050565b606080610d11836001611bb2565b91509150915091565b610d22611b3e565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b606080610d605f5f611bb2565b915091509091565b610da560405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f610dae611452565b610db9858585611ced565b5f8581526003602090815260408083208784529091529020610ddb8185611d39565b610de58185611dc6565b610dee33611624565b610df833856116c3565b604080518781526020810187905290810185905233907f3e5820dac2d2a1e9d7a5ef70398d513030c0829d3fa3ae5c91b812c1633af4649060600160405180910390a2600181015460408051608081018252835473ffffffffffffffffffffffffffffffffffffffff1681526020810183905260028401549181019190915260039092015460608301529092509050610e916001600255565b6107ea5f611624565b610ea2611b3e565b73ffffffffffffffffffffffffffffffffffffffff8116610eef576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f322fd6444c59daffa82e4689b7685b6fafc6109a1eff8a6ca10c5a8e3206cda1905f90a350565b5f8181610f6a611df9565b90505f5b6009811015610fc9578215610fc9575f5f610fa2848460098110610f9457610f94613d72565b602002015160010b86611e54565b9092509050610fb18287613dcc565b9550610fbd8186613ddf565b94505050600101610f6e565b505050919050565b61100e60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f611017611452565b600a5460ff161515600103611060575f831215611060576040517f94a3bb3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106a8484611f1b565b5f5f6110768686611f66565b9150915061108486866120d7565b61108d33611624565b6110968661211a565b604080518781526020810187905290810182905233907f2bacb630f67543e94c907fc983de496a472e0ab7cd95ddce4aed7549b277b82a9060600160405180910390a290925090506107ad6001600255565b6060805f5f5f5f6110f9888861215c565b93509350935093508067ffffffffffffffff81111561111a5761111a613df2565b604051908082528060200260200182016040528015611143578160200160208202803683370190505b5095505f5b8181101561118f5784818151811061116257611162613d72565b602002602001015187828151811061117c5761117c613d72565b6020908102919091010152600101611148565b5081156111da57604080516001808252818301909252906020808301908036833701905050945082855f815181106111c9576111c9613d72565b6020026020010181815250506111eb565b604080515f81526020810190915294505b505050509250929050565b5f5f5f5f5f61120486610659565b9250925092505f6112158385612292565b80925081975050505f5f61122d848787518c87612332565b909250905061123c8289613dcc565b97506112488184613dcc565b9650505050505050915091565b5f5f61125f611452565b5f848152600360209081526040808320868452909152902060019081015461128a9186918691611704565b915091506112975f611624565b6107b66001600255565b60608060605f6112af612380565b9050855f6112bb611df9565b90505f5b6009811080156112ce57505f83115b15611378575f5f6112f8858585600981106112eb576112eb613d72565b602002015160010b6110e8565b91509150611321868386866009811061131357611313613d72565b602002015160010b88612473565b94505f851180156113325750805115155b156113655761135b868286866009811061134e5761134e613d72565b602002015160010b61255a565b5f94505050611378565b50508061137190613e1f565b90506112bf565b5086801561138557505f82115b15611439575f6113936125ee565b90505f5b6008811080156113a657505f84115b15611436575f5f6113c3868585600881106112eb576112eb613d72565b915091506113ec87838686600881106113de576113de613d72565b602002015160010b89612473565b95505f861180156113fd5750805115155b1561142357611419878286866008811061134e5761134e613d72565b5f95505050611436565b50508061142f90613e1f565b9050611397565b50505b61144283612734565b9550955095505050509250925092565b60028054036114c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60028055565b6114d28282612964565b6114db816129aa565b5050565b805473ffffffffffffffffffffffffffffffffffffffff16331461152f576040517f291fc44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f82815260056020526040902054830361155a5760038101545f838152600560205260409020555b505050565b80156115925782546001840154611592916129f19173ffffffffffffffffffffffffffffffffffffffff90911690612a99565b61159d848484612bdf565b5f848152600360208181526040808420868552909152822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101839055600281018390550181905560088054916115fb83613e56565b90915550505f82815260076020526040812080549161161983613e56565b919050555050505050565b6040517fc849a6b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c849a6b3906024015f604051808303815f87803b1580156116aa575f5ffd5b505af11580156116bc573d5f5f3e3d5ffd5b5050505050565b6114db73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383612c5a565b5f5f61171286868686612d2e565b5f8681526003602090815260408083208884529091528120906117358688611b90565b905080156117435780611745565b855b825490915073ffffffffffffffffffffffffffffffffffffffff1661176d6129f18289612a99565b61177681611624565b611781818884612e1f565b85156117b15760038301545f898152600560205260408120919091556117ac908a9085908b9061155f565b6117ca565b86836001015f8282546117c49190613ddf565b90915550505b604080518a8152602081018a9052908101889052861515606082015273ffffffffffffffffffffffffffffffffffffffff82169033907ffbe916585c9d75b0b4ee74a38090990cc5ca465e497e24e117a4c98b262f2aaa9060800160405180910390a3508593509150505b94509492505050565b5f82515f148015610cd55750505115919050565b6118876040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f151581525090565b815f0361189657828152610cd8565b8183106118a357816118a5565b825b815292915050565b5f5f861180156118cd57505f848152600460205260409020546060860151105b80156118dd575084516040860151105b80156118f457508215806118f45750818560800151105b9695505050505050565b60608401515f908152600360209081526040808320848452909152812060018101546080870180518493929161193382613e1f565b905250600182015461195e576119498286612e6b565b60608a01919091528694509250611835915050565b8086106119c35787606001518789604001518151811061198057611980613d72565b60209081029190910101526040880180519061199b82613e1f565b9052506119a88187613ddf565b93506119b48286612e6b565b60608a019190915292506119dc565b606088015160208901819052600160a08a01525f945092505b505094509492505050565b606080836040015167ffffffffffffffff811115611a0757611a07613df2565b604051908082528060200260200182016040528015611a30578160200160208202803683370190505b5091505f5b8460400151811015611a8057838181518110611a5357611a53613d72565b6020026020010151838281518110611a6d57611a6d613d72565b6020908102919091010152600101611a35565b508360a0015115611ad35760408051600180825281830190925290602080830190803683370190505090508360200151815f81518110611ac257611ac2613d72565b6020026020010181815250506107b6565b50604080515f81526020810190915290939092509050565b60015473ffffffffffffffffffffffffffffffffffffffff163303611b0c57565b6040517ff2a87d5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5473ffffffffffffffffffffffffffffffffffffffff163303611b5e57565b6040517fb4ec2ff200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f611b9b83612eaf565b9050611baa8482612710612ede565b949350505050565b6060805f611bbe61300a565b90505f60085467ffffffffffffffff811115611bdc57611bdc613df2565b604051908082528060200260200182016040528015611c4a57816020015b611c3760405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b815260200190600190039081611bfa5790505b5090505f60085467ffffffffffffffff811115611c6957611c69613df2565b604051908082528060200260200182016040528015611c92578160200160208202803683370190505b5090505f805b8451811015611cd257611cc8858281518110611cb657611cb6613d72565b60200260200101518a8a878787613363565b9150600101611c98565b50611cde838383613448565b95509550505050509250929050565b5f8111611d26576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d308383612964565b61155a826129aa565b815473ffffffffffffffffffffffffffffffffffffffff163314611d89576040517f291fc44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001015481106114db576040517ffd7850ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd36129f13383612a99565b80826001015f828254611de69190613ddf565b909155505060018201546114db906135a3565b611e016139e6565b50604080516101208101825261138881526109c460208201526105dc918101919091526103e860608201526101f4608082015261012c60a082015260c860c0820152606460e08201525f61010082015290565b5f828152600560209081526040808320546004909252822054829190845b8183108015611e8057505f81115b15611f05575f8381526003602090815260408083208a845290915290206001810154611eb157600301549250611e72565b5f5f611ebe838b866135df565b9092509050611ecd8289613dcc565b9750611ed98185613ddf565b9350611ee983600101548b611b90565b811015611ef857505050611f05565b5050600301549250611e72565b611f0f8187613ddf565b93505050509250929050565b5f8211611f54576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f5d816129aa565b6114db826135a3565b611fa360405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f8281526004602090815260408083205480845260038352818420868552909252822060028101549192909190611fdb846001613dcc565b6040805160808101825233815260208082018b8152828401878152606084018681525f8b815260038086528782208f83528652878220875181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559451600186015592516002850155905192909101919091556004909152919091205490965090915082101561209f575f8281526003602081815260408084208a8552909152909120018490555b5f9081526003602090815260408083209783529681528682206002018590556004905294909420805460010190555090939092509050565b6120e461362e3384612a99565b60088054905f6120f383613e1f565b90915550505f81815260076020526040812080549161211183613e1f565b91905055505050565b61152f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a9565b5f8181526007602052604081205460609190819081908067ffffffffffffffff81111561218b5761218b613df2565b6040519080825280602002602001820160405280156121b4578160200160208202803683370190505b505f87815260056020526040902054909550875b5f811180156121e357505f8881526004602052604090205482105b80156121ee57508284105b15612286575f8281526003602090815260408083208b84529091529020600181015461221f576003015491506121c8565b80600101548210612273578288868151811061223d5761223d613d72565b60209081029190910101528461225281613e1f565b9550508060010154826122659190613ddf565b915080600301549250612280565b8296506001955050612286565b506121c8565b50505092959194509250565b5f80805b845181101561232a575f8582815181106122b2576122b2613d72565b602002602001015190505f8583815181106122cf576122cf613d72565b6020908102919091018101515f84815260038352604080822083835290935291909120600101549091506123038183611b90565b61230d9087613dcc565b95506123198186613dcc565b945050600190920191506122969050565b509250929050565b5f5f5f87511115612376575f86868151811061235057612350613d72565b6020026020010151905083856123669190613ddf565b91506123728282611b90565b9250505b9550959350505050565b612388613a05565b612390611df9565b815260085467ffffffffffffffff8111156123ad576123ad613df2565b6040519080825280602002602001820160405280156123d6578160200160208202803683370190505b50602082015260085467ffffffffffffffff8111156123f7576123f7613df2565b604051908082528060200260200182016040528015612420578160200160208202803683370190505b50604082015260085467ffffffffffffffff81111561244157612441613df2565b60405190808252806020026020018201604052801561246a578160200160208202803683370190505b50606082015290565b805f5b8451811015612551578115612551575f85828151811061249857612498613d72565b6020908102919091018101515f81815260038352604080822089835290935291909120600101549091508015806124ce57508381115b156124da575050612549565b8588602001518960800151815181106124f5576124f5613d72565b60200260200101818152505081886040015189608001518151811061251c5761251c613d72565b60209081029190910101526080880180519061253782613e1f565b9052506125448185613ddf565b935050505b600101612476565b50949350505050565b81511561155a57815f8151811061257357612573613d72565b602002602001015183606001518460a001518151811061259557612595613d72565b6020026020010181815250508083602001518460a0015185608001516125bb9190613dcc565b815181106125cb576125cb613d72565b602090810291909101015260a083018051906125e682613e1f565b905250505050565b6125f6613a3f565b5060408051610100810182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c81527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3860208201527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed4918101919091527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0c60608201527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1860808201527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2460a08201527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63c60c08201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec7860e082015290565b60608060608360a00151846080015161274d9190613dcc565b67ffffffffffffffff81111561276557612765613df2565b60405190808252806020026020018201604052801561278e578160200160208202803683370190505b509250836080015167ffffffffffffffff8111156127ae576127ae613df2565b6040519080825280602002602001820160405280156127d7578160200160208202803683370190505b5091508360a0015167ffffffffffffffff8111156127f7576127f7613df2565b604051908082528060200260200182016040528015612820578160200160208202803683370190505b5090505f5b84608001518110156128b0578460200151818151811061284757612847613d72565b602002602001015184828151811061286157612861613d72565b6020026020010181815250508460400151818151811061288357612883613d72565b602002602001015183828151811061289d5761289d613d72565b6020908102919091010152600101612825565b505f5b8460a0015181101561295c5784602001518186608001516128d49190613dcc565b815181106128e4576128e4613d72565b6020026020010151848287608001516128fd9190613dcc565b8151811061290d5761290d613d72565b6020026020010181815250508460600151818151811061292f5761292f613d72565b602002602001015182828151811061294957612949613d72565b60209081029190910101526001016128b3565b509193909250565b5f8181526004602052604090205482106114db576040517f3f6fa84e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526006602052604090205460ff1661152f576040517f803e0be700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb387cdfc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063b387cdfc906044015b5f604051808303815f87803b158015612a7f575f5ffd5b505af1158015612a91573d5f5f3e3d5ffd5b505050505050565b6040517fc849a6b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c849a6b3906024015f604051808303815f87803b158015612b1f575f5ffd5b505af1158015612b31573d5f5f3e3d5ffd5b50506040517f67bbdfaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001692506367bbdfaf91506024015f604051808303815f87803b158015612bbb575f5ffd5b505af1158015612bcd573d5f5f3e3d5ffd5b5050505061155a82828563ffffffff16565b5f818152600560205260409020548303612c17576003918201545f818152602093845260408082209382529290935291206002015550565b600380830154600293840180545f908152602084815260408083208784528252808320860185905592549382529384528181209481529390925291209091015550565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261155a9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613707565b612d388484612964565b80612dca575f8211612d76576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8481526003602090815260408083208684529091529020600101548210612dca576040517ffd7850ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd3836129aa565b5f838152600560205260409020548414612e19576040517f159460f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b612e6173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163385846136a9565b61155a33836116c3565b60038201545f811580612e8b57505f838152600460205260409020548210155b15612ea65750505f81815260046020526040902054806107b6565b50809250929050565b5f5f821215612ed257612ec182613e8a565b612ecd90612710613dcc565b610cd8565b610cd882612710613ddf565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f03612f3457838281612f2a57612f2a613ec0565b0492505050613003565b808411612f9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016114b9565b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b60408051601180825261024082019092526060915f91906020820161022080368337019050509050611388815f8151811061304757613047613d72565b6020026020010181815250506109c48160018151811061306957613069613d72565b6020026020010181815250506105dc8160028151811061308b5761308b613d72565b6020026020010181815250506103e8816003815181106130ad576130ad613d72565b6020026020010181815250506101f4816004815181106130cf576130cf613d72565b60200260200101818152505061012c816005815181106130f1576130f1613d72565b60200260200101818152505060c88160068151811061311257613112613d72565b60200260200101818152505060648160078151811061313357613133613d72565b6020026020010181815250505f8160088151811061315357613153613d72565b6020026020010181815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8160098151811061319357613193613d72565b6020026020010181815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3881600a815181106131d3576131d3613d72565b6020026020010181815250507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed481600b8151811061321357613213613d72565b6020026020010181815250507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0c81600c8151811061325357613253613d72565b6020026020010181815250507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1881600d8151811061329357613293613d72565b6020026020010181815250507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2481600e815181106132d3576132d3613d72565b6020026020010181815250507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63c81600f8151811061331357613313613d72565b6020026020010181815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec788160108151811061335357613353613d72565b6020908102919091010152919050565b5f8681526004602052604081205482915b8181101561343c575f8181526003602090815260408083208c8452909152902061339f818a8a613814565b156134335760408051608081018252825473ffffffffffffffffffffffffffffffffffffffff168152600183015460208201526002830154918101919091526003820154606082015287518890869081106133fc576133fc613d72565b60200260200101819052508986858151811061341a5761341a613d72565b60209081029190910101528361342f81613e1f565b9450505b50600101613374565b50509695505050505050565b6060808267ffffffffffffffff81111561346457613464613df2565b6040519080825280602002602001820160405280156134d257816020015b6134bf60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b8152602001906001900390816134825790505b5091508267ffffffffffffffff8111156134ee576134ee613df2565b604051908082528060200260200182016040528015613517578160200160208202803683370190505b5090505f5b8381101561359a5785818151811061353657613536613d72565b602002602001015183828151811061355057613550613d72565b602002602001018190525084818151811061356d5761356d613d72565b602002602001015182828151811061358757613587613d72565b602090810291909101015260010161351c565b50935093915050565b60095481101561152f576040517f1fbaba3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f6135f0866001015486611b90565b9050808410613608578560010154925080915061359a565b5f61361286612eaf565b90506136218561271083612ede565b9794965093945050505050565b6040517f2c12c07400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690632c12c07490604401612a68565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e199085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612cac565b5f613768826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661387b9092919063ffffffff16565b905080515f14806137885750808060200190518101906137889190613eed565b61155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016114b9565b5f8161384857835473ffffffffffffffffffffffffffffffffffffffff161580159061384357505f8460010154115b611baa565b835473ffffffffffffffffffffffffffffffffffffffff8481169116148015611baa57505f846001015411949350505050565b6060611baa84845f85855f5f8673ffffffffffffffffffffffffffffffffffffffff1685876040516138ad9190613f08565b5f6040518083038185875af1925050503d805f81146138e7576040519150601f19603f3d011682016040523d82523d5f602084013e6138ec565b606091505b50915091506138fd87838387613908565b979650505050505050565b6060831561399d5782515f036139965773ffffffffffffffffffffffffffffffffffffffff85163b613996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016114b9565b5081611baa565b611baa83838151156139b25781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99190613f1e565b6040518061012001604052806009906020820280368337509192915050565b6040518060c00160405280613a186139e6565b81526020016060815260200160608152602001606081526020015f81526020015f81525090565b6040518061010001604052806008906020820280368337509192915050565b5f60208284031215613a6e575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b82811015613aa5578151865260209586019590910190600101613a87565b5093949350505050565b606081525f613ac16060830186613a75565b8281036020840152613ad38186613a75565b905082810360408401526118f48185613a75565b5f5f60408385031215613af8575f5ffd5b50508035926020909101359150565b5f5f5f60608486031215613b19575f5ffd5b505081359360208301359350604090920135919050565b5f5f83601f840112613b40575f5ffd5b50813567ffffffffffffffff811115613b57575f5ffd5b6020830191508360208260051b85010111156107b6575f5ffd5b5f5f5f5f5f5f5f5f5f60c08a8c031215613b89575f5ffd5b893567ffffffffffffffff811115613b9f575f5ffd5b613bab8c828d01613b30565b909a5098505060208a013567ffffffffffffffff811115613bca575f5ffd5b613bd68c828d01613b30565b90985096505060408a013567ffffffffffffffff811115613bf5575f5ffd5b613c018c828d01613b30565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b606081525f613c386060830186613a75565b8281036020840152613c4a8186613a75565b915050826040830152949350505050565b604081525f613c6d6040830185613a75565b8281036020840152613c7f8185613a75565b95945050505050565b5f60208284031215613c98575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114613003575f5ffd5b604080825283519082018190525f9060208501906060840190835b81811015613d3657613d2083855173ffffffffffffffffffffffffffffffffffffffff81511682526020810151602083015260408101516040830152606081015160608301525050565b6020939093019260809290920191600101613cd6565b505083810360208501526118f48186613a75565b801515811461152f575f5ffd5b5f60208284031215613d67575f5ffd5b813561300381613d4a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610cd857610cd8613d9f565b81810381811115610cd857610cd8613d9f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e4f57613e4f613d9f565b5060010190565b5f81613e6457613e64613d9f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613eba57613eba613d9f565b505f0390565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60208284031215613efd575f5ffd5b815161300381613d4a565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509291505056fea26469706673582212209edc64fc18913c2cc8bb2370e4b488d83d4aa620c89f29403e55aa2dc0fc8de664736f6c634300081d003300000000000000000000000011ceee394842d9492f2c97050f66de0e3f89d3a6