From a980fc432aa3579adca968791b03ce89b431016d Mon Sep 17 00:00:00 2001 From: ts0yu <120932697+ts0yu@users.noreply.github.com> Date: Tue, 17 Sep 2024 19:24:02 +0000 Subject: [PATCH] feat: default arbitrageur -> fixed arbitrageur --- contracts/utils/src/ArenaController.sol | 107 ++++++++++++++++++++++ src/arena.rs | 14 ++- src/artifacts/ArenaController.json | 2 +- src/engine/arbitrageur.rs | 112 +++--------------------- src/lib.rs | 28 ++++-- 5 files changed, 150 insertions(+), 113 deletions(-) diff --git a/contracts/utils/src/ArenaController.sol b/contracts/utils/src/ArenaController.sol index 10de788..dade926 100644 --- a/contracts/utils/src/ArenaController.sol +++ b/contracts/utils/src/ArenaController.sol @@ -9,10 +9,15 @@ import {IHooks} from "v4-core/interfaces/IHooks.sol"; import {IPoolManager} from "v4-core/interfaces/IPoolManager.sol"; import {LiquidExchange} from "./LiquidExchange.sol"; import {Fetcher} from "./Fetcher.sol"; +import {FullMath} from "v4-core/libraries/FullMath.sol"; +import {SqrtPriceMath} from "v4-core/libraries/SqrtPriceMath.sol"; +import {PoolSwapTest} from "v4-core/test/PoolSwapTest.sol"; +import {TickMath} from "v4-core/libraries/TickMath.sol"; contract ArenaController { PoolManager immutable poolManager; PoolModifyLiquidityTest immutable router; + PoolSwapTest immutable swapRouter; LiquidExchange immutable lex; Fetcher immutable fetcher; @@ -21,6 +26,11 @@ contract ArenaController { PoolKey public poolKey; + uint256 internal constant MAX_SWAP_FEE = 1e6; + + uint160 public constant MIN_PRICE_LIMIT = TickMath.MIN_SQRT_PRICE + 1; + uint160 public constant MAX_PRICE_LIMIT = TickMath.MAX_SQRT_PRICE - 1; + struct Signal { int24 currentTick; uint160 sqrtPriceX96; @@ -33,6 +43,7 @@ contract ArenaController { constructor(uint256 fee, uint256 initialPrice) { poolManager = new PoolManager(fee); router = new PoolModifyLiquidityTest(poolManager); + swapRouter = new PoolSwapTest(poolManager); fetcher = new Fetcher(); currency0 = new ArenaToken("currency0", "c0", 18); @@ -69,6 +80,44 @@ contract ArenaController { lex.swap(tokenIn, amountIn); } + function equalizePrice() public { + require(currency0.approve(address(swapRouter), type(uint256).max), "Approval for currency0 failed"); + require(currency1.approve(address(swapRouter), type(uint256).max), "Approval for currency1 failed"); + + (uint160 sqrtPriceX96, int24 tick,,) = fetcher.getSlot0(poolManager, fetcher.toId(poolKey)); + + uint256 uniswapPrice = FullMath.mulDiv(sqrtPriceX96, sqrtPriceX96, 1 << 192) * 1e18; + uint256 lexPrice = lex.price(); + + if (uniswapPrice > lexPrice) { + bool zeroForOne = true; + + IPoolManager.SwapParams memory params = IPoolManager.SwapParams({ + zeroForOne: zeroForOne, + amountSpecified: 1000000, + sqrtPriceLimitX96: zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT // unlimited impact + }); + + PoolSwapTest.TestSettings memory testSettings = + PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false}); + + swapRouter.swap(poolKey, params, testSettings, ""); + } else if (uniswapPrice < lexPrice) { + bool zeroForOne = false; + + IPoolManager.SwapParams memory params = IPoolManager.SwapParams({ + zeroForOne: zeroForOne, + amountSpecified: 10000, + sqrtPriceLimitX96: zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT // unlimited impact + }); + + PoolSwapTest.TestSettings memory testSettings = + PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false}); + + swapRouter.swap(poolKey, params, testSettings, ""); + } + } + function setPool(uint24 poolFee, int24 tickSpacing, IHooks hooks, uint160 sqrtPriceX96, bytes memory hookData) public { @@ -101,4 +150,62 @@ contract ArenaController { router.modifyLiquidity(poolKey, params, ""); } + + function computeSwapStep( + uint160 sqrtPriceCurrentX96, + uint160 sqrtPriceTargetX96, + uint128 liquidity, + int256 amountRemaining, + uint24 feePips + ) external pure returns (uint160 sqrtPriceNextX96, uint256 amountIn, uint256 amountOut, uint256 feeAmount) { + unchecked { + uint256 _feePips = feePips; // upcast once and cache + bool zeroForOne = sqrtPriceCurrentX96 >= sqrtPriceTargetX96; + bool exactIn = amountRemaining < 0; + + if (exactIn) { + uint256 amountRemainingLessFee = + FullMath.mulDiv(uint256(-amountRemaining), MAX_SWAP_FEE - _feePips, MAX_SWAP_FEE); + amountIn = zeroForOne + ? SqrtPriceMath.getAmount0Delta(sqrtPriceTargetX96, sqrtPriceCurrentX96, liquidity, true) + : SqrtPriceMath.getAmount1Delta(sqrtPriceCurrentX96, sqrtPriceTargetX96, liquidity, true); + if (amountRemainingLessFee >= amountIn) { + // `amountIn` is capped by the target price + sqrtPriceNextX96 = sqrtPriceTargetX96; + feeAmount = _feePips == MAX_SWAP_FEE + ? amountIn // amountIn is always 0 here, as amountRemainingLessFee == 0 and amountRemainingLessFee >= amountIn + : FullMath.mulDivRoundingUp(amountIn, _feePips, MAX_SWAP_FEE - _feePips); + } else { + // exhaust the remaining amount + amountIn = amountRemainingLessFee; + sqrtPriceNextX96 = SqrtPriceMath.getNextSqrtPriceFromInput( + sqrtPriceCurrentX96, liquidity, amountRemainingLessFee, zeroForOne + ); + // we didn't reach the target, so take the remainder of the maximum input as fee + feeAmount = uint256(-amountRemaining) - amountIn; + } + amountOut = zeroForOne + ? SqrtPriceMath.getAmount1Delta(sqrtPriceNextX96, sqrtPriceCurrentX96, liquidity, false) + : SqrtPriceMath.getAmount0Delta(sqrtPriceCurrentX96, sqrtPriceNextX96, liquidity, false); + } else { + amountOut = zeroForOne + ? SqrtPriceMath.getAmount1Delta(sqrtPriceTargetX96, sqrtPriceCurrentX96, liquidity, false) + : SqrtPriceMath.getAmount0Delta(sqrtPriceCurrentX96, sqrtPriceTargetX96, liquidity, false); + if (uint256(amountRemaining) >= amountOut) { + // `amountOut` is capped by the target price + sqrtPriceNextX96 = sqrtPriceTargetX96; + } else { + // cap the output amount to not exceed the remaining output amount + amountOut = uint256(amountRemaining); + sqrtPriceNextX96 = + SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtPriceCurrentX96, liquidity, amountOut, zeroForOne); + } + amountIn = zeroForOne + ? SqrtPriceMath.getAmount0Delta(sqrtPriceNextX96, sqrtPriceCurrentX96, liquidity, true) + : SqrtPriceMath.getAmount1Delta(sqrtPriceCurrentX96, sqrtPriceNextX96, liquidity, true); + // `feePips` cannot be `MAX_SWAP_FEE` for exact out + feeAmount = FullMath.mulDivRoundingUp(amountIn, _feePips, MAX_SWAP_FEE - _feePips); + } + } + } } diff --git a/src/arena.rs b/src/arena.rs index 07446f6..c1420e7 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -1,8 +1,11 @@ use std::collections::HashMap; -use alloy::{primitives::Uint, providers::ProviderBuilder, signers::local::PrivateKeySigner}; -use alloy::providers::WalletProvider; -use alloy::providers::Provider; +use alloy::{ + primitives::Uint, + providers::{Provider, ProviderBuilder, WalletProvider}, + signers::local::PrivateKeySigner, +}; + use super::*; use crate::{ config::Config, @@ -46,7 +49,7 @@ impl Arena { Uint::from(0), Signed::try_from(2).unwrap(), Address::default(), - Uint::from(79228162514264337593543950336_u128), + Uint::from(24028916059024274524587271040_u128), Bytes::new(), ) .send() @@ -74,6 +77,7 @@ impl Arena { signal.pool, signal.fetcher, self.feed.current_value(), + *controller.address(), ); strategy @@ -97,6 +101,7 @@ impl Arena { signal.pool, signal.fetcher, self.feed.current_value(), + *controller.address(), ); self.arbitrageur.init(&signal, admin_provider.clone()).await; @@ -136,6 +141,7 @@ impl Arena { signal.pool, signal.fetcher, self.feed.current_value(), + *controller.address(), ); strategy diff --git a/src/artifacts/ArenaController.json b/src/artifacts/ArenaController.json index c198195..396ef81 100644 --- a/src/artifacts/ArenaController.json +++ b/src/artifacts/ArenaController.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"fee","type":"uint256","internalType":"uint256"},{"name":"initialPrice","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"addLiquidity","inputs":[{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"constructSignal","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct ArenaController.Signal","components":[{"name":"currentTick","type":"int24","internalType":"int24"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"manager","type":"address","internalType":"address"},{"name":"lexPrice","type":"uint256","internalType":"uint256"},{"name":"pool","type":"tuple","internalType":"struct PoolKey","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}]},{"name":"fetcher","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"poolKey","inputs":[],"outputs":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"stateMutability":"view"},{"type":"function","name":"setPool","inputs":[{"name":"poolFee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPrice","inputs":[{"name":"price","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"swapOnLex","inputs":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x610140604052348015610010575f80fd5b506040516194da3803806194da83398101604081905261002f9161044f565b8160405161003c9061040e565b908152602001604051809103905ff08015801561005b573d5f803e3d5ffd5b506001600160a01b031660808190526040516100769061041b565b6001600160a01b039091168152602001604051809103905ff08015801561009f573d5f803e3d5ffd5b506001600160a01b031660a0526040516100b890610428565b604051809103905ff0801580156100d1573d5f803e3d5ffd5b506001600160a01b031660e0526040516012906100ed90610435565b606080825260099082015268063757272656e6379360bc1b608082015260a06020820181905260029082015261063360f41b60c082015260ff909116604082015260e001604051809103905ff08015801561014a573d5f803e3d5ffd5b506001600160a01b03166101005260405160129061016790610435565b60608082526009908201526863757272656e63793160b81b608082015260a06020820181905260029082015261633160f01b60c082015260ff909116604082015260e001604051809103905ff0801580156101c4573d5f803e3d5ffd5b506001600160a01b0390811661012081905261010051909116111561020057610120805161010080516001600160a01b03908116909352911690525b61010051610120518260405161021590610442565b6001600160a01b0393841681529290911660208301526040820152606001604051809103905ff08015801561024c573d5f803e3d5ffd5b506001600160a01b0390811660c052610100516040516340c10f1960e01b8152306004820152655af3107a400060248201529116906340c10f19906044016020604051808303815f875af11580156102a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ca9190610471565b61032f5760405162461bcd60e51b815260206004820152602b60248201527f4d696e74696e672063757272656e63793020746f206c6971756964206578636860448201526a185b99d94819985a5b195960aa1b60648201526084015b60405180910390fd5b610120516040516340c10f1960e01b8152306004820152655af3107a400060248201526001600160a01b03909116906340c10f19906044016020604051808303815f875af1158015610383573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a79190610471565b6104075760405162461bcd60e51b815260206004820152602b60248201527f4d696e74696e672063757272656e63793120746f206c6971756964206578636860448201526a185b99d94819985a5b195960aa1b6064820152608401610326565b5050610497565b61502b8061143b83390190565b6116ad8061646683390190565b6105bc80617b1383390190565b610eea806180cf83390190565b61052180618fb983390190565b5f8060408385031215610460575f80fd5b505080516020909101519092909150565b5f60208284031215610481575f80fd5b81518015158114610490575f80fd5b9392505050565b60805160a05160c05160e0516101005161012051610f1061052b5f395f818161059c0152818161079c015261094801525f81816104bd015281816106a0015261091901525f8181610232015261046f01525f818161039501528181610a8e0152610b0f01525f81816106710152818161076d015261089101525f818161025b0152818161036601526109f70152610f105ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c8063014807031461006457806306ba06fa146100fe578063182148ef146101135780636af577411461018c57806391b7f5ed1461019f57806396f5e27c146101b2575b5f80fd5b61006c6101c5565b604080518251600290810b82526020808501516001600160a01b03908116828501528585015181168486015260608087015181860152608080880151805184168288015293840151831660a0808801919091529684015162ffffff1660c08701529083015190930b60e08501529101518116610100830152919092015116610120820152610140015b60405180910390f35b61011161010c366004610b73565b610499565b005b5f546001546002805461014c936001600160a01b03908116938082169362ffffff600160a01b83041693600160b81b909204900b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a0016100f5565b61011161019a366004610bea565b61090d565b6101116101ad366004610ce6565b610a78565b6101116101c0366004610cfd565b610ae9565b6040805160c0810182525f80825260208083018290528284018290526060808401839052845160a080820187528482529281018490528086018490529081018390526080808201849052840152820181905291516332c961d960e01b815290919081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e631bcbf907f00000000000000000000000000000000000000000000000000000000000000009083906332c961d990610291908790600401610d6c565b602060405180830381865afa1580156102ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d09190610d80565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401608060405180830381865afa158015610317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610d97565b5050915091506040518060c001604052808260020b8152602001836001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104139190610d80565b81526040805160a0810182525f546001600160a01b03908116825260015480821660208481019190915262ffffff600160a01b83041684860152600160b81b909104600290810b606085015254821660808401528401919091527f0000000000000000000000000000000000000000000000000000000000000000169101529392505050565b5f83131561065a576040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f9190610df3565b6105805760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637930206661696c6564000000000000000060448201526064015b60405180910390fd5b6040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af11580156105ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060e9190610df3565b61065a5760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637931206661696c656400000000000000006044820152606401610577565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af11580156106e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070a9190610df3565b6107565760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637930206661696c65640000006044820152606401610577565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af11580156107e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108069190610df3565b6108525760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637931206661696c65640000006044820152606401610577565b60408051608081018252600284810b825283900b60208201528082018590525f606082018190529151632d35e7ed60e11b815290916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691635a6bcfda916108c6918590600401610e19565b6020604051808303815f875af11580156108e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109069190610d80565b5050505050565b6040805160a0810182527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081168083527f000000000000000000000000000000000000000000000000000000000000000082166020840181905262ffffff8a811685870181905260028b810b60608801528a861660809097018790525f80546001600160a01b03199081169096178155600180546001600160b81b031916909517600160a01b9093029290921762ffffff60b81b1916600160b81b938d16939093029290921790925580549092169093179055915163695c5bf560e01b81527f00000000000000000000000000000000000000000000000000000000000000009092169163695c5bf591610a309186908690600401610e6a565b6020604051808303815f875af1158015610a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a709190610ebf565b505050505050565b6040516391b7f5ed60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391b7f5ed906024015f604051808303815f87803b158015610ad7575f80fd5b505af1158015610906573d5f803e3d5ffd5b60405163d004f0f760e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d004f0f7906044015f604051808303815f87803b158015610b50575f80fd5b505af1158015610a70573d5f803e3d5ffd5b8060020b8114610b70575f80fd5b50565b5f805f60608486031215610b85575f80fd5b833592506020840135610b9781610b62565b91506040840135610ba781610b62565b809150509250925092565b62ffffff81168114610b70575f80fd5b6001600160a01b0381168114610b70575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a08688031215610bfe575f80fd5b8535610c0981610bb2565b94506020860135610c1981610b62565b93506040860135610c2981610bc2565b92506060860135610c3981610bc2565b9150608086013567ffffffffffffffff811115610c54575f80fd5b8601601f81018813610c64575f80fd5b803567ffffffffffffffff811115610c7e57610c7e610bd6565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610cad57610cad610bd6565b6040528181528282016020018a1015610cc4575f80fd5b816020840160208301375f602083830101528093505050509295509295909350565b5f60208284031215610cf6575f80fd5b5035919050565b5f8060408385031215610d0e575f80fd5b8235610d1981610bc2565b946020939093013593505050565b80546001600160a01b0390811683526001820154808216602085015260a081901c62ffffff16604085015260b81c600290810b60608501529091015416608090910152565b60a08101610d7a8284610d27565b92915050565b5f60208284031215610d90575f80fd5b5051919050565b5f805f8060808587031215610daa575f80fd5b8451610db581610bc2565b6020860151909450610dc681610b62565b6040860151909350610dd781610bb2565b6060860151909250610de881610bb2565b939692955090935050565b5f60208284031215610e03575f80fd5b81518015158114610e12575f80fd5b9392505050565b610e238184610d27565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b610e748185610d27565b60018060a01b03831660a082015260e060c08201525f82518060e0840152806020850161010085015e5f6101008285010152610100601f19601f830116840101915050949350505050565b5f60208284031215610ecf575f80fd5b8151610e1281610b6256fea26469706673582212206a60d32d1d2b9350429ebf11063aba0768a76fe5b208b88035f661c9182d5ff964736f6c634300081a003360c0604052348015600e575f80fd5b5060405161502b38038061502b833981016040819052602b916077565b5f80546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350608052503060a052608d565b5f602082840312156086575f80fd5b5051919050565b60805160a051614f766100b55f395f6117e201525f818161220b01526122490152614f765ff3fe6080604052600436106101fb575f3560e01c80635a6bcfda11610113578063a58411941161009d578063f135baaa1161006d578063f135baaa14610641578063f2fde38b14610660578063f3cd914c1461067f578063f5298aca1461069e578063fe99049a146106bd575f80fd5b8063a5841194146105ab578063b6363cf2146105ca578063dbd035ff14610603578063f02de3b214610622575f80fd5b806380f0b44c116100e357806380f0b44c146104ed5780638161b8741461050c5780638da5cb5b1461052b57806397e8cd4e146105615780639bf6645f1461058c575f80fd5b80635a6bcfda1461046657806360460f061461049a578063695c5bf5146104af5780637e87ce7d146104ce575f80fd5b8063234266d711610194578063426a849311610164578063426a8493146103a157806348c89491146103c057806352759651146103ec578063558a72971461040b578063598af9e71461042a575f80fd5b8063234266d7146103245780632d7713891461034357806335fd631a146103625780633dd45adb1461038e575f80fd5b80630b0d9c09116101cf5780630b0d9c09146102bd57806311da60b4146102de578063156e29f6146102e65780631e2eaeaf14610305575f80fd5b8062fdd58e146101ff57806301ffc9a71461024857806307eff0dd14610277578063095bcdb61461029e575b5f80fd5b34801561020a575f80fd5b50610235610219366004614397565b600460209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b348015610253575f80fd5b506102676102623660046143c1565b6106dc565b604051901515815260200161023f565b348015610282575f80fd5b5061028b600181565b60405160029190910b815260200161023f565b3480156102a9575f80fd5b506102676102b83660046143e8565b610712565b3480156102c8575f80fd5b506102dc6102d736600461441a565b6107b9565b005b61023561080a565b3480156102f1575f80fd5b506102dc6103003660046143e8565b61083c565b348015610310575f80fd5b5061023561031f366004614458565b610887565b34801561032f575f80fd5b5061023561033e3660046145d7565b610891565b34801561034e575f80fd5b506102dc61035d36600461463b565b610941565b34801561036d575f80fd5b5061038161037c366004614656565b6109d7565b60405161023f9190614676565b61023561039c36600461463b565b610a14565b3480156103ac575f80fd5b506102676103bb3660046143e8565b610a46565b3480156103cb575f80fd5b506103df6103da3660046146b8565b610aaa565b60405161023f91906146f6565b3480156103f7575f80fd5b506102dc61040636600461472b565b610b6d565b348015610416575f80fd5b5061026761042536600461476c565b610bdc565b348015610435575f80fd5b5061023561044436600461441a565b600560209081525f938452604080852082529284528284209052825290205481565b348015610471575f80fd5b50610485610480366004614796565b610c4b565b6040805192835260208301919091520161023f565b3480156104a5575f80fd5b5061028b617fff81565b3480156104ba575f80fd5b5061028b6104c9366004614838565b610dde565b3480156104d9575f80fd5b506102dc6104e836600461472b565b610fcd565b3480156104f8575f80fd5b506102dc610507366004614397565b61107f565b348015610517575f80fd5b5061023561052636600461441a565b6110f2565b348015610536575f80fd5b505f54610549906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b34801561056c575f80fd5b5061023561057b36600461463b565b60016020525f908152604090205481565b348015610597575f80fd5b506103816105a636600461487f565b611181565b3480156105b6575f80fd5b506102dc6105c536600461463b565b6111ba565b3480156105d5575f80fd5b506102676105e43660046148ee565b600360209081525f928352604080842090915290825290205460ff1681565b34801561060e575f80fd5b5061038161061d36600461487f565b6111f6565b34801561062d575f80fd5b50600254610549906001600160a01b031681565b34801561064c575f80fd5b5061023561065b366004614458565b61122d565b34801561066b575f80fd5b506102dc61067a36600461463b565b611237565b34801561068a575f80fd5b50610235610699366004614925565b6112c9565b3480156106a9575f80fd5b506102dc6106b83660046143e8565b61140f565b3480156106c8575f80fd5b506102676106d73660046149c3565b611454565b5f6301ffc9a760e01b6001600160e01b03198316148061070c5750630f632fb360e01b6001600160e01b03198316145b92915050565b335f90815260046020908152604080832085845290915281208054839190839061073d908490614a1a565b90915550506001600160a01b0384165f90815260046020908152604080832086845290915281208054849290610774908490614a2d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020614ee183398151915291015b60405180910390a45060015b9392505050565b5f80516020614f018339815191525c6107dc576107dc6354e3ca0d60e01b6115b3565b6107f1836107e9836115bb565b5f03336115db565b6108056001600160a01b038416838361162e565b505050565b5f5f80516020614f018339815191525c61082e5761082e6354e3ca0d60e01b6115b3565b610837336116c2565b905090565b5f80516020614f018339815191525c61085f5761085f6354e3ca0d60e01b6115b3565b8161086d816107e9846115bb565b610881846001600160a01b03831684611765565b50505050565b5f81545f5260205ff35b5f5f80516020614f018339815191525c6108b5576108b56354e3ca0d60e01b6115b3565b6108bd6117d7565b5f6108dc6108cc8860a0902090565b5f90815260066020526040902090565b90506108e781611819565b6080870151610903906001600160a01b0316888888888861183d565b61090e8187876118ba565b915061091b87833361196d565b6080870151610937906001600160a01b03168888888888611995565b5095945050505050565b5f546001600160a01b0316331461098e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517fb4bd8ef53df690b9943d3318996006dbb82a25f54719d8c8035b516a2a5b8acc905f90a250565b6060604051808360051b6020835284602084015260408301925080830190505b855483526020830192506001860195508083106109f75781810382f35b5f5f80516020614f018339815191525c610a3857610a386354e3ca0d60e01b6115b3565b61070c826116c2565b919050565b335f8181526005602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906107a69087815260200190565b60605f80516020614f018339815191525c15610ad057610ad06328486b6360e11b6115b3565b610ad8611a07565b6040516348eeb9a360e11b815233906391dd734690610afd9086908690600401614a68565b5f604051808303815f875af1158015610b18573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b3f9190810190614a7b565b90505f80516020614f218339815191525c15610b6557610b65635212cba160e01b6115b3565b61070c611a1a565b604082015162ffffff1662800000141580610b9e575081608001516001600160a01b0316336001600160a01b031614155b15610bb357610bb36330d2164160e01b6115b3565b610bc18162ffffff16611a2c565b60a082205f8181526006602052604090206108059083611a52565b335f8181526003602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f805f80516020614f018339815191525c610c7057610c706354e3ca0d60e01b6115b3565b610c786117d7565b60a086205f818152600660205260409020610c9281611819565b6080880151610cad906001600160a01b031689898989611a6d565b5f610d146040518060c00160405280336001600160a01b031681526020018a5f015160020b81526020018a6020015160020b8152602001610cf18b60400151611b6f565b600f0b81526060808d015160020b60208301528b01516040909101528390611b8b565b94509050610d228185611f05565b9450336001600160a01b0316837f541c041c2cce48e614b3de043c9280f06b6164c0a1741649e2de3c3d375f79748a5f01518b602001518c60400151604051610d8693929190600293840b81529190920b6020820152604081019190915260600190565b60405180910390a360808901515f90610dac906001600160a01b03168b8b898c8c611f38565b90965090508015610dc657610dc68a828c6080015161196d565b610dd18a873361196d565b5050505094509492505050565b5f610de76117d7565b6060850151617fff60029190910b1315610e12576060850151610e12906316e0049f60e31b90612057565b600160020b856060015160020b1215610e3c576060850151610e3c90631d3d20b160e31b90612057565b845160208601516001600160a01b03908116911610610e6e5784516020860151610e6e916306e6c98360e41b91612066565b610e92856040015186608001516001600160a01b031661208890919063ffffffff16565b610ead576080850151610ead90630732d7b560e51b90612149565b5f610ec0866040015162ffffff1661215e565b6080870151909150610ede906001600160a01b031687878787612183565b60a086205f610eec886121f4565b5f848152600660205260409020909250610f099150888386612326565b6080890151909450610f28906001600160a01b03168989878a8a612385565b87602001516001600160a01b0316885f01516001600160a01b0316837fdd466e674ea557f56295e2d0218a125ea4b4f0f6f3307b95f85e6110838d64388b604001518c606001518d608001518d8b604051610fba95949392919062ffffff959095168552600293840b60208601526001600160a01b03928316604086015291166060840152900b608082015260a00190565b60405180910390a4505050949350505050565b6002546001600160a01b03163314610fef57610fef6348f5c3ed60e01b6115b3565b6103e9610fff821610623e900062fff0008316101661101e5761101e63a7abe2f760e01b62ffffff8316612149565b60a082206110408261103a835f90815260066020526040902090565b906123f8565b60405162ffffff8316815281907fe9c42593e71f84403b84352cd168d693e2c9fcd1fdbcc3feb21d92b43e6696f99060200160405180910390a2505050565b5f80516020614f018339815191525c6110a2576110a26354e3ca0d60e01b6115b3565b335f9081526001600160a01b038316602052604081205c906110c3836115bb565b90508181600f0b146110df576110df63bda73abf60e01b6115b3565b610881846110ec83614b0d565b336115db565b6002545f906001600160a01b03163314611116576111166348f5c3ed60e01b6115b3565b8115611122578161113b565b6001600160a01b0383165f908152600160205260409020545b6001600160a01b0384165f90815260016020526040812080549293508392909190611167908490614a1a565b909155506107b290506001600160a01b038416858361162e565b606060405180602082528360208301526040820191508360051b8201855b80355c84526020938401930181841061119f575b5081810382f35b6111c261240d565b6001600160a01b0381166111d35750565b5f6111e6826001600160a01b0316612441565b90506111f282826124bd565b5050565b606060405180602082528360208301526040820191508360051b8201855b803554845260209384019301818410156111b357611214565b5f815c5f5260205ff35b5f546001600160a01b0316331461127f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610985565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f5f80516020614f018339815191525c6112ed576112ed6354e3ca0d60e01b6115b3565b6112f56117d7565b83602001515f036113105761131063be8b850760e01b6115b3565b60a085205f81815260066020526040902061132a81611819565b60808701515f908190819061134b906001600160a01b03168b8b8b8b6124fd565b8093508195508294505050506113ba84866040518060a001604052808e6060015160020b81526020018d5f0151151581526020018681526020018d604001516001600160a01b031681526020018562ffffff168152508c5f01516113b3578d60200151612619565b8d51612619565b60808b01519096505f92506113de91506001600160a01b03168a8a888b8b88612707565b909550905080156113f8576113f889828b6080015161196d565b61140389863361196d565b50505050949350505050565b5f80516020614f018339815191525c611432576114326354e3ca0d60e01b6115b3565b81611440816110ec846115bb565b610881846001600160a01b0383168461282a565b5f336001600160a01b0386161480159061149157506001600160a01b0385165f90815260036020908152604080832033845290915290205460ff16155b15611501576001600160a01b0385165f90815260056020908152604080832033845282528083208684529091529020545f1981146114ff576114d38382614a1a565b6001600160a01b0387165f90815260056020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260046020908152604080832086845290915281208054849290611533908490614a1a565b90915550506001600160a01b0384165f9081526004602090815260408083208684529091528120805484929061156a908490614a2d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020614ee1833981519152910160405180910390a45060015b949350505050565b805f5260045ffd5b5f6001607f1b82106115d7576115d76393dafdf160e01b6115b3565b5090565b81600f0b5f036115ea57505050565b5f806116006001600160a01b03861684866128e8565b91509150805f0361161857611613612921565b611627565b815f0361162757611627612949565b5050505050565b5f6001600160a01b038416611661575f805f8085875af190508061165c5761165c6356cdd02560e11b612971565b610881565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f6040820152508061088157610881632745a14f60e21b612971565b5f5f80516020614ec18339815191525c6001600160a01b0381166116e85734915061174c565b34156116fe576116fe6319d245cf60e01b6115b3565b7f1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd955c5f6117336001600160a01b038416612441565b905061173f8282614a1a565b935061174961299e565b50505b61175f81611759846115bb565b856115db565b50919050565b6001600160a01b0383165f90815260046020908152604080832085845290915281208054839290611797908490614a2d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020614ee183398151915291015b60405180910390a4505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611817576118176306c4a1c760e11b6115b3565b565b80546001600160a01b03165f0361183a5761183a63486aa30760e01b6115b3565b50565b85336001600160a01b038216146118b15760208716156118b1576118af33878787878760405160240161187596959493929190614b74565b60408051601f198184030181529190526020810180516001600160e01b0316635b54587d60e11b1790526001600160a01b038916906129b0565b505b50505050505050565b60038301545f906001600160801b03168082036118e1576118e163a74f97ab60e01b6115b3565b61190f6118ed856115bb565b5f036118f8856115bb565b5f0360809190911b6001600160801b039091161790565b9150831561193b5761192f84600160801b836001600160801b0316612a40565b60018601805490910190555b82156119655761195983600160801b836001600160801b0316612a40565b60028601805490910190555b509392505050565b82516119839061197d8460801d90565b836115db565b610805836020015161197d84600f0b90565b85336001600160a01b038216146118b15760108716156118b1576118af3387878787876040516024016119cd96959493929190614b74565b60408051601f198184030181529190526020810180516001600160e01b031663e1b4af6960e01b1790526001600160a01b038916906129b0565b60015f80516020614f018339815191525d565b5f5f80516020614f018339815191525d565b620f424062ffffff8216111561183a5761183a631400211360e01b62ffffff8316612149565b611a5b82611819565b8154611a679082612adc565b90915550565b84336001600160a01b03821614611b67575f8460400151138015611a945750610800861615155b15611af557611aef3386868686604051602401611ab5959493929190614bbe565b60408051601f198184030181529190526020810180516001600160e01b031663259982e560e01b1790526001600160a01b038816906129b0565b50611b67565b5f846040015113158015611b0c5750610200861615155b15611b67576118b13386868686604051602401611b2d959493929190614bbe565b60408051601f198184030181529190526020810180516001600160e01b031663021d0ee760e41b1790526001600160a01b038816906129b0565b505050505050565b80600f81900b8114610a4157610a416393dafdf160e01b6115b3565b6060810151602082015160408301515f9283929091611baa8282612af7565b604080516080810182525f80825260208201819052918101829052606081019190915283600f0b5f14611cef57611be38884865f612b57565b6001600160801b0316602083015215158152611c028883866001612b57565b6001600160801b03166060830152151560408201525f600f85900b12611cb4575f611c52886080015160020b620d89e7198190058102620d89e8829005820203056001016001600160801b030490565b9050806001600160801b031682602001516001600160801b03161115611c8357611c8363b8e3c38560e01b85612057565b806001600160801b031682606001516001600160801b03161115611cb257611cb263b8e3c38560e01b84612057565b505b805115611cd0576080870151611cd09060058a01908590612c11565b806040015115611cef576080870151611cef9060058a01908490612c11565b5f80611cfc8a8686612c63565b8a5160a08c015160408051602681019290925260068083018a9052600383018b9052928252603a600c8301205f838301819052602080850182905293819052908152928f01909152812092945090925080611d59838a8787612d17565b91509150611d85611d69836115bb565b611d72836115bb565b6001600160801b031660809190911b1790565b995050505050505f84600f0b1215611dee57805115611dc157600283810b5f90815260048a016020526040812081815560018101829055909101555b806040015115611dee57600282810b5f90815260048a016020526040812081815560018101829055909101555b5082600f0b5f14611efb5786545f80611e0a8360a01c60020b90565b6001600160a01b038416915091508460020b8260020b1215611e5957611e52611e4c611e47611e3888612dd0565b611e4188612dd0565b8a613088565b611b6f565b60801b90565b9750611ef7565b8360020b8260020b1215611ed257611e90611e7a611e4783611e4188612dd0565b611d72611e47611e8989612dd0565b858b6130c0565b60038b0154909850611eab906001600160801b0316876130ec565b60038b0180546001600160801b0319166001600160801b0392909216919091179055611ef7565b611ef45f611d72611e47611ee589612dd0565b611eee89612dd0565b8b6130c0565b97505b5050505b5050509250929050565b5f608082811d9084901d01600f83810b9085900b01611f2f611f2683611b6f565b611d7283611b6f565b95945050505050565b5f806001600160a01b0388163303611f5457508390505f61204c565b8491505f86604001511315611fe057610400881615611fdb57611fcc338888888888604051602401611f8b96959493929190614c1e565b60408051601f198184030181529190526020810180516001600160e01b0316625a2a8160e81b17905260028a1615155b6001600160a01b038b169190613113565b9050611fd88282613154565b91505b61204c565b61010088161561204c5761203d33888888888860405160240161200896959493929190614c1e565b60408051601f198184030181529190526020810180516001600160e01b03166346d95b2960e11b17905260018a161515611fbb565b90506120498282613154565b91505b965096945050505050565b815f528060020b60045260245ffd5b825f526001600160a01b0382166004526001600160a01b03811660245260445ffd5b5f6080831615801561209c57506008831615155b156120a857505f61070c565b604083161580156120bb57506004831615155b156120c757505f61070c565b61040083161580156120db57506002831615155b156120e757505f61070c565b61010083161580156120fb57506001831615155b1561210757505f61070c565b6001600160a01b0383161561213857613fff831615158061213357506280000062ffffff8316146107b2565b6107b2565b5062ffffff16628000001415919050565b815f526001600160a01b03811660045260245ffd5b5f6280000062ffffff83160361217557505f919050565b6115d78262ffffff16611a2c565b84336001600160a01b03821614611b6757612000861615611b67576118b133868686866040516024016121ba959493929190614c85565b60408051601f198184030181529190526020810180516001600160e01b03166301a206c160e51b1790526001600160a01b038816906129b0565b6002545f9081906001600160a01b031615612321577f00000000000000000000000000000000000000000000000000000000000000005a101561224157612241630f724b8160e11b6115b3565b6002546040517f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b0316905f90612283908790602401614cc6565b60408051601f198184030181529190526020810180516001600160e01b031663553bfc3760e01b17815281519192505f918291829190828789f13d60201416955085156122da576040513d5f823e805191505f8152505b8580156122eb57508062ffffff1681145b801561230857506103e9610fff821610623e900062fff000831610165b612313575f80612317565b6001815b9096509450505050505b915091565b83545f906001600160a01b03161561234857612348637983c05160e01b6115b3565b61235184613175565b905061237a826123748561236e6001600160a01b03891686613460565b9061347b565b90612adc565b909455509192915050565b85336001600160a01b038216146118b1576110008716156118b1576118af3387878787876040516024016123be96959493929190614cd4565b60408051601f198184030181529190526020810180516001600160e01b031663a910f80f60e01b1790526001600160a01b038916906129b0565b61240182611819565b8154611a67908261347b565b61242d5f80516020614ec18339815191525c6001600160a01b0316613496565b6118175761181763996caf6560e01b6115b3565b5f6001600160a01b038216612457575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015612499573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070c9190614d1d565b6001600160a01b0382165f80516020614ec18339815191525d807f1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd955d5050565b60208301515f806001600160a01b038816330361251c575f915061260e565b608088161561260e575f61257289338a8a8a8a604051602401612543959493929190614d34565b60408051601f198184030181529190526020810180516001600160e01b03166315d7892d60e21b1790526129b0565b9050805160601461258d5761258d631e048e1d60e01b6115b3565b604088015162ffffff1662800000036125a857606081015191505b600889161561260c57604081015192505f6125c38460801d90565b905080600f0b5f1461260a575f85126125e0600f83900b87614d8d565b9550806125ef575f86126125f3565b5f86135b1561260857612608637d05b8eb60e11b6115b3565b505b505b505b955095509592505050565b5f8080808061262889886134a7565b93509350935093505f831115612656576001600160a01b0386165f9081526001602052604090208054840190555b33887f40e9cecb9f5f1f1c5b9c97dec2917b7ee92e57ba5563708daca94dd84ad7112f6126838760801d90565b61268d88600f0b90565b60408087015160a0880151606089015192516126f2959493908b90600f96870b81529490950b60208501526001600160a01b039290921660408401526001600160801b0316606083015260020b608082015262ffffff9190911660a082015260c00190565b60405180910390a35091979650505050505050565b5f806001600160a01b038916330361272357508490505f61281e565b5f61272e8460801d90565b90505f61273b85600f0b90565b905060408b16156127b5576127a8611e47338c8c8c8c8c60405160240161276796959493929190614db4565b60408051601f198184030181529190526020810180516001600160e01b031663b47b2fb160e01b17905260048e1615156001600160a01b038f169190613113565b6127b29082614e14565b90505b5f81600f0b5f1415806127cb575082600f0b5f14155b1561281657895160208b01515f13901515146127f6576001600160801b038316608083901b17612807565b6001600160801b038216608084901b175b90506128138982613154565b98505b889450925050505b97509795505050505050565b336001600160a01b038416811480159061286957506001600160a01b038085165f9081526003602090815260408083209385168352929052205460ff16155b156128dd576001600160a01b038085165f9081526005602090815260408083209385168352928152828220868352905220545f1981146128db576128ad8382614a1a565b6001600160a01b038087165f9081526005602090815260408083209387168352928152828220888352905220555b505b610881848484613b54565b6001600160a01b038281165f90815290841660205260408120805c9190612913600f85900b84614d8d565b915081815d50935093915050565b5f80516020614f218339815191525c600181039050805f80516020614f218339815191525d50565b5f80516020614f218339815191525c600181019050805f80516020614f218339815191525d50565b3d60405182815260206004820152816024820152815f604483013e602080601f8401040260440191508181fd5b5f5f80516020614ec18339815191525d565b60605f805f8451602086015f885af19050806129d6576129d663fb6a608160e01b612971565b6040519150601f19603f3d011682016040523d82523d5f602084013e602082511080612a24575060208301516001600160e01b031916612a17836020015190565b6001600160e01b03191614155b15612a3957612a39631e048e1d60e01b6115b3565b5092915050565b5f838302815f1985870982811083820303915050808411612a5f575f80fd5b805f03612a71575082900490506107b2565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60d01b62ffffff60d01b1662ffffff60d01b19919091161790565b8060020b8260020b12612b1657612b1663c4433ed560e01b8383613bbd565b620d89e719600283900b1215612b3757612b3763d5e2f7ab60e01b83612057565b620d89e8600282900b13156111f2576111f263035aeeff60e31b82612057565b600283900b5f908152600485016020526040812080548291906001600160801b0381169060801d612b8882886130ec565b6001600160801b03808216159084168015919091141596509094505f03612bd257885460a01c60020b60020b8860020b13612bd2576001808a0154908401556002808a0154908401555b5f86612be757612be28883614e14565b612bf1565b612bf18883614e41565b90508060801b6001600160801b0386161784555050505094509492505050565b600291820b910b80820715612c3e5760405163d4d8f3e681528260208201528160408201526044601c8201fd5b80820591508160081d5f528260205260405f20600160ff84161b815418815550505050565b600282810b5f81815260048601602052604080822085850b83529082208754929485949293919260a09290921c900b90811215612cb9578160010154836001015403945081600201548360020154039350612d0c565b8560020b8160020b12612ce5578260010154826001015403945082600201548260020154039350612d0c565b81600101548360010154896001015403039450816002015483600201548960020154030393505b505050935093915050565b83545f9081906001600160801b0316600f86900b8203612d5657806001600160801b03165f03612d5157612d51632bbfae4960e21b6115b3565b612d7c565b612d6081876130ec565b87546001600160801b0319166001600160801b03919091161787555b612d9a87600101548603826001600160801b0316600160801b612a40565b9250612dba87600201548503826001600160801b0316600160801b612a40565b6001880195909555505060029094015591929050565b60020b5f60ff82901d80830118620d89e8811115612df957612df96345c3193d60e11b84612057565b7001fffcb933bd6fad37aa2d162d1a5940016001821602600160801b186002821615612e35576ffff97272373d413259a46990580e213a0260801c5b6004821615612e54576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e73576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e92576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612eb1576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ed0576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612eef576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612f0f576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f2f576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f4f576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f6f576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f8f576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612faf576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fcf576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fef576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613010576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613030576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561304f576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561306c576b048a170391f7dc42444e8fa20260801c5b5f841315613078575f19045b63ffffffff0160201c9392505050565b5f8082600f0b126130af576130a86130a38585856001613bda565b613c9d565b5f036115ab565b6115ab6130a38585855f035f613bda565b5f8082600f0b126130db576130a86130a38585856001613cb6565b6115ab6130a38585855f035f613cb6565b6001600160801b038216600f82900b01608081901c1561070c576393dafdf15f526004601cfd5b5f8061311f85856129b0565b90508261312f575f9150506107b2565b805160401461314857613148631e048e1d60e01b6115b3565b60400151949350505050565b5f608082811d9084901d03600f83810b9085900b03611f2f611f2683611b6f565b5f73fffd8963efd1fc6a506488495d951d51639616826401000276a21983016001600160a01b031611156131b4576131b46318521d4960e21b83612149565b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061324757607f810383901c9150613251565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461345157886001600160a01b031661343682612dd0565b6001600160a01b0316111561344b5781613453565b80613453565b815b9998505050505050505050565b60a01b62ffffff60a01b1662ffffff60a01b19919091161790565b60b81b62ffffff60b81b1662ffffff60b81b19919091161790565b5f6001600160a01b0382161561070c565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a08101829052819081908554602086015160038801546001600160801b03165f8261350457610fff60c485901c1661350e565b610fff60b885901c165b60408a81015187525f60208801526001600160a01b0386169087015260a085901c60020b606087015261ffff1690508261354c578960020154613552565b89600101545b6080868101919091526001600160801b03831660a08701528901515f9062400000166135875760d085901c62ffffff16613599565b6135998a6080015162ffffff16613d02565b905081156135c757620f424062ffffff821661ffff84168181028381061515939004929092019101036135c9565b805b60408b01519097505f13905062ffffff8716620f42401480156135ea575080155b156135ff576135ff634b10312360e11b6115b3565b89604001515f0361361a575f80985098505050505050613b4b565b83156136985760608a01516001600160a01b03868116911610613659576136596001600160a01b0386165b60608c0151637c9c6e8f60e01b9190613d11565b6401000276a36001600160a01b03168a606001516001600160a01b031610156136935760608a015161369390639e4d7cc760e01b90612149565b613709565b60608a01516001600160a01b038681169116116136c1576136c16001600160a01b038616613645565b73fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03168a606001516001600160a01b0316106137095760608a015161370990639e4d7cc760e01b90612149565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525b8651158061376957508a606001516001600160a01b031687604001516001600160a01b0316145b613a545760408701516001600160a01b0316815260608701518b516137939160058f019188613d3a565b1515604083015260020b60208201819052620d89e719126137b957620d89e71960208201525b620d89e860020b816020015160020b126137d757620d89e860208201525b6137e48160200151612dd0565b6001600160a01b03908116606083810182905260408a0151908e0151613825939192911680821891811160ff8a1618919091021860a08a01518a518c613e23565b60c085015260a084015260808301526001600160a01b0316604088015281613889576138548160a00151613c9d565b875103875260c08101516080820151613870916130a391614a2d565b876020018181516138819190614e6e565b9052506138c4565b61389c8160c00151826080015101613c9d565b875101875260a08101516138af90613c9d565b876020018181516138c09190614d8d565b9052505b8215613900575f620f4240848360c0015184608001510102816138e9576138e9614e8d565b60c084018051929091049182900390529990990198505b60a08701516001600160801b03161561393f576139338160c00151600160801b8960a001516001600160801b0316612a40565b60808801805190910190525b80606001516001600160a01b031687604001516001600160a01b031603613a1957806040015115613a01575f8086613980578d60010154896080015161398b565b88608001518e600201545b915091505f6139d68f85602001518585600292830b5f90815260049094016020526040909320600181018054909203909155908101805490920390915554600160801b9004600f0b90565b905087156139e1575f035b6139ef8a60a00151826130ec565b6001600160801b031660a08b01525050505b602081015160ff8616900360020b6060880152613742565b805f01516001600160a01b031687604001516001600160a01b031614613a4f57613a468760400151613175565b60020b60608801525b613742565b613a8c8760400151613a7389606001518961346090919063ffffffff16565b6001600160a01b0319166001600160a01b039091161790565b8c5560a08701516001600160801b03858116911614613acc5760a087015160038d0180546001600160801b0319166001600160801b039092169190911790555b84613ae057608087015160028d0155613aeb565b608087015160018d01555b81151585151514613b1f57613b18613b068860200151611b6f565b611d72895f01518e6040015103611b6f565b9950613b44565b613b41613b34885f01518d6040015103611b6f565b611d728960200151611b6f565b99505b5050505050505b92959194509250565b6001600160a01b0383165f90815260046020908152604080832085845290915281208054839290613b86908490614a1a565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020614ee183398151915291016117ca565b6040518381528260020b60048201528160020b6024820152604481fd5b5f836001600160a01b0316856001600160a01b03161115613bf9579293925b6001600160a01b038516613c135762bfc9215f526004601cfd5b600160601b600160e01b03606084901b166001600160a01b038686031683613c6657866001600160a01b0316613c538383896001600160a01b0316612a40565b81613c6057613c60614e8d565b04613c92565b613c92613c7d8383896001600160a01b0316613fa9565b886001600160a01b0316808204910615150190565b979650505050505050565b805f811215610a4157610a416393dafdf160e01b6115b3565b5f6001600160a01b038481169086160360ff81901d90810118600160601b6001600160801b038516613ce9818484612a40565b9350845f83858409111684019350505050949350505050565b62bfffff8116610a4181611a2c565b6040518381526001600160a01b03831660048201526001600160a01b0382166024820152604481fd5b5f80600284810b9086900b8181078313919005038315613db557600281900b60081d600181810b5f90815260208a905260409020545f1960ff85168381019390931b01908116801515955085613d9757888360ff16860302613daa565b88613da182613fd9565b840360ff168603025b965050505050613e19565b6001908101600281900b60081d80830b5f90815260208a905260409020545f1960ff841694851b011990811680151595509293919285613dff57888360ff0360ff16860102613e12565b8883613e0a83614069565b0360ff168601025b9650505050505b5094509492505050565b5f80808062ffffff85166001600160a01b03808a16908b1610158288128015613f1c575f613e5c8a5f0385620f424003620f4240612a40565b905082613e7557613e708d8d8d6001613cb6565b613e82565b613e828c8e8d6001613bda565b9650868110613eb6578b9750620f42408414613ead57613ea8878586620f424003613fa9565b613eaf565b865b9450613ef2565b613ec28d8c8386614104565b975082613edb57613ed68d898d6001613cb6565b613ee8565b613ee8888e8d6001613bda565b9650868a5f030394505b82613f0857613f038d898d5f613bda565b613f14565b613f14888e8d5f613cb6565b955050613f9a565b81613f3257613f2d8c8c8c5f613bda565b613f3e565b613f3e8b8d8c5f613cb6565b9450848910613f4f578a9650613f61565b889450613f5e8c8b8785614152565b96505b81613f7857613f738c888c6001613cb6565b613f85565b613f85878d8c6001613bda565b9550613f97868485620f424003613fa9565b93505b50505095509550955095915050565b5f613fb5848484612a40565b90508180613fc557613fc5614e8d565b838509156107b257600101806107b2575f80fd5b5f808211613fe5575f80fd5b507f0706060506020504060203020504030106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be831560081b6001600160801b03851160071b1784811c6001600160401b031060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b5f808211614075575f80fd5b507e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b150316040581196001019091166101e07f804040554300526644320000502061067405302602000010750620017611707760fc7fb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff840260f81c161b60f71c1690811c63d76453e004601f169190911a1790565b5f6001600160801b038416156001600160a01b03861615171561412e57634f2461b85f526004601cfd5b81614145576141408585856001614195565b611f2f565b611f2f8585856001614280565b5f6001600160801b038416156001600160a01b03861615171561417c57634f2461b85f526004601cfd5b8161418d576141408585855f614280565b611f2f8585855f5b5f8115614205575f6001600160a01b038411156141c9576141c484600160601b876001600160801b0316612a40565b6141e0565b6141e06001600160801b038616606086901b614ea1565b90506141fd6141f8826001600160a01b038916614a2d565b614362565b9150506115ab565b5f6001600160a01b038411156142325761422d84600160601b876001600160801b0316613fa9565b61424f565b61424f606085901b6001600160801b038716808204910615150190565b9050806001600160a01b0387161161426e57634323a5555f526004601cfd5b6001600160a01b0386160390506115ab565b5f825f0361428f5750836115ab565b600160601b600160e01b03606085901b168215614321576001600160a01b038616848102908582816142c3576142c3614e8d565b04036142f3578181018281106142f1576142e783896001600160a01b031683613fa9565b93505050506115ab565b505b506141fd818561430c6001600160a01b038a1683614ea1565b6143169190614a2d565b808204910615150190565b6001600160a01b0386168481029085820414818311166143485763f5c787f15f526004601cfd5b8082036142e76141f8846001600160a01b038b1684613fa9565b806001600160a01b0381168114610a4157610a416393dafdf160e01b6115b3565b6001600160a01b038116811461183a575f80fd5b5f80604083850312156143a8575f80fd5b82356143b381614383565b946020939093013593505050565b5f602082840312156143d1575f80fd5b81356001600160e01b0319811681146107b2575f80fd5b5f805f606084860312156143fa575f80fd5b833561440581614383565b95602085013595506040909401359392505050565b5f805f6060848603121561442c575f80fd5b833561443781614383565b9250602084013561444781614383565b929592945050506040919091013590565b5f60208284031215614468575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156144a5576144a561446f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156144d3576144d361446f565b604052919050565b803562ffffff81168114610a41575f80fd5b8035600281900b8114610a41575f80fd5b5f60a0828403121561450e575f80fd5b60405160a081016001600160401b03811182821017156145305761453061446f565b604052905080823561454181614383565b8152602083013561455181614383565b6020820152614562604084016144db565b6040820152614573606084016144ed565b6060820152608083013561458681614383565b6080919091015292915050565b5f8083601f8401126145a3575f80fd5b5081356001600160401b038111156145b9575f80fd5b6020830191508360208285010111156145d0575f80fd5b9250929050565b5f805f805f61010086880312156145ec575f80fd5b6145f687876144fe565b945060a0860135935060c0860135925060e08601356001600160401b0381111561461e575f80fd5b61462a88828901614593565b969995985093965092949392505050565b5f6020828403121561464b575f80fd5b81356107b281614383565b5f8060408385031215614667575f80fd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b818110156146ad57835183526020938401939092019160010161468f565b509095945050505050565b5f80602083850312156146c9575f80fd5b82356001600160401b038111156146de575f80fd5b6146ea85828601614593565b90969095509350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060c0838503121561473c575f80fd5b61474684846144fe565b915061475460a084016144db565b90509250929050565b80358015158114610a41575f80fd5b5f806040838503121561477d575f80fd5b823561478881614383565b91506147546020840161475d565b5f805f808486036101408112156147ab575f80fd5b6147b587876144fe565b94506080609f19820112156147c8575f80fd5b506147d1614483565b6147dd60a087016144ed565b81526147eb60c087016144ed565b602082015260e08601356040820152610100860135606082015292506101208501356001600160401b03811115614820575f80fd5b61482c87828801614593565b95989497509550505050565b5f805f8060e0858703121561484b575f80fd5b61485586866144fe565b935060a085013561486581614383565b925060c08501356001600160401b03811115614820575f80fd5b5f8060208385031215614890575f80fd5b82356001600160401b038111156148a5575f80fd5b8301601f810185136148b5575f80fd5b80356001600160401b038111156148ca575f80fd5b8560208260051b84010111156148de575f80fd5b6020919091019590945092505050565b5f80604083850312156148ff575f80fd5b823561490a81614383565b9150602083013561491a81614383565b809150509250929050565b5f805f8084860361012081121561493a575f80fd5b61494487876144fe565b94506060609f1982011215614957575f80fd5b50604051606081016001600160401b038111828210171561497a5761497a61446f565b60405261498960a0870161475d565b815260c0860135602082015260e08601356149a381614383565b604082015292506101008501356001600160401b03811115614820575f80fd5b5f805f80608085870312156149d6575f80fd5b84356149e181614383565b935060208501356149f181614383565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561070c5761070c614a06565b8082018082111561070c5761070c614a06565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f6115ab602083018486614a40565b5f60208284031215614a8b575f80fd5b81516001600160401b03811115614aa0575f80fd5b8201601f81018413614ab0575f80fd5b80516001600160401b03811115614ac957614ac961446f565b614adc601f8201601f19166020016144ab565b818152856020838501011115614af0575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f81600f0b60016001607f1b03198103614b2957614b29614a06565b5f0392915050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6001600160a01b0387168152614b8d6020820187614b31565b8460c08201528360e08201526101206101008201525f614bb261012083018486614a40565b98975050505050505050565b6001600160a01b0386168152614bd76020820186614b31565b8351600290810b60c08301526020850151900b60e0820152604084015161010082015260608401516101208201526101606101408201525f613c9261016083018486614a40565b6001600160a01b0387168152614c376020820187614b31565b8451600290810b60c08301526020860151900b60e082015260408501516101008201526060850151610120820152836101408201526101806101608201525f614bb261018083018486614a40565b6001600160a01b0386168152614c9e6020820186614b31565b6001600160a01b03841660c082015261010060e082018190525f90613c929083018486614a40565b60a0810161070c8284614b31565b6001600160a01b0387168152614ced6020820187614b31565b60018060a01b03851660c08201528360020b60e08201526101206101008201525f614bb261012083018486614a40565b5f60208284031215614d2d575f80fd5b5051919050565b6001600160a01b0386168152614d4d6020820186614b31565b8351151560c0820152602084015160e082015260408401516001600160a01b03166101008201526101406101208201525f613c9261014083018486614a40565b8082018281125f831280158216821582161715614dac57614dac614a06565b505092915050565b6001600160a01b0387168152614dcd6020820187614b31565b8451151560c0820152602085015160e082015260408501516001600160a01b0316610100820152836101208201526101606101408201525f614bb261016083018486614a40565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561070c5761070c614a06565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561070c5761070c614a06565b8181035f831280158383131683831282161715612a3957612a39614a06565b634e487b7160e01b5f52601260045260245ffd5b5f82614ebb57634e487b7160e01b5f52601260045260245ffd5b50049056fe27e098c505d44ec3574004bca052aabf76bd35004c182099d8c575fb238593b91b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859c090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab237d4b3164c6e45b97e7d87b7125a44c5828d005af88f9d751cfd78729c5d99a0ba2646970667358221220c720af38850bace8901ec0c414e9cc6b7600fdc66c58c62bb119ab202e9502fe64736f6c634300081a003360a0604052348015600e575f80fd5b506040516116ad3803806116ad833981016040819052602b91603b565b6001600160a01b03166080526066565b5f60208284031215604a575f80fd5b81516001600160a01b0381168114605f575f80fd5b9392505050565b6080516115e46100c95f395f818160790152818160f50152818161022d01528181610294015281816102c501528181610390015281816104fa01528181610550015281816105bf015281816106100152818161077a01526107ad01526115e45ff3fe60806040526004361061003e575f3560e01c80630a5b11e414610042578063481c6a75146100685780635a6bcfda146100b357806391dd7346146100c6575b5f80fd5b610055610050366004611035565b6100f2565b6040519081526020015b60405180910390f35b348015610073575f80fd5b5061009b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161005f565b6100556100c13660046110bb565b61020a565b3480156100d1575f80fd5b506100e56100e0366004611118565b610220565b60405161005f91906111b2565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894916040518060c00160405280336001600160a01b03168152602001898152602001888152602001878152602001861515815260200185151581525060405160200161016c919061120e565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161019791906111b2565b5f604051808303815f875af11580156101b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101d991908101906112aa565b8060200190518101906101ec919061131e565b9050478015610200576102005f3383610662565b5095945050505050565b5f6102188484845f806100f2565b949350505050565b6060336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610256575f80fd5b5f61026383850185611335565b90505f6102be610278836020015160a0902090565b6040840151805160208201516060909201516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693923092916106fc565b505090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635a6bcfda8460200151856040015186606001516040518463ffffffff1660e01b815260040161031f939291906113fc565b60408051808303815f875af115801561033a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035e919061144b565b5090505f6103ba610374856020015160a0902090565b6040860151805160208201516060909201516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693923092916106fc565b505090505f6103d485602001515f0151865f015130610753565b925050505f6103ef866020015160200151875f015130610753565b9250505082600f0b86604001516040015186600f0b61040e9190611481565b1461045f5760405162461bcd60e51b815260206004820152601a60248201527f6c6971756964697479206368616e676520696e636f7272656374000000000000604482015260640160405180910390fd5b5f86604001516040015112156104a7575f82138061047c57505f81135b610488576104886114a8565b5f82128061049557505f81125b156104a2576104a26114a8565b6104ea565b5f86604001516040015113156104ea575f8212806104c457505f81125b6104d0576104d06114a8565b5f8213806104dd57505f81135b156104ea576104ea6114a8565b5f821215610540578551610540907f000000000000000000000000000000000000000000000000000000000000000090610523856114bc565b60808a015160208b0151516001600160a01b0316939291906107df565b5f811215610598578551610598907f000000000000000000000000000000000000000000000000000000000000000090610579846114bc565b60808a01516020808c015101516001600160a01b0316939291906107df565b5f8213156105e757855160a08701516020880151516105e7926001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000091908690610aab565b5f81131561063857855160a08701516020808901510151610638926001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000091908590610aab565b60408051602081018690520160405160208183030381529060405296505050505050505b92915050565b5f6001600160a01b038416610695575f805f8085875af1905080610690576106906356cdd02560e11b610b7d565b6106f6565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f604082015250806106f6576106f6632745a14f60e21b610b7d565b50505050565b60408051602681018390526006810184905260038101859052858152603a600c8201205f9282018390526020820183905290829052819081906107408a8a83610baa565b919c909b50909950975050505050505050565b5f80806107696001600160a01b03871686610c4d565b925061079e6001600160a01b0387167f0000000000000000000000000000000000000000000000000000000000000000610c4d565b91506107d46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168588610cdc565b905093509350939050565b801561087457836001600160a01b031663f5298aca8461080e886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015b5f604051808303815f87803b158015610859575f80fd5b505af115801561086b573d5f803e3d5ffd5b50505050610aa4565b6001600160a01b0385166108eb57836001600160a01b03166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af11580156108c0573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906108e5919061131e565b50610aa4565b604051632961046560e21b81526001600160a01b03868116600483015285169063a5841194906024015f604051808303815f87803b15801561092b575f80fd5b505af115801561093d573d5f803e3d5ffd5b505050506001600160a01b03831630146109cf576040516323b872dd60e01b81526001600160a01b0384811660048301528581166024830152604482018490528616906323b872dd906064016020604051808303815f875af11580156109a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c991906114d6565b50610a41565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905286169063a9059cbb906044016020604051808303815f875af1158015610a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3f91906114d6565b505b836001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610a7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa2919061131e565b505b5050505050565b80610aed57604051630b0d9c0960e01b81526001600160a01b038681166004830152848116602483015260448201849052851690630b0d9c0990606401610842565b836001600160a01b031663156e29f684610b16886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b158015610b60575f80fd5b505af1158015610b72573d5f803e3d5ffd5b505050505050505050565b3d60405182815260206004820152816024820152815f604483013e602080601f8401040260440191508181fd5b5f805f80610bb88686610d73565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038916906335fd631a906044015f60405180830381865afa158015610c06573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c2d91908101906114f1565b60208101516040820151606090920151909a919950975095505050505050565b5f6001600160a01b038316610c6d57506001600160a01b0381163161065c565b6040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015610cb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd5919061131e565b905061065c565b5f806001600160a01b0384165f526001600160a01b03831660205260405f209050846001600160a01b031663f135baaa826040518263ffffffff1660e01b8152600401610d2b91815260200190565b602060405180830381865afa158015610d46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6a919061131e565b95945050505050565b5f80610d7e84610dc3565b90505f610d8c60068361159b565b6040805160208101879052908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6040515f90610de2908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610e3557610e35610dff565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610e6357610e63610dff565b604052919050565b6001600160a01b0381168114610e7f575f80fd5b50565b8035600281900b8114610e93575f80fd5b919050565b5f60a08284031215610ea8575f80fd5b60405160a081016001600160401b0381118282101715610eca57610eca610dff565b6040529050808235610edb81610e6b565b81526020830135610eeb81610e6b565b6020820152604083013562ffffff81168114610f05575f80fd5b6040820152610f1660608401610e82565b60608201526080830135610f2981610e6b565b6080919091015292915050565b5f60808284031215610f46575f80fd5b604051608081016001600160401b0381118282101715610f6857610f68610dff565b604052905080610f7783610e82565b8152610f8560208401610e82565b602082015260408301356040820152606083013560608201525092915050565b5f6001600160401b03821115610fbd57610fbd610dff565b50601f01601f191660200190565b5f82601f830112610fda575f80fd5b8135610fed610fe882610fa5565b610e3b565b818152846020838601011115611001575f80fd5b816020850160208301375f918101602001919091529392505050565b8015158114610e7f575f80fd5b8035610e938161101d565b5f805f805f610180868803121561104a575f80fd5b6110548787610e98565b94506110638760a08801610f36565b93506101208601356001600160401b0381111561107e575f80fd5b61108a88828901610fcb565b93505061014086013561109c8161101d565b91506101608601356110ad8161101d565b809150509295509295909350565b5f805f61014084860312156110ce575f80fd5b6110d88585610e98565b92506110e78560a08601610f36565b91506101208401356001600160401b03811115611102575f80fd5b61110e86828701610fcb565b9150509250925092565b5f8060208385031215611129575f80fd5b82356001600160401b0381111561113e575f80fd5b8301601f8101851361114e575f80fd5b80356001600160401b03811115611163575f80fd5b856020828401011115611174575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111c46020830184611184565b9392505050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b602080825282516001600160a01b0316828201528201515f9061123460408401826111cb565b506040838101518051600290810b60e08601526020820151900b610100850152908101516101208401526060908101516101408401528301516101a06101608401526112846101c0840182611184565b90506080840151151561018084015260a084015115156101a08401528091505092915050565b5f602082840312156112ba575f80fd5b81516001600160401b038111156112cf575f80fd5b8201601f810184136112df575f80fd5b80516112ed610fe882610fa5565b818152856020838501011115611301575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561132e575f80fd5b5051919050565b5f60208284031215611345575f80fd5b81356001600160401b0381111561135a575f80fd5b82016101a0818503121561136c575f80fd5b611374610e13565b813561137f81610e6b565b815261138e8560208401610e98565b60208201526113a08560c08401610f36565b60408201526101408201356001600160401b038111156113be575f80fd5b6113ca86828501610fcb565b6060830152506113dd610160830161102a565b60808201526113ef610180830161102a565b60a0820152949350505050565b61140681856111cb565b8251600290810b60a08301526020840151900b60c0820152604083015160e082015260608301516101008201526101406101208201525f610d6a610140830184611184565b5f806040838503121561145c575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52601160045260245ffd5b8082018281125f8312801582168215821617156114a0576114a061146d565b505092915050565b634e487b7160e01b5f52600160045260245ffd5b5f600160ff1b82016114d0576114d061146d565b505f0390565b5f602082840312156114e6575f80fd5b81516111c48161101d565b5f60208284031215611501575f80fd5b81516001600160401b03811115611516575f80fd5b8201601f81018413611526575f80fd5b80516001600160401b0381111561153f5761153f610dff565b8060051b61154f60208201610e3b565b9182526020818401810192908101908784111561156a575f80fd5b6020850194505b8385101561159057845180835260209586019590935090910190611571565b979650505050505050565b8082018082111561065c5761065c61146d56fea2646970667358221220022bb587431beddd1b3a2d4e57eee388a80ee14cf23bcb0c201ec0029fc9cb7a64736f6c634300081a00336080604052348015600e575f80fd5b506105a08061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c806332c961d91461005957806357eb1da714610081578063769323e314610089578063b08d3fe214610091578063e631bcbf146100d1575b5f80fd5b61006e610067366004610386565b60a0902090565b6040519081526020015b60405180910390f35b61006e600681565b61006e600481565b6100a461009f366004610423565b61011c565b604080516001600160801b039095168552600f9390930b6020850152918301526060820152608001610078565b6100e46100df36600461045e565b6101d2565b604080516001600160a01b03909516855260029390930b602085015262ffffff91821692840192909252166060820152608001610078565b5f805f805f61012b8787610284565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038a16906335fd631a906044015f60405180830381865afa158015610179573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101a09190810190610488565b602081015160408201516060909201516001600160801b0382169c60809290921d9b5091995090975095505050505050565b5f805f805f6101e0866102d8565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015610228573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024c9190610534565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b5f8061028f846102d8565b90505f61029d60048361054b565b60408051600287900b602082015290810182905290915060600160405160208183030381529060405280519060200120925050505b92915050565b6040515f906102f7908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561035157610351610314565b604052919050565b6001600160a01b038116811461036d575f80fd5b50565b8035600281900b8114610381575f80fd5b919050565b5f60a0828403128015610397575f80fd5b5060405160a0810167ffffffffffffffff811182821017156103bb576103bb610314565b60405282356103c981610359565b815260208301356103d981610359565b6020820152604083013562ffffff811681146103f3575f80fd5b604082015261040460608401610370565b6060820152608083013561041781610359565b60808201529392505050565b5f805f60608486031215610435575f80fd5b833561044081610359565b92506020840135915061045560408501610370565b90509250925092565b5f806040838503121561046f575f80fd5b823561047a81610359565b946020939093013593505050565b5f60208284031215610498575f80fd5b815167ffffffffffffffff8111156104ae575f80fd5b8201601f810184136104be575f80fd5b805167ffffffffffffffff8111156104d8576104d8610314565b8060051b6104e860208201610328565b91825260208184018101929081019087841115610503575f80fd5b6020850194505b838510156105295784518083526020958601959093509091019061050a565b979650505050505050565b5f60208284031215610544575f80fd5b5051919050565b808201808211156102d257634e487b7160e01b5f52601160045260245ffdfea26469706673582212200f59ae3b20597ee5b9c8afd86ef4272903aea11220ba5f5248dea7997a9f1cfe64736f6c634300081a003360e060405234801561000f575f80fd5b50604051610eea380380610eea83398101604081905261002e916101a1565b8282825f61003c84826102a2565b50600161004983826102a2565b5060ff81166080524660a05261005d61006c565b60c052506103cd945050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161009c919061035c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610127575f80fd5b81516001600160401b0381111561014057610140610104565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016e5761016e610104565b604052818152838201602001851015610185575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f805f606084860312156101b3575f80fd5b83516001600160401b038111156101c8575f80fd5b6101d486828701610118565b602086015190945090506001600160401b038111156101f1575f80fd5b6101fd86828701610118565b925050604084015160ff81168114610213575f80fd5b809150509250925092565b600181811c9082168061023257607f821691505b60208210810361025057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029d57805f5260205f20601f840160051c8101602085101561027b5750805b601f840160051c820191505b8181101561029a575f8155600101610287565b50505b505050565b81516001600160401b038111156102bb576102bb610104565b6102cf816102c9845461021e565b84610256565b6020601f821160018114610301575f83156102ea5750848201515b5f19600385901b1c1916600184901b17845561029a565b5f84815260208120601f198516915b828110156103305787850151825560209485019460019092019101610310565b508482101561034d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8083546103698161021e565b6001821680156103805760018114610395576103c2565b60ff19831686528115158202860193506103c2565b865f5260205f205f5b838110156103ba5781548882015260019091019060200161039e565b505081860193505b509195945050505050565b60805160a05160c051610af36103f75f395f61044201525f61040d01525f61013f0152610af35ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806340c10f191161008857806395d89b411161006357806395d89b41146101cc578063a9059cbb146101d4578063d505accf146101e7578063dd62ed3e146101fc575f80fd5b806340c10f191461017b57806370a082311461018e5780637ecebe00146101ad575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610127578063313ce5671461013a5780633644e51514610173575b5f80fd5b6100d7610226565b6040516100e4919061083f565b60405180910390f35b6101006100fb36600461088f565b6102b1565b60405190151581526020016100e4565b61011960025481565b6040519081526020016100e4565b6101006101353660046108b7565b61031d565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100e4565b61011961040a565b61010061018936600461088f565b610464565b61011961019c3660046108f1565b60036020525f908152604090205481565b6101196101bb3660046108f1565b60056020525f908152604090205481565b6100d7610478565b6101006101e236600461088f565b610485565b6101fa6101f5366004610911565b6104fb565b005b61011961020a36600461097e565b600460209081525f928352604080842090915290825290205481565b5f8054610232906109af565b80601f016020809104026020016040519081016040528092919081815260200182805461025e906109af565b80156102a95780601f10610280576101008083540402835291602001916102a9565b820191905f5260205f20905b81548152906001019060200180831161028c57829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061030b9086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146103765761035283826109fb565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f908152600360205260408120805485929061039d9084906109fb565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103f79087815260200190565b60405180910390a3506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461043f5761043a61073e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f61046f83836107d6565b50600192915050565b60018054610232906109af565b335f908152600360205260408120805483919083906104a59084906109fb565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061030b9086815260200190565b428410156105505760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f600161055b61040a565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610663573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906106995750876001600160a01b0316816001600160a01b0316145b6106d65760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610547565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161076e9190610a0e565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546107e79190610aaa565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461088a575f80fd5b919050565b5f80604083850312156108a0575f80fd5b6108a983610874565b946020939093013593505050565b5f805f606084860312156108c9575f80fd5b6108d284610874565b92506108e060208501610874565b929592945050506040919091013590565b5f60208284031215610901575f80fd5b61090a82610874565b9392505050565b5f805f805f805f60e0888a031215610927575f80fd5b61093088610874565b965061093e60208901610874565b95506040880135945060608801359350608088013560ff81168114610961575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561098f575f80fd5b61099883610874565b91506109a660208401610874565b90509250929050565b600181811c908216806109c357607f821691505b6020821081036109e157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610317576103176109e7565b5f8083545f8160011c90506001821680610a2957607f821691505b602082108103610a4757634e487b7160e01b5f52602260045260245ffd5b808015610a5b5760018114610a7057610a9e565b60ff1984168752821515830287019450610a9e565b5f888152602090205f5b84811015610a9657815489820152600190910190602001610a7a565b505082870194505b50929695505050505050565b80820180821115610317576103176109e756fea2646970667358221220f4620711d0f8649f80fed98a6eb335b7806c86e0ebaba0b9fa57daf20d6ed2f364736f6c634300081a00336080604052348015600e575f80fd5b50604051610521380380610521833981016040819052602b91607b565b5f80546001600160a01b039485166001600160a01b031991821617909155600180549390941692169190911790915560025560af565b80516001600160a01b03811681146076575f80fd5b919050565b5f805f60608486031215608c575f80fd5b6093846061565b9250609f602085016061565b9150604084015190509250925092565b610465806100bc5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c806358dbbe811461005957806391b7f5ed14610089578063a035b1fe1461009e578063d004f0f7146100b5578063f5992699146100c8575b5f80fd5b60015461006c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009c6100973660046103c4565b6100da565b005b6100a760025481565b604051908152602001610080565b61009c6100c33660046103db565b610115565b5f5461006c906001600160a01b031681565b60028190556040518181527ff347ee99503bf19c028bd6b18f3c676e82a9bb5b2bb5225aebe0fd62fd6a0d199060200160405180910390a150565b5f805481906001600160a01b039081169085160361015257506001546002546001600160a01b039091169061014b90849061037e565b91506101c2565b6001546001600160a01b039081169085160361018557505f546002546001600160a01b039091169061014b908490610399565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064015b60405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038516906323b872dd906064016020604051808303815f875af1158015610212573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102369190610410565b6102745760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101b9565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0382169063a9059cbb906044016020604051808303815f875af11580156102be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e29190610410565b6103205760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101b9565b604080516001600160a01b03808716825283166020820152908101849052606081018390523360808201527fb39c9bc43f811e1a7ce159c5f147458fdb80266bf23c17322013316e27e086d09060a00160405180910390a150505050565b5f6103928383670de0b6b3a76400006103a9565b9392505050565b5f61039283670de0b6b3a7640000845b5f825f1904841183021582026103bd575f80fd5b5091020490565b5f602082840312156103d4575f80fd5b5035919050565b5f80604083850312156103ec575f80fd5b82356001600160a01b0381168114610402575f80fd5b946020939093013593505050565b5f60208284031215610420575f80fd5b81518015158114610392575f80fdfea264697066735822122071f33bd4e906706fab2f1d579ad88e83e4a15cb735911cd69a3275ede2ed3ced64736f6c634300081a0033","sourceMap":"523:3135:52:-:0;;;989:732;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1076:3;1060:20;;;;;:::i;:::-;508:25:56;;;496:2;481:18;1060:20:52;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1046:34:52;;;;;1099:40;;;;;:::i;:::-;-1:-1:-1;;;;;728:32:56;;;710:51;;698:2;683:18;1099:40:52;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1090:49:52;;;1159:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1149:23:52;;;1195:37;;1229:2;;1195:37;;;:::i;:::-;1110:2:56;1092:21;;;1149:1;1129:18;;;1122:29;-1:-1:-1;;;1182:3:56;1167:19;;1160:40;1238:3;1231:4;1216:20;;1209:33;;;1279:1;1258:19;;;1251:30;-1:-1:-1;;;1312:3:56;1297:19;;1290:33;1407:4;1395:17;;;-1:-1:-1;1375:18:56;;1368:45;1355:3;1340:19;1195:37:52;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1183:49:52;;;1254:37;;1288:2;;1254:37;;;:::i;:::-;1762:2:56;1744:21;;;1801:1;1781:18;;;1774:29;-1:-1:-1;;;1834:3:56;1819:19;;1812:40;1890:3;1883:4;1868:20;;1861:33;;;1931:1;1910:19;;;1903:30;-1:-1:-1;;;1964:3:56;1949:19;;1942:33;2059:4;2047:17;;;-1:-1:-1;2027:18:56;;2020:45;2007:3;1992:19;1254:37:52;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1242:49:52;;;;;;;1306:9;;:21;;;;1302:99;;;1369:9;;;1380;;;-1:-1:-1;;;;;1343:47:52;;;;;;;;;;1302:99;1444:9;;1464;;1476:12;1417:72;;;;;:::i;:::-;-1:-1:-1;;;;;2296:32:56;;;2278:51;;2365:32;;;;2360:2;2345:18;;2338:60;2429:2;2414:18;;2407:34;2266:2;2251:18;1417:72:52;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1411:78:52;;;;;1508:9;;:46;;-1:-1:-1;;;1508:46:52;;1531:4;1508:46;;;2648:51:56;1538:15:52;2715:18:56;;;2708:34;1508:14:52;;;;;2621:18:56;;1508:46:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1500:102;;;;-1:-1:-1;;;1500:102:52;;3237:2:56;1500:102:52;;;3219:21:56;3276:2;3256:18;;;3249:30;3315:34;3295:18;;;3288:62;-1:-1:-1;;;3366:18:56;;;3359:41;3417:19;;1500:102:52;;;;;;;;;1620:9;;:46;;-1:-1:-1;;;1620:46:52;;1643:4;1620:46;;;2648:51:56;1650:15:52;2715:18:56;;;2708:34;-1:-1:-1;;;;;1620:14:52;;;;;;2621:18:56;;1620:46:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1612:102;;;;-1:-1:-1;;;1612:102:52;;3649:2:56;1612:102:52;;;3631:21:56;3688:2;3668:18;;;3661:30;3727:34;3707:18;;;3700:62;-1:-1:-1;;;3778:18:56;;;3771:41;3829:19;;1612:102:52;3447:407:56;1612:102:52;989:732;;523:3135;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;14:343:56:-;93:6;101;154:2;142:9;133:7;129:23;125:32;122:52;;;170:1;167;160:12;122:52;-1:-1:-1;;215:16:56;;321:2;306:18;;;300:25;215:16;;300:25;;-1:-1:-1;14:343:56:o;2753:277::-;2820:6;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2921:9;2915:16;2974:5;2967:13;2960:21;2953:5;2950:32;2940:60;;2996:1;2993;2986:12;2940:60;3019:5;2753:277;-1:-1:-1;;;2753:277:56:o;3447:407::-;523:3135:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f80fd5b5060043610610060575f3560e01c8063014807031461006457806306ba06fa146100fe578063182148ef146101135780636af577411461018c57806391b7f5ed1461019f57806396f5e27c146101b2575b5f80fd5b61006c6101c5565b604080518251600290810b82526020808501516001600160a01b03908116828501528585015181168486015260608087015181860152608080880151805184168288015293840151831660a0808801919091529684015162ffffff1660c08701529083015190930b60e08501529101518116610100830152919092015116610120820152610140015b60405180910390f35b61011161010c366004610b73565b610499565b005b5f546001546002805461014c936001600160a01b03908116938082169362ffffff600160a01b83041693600160b81b909204900b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a0016100f5565b61011161019a366004610bea565b61090d565b6101116101ad366004610ce6565b610a78565b6101116101c0366004610cfd565b610ae9565b6040805160c0810182525f80825260208083018290528284018290526060808401839052845160a080820187528482529281018490528086018490529081018390526080808201849052840152820181905291516332c961d960e01b815290919081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e631bcbf907f00000000000000000000000000000000000000000000000000000000000000009083906332c961d990610291908790600401610d6c565b602060405180830381865afa1580156102ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d09190610d80565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401608060405180830381865afa158015610317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b9190610d97565b5050915091506040518060c001604052808260020b8152602001836001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104139190610d80565b81526040805160a0810182525f546001600160a01b03908116825260015480821660208481019190915262ffffff600160a01b83041684860152600160b81b909104600290810b606085015254821660808401528401919091527f0000000000000000000000000000000000000000000000000000000000000000169101529392505050565b5f83131561065a576040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f9190610df3565b6105805760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637930206661696c6564000000000000000060448201526064015b60405180910390fd5b6040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af11580156105ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060e9190610df3565b61065a5760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637931206661696c656400000000000000006044820152606401610577565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af11580156106e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070a9190610df3565b6107565760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637930206661696c65640000006044820152606401610577565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af11580156107e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108069190610df3565b6108525760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637931206661696c65640000006044820152606401610577565b60408051608081018252600284810b825283900b60208201528082018590525f606082018190529151632d35e7ed60e11b815290916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691635a6bcfda916108c6918590600401610e19565b6020604051808303815f875af11580156108e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109069190610d80565b5050505050565b6040805160a0810182527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081168083527f000000000000000000000000000000000000000000000000000000000000000082166020840181905262ffffff8a811685870181905260028b810b60608801528a861660809097018790525f80546001600160a01b03199081169096178155600180546001600160b81b031916909517600160a01b9093029290921762ffffff60b81b1916600160b81b938d16939093029290921790925580549092169093179055915163695c5bf560e01b81527f00000000000000000000000000000000000000000000000000000000000000009092169163695c5bf591610a309186908690600401610e6a565b6020604051808303815f875af1158015610a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a709190610ebf565b505050505050565b6040516391b7f5ed60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391b7f5ed906024015f604051808303815f87803b158015610ad7575f80fd5b505af1158015610906573d5f803e3d5ffd5b60405163d004f0f760e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d004f0f7906044015f604051808303815f87803b158015610b50575f80fd5b505af1158015610a70573d5f803e3d5ffd5b8060020b8114610b70575f80fd5b50565b5f805f60608486031215610b85575f80fd5b833592506020840135610b9781610b62565b91506040840135610ba781610b62565b809150509250925092565b62ffffff81168114610b70575f80fd5b6001600160a01b0381168114610b70575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a08688031215610bfe575f80fd5b8535610c0981610bb2565b94506020860135610c1981610b62565b93506040860135610c2981610bc2565b92506060860135610c3981610bc2565b9150608086013567ffffffffffffffff811115610c54575f80fd5b8601601f81018813610c64575f80fd5b803567ffffffffffffffff811115610c7e57610c7e610bd6565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610cad57610cad610bd6565b6040528181528282016020018a1015610cc4575f80fd5b816020840160208301375f602083830101528093505050509295509295909350565b5f60208284031215610cf6575f80fd5b5035919050565b5f8060408385031215610d0e575f80fd5b8235610d1981610bc2565b946020939093013593505050565b80546001600160a01b0390811683526001820154808216602085015260a081901c62ffffff16604085015260b81c600290810b60608501529091015416608090910152565b60a08101610d7a8284610d27565b92915050565b5f60208284031215610d90575f80fd5b5051919050565b5f805f8060808587031215610daa575f80fd5b8451610db581610bc2565b6020860151909450610dc681610b62565b6040860151909350610dd781610bb2565b6060860151909250610de881610bb2565b939692955090935050565b5f60208284031215610e03575f80fd5b81518015158114610e12575f80fd5b9392505050565b610e238184610d27565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b610e748185610d27565b60018060a01b03831660a082015260e060c08201525f82518060e0840152806020850161010085015e5f6101008285010152610100601f19601f830116840101915050949350505050565b5f60208284031215610ecf575f80fd5b8151610e1281610b6256fea26469706673582212206a60d32d1d2b9350429ebf11063aba0768a76fe5b208b88035f661c9182d5ff964736f6c634300081a0033","sourceMap":"523:3135:52:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:422;;;:::i;:::-;;;;352:13:56;;349:1;338:28;;;320:47;;427:4;415:17;;;409:24;-1:-1:-1;;;;;405:50:56;;;383:20;;;376:80;504:17;;;498:24;494:50;;472:20;;;465:80;601:4;589:17;;;583:24;561:20;;;554:54;655:4;643:17;;;637:24;703:19;;699:45;;677:20;;;670:75;792:23;;;786:30;782:56;;443:3;761:19;;;754:85;;;;886:23;;;880:30;912:8;876:45;870:3;855:19;;848:74;979:23;;;973:30;959:45;;;953:3;938:19;;931:74;1052:23;;1046:30;1042:56;;1036:3;1021:19;;1014:85;1136:16;;;;1130:23;80:31;1212:6;1197:22;;68:44;307:3;292:19;1727:422:52;;;;;;;;2802:854;;;;;;:::i;:::-;;:::i;:::-;;778:22;;;;;;;;;;-1:-1:-1;;;;;778:22:52;;;;;;;;;-1:-1:-1;;;778:22:52;;;;-1:-1:-1;;;778:22:52;;;;;;;;;;;;;-1:-1:-1;;;;;2152:32:56;;;2134:51;;2221:32;;;2216:2;2201:18;;2194:60;2302:8;2290:21;;;2270:18;;;2263:49;;;;2359:1;2348:21;2343:2;2328:18;;2321:49;2407:32;;;;2401:3;2386:19;;2379:61;2121:3;2106:19;778:22:52;1806:640:56;2348:448:52;;;;;;:::i;:::-;;:::i;2155:76::-;;;;;;:::i;:::-;;:::i;2237:105::-;;;;;;:::i;:::-;;:::i;1727:422::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1869:21:52;;-1:-1:-1;;;1869:21:52;;-1:-1:-1;;;;;;;;;;1839:7:52;:16;;;;1856:11;;1839:16;;1869:12;;:21;;-1:-1:-1;;1869:21:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1839:52;;-1:-1:-1;;;;;;1839:52:52;;;;;;;-1:-1:-1;;;;;6272:32:56;;;1839:52:52;;;6254:51:56;6321:18;;;6314:34;6227:18;;1839:52:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1800:91;;;;;;1909:233;;;;;;;;1943:4;1909:233;;;;;;1975:12;-1:-1:-1;;;;;1909:233:52;;;;;2018:11;-1:-1:-1;;;;;1909:233:52;;;;;2054:3;-1:-1:-1;;;;;2054:9:52;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1909:233;;;;;;;;;;2085:7;1909:233;-1:-1:-1;;;;;1909:233:52;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1909:233:52;;;;;;;-1:-1:-1;;;1909:233:52;;;;;;;;;;;;;;;;;;;;;;;;2123:7;1909:233;;;;1902:240;1727:422;-1:-1:-1;;;1727:422:52:o;2802:854::-;2919:1;2902:14;:18;2898:245;;;2944:54;;-1:-1:-1;;;2944:54:52;;2967:4;2944:54;;;6254:51:56;6321:18;;;6314:34;;;2944:9:52;-1:-1:-1;;;;;2944:14:52;;;;6227:18:56;;2944:54:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2936:91;;;;-1:-1:-1;;;2936:91:52;;7970:2:56;2936:91:52;;;7952:21:56;8009:2;7989:18;;;7982:30;8048:26;8028:18;;;8021:54;8092:18;;2936:91:52;;;;;;;;;3049:54;;-1:-1:-1;;;3049:54:52;;3072:4;3049:54;;;6254:51:56;6321:18;;;6314:34;;;3049:9:52;-1:-1:-1;;;;;3049:14:52;;;;6227:18:56;;3049:54:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3041:91;;;;-1:-1:-1;;;3041:91:52;;8323:2:56;3041:91:52;;;8305:21:56;8362:2;8342:18;;;8335:30;8401:26;8381:18;;;8374:54;8445:18;;3041:91:52;8121:348:56;3041:91:52;3161:53;;-1:-1:-1;;;3161:53:52;;-1:-1:-1;;;;;3187:6:52;6272:32:56;;3161:53:52;;;6254:51:56;-1:-1:-1;;6321:18:56;;;6314:34;3161:9:52;:17;;;;6227:18:56;;3161:53:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3153:95;;;;-1:-1:-1;;;3153:95:52;;8676:2:56;3153:95:52;;;8658:21:56;8715:2;8695:18;;;8688:30;8754:31;8734:18;;;8727:59;8803:18;;3153:95:52;8474:353:56;3153:95:52;3266:53;;-1:-1:-1;;;3266:53:52;;-1:-1:-1;;;;;3292:6:52;6272:32:56;;3266:53:52;;;6254:51:56;-1:-1:-1;;6321:18:56;;;6314:34;3266:9:52;:17;;;;6227:18:56;;3266:53:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3258:95;;;;-1:-1:-1;;;3258:95:52;;9034:2:56;3258:95:52;;;9016:21:56;9073:2;9053:18;;;9046:30;9112:31;9092:18;;;9085:59;9161:18;;3258:95:52;8832:353:56;3258:95:52;3415:180;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:48;3415:180;;;;;;3606:43;;-1:-1:-1;;;3606:43:52;;3415:180;;-1:-1:-1;;;;;3606:6:52;:22;;;;:43;;3415:180;;3606:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2888:768;2802:854;;;:::o;2348:448::-;2498:225;;;;;;;;2553:9;-1:-1:-1;;;;;2498:225:52;;;;;;2611:9;2498:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2488:235:52;;-1:-1:-1;;;;;;2488:235:52;;;;;;;;-1:-1:-1;2488:235:52;;-1:-1:-1;;;;;;2488:235:52;;;;-1:-1:-1;;;2488:235:52;;;;;;;-1:-1:-1;;;;2488:235:52;-1:-1:-1;;;2488:235:52;;;;;;;;;;;;;;;;;;;;;;;;2734:55;;-1:-1:-1;;;2734:55:52;;:11;:22;;;;;;:55;;2766:12;;2780:8;;2734:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2348:448;;;;;:::o;2155:76::-;2205:19;;-1:-1:-1;;;2205:19:52;;;;;11297:25:56;;;2205:3:52;-1:-1:-1;;;;;2205:12:52;;;;11270:18:56;;2205:19:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2237:105;2308:27;;-1:-1:-1;;;2308:27:52;;-1:-1:-1;;;;;6272:32:56;;;2308:27:52;;;6254:51:56;6321:18;;;6314:34;;;2308:3:52;:8;;;;6227:18:56;;2308:27:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1231:118:56;1318:5;1315:1;1304:20;1297:5;1294:31;1284:59;;1339:1;1336;1329:12;1284:59;1231:118;:::o;1354:447::-;1426:6;1434;1442;1495:2;1483:9;1474:7;1470:23;1466:32;1463:52;;;1511:1;1508;1501:12;1463:52;1547:9;1534:23;1524:33;;1607:2;1596:9;1592:18;1579:32;1620:29;1643:5;1620:29;:::i;:::-;1668:5;-1:-1:-1;1725:2:56;1710:18;;1697:32;1738:31;1697:32;1738:31;:::i;:::-;1788:7;1778:17;;;1354:447;;;;;:::o;2451:119::-;2536:8;2529:5;2525:20;2518:5;2515:31;2505:59;;2560:1;2557;2550:12;2575:139;-1:-1:-1;;;;;2658:31:56;;2648:42;;2638:70;;2704:1;2701;2694:12;2719:127;2780:10;2775:3;2771:20;2768:1;2761:31;2811:4;2808:1;2801:15;2835:4;2832:1;2825:15;2851:1529;2967:6;2975;2983;2991;2999;3052:3;3040:9;3031:7;3027:23;3023:33;3020:53;;;3069:1;3066;3059:12;3020:53;3108:9;3095:23;3127:30;3151:5;3127:30;:::i;:::-;3176:5;-1:-1:-1;3233:2:56;3218:18;;3205:32;3246:31;3205:32;3246:31;:::i;:::-;3296:7;-1:-1:-1;3355:2:56;3340:18;;3327:32;3368:41;3327:32;3368:41;:::i;:::-;3428:7;-1:-1:-1;3487:2:56;3472:18;;3459:32;3500:41;3459:32;3500:41;:::i;:::-;3560:7;-1:-1:-1;3618:3:56;3603:19;;3590:33;3646:18;3635:30;;3632:50;;;3678:1;3675;3668:12;3632:50;3701:22;;3754:4;3746:13;;3742:27;-1:-1:-1;3732:55:56;;3783:1;3780;3773:12;3732:55;3823:2;3810:16;3849:18;3841:6;3838:30;3835:56;;;3871:18;;:::i;:::-;3920:2;3914:9;4012:2;3974:17;;-1:-1:-1;;3970:31:56;;;4003:2;3966:40;3962:54;3950:67;;4047:18;4032:34;;4068:22;;;4029:62;4026:88;;;4094:18;;:::i;:::-;4130:2;4123:22;4154;;;4195:15;;;4212:2;4191:24;4188:37;-1:-1:-1;4185:57:56;;;4238:1;4235;4228:12;4185:57;4294:6;4289:2;4285;4281:11;4276:2;4268:6;4264:15;4251:50;4347:1;4342:2;4333:6;4325;4321:19;4317:28;4310:39;4368:6;4358:16;;;;;2851:1529;;;;;;;;:::o;4385:226::-;4444:6;4497:2;4485:9;4476:7;4472:23;4468:32;4465:52;;;4513:1;4510;4503:12;4465:52;-1:-1:-1;4558:23:56;;4385:226;-1:-1:-1;4385:226:56:o;4616:375::-;4684:6;4692;4745:2;4733:9;4724:7;4720:23;4716:32;4713:52;;;4761:1;4758;4751:12;4713:52;4800:9;4787:23;4819:39;4852:5;4819:39;:::i;:::-;4877:5;4955:2;4940:18;;;;4927:32;;-1:-1:-1;;;4616:375:56:o;4996:555::-;5081:12;;-1:-1:-1;;;;;5077:38:56;;;5065:51;;5112:1;5148:16;;5142:23;5197:35;;;5190:4;5181:14;;5174:59;5103:3;5269:19;;;5290:8;5265:34;5258:4;5249:14;;5242:58;5350:3;5346:19;5343:1;5332:34;;;5325:4;5316:14;;5309:58;5392:13;;;5386:20;5451:28;5504:4;5495:14;;;5488:57;4996:555::o;5556:254::-;5739:3;5724:19;;5752:52;5728:9;5786:6;5752:52;:::i;:::-;5556:254;;;;:::o;5815:212::-;5913:6;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;-1:-1:-1;6005:16:56;;5815:212;-1:-1:-1;5815:212:56:o;6359:654::-;6452:6;6460;6468;6476;6529:3;6517:9;6508:7;6504:23;6500:33;6497:53;;;6546:1;6543;6536:12;6497:53;6578:9;6572:16;6597:39;6630:5;6597:39;:::i;:::-;6705:2;6690:18;;6684:25;6655:5;;-1:-1:-1;6718:31:56;6684:25;6718:31;:::i;:::-;6820:2;6805:18;;6799:25;6768:7;;-1:-1:-1;6833:32:56;6799:25;6833:32;:::i;:::-;6936:2;6921:18;;6915:25;6884:7;;-1:-1:-1;6949:32:56;6915:25;6949:32;:::i;:::-;6359:654;;;;-1:-1:-1;6359:654:56;;-1:-1:-1;;6359:654:56:o;7486:277::-;7553:6;7606:2;7594:9;7585:7;7581:23;7577:32;7574:52;;;7622:1;7619;7612:12;7574:52;7654:9;7648:16;7707:5;7700:13;7693:21;7686:5;7683:32;7673:60;;7729:1;7726;7719:12;7673:60;7752:5;7486:277;-1:-1:-1;;;7486:277:56:o;9190:807::-;9556:52;9598:9;9590:6;9556:52;:::i;:::-;9659:13;;9656:1;9645:28;;;9639:3;9624:19;;9617:57;9743:4;9731:17;;9725:24;9711:39;;9705:3;9690:19;;9683:68;9806:4;9794:17;;9788:24;9782:3;9767:19;;9760:53;9868:4;9856:17;;;9850:24;9844:3;9829:19;;9822:53;9912:3;9906;9891:19;;9884:32;;;-1:-1:-1;9932:19:56;;;9925:30;9987:3;9972:19;;9190:807;-1:-1:-1;9190:807:56:o;10225:669::-;10459:52;10501:9;10493:6;10459:52;:::i;:::-;10577:1;10573;10568:3;10564:11;10560:19;10552:6;10548:32;10542:3;10531:9;10527:19;10520:61;10618:3;10612;10601:9;10597:19;10590:32;10440:4;10651:6;10645:13;10695:6;10689:3;10678:9;10674:19;10667:35;10757:6;10750:4;10742:6;10738:17;10732:3;10721:9;10717:19;10711:53;10814:1;10808:3;10799:6;10788:9;10784:22;10780:32;10773:43;10884:3;10877:2;10873:7;10868:2;10860:6;10856:15;10852:29;10841:9;10837:45;10833:55;10825:63;;;10225:669;;;;;;:::o;10899:247::-;10967:6;11020:2;11008:9;10999:7;10995:23;10991:32;10988:52;;;11036:1;11033;11026:12;10988:52;11068:9;11062:16;11087:29;11110:5;11087:29;:::i","linkReferences":{},"immutableReferences":{"11123":[{"start":603,"length":32},{"start":870,"length":32},{"start":2551,"length":32}],"11126":[{"start":1649,"length":32},{"start":1901,"length":32},{"start":2193,"length":32}],"11129":[{"start":917,"length":32},{"start":2702,"length":32},{"start":2831,"length":32}],"11132":[{"start":562,"length":32},{"start":1135,"length":32}],"11135":[{"start":1213,"length":32},{"start":1696,"length":32},{"start":2329,"length":32}],"11138":[{"start":1436,"length":32},{"start":1948,"length":32},{"start":2376,"length":32}]}},"methodIdentifiers":{"addLiquidity(int256,int24,int24)":"06ba06fa","constructSignal()":"01480703","poolKey()":"182148ef","setPool(uint24,int24,address,uint160,bytes)":"6af57741","setPrice(uint256)":"91b7f5ed","swapOnLex(address,uint256)":"96f5e27c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"name\":\"addLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"constructSignal\",\"outputs\":[{\"components\":[{\"internalType\":\"int24\",\"name\":\"currentTick\",\"type\":\"int24\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lexPrice\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"pool\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"fetcher\",\"type\":\"address\"}],\"internalType\":\"struct ArenaController.Signal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolKey\",\"outputs\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint24\",\"name\":\"poolFee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"bytes\",\"name\":\"hookData\",\"type\":\"bytes\"}],\"name\":\"setPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"setPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenIn\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"}],\"name\":\"swapOnLex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ArenaController.sol\":\"ArenaController\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/=lib/v4-core/node_modules/@ensdomains/\",\":@openzeppelin/=lib/v4-core/lib/openzeppelin-contracts/\",\":@openzeppelin/contracts/=lib/v4-core/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/solmate/lib/ds-test/src/\",\":erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-gas-snapshot/=lib/v4-core/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=lib/v4-core/node_modules/hardhat/\",\":openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/\",\":solmate/=lib/solmate/src/\",\":v4-core/=lib/v4-core/src/\"]},\"sources\":{\"lib/solmate/src/auth/Owned.sol\":{\"keccak256\":\"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://1ff52bbee698b9cf9e4574615e6550be0887ccf355f6571e23d6f25b332e79b4\",\"dweb:/ipfs/QmVorA2apojVRStzS7h8aFccR3Uv32G6HVtBtFHZrE7YXx\"]},\"lib/solmate/src/tokens/ERC20.sol\":{\"keccak256\":\"0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35\",\"dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x1b62af9baf5b8e991ed7531bc87f45550ba9d61e8dbff5caf237ccaf3a3fd843\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b7b38b977c5305b18ceefbeed4c9ceaaaefa419b520de62de6604ea661f8c0a9\",\"dweb:/ipfs/QmecMRzgfMyDVa2pvBqMMDLYBappaj7Aa3qcMoQYEQrhWi\"]},\"lib/v4-core/src/ERC6909.sol\":{\"keccak256\":\"0x22476a1c183be1b547a509b3e6906abaccb6408375f798fce805ff7877aca09f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e85580e1563ea0556705132fb6bd038ca4aa355749039923853ebcb76b7c84e6\",\"dweb:/ipfs/QmVoxPrbagRKpFdRWoaCSKmStYLZrhNFuedcuyGycSGR7q\"]},\"lib/v4-core/src/ERC6909Claims.sol\":{\"keccak256\":\"0xf496ef3a5a9bf4f4aa2eec951dbeff09a01ef058bb9f64b1664cf46c9e85cd49\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2a0a97c359a7a4c526ba9fc4ceb20af8050f9cf7886ea7e1f38c9c10b4a3750c\",\"dweb:/ipfs/QmPy6pCQbvzCdJRqG1thHRSwEZoLBAaLo3KQnueL3wxb8i\"]},\"lib/v4-core/src/Extsload.sol\":{\"keccak256\":\"0x784074bd04a1541c7c6ace074e30245746133fd37c3ba16b025dce394db986ce\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35f1f4fb306bf01e98b7eca012b85f3ab978b39fa5136193363e2519c4435e51\",\"dweb:/ipfs/QmeGrjGMt71dJymVhkEadh5CuCW5GxRqNEZLi5AJxvC5tU\"]},\"lib/v4-core/src/Exttload.sol\":{\"keccak256\":\"0x769ee2733a08112c652274f4b972c45fb56cc46109f233b9a30f81561b15dd54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dd19e88d50ae77c1ed5581baca1c75b3fb828d0b58cded90188d55c4e336266c\",\"dweb:/ipfs/Qmc8YM6Tfpwwa4qivHHzRxNdhZzdzGiD7VexWsDvkaQTxG\"]},\"lib/v4-core/src/NoDelegateCall.sol\":{\"keccak256\":\"0x5c238701785d16c58a1598daec0f72a2aaf47d5d017b9dd7441cc8093b65b202\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://696cf79b74bc38e7316d94dfd8bdd9579a94f74121e9b65d2613eb59c106ea50\",\"dweb:/ipfs/QmRttHmshQJ5E7EGaeBC7yT4wyzthNXZQJn7sy2nJvb4dB\"]},\"lib/v4-core/src/PoolManager.sol\":{\"keccak256\":\"0xca5369a1683d06842268987fb6f46b05e6364a46cc856f72bb5c603826f47eac\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5ae5893222abc5dc5fa57bc05af40b60a96a1537bd3c1f3845257d6a3c2b5821\",\"dweb:/ipfs/QmZxQH8M3NVunurxDNJ5EZm2fy6Ws8CHJSezCQaoqzMPoq\"]},\"lib/v4-core/src/ProtocolFees.sol\":{\"keccak256\":\"0x2e7533e46dcab5508ed417ab33c2d0ca8c52a6b5f445dd90daf328173ada4449\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8403de6f2c89a665a3ff3566a917179a5bfb3e0ac9514f0438d82270a7f98c91\",\"dweb:/ipfs/QmTq9cjKTaXeCoSfCywpFwo7sNvuXM4wSMnebwX3hBuiRG\"]},\"lib/v4-core/src/interfaces/IExtsload.sol\":{\"keccak256\":\"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1\",\"dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN\"]},\"lib/v4-core/src/interfaces/IExttload.sol\":{\"keccak256\":\"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8\",\"dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY\"]},\"lib/v4-core/src/interfaces/IHooks.sol\":{\"keccak256\":\"0xdbaf1db938b70f77eb4ddbad5b8d2a1fc648c7d65ca2a312aba16cc013c85df0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ad2d9c85116a2e51281dd40577c798d6d5968be1f8908f43ba152849809deaa\",\"dweb:/ipfs/QmZP4kk9KJzoxv81EgsTfHnJeU8YUxX3yWZudJHbxQjpa8\"]},\"lib/v4-core/src/interfaces/IPoolManager.sol\":{\"keccak256\":\"0x4e07d93993f6ba033c8b5e5b0a3473659aeffe9af0cf8316a879a55ebd696d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://50add8378d59b89b1dc106ea248641caaedd3ac45d62754babe55c526b87c9ad\",\"dweb:/ipfs/QmQUrvy8ZDDdTRTr17msqynVECP3rQFBVBUmFcpFvjAmQx\"]},\"lib/v4-core/src/interfaces/IProtocolFeeController.sol\":{\"keccak256\":\"0xc2d7f3605da9767e36cf25d4d4fa9b95663a6659e26ce28cf29b8b88acb79a4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c7a43cda35b8a9254ed3e46cfd8649361f09121d17ef554bd3d190b9a8d57cc6\",\"dweb:/ipfs/QmRBDQoqCWddH5hY1JdxMyYtY8jMZhWAwtuFJBc3r8V31G\"]},\"lib/v4-core/src/interfaces/IProtocolFees.sol\":{\"keccak256\":\"0x68700020df618c5715737e57630876ec22ccde2d31191a5608babb9f140ed297\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://56b7bb6786f48fff8c9d04e9054955b8cf3d9f5bf819ccda7be192ad2004a27f\",\"dweb:/ipfs/QmZKmUvcYnyihEFySD6SY9osMkP8M1Y7a4kPxLQycEyThw\"]},\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":{\"keccak256\":\"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b\",\"dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK\"]},\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":{\"keccak256\":\"0xc1c23330c1511ecfd45c67a683962b4e2555b82f1dacd40cc8b46ae5a6e250e7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5ce10b7970482a65f9e9a365b810eeb154a5d4a8229a26653028d84b9622a410\",\"dweb:/ipfs/QmTSwXxZ2FTkM5duBZgbpFs8SRVDR5NPAnW4YimeDhb1s8\"]},\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":{\"keccak256\":\"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f\",\"dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK\"]},\"lib/v4-core/src/libraries/BitMath.sol\":{\"keccak256\":\"0x59e18adcff8917b0965a240d88b34d5d800e0efebd5f40c5594ddcf28a15949b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d358beebf8d5079520b6e138d744e5063ecbfbeae355c08af86a3b74afa71b09\",\"dweb:/ipfs/QmUXmAK9aoxnaeykq8MLXoRKP8yGTDyY3jPFMwHnqRxf46\"]},\"lib/v4-core/src/libraries/CurrencyDelta.sol\":{\"keccak256\":\"0xb1eb18c3794b67f4f710229df279d3a630a963194fbbeb51906198ec7145b98e\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://e5ea08b69754250cf04cc544785320f5c8fd8b9a65e5d9e0bc44aadadaa9ea0c\",\"dweb:/ipfs/QmWW1qfqGydoiSeDtVVQ53nV3FphuUgH1PFUC3uGaWzxWR\"]},\"lib/v4-core/src/libraries/CurrencyReserves.sol\":{\"keccak256\":\"0xdeffc5cf2f8f7d3f802998941061392c0c926a32c7105ffd9f902ab84d3a31c6\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://869bd659c5593bc525ce4d44771d85eb8acb74a7f0492802bdcc79d2bfdfcaf7\",\"dweb:/ipfs/QmSrTWzUHrou7ZxcuFXQhvzXmEgbLeCtwAqeS6k9vD22h3\"]},\"lib/v4-core/src/libraries/CustomRevert.sol\":{\"keccak256\":\"0x70a444afeb27564398dbdf7553651ee2cae14c03c923b6f8972040c8f460ebe3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d7b05390bac9b29188725c8a84edac43cd05571da27b33a0b1e36d9500ecaa6\",\"dweb:/ipfs/QmdYDLwTfFgePDEwFMUqGTj8SNNXXq4JQJnrgomJgcZFvP\"]},\"lib/v4-core/src/libraries/FixedPoint128.sol\":{\"keccak256\":\"0xc7e80dc41f28887d0d915a75c0b2783ae659e5384dd1a3ed1251a42e058d8835\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2df62bf1d9d4349236fd0bc7a96b3a3be95f4c049603e4a20c8473cca9402b4d\",\"dweb:/ipfs/QmVR5dmMkoypmhaBeBj8cGegHpJycbofUDg59dHm42i9MT\"]},\"lib/v4-core/src/libraries/FixedPoint96.sol\":{\"keccak256\":\"0xf0a545fc5bbc271e8dbd191413dc03e8725d1f003df4d9d36ea7cdb73058c417\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5d1013d8b5c93024526f129b0a9271b35c578da09bcfe6c3240ff4d590ebc196\",\"dweb:/ipfs/QmX1GyF9jJhYGXst6PyK6HJvcfVQ69nNTnuBEBaEiAZPv7\"]},\"lib/v4-core/src/libraries/FullMath.sol\":{\"keccak256\":\"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52\",\"dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC\"]},\"lib/v4-core/src/libraries/Hooks.sol\":{\"keccak256\":\"0xfa031f4efc096e9c93bb094509321e1c08b5eb271f46554f858e74803c43ae66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7cc33d5eb869ecacfb70d024f7b925d191d98553dbb921bd8188f97d51c9e111\",\"dweb:/ipfs/Qme5VCnaS5mXyqaWV5uiW5xcmTb56uCKBPFrLZp2dq41dQ\"]},\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":{\"keccak256\":\"0xfbebd6766871b795d945a74b6110931f73fc775aeeecc2682d6d6ca841a01ece\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://36fcc7098454971ae16d790ee9aee227c22c5cbbd7ff6e27e58ac29b901d5896\",\"dweb:/ipfs/QmboCGTWtycGpda7E169pD67Fox2H9b1YRsNHcsxBRrhfo\"]},\"lib/v4-core/src/libraries/LiquidityMath.sol\":{\"keccak256\":\"0x4a04b9383e2fb943c2c3ae7d0c9071b58dd97b6dac0a409fe1c79c3ca897bbcf\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0b33cf0ff936f62aa7f3b82922fa0ac52ac24471561e87fbf7ab8372607f6dfc\",\"dweb:/ipfs/Qmcr6omwzJjQPu6HQ8E9vFXaTgrtqfb2KbfxbuQavfUzFa\"]},\"lib/v4-core/src/libraries/Lock.sol\":{\"keccak256\":\"0x9338be4b5695f1da5f3d3f7a3eeaf7a356c1045458289586ac0cbe9cef77c6d5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://485ec42ed6155469d612a9a0c18068ebfbad74448792a338a435503de3ef1b2c\",\"dweb:/ipfs/QmVnnv5u74MYatfRmBgrcfFYQcsMAJMG9jQ6ju8UiydKNF\"]},\"lib/v4-core/src/libraries/NonZeroDeltaCount.sol\":{\"keccak256\":\"0x6b7e23f470b8352efdbf459a34dd0dcfdbe03e623cb4de67f4ad9be326691586\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b86af075e2331f7a065b15d91253f2ce6b845dfe09493338f2d7cdab6f9e4cc2\",\"dweb:/ipfs/QmdzHJQapqAS42rMrYPgdvb4Sae7NVy3ESkNc1TuBRcxUC\"]},\"lib/v4-core/src/libraries/ParseBytes.sol\":{\"keccak256\":\"0xf0795198d1e651b0b33fd1708d80a14f501bb2a1486905676d35f364e880f579\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5aea527fcec51d7274f0c189dc2479a6aa708fc91857187a4d7db46bb1d6c7a8\",\"dweb:/ipfs/QmUTrwTPSZ7EHBaTyfAA78rZVP17iQzmAmvDcQ8GhDRAEf\"]},\"lib/v4-core/src/libraries/Pool.sol\":{\"keccak256\":\"0x7a506727ae59f5b5487a0a16ec1d7038b7c2a4ee5f4a7fa7c444ec7df6ad5a7c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://befdd15aee06a7b2a3c64cb899220ec03a1ae8470ad17e19050bcca1ac5266a8\",\"dweb:/ipfs/QmWPfBgfp5VKnku9ZtKXwYycyKdAZuCj6778T2HFrfQ61H\"]},\"lib/v4-core/src/libraries/Position.sol\":{\"keccak256\":\"0x0309a650890f1cd93e2b4b1e9a40032d5feb8c6a0ccc24be24373bfd7590ff80\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://63aae574b22048f1453da8f9142374e334683bb3a069c2312f73e6b857842bce\",\"dweb:/ipfs/QmcJZK3kU4jsWfJKBpRq2kaouutEDHcytgMX8ZaGeBsbgu\"]},\"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol\":{\"keccak256\":\"0x2739e8f54707c6a0e23f9c61a0783dd18b107c3fc287b2827f1ab4b41f891902\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2e3b154410bbfcbe8808c6dfb74c4bbbac50a59e228cee59b34e169dbd34ee1a\",\"dweb:/ipfs/QmcRoM6T2F7FTHtGdD5aRiVthCon8oiWur661GCrk5FejP\"]},\"lib/v4-core/src/libraries/SafeCast.sol\":{\"keccak256\":\"0xbccc4f8d5d467d162d7f0ab5a7f22bcccf05ae07577b9728c9e3030c63977e60\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0003ea7a515ba709a3fdeaa19e7930c1f883b3b4fbdbf389d4f2f85b25eb72b4\",\"dweb:/ipfs/QmYs8uNcYRGuGUbeBfF27fhArNaQ5Y9iMCTMfgic5d39fM\"]},\"lib/v4-core/src/libraries/SqrtPriceMath.sol\":{\"keccak256\":\"0x1a5a8fd4a21cec19c0c253201e9b5534e8d810eb132bceee04af37fd78adb5db\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://afa2a5950c9057fd3c00a6f413fba91c4c7dab06d573f7349aaf8f806c0e1f31\",\"dweb:/ipfs/Qmb2m62xAPRBtxtx3sV7MAFw2vHWNm9m49ctPHmFX5hozt\"]},\"lib/v4-core/src/libraries/StateLibrary.sol\":{\"keccak256\":\"0x67ead4d1ffe7e4fc381cef059c8d4941c7b4d581ef043fc8d3278d0829da414e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0d12edd46a3ff2e19ea9b650507ea22e7714daa335a6b40f4d2f6d29c16431e4\",\"dweb:/ipfs/QmZn6dzXZgR3rGohZAvKzqYMgm5n9qTrpi1VhXizYhiquH\"]},\"lib/v4-core/src/libraries/SwapMath.sol\":{\"keccak256\":\"0xa8cedd0f63b2d8b6faac60455f499c79816f53fbd86f3bb0706fae426b2c231e\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8d926c2df899b21811862d106d5e1d2b5bdf83c76ae6ff4216e7c9ce443d8e75\",\"dweb:/ipfs/QmTTVSCumUXZ4vf3R1GwfqJSTgLFyjueuxZkRH9U6dsTb3\"]},\"lib/v4-core/src/libraries/TickBitmap.sol\":{\"keccak256\":\"0x23abd96aa808657304affd775666d7cc5fb0ab564f87d1b65fbf8dc5877d9cd6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4c7686aefb704a3efe97cc0e8f180ed48f7667f5ae69d3754962f04352c66b79\",\"dweb:/ipfs/QmULiCBW9s2hB6SmnJTi2wiAwgkLXpZJcdVZm9f77zDNuc\"]},\"lib/v4-core/src/libraries/TickMath.sol\":{\"keccak256\":\"0x64c668177d82bb185d902fb2190630ccb67babb6439422979692ac2f8dfb6dcd\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e2714a025df18c22f20b358b7143e8a5c55cffb20c7de292be0376845a5f0408\",\"dweb:/ipfs/QmWaeCkxwkVuReFUSK2nDat1BB5DJ8BUowwGwmVyKpsrME\"]},\"lib/v4-core/src/libraries/TransientStateLibrary.sol\":{\"keccak256\":\"0x1bc28f30c176c7c598522da0d8907a90c4cd8ecce81775bb4deb3a9b78782f86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb5c05fb51e59ef168ba884c4ea3627525dba9feea0de9ffa0587438f70fd095\",\"dweb:/ipfs/Qmbx3ntPDZ9VeGsAnVNSM5DKmhPg92yobh5ZHbvdGWtHUd\"]},\"lib/v4-core/src/libraries/UnsafeMath.sol\":{\"keccak256\":\"0xe9b87da934af38419d4b5f20cc09943dbb569425448fc23fdc5ec6aebbb63c84\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://29838c28905c34f9602a453759b55f5acc6aff02bf6d7a6afac5d1a245dd5db3\",\"dweb:/ipfs/QmfN5bhLFw1CsnnaJQNZd3bLpLufQcwt9ztaR71LA43UGY\"]},\"lib/v4-core/src/test/PoolModifyLiquidityTest.sol\":{\"keccak256\":\"0x4578759af55db566eee1d19c19a285710b1d301b511e37df4a1072c2d5a47ade\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://aa6588f1f695efe625241fdbad07730611c8bec77d963698c6412775b7dd68a7\",\"dweb:/ipfs/QmeDGAKa9sR6Wk5ibyzt4YGa6tdtjmFPzJafMbBgkWRB9d\"]},\"lib/v4-core/src/test/PoolTestBase.sol\":{\"keccak256\":\"0x71db5a5215d858124dd2ccf73c4474421651f248e4c85d33455d95abced0a23c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://fac0df901621d44a1b98ce4569616940ca6700e7829357bdf18509237b822072\",\"dweb:/ipfs/Qmf9sWokQvzmKfAY6Vd4QzyTyhikqCb8zUowrFPe9DRxs5\"]},\"lib/v4-core/src/types/BalanceDelta.sol\":{\"keccak256\":\"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9\",\"dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H\"]},\"lib/v4-core/src/types/BeforeSwapDelta.sol\":{\"keccak256\":\"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782\",\"dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K\"]},\"lib/v4-core/src/types/Currency.sol\":{\"keccak256\":\"0xc77e2d4d380be1887078b1d21e2381fe4e9138dce8c7efbf9050aa7d65d75d4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b85a1edba4be624be660d69badac1e3641d83190893839fa30260eef316d00c8\",\"dweb:/ipfs/QmPaEaeNkhy5F4X9dwzyDzVU3H67P5ZhpeijDS7wscaSd9\"]},\"lib/v4-core/src/types/PoolId.sol\":{\"keccak256\":\"0x6946552d4f78712c769df47a9187aa0add8737bb6d06ef04b63a33a3c0ff59f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://637851aaa9e06ff59b517e6da17dad3476968c0bc62e141158f76526a8f9c79f\",\"dweb:/ipfs/QmVUxPCRCBE23XQdCrroeUuFqNTtq2LvJaDYmp43QGNsMB\"]},\"lib/v4-core/src/types/PoolKey.sol\":{\"keccak256\":\"0x10a2ff74d87d105f52c6c10f0c6ea0548c12a75dfb979abab8a8b7d647305162\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a0680665f799067c0f0238e864e363c265ff23188dfe6ae1c4738f7d0a281ccf\",\"dweb:/ipfs/QmRCkZhaPknrV9cHkUiU3HVyMYYT3UaD8RfptHi4qB62zY\"]},\"lib/v4-core/src/types/Slot0.sol\":{\"keccak256\":\"0x8b4912fac7e25ea680056748121113f902d56f8b2640f421d5c38d438db11c1b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c19b1ff5b951fb54129268d2be37d82c8bb3ea6e29ac9bc78a8a37794fc082b8\",\"dweb:/ipfs/QmTAQ2mUoiT77hoWJAfn9pyoGy47qaevn45QHrbyovGt2C\"]},\"lib/v4-core/test/utils/CurrencySettler.sol\":{\"keccak256\":\"0xf5d04aa76b3ac6ff75396661e75ec612035ebd73d23eb6f4e207dbd46392688e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://67a67b94a2987309f06003374ddfc30ab8e81d9fec3b1585e93871eec6966d96\",\"dweb:/ipfs/QmYLzboZNfXoNufKX8UYMGhHVChqMK96vwFWjKeoWcfb24\"]},\"src/ArenaController.sol\":{\"keccak256\":\"0x283b2a7746fea5d3d0ee624e6f01273b4e8ea15bfe4b2d187252c8a6f628d2f3\",\"urls\":[\"bzz-raw://96bd158c46b98502d4a470e39d5e927c373976d1d9c3fb8e2e2a00dc71af9877\",\"dweb:/ipfs/QmUTEYVEHHwJrmP9zvJhyhnsY5TpGvYs3BiZy5sFLqM9ic\"]},\"src/ArenaToken.sol\":{\"keccak256\":\"0x59ea858a9c33398efbfb770c958c1f544425ad32d73a3cd3991f6834ec04028a\",\"urls\":[\"bzz-raw://242a38f560c8dc312e27a30dad15ddf2fccb4163f4f0692f814b3cfa71180105\",\"dweb:/ipfs/QmZqhSdNeRiVf5rJJYgX48SiUi1dwgpYAvMo6a7XBVRjXF\"]},\"src/Fetcher.sol\":{\"keccak256\":\"0x1895e5c0688650ca60371f208b62d9f64beea29bd7515b2600a1c8d5c73805df\",\"urls\":[\"bzz-raw://f9c904c9d032167f6d8fec1392c9a023f339a4aee9f75f06df6347a495af9d38\",\"dweb:/ipfs/QmYSaPzRawAnh2qD3JY5uvWypEueo5hSTQVyVFfX96msfb\"]},\"src/LiquidExchange.sol\":{\"keccak256\":\"0xc979e540abc8a2d1bc82f2c741beb4ea9037c7e69ab11a5a20ef11ab7b9cee22\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e5f08cb7b8685020a78fd9b84d740649dcbf9ba92057cc5914d829f275d396c5\",\"dweb:/ipfs/QmQKVvRCmSumaf2xtbLey6KdUyt9bfTLeq9gPGssisJi17\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"stateMutability":"nonpayable","type":"function","name":"addLiquidity"},{"inputs":[],"stateMutability":"view","type":"function","name":"constructSignal","outputs":[{"internalType":"struct ArenaController.Signal","name":"","type":"tuple","components":[{"internalType":"int24","name":"currentTick","type":"int24"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"lexPrice","type":"uint256"},{"internalType":"struct PoolKey","name":"pool","type":"tuple","components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}]},{"internalType":"address","name":"fetcher","type":"address"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"poolKey","outputs":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}]},{"inputs":[{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"bytes","name":"hookData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setPool"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setPrice"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"swapOnLex"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@ensdomains/=lib/v4-core/node_modules/@ensdomains/","@openzeppelin/=lib/v4-core/lib/openzeppelin-contracts/","@openzeppelin/contracts/=lib/v4-core/lib/openzeppelin-contracts/contracts/","ds-test/=lib/solmate/lib/ds-test/src/","erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-gas-snapshot/=lib/v4-core/lib/forge-gas-snapshot/src/","forge-std/=lib/forge-std/src/","hardhat/=lib/v4-core/node_modules/hardhat/","openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/","solmate/=lib/solmate/src/","v4-core/=lib/v4-core/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/ArenaController.sol":"ArenaController"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/solmate/src/auth/Owned.sol":{"keccak256":"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea","urls":["bzz-raw://1ff52bbee698b9cf9e4574615e6550be0887ccf355f6571e23d6f25b332e79b4","dweb:/ipfs/QmVorA2apojVRStzS7h8aFccR3Uv32G6HVtBtFHZrE7YXx"],"license":"AGPL-3.0-only"},"lib/solmate/src/tokens/ERC20.sol":{"keccak256":"0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10","urls":["bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35","dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97"],"license":"AGPL-3.0-only"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x1b62af9baf5b8e991ed7531bc87f45550ba9d61e8dbff5caf237ccaf3a3fd843","urls":["bzz-raw://b7b38b977c5305b18ceefbeed4c9ceaaaefa419b520de62de6604ea661f8c0a9","dweb:/ipfs/QmecMRzgfMyDVa2pvBqMMDLYBappaj7Aa3qcMoQYEQrhWi"],"license":"AGPL-3.0-only"},"lib/v4-core/src/ERC6909.sol":{"keccak256":"0x22476a1c183be1b547a509b3e6906abaccb6408375f798fce805ff7877aca09f","urls":["bzz-raw://e85580e1563ea0556705132fb6bd038ca4aa355749039923853ebcb76b7c84e6","dweb:/ipfs/QmVoxPrbagRKpFdRWoaCSKmStYLZrhNFuedcuyGycSGR7q"],"license":"MIT"},"lib/v4-core/src/ERC6909Claims.sol":{"keccak256":"0xf496ef3a5a9bf4f4aa2eec951dbeff09a01ef058bb9f64b1664cf46c9e85cd49","urls":["bzz-raw://2a0a97c359a7a4c526ba9fc4ceb20af8050f9cf7886ea7e1f38c9c10b4a3750c","dweb:/ipfs/QmPy6pCQbvzCdJRqG1thHRSwEZoLBAaLo3KQnueL3wxb8i"],"license":"MIT"},"lib/v4-core/src/Extsload.sol":{"keccak256":"0x784074bd04a1541c7c6ace074e30245746133fd37c3ba16b025dce394db986ce","urls":["bzz-raw://35f1f4fb306bf01e98b7eca012b85f3ab978b39fa5136193363e2519c4435e51","dweb:/ipfs/QmeGrjGMt71dJymVhkEadh5CuCW5GxRqNEZLi5AJxvC5tU"],"license":"MIT"},"lib/v4-core/src/Exttload.sol":{"keccak256":"0x769ee2733a08112c652274f4b972c45fb56cc46109f233b9a30f81561b15dd54","urls":["bzz-raw://dd19e88d50ae77c1ed5581baca1c75b3fb828d0b58cded90188d55c4e336266c","dweb:/ipfs/Qmc8YM6Tfpwwa4qivHHzRxNdhZzdzGiD7VexWsDvkaQTxG"],"license":"MIT"},"lib/v4-core/src/NoDelegateCall.sol":{"keccak256":"0x5c238701785d16c58a1598daec0f72a2aaf47d5d017b9dd7441cc8093b65b202","urls":["bzz-raw://696cf79b74bc38e7316d94dfd8bdd9579a94f74121e9b65d2613eb59c106ea50","dweb:/ipfs/QmRttHmshQJ5E7EGaeBC7yT4wyzthNXZQJn7sy2nJvb4dB"],"license":"BUSL-1.1"},"lib/v4-core/src/PoolManager.sol":{"keccak256":"0xca5369a1683d06842268987fb6f46b05e6364a46cc856f72bb5c603826f47eac","urls":["bzz-raw://5ae5893222abc5dc5fa57bc05af40b60a96a1537bd3c1f3845257d6a3c2b5821","dweb:/ipfs/QmZxQH8M3NVunurxDNJ5EZm2fy6Ws8CHJSezCQaoqzMPoq"],"license":"BUSL-1.1"},"lib/v4-core/src/ProtocolFees.sol":{"keccak256":"0x2e7533e46dcab5508ed417ab33c2d0ca8c52a6b5f445dd90daf328173ada4449","urls":["bzz-raw://8403de6f2c89a665a3ff3566a917179a5bfb3e0ac9514f0438d82270a7f98c91","dweb:/ipfs/QmTq9cjKTaXeCoSfCywpFwo7sNvuXM4wSMnebwX3hBuiRG"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/interfaces/IExtsload.sol":{"keccak256":"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43","urls":["bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1","dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN"],"license":"MIT"},"lib/v4-core/src/interfaces/IExttload.sol":{"keccak256":"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937","urls":["bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8","dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY"],"license":"MIT"},"lib/v4-core/src/interfaces/IHooks.sol":{"keccak256":"0xdbaf1db938b70f77eb4ddbad5b8d2a1fc648c7d65ca2a312aba16cc013c85df0","urls":["bzz-raw://4ad2d9c85116a2e51281dd40577c798d6d5968be1f8908f43ba152849809deaa","dweb:/ipfs/QmZP4kk9KJzoxv81EgsTfHnJeU8YUxX3yWZudJHbxQjpa8"],"license":"MIT"},"lib/v4-core/src/interfaces/IPoolManager.sol":{"keccak256":"0x4e07d93993f6ba033c8b5e5b0a3473659aeffe9af0cf8316a879a55ebd696d7a","urls":["bzz-raw://50add8378d59b89b1dc106ea248641caaedd3ac45d62754babe55c526b87c9ad","dweb:/ipfs/QmQUrvy8ZDDdTRTr17msqynVECP3rQFBVBUmFcpFvjAmQx"],"license":"MIT"},"lib/v4-core/src/interfaces/IProtocolFeeController.sol":{"keccak256":"0xc2d7f3605da9767e36cf25d4d4fa9b95663a6659e26ce28cf29b8b88acb79a4c","urls":["bzz-raw://c7a43cda35b8a9254ed3e46cfd8649361f09121d17ef554bd3d190b9a8d57cc6","dweb:/ipfs/QmRBDQoqCWddH5hY1JdxMyYtY8jMZhWAwtuFJBc3r8V31G"],"license":"MIT"},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"keccak256":"0x68700020df618c5715737e57630876ec22ccde2d31191a5608babb9f140ed297","urls":["bzz-raw://56b7bb6786f48fff8c9d04e9054955b8cf3d9f5bf819ccda7be192ad2004a27f","dweb:/ipfs/QmZKmUvcYnyihEFySD6SY9osMkP8M1Y7a4kPxLQycEyThw"],"license":"MIT"},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"keccak256":"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719","urls":["bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b","dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK"],"license":"MIT"},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"keccak256":"0xc1c23330c1511ecfd45c67a683962b4e2555b82f1dacd40cc8b46ae5a6e250e7","urls":["bzz-raw://5ce10b7970482a65f9e9a365b810eeb154a5d4a8229a26653028d84b9622a410","dweb:/ipfs/QmTSwXxZ2FTkM5duBZgbpFs8SRVDR5NPAnW4YimeDhb1s8"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"keccak256":"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48","urls":["bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f","dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK"],"license":"MIT"},"lib/v4-core/src/libraries/BitMath.sol":{"keccak256":"0x59e18adcff8917b0965a240d88b34d5d800e0efebd5f40c5594ddcf28a15949b","urls":["bzz-raw://d358beebf8d5079520b6e138d744e5063ecbfbeae355c08af86a3b74afa71b09","dweb:/ipfs/QmUXmAK9aoxnaeykq8MLXoRKP8yGTDyY3jPFMwHnqRxf46"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/CurrencyDelta.sol":{"keccak256":"0xb1eb18c3794b67f4f710229df279d3a630a963194fbbeb51906198ec7145b98e","urls":["bzz-raw://e5ea08b69754250cf04cc544785320f5c8fd8b9a65e5d9e0bc44aadadaa9ea0c","dweb:/ipfs/QmWW1qfqGydoiSeDtVVQ53nV3FphuUgH1PFUC3uGaWzxWR"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/CurrencyReserves.sol":{"keccak256":"0xdeffc5cf2f8f7d3f802998941061392c0c926a32c7105ffd9f902ab84d3a31c6","urls":["bzz-raw://869bd659c5593bc525ce4d44771d85eb8acb74a7f0492802bdcc79d2bfdfcaf7","dweb:/ipfs/QmSrTWzUHrou7ZxcuFXQhvzXmEgbLeCtwAqeS6k9vD22h3"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/CustomRevert.sol":{"keccak256":"0x70a444afeb27564398dbdf7553651ee2cae14c03c923b6f8972040c8f460ebe3","urls":["bzz-raw://9d7b05390bac9b29188725c8a84edac43cd05571da27b33a0b1e36d9500ecaa6","dweb:/ipfs/QmdYDLwTfFgePDEwFMUqGTj8SNNXXq4JQJnrgomJgcZFvP"],"license":"MIT"},"lib/v4-core/src/libraries/FixedPoint128.sol":{"keccak256":"0xc7e80dc41f28887d0d915a75c0b2783ae659e5384dd1a3ed1251a42e058d8835","urls":["bzz-raw://2df62bf1d9d4349236fd0bc7a96b3a3be95f4c049603e4a20c8473cca9402b4d","dweb:/ipfs/QmVR5dmMkoypmhaBeBj8cGegHpJycbofUDg59dHm42i9MT"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/FixedPoint96.sol":{"keccak256":"0xf0a545fc5bbc271e8dbd191413dc03e8725d1f003df4d9d36ea7cdb73058c417","urls":["bzz-raw://5d1013d8b5c93024526f129b0a9271b35c578da09bcfe6c3240ff4d590ebc196","dweb:/ipfs/QmX1GyF9jJhYGXst6PyK6HJvcfVQ69nNTnuBEBaEiAZPv7"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/FullMath.sol":{"keccak256":"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2","urls":["bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52","dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC"],"license":"MIT"},"lib/v4-core/src/libraries/Hooks.sol":{"keccak256":"0xfa031f4efc096e9c93bb094509321e1c08b5eb271f46554f858e74803c43ae66","urls":["bzz-raw://7cc33d5eb869ecacfb70d024f7b925d191d98553dbb921bd8188f97d51c9e111","dweb:/ipfs/Qme5VCnaS5mXyqaWV5uiW5xcmTb56uCKBPFrLZp2dq41dQ"],"license":"MIT"},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"keccak256":"0xfbebd6766871b795d945a74b6110931f73fc775aeeecc2682d6d6ca841a01ece","urls":["bzz-raw://36fcc7098454971ae16d790ee9aee227c22c5cbbd7ff6e27e58ac29b901d5896","dweb:/ipfs/QmboCGTWtycGpda7E169pD67Fox2H9b1YRsNHcsxBRrhfo"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/LiquidityMath.sol":{"keccak256":"0x4a04b9383e2fb943c2c3ae7d0c9071b58dd97b6dac0a409fe1c79c3ca897bbcf","urls":["bzz-raw://0b33cf0ff936f62aa7f3b82922fa0ac52ac24471561e87fbf7ab8372607f6dfc","dweb:/ipfs/Qmcr6omwzJjQPu6HQ8E9vFXaTgrtqfb2KbfxbuQavfUzFa"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/Lock.sol":{"keccak256":"0x9338be4b5695f1da5f3d3f7a3eeaf7a356c1045458289586ac0cbe9cef77c6d5","urls":["bzz-raw://485ec42ed6155469d612a9a0c18068ebfbad74448792a338a435503de3ef1b2c","dweb:/ipfs/QmVnnv5u74MYatfRmBgrcfFYQcsMAJMG9jQ6ju8UiydKNF"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/NonZeroDeltaCount.sol":{"keccak256":"0x6b7e23f470b8352efdbf459a34dd0dcfdbe03e623cb4de67f4ad9be326691586","urls":["bzz-raw://b86af075e2331f7a065b15d91253f2ce6b845dfe09493338f2d7cdab6f9e4cc2","dweb:/ipfs/QmdzHJQapqAS42rMrYPgdvb4Sae7NVy3ESkNc1TuBRcxUC"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/ParseBytes.sol":{"keccak256":"0xf0795198d1e651b0b33fd1708d80a14f501bb2a1486905676d35f364e880f579","urls":["bzz-raw://5aea527fcec51d7274f0c189dc2479a6aa708fc91857187a4d7db46bb1d6c7a8","dweb:/ipfs/QmUTrwTPSZ7EHBaTyfAA78rZVP17iQzmAmvDcQ8GhDRAEf"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/Pool.sol":{"keccak256":"0x7a506727ae59f5b5487a0a16ec1d7038b7c2a4ee5f4a7fa7c444ec7df6ad5a7c","urls":["bzz-raw://befdd15aee06a7b2a3c64cb899220ec03a1ae8470ad17e19050bcca1ac5266a8","dweb:/ipfs/QmWPfBgfp5VKnku9ZtKXwYycyKdAZuCj6778T2HFrfQ61H"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/Position.sol":{"keccak256":"0x0309a650890f1cd93e2b4b1e9a40032d5feb8c6a0ccc24be24373bfd7590ff80","urls":["bzz-raw://63aae574b22048f1453da8f9142374e334683bb3a069c2312f73e6b857842bce","dweb:/ipfs/QmcJZK3kU4jsWfJKBpRq2kaouutEDHcytgMX8ZaGeBsbgu"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol":{"keccak256":"0x2739e8f54707c6a0e23f9c61a0783dd18b107c3fc287b2827f1ab4b41f891902","urls":["bzz-raw://2e3b154410bbfcbe8808c6dfb74c4bbbac50a59e228cee59b34e169dbd34ee1a","dweb:/ipfs/QmcRoM6T2F7FTHtGdD5aRiVthCon8oiWur661GCrk5FejP"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/SafeCast.sol":{"keccak256":"0xbccc4f8d5d467d162d7f0ab5a7f22bcccf05ae07577b9728c9e3030c63977e60","urls":["bzz-raw://0003ea7a515ba709a3fdeaa19e7930c1f883b3b4fbdbf389d4f2f85b25eb72b4","dweb:/ipfs/QmYs8uNcYRGuGUbeBfF27fhArNaQ5Y9iMCTMfgic5d39fM"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/SqrtPriceMath.sol":{"keccak256":"0x1a5a8fd4a21cec19c0c253201e9b5534e8d810eb132bceee04af37fd78adb5db","urls":["bzz-raw://afa2a5950c9057fd3c00a6f413fba91c4c7dab06d573f7349aaf8f806c0e1f31","dweb:/ipfs/Qmb2m62xAPRBtxtx3sV7MAFw2vHWNm9m49ctPHmFX5hozt"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/StateLibrary.sol":{"keccak256":"0x67ead4d1ffe7e4fc381cef059c8d4941c7b4d581ef043fc8d3278d0829da414e","urls":["bzz-raw://0d12edd46a3ff2e19ea9b650507ea22e7714daa335a6b40f4d2f6d29c16431e4","dweb:/ipfs/QmZn6dzXZgR3rGohZAvKzqYMgm5n9qTrpi1VhXizYhiquH"],"license":"MIT"},"lib/v4-core/src/libraries/SwapMath.sol":{"keccak256":"0xa8cedd0f63b2d8b6faac60455f499c79816f53fbd86f3bb0706fae426b2c231e","urls":["bzz-raw://8d926c2df899b21811862d106d5e1d2b5bdf83c76ae6ff4216e7c9ce443d8e75","dweb:/ipfs/QmTTVSCumUXZ4vf3R1GwfqJSTgLFyjueuxZkRH9U6dsTb3"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/TickBitmap.sol":{"keccak256":"0x23abd96aa808657304affd775666d7cc5fb0ab564f87d1b65fbf8dc5877d9cd6","urls":["bzz-raw://4c7686aefb704a3efe97cc0e8f180ed48f7667f5ae69d3754962f04352c66b79","dweb:/ipfs/QmULiCBW9s2hB6SmnJTi2wiAwgkLXpZJcdVZm9f77zDNuc"],"license":"MIT"},"lib/v4-core/src/libraries/TickMath.sol":{"keccak256":"0x64c668177d82bb185d902fb2190630ccb67babb6439422979692ac2f8dfb6dcd","urls":["bzz-raw://e2714a025df18c22f20b358b7143e8a5c55cffb20c7de292be0376845a5f0408","dweb:/ipfs/QmWaeCkxwkVuReFUSK2nDat1BB5DJ8BUowwGwmVyKpsrME"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/TransientStateLibrary.sol":{"keccak256":"0x1bc28f30c176c7c598522da0d8907a90c4cd8ecce81775bb4deb3a9b78782f86","urls":["bzz-raw://fb5c05fb51e59ef168ba884c4ea3627525dba9feea0de9ffa0587438f70fd095","dweb:/ipfs/Qmbx3ntPDZ9VeGsAnVNSM5DKmhPg92yobh5ZHbvdGWtHUd"],"license":"MIT"},"lib/v4-core/src/libraries/UnsafeMath.sol":{"keccak256":"0xe9b87da934af38419d4b5f20cc09943dbb569425448fc23fdc5ec6aebbb63c84","urls":["bzz-raw://29838c28905c34f9602a453759b55f5acc6aff02bf6d7a6afac5d1a245dd5db3","dweb:/ipfs/QmfN5bhLFw1CsnnaJQNZd3bLpLufQcwt9ztaR71LA43UGY"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/test/PoolModifyLiquidityTest.sol":{"keccak256":"0x4578759af55db566eee1d19c19a285710b1d301b511e37df4a1072c2d5a47ade","urls":["bzz-raw://aa6588f1f695efe625241fdbad07730611c8bec77d963698c6412775b7dd68a7","dweb:/ipfs/QmeDGAKa9sR6Wk5ibyzt4YGa6tdtjmFPzJafMbBgkWRB9d"],"license":"UNLICENSED"},"lib/v4-core/src/test/PoolTestBase.sol":{"keccak256":"0x71db5a5215d858124dd2ccf73c4474421651f248e4c85d33455d95abced0a23c","urls":["bzz-raw://fac0df901621d44a1b98ce4569616940ca6700e7829357bdf18509237b822072","dweb:/ipfs/Qmf9sWokQvzmKfAY6Vd4QzyTyhikqCb8zUowrFPe9DRxs5"],"license":"UNLICENSED"},"lib/v4-core/src/types/BalanceDelta.sol":{"keccak256":"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f","urls":["bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9","dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H"],"license":"MIT"},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"keccak256":"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78","urls":["bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782","dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K"],"license":"MIT"},"lib/v4-core/src/types/Currency.sol":{"keccak256":"0xc77e2d4d380be1887078b1d21e2381fe4e9138dce8c7efbf9050aa7d65d75d4c","urls":["bzz-raw://b85a1edba4be624be660d69badac1e3641d83190893839fa30260eef316d00c8","dweb:/ipfs/QmPaEaeNkhy5F4X9dwzyDzVU3H67P5ZhpeijDS7wscaSd9"],"license":"MIT"},"lib/v4-core/src/types/PoolId.sol":{"keccak256":"0x6946552d4f78712c769df47a9187aa0add8737bb6d06ef04b63a33a3c0ff59f8","urls":["bzz-raw://637851aaa9e06ff59b517e6da17dad3476968c0bc62e141158f76526a8f9c79f","dweb:/ipfs/QmVUxPCRCBE23XQdCrroeUuFqNTtq2LvJaDYmp43QGNsMB"],"license":"MIT"},"lib/v4-core/src/types/PoolKey.sol":{"keccak256":"0x10a2ff74d87d105f52c6c10f0c6ea0548c12a75dfb979abab8a8b7d647305162","urls":["bzz-raw://a0680665f799067c0f0238e864e363c265ff23188dfe6ae1c4738f7d0a281ccf","dweb:/ipfs/QmRCkZhaPknrV9cHkUiU3HVyMYYT3UaD8RfptHi4qB62zY"],"license":"MIT"},"lib/v4-core/src/types/Slot0.sol":{"keccak256":"0x8b4912fac7e25ea680056748121113f902d56f8b2640f421d5c38d438db11c1b","urls":["bzz-raw://c19b1ff5b951fb54129268d2be37d82c8bb3ea6e29ac9bc78a8a37794fc082b8","dweb:/ipfs/QmTAQ2mUoiT77hoWJAfn9pyoGy47qaevn45QHrbyovGt2C"],"license":"MIT"},"lib/v4-core/test/utils/CurrencySettler.sol":{"keccak256":"0xf5d04aa76b3ac6ff75396661e75ec612035ebd73d23eb6f4e207dbd46392688e","urls":["bzz-raw://67a67b94a2987309f06003374ddfc30ab8e81d9fec3b1585e93871eec6966d96","dweb:/ipfs/QmYLzboZNfXoNufKX8UYMGhHVChqMK96vwFWjKeoWcfb24"],"license":"MIT"},"src/ArenaController.sol":{"keccak256":"0x283b2a7746fea5d3d0ee624e6f01273b4e8ea15bfe4b2d187252c8a6f628d2f3","urls":["bzz-raw://96bd158c46b98502d4a470e39d5e927c373976d1d9c3fb8e2e2a00dc71af9877","dweb:/ipfs/QmUTEYVEHHwJrmP9zvJhyhnsY5TpGvYs3BiZy5sFLqM9ic"],"license":null},"src/ArenaToken.sol":{"keccak256":"0x59ea858a9c33398efbfb770c958c1f544425ad32d73a3cd3991f6834ec04028a","urls":["bzz-raw://242a38f560c8dc312e27a30dad15ddf2fccb4163f4f0692f814b3cfa71180105","dweb:/ipfs/QmZqhSdNeRiVf5rJJYgX48SiUi1dwgpYAvMo6a7XBVRjXF"],"license":null},"src/Fetcher.sol":{"keccak256":"0x1895e5c0688650ca60371f208b62d9f64beea29bd7515b2600a1c8d5c73805df","urls":["bzz-raw://f9c904c9d032167f6d8fec1392c9a023f339a4aee9f75f06df6347a495af9d38","dweb:/ipfs/QmYSaPzRawAnh2qD3JY5uvWypEueo5hSTQVyVFfX96msfb"],"license":null},"src/LiquidExchange.sol":{"keccak256":"0xc979e540abc8a2d1bc82f2c741beb4ea9037c7e69ab11a5a20ef11ab7b9cee22","urls":["bzz-raw://e5f08cb7b8685020a78fd9b84d740649dcbf9ba92057cc5914d829f275d396c5","dweb:/ipfs/QmQKVvRCmSumaf2xtbLey6KdUyt9bfTLeq9gPGssisJi17"],"license":"MIT"}},"version":1},"id":52} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"fee","type":"uint256","internalType":"uint256"},{"name":"initialPrice","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_PRICE_LIMIT","inputs":[],"outputs":[{"name":"","type":"uint160","internalType":"uint160"}],"stateMutability":"view"},{"type":"function","name":"MIN_PRICE_LIMIT","inputs":[],"outputs":[{"name":"","type":"uint160","internalType":"uint160"}],"stateMutability":"view"},{"type":"function","name":"addLiquidity","inputs":[{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"computeSwapStep","inputs":[{"name":"sqrtPriceCurrentX96","type":"uint160","internalType":"uint160"},{"name":"sqrtPriceTargetX96","type":"uint160","internalType":"uint160"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"amountRemaining","type":"int256","internalType":"int256"},{"name":"feePips","type":"uint24","internalType":"uint24"}],"outputs":[{"name":"sqrtPriceNextX96","type":"uint160","internalType":"uint160"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"amountOut","type":"uint256","internalType":"uint256"},{"name":"feeAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"constructSignal","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct ArenaController.Signal","components":[{"name":"currentTick","type":"int24","internalType":"int24"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"manager","type":"address","internalType":"address"},{"name":"lexPrice","type":"uint256","internalType":"uint256"},{"name":"pool","type":"tuple","internalType":"struct PoolKey","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}]},{"name":"fetcher","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"equalizePrice","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"poolKey","inputs":[],"outputs":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"stateMutability":"view"},{"type":"function","name":"setPool","inputs":[{"name":"poolFee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPrice","inputs":[{"name":"price","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"swapOnLex","inputs":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x610160604052348015610010575f80fd5b5060405161bb5738038061bb5783398101604081905261002f916104a2565b8160405161003c90610454565b908152602001604051809103905ff08015801561005b573d5f803e3d5ffd5b506001600160a01b0316608081905260405161007690610461565b6001600160a01b039091168152602001604051809103905ff08015801561009f573d5f803e3d5ffd5b506001600160a01b031660a0526080516040516100bb9061046e565b6001600160a01b039091168152602001604051809103905ff0801580156100e4573d5f803e3d5ffd5b506001600160a01b031660c0526040516100fd9061047b565b604051809103905ff080158015610116573d5f803e3d5ffd5b506001600160a01b03166101005260405160129061013390610488565b606080825260099082015268063757272656e6379360bc1b608082015260a06020820181905260029082015261063360f41b60c082015260ff909116604082015260e001604051809103905ff080158015610190573d5f803e3d5ffd5b506001600160a01b0316610120526040516012906101ad90610488565b60608082526009908201526863757272656e63793160b81b608082015260a06020820181905260029082015261633160f01b60c082015260ff909116604082015260e001604051809103905ff08015801561020a573d5f803e3d5ffd5b506001600160a01b0390811661014081905261012051909116111561024657610140805161012080516001600160a01b03908116909352911690525b61012051610140518260405161025b90610495565b6001600160a01b0393841681529290911660208301526040820152606001604051809103905ff080158015610292573d5f803e3d5ffd5b506001600160a01b0390811660e052610120516040516340c10f1960e01b8152306004820152655af3107a400060248201529116906340c10f19906044016020604051808303815f875af11580156102ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031091906104c4565b6103755760405162461bcd60e51b815260206004820152602b60248201527f4d696e74696e672063757272656e63793020746f206c6971756964206578636860448201526a185b99d94819985a5b195960aa1b60648201526084015b60405180910390fd5b610140516040516340c10f1960e01b8152306004820152655af3107a400060248201526001600160a01b03909116906340c10f19906044016020604051808303815f875af11580156103c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ed91906104c4565b61044d5760405162461bcd60e51b815260206004820152602b60248201527f4d696e74696e672063757272656e63793120746f206c6971756964206578636860448201526a185b99d94819985a5b195960aa1b606482015260840161036c565b50506104ea565b61502b806122e483390190565b6116ad8061730f83390190565b6117d4806189bc83390190565b6105bc8061a19083390190565b610eea8061a74c83390190565b6105218061b63683390190565b5f80604083850312156104b3575f80fd5b505080516020909101519092909150565b5f602082840312156104d4575f80fd5b815180151581146104e3575f80fd5b9392505050565b60805160a05160c05160e051610100516101205161014051611d1d6105c75f395f81816106440152818161084401528181610c5a015261115b01525f81816105650152818161074801528181610b5e015261112c01525f81816102da0152818161051701528181610d140152610d6401525f818161043d01528181610e97015281816112a1015261132201525f8181610b2f01528181610c2b01528181610f81015261107a01525f818161071901528181610815015261093901525f81816103030152818161040e01528181610d43015261120a0152611d1d5ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063542524dd11610063578063542524dd1461020c5780636af577411461022c57806391b7f5ed1461023f57806396f5e27c14610252578063c7b8e15d14610265575f80fd5b8063014807031461009f57806306ba06fa14610139578063100d3f741461014e578063182148ef1461018b57806334d9900a14610204575b5f80fd5b6100a761026d565b604080518251600290810b82526020808501516001600160a01b03908116828501528585015181168486015260608087015181860152608080880151805184168288015293840151831660a0808801919091529684015162ffffff1660c08701529083015190930b60e08501529101518116610100830152919092015116610120820152610140015b60405180910390f35b61014c610147366004611809565b610541565b005b61016161015c36600461186c565b6109b5565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610130565b5f54600154600280546101c4936001600160a01b03908116938082169362ffffff600160a01b83041693600160b81b909204900b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a001610130565b61014c610b18565b6102146110fe565b6040516001600160a01b039091168152602001610130565b61014c61023a3660046118ef565b611120565b61014c61024d3660046119eb565b61128b565b61014c610260366004611a02565b6112fc565b610214611375565b6040805160c0810182525f80825260208083018290528284018290526060808401839052845160a080820187528482529281018490528086018490529081018390526080808201849052840152820181905291516332c961d960e01b815290919081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e631bcbf907f00000000000000000000000000000000000000000000000000000000000000009083906332c961d990610339908790600401611a71565b602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190611a85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401608060405180830381865afa1580156103bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e39190611a9c565b5050915091506040518060c001604052808260020b8152602001836001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610497573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104bb9190611a85565b81526040805160a0810182525f546001600160a01b03908116825260015480821660208481019190915262ffffff600160a01b83041684860152600160b81b909104600290810b606085015254821660808401528401919091527f0000000000000000000000000000000000000000000000000000000000000000169101529392505050565b5f831315610702576040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af11580156105b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d79190611af8565b6106285760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637930206661696c6564000000000000000060448201526064015b60405180910390fd5b6040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af1158015610692573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b69190611af8565b6107025760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637931206661696c65640000000000000000604482015260640161061f565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561078e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b29190611af8565b6107fe5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637930206661696c6564000000604482015260640161061f565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190611af8565b6108fa5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637931206661696c6564000000604482015260640161061f565b60408051608081018252600284810b825283900b60208201528082018590525f606082018190529151632d35e7ed60e11b815290916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691635a6bcfda9161096e918590600401611b17565b6020604051808303815f875af115801561098a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ae9190611a85565b5050505050565b5f80808062ffffff85166001600160a01b03808a16908b1610158288128015610a8b575f6109ee8a5f0385620f424003620f4240611385565b905082610a0757610a028d8d8d6001611422565b610a14565b610a148c8e8d600161146e565b9650868110610a48578b9750620f42408414610a3f57610a3a878586620f424003611533565b610a41565b865b9450610a61565b809650610a578d8c8386611563565b9750868a5f030394505b82610a7757610a728d898d5f61146e565b610a83565b610a83888e8d5f611422565b955050610b09565b81610aa157610a9c8c8c8c5f61146e565b610aad565b610aad8b8d8c5f611422565b9450848910610abe578a9650610ad0565b889450610acd8c8b87856115ba565b96505b81610ae757610ae28c888c6001611422565b610af4565b610af4878d8c600161146e565b9550610b06868485620f424003611533565b93505b50505095509550955095915050565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015610ba4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc89190611af8565b610c145760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637930206661696c6564000000604482015260640161061f565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015610ca0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc49190611af8565b610d105760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637931206661696c6564000000604482015260640161061f565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e631bcbf7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332c961d95f6040518263ffffffff1660e01b8152600401610dae9190611a71565b602060405180830381865afa158015610dc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ded9190611a85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401608060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190611a9c565b5050915091505f610e80836001600160a01b0316846001600160a01b0316600160c01b611385565b610e9290670de0b6b3a7640000611b7c565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f159190611a85565b90508082111561100357604080516060810182526001808252620f42406020830152915f91908101610f4d6401000276a36001611bb2565b6001600160a01b039081169091526040805180820182525f80825260208201819052915163088a742d60e21b8152939450927f000000000000000000000000000000000000000000000000000000000000000090921691632229d0b491610fba9186908690600401611bd1565b6020604051808303815f875af1158015610fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffa9190611a85565b505050506110f8565b808210156110f857604080516060810182525f8082526127106020830152918291908101611046600173fffd8963efd1fc6a506488495d951d5263988d26611b93565b6001600160a01b039081169091526040805180820182525f80825260208201819052915163088a742d60e21b8152939450927f000000000000000000000000000000000000000000000000000000000000000090921691632229d0b4916110b39186908690600401611bd1565b6020604051808303815f875af11580156110cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f39190611a85565b505050505b50505050565b61111d600173fffd8963efd1fc6a506488495d951d5263988d26611b93565b81565b6040805160a0810182527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081168083527f000000000000000000000000000000000000000000000000000000000000000082166020840181905262ffffff8a811685870181905260028b810b60608801528a861660809097018790525f80546001600160a01b03199081169096178155600180546001600160b81b031916909517600160a01b9093029290921762ffffff60b81b1916600160b81b938d16939093029290921790925580549092169093179055915163695c5bf560e01b81527f00000000000000000000000000000000000000000000000000000000000000009092169163695c5bf5916112439186908690600401611c31565b6020604051808303815f875af115801561125f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112839190611c86565b505050505050565b6040516391b7f5ed60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391b7f5ed906024015f604051808303815f87803b1580156112ea575f80fd5b505af11580156109ae573d5f803e3d5ffd5b60405163d004f0f760e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d004f0f7906044015f604051808303815f87803b158015611363575f80fd5b505af1158015611283573d5f803e3d5ffd5b61111d6401000276a36001611bb2565b5f838302815f19858709828110838203039150508084116113a4575f80fd5b805f036113b65750829004905061141b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b5f6001600160a01b038481169086160360ff81901d90810118600160601b6001600160801b038516611455818484611385565b9350845f83858409111684019350505050949350505050565b5f836001600160a01b0316856001600160a01b0316111561148d579293925b6001600160a01b0385166114a75762bfc9215f526004601cfd5b600160601b600160e01b03606084901b166001600160a01b0386860316836114fa57866001600160a01b03166114e78383896001600160a01b0316611385565b816114f4576114f4611ca1565b04611526565b6115266115118383896001600160a01b0316611533565b886001600160a01b0316808204910615150190565b925050505b949350505050565b5f61153f848484611385565b9050818061154f5761154f611ca1565b8385091561141b576001018061141b575f80fd5b5f6001600160801b038416156001600160a01b03861615171561158d57634f2461b85f526004601cfd5b816115a45761159f85858560016115fd565b6115b1565b6115b185858560016116e8565b95945050505050565b5f6001600160801b038416156001600160a01b0386161517156115e457634f2461b85f526004601cfd5b816115f55761159f8585855f6116e8565b6115b18585855f5b5f811561166d575f6001600160a01b038411156116315761162c84600160601b876001600160801b0316611385565b611648565b6116486001600160801b038616606086901b611cb5565b9050611665611660826001600160a01b038916611cd4565b6117ca565b91505061152b565b5f6001600160a01b0384111561169a5761169584600160601b876001600160801b0316611533565b6116b7565b6116b7606085901b6001600160801b038716808204910615150190565b9050806001600160a01b038716116116d657634323a5555f526004601cfd5b6001600160a01b03861603905061152b565b5f825f036116f757508361152b565b600160601b600160e01b03606085901b168215611789576001600160a01b0386168481029085828161172b5761172b611ca1565b040361175b578181018281106117595761174f83896001600160a01b031683611533565b935050505061152b565b505b5061166581856117746001600160a01b038a1683611cb5565b61177e9190611cd4565b808204910615150190565b6001600160a01b0386168481029085820414818311166117b05763f5c787f15f526004601cfd5b80820361174f611660846001600160a01b038b1684611533565b806001600160a01b03811681146117eb576117eb6393dafdf160e01b6117f0565b919050565b805f5260045ffd5b8060020b8114611806575f80fd5b50565b5f805f6060848603121561181b575f80fd5b83359250602084013561182d816117f8565b9150604084013561183d816117f8565b809150509250925092565b6001600160a01b0381168114611806575f80fd5b62ffffff81168114611806575f80fd5b5f805f805f60a08688031215611880575f80fd5b853561188b81611848565b9450602086013561189b81611848565b935060408601356001600160801b03811681146118b6575f80fd5b92506060860135915060808601356118cd8161185c565b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a08688031215611903575f80fd5b853561190e8161185c565b9450602086013561191e816117f8565b9350604086013561192e81611848565b9250606086013561193e81611848565b9150608086013567ffffffffffffffff811115611959575f80fd5b8601601f81018813611969575f80fd5b803567ffffffffffffffff811115611983576119836118db565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156119b2576119b26118db565b6040528181528282016020018a10156119c9575f80fd5b816020840160208301375f602083830101528093505050509295509295909350565b5f602082840312156119fb575f80fd5b5035919050565b5f8060408385031215611a13575f80fd5b8235611a1e81611848565b946020939093013593505050565b80546001600160a01b0390811683526001820154808216602085015260a081901c62ffffff16604085015260b81c600290810b60608501529091015416608090910152565b60a08101611a7f8284611a2c565b92915050565b5f60208284031215611a95575f80fd5b5051919050565b5f805f8060808587031215611aaf575f80fd5b8451611aba81611848565b6020860151909450611acb816117f8565b6040860151909350611adc8161185c565b6060860151909250611aed8161185c565b939692955090935050565b5f60208284031215611b08575f80fd5b8151801515811461141b575f80fd5b611b218184611a2c565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611a7f57611a7f611b68565b6001600160a01b038281168282160390811115611a7f57611a7f611b68565b6001600160a01b038181168382160190811115611a7f57611a7f611b68565b611bdb8185611a2c565b8251151560a082015260208084015160c08301526040909301516001600160a01b031660e082015281511515610100820152910151151561012082015261016061014082018190525f9082015261018001919050565b611c3b8185611a2c565b60018060a01b03831660a082015260e060c08201525f82518060e0840152806020850161010085015e5f6101008285010152610100601f19601f830116840101915050949350505050565b5f60208284031215611c96575f80fd5b815161141b816117f8565b634e487b7160e01b5f52601260045260245ffd5b5f82611ccf57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115611a7f57611a7f611b6856fea2646970667358221220df97a61bfb23d2bcd3ca0a0074213f43d93913ad002c42f3a20e0de11ebb184664736f6c634300081a003360c0604052348015600e575f80fd5b5060405161502b38038061502b833981016040819052602b916077565b5f80546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350608052503060a052608d565b5f602082840312156086575f80fd5b5051919050565b60805160a051614f766100b55f395f6117e201525f818161220b01526122490152614f765ff3fe6080604052600436106101fb575f3560e01c80635a6bcfda11610113578063a58411941161009d578063f135baaa1161006d578063f135baaa14610641578063f2fde38b14610660578063f3cd914c1461067f578063f5298aca1461069e578063fe99049a146106bd575f80fd5b8063a5841194146105ab578063b6363cf2146105ca578063dbd035ff14610603578063f02de3b214610622575f80fd5b806380f0b44c116100e357806380f0b44c146104ed5780638161b8741461050c5780638da5cb5b1461052b57806397e8cd4e146105615780639bf6645f1461058c575f80fd5b80635a6bcfda1461046657806360460f061461049a578063695c5bf5146104af5780637e87ce7d146104ce575f80fd5b8063234266d711610194578063426a849311610164578063426a8493146103a157806348c89491146103c057806352759651146103ec578063558a72971461040b578063598af9e71461042a575f80fd5b8063234266d7146103245780632d7713891461034357806335fd631a146103625780633dd45adb1461038e575f80fd5b80630b0d9c09116101cf5780630b0d9c09146102bd57806311da60b4146102de578063156e29f6146102e65780631e2eaeaf14610305575f80fd5b8062fdd58e146101ff57806301ffc9a71461024857806307eff0dd14610277578063095bcdb61461029e575b5f80fd5b34801561020a575f80fd5b50610235610219366004614397565b600460209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b348015610253575f80fd5b506102676102623660046143c1565b6106dc565b604051901515815260200161023f565b348015610282575f80fd5b5061028b600181565b60405160029190910b815260200161023f565b3480156102a9575f80fd5b506102676102b83660046143e8565b610712565b3480156102c8575f80fd5b506102dc6102d736600461441a565b6107b9565b005b61023561080a565b3480156102f1575f80fd5b506102dc6103003660046143e8565b61083c565b348015610310575f80fd5b5061023561031f366004614458565b610887565b34801561032f575f80fd5b5061023561033e3660046145d7565b610891565b34801561034e575f80fd5b506102dc61035d36600461463b565b610941565b34801561036d575f80fd5b5061038161037c366004614656565b6109d7565b60405161023f9190614676565b61023561039c36600461463b565b610a14565b3480156103ac575f80fd5b506102676103bb3660046143e8565b610a46565b3480156103cb575f80fd5b506103df6103da3660046146b8565b610aaa565b60405161023f91906146f6565b3480156103f7575f80fd5b506102dc61040636600461472b565b610b6d565b348015610416575f80fd5b5061026761042536600461476c565b610bdc565b348015610435575f80fd5b5061023561044436600461441a565b600560209081525f938452604080852082529284528284209052825290205481565b348015610471575f80fd5b50610485610480366004614796565b610c4b565b6040805192835260208301919091520161023f565b3480156104a5575f80fd5b5061028b617fff81565b3480156104ba575f80fd5b5061028b6104c9366004614838565b610dde565b3480156104d9575f80fd5b506102dc6104e836600461472b565b610fcd565b3480156104f8575f80fd5b506102dc610507366004614397565b61107f565b348015610517575f80fd5b5061023561052636600461441a565b6110f2565b348015610536575f80fd5b505f54610549906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b34801561056c575f80fd5b5061023561057b36600461463b565b60016020525f908152604090205481565b348015610597575f80fd5b506103816105a636600461487f565b611181565b3480156105b6575f80fd5b506102dc6105c536600461463b565b6111ba565b3480156105d5575f80fd5b506102676105e43660046148ee565b600360209081525f928352604080842090915290825290205460ff1681565b34801561060e575f80fd5b5061038161061d36600461487f565b6111f6565b34801561062d575f80fd5b50600254610549906001600160a01b031681565b34801561064c575f80fd5b5061023561065b366004614458565b61122d565b34801561066b575f80fd5b506102dc61067a36600461463b565b611237565b34801561068a575f80fd5b50610235610699366004614925565b6112c9565b3480156106a9575f80fd5b506102dc6106b83660046143e8565b61140f565b3480156106c8575f80fd5b506102676106d73660046149c3565b611454565b5f6301ffc9a760e01b6001600160e01b03198316148061070c5750630f632fb360e01b6001600160e01b03198316145b92915050565b335f90815260046020908152604080832085845290915281208054839190839061073d908490614a1a565b90915550506001600160a01b0384165f90815260046020908152604080832086845290915281208054849290610774908490614a2d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020614ee183398151915291015b60405180910390a45060015b9392505050565b5f80516020614f018339815191525c6107dc576107dc6354e3ca0d60e01b6115b3565b6107f1836107e9836115bb565b5f03336115db565b6108056001600160a01b038416838361162e565b505050565b5f5f80516020614f018339815191525c61082e5761082e6354e3ca0d60e01b6115b3565b610837336116c2565b905090565b5f80516020614f018339815191525c61085f5761085f6354e3ca0d60e01b6115b3565b8161086d816107e9846115bb565b610881846001600160a01b03831684611765565b50505050565b5f81545f5260205ff35b5f5f80516020614f018339815191525c6108b5576108b56354e3ca0d60e01b6115b3565b6108bd6117d7565b5f6108dc6108cc8860a0902090565b5f90815260066020526040902090565b90506108e781611819565b6080870151610903906001600160a01b0316888888888861183d565b61090e8187876118ba565b915061091b87833361196d565b6080870151610937906001600160a01b03168888888888611995565b5095945050505050565b5f546001600160a01b0316331461098e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517fb4bd8ef53df690b9943d3318996006dbb82a25f54719d8c8035b516a2a5b8acc905f90a250565b6060604051808360051b6020835284602084015260408301925080830190505b855483526020830192506001860195508083106109f75781810382f35b5f5f80516020614f018339815191525c610a3857610a386354e3ca0d60e01b6115b3565b61070c826116c2565b919050565b335f8181526005602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906107a69087815260200190565b60605f80516020614f018339815191525c15610ad057610ad06328486b6360e11b6115b3565b610ad8611a07565b6040516348eeb9a360e11b815233906391dd734690610afd9086908690600401614a68565b5f604051808303815f875af1158015610b18573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b3f9190810190614a7b565b90505f80516020614f218339815191525c15610b6557610b65635212cba160e01b6115b3565b61070c611a1a565b604082015162ffffff1662800000141580610b9e575081608001516001600160a01b0316336001600160a01b031614155b15610bb357610bb36330d2164160e01b6115b3565b610bc18162ffffff16611a2c565b60a082205f8181526006602052604090206108059083611a52565b335f8181526003602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f805f80516020614f018339815191525c610c7057610c706354e3ca0d60e01b6115b3565b610c786117d7565b60a086205f818152600660205260409020610c9281611819565b6080880151610cad906001600160a01b031689898989611a6d565b5f610d146040518060c00160405280336001600160a01b031681526020018a5f015160020b81526020018a6020015160020b8152602001610cf18b60400151611b6f565b600f0b81526060808d015160020b60208301528b01516040909101528390611b8b565b94509050610d228185611f05565b9450336001600160a01b0316837f541c041c2cce48e614b3de043c9280f06b6164c0a1741649e2de3c3d375f79748a5f01518b602001518c60400151604051610d8693929190600293840b81529190920b6020820152604081019190915260600190565b60405180910390a360808901515f90610dac906001600160a01b03168b8b898c8c611f38565b90965090508015610dc657610dc68a828c6080015161196d565b610dd18a873361196d565b5050505094509492505050565b5f610de76117d7565b6060850151617fff60029190910b1315610e12576060850151610e12906316e0049f60e31b90612057565b600160020b856060015160020b1215610e3c576060850151610e3c90631d3d20b160e31b90612057565b845160208601516001600160a01b03908116911610610e6e5784516020860151610e6e916306e6c98360e41b91612066565b610e92856040015186608001516001600160a01b031661208890919063ffffffff16565b610ead576080850151610ead90630732d7b560e51b90612149565b5f610ec0866040015162ffffff1661215e565b6080870151909150610ede906001600160a01b031687878787612183565b60a086205f610eec886121f4565b5f848152600660205260409020909250610f099150888386612326565b6080890151909450610f28906001600160a01b03168989878a8a612385565b87602001516001600160a01b0316885f01516001600160a01b0316837fdd466e674ea557f56295e2d0218a125ea4b4f0f6f3307b95f85e6110838d64388b604001518c606001518d608001518d8b604051610fba95949392919062ffffff959095168552600293840b60208601526001600160a01b03928316604086015291166060840152900b608082015260a00190565b60405180910390a4505050949350505050565b6002546001600160a01b03163314610fef57610fef6348f5c3ed60e01b6115b3565b6103e9610fff821610623e900062fff0008316101661101e5761101e63a7abe2f760e01b62ffffff8316612149565b60a082206110408261103a835f90815260066020526040902090565b906123f8565b60405162ffffff8316815281907fe9c42593e71f84403b84352cd168d693e2c9fcd1fdbcc3feb21d92b43e6696f99060200160405180910390a2505050565b5f80516020614f018339815191525c6110a2576110a26354e3ca0d60e01b6115b3565b335f9081526001600160a01b038316602052604081205c906110c3836115bb565b90508181600f0b146110df576110df63bda73abf60e01b6115b3565b610881846110ec83614b0d565b336115db565b6002545f906001600160a01b03163314611116576111166348f5c3ed60e01b6115b3565b8115611122578161113b565b6001600160a01b0383165f908152600160205260409020545b6001600160a01b0384165f90815260016020526040812080549293508392909190611167908490614a1a565b909155506107b290506001600160a01b038416858361162e565b606060405180602082528360208301526040820191508360051b8201855b80355c84526020938401930181841061119f575b5081810382f35b6111c261240d565b6001600160a01b0381166111d35750565b5f6111e6826001600160a01b0316612441565b90506111f282826124bd565b5050565b606060405180602082528360208301526040820191508360051b8201855b803554845260209384019301818410156111b357611214565b5f815c5f5260205ff35b5f546001600160a01b0316331461127f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610985565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f5f80516020614f018339815191525c6112ed576112ed6354e3ca0d60e01b6115b3565b6112f56117d7565b83602001515f036113105761131063be8b850760e01b6115b3565b60a085205f81815260066020526040902061132a81611819565b60808701515f908190819061134b906001600160a01b03168b8b8b8b6124fd565b8093508195508294505050506113ba84866040518060a001604052808e6060015160020b81526020018d5f0151151581526020018681526020018d604001516001600160a01b031681526020018562ffffff168152508c5f01516113b3578d60200151612619565b8d51612619565b60808b01519096505f92506113de91506001600160a01b03168a8a888b8b88612707565b909550905080156113f8576113f889828b6080015161196d565b61140389863361196d565b50505050949350505050565b5f80516020614f018339815191525c611432576114326354e3ca0d60e01b6115b3565b81611440816110ec846115bb565b610881846001600160a01b0383168461282a565b5f336001600160a01b0386161480159061149157506001600160a01b0385165f90815260036020908152604080832033845290915290205460ff16155b15611501576001600160a01b0385165f90815260056020908152604080832033845282528083208684529091529020545f1981146114ff576114d38382614a1a565b6001600160a01b0387165f90815260056020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260046020908152604080832086845290915281208054849290611533908490614a1a565b90915550506001600160a01b0384165f9081526004602090815260408083208684529091528120805484929061156a908490614a2d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020614ee1833981519152910160405180910390a45060015b949350505050565b805f5260045ffd5b5f6001607f1b82106115d7576115d76393dafdf160e01b6115b3565b5090565b81600f0b5f036115ea57505050565b5f806116006001600160a01b03861684866128e8565b91509150805f0361161857611613612921565b611627565b815f0361162757611627612949565b5050505050565b5f6001600160a01b038416611661575f805f8085875af190508061165c5761165c6356cdd02560e11b612971565b610881565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f6040820152508061088157610881632745a14f60e21b612971565b5f5f80516020614ec18339815191525c6001600160a01b0381166116e85734915061174c565b34156116fe576116fe6319d245cf60e01b6115b3565b7f1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd955c5f6117336001600160a01b038416612441565b905061173f8282614a1a565b935061174961299e565b50505b61175f81611759846115bb565b856115db565b50919050565b6001600160a01b0383165f90815260046020908152604080832085845290915281208054839290611797908490614a2d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020614ee183398151915291015b60405180910390a4505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611817576118176306c4a1c760e11b6115b3565b565b80546001600160a01b03165f0361183a5761183a63486aa30760e01b6115b3565b50565b85336001600160a01b038216146118b15760208716156118b1576118af33878787878760405160240161187596959493929190614b74565b60408051601f198184030181529190526020810180516001600160e01b0316635b54587d60e11b1790526001600160a01b038916906129b0565b505b50505050505050565b60038301545f906001600160801b03168082036118e1576118e163a74f97ab60e01b6115b3565b61190f6118ed856115bb565b5f036118f8856115bb565b5f0360809190911b6001600160801b039091161790565b9150831561193b5761192f84600160801b836001600160801b0316612a40565b60018601805490910190555b82156119655761195983600160801b836001600160801b0316612a40565b60028601805490910190555b509392505050565b82516119839061197d8460801d90565b836115db565b610805836020015161197d84600f0b90565b85336001600160a01b038216146118b15760108716156118b1576118af3387878787876040516024016119cd96959493929190614b74565b60408051601f198184030181529190526020810180516001600160e01b031663e1b4af6960e01b1790526001600160a01b038916906129b0565b60015f80516020614f018339815191525d565b5f5f80516020614f018339815191525d565b620f424062ffffff8216111561183a5761183a631400211360e01b62ffffff8316612149565b611a5b82611819565b8154611a679082612adc565b90915550565b84336001600160a01b03821614611b67575f8460400151138015611a945750610800861615155b15611af557611aef3386868686604051602401611ab5959493929190614bbe565b60408051601f198184030181529190526020810180516001600160e01b031663259982e560e01b1790526001600160a01b038816906129b0565b50611b67565b5f846040015113158015611b0c5750610200861615155b15611b67576118b13386868686604051602401611b2d959493929190614bbe565b60408051601f198184030181529190526020810180516001600160e01b031663021d0ee760e41b1790526001600160a01b038816906129b0565b505050505050565b80600f81900b8114610a4157610a416393dafdf160e01b6115b3565b6060810151602082015160408301515f9283929091611baa8282612af7565b604080516080810182525f80825260208201819052918101829052606081019190915283600f0b5f14611cef57611be38884865f612b57565b6001600160801b0316602083015215158152611c028883866001612b57565b6001600160801b03166060830152151560408201525f600f85900b12611cb4575f611c52886080015160020b620d89e7198190058102620d89e8829005820203056001016001600160801b030490565b9050806001600160801b031682602001516001600160801b03161115611c8357611c8363b8e3c38560e01b85612057565b806001600160801b031682606001516001600160801b03161115611cb257611cb263b8e3c38560e01b84612057565b505b805115611cd0576080870151611cd09060058a01908590612c11565b806040015115611cef576080870151611cef9060058a01908490612c11565b5f80611cfc8a8686612c63565b8a5160a08c015160408051602681019290925260068083018a9052600383018b9052928252603a600c8301205f838301819052602080850182905293819052908152928f01909152812092945090925080611d59838a8787612d17565b91509150611d85611d69836115bb565b611d72836115bb565b6001600160801b031660809190911b1790565b995050505050505f84600f0b1215611dee57805115611dc157600283810b5f90815260048a016020526040812081815560018101829055909101555b806040015115611dee57600282810b5f90815260048a016020526040812081815560018101829055909101555b5082600f0b5f14611efb5786545f80611e0a8360a01c60020b90565b6001600160a01b038416915091508460020b8260020b1215611e5957611e52611e4c611e47611e3888612dd0565b611e4188612dd0565b8a613088565b611b6f565b60801b90565b9750611ef7565b8360020b8260020b1215611ed257611e90611e7a611e4783611e4188612dd0565b611d72611e47611e8989612dd0565b858b6130c0565b60038b0154909850611eab906001600160801b0316876130ec565b60038b0180546001600160801b0319166001600160801b0392909216919091179055611ef7565b611ef45f611d72611e47611ee589612dd0565b611eee89612dd0565b8b6130c0565b97505b5050505b5050509250929050565b5f608082811d9084901d01600f83810b9085900b01611f2f611f2683611b6f565b611d7283611b6f565b95945050505050565b5f806001600160a01b0388163303611f5457508390505f61204c565b8491505f86604001511315611fe057610400881615611fdb57611fcc338888888888604051602401611f8b96959493929190614c1e565b60408051601f198184030181529190526020810180516001600160e01b0316625a2a8160e81b17905260028a1615155b6001600160a01b038b169190613113565b9050611fd88282613154565b91505b61204c565b61010088161561204c5761203d33888888888860405160240161200896959493929190614c1e565b60408051601f198184030181529190526020810180516001600160e01b03166346d95b2960e11b17905260018a161515611fbb565b90506120498282613154565b91505b965096945050505050565b815f528060020b60045260245ffd5b825f526001600160a01b0382166004526001600160a01b03811660245260445ffd5b5f6080831615801561209c57506008831615155b156120a857505f61070c565b604083161580156120bb57506004831615155b156120c757505f61070c565b61040083161580156120db57506002831615155b156120e757505f61070c565b61010083161580156120fb57506001831615155b1561210757505f61070c565b6001600160a01b0383161561213857613fff831615158061213357506280000062ffffff8316146107b2565b6107b2565b5062ffffff16628000001415919050565b815f526001600160a01b03811660045260245ffd5b5f6280000062ffffff83160361217557505f919050565b6115d78262ffffff16611a2c565b84336001600160a01b03821614611b6757612000861615611b67576118b133868686866040516024016121ba959493929190614c85565b60408051601f198184030181529190526020810180516001600160e01b03166301a206c160e51b1790526001600160a01b038816906129b0565b6002545f9081906001600160a01b031615612321577f00000000000000000000000000000000000000000000000000000000000000005a101561224157612241630f724b8160e11b6115b3565b6002546040517f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b0316905f90612283908790602401614cc6565b60408051601f198184030181529190526020810180516001600160e01b031663553bfc3760e01b17815281519192505f918291829190828789f13d60201416955085156122da576040513d5f823e805191505f8152505b8580156122eb57508062ffffff1681145b801561230857506103e9610fff821610623e900062fff000831610165b612313575f80612317565b6001815b9096509450505050505b915091565b83545f906001600160a01b03161561234857612348637983c05160e01b6115b3565b61235184613175565b905061237a826123748561236e6001600160a01b03891686613460565b9061347b565b90612adc565b909455509192915050565b85336001600160a01b038216146118b1576110008716156118b1576118af3387878787876040516024016123be96959493929190614cd4565b60408051601f198184030181529190526020810180516001600160e01b031663a910f80f60e01b1790526001600160a01b038916906129b0565b61240182611819565b8154611a67908261347b565b61242d5f80516020614ec18339815191525c6001600160a01b0316613496565b6118175761181763996caf6560e01b6115b3565b5f6001600160a01b038216612457575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015612499573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070c9190614d1d565b6001600160a01b0382165f80516020614ec18339815191525d807f1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd955d5050565b60208301515f806001600160a01b038816330361251c575f915061260e565b608088161561260e575f61257289338a8a8a8a604051602401612543959493929190614d34565b60408051601f198184030181529190526020810180516001600160e01b03166315d7892d60e21b1790526129b0565b9050805160601461258d5761258d631e048e1d60e01b6115b3565b604088015162ffffff1662800000036125a857606081015191505b600889161561260c57604081015192505f6125c38460801d90565b905080600f0b5f1461260a575f85126125e0600f83900b87614d8d565b9550806125ef575f86126125f3565b5f86135b1561260857612608637d05b8eb60e11b6115b3565b505b505b505b955095509592505050565b5f8080808061262889886134a7565b93509350935093505f831115612656576001600160a01b0386165f9081526001602052604090208054840190555b33887f40e9cecb9f5f1f1c5b9c97dec2917b7ee92e57ba5563708daca94dd84ad7112f6126838760801d90565b61268d88600f0b90565b60408087015160a0880151606089015192516126f2959493908b90600f96870b81529490950b60208501526001600160a01b039290921660408401526001600160801b0316606083015260020b608082015262ffffff9190911660a082015260c00190565b60405180910390a35091979650505050505050565b5f806001600160a01b038916330361272357508490505f61281e565b5f61272e8460801d90565b90505f61273b85600f0b90565b905060408b16156127b5576127a8611e47338c8c8c8c8c60405160240161276796959493929190614db4565b60408051601f198184030181529190526020810180516001600160e01b031663b47b2fb160e01b17905260048e1615156001600160a01b038f169190613113565b6127b29082614e14565b90505b5f81600f0b5f1415806127cb575082600f0b5f14155b1561281657895160208b01515f13901515146127f6576001600160801b038316608083901b17612807565b6001600160801b038216608084901b175b90506128138982613154565b98505b889450925050505b97509795505050505050565b336001600160a01b038416811480159061286957506001600160a01b038085165f9081526003602090815260408083209385168352929052205460ff16155b156128dd576001600160a01b038085165f9081526005602090815260408083209385168352928152828220868352905220545f1981146128db576128ad8382614a1a565b6001600160a01b038087165f9081526005602090815260408083209387168352928152828220888352905220555b505b610881848484613b54565b6001600160a01b038281165f90815290841660205260408120805c9190612913600f85900b84614d8d565b915081815d50935093915050565b5f80516020614f218339815191525c600181039050805f80516020614f218339815191525d50565b5f80516020614f218339815191525c600181019050805f80516020614f218339815191525d50565b3d60405182815260206004820152816024820152815f604483013e602080601f8401040260440191508181fd5b5f5f80516020614ec18339815191525d565b60605f805f8451602086015f885af19050806129d6576129d663fb6a608160e01b612971565b6040519150601f19603f3d011682016040523d82523d5f602084013e602082511080612a24575060208301516001600160e01b031916612a17836020015190565b6001600160e01b03191614155b15612a3957612a39631e048e1d60e01b6115b3565b5092915050565b5f838302815f1985870982811083820303915050808411612a5f575f80fd5b805f03612a71575082900490506107b2565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60d01b62ffffff60d01b1662ffffff60d01b19919091161790565b8060020b8260020b12612b1657612b1663c4433ed560e01b8383613bbd565b620d89e719600283900b1215612b3757612b3763d5e2f7ab60e01b83612057565b620d89e8600282900b13156111f2576111f263035aeeff60e31b82612057565b600283900b5f908152600485016020526040812080548291906001600160801b0381169060801d612b8882886130ec565b6001600160801b03808216159084168015919091141596509094505f03612bd257885460a01c60020b60020b8860020b13612bd2576001808a0154908401556002808a0154908401555b5f86612be757612be28883614e14565b612bf1565b612bf18883614e41565b90508060801b6001600160801b0386161784555050505094509492505050565b600291820b910b80820715612c3e5760405163d4d8f3e681528260208201528160408201526044601c8201fd5b80820591508160081d5f528260205260405f20600160ff84161b815418815550505050565b600282810b5f81815260048601602052604080822085850b83529082208754929485949293919260a09290921c900b90811215612cb9578160010154836001015403945081600201548360020154039350612d0c565b8560020b8160020b12612ce5578260010154826001015403945082600201548260020154039350612d0c565b81600101548360010154896001015403039450816002015483600201548960020154030393505b505050935093915050565b83545f9081906001600160801b0316600f86900b8203612d5657806001600160801b03165f03612d5157612d51632bbfae4960e21b6115b3565b612d7c565b612d6081876130ec565b87546001600160801b0319166001600160801b03919091161787555b612d9a87600101548603826001600160801b0316600160801b612a40565b9250612dba87600201548503826001600160801b0316600160801b612a40565b6001880195909555505060029094015591929050565b60020b5f60ff82901d80830118620d89e8811115612df957612df96345c3193d60e11b84612057565b7001fffcb933bd6fad37aa2d162d1a5940016001821602600160801b186002821615612e35576ffff97272373d413259a46990580e213a0260801c5b6004821615612e54576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e73576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e92576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612eb1576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ed0576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612eef576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612f0f576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f2f576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f4f576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f6f576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f8f576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612faf576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fcf576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fef576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613010576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613030576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561304f576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561306c576b048a170391f7dc42444e8fa20260801c5b5f841315613078575f19045b63ffffffff0160201c9392505050565b5f8082600f0b126130af576130a86130a38585856001613bda565b613c9d565b5f036115ab565b6115ab6130a38585855f035f613bda565b5f8082600f0b126130db576130a86130a38585856001613cb6565b6115ab6130a38585855f035f613cb6565b6001600160801b038216600f82900b01608081901c1561070c576393dafdf15f526004601cfd5b5f8061311f85856129b0565b90508261312f575f9150506107b2565b805160401461314857613148631e048e1d60e01b6115b3565b60400151949350505050565b5f608082811d9084901d03600f83810b9085900b03611f2f611f2683611b6f565b5f73fffd8963efd1fc6a506488495d951d51639616826401000276a21983016001600160a01b031611156131b4576131b46318521d4960e21b83612149565b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061324757607f810383901c9150613251565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461345157886001600160a01b031661343682612dd0565b6001600160a01b0316111561344b5781613453565b80613453565b815b9998505050505050505050565b60a01b62ffffff60a01b1662ffffff60a01b19919091161790565b60b81b62ffffff60b81b1662ffffff60b81b19919091161790565b5f6001600160a01b0382161561070c565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a08101829052819081908554602086015160038801546001600160801b03165f8261350457610fff60c485901c1661350e565b610fff60b885901c165b60408a81015187525f60208801526001600160a01b0386169087015260a085901c60020b606087015261ffff1690508261354c578960020154613552565b89600101545b6080868101919091526001600160801b03831660a08701528901515f9062400000166135875760d085901c62ffffff16613599565b6135998a6080015162ffffff16613d02565b905081156135c757620f424062ffffff821661ffff84168181028381061515939004929092019101036135c9565b805b60408b01519097505f13905062ffffff8716620f42401480156135ea575080155b156135ff576135ff634b10312360e11b6115b3565b89604001515f0361361a575f80985098505050505050613b4b565b83156136985760608a01516001600160a01b03868116911610613659576136596001600160a01b0386165b60608c0151637c9c6e8f60e01b9190613d11565b6401000276a36001600160a01b03168a606001516001600160a01b031610156136935760608a015161369390639e4d7cc760e01b90612149565b613709565b60608a01516001600160a01b038681169116116136c1576136c16001600160a01b038616613645565b73fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03168a606001516001600160a01b0316106137095760608a015161370990639e4d7cc760e01b90612149565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525b8651158061376957508a606001516001600160a01b031687604001516001600160a01b0316145b613a545760408701516001600160a01b0316815260608701518b516137939160058f019188613d3a565b1515604083015260020b60208201819052620d89e719126137b957620d89e71960208201525b620d89e860020b816020015160020b126137d757620d89e860208201525b6137e48160200151612dd0565b6001600160a01b03908116606083810182905260408a0151908e0151613825939192911680821891811160ff8a1618919091021860a08a01518a518c613e23565b60c085015260a084015260808301526001600160a01b0316604088015281613889576138548160a00151613c9d565b875103875260c08101516080820151613870916130a391614a2d565b876020018181516138819190614e6e565b9052506138c4565b61389c8160c00151826080015101613c9d565b875101875260a08101516138af90613c9d565b876020018181516138c09190614d8d565b9052505b8215613900575f620f4240848360c0015184608001510102816138e9576138e9614e8d565b60c084018051929091049182900390529990990198505b60a08701516001600160801b03161561393f576139338160c00151600160801b8960a001516001600160801b0316612a40565b60808801805190910190525b80606001516001600160a01b031687604001516001600160a01b031603613a1957806040015115613a01575f8086613980578d60010154896080015161398b565b88608001518e600201545b915091505f6139d68f85602001518585600292830b5f90815260049094016020526040909320600181018054909203909155908101805490920390915554600160801b9004600f0b90565b905087156139e1575f035b6139ef8a60a00151826130ec565b6001600160801b031660a08b01525050505b602081015160ff8616900360020b6060880152613742565b805f01516001600160a01b031687604001516001600160a01b031614613a4f57613a468760400151613175565b60020b60608801525b613742565b613a8c8760400151613a7389606001518961346090919063ffffffff16565b6001600160a01b0319166001600160a01b039091161790565b8c5560a08701516001600160801b03858116911614613acc5760a087015160038d0180546001600160801b0319166001600160801b039092169190911790555b84613ae057608087015160028d0155613aeb565b608087015160018d01555b81151585151514613b1f57613b18613b068860200151611b6f565b611d72895f01518e6040015103611b6f565b9950613b44565b613b41613b34885f01518d6040015103611b6f565b611d728960200151611b6f565b99505b5050505050505b92959194509250565b6001600160a01b0383165f90815260046020908152604080832085845290915281208054839290613b86908490614a1a565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020614ee183398151915291016117ca565b6040518381528260020b60048201528160020b6024820152604481fd5b5f836001600160a01b0316856001600160a01b03161115613bf9579293925b6001600160a01b038516613c135762bfc9215f526004601cfd5b600160601b600160e01b03606084901b166001600160a01b038686031683613c6657866001600160a01b0316613c538383896001600160a01b0316612a40565b81613c6057613c60614e8d565b04613c92565b613c92613c7d8383896001600160a01b0316613fa9565b886001600160a01b0316808204910615150190565b979650505050505050565b805f811215610a4157610a416393dafdf160e01b6115b3565b5f6001600160a01b038481169086160360ff81901d90810118600160601b6001600160801b038516613ce9818484612a40565b9350845f83858409111684019350505050949350505050565b62bfffff8116610a4181611a2c565b6040518381526001600160a01b03831660048201526001600160a01b0382166024820152604481fd5b5f80600284810b9086900b8181078313919005038315613db557600281900b60081d600181810b5f90815260208a905260409020545f1960ff85168381019390931b01908116801515955085613d9757888360ff16860302613daa565b88613da182613fd9565b840360ff168603025b965050505050613e19565b6001908101600281900b60081d80830b5f90815260208a905260409020545f1960ff841694851b011990811680151595509293919285613dff57888360ff0360ff16860102613e12565b8883613e0a83614069565b0360ff168601025b9650505050505b5094509492505050565b5f80808062ffffff85166001600160a01b03808a16908b1610158288128015613f1c575f613e5c8a5f0385620f424003620f4240612a40565b905082613e7557613e708d8d8d6001613cb6565b613e82565b613e828c8e8d6001613bda565b9650868110613eb6578b9750620f42408414613ead57613ea8878586620f424003613fa9565b613eaf565b865b9450613ef2565b613ec28d8c8386614104565b975082613edb57613ed68d898d6001613cb6565b613ee8565b613ee8888e8d6001613bda565b9650868a5f030394505b82613f0857613f038d898d5f613bda565b613f14565b613f14888e8d5f613cb6565b955050613f9a565b81613f3257613f2d8c8c8c5f613bda565b613f3e565b613f3e8b8d8c5f613cb6565b9450848910613f4f578a9650613f61565b889450613f5e8c8b8785614152565b96505b81613f7857613f738c888c6001613cb6565b613f85565b613f85878d8c6001613bda565b9550613f97868485620f424003613fa9565b93505b50505095509550955095915050565b5f613fb5848484612a40565b90508180613fc557613fc5614e8d565b838509156107b257600101806107b2575f80fd5b5f808211613fe5575f80fd5b507f0706060506020504060203020504030106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be831560081b6001600160801b03851160071b1784811c6001600160401b031060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b5f808211614075575f80fd5b507e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b150316040581196001019091166101e07f804040554300526644320000502061067405302602000010750620017611707760fc7fb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff840260f81c161b60f71c1690811c63d76453e004601f169190911a1790565b5f6001600160801b038416156001600160a01b03861615171561412e57634f2461b85f526004601cfd5b81614145576141408585856001614195565b611f2f565b611f2f8585856001614280565b5f6001600160801b038416156001600160a01b03861615171561417c57634f2461b85f526004601cfd5b8161418d576141408585855f614280565b611f2f8585855f5b5f8115614205575f6001600160a01b038411156141c9576141c484600160601b876001600160801b0316612a40565b6141e0565b6141e06001600160801b038616606086901b614ea1565b90506141fd6141f8826001600160a01b038916614a2d565b614362565b9150506115ab565b5f6001600160a01b038411156142325761422d84600160601b876001600160801b0316613fa9565b61424f565b61424f606085901b6001600160801b038716808204910615150190565b9050806001600160a01b0387161161426e57634323a5555f526004601cfd5b6001600160a01b0386160390506115ab565b5f825f0361428f5750836115ab565b600160601b600160e01b03606085901b168215614321576001600160a01b038616848102908582816142c3576142c3614e8d565b04036142f3578181018281106142f1576142e783896001600160a01b031683613fa9565b93505050506115ab565b505b506141fd818561430c6001600160a01b038a1683614ea1565b6143169190614a2d565b808204910615150190565b6001600160a01b0386168481029085820414818311166143485763f5c787f15f526004601cfd5b8082036142e76141f8846001600160a01b038b1684613fa9565b806001600160a01b0381168114610a4157610a416393dafdf160e01b6115b3565b6001600160a01b038116811461183a575f80fd5b5f80604083850312156143a8575f80fd5b82356143b381614383565b946020939093013593505050565b5f602082840312156143d1575f80fd5b81356001600160e01b0319811681146107b2575f80fd5b5f805f606084860312156143fa575f80fd5b833561440581614383565b95602085013595506040909401359392505050565b5f805f6060848603121561442c575f80fd5b833561443781614383565b9250602084013561444781614383565b929592945050506040919091013590565b5f60208284031215614468575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156144a5576144a561446f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156144d3576144d361446f565b604052919050565b803562ffffff81168114610a41575f80fd5b8035600281900b8114610a41575f80fd5b5f60a0828403121561450e575f80fd5b60405160a081016001600160401b03811182821017156145305761453061446f565b604052905080823561454181614383565b8152602083013561455181614383565b6020820152614562604084016144db565b6040820152614573606084016144ed565b6060820152608083013561458681614383565b6080919091015292915050565b5f8083601f8401126145a3575f80fd5b5081356001600160401b038111156145b9575f80fd5b6020830191508360208285010111156145d0575f80fd5b9250929050565b5f805f805f61010086880312156145ec575f80fd5b6145f687876144fe565b945060a0860135935060c0860135925060e08601356001600160401b0381111561461e575f80fd5b61462a88828901614593565b969995985093965092949392505050565b5f6020828403121561464b575f80fd5b81356107b281614383565b5f8060408385031215614667575f80fd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b818110156146ad57835183526020938401939092019160010161468f565b509095945050505050565b5f80602083850312156146c9575f80fd5b82356001600160401b038111156146de575f80fd5b6146ea85828601614593565b90969095509350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060c0838503121561473c575f80fd5b61474684846144fe565b915061475460a084016144db565b90509250929050565b80358015158114610a41575f80fd5b5f806040838503121561477d575f80fd5b823561478881614383565b91506147546020840161475d565b5f805f808486036101408112156147ab575f80fd5b6147b587876144fe565b94506080609f19820112156147c8575f80fd5b506147d1614483565b6147dd60a087016144ed565b81526147eb60c087016144ed565b602082015260e08601356040820152610100860135606082015292506101208501356001600160401b03811115614820575f80fd5b61482c87828801614593565b95989497509550505050565b5f805f8060e0858703121561484b575f80fd5b61485586866144fe565b935060a085013561486581614383565b925060c08501356001600160401b03811115614820575f80fd5b5f8060208385031215614890575f80fd5b82356001600160401b038111156148a5575f80fd5b8301601f810185136148b5575f80fd5b80356001600160401b038111156148ca575f80fd5b8560208260051b84010111156148de575f80fd5b6020919091019590945092505050565b5f80604083850312156148ff575f80fd5b823561490a81614383565b9150602083013561491a81614383565b809150509250929050565b5f805f8084860361012081121561493a575f80fd5b61494487876144fe565b94506060609f1982011215614957575f80fd5b50604051606081016001600160401b038111828210171561497a5761497a61446f565b60405261498960a0870161475d565b815260c0860135602082015260e08601356149a381614383565b604082015292506101008501356001600160401b03811115614820575f80fd5b5f805f80608085870312156149d6575f80fd5b84356149e181614383565b935060208501356149f181614383565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561070c5761070c614a06565b8082018082111561070c5761070c614a06565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f6115ab602083018486614a40565b5f60208284031215614a8b575f80fd5b81516001600160401b03811115614aa0575f80fd5b8201601f81018413614ab0575f80fd5b80516001600160401b03811115614ac957614ac961446f565b614adc601f8201601f19166020016144ab565b818152856020838501011115614af0575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f81600f0b60016001607f1b03198103614b2957614b29614a06565b5f0392915050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6001600160a01b0387168152614b8d6020820187614b31565b8460c08201528360e08201526101206101008201525f614bb261012083018486614a40565b98975050505050505050565b6001600160a01b0386168152614bd76020820186614b31565b8351600290810b60c08301526020850151900b60e0820152604084015161010082015260608401516101208201526101606101408201525f613c9261016083018486614a40565b6001600160a01b0387168152614c376020820187614b31565b8451600290810b60c08301526020860151900b60e082015260408501516101008201526060850151610120820152836101408201526101806101608201525f614bb261018083018486614a40565b6001600160a01b0386168152614c9e6020820186614b31565b6001600160a01b03841660c082015261010060e082018190525f90613c929083018486614a40565b60a0810161070c8284614b31565b6001600160a01b0387168152614ced6020820187614b31565b60018060a01b03851660c08201528360020b60e08201526101206101008201525f614bb261012083018486614a40565b5f60208284031215614d2d575f80fd5b5051919050565b6001600160a01b0386168152614d4d6020820186614b31565b8351151560c0820152602084015160e082015260408401516001600160a01b03166101008201526101406101208201525f613c9261014083018486614a40565b8082018281125f831280158216821582161715614dac57614dac614a06565b505092915050565b6001600160a01b0387168152614dcd6020820187614b31565b8451151560c0820152602085015160e082015260408501516001600160a01b0316610100820152836101208201526101606101408201525f614bb261016083018486614a40565b600f81810b9083900b0160016001607f1b03811360016001607f1b03198212171561070c5761070c614a06565b600f82810b9082900b0360016001607f1b0319811260016001607f1b038213171561070c5761070c614a06565b8181035f831280158383131683831282161715612a3957612a39614a06565b634e487b7160e01b5f52601260045260245ffd5b5f82614ebb57634e487b7160e01b5f52601260045260245ffd5b50049056fe27e098c505d44ec3574004bca052aabf76bd35004c182099d8c575fb238593b91b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859c090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab237d4b3164c6e45b97e7d87b7125a44c5828d005af88f9d751cfd78729c5d99a0ba2646970667358221220c720af38850bace8901ec0c414e9cc6b7600fdc66c58c62bb119ab202e9502fe64736f6c634300081a003360a0604052348015600e575f80fd5b506040516116ad3803806116ad833981016040819052602b91603b565b6001600160a01b03166080526066565b5f60208284031215604a575f80fd5b81516001600160a01b0381168114605f575f80fd5b9392505050565b6080516115e46100c95f395f818160790152818160f50152818161022d01528181610294015281816102c501528181610390015281816104fa01528181610550015281816105bf015281816106100152818161077a01526107ad01526115e45ff3fe60806040526004361061003e575f3560e01c80630a5b11e414610042578063481c6a75146100685780635a6bcfda146100b357806391dd7346146100c6575b5f80fd5b610055610050366004611035565b6100f2565b6040519081526020015b60405180910390f35b348015610073575f80fd5b5061009b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161005f565b6100556100c13660046110bb565b61020a565b3480156100d1575f80fd5b506100e56100e0366004611118565b610220565b60405161005f91906111b2565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894916040518060c00160405280336001600160a01b03168152602001898152602001888152602001878152602001861515815260200185151581525060405160200161016c919061120e565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161019791906111b2565b5f604051808303815f875af11580156101b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101d991908101906112aa565b8060200190518101906101ec919061131e565b9050478015610200576102005f3383610662565b5095945050505050565b5f6102188484845f806100f2565b949350505050565b6060336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610256575f80fd5b5f61026383850185611335565b90505f6102be610278836020015160a0902090565b6040840151805160208201516060909201516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693923092916106fc565b505090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635a6bcfda8460200151856040015186606001516040518463ffffffff1660e01b815260040161031f939291906113fc565b60408051808303815f875af115801561033a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035e919061144b565b5090505f6103ba610374856020015160a0902090565b6040860151805160208201516060909201516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693923092916106fc565b505090505f6103d485602001515f0151865f015130610753565b925050505f6103ef866020015160200151875f015130610753565b9250505082600f0b86604001516040015186600f0b61040e9190611481565b1461045f5760405162461bcd60e51b815260206004820152601a60248201527f6c6971756964697479206368616e676520696e636f7272656374000000000000604482015260640160405180910390fd5b5f86604001516040015112156104a7575f82138061047c57505f81135b610488576104886114a8565b5f82128061049557505f81125b156104a2576104a26114a8565b6104ea565b5f86604001516040015113156104ea575f8212806104c457505f81125b6104d0576104d06114a8565b5f8213806104dd57505f81135b156104ea576104ea6114a8565b5f821215610540578551610540907f000000000000000000000000000000000000000000000000000000000000000090610523856114bc565b60808a015160208b0151516001600160a01b0316939291906107df565b5f811215610598578551610598907f000000000000000000000000000000000000000000000000000000000000000090610579846114bc565b60808a01516020808c015101516001600160a01b0316939291906107df565b5f8213156105e757855160a08701516020880151516105e7926001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000091908690610aab565b5f81131561063857855160a08701516020808901510151610638926001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000091908590610aab565b60408051602081018690520160405160208183030381529060405296505050505050505b92915050565b5f6001600160a01b038416610695575f805f8085875af1905080610690576106906356cdd02560e11b610b7d565b6106f6565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f604082015250806106f6576106f6632745a14f60e21b610b7d565b50505050565b60408051602681018390526006810184905260038101859052858152603a600c8201205f9282018390526020820183905290829052819081906107408a8a83610baa565b919c909b50909950975050505050505050565b5f80806107696001600160a01b03871686610c4d565b925061079e6001600160a01b0387167f0000000000000000000000000000000000000000000000000000000000000000610c4d565b91506107d46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168588610cdc565b905093509350939050565b801561087457836001600160a01b031663f5298aca8461080e886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015b5f604051808303815f87803b158015610859575f80fd5b505af115801561086b573d5f803e3d5ffd5b50505050610aa4565b6001600160a01b0385166108eb57836001600160a01b03166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af11580156108c0573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906108e5919061131e565b50610aa4565b604051632961046560e21b81526001600160a01b03868116600483015285169063a5841194906024015f604051808303815f87803b15801561092b575f80fd5b505af115801561093d573d5f803e3d5ffd5b505050506001600160a01b03831630146109cf576040516323b872dd60e01b81526001600160a01b0384811660048301528581166024830152604482018490528616906323b872dd906064016020604051808303815f875af11580156109a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c991906114d6565b50610a41565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905286169063a9059cbb906044016020604051808303815f875af1158015610a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3f91906114d6565b505b836001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610a7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa2919061131e565b505b5050505050565b80610aed57604051630b0d9c0960e01b81526001600160a01b038681166004830152848116602483015260448201849052851690630b0d9c0990606401610842565b836001600160a01b031663156e29f684610b16886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b158015610b60575f80fd5b505af1158015610b72573d5f803e3d5ffd5b505050505050505050565b3d60405182815260206004820152816024820152815f604483013e602080601f8401040260440191508181fd5b5f805f80610bb88686610d73565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038916906335fd631a906044015f60405180830381865afa158015610c06573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c2d91908101906114f1565b60208101516040820151606090920151909a919950975095505050505050565b5f6001600160a01b038316610c6d57506001600160a01b0381163161065c565b6040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015610cb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd5919061131e565b905061065c565b5f806001600160a01b0384165f526001600160a01b03831660205260405f209050846001600160a01b031663f135baaa826040518263ffffffff1660e01b8152600401610d2b91815260200190565b602060405180830381865afa158015610d46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6a919061131e565b95945050505050565b5f80610d7e84610dc3565b90505f610d8c60068361159b565b6040805160208101879052908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6040515f90610de2908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610e3557610e35610dff565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610e6357610e63610dff565b604052919050565b6001600160a01b0381168114610e7f575f80fd5b50565b8035600281900b8114610e93575f80fd5b919050565b5f60a08284031215610ea8575f80fd5b60405160a081016001600160401b0381118282101715610eca57610eca610dff565b6040529050808235610edb81610e6b565b81526020830135610eeb81610e6b565b6020820152604083013562ffffff81168114610f05575f80fd5b6040820152610f1660608401610e82565b60608201526080830135610f2981610e6b565b6080919091015292915050565b5f60808284031215610f46575f80fd5b604051608081016001600160401b0381118282101715610f6857610f68610dff565b604052905080610f7783610e82565b8152610f8560208401610e82565b602082015260408301356040820152606083013560608201525092915050565b5f6001600160401b03821115610fbd57610fbd610dff565b50601f01601f191660200190565b5f82601f830112610fda575f80fd5b8135610fed610fe882610fa5565b610e3b565b818152846020838601011115611001575f80fd5b816020850160208301375f918101602001919091529392505050565b8015158114610e7f575f80fd5b8035610e938161101d565b5f805f805f610180868803121561104a575f80fd5b6110548787610e98565b94506110638760a08801610f36565b93506101208601356001600160401b0381111561107e575f80fd5b61108a88828901610fcb565b93505061014086013561109c8161101d565b91506101608601356110ad8161101d565b809150509295509295909350565b5f805f61014084860312156110ce575f80fd5b6110d88585610e98565b92506110e78560a08601610f36565b91506101208401356001600160401b03811115611102575f80fd5b61110e86828701610fcb565b9150509250925092565b5f8060208385031215611129575f80fd5b82356001600160401b0381111561113e575f80fd5b8301601f8101851361114e575f80fd5b80356001600160401b03811115611163575f80fd5b856020828401011115611174575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111c46020830184611184565b9392505050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b602080825282516001600160a01b0316828201528201515f9061123460408401826111cb565b506040838101518051600290810b60e08601526020820151900b610100850152908101516101208401526060908101516101408401528301516101a06101608401526112846101c0840182611184565b90506080840151151561018084015260a084015115156101a08401528091505092915050565b5f602082840312156112ba575f80fd5b81516001600160401b038111156112cf575f80fd5b8201601f810184136112df575f80fd5b80516112ed610fe882610fa5565b818152856020838501011115611301575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561132e575f80fd5b5051919050565b5f60208284031215611345575f80fd5b81356001600160401b0381111561135a575f80fd5b82016101a0818503121561136c575f80fd5b611374610e13565b813561137f81610e6b565b815261138e8560208401610e98565b60208201526113a08560c08401610f36565b60408201526101408201356001600160401b038111156113be575f80fd5b6113ca86828501610fcb565b6060830152506113dd610160830161102a565b60808201526113ef610180830161102a565b60a0820152949350505050565b61140681856111cb565b8251600290810b60a08301526020840151900b60c0820152604083015160e082015260608301516101008201526101406101208201525f610d6a610140830184611184565b5f806040838503121561145c575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52601160045260245ffd5b8082018281125f8312801582168215821617156114a0576114a061146d565b505092915050565b634e487b7160e01b5f52600160045260245ffd5b5f600160ff1b82016114d0576114d061146d565b505f0390565b5f602082840312156114e6575f80fd5b81516111c48161101d565b5f60208284031215611501575f80fd5b81516001600160401b03811115611516575f80fd5b8201601f81018413611526575f80fd5b80516001600160401b0381111561153f5761153f610dff565b8060051b61154f60208201610e3b565b9182526020818401810192908101908784111561156a575f80fd5b6020850194505b8385101561159057845180835260209586019590935090910190611571565b979650505050505050565b8082018082111561065c5761065c61146d56fea2646970667358221220022bb587431beddd1b3a2d4e57eee388a80ee14cf23bcb0c201ec0029fc9cb7a64736f6c634300081a003360a0604052348015600e575f80fd5b506040516117d43803806117d4833981016040819052602b91603b565b6001600160a01b03166080526066565b5f60208284031215604a575f80fd5b81516001600160a01b0381168114605f575f80fd5b9392505050565b6080516117196100bb5f395f8181606e0152818160d7015281816101ee0152818161030001528181610888015281816108e10152818161095e015281816109b201528181610ac50152610af801526117195ff3fe608060405260043610610033575f3560e01c80632229d0b414610037578063481c6a751461005d57806391dd7346146100a8575b5f80fd5b61004a610045366004611286565b6100d4565b6040519081526020015b60405180910390f35b348015610068575f80fd5b506100907f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610054565b3480156100b3575f80fd5b506100c76100c23660046112f7565b6101e1565b6040516100549190611393565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894916040518060a00160405280336001600160a01b031681526020018681526020018881526020018781526020018581525060405160200161014491906113ef565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161016f9190611393565b5f604051808303815f875af115801561018a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101b19190810190611480565b8060200190518101906101c491906114f5565b90504780156101d8576101d85f3383610a04565b50949350505050565b6060336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610217575f80fd5b5f6102248385018561150c565b90505f61023c82604001515f0151835f015130610a9e565b925050505f610257836040015160200151845f015130610a9e565b92505050815f146102af5760405162461bcd60e51b815260206004820152601e60248201527f64656c74614265666f726530206973206e6f7420657175616c20746f2030000060448201526064015b60405180910390fd5b80156102fd5760405162461bcd60e51b815260206004820152601e60248201527f64656c74614265666f726531206973206e6f7420657175616c20746f2030000060448201526064016102a6565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3cd914c8560400151866060015187608001516040518463ffffffff1660e01b815260040161035a939291906115c4565b6020604051808303815f875af1158015610376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039a91906114f5565b90505f6103b285604001515f0151865f015130610a9e565b925050505f6103cd866040015160200151875f015130610a9e565b9250505085606001515f01511561062f575f86606001516020015112156105125785606001516020015182121561047c5760405162461bcd60e51b815260206004820152604760248201527f64656c7461416674657230206973206e6f742067726561746572207468616e2060448201527f6f7220657175616c20746f20646174612e706172616d732e616d6f756e7453706064820152661958da599a595960ca1b608482015260a4016102a6565b816104878460801d90565b600f0b146104a75760405162461bcd60e51b81526004016102a69061160c565b5f81121561050d5760405162461bcd60e51b815260206004820152602d60248201527f64656c7461416674657231206973206e6f742067726561746572207468616e2060448201526c06f7220657175616c20746f203609c1b60648201526084016102a6565b610878565b5f8213156105785760405162461bcd60e51b815260206004820152602d60248201527f64656c7461416674657230206973206e6f74206c657373207468616e206f722060448201526c657175616c20746f207a65726f60981b60648201526084016102a6565b8061058384600f0b90565b600f0b146105a35760405162461bcd60e51b81526004016102a690611657565b85606001516020015181131561050d5760405162461bcd60e51b8152602060048201526044602482018190527f64656c7461416674657231206973206e6f74206c657373207468616e206f7220908201527f657175616c20746f20646174612e706172616d732e616d6f756e745370656369606482015263199a595960e21b608482015260a4016102a6565b5f866060015160200151121561075e578560600151602001518112156106cd5760405162461bcd60e51b815260206004820152604760248201527f64656c7461416674657231206973206e6f742067726561746572207468616e2060448201527f6f7220657175616c20746f20646174612e706172616d732e616d6f756e7453706064820152661958da599a595960ca1b608482015260a4016102a6565b806106d884600f0b90565b600f0b146106f85760405162461bcd60e51b81526004016102a690611657565b5f82121561050d5760405162461bcd60e51b815260206004820152602d60248201527f64656c7461416674657230206973206e6f742067726561746572207468616e2060448201526c06f7220657175616c20746f203609c1b60648201526084016102a6565b5f8113156107c15760405162461bcd60e51b815260206004820152602a60248201527f64656c7461416674657231206973206e6f74206c657373207468616e206f72206044820152690657175616c20746f20360b41b60648201526084016102a6565b816107cc8460801d90565b600f0b146107ec5760405162461bcd60e51b81526004016102a69061160c565b8560600151602001518213156108785760405162461bcd60e51b8152602060048201526044602482018190527f64656c7461416674657230206973206e6f74206c657373207468616e206f7220908201527f657175616c20746f20646174612e706172616d732e616d6f756e745370656369606482015263199a595960e21b608482015260a4016102a6565b5f8212156108d15785516108d1907f0000000000000000000000000000000000000000000000000000000000000000906108b1856116a2565b6020808b0151015160408b0151516001600160a01b031693929190610b2a565b5f811215610936578551610936907f00000000000000000000000000000000000000000000000000000000000000009061090a846116a2565b8960200151602001518a60400151602001516001600160a01b0316610b2a90949392919063ffffffff16565b5f821315610986578551602087015151604088015151610986926001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000091908690610df6565b5f8113156109da578551602080880151516040890151909101516109da926001600160a01b03909116917f000000000000000000000000000000000000000000000000000000000000000091908590610df6565b60408051602081018590520160405160208183030381529060405296505050505050505b92915050565b5f6001600160a01b038416610a37575f805f8085875af1905080610a3257610a326356cdd02560e11b610ec8565b610a98565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f60408201525080610a9857610a98632745a14f60e21b610ec8565b50505050565b5f8080610ab46001600160a01b03871686610ef5565b9250610ae96001600160a01b0387167f0000000000000000000000000000000000000000000000000000000000000000610ef5565b9150610b1f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168588610f84565b905093509350939050565b8015610bbf57836001600160a01b031663f5298aca84610b59886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015b5f604051808303815f87803b158015610ba4575f80fd5b505af1158015610bb6573d5f803e3d5ffd5b50505050610def565b6001600160a01b038516610c3657836001600160a01b03166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610c0b573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610c3091906114f5565b50610def565b604051632961046560e21b81526001600160a01b03868116600483015285169063a5841194906024015f604051808303815f87803b158015610c76575f80fd5b505af1158015610c88573d5f803e3d5ffd5b505050506001600160a01b0383163014610d1a576040516323b872dd60e01b81526001600160a01b0384811660048301528581166024830152604482018490528616906323b872dd906064016020604051808303815f875af1158015610cf0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1491906116c8565b50610d8c565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905286169063a9059cbb906044016020604051808303815f875af1158015610d66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8a91906116c8565b505b836001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610dc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ded91906114f5565b505b5050505050565b80610e3857604051630b0d9c0960e01b81526001600160a01b038681166004830152848116602483015260448201849052851690630b0d9c0990606401610b8d565b836001600160a01b031663156e29f684610e61886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b158015610eab575f80fd5b505af1158015610ebd573d5f803e3d5ffd5b505050505050505050565b3d60405182815260206004820152816024820152815f604483013e602080601f8401040260440191508181fd5b5f6001600160a01b038316610f1557506001600160a01b038116316109fe565b6040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015610f59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7d91906114f5565b90506109fe565b5f806001600160a01b0384165f526001600160a01b03831660205260405f209050846001600160a01b031663f135baaa826040518263ffffffff1660e01b8152600401610fd391815260200190565b602060405180830381865afa158015610fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101291906114f5565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156110525761105261101b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156110815761108161101b565b604052919050565b6001600160a01b038116811461109d575f80fd5b50565b80356110ab81611089565b919050565b5f60a082840312156110c0575f80fd5b6110c861102f565b905081356110d581611089565b815260208201356110e581611089565b6020820152604082013562ffffff811681146110ff575f80fd5b60408201526060820135600281900b8114611118575f80fd5b6060820152611129608083016110a0565b608082015292915050565b801515811461109d575f80fd5b5f60608284031215611151575f80fd5b6040516060810167ffffffffffffffff811182821017156111745761117461101b565b604052905080823561118581611134565b815260208381013590820152604083013561119f81611089565b6040919091015292915050565b5f604082840312156111bc575f80fd5b6040805190810167ffffffffffffffff811182821017156111df576111df61101b565b60405290508082356111f081611134565b8152602083013561120081611134565b6020919091015292915050565b5f67ffffffffffffffff8211156112265761122661101b565b50601f01601f191660200190565b5f82601f830112611243575f80fd5b81356112566112518261120d565b611058565b81815284602083860101111561126a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80610160858703121561129a575f80fd5b6112a486866110b0565b93506112b38660a08701611141565b92506112c38661010087016111ac565b915061014085013567ffffffffffffffff8111156112df575f80fd5b6112eb87828801611234565b91505092959194509250565b5f8060208385031215611308575f80fd5b823567ffffffffffffffff81111561131e575f80fd5b8301601f8101851361132e575f80fd5b803567ffffffffffffffff811115611344575f80fd5b856020828401011115611355575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6113a56020830184611365565b9392505050565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b602080825282516001600160a01b0316828201528281015180511515604080850191909152910151151560608301528201515f9061143060808401826113ac565b506060830151805115156101208401526020810151610140840152604001516001600160a01b03166101608301526080830151610180808401526114786101a0840182611365565b949350505050565b5f60208284031215611490575f80fd5b815167ffffffffffffffff8111156114a6575f80fd5b8201601f810184136114b6575f80fd5b80516114c46112518261120d565b8181528560208385010111156114d8575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215611505575f80fd5b5051919050565b5f6020828403121561151c575f80fd5b813567ffffffffffffffff811115611532575f80fd5b82016101808185031215611544575f80fd5b61154c61102f565b813561155781611089565b815261156685602084016111ac565b602082015261157885606084016110b0565b604082015261158b856101008401611141565b606082015261016082013567ffffffffffffffff8111156115aa575f80fd5b6115b686828501611234565b608083015250949350505050565b6115ce81856113ac565b8251151560a0820152602083015160c082015260408301516001600160a01b031660e08201526101206101008201525f611012610120830184611365565b6020808252602b908201527f64656c74612e616d6f756e74302829206973206e6f7420657175616c20746f2060408201526a064656c74614166746572360ac1b606082015260800190565b6020808252602b908201527f64656c74612e616d6f756e74312829206973206e6f7420657175616c20746f2060408201526a64656c746141667465723160a81b606082015260800190565b5f600160ff1b82016116c257634e487b7160e01b5f52601160045260245ffd5b505f0390565b5f602082840312156116d8575f80fd5b81516113a58161113456fea2646970667358221220ab101dfe4b4748d245c1716f79d45f12181b0ade83665d9ec819f86559f0b77264736f6c634300081a00336080604052348015600e575f80fd5b506105a08061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c806332c961d91461005957806357eb1da714610081578063769323e314610089578063b08d3fe214610091578063e631bcbf146100d1575b5f80fd5b61006e610067366004610386565b60a0902090565b6040519081526020015b60405180910390f35b61006e600681565b61006e600481565b6100a461009f366004610423565b61011c565b604080516001600160801b039095168552600f9390930b6020850152918301526060820152608001610078565b6100e46100df36600461045e565b6101d2565b604080516001600160a01b03909516855260029390930b602085015262ffffff91821692840192909252166060820152608001610078565b5f805f805f61012b8787610284565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038a16906335fd631a906044015f60405180830381865afa158015610179573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101a09190810190610488565b602081015160408201516060909201516001600160801b0382169c60809290921d9b5091995090975095505050505050565b5f805f805f6101e0866102d8565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015610228573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024c9190610534565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b5f8061028f846102d8565b90505f61029d60048361054b565b60408051600287900b602082015290810182905290915060600160405160208183030381529060405280519060200120925050505b92915050565b6040515f906102f7908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561035157610351610314565b604052919050565b6001600160a01b038116811461036d575f80fd5b50565b8035600281900b8114610381575f80fd5b919050565b5f60a0828403128015610397575f80fd5b5060405160a0810167ffffffffffffffff811182821017156103bb576103bb610314565b60405282356103c981610359565b815260208301356103d981610359565b6020820152604083013562ffffff811681146103f3575f80fd5b604082015261040460608401610370565b6060820152608083013561041781610359565b60808201529392505050565b5f805f60608486031215610435575f80fd5b833561044081610359565b92506020840135915061045560408501610370565b90509250925092565b5f806040838503121561046f575f80fd5b823561047a81610359565b946020939093013593505050565b5f60208284031215610498575f80fd5b815167ffffffffffffffff8111156104ae575f80fd5b8201601f810184136104be575f80fd5b805167ffffffffffffffff8111156104d8576104d8610314565b8060051b6104e860208201610328565b91825260208184018101929081019087841115610503575f80fd5b6020850194505b838510156105295784518083526020958601959093509091019061050a565b979650505050505050565b5f60208284031215610544575f80fd5b5051919050565b808201808211156102d257634e487b7160e01b5f52601160045260245ffdfea26469706673582212200f59ae3b20597ee5b9c8afd86ef4272903aea11220ba5f5248dea7997a9f1cfe64736f6c634300081a003360e060405234801561000f575f80fd5b50604051610eea380380610eea83398101604081905261002e916101a1565b8282825f61003c84826102a2565b50600161004983826102a2565b5060ff81166080524660a05261005d61006c565b60c052506103cd945050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161009c919061035c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610127575f80fd5b81516001600160401b0381111561014057610140610104565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016e5761016e610104565b604052818152838201602001851015610185575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f805f606084860312156101b3575f80fd5b83516001600160401b038111156101c8575f80fd5b6101d486828701610118565b602086015190945090506001600160401b038111156101f1575f80fd5b6101fd86828701610118565b925050604084015160ff81168114610213575f80fd5b809150509250925092565b600181811c9082168061023257607f821691505b60208210810361025057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029d57805f5260205f20601f840160051c8101602085101561027b5750805b601f840160051c820191505b8181101561029a575f8155600101610287565b50505b505050565b81516001600160401b038111156102bb576102bb610104565b6102cf816102c9845461021e565b84610256565b6020601f821160018114610301575f83156102ea5750848201515b5f19600385901b1c1916600184901b17845561029a565b5f84815260208120601f198516915b828110156103305787850151825560209485019460019092019101610310565b508482101561034d57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8083546103698161021e565b6001821680156103805760018114610395576103c2565b60ff19831686528115158202860193506103c2565b865f5260205f205f5b838110156103ba5781548882015260019091019060200161039e565b505081860193505b509195945050505050565b60805160a05160c051610af36103f75f395f61044201525f61040d01525f61013f0152610af35ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806340c10f191161008857806395d89b411161006357806395d89b41146101cc578063a9059cbb146101d4578063d505accf146101e7578063dd62ed3e146101fc575f80fd5b806340c10f191461017b57806370a082311461018e5780637ecebe00146101ad575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610127578063313ce5671461013a5780633644e51514610173575b5f80fd5b6100d7610226565b6040516100e4919061083f565b60405180910390f35b6101006100fb36600461088f565b6102b1565b60405190151581526020016100e4565b61011960025481565b6040519081526020016100e4565b6101006101353660046108b7565b61031d565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016100e4565b61011961040a565b61010061018936600461088f565b610464565b61011961019c3660046108f1565b60036020525f908152604090205481565b6101196101bb3660046108f1565b60056020525f908152604090205481565b6100d7610478565b6101006101e236600461088f565b610485565b6101fa6101f5366004610911565b6104fb565b005b61011961020a36600461097e565b600460209081525f928352604080842090915290825290205481565b5f8054610232906109af565b80601f016020809104026020016040519081016040528092919081815260200182805461025e906109af565b80156102a95780601f10610280576101008083540402835291602001916102a9565b820191905f5260205f20905b81548152906001019060200180831161028c57829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061030b9086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146103765761035283826109fb565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f908152600360205260408120805485929061039d9084906109fb565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103f79087815260200190565b60405180910390a3506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461043f5761043a61073e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f61046f83836107d6565b50600192915050565b60018054610232906109af565b335f908152600360205260408120805483919083906104a59084906109fb565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061030b9086815260200190565b428410156105505760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f600161055b61040a565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610663573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906106995750876001600160a01b0316816001600160a01b0316145b6106d65760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610547565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161076e9190610a0e565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546107e79190610aaa565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461088a575f80fd5b919050565b5f80604083850312156108a0575f80fd5b6108a983610874565b946020939093013593505050565b5f805f606084860312156108c9575f80fd5b6108d284610874565b92506108e060208501610874565b929592945050506040919091013590565b5f60208284031215610901575f80fd5b61090a82610874565b9392505050565b5f805f805f805f60e0888a031215610927575f80fd5b61093088610874565b965061093e60208901610874565b95506040880135945060608801359350608088013560ff81168114610961575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561098f575f80fd5b61099883610874565b91506109a660208401610874565b90509250929050565b600181811c908216806109c357607f821691505b6020821081036109e157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610317576103176109e7565b5f8083545f8160011c90506001821680610a2957607f821691505b602082108103610a4757634e487b7160e01b5f52602260045260245ffd5b808015610a5b5760018114610a7057610a9e565b60ff1984168752821515830287019450610a9e565b5f888152602090205f5b84811015610a9657815489820152600190910190602001610a7a565b505082870194505b50929695505050505050565b80820180821115610317576103176109e756fea2646970667358221220f4620711d0f8649f80fed98a6eb335b7806c86e0ebaba0b9fa57daf20d6ed2f364736f6c634300081a00336080604052348015600e575f80fd5b50604051610521380380610521833981016040819052602b91607b565b5f80546001600160a01b039485166001600160a01b031991821617909155600180549390941692169190911790915560025560af565b80516001600160a01b03811681146076575f80fd5b919050565b5f805f60608486031215608c575f80fd5b6093846061565b9250609f602085016061565b9150604084015190509250925092565b610465806100bc5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c806358dbbe811461005957806391b7f5ed14610089578063a035b1fe1461009e578063d004f0f7146100b5578063f5992699146100c8575b5f80fd5b60015461006c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009c6100973660046103c4565b6100da565b005b6100a760025481565b604051908152602001610080565b61009c6100c33660046103db565b610115565b5f5461006c906001600160a01b031681565b60028190556040518181527ff347ee99503bf19c028bd6b18f3c676e82a9bb5b2bb5225aebe0fd62fd6a0d199060200160405180910390a150565b5f805481906001600160a01b039081169085160361015257506001546002546001600160a01b039091169061014b90849061037e565b91506101c2565b6001546001600160a01b039081169085160361018557505f546002546001600160a01b039091169061014b908490610399565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064015b60405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038516906323b872dd906064016020604051808303815f875af1158015610212573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102369190610410565b6102745760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101b9565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0382169063a9059cbb906044016020604051808303815f875af11580156102be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e29190610410565b6103205760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016101b9565b604080516001600160a01b03808716825283166020820152908101849052606081018390523360808201527fb39c9bc43f811e1a7ce159c5f147458fdb80266bf23c17322013316e27e086d09060a00160405180910390a150505050565b5f6103928383670de0b6b3a76400006103a9565b9392505050565b5f61039283670de0b6b3a7640000845b5f825f1904841183021582026103bd575f80fd5b5091020490565b5f602082840312156103d4575f80fd5b5035919050565b5f80604083850312156103ec575f80fd5b82356001600160a01b0381168114610402575f80fd5b946020939093013593505050565b5f60208284031215610420575f80fd5b81518015158114610392575f80fdfea264697066735822122071f33bd4e906706fab2f1d579ad88e83e4a15cb735911cd69a3275ede2ed3ced64736f6c634300081a0033","sourceMap":"764:8545:53:-:0;;;1471:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1558:3;1542:20;;;;;:::i;:::-;508:25:57;;;496:2;481:18;1542:20:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1528:34:53;;;;;1581:40;;;;;:::i;:::-;-1:-1:-1;;;;;728:32:57;;;710:51;;698:2;683:18;1581:40:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1572:49:53;;;1661:11;;1644:29;;;;;:::i;:::-;-1:-1:-1;;;;;728:32:57;;;710:51;;698:2;683:18;1644:29:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1631:42:53;;;1693:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1683:23:53;;;1729:37;;1763:2;;1729:37;;;:::i;:::-;1110:2:57;1092:21;;;1149:1;1129:18;;;1122:29;-1:-1:-1;;;1182:3:57;1167:19;;1160:40;1238:3;1231:4;1216:20;;1209:33;;;1279:1;1258:19;;;1251:30;-1:-1:-1;;;1312:3:57;1297:19;;1290:33;1407:4;1395:17;;;-1:-1:-1;1375:18:57;;1368:45;1355:3;1340:19;1729:37:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1717:49:53;;;1788:37;;1822:2;;1788:37;;;:::i;:::-;1762:2:57;1744:21;;;1801:1;1781:18;;;1774:29;-1:-1:-1;;;1834:3:57;1819:19;;1812:40;1890:3;1883:4;1868:20;;1861:33;;;1931:1;1910:19;;;1903:30;-1:-1:-1;;;1964:3:57;1949:19;;1942:33;2059:4;2047:17;;;-1:-1:-1;2027:18:57;;2020:45;2007:3;1992:19;1788:37:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1776:49:53;;;;;;;1840:9;;:21;;;;1836:99;;;1903:9;;;1914;;;-1:-1:-1;;;;;1877:47:53;;;;;;;;;;1836:99;1978:9;;1998;;2010:12;1951:72;;;;;:::i;:::-;-1:-1:-1;;;;;2296:32:57;;;2278:51;;2365:32;;;;2360:2;2345:18;;2338:60;2429:2;2414:18;;2407:34;2266:2;2251:18;1951:72:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1945:78:53;;;;;2042:9;;:46;;-1:-1:-1;;;2042:46:53;;2065:4;2042:46;;;2648:51:57;2072:15:53;2715:18:57;;;2708:34;2042:14:53;;;;;2621:18:57;;2042:46:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2034:102;;;;-1:-1:-1;;;2034:102:53;;3237:2:57;2034:102:53;;;3219:21:57;3276:2;3256:18;;;3249:30;3315:34;3295:18;;;3288:62;-1:-1:-1;;;3366:18:57;;;3359:41;3417:19;;2034:102:53;;;;;;;;;2154:9;;:46;;-1:-1:-1;;;2154:46:53;;2177:4;2154:46;;;2648:51:57;2184:15:53;2715:18:57;;;2708:34;-1:-1:-1;;;;;2154:14:53;;;;;;2621:18:57;;2154:46:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2146:102;;;;-1:-1:-1;;;2146:102:53;;3649:2:57;2146:102:53;;;3631:21:57;3688:2;3668:18;;;3661:30;3727:34;3707:18;;;3700:62;-1:-1:-1;;;3778:18:57;;;3771:41;3829:19;;2146:102:53;3447:407:57;2146:102:53;1471:784;;764:8545;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;14:343:57:-;93:6;101;154:2;142:9;133:7;129:23;125:32;122:52;;;170:1;167;160:12;122:52;-1:-1:-1;;215:16:57;;321:2;306:18;;;300:25;215:16;;300:25;;-1:-1:-1;14:343:57:o;2753:277::-;2820:6;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2921:9;2915:16;2974:5;2967:13;2960:21;2953:5;2950:32;2940:60;;2996:1;2993;2986:12;2940:60;3019:5;2753:277;-1:-1:-1;;;2753:277:57:o;3447:407::-;764:8545:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063542524dd11610063578063542524dd1461020c5780636af577411461022c57806391b7f5ed1461023f57806396f5e27c14610252578063c7b8e15d14610265575f80fd5b8063014807031461009f57806306ba06fa14610139578063100d3f741461014e578063182148ef1461018b57806334d9900a14610204575b5f80fd5b6100a761026d565b604080518251600290810b82526020808501516001600160a01b03908116828501528585015181168486015260608087015181860152608080880151805184168288015293840151831660a0808801919091529684015162ffffff1660c08701529083015190930b60e08501529101518116610100830152919092015116610120820152610140015b60405180910390f35b61014c610147366004611809565b610541565b005b61016161015c36600461186c565b6109b5565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610130565b5f54600154600280546101c4936001600160a01b03908116938082169362ffffff600160a01b83041693600160b81b909204900b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a001610130565b61014c610b18565b6102146110fe565b6040516001600160a01b039091168152602001610130565b61014c61023a3660046118ef565b611120565b61014c61024d3660046119eb565b61128b565b61014c610260366004611a02565b6112fc565b610214611375565b6040805160c0810182525f80825260208083018290528284018290526060808401839052845160a080820187528482529281018490528086018490529081018390526080808201849052840152820181905291516332c961d960e01b815290919081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e631bcbf907f00000000000000000000000000000000000000000000000000000000000000009083906332c961d990610339908790600401611a71565b602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190611a85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401608060405180830381865afa1580156103bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e39190611a9c565b5050915091506040518060c001604052808260020b8152602001836001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610497573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104bb9190611a85565b81526040805160a0810182525f546001600160a01b03908116825260015480821660208481019190915262ffffff600160a01b83041684860152600160b81b909104600290810b606085015254821660808401528401919091527f0000000000000000000000000000000000000000000000000000000000000000169101529392505050565b5f831315610702576040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af11580156105b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d79190611af8565b6106285760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637930206661696c6564000000000000000060448201526064015b60405180910390fd5b6040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f19906044016020604051808303815f875af1158015610692573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b69190611af8565b6107025760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e672063757272656e637931206661696c65640000000000000000604482015260640161061f565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561078e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b29190611af8565b6107fe5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637930206661696c6564000000604482015260640161061f565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190611af8565b6108fa5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637931206661696c6564000000604482015260640161061f565b60408051608081018252600284810b825283900b60208201528082018590525f606082018190529151632d35e7ed60e11b815290916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691635a6bcfda9161096e918590600401611b17565b6020604051808303815f875af115801561098a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ae9190611a85565b5050505050565b5f80808062ffffff85166001600160a01b03808a16908b1610158288128015610a8b575f6109ee8a5f0385620f424003620f4240611385565b905082610a0757610a028d8d8d6001611422565b610a14565b610a148c8e8d600161146e565b9650868110610a48578b9750620f42408414610a3f57610a3a878586620f424003611533565b610a41565b865b9450610a61565b809650610a578d8c8386611563565b9750868a5f030394505b82610a7757610a728d898d5f61146e565b610a83565b610a83888e8d5f611422565b955050610b09565b81610aa157610a9c8c8c8c5f61146e565b610aad565b610aad8b8d8c5f611422565b9450848910610abe578a9650610ad0565b889450610acd8c8b87856115ba565b96505b81610ae757610ae28c888c6001611422565b610af4565b610af4878d8c600161146e565b9550610b06868485620f424003611533565b93505b50505095509550955095915050565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015610ba4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc89190611af8565b610c145760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637930206661696c6564000000604482015260640161061f565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015610ca0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc49190611af8565b610d105760405162461bcd60e51b815260206004820152601d60248201527f417070726f76616c20666f722063757272656e637931206661696c6564000000604482015260640161061f565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e631bcbf7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332c961d95f6040518263ffffffff1660e01b8152600401610dae9190611a71565b602060405180830381865afa158015610dc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ded9190611a85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401608060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190611a9c565b5050915091505f610e80836001600160a01b0316846001600160a01b0316600160c01b611385565b610e9290670de0b6b3a7640000611b7c565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f159190611a85565b90508082111561100357604080516060810182526001808252620f42406020830152915f91908101610f4d6401000276a36001611bb2565b6001600160a01b039081169091526040805180820182525f80825260208201819052915163088a742d60e21b8152939450927f000000000000000000000000000000000000000000000000000000000000000090921691632229d0b491610fba9186908690600401611bd1565b6020604051808303815f875af1158015610fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffa9190611a85565b505050506110f8565b808210156110f857604080516060810182525f8082526127106020830152918291908101611046600173fffd8963efd1fc6a506488495d951d5263988d26611b93565b6001600160a01b039081169091526040805180820182525f80825260208201819052915163088a742d60e21b8152939450927f000000000000000000000000000000000000000000000000000000000000000090921691632229d0b4916110b39186908690600401611bd1565b6020604051808303815f875af11580156110cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f39190611a85565b505050505b50505050565b61111d600173fffd8963efd1fc6a506488495d951d5263988d26611b93565b81565b6040805160a0810182527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081168083527f000000000000000000000000000000000000000000000000000000000000000082166020840181905262ffffff8a811685870181905260028b810b60608801528a861660809097018790525f80546001600160a01b03199081169096178155600180546001600160b81b031916909517600160a01b9093029290921762ffffff60b81b1916600160b81b938d16939093029290921790925580549092169093179055915163695c5bf560e01b81527f00000000000000000000000000000000000000000000000000000000000000009092169163695c5bf5916112439186908690600401611c31565b6020604051808303815f875af115801561125f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112839190611c86565b505050505050565b6040516391b7f5ed60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391b7f5ed906024015f604051808303815f87803b1580156112ea575f80fd5b505af11580156109ae573d5f803e3d5ffd5b60405163d004f0f760e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d004f0f7906044015f604051808303815f87803b158015611363575f80fd5b505af1158015611283573d5f803e3d5ffd5b61111d6401000276a36001611bb2565b5f838302815f19858709828110838203039150508084116113a4575f80fd5b805f036113b65750829004905061141b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b5f6001600160a01b038481169086160360ff81901d90810118600160601b6001600160801b038516611455818484611385565b9350845f83858409111684019350505050949350505050565b5f836001600160a01b0316856001600160a01b0316111561148d579293925b6001600160a01b0385166114a75762bfc9215f526004601cfd5b600160601b600160e01b03606084901b166001600160a01b0386860316836114fa57866001600160a01b03166114e78383896001600160a01b0316611385565b816114f4576114f4611ca1565b04611526565b6115266115118383896001600160a01b0316611533565b886001600160a01b0316808204910615150190565b925050505b949350505050565b5f61153f848484611385565b9050818061154f5761154f611ca1565b8385091561141b576001018061141b575f80fd5b5f6001600160801b038416156001600160a01b03861615171561158d57634f2461b85f526004601cfd5b816115a45761159f85858560016115fd565b6115b1565b6115b185858560016116e8565b95945050505050565b5f6001600160801b038416156001600160a01b0386161517156115e457634f2461b85f526004601cfd5b816115f55761159f8585855f6116e8565b6115b18585855f5b5f811561166d575f6001600160a01b038411156116315761162c84600160601b876001600160801b0316611385565b611648565b6116486001600160801b038616606086901b611cb5565b9050611665611660826001600160a01b038916611cd4565b6117ca565b91505061152b565b5f6001600160a01b0384111561169a5761169584600160601b876001600160801b0316611533565b6116b7565b6116b7606085901b6001600160801b038716808204910615150190565b9050806001600160a01b038716116116d657634323a5555f526004601cfd5b6001600160a01b03861603905061152b565b5f825f036116f757508361152b565b600160601b600160e01b03606085901b168215611789576001600160a01b0386168481029085828161172b5761172b611ca1565b040361175b578181018281106117595761174f83896001600160a01b031683611533565b935050505061152b565b505b5061166581856117746001600160a01b038a1683611cb5565b61177e9190611cd4565b808204910615150190565b6001600160a01b0386168481029085820414818311166117b05763f5c787f15f526004601cfd5b80820361174f611660846001600160a01b038b1684611533565b806001600160a01b03811681146117eb576117eb6393dafdf160e01b6117f0565b919050565b805f5260045ffd5b8060020b8114611806575f80fd5b50565b5f805f6060848603121561181b575f80fd5b83359250602084013561182d816117f8565b9150604084013561183d816117f8565b809150509250925092565b6001600160a01b0381168114611806575f80fd5b62ffffff81168114611806575f80fd5b5f805f805f60a08688031215611880575f80fd5b853561188b81611848565b9450602086013561189b81611848565b935060408601356001600160801b03811681146118b6575f80fd5b92506060860135915060808601356118cd8161185c565b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b5f805f805f60a08688031215611903575f80fd5b853561190e8161185c565b9450602086013561191e816117f8565b9350604086013561192e81611848565b9250606086013561193e81611848565b9150608086013567ffffffffffffffff811115611959575f80fd5b8601601f81018813611969575f80fd5b803567ffffffffffffffff811115611983576119836118db565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156119b2576119b26118db565b6040528181528282016020018a10156119c9575f80fd5b816020840160208301375f602083830101528093505050509295509295909350565b5f602082840312156119fb575f80fd5b5035919050565b5f8060408385031215611a13575f80fd5b8235611a1e81611848565b946020939093013593505050565b80546001600160a01b0390811683526001820154808216602085015260a081901c62ffffff16604085015260b81c600290810b60608501529091015416608090910152565b60a08101611a7f8284611a2c565b92915050565b5f60208284031215611a95575f80fd5b5051919050565b5f805f8060808587031215611aaf575f80fd5b8451611aba81611848565b6020860151909450611acb816117f8565b6040860151909350611adc8161185c565b6060860151909250611aed8161185c565b939692955090935050565b5f60208284031215611b08575f80fd5b8151801515811461141b575f80fd5b611b218184611a2c565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611a7f57611a7f611b68565b6001600160a01b038281168282160390811115611a7f57611a7f611b68565b6001600160a01b038181168382160190811115611a7f57611a7f611b68565b611bdb8185611a2c565b8251151560a082015260208084015160c08301526040909301516001600160a01b031660e082015281511515610100820152910151151561012082015261016061014082018190525f9082015261018001919050565b611c3b8185611a2c565b60018060a01b03831660a082015260e060c08201525f82518060e0840152806020850161010085015e5f6101008285010152610100601f19601f830116840101915050949350505050565b5f60208284031215611c96575f80fd5b815161141b816117f8565b634e487b7160e01b5f52601260045260245ffd5b5f82611ccf57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115611a7f57611a7f611b6856fea2646970667358221220df97a61bfb23d2bcd3ca0a0074213f43d93913ad002c42f3a20e0de11ebb184664736f6c634300081a0033","sourceMap":"764:8545:53:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2261:422;;;:::i;:::-;;;;352:13:57;;349:1;338:28;;;320:47;;427:4;415:17;;;409:24;-1:-1:-1;;;;;405:50:57;;;383:20;;;376:80;504:17;;;498:24;494:50;;472:20;;;465:80;601:4;589:17;;;583:24;561:20;;;554:54;655:4;643:17;;;637:24;703:19;;699:45;;677:20;;;670:75;792:23;;;786:30;782:56;;443:3;761:19;;;754:85;;;;886:23;;;880:30;912:8;876:45;870:3;855:19;;848:74;979:23;;;973:30;959:45;;;953:3;938:19;;931:74;1052:23;;1046:30;1042:56;;1036:3;1021:19;;1014:85;1136:16;;;;1130:23;80:31;1212:6;1197:22;;68:44;307:3;292:19;2261:422:53;;;;;;;;4996:854;;;;;;:::i;:::-;;:::i;:::-;;5856:3451;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3217:32:57;;;3199:51;;3281:2;3266:18;;3259:34;;;;3309:18;;;3302:34;3367:2;3352:18;;3345:34;3186:3;3171:19;5856:3451:53;2968:417:57;1058:22:53;;;;;;;;;;-1:-1:-1;;;;;1058:22:53;;;;;;;;;-1:-1:-1;;;1058:22:53;;;;-1:-1:-1;;;1058:22:53;;;;;;;;;;;;;-1:-1:-1;;;;;3736:32:57;;;3718:51;;3805:32;;;3800:2;3785:18;;3778:60;3886:8;3874:21;;;3854:18;;;3847:49;;;;3943:1;3932:21;3927:2;3912:18;;3905:49;3991:32;;;;3985:3;3970:19;;3963:61;3705:3;3690:19;1058:22:53;3390:640:57;2882:1654:53;;;:::i;1213:69::-;;;:::i;:::-;;;-1:-1:-1;;;;;4199:32:57;;;4181:51;;4169:2;4154:18;1213:69:53;4035:203:57;4542:448:53;;;;;;:::i;:::-;;:::i;2689:76::-;;;;;;:::i;:::-;;:::i;2771:105::-;;;;;;:::i;:::-;;:::i;1138:69::-;;;:::i;2261:422::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2403:21:53;;-1:-1:-1;;;2403:21:53;;-1:-1:-1;;;;;;;;;;2373:7:53;:16;;;;2390:11;;2373:16;;2403:12;;:21;;-1:-1:-1;;2403:21:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2373:52;;-1:-1:-1;;;;;;2373:52:53;;;;;;;-1:-1:-1;;;;;7772:32:57;;;2373:52:53;;;7754:51:57;7821:18;;;7814:34;7727:18;;2373:52:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2334:91;;;;;;2443:233;;;;;;;;2477:4;2443:233;;;;;;2509:12;-1:-1:-1;;;;;2443:233:53;;;;;2552:11;-1:-1:-1;;;;;2443:233:53;;;;;2588:3;-1:-1:-1;;;;;2588:9:53;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2443:233;;;;;;;;;;2619:7;2443:233;-1:-1:-1;;;;;2443:233:53;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2443:233:53;;;;;;;-1:-1:-1;;;2443:233:53;;;;;;;;;;;;;;;;;;;;;;;;2657:7;2443:233;;;;2436:240;2261:422;-1:-1:-1;;;2261:422:53:o;4996:854::-;5113:1;5096:14;:18;5092:245;;;5138:54;;-1:-1:-1;;;5138:54:53;;5161:4;5138:54;;;7754:51:57;7821:18;;;7814:34;;;5138:9:53;-1:-1:-1;;;;;5138:14:53;;;;7727:18:57;;5138:54:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5130:91;;;;-1:-1:-1;;;5130:91:53;;9462:2:57;5130:91:53;;;9444:21:57;9501:2;9481:18;;;9474:30;9540:26;9520:18;;;9513:54;9584:18;;5130:91:53;;;;;;;;;5243:54;;-1:-1:-1;;;5243:54:53;;5266:4;5243:54;;;7754:51:57;7821:18;;;7814:34;;;5243:9:53;-1:-1:-1;;;;;5243:14:53;;;;7727:18:57;;5243:54:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5235:91;;;;-1:-1:-1;;;5235:91:53;;9815:2:57;5235:91:53;;;9797:21:57;9854:2;9834:18;;;9827:30;9893:26;9873:18;;;9866:54;9937:18;;5235:91:53;9613:348:57;5235:91:53;5355:53;;-1:-1:-1;;;5355:53:53;;-1:-1:-1;;;;;5381:6:53;7772:32:57;;5355:53:53;;;7754:51:57;-1:-1:-1;;7821:18:57;;;7814:34;5355:9:53;:17;;;;7727:18:57;;5355:53:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5347:95;;;;-1:-1:-1;;;5347:95:53;;10168:2:57;5347:95:53;;;10150:21:57;10207:2;10187:18;;;10180:30;10246:31;10226:18;;;10219:59;10295:18;;5347:95:53;9966:353:57;5347:95:53;5460:53;;-1:-1:-1;;;5460:53:53;;-1:-1:-1;;;;;5486:6:53;7772:32:57;;5460:53:53;;;7754:51:57;-1:-1:-1;;7821:18:57;;;7814:34;5460:9:53;:17;;;;7727:18:57;;5460:53:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5452:95;;;;-1:-1:-1;;;5452:95:53;;10526:2:57;5452:95:53;;;10508:21:57;10565:2;10545:18;;;10538:30;10604:31;10584:18;;;10577:59;10653:18;;5452:95:53;10324:353:57;5452:95:53;5609:180;;;;;;;;;;;;;;;;;;;;;;;;;;;5558:48;5609:180;;;;;;5800:43;;-1:-1:-1;;;5800:43:53;;5609:180;;-1:-1:-1;;;;;5800:6:53;:22;;;;:43;;5609:180;;5800:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5082:768;4996:854;;;:::o;5856:3451::-;6066:24;;;;6182:26;;;-1:-1:-1;;;;;6265:41:53;;;;;;;;6335:19;;;6369:2922;;;;6400:30;6453:81;6478:15;6477:16;;6511:8;1128:3;6496:23;1128:3;6453:15;:81::i;:::-;6400:134;;6563:10;:230;;6706:87;6736:19;6757:18;6777:9;6788:4;6706:29;:87::i;:::-;6563:230;;;6596:87;6626:18;6646:19;6667:9;6678:4;6596:29;:87::i;:::-;6552:241;;6841:8;6815:22;:34;6811:969;;6956:18;6937:37;;1128:3;7008:8;:24;:256;;7194:70;7220:8;7230;7255;1128:3;7240:23;7194:25;:70::i;:::-;7008:256;;;7059:8;7008:256;6996:268;;6811:969;;;7374:22;7363:33;;7437:153;7502:19;7523:9;7534:22;7558:10;7437:39;:153::i;:::-;7418:172;;7753:8;7734:15;7733:16;;7725:36;7713:48;;6811:969;7809:10;:228;;7951:86;7981:19;8002:16;8020:9;8031:5;7951:29;:86::i;:::-;7809:228;;;7842:86;7872:16;7890:19;7911:9;7922:5;7842:29;:86::i;:::-;7797:240;;6382:1670;6369:2922;;;8088:10;:232;;8232:88;8262:19;8283:18;8303:9;8314:5;8232:29;:88::i;:::-;8088:232;;;8121:88;8151:18;8171:19;8192:9;8203:5;8121:29;:88::i;:::-;8076:244;;8370:9;8350:15;8342:37;8338:516;;8487:18;8468:37;;8338:516;;;8659:15;8639:36;;8740:95;8781:19;8802:9;8813;8824:10;8740:40;:95::i;:::-;8697:138;;8338:516;8882:10;:226;;9023:85;9053:19;9074:16;9092:9;9103:4;9023:29;:85::i;:::-;8882:226;;;8915:85;8945:16;8963:19;8984:9;8995:4;8915:29;:85::i;:::-;8871:237;;9206:70;9232:8;9242;9267;1128:3;9252:23;9206:25;:70::i;:::-;9194:82;;6369:2922;6158:3143;;;5856:3451;;;;;;;;;;:::o;2882:1654::-;2932:57;;-1:-1:-1;;;2932:57:53;;-1:-1:-1;;;;;2958:10:53;7772:32:57;;2932:57:53;;;7754:51:57;-1:-1:-1;;7821:18:57;;;7814:34;2932:9:53;:17;;;;7727:18:57;;2932:57:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2924:99;;;;-1:-1:-1;;;2924:99:53;;10168:2:57;2924:99:53;;;10150:21:57;10207:2;10187:18;;;10180:30;10246:31;10226:18;;;10219:59;10295:18;;2924:99:53;9966:353:57;2924:99:53;3041:57;;-1:-1:-1;;;3041:57:53;;-1:-1:-1;;;;;3067:10:53;7772:32:57;;3041:57:53;;;7754:51:57;-1:-1:-1;;7821:18:57;;;7814:34;3041:9:53;:17;;;;7727:18:57;;3041:57:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3033:99;;;;-1:-1:-1;;;3033:99:53;;10526:2:57;3033:99:53;;;10508:21:57;10565:2;10545:18;;;10538:30;10604:31;10584:18;;;10577:59;10653:18;;3033:99:53;10324:353:57;3033:99:53;3144:20;3166:10;3182:7;-1:-1:-1;;;;;3182:16:53;;3199:11;3212:7;-1:-1:-1;;;;;3212:12:53;;3225:7;3212:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3182:52;;-1:-1:-1;;;;;;3182:52:53;;;;;;;-1:-1:-1;;;;;7772:32:57;;;3182:52:53;;;7754:51:57;7821:18;;;7814:34;7727:18;;3182:52:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3143:91;;;;;;3253:20;3276:53;3292:12;-1:-1:-1;;;;;3276:53:53;3306:12;-1:-1:-1;;;;;3276:53:53;-1:-1:-1;;;3276:15:53;:53::i;:::-;:60;;3332:4;3276:60;:::i;:::-;3253:83;;3346:16;3365:3;-1:-1:-1;;;;;3365:9:53;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3346:30;;3406:8;3391:12;:23;3387:1143;;;3507:224;;;;;;;;3448:4;3507:224;;;3606:7;3507:224;;;;3448:4;3430:15;;3507:224;;;1180:27;1586:10:40;1206:1:53;1180:27;:::i;:::-;-1:-1:-1;;;;;3507:224:53;;;;;;3810:70;;;;;;;;3746:45;3810:70;;;;;;;;;3895:50;;-1:-1:-1;;;3895:50:53;;3467:264;;-1:-1:-1;3810:70:53;3895:10;:15;;;;;;:50;;3467:264;;3810:70;;3895:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3416:540;;;3387:1143;;;3981:8;3966:12;:23;3962:568;;;4083:222;;;;;;;;4005:15;4083:222;;;4182:5;4083:222;;;;4005:15;;;4083:222;;;1255:27;1281:1;1766:49:40;1255:27:53;:::i;:::-;-1:-1:-1;;;;;4083:222:53;;;;;;4384:70;;;;;;;;4320:45;4384:70;;;;;;;;;4469:50;;-1:-1:-1;;;4469:50:53;;4043:262;;-1:-1:-1;4384:70:53;4469:10;:15;;;;;;:50;;4043:262;;4384:70;;4469:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3991:539;;;3962:568;2914:1622;;;;2882:1654::o;1213:69::-;1255:27;1281:1;1766:49:40;1255:27:53;:::i;:::-;1213:69;:::o;4542:448::-;4692:225;;;;;;;;4747:9;-1:-1:-1;;;;;4692:225:53;;;;;;4805:9;4692:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4682:235:53;;-1:-1:-1;;;;;;4682:235:53;;;;;;;;-1:-1:-1;4682:235:53;;-1:-1:-1;;;;;;4682:235:53;;;;-1:-1:-1;;;4682:235:53;;;;;;;-1:-1:-1;;;;4682:235:53;-1:-1:-1;;;4682:235:53;;;;;;;;;;;;;;;;;;;;;;;;4928:55;;-1:-1:-1;;;4928:55:53;;:11;:22;;;;;;:55;;4960:12;;4974:8;;4928:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4542:448;;;;;:::o;2689:76::-;2739:19;;-1:-1:-1;;;2739:19:53;;;;;14472:25:57;;;2739:3:53;-1:-1:-1;;;;;2739:12:53;;;;14445:18:57;;2739:19:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2771:105;2842:27;;-1:-1:-1;;;2842:27:53;;-1:-1:-1;;;;;7772:32:57;;;2842:27:53;;;7754:51:57;7821:18;;;7814:34;;;2842:3:53;:8;;;;7727:18:57;;2842:27:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1138:69;1180:27;1586:10:40;1206:1:53;1180:27;:::i;741:4141:25:-;823:14;1212:5;;;823:14;-1:-1:-1;;1216:1:25;1212;1400:20;1473:5;1469:2;1466:13;1458:5;1454:2;1450:14;1446:34;1437:43;;;1633:5;1619:11;:19;1611:28;;;;;;1720:5;1729:1;1720:10;1716:177;;-1:-1:-1;1807:23:25;;;;-1:-1:-1;1865:13:25;;1716:177;2193:17;2293:11;2290:1;2287;2280:25;2701:12;2717:15;;;2716:31;;2869:22;;;;;3776:1;3757;:15;;3756:21;;4019:17;;;4015:21;;4008:28;4081:17;;;4077:21;;4070:28;4144:17;;;4140:21;;4133:28;4207:17;;;4203:21;;4196:28;4270:17;;;4266:21;;4259:28;4334:17;;;4330:21;;;4323:28;3313:12;;;;3309:23;;;3334:1;3305:31;2454:20;;;2443:32;;;3372:12;;;;2501:21;;;;3029:16;;;;3363:21;;;;4827:11;;;;;-1:-1:-1;;741:4141:25;;;;;;:::o;11602:1078:36:-;11753:15;-1:-1:-1;;;;;10731:50:36;;;10679;;;10675:107;10862:3;10858:14;;;11112:15;;;11102:26;-1:-1:-1;;;;;;;;12020:50:36;;12476:51;12020:50;11102:26;348:27:24;12476:15:36;:51::i;:::-;12466:61;;12655:7;12651:1;12637:11;12626:9;12614:10;12607:42;12604:49;12600:63;12591:7;12587:77;12576:88;;12562:112;;;11602:1078;;;;;;:::o;9411:1050::-;9562:7;9629:13;-1:-1:-1;;;;;9613:29:36;:13;-1:-1:-1;;;;;9613:29:36;;9609:98;;;9678:13;;9693;9609:98;-1:-1:-1;;;;;9853:13:36;9849:62;9839:205;;9945:10;9942:1;9935:21;10021:4;10015;10008:18;9839:205;-1:-1:-1;;;;;;;308:2:24;10093:45:36;;;;-1:-1:-1;;;;;10173:29:36;;;10152:50;10224:7;:220;;10431:13;-1:-1:-1;;;;;10374:70:36;:54;10390:10;10402;10414:13;-1:-1:-1;;;;;10374:54:36;:15;:54::i;:::-;:70;;;;;:::i;:::-;;10224:220;;;10250:105;10275:64;10301:10;10313;10325:13;-1:-1:-1;;;;;10275:64:36;:25;:64::i;:::-;10341:13;-1:-1:-1;;;;;10250:105:36;656:9:42;;;670;;667:16;;652:32;;491:223;10250:105:36;10217:227;;;;9411:1050;;;;;;;:::o;5164:296:25:-;5256:14;5315:25;5322:1;5325;5328:11;5315:6;:25::i;:::-;5306:34;;5371:11;5358:25;;;;;:::i;:::-;5368:1;5365;5358:25;:30;5354:90;;5416:8;;:12;5408:21;;;;;6473:909:36;6627:7;-1:-1:-1;;;;;6900:9:36;6896:50;6889:58;-1:-1:-1;;;;;6817:8:36;6813:57;6806:65;6786:175;6783:309;;;6990:10;6987:1;6980:21;7073:4;7067;7060:18;6783:309;7185:10;:190;;7299:76;7339:8;7349:9;7360:8;7370:4;7299:39;:76::i;:::-;7185:190;;;7210:74;7248:8;7258:9;7269:8;7279:4;7210:37;:74::i;:::-;7178:197;6473:909;-1:-1:-1;;;;;6473:909:36:o;7951:::-;8107:7;-1:-1:-1;;;;;8380:9:36;8376:50;8369:58;-1:-1:-1;;;;;8297:8:36;8293:57;8286:65;8266:175;8263:309;;;8470:10;8467:1;8460:21;8553:4;8547;8540:18;8263:309;8659:10;:194;;8777:76;8815:8;8825:9;8836;8847:5;8777:37;:76::i;8659:194::-;8684:78;8724:8;8734:9;8745;8756:5;4451:1450;4610:7;4791:3;4787:1108;;;4810:16;-1:-1:-1;;;;;4847:27:36;;;:172;;4967:52;4983:6;-1:-1:-1;;;5009:9:36;-1:-1:-1;;;;;4967:52:36;:15;:52::i;:::-;4847:172;;;4897:47;-1:-1:-1;;;;;4897:47:36;;308:2:24;4898:33:36;;;4897:47;:::i;:::-;4810:223;-1:-1:-1;5055:42:36;5056:28;4810:223;-1:-1:-1;;;;;5056:17:36;;:28;:::i;:::-;5055:40;:42::i;:::-;5048:49;;;;;4787:1108;5128:16;-1:-1:-1;;;;;5165:27:36;;;:205;;5308:62;5334:6;-1:-1:-1;;;5360:9:36;-1:-1:-1;;;;;5308:62:36;:25;:62::i;:::-;5165:205;;;5215:70;308:2:24;5240:33:36;;;-1:-1:-1;;;;;5215:70:36;;656:9:42;;;670;;667:16;;652:32;;491:223;5215:70:36;5128:256;;5596:8;-1:-1:-1;;;;;5541:8:36;5537:57;5534:71;5524:220;;5639:10;5636:1;5629:21;5721:4;5715;5708:18;5524:220;-1:-1:-1;;;;;5850:19:36;;;;-1:-1:-1;5835:35:36;;1548:2065;1705:7;1844:6;1854:1;1844:11;1840:32;;-1:-1:-1;1864:8:36;1857:15;;1840:32;-1:-1:-1;;;;;;;308:2:24;1903:45:36;;;;1959:1648;;;;-1:-1:-1;;;;;2028:17:36;;;;;;:6;:17;:6;2067:16;;;;:::i;:::-;;:28;2063:345;;2141:20;;;2187:25;;;2183:207;;2306:60;2332:10;2344:8;-1:-1:-1;;;;;2306:60:36;2354:11;2306:25;:60::i;:::-;2291:76;;;;;;;2183:207;2097:311;2063:345;-1:-1:-1;2501:70:36;2526:10;2564:6;2539:21;-1:-1:-1;;;;;2539:21:36;;2526:10;2539:21;:::i;:::-;2538:32;;;;:::i;:::-;656:9:42;;;670;;667:16;;652:32;;491:223;1959:1648:36;-1:-1:-1;;;;;2649:17:36;;;;;;3082:20;;;3079:83;3192:23;;;3046:195;3011:397;;3300:10;3297:1;3290:21;3381:4;3375;3368:18;3011:397;3465:20;;;3510:72;:60;3465:10;-1:-1:-1;;;;;3510:60:36;;3465:20;3510:25;:60::i;473:155:35:-;559:1;-1:-1:-1;;;;;575:6:35;;;;571:50;;583:38;-1:-1:-1;;;583:36:35;:38::i;:::-;473:155;;;:::o;606:163:22:-;716:8;713:1;706:19;748:4;745:1;738:15;1231:118:57;1318:5;1315:1;1304:20;1297:5;1294:31;1284:59;;1339:1;1336;1329:12;1284:59;1231:118;:::o;1354:499::-;1426:6;1434;1442;1495:2;1483:9;1474:7;1470:23;1466:32;1463:52;;;1511:1;1508;1501:12;1463:52;1556:23;;;-1:-1:-1;1655:2:57;1640:18;;1627:32;1668:31;1627:32;1668:31;:::i;:::-;1718:7;-1:-1:-1;1777:2:57;1762:18;;1749:32;1790:31;1749:32;1790:31;:::i;:::-;1840:7;1830:17;;;1354:499;;;;;:::o;1858:131::-;-1:-1:-1;;;;;1933:31:57;;1923:42;;1913:70;;1979:1;1976;1969:12;1994:119;2079:8;2072:5;2068:20;2061:5;2058:31;2048:59;;2103:1;2100;2093:12;2118:845;2211:6;2219;2227;2235;2243;2296:3;2284:9;2275:7;2271:23;2267:33;2264:53;;;2313:1;2310;2303:12;2264:53;2352:9;2339:23;2371:31;2396:5;2371:31;:::i;:::-;2421:5;-1:-1:-1;2478:2:57;2463:18;;2450:32;2491:33;2450:32;2491:33;:::i;:::-;2543:7;-1:-1:-1;2602:2:57;2587:18;;2574:32;-1:-1:-1;;;;;2637:48:57;;2625:61;;2615:89;;2700:1;2697;2690:12;2615:89;2723:7;-1:-1:-1;2803:2:57;2788:18;;2775:32;;-1:-1:-1;2885:3:57;2870:19;;2857:33;2899:32;2857:33;2899:32;:::i;:::-;2950:7;2940:17;;;2118:845;;;;;;;;:::o;4243:127::-;4304:10;4299:3;4295:20;4292:1;4285:31;4335:4;4332:1;4325:15;4359:4;4356:1;4349:15;4375:1513;4491:6;4499;4507;4515;4523;4576:3;4564:9;4555:7;4551:23;4547:33;4544:53;;;4593:1;4590;4583:12;4544:53;4632:9;4619:23;4651:30;4675:5;4651:30;:::i;:::-;4700:5;-1:-1:-1;4757:2:57;4742:18;;4729:32;4770:31;4729:32;4770:31;:::i;:::-;4820:7;-1:-1:-1;4879:2:57;4864:18;;4851:32;4892:33;4851:32;4892:33;:::i;:::-;4944:7;-1:-1:-1;5003:2:57;4988:18;;4975:32;5016:33;4975:32;5016:33;:::i;:::-;5068:7;-1:-1:-1;5126:3:57;5111:19;;5098:33;5154:18;5143:30;;5140:50;;;5186:1;5183;5176:12;5140:50;5209:22;;5262:4;5254:13;;5250:27;-1:-1:-1;5240:55:57;;5291:1;5288;5281:12;5240:55;5331:2;5318:16;5357:18;5349:6;5346:30;5343:56;;;5379:18;;:::i;:::-;5428:2;5422:9;5520:2;5482:17;;-1:-1:-1;;5478:31:57;;;5511:2;5474:40;5470:54;5458:67;;5555:18;5540:34;;5576:22;;;5537:62;5534:88;;;5602:18;;:::i;:::-;5638:2;5631:22;5662;;;5703:15;;;5720:2;5699:24;5696:37;-1:-1:-1;5693:57:57;;;5746:1;5743;5736:12;5693:57;5802:6;5797:2;5793;5789:11;5784:2;5776:6;5772:15;5759:50;5855:1;5850:2;5841:6;5833;5829:19;5825:28;5818:39;5876:6;5866:16;;;;;4375:1513;;;;;;;;:::o;5893:226::-;5952:6;6005:2;5993:9;5984:7;5980:23;5976:32;5973:52;;;6021:1;6018;6011:12;5973:52;-1:-1:-1;6066:23:57;;5893:226;-1:-1:-1;5893:226:57:o;6124:367::-;6192:6;6200;6253:2;6241:9;6232:7;6228:23;6224:32;6221:52;;;6269:1;6266;6259:12;6221:52;6308:9;6295:23;6327:31;6352:5;6327:31;:::i;:::-;6377:5;6455:2;6440:18;;;;6427:32;;-1:-1:-1;;;6124:367:57:o;6496:555::-;6581:12;;-1:-1:-1;;;;;6577:38:57;;;6565:51;;6612:1;6648:16;;6642:23;6697:35;;;6690:4;6681:14;;6674:59;6603:3;6769:19;;;6790:8;6765:34;6758:4;6749:14;;6742:58;6850:3;6846:19;6843:1;6832:34;;;6825:4;6816:14;;6809:58;6892:13;;;6886:20;6951:28;7004:4;6995:14;;;6988:57;6496:555::o;7056:254::-;7239:3;7224:19;;7252:52;7228:9;7286:6;7252:52;:::i;:::-;7056:254;;;;:::o;7315:212::-;7413:6;7466:2;7454:9;7445:7;7441:23;7437:32;7434:52;;;7482:1;7479;7472:12;7434:52;-1:-1:-1;7505:16:57;;7315:212;-1:-1:-1;7315:212:57:o;7859:646::-;7952:6;7960;7968;7976;8029:3;8017:9;8008:7;8004:23;8000:33;7997:53;;;8046:1;8043;8036:12;7997:53;8078:9;8072:16;8097:31;8122:5;8097:31;:::i;:::-;8197:2;8182:18;;8176:25;8147:5;;-1:-1:-1;8210:31:57;8176:25;8210:31;:::i;:::-;8312:2;8297:18;;8291:25;8260:7;;-1:-1:-1;8325:32:57;8291:25;8325:32;:::i;:::-;8428:2;8413:18;;8407:25;8376:7;;-1:-1:-1;8441:32:57;8407:25;8441:32;:::i;:::-;7859:646;;;;-1:-1:-1;7859:646:57;;-1:-1:-1;;7859:646:57:o;8978:277::-;9045:6;9098:2;9086:9;9077:7;9073:23;9069:32;9066:52;;;9114:1;9111;9104:12;9066:52;9146:9;9140:16;9199:5;9192:13;9185:21;9178:5;9175:32;9165:60;;9221:1;9218;9211:12;10682:807;11048:52;11090:9;11082:6;11048:52;:::i;:::-;11151:13;;11148:1;11137:28;;;11131:3;11116:19;;11109:57;11235:4;11223:17;;11217:24;11203:39;;11197:3;11182:19;;11175:68;11298:4;11286:17;;11280:24;11274:3;11259:19;;11252:53;11360:4;11348:17;;;11342:24;11336:3;11321:19;;11314:53;11404:3;11398;11383:19;;11376:32;;;-1:-1:-1;11424:19:57;;;11417:30;11479:3;11464:19;;10682:807;-1:-1:-1;10682:807:57:o;11717:127::-;11778:10;11773:3;11769:20;11766:1;11759:31;11809:4;11806:1;11799:15;11833:4;11830:1;11823:15;11849:168;11922:9;;;11953;;11970:15;;;11964:22;;11950:37;11940:71;;11991:18;;:::i;12022:198::-;-1:-1:-1;;;;;12122:27:57;;;12093;;;12089:61;;12162:29;;12159:55;;;12194:18;;:::i;12225:195::-;-1:-1:-1;;;;;12294:27:57;;;12323;;;12290:61;;12363:28;;12360:54;;;12394:18;;:::i;12425:970::-;12859:52;12901:9;12893:6;12859:52;:::i;:::-;12962:13;;12955:21;12948:29;12942:3;12927:19;;12920:58;13033:4;13021:17;;;13015:24;13009:3;12994:19;;12987:53;13099:4;13087:17;;;13081:24;-1:-1:-1;;;;;13077:50:57;13071:3;13056:19;;13049:79;13179:13;;13172:21;13165:29;13159:3;13144:19;;13137:58;13252:17;;13246:24;13239:32;13232:40;13226:3;13211:19;;13204:69;13310:3;13304;13289:19;;13282:32;;;-1:-1:-1;13330:19:57;;;13323:30;13385:3;13370:19;;12425:970;-1:-1:-1;12425:970:57:o;13400:669::-;13634:52;13676:9;13668:6;13634:52;:::i;:::-;13752:1;13748;13743:3;13739:11;13735:19;13727:6;13723:32;13717:3;13706:9;13702:19;13695:61;13793:3;13787;13776:9;13772:19;13765:32;13615:4;13826:6;13820:13;13870:6;13864:3;13853:9;13849:19;13842:35;13932:6;13925:4;13917:6;13913:17;13907:3;13896:9;13892:19;13886:53;13989:1;13983:3;13974:6;13963:9;13959:22;13955:32;13948:43;14059:3;14052:2;14048:7;14043:2;14035:6;14031:15;14027:29;14016:9;14012:45;14008:55;14000:63;;;13400:669;;;;;;:::o;14074:247::-;14142:6;14195:2;14183:9;14174:7;14170:23;14166:32;14163:52;;;14211:1;14208;14201:12;14163:52;14243:9;14237:16;14262:29;14285:5;14262:29;:::i;14508:127::-;14569:10;14564:3;14560:20;14557:1;14550:31;14600:4;14597:1;14590:15;14624:4;14621:1;14614:15;14640:217;14680:1;14706;14696:132;;14750:10;14745:3;14741:20;14738:1;14731:31;14785:4;14782:1;14775:15;14813:4;14810:1;14803:15;14696:132;-1:-1:-1;14842:9:57;;14640:217::o;14862:125::-;14927:9;;;14948:10;;;14945:36;;;14961:18;;:::i","linkReferences":{},"immutableReferences":{"11591":[{"start":771,"length":32},{"start":1038,"length":32},{"start":3395,"length":32},{"start":4618,"length":32}],"11594":[{"start":1817,"length":32},{"start":2069,"length":32},{"start":2361,"length":32}],"11597":[{"start":2863,"length":32},{"start":3115,"length":32},{"start":3969,"length":32},{"start":4218,"length":32}],"11600":[{"start":1085,"length":32},{"start":3735,"length":32},{"start":4769,"length":32},{"start":4898,"length":32}],"11603":[{"start":730,"length":32},{"start":1303,"length":32},{"start":3348,"length":32},{"start":3428,"length":32}],"11606":[{"start":1381,"length":32},{"start":1864,"length":32},{"start":2910,"length":32},{"start":4396,"length":32}],"11609":[{"start":1604,"length":32},{"start":2116,"length":32},{"start":3162,"length":32},{"start":4443,"length":32}]}},"methodIdentifiers":{"MAX_PRICE_LIMIT()":"542524dd","MIN_PRICE_LIMIT()":"c7b8e15d","addLiquidity(int256,int24,int24)":"06ba06fa","computeSwapStep(uint160,uint160,uint128,int256,uint24)":"100d3f74","constructSignal()":"01480703","equalizePrice()":"34d9900a","poolKey()":"182148ef","setPool(uint24,int24,address,uint160,bytes)":"6af57741","setPrice(uint256)":"91b7f5ed","swapOnLex(address,uint256)":"96f5e27c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"MAX_PRICE_LIMIT\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_PRICE_LIMIT\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"name\":\"addLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint160\",\"name\":\"sqrtPriceCurrentX96\",\"type\":\"uint160\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceTargetX96\",\"type\":\"uint160\"},{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"internalType\":\"int256\",\"name\":\"amountRemaining\",\"type\":\"int256\"},{\"internalType\":\"uint24\",\"name\":\"feePips\",\"type\":\"uint24\"}],\"name\":\"computeSwapStep\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"sqrtPriceNextX96\",\"type\":\"uint160\"},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"constructSignal\",\"outputs\":[{\"components\":[{\"internalType\":\"int24\",\"name\":\"currentTick\",\"type\":\"int24\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lexPrice\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"pool\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"fetcher\",\"type\":\"address\"}],\"internalType\":\"struct ArenaController.Signal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"equalizePrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolKey\",\"outputs\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint24\",\"name\":\"poolFee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"bytes\",\"name\":\"hookData\",\"type\":\"bytes\"}],\"name\":\"setPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"setPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenIn\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\"}],\"name\":\"swapOnLex\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ArenaController.sol\":\"ArenaController\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/=lib/v4-core/node_modules/@ensdomains/\",\":@openzeppelin/=lib/v4-core/lib/openzeppelin-contracts/\",\":@openzeppelin/contracts/=lib/v4-core/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/solmate/lib/ds-test/src/\",\":erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-gas-snapshot/=lib/v4-core/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=lib/v4-core/node_modules/hardhat/\",\":openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/\",\":solmate/=lib/solmate/src/\",\":v4-core/=lib/v4-core/src/\"]},\"sources\":{\"lib/solmate/src/auth/Owned.sol\":{\"keccak256\":\"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://1ff52bbee698b9cf9e4574615e6550be0887ccf355f6571e23d6f25b332e79b4\",\"dweb:/ipfs/QmVorA2apojVRStzS7h8aFccR3Uv32G6HVtBtFHZrE7YXx\"]},\"lib/solmate/src/tokens/ERC20.sol\":{\"keccak256\":\"0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35\",\"dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x1b62af9baf5b8e991ed7531bc87f45550ba9d61e8dbff5caf237ccaf3a3fd843\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b7b38b977c5305b18ceefbeed4c9ceaaaefa419b520de62de6604ea661f8c0a9\",\"dweb:/ipfs/QmecMRzgfMyDVa2pvBqMMDLYBappaj7Aa3qcMoQYEQrhWi\"]},\"lib/v4-core/src/ERC6909.sol\":{\"keccak256\":\"0x22476a1c183be1b547a509b3e6906abaccb6408375f798fce805ff7877aca09f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e85580e1563ea0556705132fb6bd038ca4aa355749039923853ebcb76b7c84e6\",\"dweb:/ipfs/QmVoxPrbagRKpFdRWoaCSKmStYLZrhNFuedcuyGycSGR7q\"]},\"lib/v4-core/src/ERC6909Claims.sol\":{\"keccak256\":\"0xf496ef3a5a9bf4f4aa2eec951dbeff09a01ef058bb9f64b1664cf46c9e85cd49\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2a0a97c359a7a4c526ba9fc4ceb20af8050f9cf7886ea7e1f38c9c10b4a3750c\",\"dweb:/ipfs/QmPy6pCQbvzCdJRqG1thHRSwEZoLBAaLo3KQnueL3wxb8i\"]},\"lib/v4-core/src/Extsload.sol\":{\"keccak256\":\"0x784074bd04a1541c7c6ace074e30245746133fd37c3ba16b025dce394db986ce\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35f1f4fb306bf01e98b7eca012b85f3ab978b39fa5136193363e2519c4435e51\",\"dweb:/ipfs/QmeGrjGMt71dJymVhkEadh5CuCW5GxRqNEZLi5AJxvC5tU\"]},\"lib/v4-core/src/Exttload.sol\":{\"keccak256\":\"0x769ee2733a08112c652274f4b972c45fb56cc46109f233b9a30f81561b15dd54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dd19e88d50ae77c1ed5581baca1c75b3fb828d0b58cded90188d55c4e336266c\",\"dweb:/ipfs/Qmc8YM6Tfpwwa4qivHHzRxNdhZzdzGiD7VexWsDvkaQTxG\"]},\"lib/v4-core/src/NoDelegateCall.sol\":{\"keccak256\":\"0x5c238701785d16c58a1598daec0f72a2aaf47d5d017b9dd7441cc8093b65b202\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://696cf79b74bc38e7316d94dfd8bdd9579a94f74121e9b65d2613eb59c106ea50\",\"dweb:/ipfs/QmRttHmshQJ5E7EGaeBC7yT4wyzthNXZQJn7sy2nJvb4dB\"]},\"lib/v4-core/src/PoolManager.sol\":{\"keccak256\":\"0xca5369a1683d06842268987fb6f46b05e6364a46cc856f72bb5c603826f47eac\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5ae5893222abc5dc5fa57bc05af40b60a96a1537bd3c1f3845257d6a3c2b5821\",\"dweb:/ipfs/QmZxQH8M3NVunurxDNJ5EZm2fy6Ws8CHJSezCQaoqzMPoq\"]},\"lib/v4-core/src/ProtocolFees.sol\":{\"keccak256\":\"0x2e7533e46dcab5508ed417ab33c2d0ca8c52a6b5f445dd90daf328173ada4449\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8403de6f2c89a665a3ff3566a917179a5bfb3e0ac9514f0438d82270a7f98c91\",\"dweb:/ipfs/QmTq9cjKTaXeCoSfCywpFwo7sNvuXM4wSMnebwX3hBuiRG\"]},\"lib/v4-core/src/interfaces/IExtsload.sol\":{\"keccak256\":\"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1\",\"dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN\"]},\"lib/v4-core/src/interfaces/IExttload.sol\":{\"keccak256\":\"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8\",\"dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY\"]},\"lib/v4-core/src/interfaces/IHooks.sol\":{\"keccak256\":\"0xdbaf1db938b70f77eb4ddbad5b8d2a1fc648c7d65ca2a312aba16cc013c85df0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ad2d9c85116a2e51281dd40577c798d6d5968be1f8908f43ba152849809deaa\",\"dweb:/ipfs/QmZP4kk9KJzoxv81EgsTfHnJeU8YUxX3yWZudJHbxQjpa8\"]},\"lib/v4-core/src/interfaces/IPoolManager.sol\":{\"keccak256\":\"0x4e07d93993f6ba033c8b5e5b0a3473659aeffe9af0cf8316a879a55ebd696d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://50add8378d59b89b1dc106ea248641caaedd3ac45d62754babe55c526b87c9ad\",\"dweb:/ipfs/QmQUrvy8ZDDdTRTr17msqynVECP3rQFBVBUmFcpFvjAmQx\"]},\"lib/v4-core/src/interfaces/IProtocolFeeController.sol\":{\"keccak256\":\"0xc2d7f3605da9767e36cf25d4d4fa9b95663a6659e26ce28cf29b8b88acb79a4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c7a43cda35b8a9254ed3e46cfd8649361f09121d17ef554bd3d190b9a8d57cc6\",\"dweb:/ipfs/QmRBDQoqCWddH5hY1JdxMyYtY8jMZhWAwtuFJBc3r8V31G\"]},\"lib/v4-core/src/interfaces/IProtocolFees.sol\":{\"keccak256\":\"0x68700020df618c5715737e57630876ec22ccde2d31191a5608babb9f140ed297\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://56b7bb6786f48fff8c9d04e9054955b8cf3d9f5bf819ccda7be192ad2004a27f\",\"dweb:/ipfs/QmZKmUvcYnyihEFySD6SY9osMkP8M1Y7a4kPxLQycEyThw\"]},\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":{\"keccak256\":\"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b\",\"dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK\"]},\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":{\"keccak256\":\"0xc1c23330c1511ecfd45c67a683962b4e2555b82f1dacd40cc8b46ae5a6e250e7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5ce10b7970482a65f9e9a365b810eeb154a5d4a8229a26653028d84b9622a410\",\"dweb:/ipfs/QmTSwXxZ2FTkM5duBZgbpFs8SRVDR5NPAnW4YimeDhb1s8\"]},\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":{\"keccak256\":\"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f\",\"dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK\"]},\"lib/v4-core/src/libraries/BitMath.sol\":{\"keccak256\":\"0x59e18adcff8917b0965a240d88b34d5d800e0efebd5f40c5594ddcf28a15949b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d358beebf8d5079520b6e138d744e5063ecbfbeae355c08af86a3b74afa71b09\",\"dweb:/ipfs/QmUXmAK9aoxnaeykq8MLXoRKP8yGTDyY3jPFMwHnqRxf46\"]},\"lib/v4-core/src/libraries/CurrencyDelta.sol\":{\"keccak256\":\"0xb1eb18c3794b67f4f710229df279d3a630a963194fbbeb51906198ec7145b98e\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://e5ea08b69754250cf04cc544785320f5c8fd8b9a65e5d9e0bc44aadadaa9ea0c\",\"dweb:/ipfs/QmWW1qfqGydoiSeDtVVQ53nV3FphuUgH1PFUC3uGaWzxWR\"]},\"lib/v4-core/src/libraries/CurrencyReserves.sol\":{\"keccak256\":\"0xdeffc5cf2f8f7d3f802998941061392c0c926a32c7105ffd9f902ab84d3a31c6\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://869bd659c5593bc525ce4d44771d85eb8acb74a7f0492802bdcc79d2bfdfcaf7\",\"dweb:/ipfs/QmSrTWzUHrou7ZxcuFXQhvzXmEgbLeCtwAqeS6k9vD22h3\"]},\"lib/v4-core/src/libraries/CustomRevert.sol\":{\"keccak256\":\"0x70a444afeb27564398dbdf7553651ee2cae14c03c923b6f8972040c8f460ebe3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d7b05390bac9b29188725c8a84edac43cd05571da27b33a0b1e36d9500ecaa6\",\"dweb:/ipfs/QmdYDLwTfFgePDEwFMUqGTj8SNNXXq4JQJnrgomJgcZFvP\"]},\"lib/v4-core/src/libraries/FixedPoint128.sol\":{\"keccak256\":\"0xc7e80dc41f28887d0d915a75c0b2783ae659e5384dd1a3ed1251a42e058d8835\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2df62bf1d9d4349236fd0bc7a96b3a3be95f4c049603e4a20c8473cca9402b4d\",\"dweb:/ipfs/QmVR5dmMkoypmhaBeBj8cGegHpJycbofUDg59dHm42i9MT\"]},\"lib/v4-core/src/libraries/FixedPoint96.sol\":{\"keccak256\":\"0xf0a545fc5bbc271e8dbd191413dc03e8725d1f003df4d9d36ea7cdb73058c417\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5d1013d8b5c93024526f129b0a9271b35c578da09bcfe6c3240ff4d590ebc196\",\"dweb:/ipfs/QmX1GyF9jJhYGXst6PyK6HJvcfVQ69nNTnuBEBaEiAZPv7\"]},\"lib/v4-core/src/libraries/FullMath.sol\":{\"keccak256\":\"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52\",\"dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC\"]},\"lib/v4-core/src/libraries/Hooks.sol\":{\"keccak256\":\"0xfa031f4efc096e9c93bb094509321e1c08b5eb271f46554f858e74803c43ae66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7cc33d5eb869ecacfb70d024f7b925d191d98553dbb921bd8188f97d51c9e111\",\"dweb:/ipfs/Qme5VCnaS5mXyqaWV5uiW5xcmTb56uCKBPFrLZp2dq41dQ\"]},\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":{\"keccak256\":\"0xfbebd6766871b795d945a74b6110931f73fc775aeeecc2682d6d6ca841a01ece\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://36fcc7098454971ae16d790ee9aee227c22c5cbbd7ff6e27e58ac29b901d5896\",\"dweb:/ipfs/QmboCGTWtycGpda7E169pD67Fox2H9b1YRsNHcsxBRrhfo\"]},\"lib/v4-core/src/libraries/LiquidityMath.sol\":{\"keccak256\":\"0x4a04b9383e2fb943c2c3ae7d0c9071b58dd97b6dac0a409fe1c79c3ca897bbcf\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0b33cf0ff936f62aa7f3b82922fa0ac52ac24471561e87fbf7ab8372607f6dfc\",\"dweb:/ipfs/Qmcr6omwzJjQPu6HQ8E9vFXaTgrtqfb2KbfxbuQavfUzFa\"]},\"lib/v4-core/src/libraries/Lock.sol\":{\"keccak256\":\"0x9338be4b5695f1da5f3d3f7a3eeaf7a356c1045458289586ac0cbe9cef77c6d5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://485ec42ed6155469d612a9a0c18068ebfbad74448792a338a435503de3ef1b2c\",\"dweb:/ipfs/QmVnnv5u74MYatfRmBgrcfFYQcsMAJMG9jQ6ju8UiydKNF\"]},\"lib/v4-core/src/libraries/NonZeroDeltaCount.sol\":{\"keccak256\":\"0x6b7e23f470b8352efdbf459a34dd0dcfdbe03e623cb4de67f4ad9be326691586\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b86af075e2331f7a065b15d91253f2ce6b845dfe09493338f2d7cdab6f9e4cc2\",\"dweb:/ipfs/QmdzHJQapqAS42rMrYPgdvb4Sae7NVy3ESkNc1TuBRcxUC\"]},\"lib/v4-core/src/libraries/ParseBytes.sol\":{\"keccak256\":\"0xf0795198d1e651b0b33fd1708d80a14f501bb2a1486905676d35f364e880f579\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5aea527fcec51d7274f0c189dc2479a6aa708fc91857187a4d7db46bb1d6c7a8\",\"dweb:/ipfs/QmUTrwTPSZ7EHBaTyfAA78rZVP17iQzmAmvDcQ8GhDRAEf\"]},\"lib/v4-core/src/libraries/Pool.sol\":{\"keccak256\":\"0x7a506727ae59f5b5487a0a16ec1d7038b7c2a4ee5f4a7fa7c444ec7df6ad5a7c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://befdd15aee06a7b2a3c64cb899220ec03a1ae8470ad17e19050bcca1ac5266a8\",\"dweb:/ipfs/QmWPfBgfp5VKnku9ZtKXwYycyKdAZuCj6778T2HFrfQ61H\"]},\"lib/v4-core/src/libraries/Position.sol\":{\"keccak256\":\"0x0309a650890f1cd93e2b4b1e9a40032d5feb8c6a0ccc24be24373bfd7590ff80\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://63aae574b22048f1453da8f9142374e334683bb3a069c2312f73e6b857842bce\",\"dweb:/ipfs/QmcJZK3kU4jsWfJKBpRq2kaouutEDHcytgMX8ZaGeBsbgu\"]},\"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol\":{\"keccak256\":\"0x2739e8f54707c6a0e23f9c61a0783dd18b107c3fc287b2827f1ab4b41f891902\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2e3b154410bbfcbe8808c6dfb74c4bbbac50a59e228cee59b34e169dbd34ee1a\",\"dweb:/ipfs/QmcRoM6T2F7FTHtGdD5aRiVthCon8oiWur661GCrk5FejP\"]},\"lib/v4-core/src/libraries/SafeCast.sol\":{\"keccak256\":\"0xbccc4f8d5d467d162d7f0ab5a7f22bcccf05ae07577b9728c9e3030c63977e60\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0003ea7a515ba709a3fdeaa19e7930c1f883b3b4fbdbf389d4f2f85b25eb72b4\",\"dweb:/ipfs/QmYs8uNcYRGuGUbeBfF27fhArNaQ5Y9iMCTMfgic5d39fM\"]},\"lib/v4-core/src/libraries/SqrtPriceMath.sol\":{\"keccak256\":\"0x1a5a8fd4a21cec19c0c253201e9b5534e8d810eb132bceee04af37fd78adb5db\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://afa2a5950c9057fd3c00a6f413fba91c4c7dab06d573f7349aaf8f806c0e1f31\",\"dweb:/ipfs/Qmb2m62xAPRBtxtx3sV7MAFw2vHWNm9m49ctPHmFX5hozt\"]},\"lib/v4-core/src/libraries/StateLibrary.sol\":{\"keccak256\":\"0x67ead4d1ffe7e4fc381cef059c8d4941c7b4d581ef043fc8d3278d0829da414e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0d12edd46a3ff2e19ea9b650507ea22e7714daa335a6b40f4d2f6d29c16431e4\",\"dweb:/ipfs/QmZn6dzXZgR3rGohZAvKzqYMgm5n9qTrpi1VhXizYhiquH\"]},\"lib/v4-core/src/libraries/SwapMath.sol\":{\"keccak256\":\"0xa8cedd0f63b2d8b6faac60455f499c79816f53fbd86f3bb0706fae426b2c231e\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8d926c2df899b21811862d106d5e1d2b5bdf83c76ae6ff4216e7c9ce443d8e75\",\"dweb:/ipfs/QmTTVSCumUXZ4vf3R1GwfqJSTgLFyjueuxZkRH9U6dsTb3\"]},\"lib/v4-core/src/libraries/TickBitmap.sol\":{\"keccak256\":\"0x23abd96aa808657304affd775666d7cc5fb0ab564f87d1b65fbf8dc5877d9cd6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4c7686aefb704a3efe97cc0e8f180ed48f7667f5ae69d3754962f04352c66b79\",\"dweb:/ipfs/QmULiCBW9s2hB6SmnJTi2wiAwgkLXpZJcdVZm9f77zDNuc\"]},\"lib/v4-core/src/libraries/TickMath.sol\":{\"keccak256\":\"0x64c668177d82bb185d902fb2190630ccb67babb6439422979692ac2f8dfb6dcd\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e2714a025df18c22f20b358b7143e8a5c55cffb20c7de292be0376845a5f0408\",\"dweb:/ipfs/QmWaeCkxwkVuReFUSK2nDat1BB5DJ8BUowwGwmVyKpsrME\"]},\"lib/v4-core/src/libraries/TransientStateLibrary.sol\":{\"keccak256\":\"0x1bc28f30c176c7c598522da0d8907a90c4cd8ecce81775bb4deb3a9b78782f86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb5c05fb51e59ef168ba884c4ea3627525dba9feea0de9ffa0587438f70fd095\",\"dweb:/ipfs/Qmbx3ntPDZ9VeGsAnVNSM5DKmhPg92yobh5ZHbvdGWtHUd\"]},\"lib/v4-core/src/libraries/UnsafeMath.sol\":{\"keccak256\":\"0xe9b87da934af38419d4b5f20cc09943dbb569425448fc23fdc5ec6aebbb63c84\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://29838c28905c34f9602a453759b55f5acc6aff02bf6d7a6afac5d1a245dd5db3\",\"dweb:/ipfs/QmfN5bhLFw1CsnnaJQNZd3bLpLufQcwt9ztaR71LA43UGY\"]},\"lib/v4-core/src/test/PoolModifyLiquidityTest.sol\":{\"keccak256\":\"0x4578759af55db566eee1d19c19a285710b1d301b511e37df4a1072c2d5a47ade\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://aa6588f1f695efe625241fdbad07730611c8bec77d963698c6412775b7dd68a7\",\"dweb:/ipfs/QmeDGAKa9sR6Wk5ibyzt4YGa6tdtjmFPzJafMbBgkWRB9d\"]},\"lib/v4-core/src/test/PoolSwapTest.sol\":{\"keccak256\":\"0x389d2274a70c565c12c8fd7f0f5bdbee7532d842936243141c65cf1477c1a7e8\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cdaff983aa947444cece280d8485f524a778cf8843c3f8b96f60e4ad137aa8d3\",\"dweb:/ipfs/QmP7qbC3UZz723pTWuJh18qap1vYAHDY5UoJwGtvosWs9k\"]},\"lib/v4-core/src/test/PoolTestBase.sol\":{\"keccak256\":\"0x71db5a5215d858124dd2ccf73c4474421651f248e4c85d33455d95abced0a23c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://fac0df901621d44a1b98ce4569616940ca6700e7829357bdf18509237b822072\",\"dweb:/ipfs/Qmf9sWokQvzmKfAY6Vd4QzyTyhikqCb8zUowrFPe9DRxs5\"]},\"lib/v4-core/src/types/BalanceDelta.sol\":{\"keccak256\":\"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9\",\"dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H\"]},\"lib/v4-core/src/types/BeforeSwapDelta.sol\":{\"keccak256\":\"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782\",\"dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K\"]},\"lib/v4-core/src/types/Currency.sol\":{\"keccak256\":\"0xc77e2d4d380be1887078b1d21e2381fe4e9138dce8c7efbf9050aa7d65d75d4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b85a1edba4be624be660d69badac1e3641d83190893839fa30260eef316d00c8\",\"dweb:/ipfs/QmPaEaeNkhy5F4X9dwzyDzVU3H67P5ZhpeijDS7wscaSd9\"]},\"lib/v4-core/src/types/PoolId.sol\":{\"keccak256\":\"0x6946552d4f78712c769df47a9187aa0add8737bb6d06ef04b63a33a3c0ff59f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://637851aaa9e06ff59b517e6da17dad3476968c0bc62e141158f76526a8f9c79f\",\"dweb:/ipfs/QmVUxPCRCBE23XQdCrroeUuFqNTtq2LvJaDYmp43QGNsMB\"]},\"lib/v4-core/src/types/PoolKey.sol\":{\"keccak256\":\"0x10a2ff74d87d105f52c6c10f0c6ea0548c12a75dfb979abab8a8b7d647305162\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a0680665f799067c0f0238e864e363c265ff23188dfe6ae1c4738f7d0a281ccf\",\"dweb:/ipfs/QmRCkZhaPknrV9cHkUiU3HVyMYYT3UaD8RfptHi4qB62zY\"]},\"lib/v4-core/src/types/Slot0.sol\":{\"keccak256\":\"0x8b4912fac7e25ea680056748121113f902d56f8b2640f421d5c38d438db11c1b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c19b1ff5b951fb54129268d2be37d82c8bb3ea6e29ac9bc78a8a37794fc082b8\",\"dweb:/ipfs/QmTAQ2mUoiT77hoWJAfn9pyoGy47qaevn45QHrbyovGt2C\"]},\"lib/v4-core/test/utils/CurrencySettler.sol\":{\"keccak256\":\"0xf5d04aa76b3ac6ff75396661e75ec612035ebd73d23eb6f4e207dbd46392688e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://67a67b94a2987309f06003374ddfc30ab8e81d9fec3b1585e93871eec6966d96\",\"dweb:/ipfs/QmYLzboZNfXoNufKX8UYMGhHVChqMK96vwFWjKeoWcfb24\"]},\"src/ArenaController.sol\":{\"keccak256\":\"0x66a0410203e1fc2acd57b93d831fa2d103981e830b0dba23a34bf6322c469bf0\",\"urls\":[\"bzz-raw://2c81144ae9591291aff155bc27eaf8b47a34c726086e4aa292b07670937238d0\",\"dweb:/ipfs/QmdAVQDgQaGdV1THWiPC2uqwtprPVUps9e4M2qYWLrQc4d\"]},\"src/ArenaToken.sol\":{\"keccak256\":\"0x59ea858a9c33398efbfb770c958c1f544425ad32d73a3cd3991f6834ec04028a\",\"urls\":[\"bzz-raw://242a38f560c8dc312e27a30dad15ddf2fccb4163f4f0692f814b3cfa71180105\",\"dweb:/ipfs/QmZqhSdNeRiVf5rJJYgX48SiUi1dwgpYAvMo6a7XBVRjXF\"]},\"src/Fetcher.sol\":{\"keccak256\":\"0x1895e5c0688650ca60371f208b62d9f64beea29bd7515b2600a1c8d5c73805df\",\"urls\":[\"bzz-raw://f9c904c9d032167f6d8fec1392c9a023f339a4aee9f75f06df6347a495af9d38\",\"dweb:/ipfs/QmYSaPzRawAnh2qD3JY5uvWypEueo5hSTQVyVFfX96msfb\"]},\"src/LiquidExchange.sol\":{\"keccak256\":\"0xc979e540abc8a2d1bc82f2c741beb4ea9037c7e69ab11a5a20ef11ab7b9cee22\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e5f08cb7b8685020a78fd9b84d740649dcbf9ba92057cc5914d829f275d396c5\",\"dweb:/ipfs/QmQKVvRCmSumaf2xtbLey6KdUyt9bfTLeq9gPGssisJi17\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_PRICE_LIMIT","outputs":[{"internalType":"uint160","name":"","type":"uint160"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_PRICE_LIMIT","outputs":[{"internalType":"uint160","name":"","type":"uint160"}]},{"inputs":[{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"stateMutability":"nonpayable","type":"function","name":"addLiquidity"},{"inputs":[{"internalType":"uint160","name":"sqrtPriceCurrentX96","type":"uint160"},{"internalType":"uint160","name":"sqrtPriceTargetX96","type":"uint160"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"int256","name":"amountRemaining","type":"int256"},{"internalType":"uint24","name":"feePips","type":"uint24"}],"stateMutability":"pure","type":"function","name":"computeSwapStep","outputs":[{"internalType":"uint160","name":"sqrtPriceNextX96","type":"uint160"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"constructSignal","outputs":[{"internalType":"struct ArenaController.Signal","name":"","type":"tuple","components":[{"internalType":"int24","name":"currentTick","type":"int24"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"lexPrice","type":"uint256"},{"internalType":"struct PoolKey","name":"pool","type":"tuple","components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}]},{"internalType":"address","name":"fetcher","type":"address"}]}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"equalizePrice"},{"inputs":[],"stateMutability":"view","type":"function","name":"poolKey","outputs":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}]},{"inputs":[{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"bytes","name":"hookData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setPool"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setPrice"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"swapOnLex"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@ensdomains/=lib/v4-core/node_modules/@ensdomains/","@openzeppelin/=lib/v4-core/lib/openzeppelin-contracts/","@openzeppelin/contracts/=lib/v4-core/lib/openzeppelin-contracts/contracts/","ds-test/=lib/solmate/lib/ds-test/src/","erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-gas-snapshot/=lib/v4-core/lib/forge-gas-snapshot/src/","forge-std/=lib/forge-std/src/","hardhat/=lib/v4-core/node_modules/hardhat/","openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/","solmate/=lib/solmate/src/","v4-core/=lib/v4-core/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/ArenaController.sol":"ArenaController"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/solmate/src/auth/Owned.sol":{"keccak256":"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea","urls":["bzz-raw://1ff52bbee698b9cf9e4574615e6550be0887ccf355f6571e23d6f25b332e79b4","dweb:/ipfs/QmVorA2apojVRStzS7h8aFccR3Uv32G6HVtBtFHZrE7YXx"],"license":"AGPL-3.0-only"},"lib/solmate/src/tokens/ERC20.sol":{"keccak256":"0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10","urls":["bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35","dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97"],"license":"AGPL-3.0-only"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x1b62af9baf5b8e991ed7531bc87f45550ba9d61e8dbff5caf237ccaf3a3fd843","urls":["bzz-raw://b7b38b977c5305b18ceefbeed4c9ceaaaefa419b520de62de6604ea661f8c0a9","dweb:/ipfs/QmecMRzgfMyDVa2pvBqMMDLYBappaj7Aa3qcMoQYEQrhWi"],"license":"AGPL-3.0-only"},"lib/v4-core/src/ERC6909.sol":{"keccak256":"0x22476a1c183be1b547a509b3e6906abaccb6408375f798fce805ff7877aca09f","urls":["bzz-raw://e85580e1563ea0556705132fb6bd038ca4aa355749039923853ebcb76b7c84e6","dweb:/ipfs/QmVoxPrbagRKpFdRWoaCSKmStYLZrhNFuedcuyGycSGR7q"],"license":"MIT"},"lib/v4-core/src/ERC6909Claims.sol":{"keccak256":"0xf496ef3a5a9bf4f4aa2eec951dbeff09a01ef058bb9f64b1664cf46c9e85cd49","urls":["bzz-raw://2a0a97c359a7a4c526ba9fc4ceb20af8050f9cf7886ea7e1f38c9c10b4a3750c","dweb:/ipfs/QmPy6pCQbvzCdJRqG1thHRSwEZoLBAaLo3KQnueL3wxb8i"],"license":"MIT"},"lib/v4-core/src/Extsload.sol":{"keccak256":"0x784074bd04a1541c7c6ace074e30245746133fd37c3ba16b025dce394db986ce","urls":["bzz-raw://35f1f4fb306bf01e98b7eca012b85f3ab978b39fa5136193363e2519c4435e51","dweb:/ipfs/QmeGrjGMt71dJymVhkEadh5CuCW5GxRqNEZLi5AJxvC5tU"],"license":"MIT"},"lib/v4-core/src/Exttload.sol":{"keccak256":"0x769ee2733a08112c652274f4b972c45fb56cc46109f233b9a30f81561b15dd54","urls":["bzz-raw://dd19e88d50ae77c1ed5581baca1c75b3fb828d0b58cded90188d55c4e336266c","dweb:/ipfs/Qmc8YM6Tfpwwa4qivHHzRxNdhZzdzGiD7VexWsDvkaQTxG"],"license":"MIT"},"lib/v4-core/src/NoDelegateCall.sol":{"keccak256":"0x5c238701785d16c58a1598daec0f72a2aaf47d5d017b9dd7441cc8093b65b202","urls":["bzz-raw://696cf79b74bc38e7316d94dfd8bdd9579a94f74121e9b65d2613eb59c106ea50","dweb:/ipfs/QmRttHmshQJ5E7EGaeBC7yT4wyzthNXZQJn7sy2nJvb4dB"],"license":"BUSL-1.1"},"lib/v4-core/src/PoolManager.sol":{"keccak256":"0xca5369a1683d06842268987fb6f46b05e6364a46cc856f72bb5c603826f47eac","urls":["bzz-raw://5ae5893222abc5dc5fa57bc05af40b60a96a1537bd3c1f3845257d6a3c2b5821","dweb:/ipfs/QmZxQH8M3NVunurxDNJ5EZm2fy6Ws8CHJSezCQaoqzMPoq"],"license":"BUSL-1.1"},"lib/v4-core/src/ProtocolFees.sol":{"keccak256":"0x2e7533e46dcab5508ed417ab33c2d0ca8c52a6b5f445dd90daf328173ada4449","urls":["bzz-raw://8403de6f2c89a665a3ff3566a917179a5bfb3e0ac9514f0438d82270a7f98c91","dweb:/ipfs/QmTq9cjKTaXeCoSfCywpFwo7sNvuXM4wSMnebwX3hBuiRG"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/interfaces/IExtsload.sol":{"keccak256":"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43","urls":["bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1","dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN"],"license":"MIT"},"lib/v4-core/src/interfaces/IExttload.sol":{"keccak256":"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937","urls":["bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8","dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY"],"license":"MIT"},"lib/v4-core/src/interfaces/IHooks.sol":{"keccak256":"0xdbaf1db938b70f77eb4ddbad5b8d2a1fc648c7d65ca2a312aba16cc013c85df0","urls":["bzz-raw://4ad2d9c85116a2e51281dd40577c798d6d5968be1f8908f43ba152849809deaa","dweb:/ipfs/QmZP4kk9KJzoxv81EgsTfHnJeU8YUxX3yWZudJHbxQjpa8"],"license":"MIT"},"lib/v4-core/src/interfaces/IPoolManager.sol":{"keccak256":"0x4e07d93993f6ba033c8b5e5b0a3473659aeffe9af0cf8316a879a55ebd696d7a","urls":["bzz-raw://50add8378d59b89b1dc106ea248641caaedd3ac45d62754babe55c526b87c9ad","dweb:/ipfs/QmQUrvy8ZDDdTRTr17msqynVECP3rQFBVBUmFcpFvjAmQx"],"license":"MIT"},"lib/v4-core/src/interfaces/IProtocolFeeController.sol":{"keccak256":"0xc2d7f3605da9767e36cf25d4d4fa9b95663a6659e26ce28cf29b8b88acb79a4c","urls":["bzz-raw://c7a43cda35b8a9254ed3e46cfd8649361f09121d17ef554bd3d190b9a8d57cc6","dweb:/ipfs/QmRBDQoqCWddH5hY1JdxMyYtY8jMZhWAwtuFJBc3r8V31G"],"license":"MIT"},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"keccak256":"0x68700020df618c5715737e57630876ec22ccde2d31191a5608babb9f140ed297","urls":["bzz-raw://56b7bb6786f48fff8c9d04e9054955b8cf3d9f5bf819ccda7be192ad2004a27f","dweb:/ipfs/QmZKmUvcYnyihEFySD6SY9osMkP8M1Y7a4kPxLQycEyThw"],"license":"MIT"},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"keccak256":"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719","urls":["bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b","dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK"],"license":"MIT"},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"keccak256":"0xc1c23330c1511ecfd45c67a683962b4e2555b82f1dacd40cc8b46ae5a6e250e7","urls":["bzz-raw://5ce10b7970482a65f9e9a365b810eeb154a5d4a8229a26653028d84b9622a410","dweb:/ipfs/QmTSwXxZ2FTkM5duBZgbpFs8SRVDR5NPAnW4YimeDhb1s8"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"keccak256":"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48","urls":["bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f","dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK"],"license":"MIT"},"lib/v4-core/src/libraries/BitMath.sol":{"keccak256":"0x59e18adcff8917b0965a240d88b34d5d800e0efebd5f40c5594ddcf28a15949b","urls":["bzz-raw://d358beebf8d5079520b6e138d744e5063ecbfbeae355c08af86a3b74afa71b09","dweb:/ipfs/QmUXmAK9aoxnaeykq8MLXoRKP8yGTDyY3jPFMwHnqRxf46"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/CurrencyDelta.sol":{"keccak256":"0xb1eb18c3794b67f4f710229df279d3a630a963194fbbeb51906198ec7145b98e","urls":["bzz-raw://e5ea08b69754250cf04cc544785320f5c8fd8b9a65e5d9e0bc44aadadaa9ea0c","dweb:/ipfs/QmWW1qfqGydoiSeDtVVQ53nV3FphuUgH1PFUC3uGaWzxWR"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/CurrencyReserves.sol":{"keccak256":"0xdeffc5cf2f8f7d3f802998941061392c0c926a32c7105ffd9f902ab84d3a31c6","urls":["bzz-raw://869bd659c5593bc525ce4d44771d85eb8acb74a7f0492802bdcc79d2bfdfcaf7","dweb:/ipfs/QmSrTWzUHrou7ZxcuFXQhvzXmEgbLeCtwAqeS6k9vD22h3"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/CustomRevert.sol":{"keccak256":"0x70a444afeb27564398dbdf7553651ee2cae14c03c923b6f8972040c8f460ebe3","urls":["bzz-raw://9d7b05390bac9b29188725c8a84edac43cd05571da27b33a0b1e36d9500ecaa6","dweb:/ipfs/QmdYDLwTfFgePDEwFMUqGTj8SNNXXq4JQJnrgomJgcZFvP"],"license":"MIT"},"lib/v4-core/src/libraries/FixedPoint128.sol":{"keccak256":"0xc7e80dc41f28887d0d915a75c0b2783ae659e5384dd1a3ed1251a42e058d8835","urls":["bzz-raw://2df62bf1d9d4349236fd0bc7a96b3a3be95f4c049603e4a20c8473cca9402b4d","dweb:/ipfs/QmVR5dmMkoypmhaBeBj8cGegHpJycbofUDg59dHm42i9MT"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/FixedPoint96.sol":{"keccak256":"0xf0a545fc5bbc271e8dbd191413dc03e8725d1f003df4d9d36ea7cdb73058c417","urls":["bzz-raw://5d1013d8b5c93024526f129b0a9271b35c578da09bcfe6c3240ff4d590ebc196","dweb:/ipfs/QmX1GyF9jJhYGXst6PyK6HJvcfVQ69nNTnuBEBaEiAZPv7"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/FullMath.sol":{"keccak256":"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2","urls":["bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52","dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC"],"license":"MIT"},"lib/v4-core/src/libraries/Hooks.sol":{"keccak256":"0xfa031f4efc096e9c93bb094509321e1c08b5eb271f46554f858e74803c43ae66","urls":["bzz-raw://7cc33d5eb869ecacfb70d024f7b925d191d98553dbb921bd8188f97d51c9e111","dweb:/ipfs/Qme5VCnaS5mXyqaWV5uiW5xcmTb56uCKBPFrLZp2dq41dQ"],"license":"MIT"},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"keccak256":"0xfbebd6766871b795d945a74b6110931f73fc775aeeecc2682d6d6ca841a01ece","urls":["bzz-raw://36fcc7098454971ae16d790ee9aee227c22c5cbbd7ff6e27e58ac29b901d5896","dweb:/ipfs/QmboCGTWtycGpda7E169pD67Fox2H9b1YRsNHcsxBRrhfo"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/LiquidityMath.sol":{"keccak256":"0x4a04b9383e2fb943c2c3ae7d0c9071b58dd97b6dac0a409fe1c79c3ca897bbcf","urls":["bzz-raw://0b33cf0ff936f62aa7f3b82922fa0ac52ac24471561e87fbf7ab8372607f6dfc","dweb:/ipfs/Qmcr6omwzJjQPu6HQ8E9vFXaTgrtqfb2KbfxbuQavfUzFa"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/Lock.sol":{"keccak256":"0x9338be4b5695f1da5f3d3f7a3eeaf7a356c1045458289586ac0cbe9cef77c6d5","urls":["bzz-raw://485ec42ed6155469d612a9a0c18068ebfbad74448792a338a435503de3ef1b2c","dweb:/ipfs/QmVnnv5u74MYatfRmBgrcfFYQcsMAJMG9jQ6ju8UiydKNF"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/NonZeroDeltaCount.sol":{"keccak256":"0x6b7e23f470b8352efdbf459a34dd0dcfdbe03e623cb4de67f4ad9be326691586","urls":["bzz-raw://b86af075e2331f7a065b15d91253f2ce6b845dfe09493338f2d7cdab6f9e4cc2","dweb:/ipfs/QmdzHJQapqAS42rMrYPgdvb4Sae7NVy3ESkNc1TuBRcxUC"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/ParseBytes.sol":{"keccak256":"0xf0795198d1e651b0b33fd1708d80a14f501bb2a1486905676d35f364e880f579","urls":["bzz-raw://5aea527fcec51d7274f0c189dc2479a6aa708fc91857187a4d7db46bb1d6c7a8","dweb:/ipfs/QmUTrwTPSZ7EHBaTyfAA78rZVP17iQzmAmvDcQ8GhDRAEf"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/Pool.sol":{"keccak256":"0x7a506727ae59f5b5487a0a16ec1d7038b7c2a4ee5f4a7fa7c444ec7df6ad5a7c","urls":["bzz-raw://befdd15aee06a7b2a3c64cb899220ec03a1ae8470ad17e19050bcca1ac5266a8","dweb:/ipfs/QmWPfBgfp5VKnku9ZtKXwYycyKdAZuCj6778T2HFrfQ61H"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/Position.sol":{"keccak256":"0x0309a650890f1cd93e2b4b1e9a40032d5feb8c6a0ccc24be24373bfd7590ff80","urls":["bzz-raw://63aae574b22048f1453da8f9142374e334683bb3a069c2312f73e6b857842bce","dweb:/ipfs/QmcJZK3kU4jsWfJKBpRq2kaouutEDHcytgMX8ZaGeBsbgu"],"license":"BUSL-1.1"},"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol":{"keccak256":"0x2739e8f54707c6a0e23f9c61a0783dd18b107c3fc287b2827f1ab4b41f891902","urls":["bzz-raw://2e3b154410bbfcbe8808c6dfb74c4bbbac50a59e228cee59b34e169dbd34ee1a","dweb:/ipfs/QmcRoM6T2F7FTHtGdD5aRiVthCon8oiWur661GCrk5FejP"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/SafeCast.sol":{"keccak256":"0xbccc4f8d5d467d162d7f0ab5a7f22bcccf05ae07577b9728c9e3030c63977e60","urls":["bzz-raw://0003ea7a515ba709a3fdeaa19e7930c1f883b3b4fbdbf389d4f2f85b25eb72b4","dweb:/ipfs/QmYs8uNcYRGuGUbeBfF27fhArNaQ5Y9iMCTMfgic5d39fM"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/SqrtPriceMath.sol":{"keccak256":"0x1a5a8fd4a21cec19c0c253201e9b5534e8d810eb132bceee04af37fd78adb5db","urls":["bzz-raw://afa2a5950c9057fd3c00a6f413fba91c4c7dab06d573f7349aaf8f806c0e1f31","dweb:/ipfs/Qmb2m62xAPRBtxtx3sV7MAFw2vHWNm9m49ctPHmFX5hozt"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/StateLibrary.sol":{"keccak256":"0x67ead4d1ffe7e4fc381cef059c8d4941c7b4d581ef043fc8d3278d0829da414e","urls":["bzz-raw://0d12edd46a3ff2e19ea9b650507ea22e7714daa335a6b40f4d2f6d29c16431e4","dweb:/ipfs/QmZn6dzXZgR3rGohZAvKzqYMgm5n9qTrpi1VhXizYhiquH"],"license":"MIT"},"lib/v4-core/src/libraries/SwapMath.sol":{"keccak256":"0xa8cedd0f63b2d8b6faac60455f499c79816f53fbd86f3bb0706fae426b2c231e","urls":["bzz-raw://8d926c2df899b21811862d106d5e1d2b5bdf83c76ae6ff4216e7c9ce443d8e75","dweb:/ipfs/QmTTVSCumUXZ4vf3R1GwfqJSTgLFyjueuxZkRH9U6dsTb3"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/TickBitmap.sol":{"keccak256":"0x23abd96aa808657304affd775666d7cc5fb0ab564f87d1b65fbf8dc5877d9cd6","urls":["bzz-raw://4c7686aefb704a3efe97cc0e8f180ed48f7667f5ae69d3754962f04352c66b79","dweb:/ipfs/QmULiCBW9s2hB6SmnJTi2wiAwgkLXpZJcdVZm9f77zDNuc"],"license":"MIT"},"lib/v4-core/src/libraries/TickMath.sol":{"keccak256":"0x64c668177d82bb185d902fb2190630ccb67babb6439422979692ac2f8dfb6dcd","urls":["bzz-raw://e2714a025df18c22f20b358b7143e8a5c55cffb20c7de292be0376845a5f0408","dweb:/ipfs/QmWaeCkxwkVuReFUSK2nDat1BB5DJ8BUowwGwmVyKpsrME"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/libraries/TransientStateLibrary.sol":{"keccak256":"0x1bc28f30c176c7c598522da0d8907a90c4cd8ecce81775bb4deb3a9b78782f86","urls":["bzz-raw://fb5c05fb51e59ef168ba884c4ea3627525dba9feea0de9ffa0587438f70fd095","dweb:/ipfs/Qmbx3ntPDZ9VeGsAnVNSM5DKmhPg92yobh5ZHbvdGWtHUd"],"license":"MIT"},"lib/v4-core/src/libraries/UnsafeMath.sol":{"keccak256":"0xe9b87da934af38419d4b5f20cc09943dbb569425448fc23fdc5ec6aebbb63c84","urls":["bzz-raw://29838c28905c34f9602a453759b55f5acc6aff02bf6d7a6afac5d1a245dd5db3","dweb:/ipfs/QmfN5bhLFw1CsnnaJQNZd3bLpLufQcwt9ztaR71LA43UGY"],"license":"GPL-2.0-or-later"},"lib/v4-core/src/test/PoolModifyLiquidityTest.sol":{"keccak256":"0x4578759af55db566eee1d19c19a285710b1d301b511e37df4a1072c2d5a47ade","urls":["bzz-raw://aa6588f1f695efe625241fdbad07730611c8bec77d963698c6412775b7dd68a7","dweb:/ipfs/QmeDGAKa9sR6Wk5ibyzt4YGa6tdtjmFPzJafMbBgkWRB9d"],"license":"UNLICENSED"},"lib/v4-core/src/test/PoolSwapTest.sol":{"keccak256":"0x389d2274a70c565c12c8fd7f0f5bdbee7532d842936243141c65cf1477c1a7e8","urls":["bzz-raw://cdaff983aa947444cece280d8485f524a778cf8843c3f8b96f60e4ad137aa8d3","dweb:/ipfs/QmP7qbC3UZz723pTWuJh18qap1vYAHDY5UoJwGtvosWs9k"],"license":"UNLICENSED"},"lib/v4-core/src/test/PoolTestBase.sol":{"keccak256":"0x71db5a5215d858124dd2ccf73c4474421651f248e4c85d33455d95abced0a23c","urls":["bzz-raw://fac0df901621d44a1b98ce4569616940ca6700e7829357bdf18509237b822072","dweb:/ipfs/Qmf9sWokQvzmKfAY6Vd4QzyTyhikqCb8zUowrFPe9DRxs5"],"license":"UNLICENSED"},"lib/v4-core/src/types/BalanceDelta.sol":{"keccak256":"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f","urls":["bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9","dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H"],"license":"MIT"},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"keccak256":"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78","urls":["bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782","dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K"],"license":"MIT"},"lib/v4-core/src/types/Currency.sol":{"keccak256":"0xc77e2d4d380be1887078b1d21e2381fe4e9138dce8c7efbf9050aa7d65d75d4c","urls":["bzz-raw://b85a1edba4be624be660d69badac1e3641d83190893839fa30260eef316d00c8","dweb:/ipfs/QmPaEaeNkhy5F4X9dwzyDzVU3H67P5ZhpeijDS7wscaSd9"],"license":"MIT"},"lib/v4-core/src/types/PoolId.sol":{"keccak256":"0x6946552d4f78712c769df47a9187aa0add8737bb6d06ef04b63a33a3c0ff59f8","urls":["bzz-raw://637851aaa9e06ff59b517e6da17dad3476968c0bc62e141158f76526a8f9c79f","dweb:/ipfs/QmVUxPCRCBE23XQdCrroeUuFqNTtq2LvJaDYmp43QGNsMB"],"license":"MIT"},"lib/v4-core/src/types/PoolKey.sol":{"keccak256":"0x10a2ff74d87d105f52c6c10f0c6ea0548c12a75dfb979abab8a8b7d647305162","urls":["bzz-raw://a0680665f799067c0f0238e864e363c265ff23188dfe6ae1c4738f7d0a281ccf","dweb:/ipfs/QmRCkZhaPknrV9cHkUiU3HVyMYYT3UaD8RfptHi4qB62zY"],"license":"MIT"},"lib/v4-core/src/types/Slot0.sol":{"keccak256":"0x8b4912fac7e25ea680056748121113f902d56f8b2640f421d5c38d438db11c1b","urls":["bzz-raw://c19b1ff5b951fb54129268d2be37d82c8bb3ea6e29ac9bc78a8a37794fc082b8","dweb:/ipfs/QmTAQ2mUoiT77hoWJAfn9pyoGy47qaevn45QHrbyovGt2C"],"license":"MIT"},"lib/v4-core/test/utils/CurrencySettler.sol":{"keccak256":"0xf5d04aa76b3ac6ff75396661e75ec612035ebd73d23eb6f4e207dbd46392688e","urls":["bzz-raw://67a67b94a2987309f06003374ddfc30ab8e81d9fec3b1585e93871eec6966d96","dweb:/ipfs/QmYLzboZNfXoNufKX8UYMGhHVChqMK96vwFWjKeoWcfb24"],"license":"MIT"},"src/ArenaController.sol":{"keccak256":"0x66a0410203e1fc2acd57b93d831fa2d103981e830b0dba23a34bf6322c469bf0","urls":["bzz-raw://2c81144ae9591291aff155bc27eaf8b47a34c726086e4aa292b07670937238d0","dweb:/ipfs/QmdAVQDgQaGdV1THWiPC2uqwtprPVUps9e4M2qYWLrQc4d"],"license":null},"src/ArenaToken.sol":{"keccak256":"0x59ea858a9c33398efbfb770c958c1f544425ad32d73a3cd3991f6834ec04028a","urls":["bzz-raw://242a38f560c8dc312e27a30dad15ddf2fccb4163f4f0692f814b3cfa71180105","dweb:/ipfs/QmZqhSdNeRiVf5rJJYgX48SiUi1dwgpYAvMo6a7XBVRjXF"],"license":null},"src/Fetcher.sol":{"keccak256":"0x1895e5c0688650ca60371f208b62d9f64beea29bd7515b2600a1c8d5c73805df","urls":["bzz-raw://f9c904c9d032167f6d8fec1392c9a023f339a4aee9f75f06df6347a495af9d38","dweb:/ipfs/QmYSaPzRawAnh2qD3JY5uvWypEueo5hSTQVyVFfX96msfb"],"license":null},"src/LiquidExchange.sol":{"keccak256":"0xc979e540abc8a2d1bc82f2c741beb4ea9037c7e69ab11a5a20ef11ab7b9cee22","urls":["bzz-raw://e5f08cb7b8685020a78fd9b84d740649dcbf9ba92057cc5914d829f275d396c5","dweb:/ipfs/QmQKVvRCmSumaf2xtbLey6KdUyt9bfTLeq9gPGssisJi17"],"license":"MIT"}},"version":1},"id":53} \ No newline at end of file diff --git a/src/engine/arbitrageur.rs b/src/engine/arbitrageur.rs index 8726b13..de51e0f 100644 --- a/src/engine/arbitrageur.rs +++ b/src/engine/arbitrageur.rs @@ -1,14 +1,8 @@ -use std::str::FromStr; - use async_trait::async_trait; -use rug::{ops::Pow, Float}; use super::*; use crate::{ - types::{ - fetcher::Fetcher, - swap::{IPoolManager::SwapParams, PoolSwapTest, PoolSwapTest::TestSettings}, - }, + types::{controller::ArenaController, swap::PoolSwapTest}, AnvilProvider, Signal, }; @@ -24,12 +18,12 @@ pub trait Arbitrageur { /// Default implementation of an [`Arbitrageur`] that uses the closed-form optimal swap amount to determine the optimal arbitrage. #[derive(Default)] -pub struct DefaultArbitrageur { +pub struct FixedArbitrageur { swapper: Option
, } #[async_trait] -impl Arbitrageur for DefaultArbitrageur { +impl Arbitrageur for FixedArbitrageur { async fn init(&mut self, signal: &Signal, provider: AnvilProvider) { let swapper = PoolSwapTest::deploy(provider.clone(), signal.manager) .await @@ -39,54 +33,16 @@ impl Arbitrageur for DefaultArbitrageur { } async fn arbitrage(&mut self, signal: &Signal, provider: AnvilProvider) { - // arbitrageur is always initialized before event loop starts, so unwrap should never fail. - let swapper = PoolSwapTest::new(self.swapper.unwrap(), provider.clone()); - - let base = Float::with_val(53, 1.0001); - let price = Float::with_val(53, signal.current_value); - - let target_tick = price.log10() / base.log10(); - let current_tick = Float::with_val(53, signal.tick.as_i64()); - - let (start, end) = ( - current_tick.clone().min(&target_tick), - current_tick.clone().max(&target_tick), - ); - - let (a, b) = self - .get_tick_range_liquidity( - signal, - provider, - start.to_i32_saturating().unwrap(), - end.to_i32_saturating().unwrap(), - ) - .await; - - let k = a.clone() * b.clone(); - - // closed form optimal swap solution, ref: https://arxiv.org/pdf/1911.03380 - let fee: u64 = signal.pool.fee.to_string().parse().unwrap(); - let optimal_swap = Float::with_val(53, 0).max(&(a.clone() - (k / (fee * (a / b))))); - - let zero_for_one = current_tick > target_tick; - - let swap_params = SwapParams { - amountSpecified: Signed::from_str(&optimal_swap.to_string()).unwrap(), - zeroForOne: zero_for_one, - sqrtPriceLimitX96: signal.sqrt_price_x96, - }; - - let test_settings = TestSettings { - takeClaims: false, - settleUsingBurn: false, - }; - - swapper - .swap( - signal.pool.clone().into(), - swap_params, - test_settings, - Bytes::new(), + let controller = ArenaController::new(signal.controller, provider.clone()); + + controller + .equalizePrice() + .nonce( + provider + .clone() + .get_transaction_count(provider.clone().default_signer_address()) + .await + .unwrap(), ) .send() .await @@ -97,48 +53,6 @@ impl Arbitrageur for DefaultArbitrageur { } } -impl DefaultArbitrageur { - async fn get_tick_range_liquidity( - &self, - signal: &Signal, - provider: AnvilProvider, - start: i32, - end: i32, - ) -> (Float, Float) { - let fetcher = Fetcher::new(signal.fetcher, provider.clone()); - - let mut liquidity_a = Float::with_val(53, 0); - let mut liquidity_b = Float::with_val(53, 0); - - for tick in start..end { - let pool_id = fetcher - .toId(signal.pool.clone().into()) - .call() - .await - .unwrap() - .poolId; - - let tick_info = fetcher - .getTickInfo( - signal.manager, - pool_id, - Signed::from_str(&tick.to_string()).unwrap(), - ) - .call() - .await - .unwrap(); - let sqrt_price = Float::with_val(53, Float::with_val(53, 1.0001).pow(tick / 2)); - - let tick_liquidity = Float::with_val(53, tick_info.liquidityNet); - - liquidity_a += tick_liquidity.clone() / sqrt_price.clone(); - liquidity_b += tick_liquidity * sqrt_price; - } - - (liquidity_a, liquidity_b) - } -} - /// No-op implementation of an [`Arbitrageur`] for custom usecases. pub struct EmptyArbitrageur; diff --git a/src/lib.rs b/src/lib.rs index cb050ff..d991b93 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,6 +28,7 @@ use alloy::{ }, transports::http::{Client, Http}, }; + use crate::types::controller::ArenaController::PoolKey; pub use crate::{ arena::{Arena, ArenaBuilder}, @@ -57,10 +58,10 @@ mod types { use alloy_sol_macro::sol; use crate::types::{ + controller::ArenaController::PoolKey as ControllerPoolKey, fetcher::Fetcher::PoolKey as FetcherPoolKey, modify_liquidity::PoolModifyLiquidityTest::PoolKey as ModifyLiquidityPoolKey, pool_manager::PoolManager::PoolKey as ManagerPoolKey, - controller::ArenaController::PoolKey as ControllerPoolKey, swap::PoolSwapTest::PoolKey as SwapPoolKey, }; @@ -275,10 +276,14 @@ pub struct Signal { /// Current value of the price feed. pub current_value: f64, + + /// The arena controller. + pub controller: Address, } impl Signal { /// Public constructor function for a new [`Signal`]. + #[allow(clippy::too_many_arguments)] pub fn new( lex_price: Uint<256, 4>, step: Option, @@ -288,6 +293,7 @@ impl Signal { pool: PoolKey, fetcher: Address, current_value: f64, + controller: Address, ) -> Self { Self { lex_price, @@ -298,6 +304,7 @@ impl Signal { pool, fetcher, current_value, + controller, } } } @@ -311,7 +318,10 @@ mod tests { use crate::{ arena::{Arena, ArenaBuilder}, config::Config, - engine::{arbitrageur::{EmptyArbitrageur, DefaultArbitrageur}, inspector::EmptyInspector}, + engine::{ + arbitrageur::{EmptyArbitrageur, FixedArbitrageur}, + inspector::EmptyInspector, + }, feed::OrnsteinUhlenbeck, strategy::Strategy, }; @@ -329,9 +339,9 @@ mod tests { ) { engine .modify_liquidity( - I256::try_from(10000).unwrap(), - Signed::try_from(-2).unwrap(), - Signed::try_from(2).unwrap(), + I256::try_from(10000000).unwrap(), + Signed::try_from(-1000).unwrap(), + Signed::try_from(1000).unwrap(), provider, ) .await @@ -344,7 +354,7 @@ mod tests { _inspector: &mut Box>, _engine: Engine, ) { - println!("signal: {:?}", signal.current_value); + println!("signal: {:?}", signal); } } @@ -354,11 +364,11 @@ mod tests { let mut arena: Arena<_> = builder .with_strategy(Box::new(StrategyMock {})) - .with_feed(Box::new(OrnsteinUhlenbeck::new(1.0, 0.1, 0.1, 0.1, 0.1))) + .with_feed(Box::new(OrnsteinUhlenbeck::new(10.0, 0.1, 0.1, 0.1, 0.1))) .with_inspector(Box::new(EmptyInspector {})) - .with_arbitrageur(Box::new(EmptyArbitrageur {})) + .with_arbitrageur(Box::new(FixedArbitrageur::default())) .build(); - arena.run(Config::new(Uint::from(5000), 500)).await.unwrap(); + arena.run(Config::new(Uint::from(5000), 10)).await.unwrap(); } }