{"matchId":"56159255","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-15T12:45:31Z","creationBytecode":{"onchainBytecode":"0x6103e06040523461100857619b4c803803809161001e826103e0612dda565b6103e039610220811261100857610180136110085760405161018081016001600160401b03811182821017612dab5760405261005b6103e0612dfd565b808252610069610400612dfd565b602083018190526104205190916001600160a01b03821682036110085760408401829052610098610440612dfd565b606085018190526100aa610460612dfd565b60808601819052906100bd610480612dfd565b60a087018190526100cf6104a0612dfd565b60c088018190526104c05160e089018190526104e051979096919491906001600160a01b0389168903611008576101008a0189905261050051936001600160a01b0385168503611008576101208b0185905261052051946001600160a01b0386168603611008576101408c01869052610160938c61014e610540612e11565b950185905261056051976001600160a01b03891689036110085761058051996001600160a01b038b168b03611008576105a0519d6001600160a01b038f168f9003611008576105c0519d6001600160a01b038f168f9003611008576105e0519d6001600160a01b038f168f9003611008576001600160a01b039485169a9085169890851697908516949081169316883b15612d9c578860805280158015612d94575b612d855760a05260c052306101605260405163dc4c90d360e01b8152602081600481875afa80156110145788915f91612d49575b506001600160a01b031614801590612ccd575b611fe15760405163dc4c90d360e01b81526020816004818d5afa80156110145788915f91612c91575b506001600160a01b031614801590612c22575b611fe15760405163dc4c90d360e01b8152602081600481865afa80156110145788915f91612be6575b506001600160a01b031614801590612b13575b8015612a40575b611fe157604051637f5a7c7b60e01b81526020816004816001600160a01b0386165afa908115611014575f91612a06575b50604051637f5a7c7b60e01b81526020816004818e5afa908115611014575f916129cc575b506001600160a01b03918216911614801590612950575b80156128d4575b8015612858575b80156127d3575b611fe157604051637e062a3560e11b81526020816004818d5afa908115611014575f91612799575b506101805260018060a01b031660e05261014052866101005283610120526101a05260018060a01b03166101c052604051637f5a7c7b60e01b815260208160048160018060a01b0386165afa908115611014575f9161275f575b50604051637f5a7c7b60e01b81526020816004818a5afa908115611014575f91612725575b506001600160a01b03918216911614801590612664575b80156125e8575b611fe1576001600160a01b0381166101e08190526040516315e5a1e560e01b815290602090829060049082905afa918215611014576004926020925f916125cb575b506102005260405163141b84eb60e31b815292839182906001600160a01b03165afa908115611014575f91612599575b50610220526040516367e828bf60e01b81526020816004816001600160a01b038a165afa908115611014575f91612557575b50604051637e062a3560e11b8152936001600160a01b03919091169290602085600481895afa948515611014575f9561251b575b50604051637f5a7c7b60e01b8152906020826004818a5afa918215611014575f926124df575b506040519561050987612dbf565b5f875260018060a01b0316602087015262800000604087015260020b606086015260018060a01b0316608085015260405163481c6a7560e01b8152602081600481875afa908115611014575f916124a5575b506001600160a01b031614801594906123c1575b50831561234c575b5082156122e0575b50508015612268575b611fe1576001600160a01b039081166102405260405163481c6a7560e01b8152906020908290600490829086165afa908115611014575f9161222e575b5086516001600160a01b0391821691161480159061215b575b801561206d575b8015611ff0575b611fe15761026081905260a0860151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f91611fa7575b506001600160a01b039081166102805260a08701516040516319b400eb60e21b81529160209183916004918391165afa908115611014575f91611f6d575b506102a0526060860151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa8015611014575f90611f33575b6004915061016088015160020b602060018060a01b0360608b01511660405194858092637f5a7c7b60e01b82525afa908115611014575f91611ef7575b60049350604051926106f284612dbf565b5f845260018060a01b03166020840152628000006040840152606083015260018060a01b03166080820152602060018060a01b036101208a015116604051938480926315e5a1e560e01b82525afa908115611014576004925f92611ed6575b5061012089015160405163141b84eb60e31b81529360209185919082906001600160a01b03165afa928315611014575f93611ea2575b506001600160a01b0385163b15908115611e20575b8115611d55575b8115611c64575b8115611bf3575b508015611b81575b8015611b6f575b8015611b62575b8015611af6575b8015611a74575b611a65576102c08490526001600160a01b0387163b1580156119e6575b8015611964575b8015611876575b8015611788575b611779576102e087905261030052610320526001600160a01b0384163b1580156116ee575b801561166f575b80156115ed575b80156114ff575b8015611427575b80156113b8575b6113a9576103408490526040516357a3434160e11b81526020816004816001600160a01b0389165afa908115611014575f91611377575b50610360526040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f91611345575b5061038052306103a05260018060a01b038651166e04444c5dc75cb358380d2e3de08a90811490811591611319575b50610ed75760018060a01b036020870151167349a91293a8dff24d5c54b798c45376301d29b9f38114908115916112ed575b50610ed75760018060a01b0360408701511673f1749e78e76cfe1119206833ae93bed2dede53538114908115916112c1575b50610ed75760018060a01b0360608701511673136589be852ab8d9541f923b04064e362c2f357a811490811591611295575b50610ed75760018060a01b03608087015116735f4ec3df9cbd43714fe2740f5e3616155c5b8419811490811591611269575b50610ed75760018060a01b0360a0870151167372d94600a7a57afb6a2090e9739fd8ab21e02eb281149081159161123d575b50610ed75760018060a01b036101008701511673271f808cb55c7cbbb3d4df0da075def9ae5f7340811490811591611224575b50610ed75760018060a01b03610120870151167380396c7131159eb92e7e84839e51c9887a7a95d98114908115916111f8575b50610ed75760018060a01b036101408701511673c594bdfba256c79f6069df9e89ea78d6312fadd78114908115916111cc575b50610ed7576001600160a01b03811673c0aeabdef1760d0dcba28a20c15701f74216e77a1480159190611197575b50610ed7576001600160a01b03811673b2304d3de407398de441b147e2c64c7c48daf44e1480159190611162575b50610ed7576001600160a01b0383167351629bca14098a4f1ad77cd7e85212d67349823d14801592908390611141575b610ed7576001600160a01b038116734e5916428452891e1deb59d162c20266ed08cad4148015919061110c575b50610ed75760c08401516001600160a01b0316735598aa9146215bc13eb26f2c692ad1461fd32982148015906110de575b80156110cb575b610ed7576040516001600160a01b0382163f90610de990610b8f6020830182612dda565b8181526020810191618d23833951902003610ed7576103c05282516001600160a01b03166e04444c5dc75cb358380d2e3de08a90148015939061101f575b8315610f64575b8315610f37575b8315610f10575b508215610f08575b508115610ee6575b50610ed757604051615ec59081612e5e8239608051818181601c015281816104fc0152818161058d0152818161099001528181610bad015281816113630152818161140401528181611b9701528181611c7001528181611f99015281816120c10152818161221c01528181612336015281816128a50152818161291701528181612b0a01528181612e6c01528181612f4b01528181613f3f015281816140b70152818161422a015281816151cb015281816151fe0152818161535d015281816154170152818161547b015281816154ab015281816158170152818161587c015281816159f201528181615ae50152615b49015260a051818181610c3b0152610e46015260c0518181816111770152611c19015260e051818181610ccf01528181612697015281816127b901526148190152610100518181816104c00152818161132001528181611eee015261286d01526101205181611d68015261014051818181611dd201528181612db60152613f070152610160518161062d0152610180518181816108cb0152614aff01526101a05181818161040f015281816107b601528181611e3401528181612731015281816154570152615b2501526101c051818181612f0901528181615122015281816151a7015281816157b801526157f301526101e0518181816126430152818161432f0152615850015261020051815050610220518150506102405181818161227b01526147be015261026051816103c701526102805181612a1801526102a05181612a6701526102c051818181613153015281816135ba01528181614ea501526159c601526102e051818181612983015261407201526103005181818161593d0152615a7c015261032051816159650152610340518181816111b8015281816142a10152614f040152610360518181816119c8015281816142670152614e460152610380518161501d01526103a051816112db01526103c0518181816116cf015281816123a301528181612ec501526130000152f35b6339cbe26160e21b5f5260045ffd5b6001600160a01b03163f5f80516020619b2c833981519152141590505f610bf2565b91505f610bea565b61010001516001600160a01b03163f5f80516020619b0c833981519152141592505f610be2565b6101008101516001600160a01b031673271f808cb55c7cbbb3d4df0da075def9ae5f734014159350610bdb565b6060810151604051637f5a7c7b60e01b8152919450602090829060049082906001600160a01b03165afa8015611014575f90610fc3575b6001600160a01b03167337bfb8ac7c960e558657871d41ca70e07e7dbfff1415939050610bd4565b506020813d60201161100c575b81610fdd60209383612dda565b81010312611008576110037337bfb8ac7c960e558657871d41ca70e07e7dbfff91612dfd565b610f9b565b5f80fd5b3d9150610fd0565b6040513d5f823e3d90fd5b6060810151604051637e062a3560e11b8152919450602090829060049082906001600160a01b03165afa8015611014575f9061107e575b6001600160a01b0316731b54e762aa34cf6e28e9c082f2848e28e45da6b81415939050610bcd565b506020813d6020116110c3575b8161109860209383612dda565b81010312611008576110be731b54e762aa34cf6e28e9c082f2848e28e45da6b891612dfd565b611056565b3d915061108b565b50600161016085015160020b1415610b6b565b507f39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d78760e08501511415610b64565b6001600160a01b03163f7fe9609b506e4fb7529489bead6fb1212a3751c585ca01e7ea8162eaf717284ee2141590505f610b33565b506001600160a01b0384163f5f80516020619b2c8339815191521415610b06565b6001600160a01b03163f7f6e6bc3de6394814b173f45ad91823a00d221177e3f55ac950aa51b0527aaeee5141590505f610ad6565b6001600160a01b03163f7f895d8d18e1ddae18be624a5d6eb91ecbef32463239286ea0f089cbaf4d73cb14141590505f610aa8565b7f0c382e71978ff7c7a8ae6ccbb5ae72ff7e3c7348b633fa568e61bc227c0e600f91503f14155f610a7a565b7f162a8f628e26a75e99b59459595aa3dab79d928bab90263195364a48d91a821291503f14155f610a47565b5f80516020619b0c83398151915291503f14155f610a14565b7f38e9854f45420e983b7e429772e6c0fd3b6ce0327d22f09593d9be5de7c78b4e91503f14155f6109e1565b7f4b79b5c8aee6da0f7b393e8b53e6265ef7320a1d16184c65bd3841b5aa3d700d91503f14155f6109af565b7f1ba19c78683fcdca321006b491961704038a75d8bae969d4ac7eb363987a4bc991503f14155f61097d565b7f0c809a6af46fb81e31c079263cf6889f1002eb4a3d71508d1cfa0f1fdccd709c91503f14155f61094b565b7f4b7d19bb5a7437581d6359ce496b9b25ef6971ca8776bfc56fb515d8e92edc5191503f14155f610919565b7f785f1014552b7ce7d5fb7d0c970ca60edee94fd00425d7ca21609acac7ce129391503f14155f6108e7565b90506020813d60201161136f575b8161136060209383612dda565b8101031261100857515f6108b8565b3d9150611353565b90506020813d6020116113a1575b8161139260209383612dda565b8101031261100857515f610886565b3d9150611385565b63e3cd239f60e01b5f5260045ffd5b5060405163141b84eb60e31b81526020816004816001600160a01b0389165afa8015611014575f906113f2575b620151809150141561084f565b506020813d60201161141f575b8161140c60209383612dda565b81010312611008576201518090516113e5565b3d91506113ff565b506040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f916114cd575b506101208701516040516315e5a1e560e01b815290602090829060049082906001600160a01b03165afa908115611014575f9161149e575b506001600160401b03161415610848565b6114c0915060203d6020116114c6575b6114b88183612dda565b810190612e1f565b5f61148d565b503d6114ae565b90506020813d6020116114f7575b816114e860209383612dda565b8101031261100857515f611455565b3d91506114db565b50604051637f5a7c7b60e01b81526020816004816001600160a01b0389165afa908115611014575f916115b3575b506060870151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f91611579575b506001600160a01b0391821691161415610841565b90506020813d6020116115ab575b8161159460209383612dda565b81010312611008576115a590612dfd565b5f611564565b3d9150611587565b90506020813d6020116115e5575b816115ce60209383612dda565b81010312611008576115df90612dfd565b5f61152d565b3d91506115c1565b5060405163fb73056b60e01b81526020816004816001600160a01b0389165afa908115611014575f91611635575b5060208701516001600160a01b039182169116141561083a565b90506020813d602011611667575b8161165060209383612dda565b810103126110085761166190612dfd565b5f61161b565b3d9150611643565b5060405163dc4c90d360e01b81526020816004816001600160a01b0389165afa908115611014575f916116b4575b5086516001600160a01b0391821691161415610833565b90506020813d6020116116e6575b816116cf60209383612dda565b81010312611008576116e090612dfd565b5f61169d565b3d91506116c2565b50604051633ef0f29b60e11b81526020816004816001600160a01b0389165afa908115611014575f91611737575b506101208701516001600160a01b039182169116141561082c565b90506020813d602011611771575b8161175260209383612dda565b8101031261100857516001600160a01b0381168103611008575f61171c565b3d9150611745565b63def9077360e01b5f5260045ffd5b50604051637e062a3560e11b81526020816004816001600160a01b038c165afa908115611014575f9161183c575b506060890151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f91611802575b506001600160a01b0391821691161415610807565b90506020813d602011611834575b8161181d60209383612dda565b810103126110085761182e90612dfd565b5f6117ed565b3d9150611810565b90506020813d60201161186e575b8161185760209383612dda565b810103126110085761186890612dfd565b5f6117b6565b3d915061184a565b50604051637f5a7c7b60e01b81526020816004816001600160a01b038c165afa908115611014575f9161192a575b506060890151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f916118f0575b506001600160a01b0391821691161415610800565b90506020813d602011611922575b8161190b60209383612dda565b810103126110085761191c90612dfd565b5f6118db565b3d91506118fe565b90506020813d60201161195c575b8161194560209383612dda565b810103126110085761195690612dfd565b5f6118a4565b3d9150611938565b5060405163b753bfe960e01b81526020816004816001600160a01b038c165afa908115611014575f916119ac575b5060608901516001600160a01b03918216911614156107f9565b90506020813d6020116119de575b816119c760209383612dda565b81010312611008576119d890612dfd565b5f611992565b3d91506119ba565b5060405163dc4c90d360e01b81526020816004816001600160a01b038c165afa908115611014575f91611a2b575b5088516001600160a01b03918216911614156107f2565b90506020813d602011611a5d575b81611a4660209383612dda565b8101031261100857611a5790612dfd565b5f611a14565b3d9150611a39565b63c68f824960e01b5f5260045ffd5b5060405163fb73056b60e01b81526020816004816001600160a01b0389165afa908115611014575f91611abc575b5060208901516001600160a01b03918216911614156107d5565b90506020813d602011611aee575b81611ad760209383612dda565b8101031261100857611ae890612dfd565b5f611aa2565b3d9150611aca565b5060405163141b84eb60e31b81526020816004816001600160a01b0389165afa80156110145783915f91611b2d575b5014156107ce565b9150506020813d602011611b5a575b81611b4960209383612dda565b81010312611008578290515f611b25565b3d9150611b3c565b50620151808214156107c7565b50426001600160401b038216116107c0565b506040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f91611bc1575b506001600160401b03821614156107b9565b90506020813d602011611beb575b81611bdc60209383612dda565b8101031261100857515f611baf565b3d9150611bcf565b604051631f06e1a760e11b815291506020826004816001600160a01b038a165afa918215611014575f92611c2f575b5060a0902014155f6107b1565b9091506020813d602011611c5c575b81611c4b60209383612dda565b8101031261100857519060a0611c22565b3d9150611c3e565b604051637f5a7c7b60e01b81529091506020816004816001600160a01b038a165afa908115611014575f91611d1b575b5060608a0151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f91611ce1575b506001600160a01b0391821691161415906107aa565b90506020813d602011611d13575b81611cfc60209383612dda565b8101031261100857611d0d90612dfd565b5f611ccb565b3d9150611cef565b90506020813d602011611d4d575b81611d3660209383612dda565b8101031261100857611d4790612dfd565b5f611c94565b3d9150611d29565b604051631e46e62f60e21b81529091506020816004816001600160a01b038a165afa908115611014575f91611e01575b5060608a0151604051631e46e62f60e21b815290602090829060049082906001600160a01b03165afa908115611014575f91611dd2575b506001600160a01b0391821691161415906107a3565b611df4915060203d602011611dfa575b611dec8183612dda565b810190612e3e565b5f611dbc565b503d611de2565b611e1a915060203d602011611dfa57611dec8183612dda565b5f611d85565b60405163dc4c90d360e01b81529091506020816004816001600160a01b038a165afa908115611014575f91611e68575b5089516001600160a01b03918216911614159061079c565b90506020813d602011611e9a575b81611e8360209383612dda565b8101031261100857611e9490612dfd565b5f611e50565b3d9150611e76565b9092506020813d602011611ece575b81611ebe60209383612dda565b810103126110085751915f610787565b3d9150611eb1565b611ef091925060203d6020116114c6576114b88183612dda565b905f610751565b90506020833d602011611f2b575b81611f1260209383612dda565b8101031261100857611f25600493612dfd565b906106e1565b3d9150611f05565b506020813d602011611f65575b81611f4d60209383612dda565b8101031261100857611f60600491612dfd565b6106a4565b3d9150611f40565b90506020813d602011611f9f575b81611f8860209383612dda565b8101031261100857611f9990612dfd565b5f61066a565b3d9150611f7b565b90506020813d602011611fd9575b81611fc260209383612dda565b8101031261100857611fd390612dfd565b5f61062c565b3d9150611fb5565b63f92ee8a960e01b5f5260045ffd5b506040516334324e9f60e21b81526020816004816001600160a01b0386165afa908115611014575f91612033575b5061016087015160020b9060020b14156105ec565b90506020813d602011612065575b8161204e60209383612dda565b810103126110085761205f90612e11565b5f61201e565b3d9150612041565b50604051637f5a7c7b60e01b81526020816004816001600160a01b0386165afa908115611014575f91612121575b506060870151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f916120e7575b506001600160a01b03918216911614156105e5565b90506020813d602011612119575b8161210260209383612dda565b810103126110085761211390612dfd565b5f6120d2565b3d91506120f5565b90506020813d602011612153575b8161213c60209383612dda565b810103126110085761214d90612dfd565b5f61209b565b3d915061212f565b50604051637e062a3560e11b81526020816004816001600160a01b0386165afa908115611014575f9161220f575b506060870151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f916121d5575b506001600160a01b03918216911614156105de565b90506020813d602011612207575b816121f060209383612dda565b810103126110085761220190612dfd565b5f6121c0565b3d91506121e3565b612228915060203d602011611dfa57611dec8183612dda565b5f612189565b90506020813d602011612260575b8161224960209383612dda565b810103126110085761225a90612dfd565b5f6105c5565b3d915061223c565b5060405163d1ad17bf60e01b81526020816004816001600160a01b0386165afa908115611014575f916122a6575b506001600160a01b031615610588565b90506020813d6020116122d8575b816122c160209383612dda565b81010312611008576122d290612dfd565b5f612296565b3d91506122b4565b604051631f06e1a760e11b81529250602090839060049082905afa918215611014575f92612317575b5060a0902014155f8061057f565b9091506020813d602011612344575b8161233360209383612dda565b8101031261100857519060a0612309565b3d9150612326565b6040516306f4f6fb60e31b815291935090602081600481875afa908115611014575f91612387575b506001600160a01b03161415915f610577565b90506020813d6020116123b9575b816123a260209383612dda565b81010312611008576123b390612dfd565b5f612374565b3d9150612395565b604051637e062a3560e11b8152919450602082600481865afa918215611014575f92612460575b50602060049160405192838092637e062a3560e11b82525afa908115611014575f91612426575b506001600160a01b0391821691161415925f61056f565b90506020813d602011612458575b8161244160209383612dda565b810103126110085761245290612dfd565b5f61240f565b3d9150612434565b9091506020813d60201161249d575b8161247c60209383612dda565b8101031261100857516001600160a01b0381168103611008579060206123e8565b3d915061246f565b90506020813d6020116124d7575b816124c060209383612dda565b81010312611008576124d190612dfd565b5f61055b565b3d91506124b3565b9091506020813d602011612513575b816124fb60209383612dda565b810103126110085761250c90612dfd565b905f6104fb565b3d91506124ee565b9094506020813d60201161254f575b8161253760209383612dda565b810103126110085761254890612dfd565b935f6104d5565b3d915061252a565b90506020813d602011612591575b8161257260209383612dda565b8101031261100857516001600160a01b0381168103611008575f6104a1565b3d9150612565565b90506020813d6020116125c3575b816125b460209383612dda565b8101031261100857515f61046f565b3d91506125a7565b6125e29150833d85116114c6576114b88183612dda565b5f61043f565b5060405163dc4c90d360e01b81526020816004816001600160a01b0386165afa80156110145784915f91612628575b506001600160a01b031614156103fd565b9150506020813d60201161265c575b8161264460209383612dda565b81010312611008576126568491612dfd565b5f612617565b3d9150612637565b50604051637e062a3560e11b81526020816004816001600160a01b0386165afa908115611014575f91612706575b50604051637e062a3560e11b81526020816004818a5afa908115611014575f916126cc575b506001600160a01b03918216911614156103f6565b90506020813d6020116126fe575b816126e760209383612dda565b81010312611008576126f890612dfd565b5f6126b7565b3d91506126da565b61271f915060203d602011611dfa57611dec8183612dda565b5f612692565b90506020813d602011612757575b8161274060209383612dda565b810103126110085761275190612dfd565b5f6103df565b3d9150612733565b90506020813d602011612791575b8161277a60209383612dda565b810103126110085761278b90612dfd565b5f6103ba565b3d915061276d565b90506020813d6020116127cb575b816127b460209383612dda565b81010312611008576127c590612dfd565b5f610360565b3d91506127a7565b50604051638009b7bd60e01b81526020816004816001600160a01b0386165afa80156110145787915f91612813575b506001600160a01b03161415610338565b9150506020813d602011612850575b8161282f60209383612dda565b8101031261100857516001600160a01b03811681036110085786905f612802565b3d9150612822565b50604051637ce73d6760e01b81526020816004816001600160a01b0386165afa80156110145783915f91612898575b506001600160a01b03161415610331565b9150506020813d6020116128cc575b816128b460209383612dda565b81010312611008576128c68391612dfd565b5f612887565b3d91506128a7565b5060405163b753bfe960e01b81526020816004816001600160a01b0386165afa8015611014578a915f91612914575b506001600160a01b0316141561032a565b9150506020813d602011612948575b8161293060209383612dda565b81010312611008576129428a91612dfd565b5f612903565b3d9150612923565b5060405163dc4c90d360e01b81526020816004816001600160a01b0386165afa80156110145788915f91612990575b506001600160a01b03161415610323565b9150506020813d6020116129c4575b816129ac60209383612dda565b81010312611008576129be8891612dfd565b5f61297f565b3d915061299f565b90506020813d6020116129fe575b816129e760209383612dda565b81010312611008576129f890612dfd565b5f61030c565b3d91506129da565b90506020813d602011612a38575b81612a2160209383612dda565b8101031261100857612a3290612dfd565b5f6102e7565b3d9150612a14565b50604051637e062a3560e11b8152602081600481865afa908115611014575f91612ad9575b50604051637e062a3560e11b81526020816004818e5afa908115611014575f91612a9f575b506001600160a01b03918216911614156102b6565b90506020813d602011612ad1575b81612aba60209383612dda565b8101031261100857612acb90612dfd565b5f612a8a565b3d9150612aad565b90506020813d602011612b0b575b81612af460209383612dda565b8101031261100857612b0590612dfd565b5f612a65565b3d9150612ae7565b50604051637f5a7c7b60e01b8152602081600481865afa908115611014575f91612bac575b50604051637f5a7c7b60e01b81526020816004818e5afa908115611014575f91612b72575b506001600160a01b03918216911614156102af565b90506020813d602011612ba4575b81612b8d60209383612dda565b8101031261100857612b9e90612dfd565b5f612b5d565b3d9150612b80565b90506020813d602011612bde575b81612bc760209383612dda565b8101031261100857612bd890612dfd565b5f612b38565b3d9150612bba565b9150506020813d602011612c1a575b81612c0260209383612dda565b8101031261100857612c148891612dfd565b5f61029c565b3d9150612bf5565b5060405163313ce56760e01b81526020816004818a5afa908115611014575f91612c54575b5060ff1660081415610273565b90506020813d602011612c89575b81612c6f60209383612dda565b81010312611008575160ff811681036110085760ff612c47565b3d9150612c62565b9150506020813d602011612cc5575b81612cad60209383612dda565b8101031261100857612cbf8891612dfd565b5f610260565b3d9150612ca0565b5060405163dc4c90d360e01b81526020816004816001600160a01b0389165afa80156110145788915f91612d0d575b506001600160a01b03161415610237565b9150506020813d602011612d41575b81612d2960209383612dda565b8101031261100857612d3b8891612dfd565b5f612cfc565b3d9150612d1c565b9150506020813d602011612d7d575b81612d6560209383612dda565b8101031261100857612d778891612dfd565b5f610224565b3d9150612d58565b6383efa26f60e01b5f5260045ffd5b5081156101f0565b63bc12814760e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b03821117612dab57604052565b601f909101601f19168101906001600160401b03821190821017612dab57604052565b51906001600160a01b038216820361100857565b51908160020b820361100857565b9081602091031261100857516001600160401b03811681036110085790565b9081602091031261100857516001600160a01b0381168103611008579056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b63029a949d60e31b5f5260045ffd5b5f905f3560e01c90816303195cd01461322457508063034e7c47146131d257806305ca342f146131b857806306b7cb9c146122aa578063070fd029146131825780630c7621411461313e5780630e635186146130ff57806310e3c7a7146130e5578063154e1e3f146130ab5780631be052891461308f57806321bdc0d914612f8f57806321d0ee7014612f3857806324048ba114612ef457806324f159c214612eb0578063259982e514612e59578063263cef3c14612e3c57806328accf0914612d91578063293b1c6a146129b2578063375880651461296e5780633923411c146128de5780633bd1325114612847578063402573711461282b578063428a63411461279457806346158ffc1461270c57806346904840146126d8578063470d5fe61461267257806347ccca021461262e57806348e732771461261257806352bf8c27146125f557806354b4bf3914612558578063575e24b4146122e1578063638b12a0146122c7578063690422b2146122aa5780636b9cdad6146122665780636c2bbe7e146122095780636e5dbe86146121ea5780636f2c590a146121d05780636fe7e6eb1461208657806377e70a4b1461206a578063780d3cfe14611eb35780637cc4353b14611e015780637ce73d6714611dbc5780637d73714d14611d975780638009b7bd14611d525780638c2d6cf414611d37578063906f349114611cc357806391dd734614611c3c57806399b5598314611c015780639b75f7c814611be45780639f063efc14611b83578063a53e541214611b66578063a64e13a1146119eb578063af102658146119b0578063b47b2fb1146113a8578063b6a8b0fa1461134f578063b753bfe91461130a578063b827bbe0146112c5578063bb8b353c146112aa578063bbc2520d1461128f578063c269a3e214611267578063c314876d146111e7578063c4408c8a146111a2578063c79d2dfc14610cfe578063ce1b1d4314610cb9578063cffe289e14610c6a578063d16f715814610c25578063d25eae2514610bdc578063dc4c90d314610b97578063dc98354e14610960578063dd6b5e8e14610944578063df4fe917146105e1578063e1b4af6914610579578063e3b3904014610477578063eaf334761461045a578063fb26015f1461043e578063fb73056b146103f95763ffa800820361000f57346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f657602090604051908152f35b50346103f657806003193601126103f65760206040516105dc8152f35b50346103f657806003193601126103f6577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26654604051627eeac760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291821660248201529190602090839060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa90811561056d5790610536575b602090604051908152f35b506020813d602011610565575b8161055060209383613403565b81010312610561576020905161052b565b5f80fd5b3d9150610543565b604051903d90823e3d90fd5b50346103f657610588366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d29150505760405163e1b4af6960e01b8152602090f35b63570c108560e11b8152600490fd5b50346103f65760803660031901126103f6576105fb61323d565b610603613253565b90604435918260020b91828403610940576064356001600160a01b038116939084900361093c57307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316149086908215610908575b82156108f6575b82156108be575b82156108b4575b82156108a9575b505080156108a1575b610892577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26580546001600160a01b039283166001600160a01b0319918216179091557f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2668054939092169216821790555f80516020615d50833981519152805460a09490941b62ffffff60a01b166001600160b81b03199094169390931791909117909155604051638da5cb5b60e01b815290602090829060049082905afa908115610887578291610849575b505f80516020615d7083398151915280546001600160a01b0319166001600160a01b03929092169182179055801590811561079e575b5061078f5780f35b63f92ee8a960e01b8152600490fd5b60405163017d862f60e11b81529091506020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391610800575b506001600160a01b031614155f610787565b90506020813d602011610836575b8161081b60209383613403565b810103126108325761082c906134b5565b5f6107ee565b8280fd5b3d915061080e565b6040513d85823e3d90fd5b90506020813d60201161087f575b8161086460209383613403565b8101031261087b57610875906134b5565b5f610751565b5080fd5b3d9150610857565b6040513d84823e3d90fd5b63f92ee8a960e01b8552600485fd5b508215610685565b13159050855f61067c565b843b159250610675565b6001600160a01b038581167f00000000000000000000000000000000000000000000000000000000000000009091161415925061066e565b6001600160a01b038416159250610667565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b031615159250610660565b8580fd5b8480fd5b50346103f657806003193601126103f657602060405160018152f35b50346103f65760e03660031901126103f65761097a61323d565b60a036602319011261087b5761098e613362565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610b88577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b03168015928315610b6c575b8315610b58575b50508115610b3d575b8115610af6575b8115610ac7575b8115610aa7575b8115610a82575b8115610a5c575b5061078f575f80516020615d50833981519152805460ff60b81b1916600160b81b179055604051636e4c1aa760e11b8152602090f35b5f80516020615d50833981519152546001600160a01b039182169116141590505f610a26565b905060a4356001600160a01b03811690818103610aa3575030141590610a1f565b8380fd5b905060643562ffffff8116808203610aa357628000009150141590610a18565b90506084358060020b90818103610aa357505f80516020615d508339815191525460a01c60020b141590610a11565b90506001600160a01b03610b08613579565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e266546001600160a01b03169116141590610a0a565b90506001600160a01b03610b4f61358f565b16151590610a03565b6001600160a01b0316141591505f806109fa565b5f80516020615d508339815191525460b81c60ff1693506109f3565b63570c108560e11b8352600483fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657600435906001600160401b0382116103f6576101e060031983360301126103f6576020610c1d83600401614474565b604051908152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65760407f2f9e2e20558dbba26f6943f9568ee8724ef17057d8dd3fe037dadf2bb9691382546001600160401b038251918181168352831c166020820152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760403660031901126103f6576004356001600160401b03811161087b57806004016101e06003198336030112610832576024356001600160401b038111610aa357610d53903690600401613269565b929046602483013514801590611174575b801561115b575b8015611142575b8015611127575b801561110c575b80156110f2575b80156110d8575b80156110cf575b80156110c2575b80156110a3575b8015611083575b8015611055575b801561101f575b611010576020610dcb60848401856143c9565b908092918101031261093c5735938460011c9182158015610ff2575b8015610fe0575b610fd1576001600160401b035f80516020615d108339815191525416831115610fc257610e3c91610e2d610e3392610e2588614474565b92369161443e565b90615b73565b90929192615bad565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603610fb357916001600160401b03606092846101c483610ea97f83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b898613529565b1692018284610eb78361440a565b1610610f9f575b50821682195f80516020615d108339815191525416175f80516020615d10833981519152555f80516020615d108339815191525467ffffffffffffffff60401b8260401b169067ffffffffffffffff60401b1916175f80516020615d1083398151915255815f80516020615d10833981519152549660018060ff60801b92161460801b1660ff60801b1988161793845f80516020615d10833981519152553596877ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e5560ff6040519560801c1615158552166020840152166040820152a280f35b83919250610fac9061440a565b9190610ebe565b63027737d360e31b8552600485fd5b6319b5ff4d60e31b8752600487fd5b6383efa26f60e01b8752600487fd5b50610fea83613529565b421015610dee565b506001600160401b036110086101a4860161440a565b168311610de7565b6383efa26f60e01b8552600485fd5b506154606001600160401b0361104e61103b6101c4860161440a565b6110486101a4870161440a565b9061441e565b1611610db8565b506110636101c4830161440a565b6001600160401b03806110796101a4860161440a565b1691161115610db1565b506110916101c4830161440a565b6001600160401b034291161115610daa565b506110b16101a4830161440a565b6001600160401b0342911611610da3565b5061012482013515610d9c565b50823515610d95565b50600561ffff6110eb61018485016143fb565b1611610d8e565b50600461ffff61110561018485016143fb565b1610610d87565b50600461ffff61111f61016485016143fb565b161415610d80565b50600561ffff61113a61014485016143fb565b161415610d79565b50602061115260848401856143c9565b90501415610d72565b50600360ff61116c606485016143bb565b161415610d6b565b507f000000000000000000000000000000000000000000000000000000000000000060448301351415610d64565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65762ffffff6112046135a5565b166148440362ffffff81116112535762ffffff80611220614265565b169116039062ffffff821161123f5760208262ffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b50346103f657806003193601126103f6576020611282614265565b62ffffff60405191168152f35b50346103f657806003193601126103f6576020610c1d61420a565b50346103f657806003193601126103f65760206112826141c9565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65761135e366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d291505057604051635b54587d60e11b8152602090f35b50346103f6576101603660031901126103f6576113c361323d565b60a036602319011261087b5760603660c319011261087b576101243591610144356001600160401b03811161087b57611400903690600401613269565b90937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036119a15761143d614a2f565b839460e435928584129384159081611991575b81611983575b50611974578260801d600f0b918683125f1461196d57611475836136bf565b945b61147f614b6f565b156119145761148c614b87565b811561190557620f42406114a76114a1614854565b836136ac565b04965b8783156118f4576114bb9083613545565b80915b036118e55782156118de57505b925b7f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395c6114f761356a565b156118cf57602061150661358f565b604051634bf466a760e11b81526001600160a01b03909116600482015292839060249082905afa80156118c4578a90611890575b6115449250613545565b61154c61356a565b156117a85761155b9087613538565b620249f08402848104620249f0148515171561179457620f42409004106117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956915b6115ab8886614e42565b60a06040518160248237209360018060a01b031697889560405192835260208301526040820152a36115db61479e565b5f80516020615d908339815191525c6001600160a01b0316908161167a575b60408787805f80516020615db08339815191525d805f80516020615d908339815191525d807f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d81519063b47b2fb160e01b8252600f0b6020820152f35b85977f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef9695965c7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05c61170060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016936116f861356a565b9a369161443e565b6020815191012091833b15611781576101049689956040519b8c9a8b996321b0221b60e11b8b5260048b015260248a0152151560448901526064880152600f0b608487015260a486015260c485015260e48401525af1801561083e5761176c575b8080808086946115fa565b611777838092613403565b61087b575f611761565b8880fd5b637478d45560e11b8852600488fd5b634e487b7160e01b8a52601160045260248afd5b6117b486600f0b6136bf565b90620249f08202828104620249f0148315171561187c57620f4240810482118015611873575b61186457620f4240820290828204620f4240148315171561185057926118146118209361180e61181a94620f424097613545565b92613545565b9061368e565b856136ac565b0486116117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956916115a1565b634e487b7160e01b8c52601160045260248cfd5b637478d45560e11b8b5260048bfd5b508282146117da565b634e487b7160e01b8b52601160045260248bfd5b506020823d6020116118bc575b816118aa60209383613403565b8101031261056157611544915161153a565b3d915061189d565b6040513d8c823e3d90fd5b60206118d9613579565b611506565b90506114cb565b6337e83fd360e21b8a5260048afd5b6118fe9083613538565b80916114be565b61190e81614dee565b966114aa565b919750811561195e57620f424061193261192c614854565b876136ac565b04915b61194a839684835f1461195057505b93614bc5565b986114cd565b61195991613538565b611944565b61196785614dee565b91611935565b8294611477565b63153f6ec760e21b8652600486fd5b905083600f0b14155f611456565b905061199b61356a565b90611450565b63570c108560e11b8452600484fd5b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f657806003193601126103f6577337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590611b48575b8015611b25575b8015611b14575b611b05576001600160401b0342166001600160401b03195f80516020615d308339815191525416175f80516020615d30833981519152556201518042018042116112535767ffffffffffffffff60401b805f80516020615d30833981519152549260401b16169067ffffffffffffffff60401b1916175f80516020615d30833981519152557fe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc60605f80516020615d30833981519152546001600160401b0360405191818116835260401c16602082015260026040820152a180f35b635c06dcc560e01b8152600490fd5b5067fffffffffffeae7f4211611a29565b506001600160401b035f80516020615d308339815191525460401c161515611a22565b50731f22e4b065b2f15fed5be556dc0fa636048d29bc331415611a1b565b50346103f657806003193601126103f65760206040516170808152f35b50346103f657611b92366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506105d29250505057604080516327c18fbf60e21b8152602081019290925290f35b50346103f657806003193601126103f65760206040516107d08152f35b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f65760203660031901126103f6576004356001600160401b03811161087b57611c6d903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105d257611cbf611cab8484613fde565b604051918291602083526020830190613388565b0390f35b50346103f657806003193601126103f657608090611cdf614be6565b908115611d325750611cf7611cf2614c31565b614cce565b50505b5f80516020615e3083398151915254916001600160401b0360405193818116855260401c166020840152151560408301526060820152f35b611cfa565b50346103f657806003193601126103f6576020610c1d613ef1565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657611db9611db461323d565b6136cf565b80f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f6575f80516020615d70833981519152546001600160a01b03163303611ea457807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15611ea15781809160246040518094819363728b658960e01b835260043560048401525af1801561088757611e905750f35b81611e9a91613403565b6103f65780f35b50fd5b631d713add60e21b8152600490fd5b50346103f65760803660031901126103f6576004356001600160801b03811680910361087b5760405163cb2af14b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391612030575b506001600160a01b031633036120215781611f9491604051906002602083015260408201526024356060820152604435608082015260643560a082015260a08152611f7260c082613403565b604051809381926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610887578291611fff575b5060208180518101031261087b57602001516001600160801b03811680910361087b57602090610c1d61479e565b61201b91503d8084833e6120138183613403565b810190613453565b5f611fd1565b631d713add60e21b8252600482fd5b90506020813d602011612062575b8161204b60209383613403565b810103126108325761205c906134b5565b5f611f26565b3d915061203e565b50346103f657806003193601126103f6576020604051600c8152f35b3461056157610100366003190112610561576120a061323d565b5060a0366023190112610561576120b5613362565b506120be613378565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338190036121c157803b1561056157604051635275965160e01b8152906001600160a01b03612116613253565b1660048301526044356001600160a01b0381169081900361056157602483015260643562ffffff81168091036105615760448301526084358060020b80910361056157606483015260a4356001600160a01b03811691908290036105615760c4835f8193819560848401528160a48401525af180156121b6576121a6575b604051636fe7e6eb60e01b8152602090f35b5f6121b091613403565b5f612194565b6040513d5f823e3d90fd5b63570c108560e11b5f5260045ffd5b34610561575f366003190112610561576020611282613633565b34610561575f366003190112610561576339cbe26160e21b5f5260045ffd5b3461056157612217366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506121c1925050505760408051633615df3f60e11b81525f6020820152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576020604051620249f08152f35b34610561575f3660031901126105615760206112826135a5565b3461056157610140366003190112610561576122fb61323d565b60a03660231901126105615760603660c319011261056157610124356001600160401b03811161056157612333903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190338390036121c157604090612373614a2f565b61237b61356a565b9061239f60e43596879585519687958695638e88a1f160e01b8752600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f91612527575b505f80516020615db08339815191525d5f80516020615d908339815191525d61240361356a565b1561251857602061241261358f565b604051634bf466a760e11b81526001600160a01b03909116600482015291829060249082905afa9081156121b6575f916124e5575b50606091612486917f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395d5f9061247b614b6f565b6124a7575b50614bc5565b60801b604051906315d7892d60e21b82526020820152624000006040820152f35b90505f6124b2614b87565b9112156124d7576124cf620f4240916124c9614854565b906136ac565b045b83612480565b6124e090614dee565b6124d1565b90506020813d602011612510575b8161250060209383613403565b8101031261056157516060612447565b3d91506124f3565b6020612522613579565b612412565b905061254b915060403d604011612551575b6125438183613403565b8101906134c9565b846123dc565b503d612539565b34610561575f3660031901126105615760805f80516020615d10833981519152546001600160401b038160401c1690814210155f146125da575f915b6001600160401b037ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e549260ff6040519516855216602084015260408301526060820152f35b80831c60ff16156125ee5760025b91612594565b60016125e8565b34610561575f366003190112610561576020604051620151808152f35b34610561575f3660031901126105615760206040516101f48152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f36600319011261056157604051632386aff360e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061053657602090604051908152f35b34610561575f366003190112610561575f80516020615d70833981519152546040516001600160a01b039091168152602090f35b34610561575f3660031901126105615760408051630f77314d60e31b815290816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061277257602090604051908152f35b506040813d60401161278c575b8161055060409383613403565b3d915061277f565b34610561575f3660031901126105615760405163428a634160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6576020915f916127fe575b506040519015158152f35b61281e9150823d8411612824575b6128168183613403565b810190613552565b826127f3565b503d61280c565b34610561575f3660031901126105615760206040516154608152f35b34610561575f36600319011261056157604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa80156121b6575f9061053657602090604051908152f35b34610561575f36600319011261056157604080515f6020820181905233828401529181526129129190611f72606082613403565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156121b657612956575b61295461479e565b005b612969903d805f833e6120138183613403565b61294c565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561576060366003190112610561576004356044356129e26129d461420a565b6129dc613ef1565b90613538565b90804211908115612d67575b508015612d5f575b8015612d57575b8015612d4c575b612d3d576040516318160ddd60e01b8152907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083600481845afa9283156121b6575f93612d09575b506040516370a0823160e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004820181905292909190602083602481855afa9283156121b6575f93612cd3575b5060408051600160208201523391810191909152612b0591905f90612ae381606081015b03601f198101835282613403565b604051809481926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156121b657612b6792612b5f92612cbb575b50612b5161479e565b612b5961420a565b90613545565b612b59613ef1565b936040516318160ddd60e01b8152602081600481865afa9081156121b6575f91612c88575b50612b9990602092613545565b936024604051809481936370a0823160e01b835260048301525afa9081156121b6575f91612c54575b50612bd090612bd593613538565b613545565b918115908115612c4b575b8115612c38575b50612c29576040917f0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3838051848152836020820152a182519182526020820152f35b63873d73a960e01b5f5260045ffd5b9050612c448284614895565b1083612be7565b83159150612be0565b90506020813d602011612c80575b81612c6f60209383613403565b810103126105615751612bd5612bc2565b3d9150612c62565b90506020813d602011612cb3575b81612ca360209383613403565b8101031261056157516020612b8c565b3d9150612c96565b612cce903d805f833e6120138183613403565b612b48565b9092506020813d602011612d01575b81612cef60209383613403565b81010312610561575191612b05612ab1565b3d9150612ce2565b9092506020813d602011612d35575b81612d2560209383613403565b8101031261056157519184612a57565b3d9150612d18565b6333b094a160e01b5f5260045ffd5b506024358111612a04565b5080156129fd565b5081156129f6565b905061012c420190814211612d7d5711836129ee565b634e487b7160e01b5f52601160045260245ffd5b34610561575f366003190112610561576040516319b400eb60e21b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90612e02575b6040516001600160a01b039091168152602090f35b506020813d602011612e34575b81612e1c60209383613403565b8101031261056157612e2f6020916134b5565b612ded565b3d9150612e0f565b34610561575f366003190112610561576020604051620493e08152f35b3461056157612e6736613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163259982e560e01b8152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461056157612f4636613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163021d0ee760e41b8152602090f35b3461056157608036600319011261056157612fa861323d565b60243590811515820361056157606435906001600160401b03821161056157612ffc92612fdb6040933690600401613269565b8451638e88a1f160e01b8152958694859491939160443591600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f9161306e575b5062ffffff5f199116019062ffffff8211612d7d57604080516001600160a01b03909216825262ffffff929092166020820152f35b9050613089915060403d604011612551576125438183613403565b82613039565b34610561575f36600319011261056157602060405161a8c08152f35b34610561575f3660031901126105615760206040517f43c032f18f863bf5301f80e8812396bc62519b9c402f07184c2255d30d84788f8152f35b34610561575f366003190112610561576020610c1d614854565b34610561575f3660031901126105615730330361004c57604051630321f11f60e21b60208201526004815261295490613139602482613403565b61480d565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f3660031901126105615760408051600160208201523391810191909152612912905f90611f728160608101612ad5565b34610561575f3660031901126105615760206040515f8152f35b34610561575f3660031901126105615760605f80516020615d3083398151915254600262ffffff613201613633565b16146001600160401b0360405192818116845260401c1660208301526040820152f35b34610561575f3660031901126105615780600160209252f35b600435906001600160a01b038216820361056157565b602435906001600160a01b038216820361056157565b9181601f84011215610561578235916001600160401b038311610561576020838186019501011161056157565b90610160600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c49161014435906001600160401b038211610561576132f591600401613269565b9091565b906101a0600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c4916101443591610164359161018435906001600160401b038211610561576132f591600401613269565b60c435906001600160a01b038216820361056157565b60e435908160020b820361056157565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b610120600319820112610561576004356001600160a01b0381168103610561579160a06023198301126105615760249160c4359160e4359161010435906001600160401b038211610561576132f591600401613269565b90601f801991011681019081106001600160401b0382111761342457604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161342457601f01601f191660200190565b602081830312610561578051906001600160401b038211610561570181601f820112156105615780519061348682613438565b926134946040519485613403565b8284526020838301011161056157815f9260208093018386015e8301015290565b51906001600160a01b038216820361056157565b91908260409103126105615760206134e0836134b5565b92015190565b93909285939260a09693600180891b0316865215156020860152604085015260806060850152816080850152848401375f828201840152601f01601f1916010190565b906154608201809211612d7d57565b91908201809211612d7d57565b91908203918211612d7d57565b90816020910312610561575180151581036105615790565b60c43580151581036105615790565b6044356001600160a01b03811681036105615790565b6024356001600160a01b03811681036105615790565b604051630abb87c960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613601575b506135fb575f90565b6107d090565b90506020813d60201161362b575b8161361c60209383613403565b8101031261056157515f6135f2565b3d915061360f565b5f80516020615d30833981519152546001600160401b038160401c16801515918261367a575b5081613670575b501561366b57600290565b600190565b905042105f613660565b6001600160401b031642101591505f613659565b8115613698570490565b634e487b7160e01b5f52601260045260245ffd5b81810292918115918404141715612d7d57565b600160ff1b8114612d7d575f0390565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590613ed3575b613ec4575f6136fb614be6565b15613e855761370b611cf2614c31565b82939291845f80516020615e70833981519152557ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b2555f80516020615e3083398151915254906001600160401b0360c01b9060c01b16906001600160801b036001600160401b0360801b4260801b16911617175f80516020615e30833981519152556040519360a085018581106001600160401b03821117613424576040525f85526020850194731b54e762aa34cf6e28e9c082f2848e28e45da6b88652604081019562800000875260608201966001885260808301977337bfb8ac7c960e558657871d41ca70e07e7dbfff895261380560a08520614e1c565b60038101809111612d7d5760405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa80156121b6575f90613e4c575b6001600160801b039150169780158015613e44575b613de15761386d60a08620614e1c565b60405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91613e12575b506401000276a4996001600160a01b039190911691908a831115613e04576138d08360649261492c565b04809111613dfc575b5060016001607f1b038711613ded575b8615613de1576103e38102908082046103e31490151715612d7d576103e890046001600160a01b0316976401000276a3891115613dd9575b506e04444c5dc75cb358380d2e3de08a903b1561056157604051637a94c56560e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201528660448201525f81606481836e04444c5dc75cb358380d2e3de08a905af180156121b657613dc4575b50613998866136bf565b91604051606081018181106001600160401b03821117613db05760409081526001825260208083019586526001600160a01b03909b1682820190815290518b9590926139e48785613403565b8b8452604051633cf3645360e21b815289516001600160a01b039081166004830152895181166024830152955162ffffff166044820152955160020b60648701529c51841660848601529b51151560a48501529a5160c484015299511660e48201526101206101048201529788908190613a6390610124830190613388565b0381885a6e04444c5dc75cb358380d2e3de08a9090f1968715613cc2578597613d81575b506001600160801b03613a9f8860801d600f0b6136bf565b97169387818110613ce2575b613ac491505f80516020615e7083398151915254613545565b5f80516020615e708339815191525583613bd2575b5060a09020604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff600482015260248101859052909480826044816e04444c5dc75cb358380d2e3de08a905afa94851561056d5794613b80575b5050604080519586526020860192909252908401919091526001600160a01b0316917f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e9080606081015b0390a3565b90809450813d8311613bcb575b613b978183613403565b8101031261056157613b7b7f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e935193613b31565b503d613b8d565b516001600160a01b03166e04444c5dc75cb358380d2e3de08a903b156109405760405190630b0d9c0960e01b825260048201527337bfb8ac7c960e558657871d41ca70e07e7dbfff60248201528360448201528481606481836e04444c5dc75cb358380d2e3de08a905af18015613cc257908591613ccd575b5050731b54e762aa34cf6e28e9c082f2848e28e45da6b83b15610aa357604051630852cd8d60e31b815260048101849052848160248183731b54e762aa34cf6e28e9c082f2848e28e45da6b85af18015613cc257908591613cad575b50613ad9565b81613cb791613403565b610aa357835f613ca7565b6040513d87823e3d90fd5b81613cd791613403565b610aa357835f613c4b565b613ceb91613545565b6e04444c5dc75cb358380d2e3de08a903b1561093c5760405190630ab714fb60e11b82527337bfb8ac7c960e558657871d41ca70e07e7dbfff600483015286602483015260448201528581606481836e04444c5dc75cb358380d2e3de08a905af18015613d7657908691613d61575b5087613aab565b81613d6b91613403565b61094057845f613d5a565b6040513d88823e3d90fd5b9096508581813d8311613da9575b613d998183613403565b810103126109405751955f613a87565b503d613d8f565b634e487b7160e01b8a52604160045260248afd5b613dd19197505f90613403565b5f955f61398e565b97505f613921565b50505050505050505050565b60016001607f1b0396506138e9565b96505f6138d9565b505050505050505050505050565b90506020813d602011613e3c575b81613e2d60209383613403565b8101031261056157515f6138a6565b3d9150613e20565b50881561385d565b506020813d602011613e7d575b81613e6660209383613403565b81010312610561576001600160801b039051613848565b3d9150613e59565b5030330361004c57604051631652585760e01b60208201526001600160a01b039091166024808301919091528152613ec290613139604482613403565b565b63271a26f160e01b5f5260045ffd5b507337bfb8ac7c960e558657871d41ca70e07e7dbfff3314156136ee565b604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa9081156121b6575f91613f72575090565b90506020813d602011613f99575b81613f8d60209383613403565b81010312610561575190565b3d9150613f80565b359060ff8216820361056157565b3d15613fd9573d90613fc082613438565b91613fce6040519384613403565b82523d5f602084013e565b606090565b805f928101036020811261056157600260ff613ff984613fa1565b16036140b55760a01361087b5761400f81613fa1565b506020810135906001600160801b038216809203610832579082916080604051916020830193630fe1ea1160e01b855260248401526040810135604484015260608101356064840152013560848201526084815261406e60a482613403565b51907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af46140a4613faf565b90156140ad5790565b602081519101fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036121c1576040136105615760206140f782613fa1565b9101359060018060a01b0382168092036105615760ff168061416c575050303b156103f657604051630731a8c360e11b8152818160048183305af1801561088757908291614157575b50505b60405190614152602083613403565b815290565b8161416191613403565b6103f657805f614140565b6001036141ba57303b156105615760405190637d73714d60e01b825260048201525f8160248183305af180156121b6576141a7575b50614143565b6141b391505f90613403565b5f806141a1565b63091c731b60e31b5f5260045ffd5b5f80516020615d10833981519152546001600160401b038160401c164210156142035760801c60ff16156141fd57610dac90565b6105dc90565b506109c490565b604051627eeac760e11b81523060048201525f60248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613f72575090565b7f0000000000000000000000000000000000000000000000000000000000000000421061431a576040516340bd8e6960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f916142e8575b506142e2575f90565b610dac90565b90506020813d602011614312575b8161430360209383613403565b8101031261056157515f6142d9565b3d91506142f6565b6040516318160ddd60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90614378575b63ffffffff16151590506142e2575f90565b506020813d6020116143b3575b8161439260209383613403565b81010312610561575163ffffffff811681036105615763ffffffff90614366565b3d9150614385565b3560ff811681036105615790565b903590601e198136030182121561056157018035906001600160401b0382116105615760200191813603831361056157565b3561ffff811681036105615790565b356001600160401b03811681036105615790565b906001600160401b03809116911603906001600160401b038211612d7d57565b92919261444a82613438565b916144586040519384613403565b829481845281830111610561578281602093845f960137010152565b6040516101e081018181106001600160401b03821117613424576145e76101c06042946001600160401b03936040525f60608601525f60808601525f60a08601525f60c08601525f60e08601525f6101008601525f6101208601525f6101408601525f6101608601525f6101808601525f6101a08601525f8286015280358552602081013560208601526040810135604086015260ff614516606083016143bb565b16606086015261453361452c60808301836143c9565b369161443e565b60208151910120608086015260a081013560a08601528361455660c0830161440a565b1660c08601528361456960e0830161440a565b1660e086015261010081013561010086015261012081013561012086015261ffff61459761014083016143fb565b1661014086015261ffff6145ae61016083016143fb565b1661016086015261ffff6145c561018083016143fb565b16610180860152836145da6101a0830161440a565b166101a08601520161440a565b166101c082015260405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fee3b0f8c46969f9c96cbdb258d9bc22f87f49dba9cd39b7a7f091505ea4b9ccd60408201527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260a0815261468060c082613403565b519020906001600160401b036101c0604051927f9c61a909d173aec816b2730e20b6caa3a25ca10c8a084dbf023e026e53874db4602085015280516040850152602081015160608501526040810151608085015260ff60608201511660a0850152608081015160c085015260a081015160e08501528260c0820151166101008501528260e08201511661012085015261010081015161014085015261012081015161016085015261ffff6101408201511661018085015261ffff610160820151166101a085015261ffff6101808201511682850152826101a0820151166101e0850152015116610200820152610200815261477d61022082613403565b602081519101206040519161190160f01b8352600283015260228201522090565b62028dd45a10613ec257604051637de4c18d60e01b81526020816004815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620249f0f16147f25750565b61480a9060203d602011612824576128168183613403565b50565b80515f918291906020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af461484b613faf565b90156140ad5750565b5f80516020615db08339815191525c801561487d575b62ffffff165f198101908111612d7d5790565b50700dac0007d00005dc000bb80032c80059d961486a565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610561571461492557670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90606082901b905f19600160601b8409928280851094039380850394858411156105615714614925578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f19818509938380861095039480860395868511156105615714614a27579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b5f80516020615d508339815191525460ff8160b81c1615908115614b4f575b8115614b2f575b8115614ae5575b8115614ac4575b8115614aa4575b508015614a86575b614a7857565b62820f3560e61b5f5260045ffd5b5060643562ffffff8116808203610561576280000091501415614a72565b608435600281900b9250828103610561575060a01c60020b14155f614a6a565b905060a4356001600160a01b03811690818103610561575030141590614a63565b90506044356001600160a01b0381169081810361056157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141590614a5c565b90506024356001600160a01b038116908181036105615750151590614a55565b5f80516020615d70833981519152546001600160a01b0316159150614a4e565b60c4358015159081810361056157505f60e435121490565b60e4355f811290815f14614bc05760010190600182128015821691151617612d7d57614bb2906136bf565b60018101809111612d7d5790565b905090565b6001607f1b811015614bd757600f0b90565b6393dafdf160e01b5f5260045ffd5b5f80516020615e30833981519152546001600160401b038160401c168015159182614c1d575b5081614c16575090565b9050421090565b6001600160401b031642101591505f614c0c565b604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201526020816044816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91614c9c575b5080614c8e57505f90565b5f198101908111612d7d5790565b90506020813d602011614cc6575b81614cb760209383613403565b8101031261056157515f614c83565b3d9150614caa565b905f80516020615e7083398151915254917ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b254915f80516020615e30833981519152548060c01c92614d208587613538565b8110613ec45784612bd087614d3493613545565b9084151580614dd9575b614d71575b5080614d4c5750565b9092614d589250613538565b906170804201804211612d7d576001600160401b031690565b94614d94919495844210155f14614d9b5750614d8e868092613538565b95613545565b925f614d43565b614dd26001600160401b03614d8e9260801c166001600160401b03614dca614dc38342613545565b928961441e565b1690896149af565b8092613538565b506001600160401b038160801c164211614d3e565b614e00614df9614854565b80926136ac565b90620f424003620f42408111612d7d57614e199161368e565b90565b604051602081019182526006604082015260408152614e3c606082613403565b51902090565b91907f00000000000000000000000000000000000000000000000000000000000000004210615666575f80516020615db08339815191525c801561564e575b62ffffff614e939160481c16846136ac565b604051630abb87c960e11b81525f94917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691620f424090910490602081600481865afa9081156121b6575f9161561c575b506155d1575f905b6040516340bd8e6960e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081600481855afa9081156121b6575f9161559f575b50615555575f5b5f80516020615db08339815191525c801561553d575b614f7762ffffff620f42409260301c16886136ac565b04945f80516020615d908339815191525c9284838a8a8a8a6001600160a01b038a166154df57612bd09250614fb994612bd0612bd092612bd05f998a98613545565b9481806154a5575b5050897f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d83615449575b84615410575b620151806150427f000000000000000000000000000000000000000000000000000000000000000042613545565b049186615356575b50826151f5575b505050965f80516020615dd083398151915260405f80516020615df0833981519152945f80516020615e5083398151915282955f80516020615e108339815191529b9c6150b485519283928d846040919493926060820195825260208201520152565b0390a18151908882526020820152a18151908582526020820152a180615199575b6103e882049281841161518f575b83827f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf068161514f8161516d96612bd061511f8861518a9b613545565b887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b604080518981526020810192909252810191909152606090a1613545565b604051938493846040919493926060820195825260208201520152565b0390a1565b90925082906150e3565b6151f0816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6150d5565b8a9061522b84827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b1561087b578190602460405180948193632cd49aed60e01b83528860048401525af1801561534b57615332575b505f80516020615df0833981519152945f80516020615e508339815191526040955f80516020615e108339815191529b9c957ff548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea5f80516020615dd0833981519152968c6153228b987f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c0582408a5180615303848888846040919493926060820195825260208201520152565b0390a18951938493846040919493926060820195825260208201520152565b0390a1959c9b5095505094615051565b61533d8b8092613403565b615347575f61525a565b8980fd5b6040513d8d823e3d90fd5b61538a87827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528c60048401525af180156121b6576153fb575b5060408051898152602081018890529081018390527f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f86190606090a15f61504a565b615408919b505f90613403565b5f995f6153ba565b61544485307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b615014565b6154a0846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61500e565b6154d8917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b5f81614fc1565b614fb994612bd0612bd092612bd0620f424061551c612bd0985f80516020615db08339815191525c8015615525575b60901c62ffffff16906136ac565b04998a98613545565b50700dac0007d00005dc000bb80032c80059d961550e565b50700dac0007d00005dc000bb80032c80059d9614f61565b5f80516020615db08339815191525c8015615587575b61558162ffffff620f42409260781c16876136ac565b04614f4b565b50700dac0007d00005dc000bb80032c80059d961556b565b90506020813d6020116155c9575b816155ba60209383613403565b8101031261056157515f614f44565b3d91506155ad565b5f80516020615db08339815191525c8015615604575b6155fd62ffffff620f42409260601c16856136ac565b0490614ef5565b50700dac0007d00005dc000bb80032c80059d96155e7565b90506020813d602011615646575b8161563760209383613403565b8101031261056157515f614eed565b3d915061562a565b50700dac0007d00005dc000bb80032c80059d9614e81565b5f9260328104936105dc82028281046105dc1483151715612d7d57620f4240900492620f42406156a262ffffff61569b6135a5565b16856136ac565b0490620f42406156be62ffffff6156b7614265565b16866136ac565b04946156dc886156d688612bd087612bd08786613545565b93613545565b9582615b17575b81615ade575b836159bc575b80615841575b50604061518a945f80516020615dd08339815191528261516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152998651938493846040919493926060820195825260208201520152565b0390a18151908a82526020820152a18151908782526020820152a1846157e5575b847f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf066103e8860496879361514f6157b58684613545565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b61583c856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61577e565b84808060246001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906158a190879083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b604051632cd49aed60e01b8152600481018790529485915af1156159b4575061518a945f80516020615dd0833981519152604061516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152997f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240879a61598a6159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b7f00000000000000000000000000000000000000000000000000000000000000009061368e565b895186815260208101929092526040820152606090a199505050979d9c50509650505094506156f5565b3d86823e3d90fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690615a1790869083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528a60048401525af180156121b657615ac9575b507f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861615ac1615aa26159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b604051918291888b846040919493926060820195825260208201520152565b0390a16156ef565b615ad69195505f90613403565b5f935f615a47565b615b1282307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b6156e9565b615b6e836001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6156e3565b8151919060418303615ba357615b9c9250602082015190606060408401519301515f1a90615c8d565b9192909190565b50505f9160029190565b6004811015615c0d5780615bbf575050565b60018103615bd65763f645eedf60e01b5f5260045ffd5b60028103615bf1575063fce698f760e01b5f5260045260245ffd5b600314615bfb5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60645f92838093604051968793630ab714fb60e11b855260018060a01b0316600485015282602485015260448401525af115615c5a5750565b3d5f823e3d90fd5b60445f92838093604051968793636a770b0f60e01b8552600485015260248401525af115615c5a5750565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615d04579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156121b6575f516001600160a01b03811615615cfa57905f905f90565b505f906001905f90565b5050505f916003919056fefabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8dd5ccc9a085f7022bb20616af7bbc7e01242e18f7a415e423214526aa90e6532c03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26703f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2680e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ee0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ed03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df492127adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b453d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b1954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b3a26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a00336080806040526004361015610012575f80fd5b5f3560e01c9081631b2df8501461089d57508063231a80eb14610880578063436044361461072057806347f543bc1461057c5780635890dea41461055f57806382bfefc8146105315780638a603e77146101af5780638e88a1f114610140578063a54eb24214610112578063ab8a2731146100eb578063af6e6238146100c15763c24dbebd146100a0575f80fd5b346100bd575f3660031901126100bd576020604051620246088152f35b5f80fd5b346100bd5760203660031901126100bd576004355f526002602052602060405f2054604051908152f35b346100bd575f3660031901126100bd575f546040516001600160a01b039091168152602090f35b346100bd575f3660031901126100bd5760206040517337bfb8ac7c960e558657871d41ca70e07e7dbfff8152f35b346100bd5760803660031901126100bd576101596108c4565b6024359081151582036100bd576064359067ffffffffffffffff82116100bd5760409261018d6101999336906004016108da565b92909160443591610a9c565b82516001600160a01b0390921682526020820152f35b346100bd5736600319016101a081126100bd57610160136100bd576101643567ffffffffffffffff81116100bd576101eb9036906004016108da565b610184357fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5c15801590610492575b610483576001600160a01b0361022e6109b8565b16158015610478575b8015610412575b80156103d6575b6103c757612710811080156103bb575b8015610385575b610364576102d26020916102e060043595865f52600285525f604081205560017fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5d6040519384918683019763676bab0160e01b89526102be602485016109ce565b6101806101848501526101a4840191610a7c565b03601f198101845283610908565b6102e86109b8565b935f6040519586945193f160203d141690519015908115610373575b50610364575f7fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5d6001600160a01b0361033c6109b8565b16907f2f999a7ea97ae4d5b2ee9cc0c93865dc0eeff8748b89107bda512070e182276b5f80a3005b636670a33360e11b5f5260045ffd5b63676bab0160e01b1415905082610304565b505a610394603f830483610a6f565b9061753082018092116103a7571061025c565b634e487b7160e01b5f52601160045260245ffd5b50624c4b408111610255565b63300262ab60e21b5f5260045ffd5b506004355f52600260205260405f205460405160208101906103f7826109ce565b610160815261040861018082610908565b5190201415610245565b5067ffffffffffffffff821161046457604051610439601f8401601f191660200182610908565b828152602081019036848601116100bd57838583375f6020858301015251902061014435141561023e565b634e487b7160e01b5f52604160045260245ffd5b506110008211610237565b63665671f160e11b5f5260045ffd5b5060405163789add5560e11b81527fc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab2360048201526020816024816e04444c5dc75cb358380d2e3de08a905afa908115610526575f916104f4575b50151561021a565b90506020813d60201161051e575b8161050f60209383610908565b810103126100bd5751846104ec565b3d9150610502565b6040513d5f823e3d90fd5b346100bd575f3660031901126100bd576020604051731b54e762aa34cf6e28e9c082f2848e28e45da6b88152f35b346100bd575f3660031901126100bd576020600154604051908152f35b346100bd5760203660031901126100bd576105956108c4565b604051638da5cb5b60e01b8152602081600481731b54e762aa34cf6e28e9c082f2848e28e45da6b85afa908115610526575f916106de575b506001600160a01b031633036106cf576001600160a01b038116903082149081156106b1575b8115610693575b811561067a575b811561065e575b5061064f575f80546001600160a01b03198116831782556001600160a01b0316907f6af262ca96275dc40852dc5ae38406689d6f49c801c16c17cb6c84f103052fc39080a3005b631bb2296560e31b5f5260045ffd5b821515915081610670575b5082610608565b90503b1582610669565b6e04444c5dc75cb358380d2e3de08a9083149150610601565b731b54e762aa34cf6e28e9c082f2848e28e45da6b8831491506105fa565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff831491506105f3565b63ea8e4eb560e01b5f5260045ffd5b90506020813d602011610718575b816106f960209383610908565b810103126100bd57516001600160a01b03811681036100bd57826105cd565b3d91506106ec565b346100bd576101003660031901126100bd5761073a6108c4565b6024356001600160a01b03811691908290036100bd576044358015158091036100bd5760643580600f0b8091036100bd576084359182600f0b8093036100bd577337bfb8ac7c960e558657871d41ca70e07e7dbfff33036106cf576001545f1981146103a757600101938460015560405194610160860186811067ffffffffffffffff82111761046457604052855260018060a01b03169485602086015260408501526060840152608083015260a082015260a43560c082015260c43560e0820152436101008201524261012082015260e435610140820152604051602081019061083781610829858561092a565b03601f198101835282610908565b51902081515f52600260205260405f20557f23ef78eb4b2ee5bd54d6c81877dd7e33c243f72a1039c0e7b302b6caccd8c1df61087b8251926040519182918261092a565b0390a3005b346100bd575f3660031901126100bd576020604051620138808152f35b346100bd575f3660031901126100bd57806e04444c5dc75cb358380d2e3de08a9060209252f35b600435906001600160a01b03821682036100bd57565b9181601f840112156100bd5782359167ffffffffffffffff83116100bd57602083818601950101116100bd57565b90601f8019910116810190811067ffffffffffffffff82111761046457604052565b919091610140806101608301948051845260018060a01b03602082015116602085015260018060a01b0360408201511660408501526060810151151560608501526080810151600f0b608085015260a0810151600f0b60a085015260c081015160c085015260e081015160e08501526101008101516101008501526101208101516101208501520151910152565b6024356001600160a01b03811681036100bd5790565b60043581526024356001600160a01b038116908190036100bd5760208201526044356001600160a01b038116908190036100bd5760408201526064358015158091036100bd57606082015260843580600f0b8091036100bd57608082015260a43580600f0b8091036100bd5760a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b919082018092116103a757565b908060209392818452848401375f828201840152601f01601f1916010190565b93919094926110008311610d7e575f546001600160a01b031695700dac0007d00005dc000bb80032c80059d9938715610d755762019a285a10610d665760405160a0810181811067ffffffffffffffff821117610464576040525f8152731b54e762aa34cf6e28e9c082f2848e28e45da6b86020820152628000006040820152600160608201527337bfb8ac7c960e558657871d41ca70e07e7dbfff6080820152610b4960a08220610d8d565b9060405191631e2eaeaf60e01b835260048301526020826024816e04444c5dc75cb358380d2e3de08a905afa918215610526575f92610d31575b5060a0610b909120610d8d565b90600382018092116103a75760405191631e2eaeaf60e01b835260048301526020826024816e04444c5dc75cb358380d2e3de08a905afa918215610526575f92610cf2575b5060405163dc88d0cf60e01b602082019081526001600160a01b039a8b1660248301529415156044820152606481019690965290971660848501526001600160801b0390961660a484015260c060c484015294610c3d9183916108299160e484019190610a7c565b60c08091604051958691610c518484610908565b8336843751908862013880fa903d141615610cee575f91829190825b6006851015610cca578460051b86015190620246088211610cc05781610c9291610a6f565b9360018601918287116103a7576018830292808404601814901517156103a7576001921b1794019392610c6d565b5091945092505050565b93509350620246088311610ce85750600182018092116103a7571790565b92915050565b9150565b949150916020853d602011610d29575b81610d0f60209383610908565b810103126100bd5793519093916001600160801b03610bd5565b3d9150610d02565b9091506020813d602011610d5e575b81610d4d60209383610908565b810103126100bd57519060a0610b83565b3d9150610d40565b638e0b841160e01b5f5260045ffd5b50929450505050565b63b5cef68360e01b5f5260045ffd5b604051602081019182526006604082015260408152610dad606082610908565b5190209056fea2646970667358221220189bf1649881170d63b9bd59e156a5dea6ce48fd5fb34573452e6e59c5139c6264736f6c634300081a00335edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c563ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9000000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f3000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede5353000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841900000000000000000000000072d94600a7a57afb6a2090e9739fd8ab21e02eb20000000000000000000000005598aa9146215bc13eb26f2c692ad1461fd3298239eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d787000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f734000000000000000000000000080396c7131159eb92e7e84839e51c9887a7a95d9000000000000000000000000c594bdfba256c79f6069df9e89ea78d6312fadd70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c0aeabdef1760d0dcba28a20c15701f74216e77a000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e00000000000000000000000051629bca14098a4f1ad77cd7e85212d67349823d0000000000000000000000004e5916428452891e1deb59d162c20266ed08cad4000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f91","recompiledBytecode":"0x6103e06040523461100857619b4c803803809161001e826103e0612dda565b6103e039610220811261100857610180136110085760405161018081016001600160401b03811182821017612dab5760405261005b6103e0612dfd565b808252610069610400612dfd565b602083018190526104205190916001600160a01b03821682036110085760408401829052610098610440612dfd565b606085018190526100aa610460612dfd565b60808601819052906100bd610480612dfd565b60a087018190526100cf6104a0612dfd565b60c088018190526104c05160e089018190526104e051979096919491906001600160a01b0389168903611008576101008a0189905261050051936001600160a01b0385168503611008576101208b0185905261052051946001600160a01b0386168603611008576101408c01869052610160938c61014e610540612e11565b950185905261056051976001600160a01b03891689036110085761058051996001600160a01b038b168b03611008576105a0519d6001600160a01b038f168f9003611008576105c0519d6001600160a01b038f168f9003611008576105e0519d6001600160a01b038f168f9003611008576001600160a01b039485169a9085169890851697908516949081169316883b15612d9c578860805280158015612d94575b612d855760a05260c052306101605260405163dc4c90d360e01b8152602081600481875afa80156110145788915f91612d49575b506001600160a01b031614801590612ccd575b611fe15760405163dc4c90d360e01b81526020816004818d5afa80156110145788915f91612c91575b506001600160a01b031614801590612c22575b611fe15760405163dc4c90d360e01b8152602081600481865afa80156110145788915f91612be6575b506001600160a01b031614801590612b13575b8015612a40575b611fe157604051637f5a7c7b60e01b81526020816004816001600160a01b0386165afa908115611014575f91612a06575b50604051637f5a7c7b60e01b81526020816004818e5afa908115611014575f916129cc575b506001600160a01b03918216911614801590612950575b80156128d4575b8015612858575b80156127d3575b611fe157604051637e062a3560e11b81526020816004818d5afa908115611014575f91612799575b506101805260018060a01b031660e05261014052866101005283610120526101a05260018060a01b03166101c052604051637f5a7c7b60e01b815260208160048160018060a01b0386165afa908115611014575f9161275f575b50604051637f5a7c7b60e01b81526020816004818a5afa908115611014575f91612725575b506001600160a01b03918216911614801590612664575b80156125e8575b611fe1576001600160a01b0381166101e08190526040516315e5a1e560e01b815290602090829060049082905afa918215611014576004926020925f916125cb575b506102005260405163141b84eb60e31b815292839182906001600160a01b03165afa908115611014575f91612599575b50610220526040516367e828bf60e01b81526020816004816001600160a01b038a165afa908115611014575f91612557575b50604051637e062a3560e11b8152936001600160a01b03919091169290602085600481895afa948515611014575f9561251b575b50604051637f5a7c7b60e01b8152906020826004818a5afa918215611014575f926124df575b506040519561050987612dbf565b5f875260018060a01b0316602087015262800000604087015260020b606086015260018060a01b0316608085015260405163481c6a7560e01b8152602081600481875afa908115611014575f916124a5575b506001600160a01b031614801594906123c1575b50831561234c575b5082156122e0575b50508015612268575b611fe1576001600160a01b039081166102405260405163481c6a7560e01b8152906020908290600490829086165afa908115611014575f9161222e575b5086516001600160a01b0391821691161480159061215b575b801561206d575b8015611ff0575b611fe15761026081905260a0860151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f91611fa7575b506001600160a01b039081166102805260a08701516040516319b400eb60e21b81529160209183916004918391165afa908115611014575f91611f6d575b506102a0526060860151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa8015611014575f90611f33575b6004915061016088015160020b602060018060a01b0360608b01511660405194858092637f5a7c7b60e01b82525afa908115611014575f91611ef7575b60049350604051926106f284612dbf565b5f845260018060a01b03166020840152628000006040840152606083015260018060a01b03166080820152602060018060a01b036101208a015116604051938480926315e5a1e560e01b82525afa908115611014576004925f92611ed6575b5061012089015160405163141b84eb60e31b81529360209185919082906001600160a01b03165afa928315611014575f93611ea2575b506001600160a01b0385163b15908115611e20575b8115611d55575b8115611c64575b8115611bf3575b508015611b81575b8015611b6f575b8015611b62575b8015611af6575b8015611a74575b611a65576102c08490526001600160a01b0387163b1580156119e6575b8015611964575b8015611876575b8015611788575b611779576102e087905261030052610320526001600160a01b0384163b1580156116ee575b801561166f575b80156115ed575b80156114ff575b8015611427575b80156113b8575b6113a9576103408490526040516357a3434160e11b81526020816004816001600160a01b0389165afa908115611014575f91611377575b50610360526040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f91611345575b5061038052306103a05260018060a01b038651166e04444c5dc75cb358380d2e3de08a90811490811591611319575b50610ed75760018060a01b036020870151167349a91293a8dff24d5c54b798c45376301d29b9f38114908115916112ed575b50610ed75760018060a01b0360408701511673f1749e78e76cfe1119206833ae93bed2dede53538114908115916112c1575b50610ed75760018060a01b0360608701511673136589be852ab8d9541f923b04064e362c2f357a811490811591611295575b50610ed75760018060a01b03608087015116735f4ec3df9cbd43714fe2740f5e3616155c5b8419811490811591611269575b50610ed75760018060a01b0360a0870151167372d94600a7a57afb6a2090e9739fd8ab21e02eb281149081159161123d575b50610ed75760018060a01b036101008701511673271f808cb55c7cbbb3d4df0da075def9ae5f7340811490811591611224575b50610ed75760018060a01b03610120870151167380396c7131159eb92e7e84839e51c9887a7a95d98114908115916111f8575b50610ed75760018060a01b036101408701511673c594bdfba256c79f6069df9e89ea78d6312fadd78114908115916111cc575b50610ed7576001600160a01b03811673c0aeabdef1760d0dcba28a20c15701f74216e77a1480159190611197575b50610ed7576001600160a01b03811673b2304d3de407398de441b147e2c64c7c48daf44e1480159190611162575b50610ed7576001600160a01b0383167351629bca14098a4f1ad77cd7e85212d67349823d14801592908390611141575b610ed7576001600160a01b038116734e5916428452891e1deb59d162c20266ed08cad4148015919061110c575b50610ed75760c08401516001600160a01b0316735598aa9146215bc13eb26f2c692ad1461fd32982148015906110de575b80156110cb575b610ed7576040516001600160a01b0382163f90610de990610b8f6020830182612dda565b8181526020810191618d23833951902003610ed7576103c05282516001600160a01b03166e04444c5dc75cb358380d2e3de08a90148015939061101f575b8315610f64575b8315610f37575b8315610f10575b508215610f08575b508115610ee6575b50610ed757604051615ec59081612e5e8239608051818181601c015281816104fc0152818161058d0152818161099001528181610bad015281816113630152818161140401528181611b9701528181611c7001528181611f99015281816120c10152818161221c01528181612336015281816128a50152818161291701528181612b0a01528181612e6c01528181612f4b01528181613f3f015281816140b70152818161422a015281816151cb015281816151fe0152818161535d015281816154170152818161547b015281816154ab015281816158170152818161587c015281816159f201528181615ae50152615b49015260a051818181610c3b0152610e46015260c0518181816111770152611c19015260e051818181610ccf01528181612697015281816127b901526148190152610100518181816104c00152818161132001528181611eee015261286d01526101205181611d68015261014051818181611dd201528181612db60152613f070152610160518161062d0152610180518181816108cb0152614aff01526101a05181818161040f015281816107b601528181611e3401528181612731015281816154570152615b2501526101c051818181612f0901528181615122015281816151a7015281816157b801526157f301526101e0518181816126430152818161432f0152615850015261020051815050610220518150506102405181818161227b01526147be015261026051816103c701526102805181612a1801526102a05181612a6701526102c051818181613153015281816135ba01528181614ea501526159c601526102e051818181612983015261407201526103005181818161593d0152615a7c015261032051816159650152610340518181816111b8015281816142a10152614f040152610360518181816119c8015281816142670152614e460152610380518161501d01526103a051816112db01526103c0518181816116cf015281816123a301528181612ec501526130000152f35b6339cbe26160e21b5f5260045ffd5b6001600160a01b03163f5f80516020619b2c833981519152141590505f610bf2565b91505f610bea565b61010001516001600160a01b03163f5f80516020619b0c833981519152141592505f610be2565b6101008101516001600160a01b031673271f808cb55c7cbbb3d4df0da075def9ae5f734014159350610bdb565b6060810151604051637f5a7c7b60e01b8152919450602090829060049082906001600160a01b03165afa8015611014575f90610fc3575b6001600160a01b03167337bfb8ac7c960e558657871d41ca70e07e7dbfff1415939050610bd4565b506020813d60201161100c575b81610fdd60209383612dda565b81010312611008576110037337bfb8ac7c960e558657871d41ca70e07e7dbfff91612dfd565b610f9b565b5f80fd5b3d9150610fd0565b6040513d5f823e3d90fd5b6060810151604051637e062a3560e11b8152919450602090829060049082906001600160a01b03165afa8015611014575f9061107e575b6001600160a01b0316731b54e762aa34cf6e28e9c082f2848e28e45da6b81415939050610bcd565b506020813d6020116110c3575b8161109860209383612dda565b81010312611008576110be731b54e762aa34cf6e28e9c082f2848e28e45da6b891612dfd565b611056565b3d915061108b565b50600161016085015160020b1415610b6b565b507f39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d78760e08501511415610b64565b6001600160a01b03163f7fe9609b506e4fb7529489bead6fb1212a3751c585ca01e7ea8162eaf717284ee2141590505f610b33565b506001600160a01b0384163f5f80516020619b2c8339815191521415610b06565b6001600160a01b03163f7f6e6bc3de6394814b173f45ad91823a00d221177e3f55ac950aa51b0527aaeee5141590505f610ad6565b6001600160a01b03163f7f895d8d18e1ddae18be624a5d6eb91ecbef32463239286ea0f089cbaf4d73cb14141590505f610aa8565b7f0c382e71978ff7c7a8ae6ccbb5ae72ff7e3c7348b633fa568e61bc227c0e600f91503f14155f610a7a565b7f162a8f628e26a75e99b59459595aa3dab79d928bab90263195364a48d91a821291503f14155f610a47565b5f80516020619b0c83398151915291503f14155f610a14565b7f38e9854f45420e983b7e429772e6c0fd3b6ce0327d22f09593d9be5de7c78b4e91503f14155f6109e1565b7f4b79b5c8aee6da0f7b393e8b53e6265ef7320a1d16184c65bd3841b5aa3d700d91503f14155f6109af565b7f1ba19c78683fcdca321006b491961704038a75d8bae969d4ac7eb363987a4bc991503f14155f61097d565b7f0c809a6af46fb81e31c079263cf6889f1002eb4a3d71508d1cfa0f1fdccd709c91503f14155f61094b565b7f4b7d19bb5a7437581d6359ce496b9b25ef6971ca8776bfc56fb515d8e92edc5191503f14155f610919565b7f785f1014552b7ce7d5fb7d0c970ca60edee94fd00425d7ca21609acac7ce129391503f14155f6108e7565b90506020813d60201161136f575b8161136060209383612dda565b8101031261100857515f6108b8565b3d9150611353565b90506020813d6020116113a1575b8161139260209383612dda565b8101031261100857515f610886565b3d9150611385565b63e3cd239f60e01b5f5260045ffd5b5060405163141b84eb60e31b81526020816004816001600160a01b0389165afa8015611014575f906113f2575b620151809150141561084f565b506020813d60201161141f575b8161140c60209383612dda565b81010312611008576201518090516113e5565b3d91506113ff565b506040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f916114cd575b506101208701516040516315e5a1e560e01b815290602090829060049082906001600160a01b03165afa908115611014575f9161149e575b506001600160401b03161415610848565b6114c0915060203d6020116114c6575b6114b88183612dda565b810190612e1f565b5f61148d565b503d6114ae565b90506020813d6020116114f7575b816114e860209383612dda565b8101031261100857515f611455565b3d91506114db565b50604051637f5a7c7b60e01b81526020816004816001600160a01b0389165afa908115611014575f916115b3575b506060870151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f91611579575b506001600160a01b0391821691161415610841565b90506020813d6020116115ab575b8161159460209383612dda565b81010312611008576115a590612dfd565b5f611564565b3d9150611587565b90506020813d6020116115e5575b816115ce60209383612dda565b81010312611008576115df90612dfd565b5f61152d565b3d91506115c1565b5060405163fb73056b60e01b81526020816004816001600160a01b0389165afa908115611014575f91611635575b5060208701516001600160a01b039182169116141561083a565b90506020813d602011611667575b8161165060209383612dda565b810103126110085761166190612dfd565b5f61161b565b3d9150611643565b5060405163dc4c90d360e01b81526020816004816001600160a01b0389165afa908115611014575f916116b4575b5086516001600160a01b0391821691161415610833565b90506020813d6020116116e6575b816116cf60209383612dda565b81010312611008576116e090612dfd565b5f61169d565b3d91506116c2565b50604051633ef0f29b60e11b81526020816004816001600160a01b0389165afa908115611014575f91611737575b506101208701516001600160a01b039182169116141561082c565b90506020813d602011611771575b8161175260209383612dda565b8101031261100857516001600160a01b0381168103611008575f61171c565b3d9150611745565b63def9077360e01b5f5260045ffd5b50604051637e062a3560e11b81526020816004816001600160a01b038c165afa908115611014575f9161183c575b506060890151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f91611802575b506001600160a01b0391821691161415610807565b90506020813d602011611834575b8161181d60209383612dda565b810103126110085761182e90612dfd565b5f6117ed565b3d9150611810565b90506020813d60201161186e575b8161185760209383612dda565b810103126110085761186890612dfd565b5f6117b6565b3d915061184a565b50604051637f5a7c7b60e01b81526020816004816001600160a01b038c165afa908115611014575f9161192a575b506060890151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f916118f0575b506001600160a01b0391821691161415610800565b90506020813d602011611922575b8161190b60209383612dda565b810103126110085761191c90612dfd565b5f6118db565b3d91506118fe565b90506020813d60201161195c575b8161194560209383612dda565b810103126110085761195690612dfd565b5f6118a4565b3d9150611938565b5060405163b753bfe960e01b81526020816004816001600160a01b038c165afa908115611014575f916119ac575b5060608901516001600160a01b03918216911614156107f9565b90506020813d6020116119de575b816119c760209383612dda565b81010312611008576119d890612dfd565b5f611992565b3d91506119ba565b5060405163dc4c90d360e01b81526020816004816001600160a01b038c165afa908115611014575f91611a2b575b5088516001600160a01b03918216911614156107f2565b90506020813d602011611a5d575b81611a4660209383612dda565b8101031261100857611a5790612dfd565b5f611a14565b3d9150611a39565b63c68f824960e01b5f5260045ffd5b5060405163fb73056b60e01b81526020816004816001600160a01b0389165afa908115611014575f91611abc575b5060208901516001600160a01b03918216911614156107d5565b90506020813d602011611aee575b81611ad760209383612dda565b8101031261100857611ae890612dfd565b5f611aa2565b3d9150611aca565b5060405163141b84eb60e31b81526020816004816001600160a01b0389165afa80156110145783915f91611b2d575b5014156107ce565b9150506020813d602011611b5a575b81611b4960209383612dda565b81010312611008578290515f611b25565b3d9150611b3c565b50620151808214156107c7565b50426001600160401b038216116107c0565b506040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f91611bc1575b506001600160401b03821614156107b9565b90506020813d602011611beb575b81611bdc60209383612dda565b8101031261100857515f611baf565b3d9150611bcf565b604051631f06e1a760e11b815291506020826004816001600160a01b038a165afa918215611014575f92611c2f575b5060a0902014155f6107b1565b9091506020813d602011611c5c575b81611c4b60209383612dda565b8101031261100857519060a0611c22565b3d9150611c3e565b604051637f5a7c7b60e01b81529091506020816004816001600160a01b038a165afa908115611014575f91611d1b575b5060608a0151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f91611ce1575b506001600160a01b0391821691161415906107aa565b90506020813d602011611d13575b81611cfc60209383612dda565b8101031261100857611d0d90612dfd565b5f611ccb565b3d9150611cef565b90506020813d602011611d4d575b81611d3660209383612dda565b8101031261100857611d4790612dfd565b5f611c94565b3d9150611d29565b604051631e46e62f60e21b81529091506020816004816001600160a01b038a165afa908115611014575f91611e01575b5060608a0151604051631e46e62f60e21b815290602090829060049082906001600160a01b03165afa908115611014575f91611dd2575b506001600160a01b0391821691161415906107a3565b611df4915060203d602011611dfa575b611dec8183612dda565b810190612e3e565b5f611dbc565b503d611de2565b611e1a915060203d602011611dfa57611dec8183612dda565b5f611d85565b60405163dc4c90d360e01b81529091506020816004816001600160a01b038a165afa908115611014575f91611e68575b5089516001600160a01b03918216911614159061079c565b90506020813d602011611e9a575b81611e8360209383612dda565b8101031261100857611e9490612dfd565b5f611e50565b3d9150611e76565b9092506020813d602011611ece575b81611ebe60209383612dda565b810103126110085751915f610787565b3d9150611eb1565b611ef091925060203d6020116114c6576114b88183612dda565b905f610751565b90506020833d602011611f2b575b81611f1260209383612dda565b8101031261100857611f25600493612dfd565b906106e1565b3d9150611f05565b506020813d602011611f65575b81611f4d60209383612dda565b8101031261100857611f60600491612dfd565b6106a4565b3d9150611f40565b90506020813d602011611f9f575b81611f8860209383612dda565b8101031261100857611f9990612dfd565b5f61066a565b3d9150611f7b565b90506020813d602011611fd9575b81611fc260209383612dda565b8101031261100857611fd390612dfd565b5f61062c565b3d9150611fb5565b63f92ee8a960e01b5f5260045ffd5b506040516334324e9f60e21b81526020816004816001600160a01b0386165afa908115611014575f91612033575b5061016087015160020b9060020b14156105ec565b90506020813d602011612065575b8161204e60209383612dda565b810103126110085761205f90612e11565b5f61201e565b3d9150612041565b50604051637f5a7c7b60e01b81526020816004816001600160a01b0386165afa908115611014575f91612121575b506060870151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f916120e7575b506001600160a01b03918216911614156105e5565b90506020813d602011612119575b8161210260209383612dda565b810103126110085761211390612dfd565b5f6120d2565b3d91506120f5565b90506020813d602011612153575b8161213c60209383612dda565b810103126110085761214d90612dfd565b5f61209b565b3d915061212f565b50604051637e062a3560e11b81526020816004816001600160a01b0386165afa908115611014575f9161220f575b506060870151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f916121d5575b506001600160a01b03918216911614156105de565b90506020813d602011612207575b816121f060209383612dda565b810103126110085761220190612dfd565b5f6121c0565b3d91506121e3565b612228915060203d602011611dfa57611dec8183612dda565b5f612189565b90506020813d602011612260575b8161224960209383612dda565b810103126110085761225a90612dfd565b5f6105c5565b3d915061223c565b5060405163d1ad17bf60e01b81526020816004816001600160a01b0386165afa908115611014575f916122a6575b506001600160a01b031615610588565b90506020813d6020116122d8575b816122c160209383612dda565b81010312611008576122d290612dfd565b5f612296565b3d91506122b4565b604051631f06e1a760e11b81529250602090839060049082905afa918215611014575f92612317575b5060a0902014155f8061057f565b9091506020813d602011612344575b8161233360209383612dda565b8101031261100857519060a0612309565b3d9150612326565b6040516306f4f6fb60e31b815291935090602081600481875afa908115611014575f91612387575b506001600160a01b03161415915f610577565b90506020813d6020116123b9575b816123a260209383612dda565b81010312611008576123b390612dfd565b5f612374565b3d9150612395565b604051637e062a3560e11b8152919450602082600481865afa918215611014575f92612460575b50602060049160405192838092637e062a3560e11b82525afa908115611014575f91612426575b506001600160a01b0391821691161415925f61056f565b90506020813d602011612458575b8161244160209383612dda565b810103126110085761245290612dfd565b5f61240f565b3d9150612434565b9091506020813d60201161249d575b8161247c60209383612dda565b8101031261100857516001600160a01b0381168103611008579060206123e8565b3d915061246f565b90506020813d6020116124d7575b816124c060209383612dda565b81010312611008576124d190612dfd565b5f61055b565b3d91506124b3565b9091506020813d602011612513575b816124fb60209383612dda565b810103126110085761250c90612dfd565b905f6104fb565b3d91506124ee565b9094506020813d60201161254f575b8161253760209383612dda565b810103126110085761254890612dfd565b935f6104d5565b3d915061252a565b90506020813d602011612591575b8161257260209383612dda565b8101031261100857516001600160a01b0381168103611008575f6104a1565b3d9150612565565b90506020813d6020116125c3575b816125b460209383612dda565b8101031261100857515f61046f565b3d91506125a7565b6125e29150833d85116114c6576114b88183612dda565b5f61043f565b5060405163dc4c90d360e01b81526020816004816001600160a01b0386165afa80156110145784915f91612628575b506001600160a01b031614156103fd565b9150506020813d60201161265c575b8161264460209383612dda565b81010312611008576126568491612dfd565b5f612617565b3d9150612637565b50604051637e062a3560e11b81526020816004816001600160a01b0386165afa908115611014575f91612706575b50604051637e062a3560e11b81526020816004818a5afa908115611014575f916126cc575b506001600160a01b03918216911614156103f6565b90506020813d6020116126fe575b816126e760209383612dda565b81010312611008576126f890612dfd565b5f6126b7565b3d91506126da565b61271f915060203d602011611dfa57611dec8183612dda565b5f612692565b90506020813d602011612757575b8161274060209383612dda565b810103126110085761275190612dfd565b5f6103df565b3d9150612733565b90506020813d602011612791575b8161277a60209383612dda565b810103126110085761278b90612dfd565b5f6103ba565b3d915061276d565b90506020813d6020116127cb575b816127b460209383612dda565b81010312611008576127c590612dfd565b5f610360565b3d91506127a7565b50604051638009b7bd60e01b81526020816004816001600160a01b0386165afa80156110145787915f91612813575b506001600160a01b03161415610338565b9150506020813d602011612850575b8161282f60209383612dda565b8101031261100857516001600160a01b03811681036110085786905f612802565b3d9150612822565b50604051637ce73d6760e01b81526020816004816001600160a01b0386165afa80156110145783915f91612898575b506001600160a01b03161415610331565b9150506020813d6020116128cc575b816128b460209383612dda565b81010312611008576128c68391612dfd565b5f612887565b3d91506128a7565b5060405163b753bfe960e01b81526020816004816001600160a01b0386165afa8015611014578a915f91612914575b506001600160a01b0316141561032a565b9150506020813d602011612948575b8161293060209383612dda565b81010312611008576129428a91612dfd565b5f612903565b3d9150612923565b5060405163dc4c90d360e01b81526020816004816001600160a01b0386165afa80156110145788915f91612990575b506001600160a01b03161415610323565b9150506020813d6020116129c4575b816129ac60209383612dda565b81010312611008576129be8891612dfd565b5f61297f565b3d915061299f565b90506020813d6020116129fe575b816129e760209383612dda565b81010312611008576129f890612dfd565b5f61030c565b3d91506129da565b90506020813d602011612a38575b81612a2160209383612dda565b8101031261100857612a3290612dfd565b5f6102e7565b3d9150612a14565b50604051637e062a3560e11b8152602081600481865afa908115611014575f91612ad9575b50604051637e062a3560e11b81526020816004818e5afa908115611014575f91612a9f575b506001600160a01b03918216911614156102b6565b90506020813d602011612ad1575b81612aba60209383612dda565b8101031261100857612acb90612dfd565b5f612a8a565b3d9150612aad565b90506020813d602011612b0b575b81612af460209383612dda565b8101031261100857612b0590612dfd565b5f612a65565b3d9150612ae7565b50604051637f5a7c7b60e01b8152602081600481865afa908115611014575f91612bac575b50604051637f5a7c7b60e01b81526020816004818e5afa908115611014575f91612b72575b506001600160a01b03918216911614156102af565b90506020813d602011612ba4575b81612b8d60209383612dda565b8101031261100857612b9e90612dfd565b5f612b5d565b3d9150612b80565b90506020813d602011612bde575b81612bc760209383612dda565b8101031261100857612bd890612dfd565b5f612b38565b3d9150612bba565b9150506020813d602011612c1a575b81612c0260209383612dda565b8101031261100857612c148891612dfd565b5f61029c565b3d9150612bf5565b5060405163313ce56760e01b81526020816004818a5afa908115611014575f91612c54575b5060ff1660081415610273565b90506020813d602011612c89575b81612c6f60209383612dda565b81010312611008575160ff811681036110085760ff612c47565b3d9150612c62565b9150506020813d602011612cc5575b81612cad60209383612dda565b8101031261100857612cbf8891612dfd565b5f610260565b3d9150612ca0565b5060405163dc4c90d360e01b81526020816004816001600160a01b0389165afa80156110145788915f91612d0d575b506001600160a01b03161415610237565b9150506020813d602011612d41575b81612d2960209383612dda565b8101031261100857612d3b8891612dfd565b5f612cfc565b3d9150612d1c565b9150506020813d602011612d7d575b81612d6560209383612dda565b8101031261100857612d778891612dfd565b5f610224565b3d9150612d58565b6383efa26f60e01b5f5260045ffd5b5081156101f0565b63bc12814760e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b03821117612dab57604052565b601f909101601f19168101906001600160401b03821190821017612dab57604052565b51906001600160a01b038216820361100857565b51908160020b820361100857565b9081602091031261100857516001600160401b03811681036110085790565b9081602091031261100857516001600160a01b0381168103611008579056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b63029a949d60e31b5f5260045ffd5b5f905f3560e01c90816303195cd01461322457508063034e7c47146131d257806305ca342f146131b857806306b7cb9c146122aa578063070fd029146131825780630c7621411461313e5780630e635186146130ff57806310e3c7a7146130e5578063154e1e3f146130ab5780631be052891461308f57806321bdc0d914612f8f57806321d0ee7014612f3857806324048ba114612ef457806324f159c214612eb0578063259982e514612e59578063263cef3c14612e3c57806328accf0914612d91578063293b1c6a146129b2578063375880651461296e5780633923411c146128de5780633bd1325114612847578063402573711461282b578063428a63411461279457806346158ffc1461270c57806346904840146126d8578063470d5fe61461267257806347ccca021461262e57806348e732771461261257806352bf8c27146125f557806354b4bf3914612558578063575e24b4146122e1578063638b12a0146122c7578063690422b2146122aa5780636b9cdad6146122665780636c2bbe7e146122095780636e5dbe86146121ea5780636f2c590a146121d05780636fe7e6eb1461208657806377e70a4b1461206a578063780d3cfe14611eb35780637cc4353b14611e015780637ce73d6714611dbc5780637d73714d14611d975780638009b7bd14611d525780638c2d6cf414611d37578063906f349114611cc357806391dd734614611c3c57806399b5598314611c015780639b75f7c814611be45780639f063efc14611b83578063a53e541214611b66578063a64e13a1146119eb578063af102658146119b0578063b47b2fb1146113a8578063b6a8b0fa1461134f578063b753bfe91461130a578063b827bbe0146112c5578063bb8b353c146112aa578063bbc2520d1461128f578063c269a3e214611267578063c314876d146111e7578063c4408c8a146111a2578063c79d2dfc14610cfe578063ce1b1d4314610cb9578063cffe289e14610c6a578063d16f715814610c25578063d25eae2514610bdc578063dc4c90d314610b97578063dc98354e14610960578063dd6b5e8e14610944578063df4fe917146105e1578063e1b4af6914610579578063e3b3904014610477578063eaf334761461045a578063fb26015f1461043e578063fb73056b146103f95763ffa800820361000f57346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f657602090604051908152f35b50346103f657806003193601126103f65760206040516105dc8152f35b50346103f657806003193601126103f6577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26654604051627eeac760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291821660248201529190602090839060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa90811561056d5790610536575b602090604051908152f35b506020813d602011610565575b8161055060209383613403565b81010312610561576020905161052b565b5f80fd5b3d9150610543565b604051903d90823e3d90fd5b50346103f657610588366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d29150505760405163e1b4af6960e01b8152602090f35b63570c108560e11b8152600490fd5b50346103f65760803660031901126103f6576105fb61323d565b610603613253565b90604435918260020b91828403610940576064356001600160a01b038116939084900361093c57307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316149086908215610908575b82156108f6575b82156108be575b82156108b4575b82156108a9575b505080156108a1575b610892577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26580546001600160a01b039283166001600160a01b0319918216179091557f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2668054939092169216821790555f80516020615d50833981519152805460a09490941b62ffffff60a01b166001600160b81b03199094169390931791909117909155604051638da5cb5b60e01b815290602090829060049082905afa908115610887578291610849575b505f80516020615d7083398151915280546001600160a01b0319166001600160a01b03929092169182179055801590811561079e575b5061078f5780f35b63f92ee8a960e01b8152600490fd5b60405163017d862f60e11b81529091506020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391610800575b506001600160a01b031614155f610787565b90506020813d602011610836575b8161081b60209383613403565b810103126108325761082c906134b5565b5f6107ee565b8280fd5b3d915061080e565b6040513d85823e3d90fd5b90506020813d60201161087f575b8161086460209383613403565b8101031261087b57610875906134b5565b5f610751565b5080fd5b3d9150610857565b6040513d84823e3d90fd5b63f92ee8a960e01b8552600485fd5b508215610685565b13159050855f61067c565b843b159250610675565b6001600160a01b038581167f00000000000000000000000000000000000000000000000000000000000000009091161415925061066e565b6001600160a01b038416159250610667565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b031615159250610660565b8580fd5b8480fd5b50346103f657806003193601126103f657602060405160018152f35b50346103f65760e03660031901126103f65761097a61323d565b60a036602319011261087b5761098e613362565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610b88577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b03168015928315610b6c575b8315610b58575b50508115610b3d575b8115610af6575b8115610ac7575b8115610aa7575b8115610a82575b8115610a5c575b5061078f575f80516020615d50833981519152805460ff60b81b1916600160b81b179055604051636e4c1aa760e11b8152602090f35b5f80516020615d50833981519152546001600160a01b039182169116141590505f610a26565b905060a4356001600160a01b03811690818103610aa3575030141590610a1f565b8380fd5b905060643562ffffff8116808203610aa357628000009150141590610a18565b90506084358060020b90818103610aa357505f80516020615d508339815191525460a01c60020b141590610a11565b90506001600160a01b03610b08613579565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e266546001600160a01b03169116141590610a0a565b90506001600160a01b03610b4f61358f565b16151590610a03565b6001600160a01b0316141591505f806109fa565b5f80516020615d508339815191525460b81c60ff1693506109f3565b63570c108560e11b8352600483fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657600435906001600160401b0382116103f6576101e060031983360301126103f6576020610c1d83600401614474565b604051908152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65760407f2f9e2e20558dbba26f6943f9568ee8724ef17057d8dd3fe037dadf2bb9691382546001600160401b038251918181168352831c166020820152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760403660031901126103f6576004356001600160401b03811161087b57806004016101e06003198336030112610832576024356001600160401b038111610aa357610d53903690600401613269565b929046602483013514801590611174575b801561115b575b8015611142575b8015611127575b801561110c575b80156110f2575b80156110d8575b80156110cf575b80156110c2575b80156110a3575b8015611083575b8015611055575b801561101f575b611010576020610dcb60848401856143c9565b908092918101031261093c5735938460011c9182158015610ff2575b8015610fe0575b610fd1576001600160401b035f80516020615d108339815191525416831115610fc257610e3c91610e2d610e3392610e2588614474565b92369161443e565b90615b73565b90929192615bad565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603610fb357916001600160401b03606092846101c483610ea97f83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b898613529565b1692018284610eb78361440a565b1610610f9f575b50821682195f80516020615d108339815191525416175f80516020615d10833981519152555f80516020615d108339815191525467ffffffffffffffff60401b8260401b169067ffffffffffffffff60401b1916175f80516020615d1083398151915255815f80516020615d10833981519152549660018060ff60801b92161460801b1660ff60801b1988161793845f80516020615d10833981519152553596877ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e5560ff6040519560801c1615158552166020840152166040820152a280f35b83919250610fac9061440a565b9190610ebe565b63027737d360e31b8552600485fd5b6319b5ff4d60e31b8752600487fd5b6383efa26f60e01b8752600487fd5b50610fea83613529565b421015610dee565b506001600160401b036110086101a4860161440a565b168311610de7565b6383efa26f60e01b8552600485fd5b506154606001600160401b0361104e61103b6101c4860161440a565b6110486101a4870161440a565b9061441e565b1611610db8565b506110636101c4830161440a565b6001600160401b03806110796101a4860161440a565b1691161115610db1565b506110916101c4830161440a565b6001600160401b034291161115610daa565b506110b16101a4830161440a565b6001600160401b0342911611610da3565b5061012482013515610d9c565b50823515610d95565b50600561ffff6110eb61018485016143fb565b1611610d8e565b50600461ffff61110561018485016143fb565b1610610d87565b50600461ffff61111f61016485016143fb565b161415610d80565b50600561ffff61113a61014485016143fb565b161415610d79565b50602061115260848401856143c9565b90501415610d72565b50600360ff61116c606485016143bb565b161415610d6b565b507f000000000000000000000000000000000000000000000000000000000000000060448301351415610d64565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65762ffffff6112046135a5565b166148440362ffffff81116112535762ffffff80611220614265565b169116039062ffffff821161123f5760208262ffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b50346103f657806003193601126103f6576020611282614265565b62ffffff60405191168152f35b50346103f657806003193601126103f6576020610c1d61420a565b50346103f657806003193601126103f65760206112826141c9565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65761135e366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d291505057604051635b54587d60e11b8152602090f35b50346103f6576101603660031901126103f6576113c361323d565b60a036602319011261087b5760603660c319011261087b576101243591610144356001600160401b03811161087b57611400903690600401613269565b90937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036119a15761143d614a2f565b839460e435928584129384159081611991575b81611983575b50611974578260801d600f0b918683125f1461196d57611475836136bf565b945b61147f614b6f565b156119145761148c614b87565b811561190557620f42406114a76114a1614854565b836136ac565b04965b8783156118f4576114bb9083613545565b80915b036118e55782156118de57505b925b7f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395c6114f761356a565b156118cf57602061150661358f565b604051634bf466a760e11b81526001600160a01b03909116600482015292839060249082905afa80156118c4578a90611890575b6115449250613545565b61154c61356a565b156117a85761155b9087613538565b620249f08402848104620249f0148515171561179457620f42409004106117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956915b6115ab8886614e42565b60a06040518160248237209360018060a01b031697889560405192835260208301526040820152a36115db61479e565b5f80516020615d908339815191525c6001600160a01b0316908161167a575b60408787805f80516020615db08339815191525d805f80516020615d908339815191525d807f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d81519063b47b2fb160e01b8252600f0b6020820152f35b85977f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef9695965c7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05c61170060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016936116f861356a565b9a369161443e565b6020815191012091833b15611781576101049689956040519b8c9a8b996321b0221b60e11b8b5260048b015260248a0152151560448901526064880152600f0b608487015260a486015260c485015260e48401525af1801561083e5761176c575b8080808086946115fa565b611777838092613403565b61087b575f611761565b8880fd5b637478d45560e11b8852600488fd5b634e487b7160e01b8a52601160045260248afd5b6117b486600f0b6136bf565b90620249f08202828104620249f0148315171561187c57620f4240810482118015611873575b61186457620f4240820290828204620f4240148315171561185057926118146118209361180e61181a94620f424097613545565b92613545565b9061368e565b856136ac565b0486116117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956916115a1565b634e487b7160e01b8c52601160045260248cfd5b637478d45560e11b8b5260048bfd5b508282146117da565b634e487b7160e01b8b52601160045260248bfd5b506020823d6020116118bc575b816118aa60209383613403565b8101031261056157611544915161153a565b3d915061189d565b6040513d8c823e3d90fd5b60206118d9613579565b611506565b90506114cb565b6337e83fd360e21b8a5260048afd5b6118fe9083613538565b80916114be565b61190e81614dee565b966114aa565b919750811561195e57620f424061193261192c614854565b876136ac565b04915b61194a839684835f1461195057505b93614bc5565b986114cd565b61195991613538565b611944565b61196785614dee565b91611935565b8294611477565b63153f6ec760e21b8652600486fd5b905083600f0b14155f611456565b905061199b61356a565b90611450565b63570c108560e11b8452600484fd5b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f657806003193601126103f6577337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590611b48575b8015611b25575b8015611b14575b611b05576001600160401b0342166001600160401b03195f80516020615d308339815191525416175f80516020615d30833981519152556201518042018042116112535767ffffffffffffffff60401b805f80516020615d30833981519152549260401b16169067ffffffffffffffff60401b1916175f80516020615d30833981519152557fe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc60605f80516020615d30833981519152546001600160401b0360405191818116835260401c16602082015260026040820152a180f35b635c06dcc560e01b8152600490fd5b5067fffffffffffeae7f4211611a29565b506001600160401b035f80516020615d308339815191525460401c161515611a22565b50731f22e4b065b2f15fed5be556dc0fa636048d29bc331415611a1b565b50346103f657806003193601126103f65760206040516170808152f35b50346103f657611b92366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506105d29250505057604080516327c18fbf60e21b8152602081019290925290f35b50346103f657806003193601126103f65760206040516107d08152f35b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f65760203660031901126103f6576004356001600160401b03811161087b57611c6d903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105d257611cbf611cab8484613fde565b604051918291602083526020830190613388565b0390f35b50346103f657806003193601126103f657608090611cdf614be6565b908115611d325750611cf7611cf2614c31565b614cce565b50505b5f80516020615e3083398151915254916001600160401b0360405193818116855260401c166020840152151560408301526060820152f35b611cfa565b50346103f657806003193601126103f6576020610c1d613ef1565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657611db9611db461323d565b6136cf565b80f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f6575f80516020615d70833981519152546001600160a01b03163303611ea457807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15611ea15781809160246040518094819363728b658960e01b835260043560048401525af1801561088757611e905750f35b81611e9a91613403565b6103f65780f35b50fd5b631d713add60e21b8152600490fd5b50346103f65760803660031901126103f6576004356001600160801b03811680910361087b5760405163cb2af14b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391612030575b506001600160a01b031633036120215781611f9491604051906002602083015260408201526024356060820152604435608082015260643560a082015260a08152611f7260c082613403565b604051809381926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610887578291611fff575b5060208180518101031261087b57602001516001600160801b03811680910361087b57602090610c1d61479e565b61201b91503d8084833e6120138183613403565b810190613453565b5f611fd1565b631d713add60e21b8252600482fd5b90506020813d602011612062575b8161204b60209383613403565b810103126108325761205c906134b5565b5f611f26565b3d915061203e565b50346103f657806003193601126103f6576020604051600c8152f35b3461056157610100366003190112610561576120a061323d565b5060a0366023190112610561576120b5613362565b506120be613378565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338190036121c157803b1561056157604051635275965160e01b8152906001600160a01b03612116613253565b1660048301526044356001600160a01b0381169081900361056157602483015260643562ffffff81168091036105615760448301526084358060020b80910361056157606483015260a4356001600160a01b03811691908290036105615760c4835f8193819560848401528160a48401525af180156121b6576121a6575b604051636fe7e6eb60e01b8152602090f35b5f6121b091613403565b5f612194565b6040513d5f823e3d90fd5b63570c108560e11b5f5260045ffd5b34610561575f366003190112610561576020611282613633565b34610561575f366003190112610561576339cbe26160e21b5f5260045ffd5b3461056157612217366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506121c1925050505760408051633615df3f60e11b81525f6020820152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576020604051620249f08152f35b34610561575f3660031901126105615760206112826135a5565b3461056157610140366003190112610561576122fb61323d565b60a03660231901126105615760603660c319011261056157610124356001600160401b03811161056157612333903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190338390036121c157604090612373614a2f565b61237b61356a565b9061239f60e43596879585519687958695638e88a1f160e01b8752600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f91612527575b505f80516020615db08339815191525d5f80516020615d908339815191525d61240361356a565b1561251857602061241261358f565b604051634bf466a760e11b81526001600160a01b03909116600482015291829060249082905afa9081156121b6575f916124e5575b50606091612486917f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395d5f9061247b614b6f565b6124a7575b50614bc5565b60801b604051906315d7892d60e21b82526020820152624000006040820152f35b90505f6124b2614b87565b9112156124d7576124cf620f4240916124c9614854565b906136ac565b045b83612480565b6124e090614dee565b6124d1565b90506020813d602011612510575b8161250060209383613403565b8101031261056157516060612447565b3d91506124f3565b6020612522613579565b612412565b905061254b915060403d604011612551575b6125438183613403565b8101906134c9565b846123dc565b503d612539565b34610561575f3660031901126105615760805f80516020615d10833981519152546001600160401b038160401c1690814210155f146125da575f915b6001600160401b037ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e549260ff6040519516855216602084015260408301526060820152f35b80831c60ff16156125ee5760025b91612594565b60016125e8565b34610561575f366003190112610561576020604051620151808152f35b34610561575f3660031901126105615760206040516101f48152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f36600319011261056157604051632386aff360e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061053657602090604051908152f35b34610561575f366003190112610561575f80516020615d70833981519152546040516001600160a01b039091168152602090f35b34610561575f3660031901126105615760408051630f77314d60e31b815290816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061277257602090604051908152f35b506040813d60401161278c575b8161055060409383613403565b3d915061277f565b34610561575f3660031901126105615760405163428a634160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6576020915f916127fe575b506040519015158152f35b61281e9150823d8411612824575b6128168183613403565b810190613552565b826127f3565b503d61280c565b34610561575f3660031901126105615760206040516154608152f35b34610561575f36600319011261056157604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa80156121b6575f9061053657602090604051908152f35b34610561575f36600319011261056157604080515f6020820181905233828401529181526129129190611f72606082613403565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156121b657612956575b61295461479e565b005b612969903d805f833e6120138183613403565b61294c565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561576060366003190112610561576004356044356129e26129d461420a565b6129dc613ef1565b90613538565b90804211908115612d67575b508015612d5f575b8015612d57575b8015612d4c575b612d3d576040516318160ddd60e01b8152907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083600481845afa9283156121b6575f93612d09575b506040516370a0823160e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004820181905292909190602083602481855afa9283156121b6575f93612cd3575b5060408051600160208201523391810191909152612b0591905f90612ae381606081015b03601f198101835282613403565b604051809481926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156121b657612b6792612b5f92612cbb575b50612b5161479e565b612b5961420a565b90613545565b612b59613ef1565b936040516318160ddd60e01b8152602081600481865afa9081156121b6575f91612c88575b50612b9990602092613545565b936024604051809481936370a0823160e01b835260048301525afa9081156121b6575f91612c54575b50612bd090612bd593613538565b613545565b918115908115612c4b575b8115612c38575b50612c29576040917f0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3838051848152836020820152a182519182526020820152f35b63873d73a960e01b5f5260045ffd5b9050612c448284614895565b1083612be7565b83159150612be0565b90506020813d602011612c80575b81612c6f60209383613403565b810103126105615751612bd5612bc2565b3d9150612c62565b90506020813d602011612cb3575b81612ca360209383613403565b8101031261056157516020612b8c565b3d9150612c96565b612cce903d805f833e6120138183613403565b612b48565b9092506020813d602011612d01575b81612cef60209383613403565b81010312610561575191612b05612ab1565b3d9150612ce2565b9092506020813d602011612d35575b81612d2560209383613403565b8101031261056157519184612a57565b3d9150612d18565b6333b094a160e01b5f5260045ffd5b506024358111612a04565b5080156129fd565b5081156129f6565b905061012c420190814211612d7d5711836129ee565b634e487b7160e01b5f52601160045260245ffd5b34610561575f366003190112610561576040516319b400eb60e21b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90612e02575b6040516001600160a01b039091168152602090f35b506020813d602011612e34575b81612e1c60209383613403565b8101031261056157612e2f6020916134b5565b612ded565b3d9150612e0f565b34610561575f366003190112610561576020604051620493e08152f35b3461056157612e6736613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163259982e560e01b8152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461056157612f4636613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163021d0ee760e41b8152602090f35b3461056157608036600319011261056157612fa861323d565b60243590811515820361056157606435906001600160401b03821161056157612ffc92612fdb6040933690600401613269565b8451638e88a1f160e01b8152958694859491939160443591600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f9161306e575b5062ffffff5f199116019062ffffff8211612d7d57604080516001600160a01b03909216825262ffffff929092166020820152f35b9050613089915060403d604011612551576125438183613403565b82613039565b34610561575f36600319011261056157602060405161a8c08152f35b34610561575f3660031901126105615760206040517f43c032f18f863bf5301f80e8812396bc62519b9c402f07184c2255d30d84788f8152f35b34610561575f366003190112610561576020610c1d614854565b34610561575f3660031901126105615730330361004c57604051630321f11f60e21b60208201526004815261295490613139602482613403565b61480d565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f3660031901126105615760408051600160208201523391810191909152612912905f90611f728160608101612ad5565b34610561575f3660031901126105615760206040515f8152f35b34610561575f3660031901126105615760605f80516020615d3083398151915254600262ffffff613201613633565b16146001600160401b0360405192818116845260401c1660208301526040820152f35b34610561575f3660031901126105615780600160209252f35b600435906001600160a01b038216820361056157565b602435906001600160a01b038216820361056157565b9181601f84011215610561578235916001600160401b038311610561576020838186019501011161056157565b90610160600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c49161014435906001600160401b038211610561576132f591600401613269565b9091565b906101a0600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c4916101443591610164359161018435906001600160401b038211610561576132f591600401613269565b60c435906001600160a01b038216820361056157565b60e435908160020b820361056157565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b610120600319820112610561576004356001600160a01b0381168103610561579160a06023198301126105615760249160c4359160e4359161010435906001600160401b038211610561576132f591600401613269565b90601f801991011681019081106001600160401b0382111761342457604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161342457601f01601f191660200190565b602081830312610561578051906001600160401b038211610561570181601f820112156105615780519061348682613438565b926134946040519485613403565b8284526020838301011161056157815f9260208093018386015e8301015290565b51906001600160a01b038216820361056157565b91908260409103126105615760206134e0836134b5565b92015190565b93909285939260a09693600180891b0316865215156020860152604085015260806060850152816080850152848401375f828201840152601f01601f1916010190565b906154608201809211612d7d57565b91908201809211612d7d57565b91908203918211612d7d57565b90816020910312610561575180151581036105615790565b60c43580151581036105615790565b6044356001600160a01b03811681036105615790565b6024356001600160a01b03811681036105615790565b604051630abb87c960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613601575b506135fb575f90565b6107d090565b90506020813d60201161362b575b8161361c60209383613403565b8101031261056157515f6135f2565b3d915061360f565b5f80516020615d30833981519152546001600160401b038160401c16801515918261367a575b5081613670575b501561366b57600290565b600190565b905042105f613660565b6001600160401b031642101591505f613659565b8115613698570490565b634e487b7160e01b5f52601260045260245ffd5b81810292918115918404141715612d7d57565b600160ff1b8114612d7d575f0390565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590613ed3575b613ec4575f6136fb614be6565b15613e855761370b611cf2614c31565b82939291845f80516020615e70833981519152557ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b2555f80516020615e3083398151915254906001600160401b0360c01b9060c01b16906001600160801b036001600160401b0360801b4260801b16911617175f80516020615e30833981519152556040519360a085018581106001600160401b03821117613424576040525f85526020850194731b54e762aa34cf6e28e9c082f2848e28e45da6b88652604081019562800000875260608201966001885260808301977337bfb8ac7c960e558657871d41ca70e07e7dbfff895261380560a08520614e1c565b60038101809111612d7d5760405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa80156121b6575f90613e4c575b6001600160801b039150169780158015613e44575b613de15761386d60a08620614e1c565b60405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91613e12575b506401000276a4996001600160a01b039190911691908a831115613e04576138d08360649261492c565b04809111613dfc575b5060016001607f1b038711613ded575b8615613de1576103e38102908082046103e31490151715612d7d576103e890046001600160a01b0316976401000276a3891115613dd9575b506e04444c5dc75cb358380d2e3de08a903b1561056157604051637a94c56560e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201528660448201525f81606481836e04444c5dc75cb358380d2e3de08a905af180156121b657613dc4575b50613998866136bf565b91604051606081018181106001600160401b03821117613db05760409081526001825260208083019586526001600160a01b03909b1682820190815290518b9590926139e48785613403565b8b8452604051633cf3645360e21b815289516001600160a01b039081166004830152895181166024830152955162ffffff166044820152955160020b60648701529c51841660848601529b51151560a48501529a5160c484015299511660e48201526101206101048201529788908190613a6390610124830190613388565b0381885a6e04444c5dc75cb358380d2e3de08a9090f1968715613cc2578597613d81575b506001600160801b03613a9f8860801d600f0b6136bf565b97169387818110613ce2575b613ac491505f80516020615e7083398151915254613545565b5f80516020615e708339815191525583613bd2575b5060a09020604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff600482015260248101859052909480826044816e04444c5dc75cb358380d2e3de08a905afa94851561056d5794613b80575b5050604080519586526020860192909252908401919091526001600160a01b0316917f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e9080606081015b0390a3565b90809450813d8311613bcb575b613b978183613403565b8101031261056157613b7b7f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e935193613b31565b503d613b8d565b516001600160a01b03166e04444c5dc75cb358380d2e3de08a903b156109405760405190630b0d9c0960e01b825260048201527337bfb8ac7c960e558657871d41ca70e07e7dbfff60248201528360448201528481606481836e04444c5dc75cb358380d2e3de08a905af18015613cc257908591613ccd575b5050731b54e762aa34cf6e28e9c082f2848e28e45da6b83b15610aa357604051630852cd8d60e31b815260048101849052848160248183731b54e762aa34cf6e28e9c082f2848e28e45da6b85af18015613cc257908591613cad575b50613ad9565b81613cb791613403565b610aa357835f613ca7565b6040513d87823e3d90fd5b81613cd791613403565b610aa357835f613c4b565b613ceb91613545565b6e04444c5dc75cb358380d2e3de08a903b1561093c5760405190630ab714fb60e11b82527337bfb8ac7c960e558657871d41ca70e07e7dbfff600483015286602483015260448201528581606481836e04444c5dc75cb358380d2e3de08a905af18015613d7657908691613d61575b5087613aab565b81613d6b91613403565b61094057845f613d5a565b6040513d88823e3d90fd5b9096508581813d8311613da9575b613d998183613403565b810103126109405751955f613a87565b503d613d8f565b634e487b7160e01b8a52604160045260248afd5b613dd19197505f90613403565b5f955f61398e565b97505f613921565b50505050505050505050565b60016001607f1b0396506138e9565b96505f6138d9565b505050505050505050505050565b90506020813d602011613e3c575b81613e2d60209383613403565b8101031261056157515f6138a6565b3d9150613e20565b50881561385d565b506020813d602011613e7d575b81613e6660209383613403565b81010312610561576001600160801b039051613848565b3d9150613e59565b5030330361004c57604051631652585760e01b60208201526001600160a01b039091166024808301919091528152613ec290613139604482613403565b565b63271a26f160e01b5f5260045ffd5b507337bfb8ac7c960e558657871d41ca70e07e7dbfff3314156136ee565b604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa9081156121b6575f91613f72575090565b90506020813d602011613f99575b81613f8d60209383613403565b81010312610561575190565b3d9150613f80565b359060ff8216820361056157565b3d15613fd9573d90613fc082613438565b91613fce6040519384613403565b82523d5f602084013e565b606090565b805f928101036020811261056157600260ff613ff984613fa1565b16036140b55760a01361087b5761400f81613fa1565b506020810135906001600160801b038216809203610832579082916080604051916020830193630fe1ea1160e01b855260248401526040810135604484015260608101356064840152013560848201526084815261406e60a482613403565b51907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af46140a4613faf565b90156140ad5790565b602081519101fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036121c1576040136105615760206140f782613fa1565b9101359060018060a01b0382168092036105615760ff168061416c575050303b156103f657604051630731a8c360e11b8152818160048183305af1801561088757908291614157575b50505b60405190614152602083613403565b815290565b8161416191613403565b6103f657805f614140565b6001036141ba57303b156105615760405190637d73714d60e01b825260048201525f8160248183305af180156121b6576141a7575b50614143565b6141b391505f90613403565b5f806141a1565b63091c731b60e31b5f5260045ffd5b5f80516020615d10833981519152546001600160401b038160401c164210156142035760801c60ff16156141fd57610dac90565b6105dc90565b506109c490565b604051627eeac760e11b81523060048201525f60248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613f72575090565b7f0000000000000000000000000000000000000000000000000000000000000000421061431a576040516340bd8e6960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f916142e8575b506142e2575f90565b610dac90565b90506020813d602011614312575b8161430360209383613403565b8101031261056157515f6142d9565b3d91506142f6565b6040516318160ddd60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90614378575b63ffffffff16151590506142e2575f90565b506020813d6020116143b3575b8161439260209383613403565b81010312610561575163ffffffff811681036105615763ffffffff90614366565b3d9150614385565b3560ff811681036105615790565b903590601e198136030182121561056157018035906001600160401b0382116105615760200191813603831361056157565b3561ffff811681036105615790565b356001600160401b03811681036105615790565b906001600160401b03809116911603906001600160401b038211612d7d57565b92919261444a82613438565b916144586040519384613403565b829481845281830111610561578281602093845f960137010152565b6040516101e081018181106001600160401b03821117613424576145e76101c06042946001600160401b03936040525f60608601525f60808601525f60a08601525f60c08601525f60e08601525f6101008601525f6101208601525f6101408601525f6101608601525f6101808601525f6101a08601525f8286015280358552602081013560208601526040810135604086015260ff614516606083016143bb565b16606086015261453361452c60808301836143c9565b369161443e565b60208151910120608086015260a081013560a08601528361455660c0830161440a565b1660c08601528361456960e0830161440a565b1660e086015261010081013561010086015261012081013561012086015261ffff61459761014083016143fb565b1661014086015261ffff6145ae61016083016143fb565b1661016086015261ffff6145c561018083016143fb565b16610180860152836145da6101a0830161440a565b166101a08601520161440a565b166101c082015260405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fee3b0f8c46969f9c96cbdb258d9bc22f87f49dba9cd39b7a7f091505ea4b9ccd60408201527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260a0815261468060c082613403565b519020906001600160401b036101c0604051927f9c61a909d173aec816b2730e20b6caa3a25ca10c8a084dbf023e026e53874db4602085015280516040850152602081015160608501526040810151608085015260ff60608201511660a0850152608081015160c085015260a081015160e08501528260c0820151166101008501528260e08201511661012085015261010081015161014085015261012081015161016085015261ffff6101408201511661018085015261ffff610160820151166101a085015261ffff6101808201511682850152826101a0820151166101e0850152015116610200820152610200815261477d61022082613403565b602081519101206040519161190160f01b8352600283015260228201522090565b62028dd45a10613ec257604051637de4c18d60e01b81526020816004815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620249f0f16147f25750565b61480a9060203d602011612824576128168183613403565b50565b80515f918291906020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af461484b613faf565b90156140ad5750565b5f80516020615db08339815191525c801561487d575b62ffffff165f198101908111612d7d5790565b50700dac0007d00005dc000bb80032c80059d961486a565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610561571461492557670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90606082901b905f19600160601b8409928280851094039380850394858411156105615714614925578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f19818509938380861095039480860395868511156105615714614a27579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b5f80516020615d508339815191525460ff8160b81c1615908115614b4f575b8115614b2f575b8115614ae5575b8115614ac4575b8115614aa4575b508015614a86575b614a7857565b62820f3560e61b5f5260045ffd5b5060643562ffffff8116808203610561576280000091501415614a72565b608435600281900b9250828103610561575060a01c60020b14155f614a6a565b905060a4356001600160a01b03811690818103610561575030141590614a63565b90506044356001600160a01b0381169081810361056157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141590614a5c565b90506024356001600160a01b038116908181036105615750151590614a55565b5f80516020615d70833981519152546001600160a01b0316159150614a4e565b60c4358015159081810361056157505f60e435121490565b60e4355f811290815f14614bc05760010190600182128015821691151617612d7d57614bb2906136bf565b60018101809111612d7d5790565b905090565b6001607f1b811015614bd757600f0b90565b6393dafdf160e01b5f5260045ffd5b5f80516020615e30833981519152546001600160401b038160401c168015159182614c1d575b5081614c16575090565b9050421090565b6001600160401b031642101591505f614c0c565b604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201526020816044816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91614c9c575b5080614c8e57505f90565b5f198101908111612d7d5790565b90506020813d602011614cc6575b81614cb760209383613403565b8101031261056157515f614c83565b3d9150614caa565b905f80516020615e7083398151915254917ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b254915f80516020615e30833981519152548060c01c92614d208587613538565b8110613ec45784612bd087614d3493613545565b9084151580614dd9575b614d71575b5080614d4c5750565b9092614d589250613538565b906170804201804211612d7d576001600160401b031690565b94614d94919495844210155f14614d9b5750614d8e868092613538565b95613545565b925f614d43565b614dd26001600160401b03614d8e9260801c166001600160401b03614dca614dc38342613545565b928961441e565b1690896149af565b8092613538565b506001600160401b038160801c164211614d3e565b614e00614df9614854565b80926136ac565b90620f424003620f42408111612d7d57614e199161368e565b90565b604051602081019182526006604082015260408152614e3c606082613403565b51902090565b91907f00000000000000000000000000000000000000000000000000000000000000004210615666575f80516020615db08339815191525c801561564e575b62ffffff614e939160481c16846136ac565b604051630abb87c960e11b81525f94917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691620f424090910490602081600481865afa9081156121b6575f9161561c575b506155d1575f905b6040516340bd8e6960e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081600481855afa9081156121b6575f9161559f575b50615555575f5b5f80516020615db08339815191525c801561553d575b614f7762ffffff620f42409260301c16886136ac565b04945f80516020615d908339815191525c9284838a8a8a8a6001600160a01b038a166154df57612bd09250614fb994612bd0612bd092612bd05f998a98613545565b9481806154a5575b5050897f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d83615449575b84615410575b620151806150427f000000000000000000000000000000000000000000000000000000000000000042613545565b049186615356575b50826151f5575b505050965f80516020615dd083398151915260405f80516020615df0833981519152945f80516020615e5083398151915282955f80516020615e108339815191529b9c6150b485519283928d846040919493926060820195825260208201520152565b0390a18151908882526020820152a18151908582526020820152a180615199575b6103e882049281841161518f575b83827f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf068161514f8161516d96612bd061511f8861518a9b613545565b887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b604080518981526020810192909252810191909152606090a1613545565b604051938493846040919493926060820195825260208201520152565b0390a1565b90925082906150e3565b6151f0816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6150d5565b8a9061522b84827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b1561087b578190602460405180948193632cd49aed60e01b83528860048401525af1801561534b57615332575b505f80516020615df0833981519152945f80516020615e508339815191526040955f80516020615e108339815191529b9c957ff548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea5f80516020615dd0833981519152968c6153228b987f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c0582408a5180615303848888846040919493926060820195825260208201520152565b0390a18951938493846040919493926060820195825260208201520152565b0390a1959c9b5095505094615051565b61533d8b8092613403565b615347575f61525a565b8980fd5b6040513d8d823e3d90fd5b61538a87827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528c60048401525af180156121b6576153fb575b5060408051898152602081018890529081018390527f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f86190606090a15f61504a565b615408919b505f90613403565b5f995f6153ba565b61544485307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b615014565b6154a0846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61500e565b6154d8917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b5f81614fc1565b614fb994612bd0612bd092612bd0620f424061551c612bd0985f80516020615db08339815191525c8015615525575b60901c62ffffff16906136ac565b04998a98613545565b50700dac0007d00005dc000bb80032c80059d961550e565b50700dac0007d00005dc000bb80032c80059d9614f61565b5f80516020615db08339815191525c8015615587575b61558162ffffff620f42409260781c16876136ac565b04614f4b565b50700dac0007d00005dc000bb80032c80059d961556b565b90506020813d6020116155c9575b816155ba60209383613403565b8101031261056157515f614f44565b3d91506155ad565b5f80516020615db08339815191525c8015615604575b6155fd62ffffff620f42409260601c16856136ac565b0490614ef5565b50700dac0007d00005dc000bb80032c80059d96155e7565b90506020813d602011615646575b8161563760209383613403565b8101031261056157515f614eed565b3d915061562a565b50700dac0007d00005dc000bb80032c80059d9614e81565b5f9260328104936105dc82028281046105dc1483151715612d7d57620f4240900492620f42406156a262ffffff61569b6135a5565b16856136ac565b0490620f42406156be62ffffff6156b7614265565b16866136ac565b04946156dc886156d688612bd087612bd08786613545565b93613545565b9582615b17575b81615ade575b836159bc575b80615841575b50604061518a945f80516020615dd08339815191528261516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152998651938493846040919493926060820195825260208201520152565b0390a18151908a82526020820152a18151908782526020820152a1846157e5575b847f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf066103e8860496879361514f6157b58684613545565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b61583c856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61577e565b84808060246001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906158a190879083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b604051632cd49aed60e01b8152600481018790529485915af1156159b4575061518a945f80516020615dd0833981519152604061516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152997f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240879a61598a6159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b7f00000000000000000000000000000000000000000000000000000000000000009061368e565b895186815260208101929092526040820152606090a199505050979d9c50509650505094506156f5565b3d86823e3d90fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690615a1790869083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528a60048401525af180156121b657615ac9575b507f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861615ac1615aa26159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b604051918291888b846040919493926060820195825260208201520152565b0390a16156ef565b615ad69195505f90613403565b5f935f615a47565b615b1282307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b6156e9565b615b6e836001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6156e3565b8151919060418303615ba357615b9c9250602082015190606060408401519301515f1a90615c8d565b9192909190565b50505f9160029190565b6004811015615c0d5780615bbf575050565b60018103615bd65763f645eedf60e01b5f5260045ffd5b60028103615bf1575063fce698f760e01b5f5260045260245ffd5b600314615bfb5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60645f92838093604051968793630ab714fb60e11b855260018060a01b0316600485015282602485015260448401525af115615c5a5750565b3d5f823e3d90fd5b60445f92838093604051968793636a770b0f60e01b8552600485015260248401525af115615c5a5750565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615d04579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156121b6575f516001600160a01b03811615615cfa57905f905f90565b505f906001905f90565b5050505f916003919056fefabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8dd5ccc9a085f7022bb20616af7bbc7e01242e18f7a415e423214526aa90e6532c03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26703f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2680e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ee0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ed03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df492127adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b453d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b1954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b3a26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a00336080806040526004361015610012575f80fd5b5f3560e01c9081631b2df8501461089d57508063231a80eb14610880578063436044361461072057806347f543bc1461057c5780635890dea41461055f57806382bfefc8146105315780638a603e77146101af5780638e88a1f114610140578063a54eb24214610112578063ab8a2731146100eb578063af6e6238146100c15763c24dbebd146100a0575f80fd5b346100bd575f3660031901126100bd576020604051620246088152f35b5f80fd5b346100bd5760203660031901126100bd576004355f526002602052602060405f2054604051908152f35b346100bd575f3660031901126100bd575f546040516001600160a01b039091168152602090f35b346100bd575f3660031901126100bd5760206040517337bfb8ac7c960e558657871d41ca70e07e7dbfff8152f35b346100bd5760803660031901126100bd576101596108c4565b6024359081151582036100bd576064359067ffffffffffffffff82116100bd5760409261018d6101999336906004016108da565b92909160443591610a9c565b82516001600160a01b0390921682526020820152f35b346100bd5736600319016101a081126100bd57610160136100bd576101643567ffffffffffffffff81116100bd576101eb9036906004016108da565b610184357fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5c15801590610492575b610483576001600160a01b0361022e6109b8565b16158015610478575b8015610412575b80156103d6575b6103c757612710811080156103bb575b8015610385575b610364576102d26020916102e060043595865f52600285525f604081205560017fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5d6040519384918683019763676bab0160e01b89526102be602485016109ce565b6101806101848501526101a4840191610a7c565b03601f198101845283610908565b6102e86109b8565b935f6040519586945193f160203d141690519015908115610373575b50610364575f7fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5d6001600160a01b0361033c6109b8565b16907f2f999a7ea97ae4d5b2ee9cc0c93865dc0eeff8748b89107bda512070e182276b5f80a3005b636670a33360e11b5f5260045ffd5b63676bab0160e01b1415905082610304565b505a610394603f830483610a6f565b9061753082018092116103a7571061025c565b634e487b7160e01b5f52601160045260245ffd5b50624c4b408111610255565b63300262ab60e21b5f5260045ffd5b506004355f52600260205260405f205460405160208101906103f7826109ce565b610160815261040861018082610908565b5190201415610245565b5067ffffffffffffffff821161046457604051610439601f8401601f191660200182610908565b828152602081019036848601116100bd57838583375f6020858301015251902061014435141561023e565b634e487b7160e01b5f52604160045260245ffd5b506110008211610237565b63665671f160e11b5f5260045ffd5b5060405163789add5560e11b81527fc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab2360048201526020816024816e04444c5dc75cb358380d2e3de08a905afa908115610526575f916104f4575b50151561021a565b90506020813d60201161051e575b8161050f60209383610908565b810103126100bd5751846104ec565b3d9150610502565b6040513d5f823e3d90fd5b346100bd575f3660031901126100bd576020604051731b54e762aa34cf6e28e9c082f2848e28e45da6b88152f35b346100bd575f3660031901126100bd576020600154604051908152f35b346100bd5760203660031901126100bd576105956108c4565b604051638da5cb5b60e01b8152602081600481731b54e762aa34cf6e28e9c082f2848e28e45da6b85afa908115610526575f916106de575b506001600160a01b031633036106cf576001600160a01b038116903082149081156106b1575b8115610693575b811561067a575b811561065e575b5061064f575f80546001600160a01b03198116831782556001600160a01b0316907f6af262ca96275dc40852dc5ae38406689d6f49c801c16c17cb6c84f103052fc39080a3005b631bb2296560e31b5f5260045ffd5b821515915081610670575b5082610608565b90503b1582610669565b6e04444c5dc75cb358380d2e3de08a9083149150610601565b731b54e762aa34cf6e28e9c082f2848e28e45da6b8831491506105fa565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff831491506105f3565b63ea8e4eb560e01b5f5260045ffd5b90506020813d602011610718575b816106f960209383610908565b810103126100bd57516001600160a01b03811681036100bd57826105cd565b3d91506106ec565b346100bd576101003660031901126100bd5761073a6108c4565b6024356001600160a01b03811691908290036100bd576044358015158091036100bd5760643580600f0b8091036100bd576084359182600f0b8093036100bd577337bfb8ac7c960e558657871d41ca70e07e7dbfff33036106cf576001545f1981146103a757600101938460015560405194610160860186811067ffffffffffffffff82111761046457604052855260018060a01b03169485602086015260408501526060840152608083015260a082015260a43560c082015260c43560e0820152436101008201524261012082015260e435610140820152604051602081019061083781610829858561092a565b03601f198101835282610908565b51902081515f52600260205260405f20557f23ef78eb4b2ee5bd54d6c81877dd7e33c243f72a1039c0e7b302b6caccd8c1df61087b8251926040519182918261092a565b0390a3005b346100bd575f3660031901126100bd576020604051620138808152f35b346100bd575f3660031901126100bd57806e04444c5dc75cb358380d2e3de08a9060209252f35b600435906001600160a01b03821682036100bd57565b9181601f840112156100bd5782359167ffffffffffffffff83116100bd57602083818601950101116100bd57565b90601f8019910116810190811067ffffffffffffffff82111761046457604052565b919091610140806101608301948051845260018060a01b03602082015116602085015260018060a01b0360408201511660408501526060810151151560608501526080810151600f0b608085015260a0810151600f0b60a085015260c081015160c085015260e081015160e08501526101008101516101008501526101208101516101208501520151910152565b6024356001600160a01b03811681036100bd5790565b60043581526024356001600160a01b038116908190036100bd5760208201526044356001600160a01b038116908190036100bd5760408201526064358015158091036100bd57606082015260843580600f0b8091036100bd57608082015260a43580600f0b8091036100bd5760a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b919082018092116103a757565b908060209392818452848401375f828201840152601f01601f1916010190565b93919094926110008311610d7e575f546001600160a01b031695700dac0007d00005dc000bb80032c80059d9938715610d755762019a285a10610d665760405160a0810181811067ffffffffffffffff821117610464576040525f8152731b54e762aa34cf6e28e9c082f2848e28e45da6b86020820152628000006040820152600160608201527337bfb8ac7c960e558657871d41ca70e07e7dbfff6080820152610b4960a08220610d8d565b9060405191631e2eaeaf60e01b835260048301526020826024816e04444c5dc75cb358380d2e3de08a905afa918215610526575f92610d31575b5060a0610b909120610d8d565b90600382018092116103a75760405191631e2eaeaf60e01b835260048301526020826024816e04444c5dc75cb358380d2e3de08a905afa918215610526575f92610cf2575b5060405163dc88d0cf60e01b602082019081526001600160a01b039a8b1660248301529415156044820152606481019690965290971660848501526001600160801b0390961660a484015260c060c484015294610c3d9183916108299160e484019190610a7c565b60c08091604051958691610c518484610908565b8336843751908862013880fa903d141615610cee575f91829190825b6006851015610cca578460051b86015190620246088211610cc05781610c9291610a6f565b9360018601918287116103a7576018830292808404601814901517156103a7576001921b1794019392610c6d565b5091945092505050565b93509350620246088311610ce85750600182018092116103a7571790565b92915050565b9150565b949150916020853d602011610d29575b81610d0f60209383610908565b810103126100bd5793519093916001600160801b03610bd5565b3d9150610d02565b9091506020813d602011610d5e575b81610d4d60209383610908565b810103126100bd57519060a0610b83565b3d9150610d40565b638e0b841160e01b5f5260045ffd5b50929450505050565b63b5cef68360e01b5f5260045ffd5b604051602081019182526006604082015260408152610dad606082610908565b5190209056fea2646970667358221220189bf1649881170d63b9bd59e156a5dea6ce48fd5fb34573452e6e59c5139c6264736f6c634300081a00335edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c563ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2","sourceMap":"1530:10197:73:-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;1052:28:86;;:33;1048:66;;1124:21;1530:10197:73;1124:21:86;2491:23:87;;:54;;;;-1:-1:-1;2487:83:87;;1530:10197:73;2580:27:87;1530:10197:73;2617:35:87;3407:4:80;1530:10197:73;3399:13:80;1530:10197:73;;-1:-1:-1;;;4729:22:80;;1530:10197:73;;4729:22:80;1530:10197:73;4729:22:80;;;;;;;;;-1:-1:-1;4729:22:80;;;-1:-1:-1;;;;;;;1530:10197:73;4721:51:80;;;;:107;;-1:-1:-1;4717:176:80;;1530:10197:73;;-1:-1:-1;;;4914:22:80;;1530:10197:73;;4729:22:80;1530:10197:73;4914:22:80;;;;;;;;;-1:-1:-1;4914:22:80;;;-1:-1:-1;;;;;;;1530:10197:73;4906:51:80;;;;:76;;-1:-1:-1;4902:137:80;;1530:10197:73;;-1:-1:-1;;;5073:19:80;;1530:10197:73;;4729:22:80;1530:10197:73;5073:19:80;;;;;;;;;-1:-1:-1;5073:19:80;;;-1:-1:-1;;;;;;;1530:10197:73;5065:48:80;;;;:83;;-1:-1:-1;5065:136:80;;;;-1:-1:-1;5048:194:80;;1530:10197:73;;-1:-1:-1;;;5269:17:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5269:17:80;;;;;;;-1:-1:-1;5269:17:80;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;5290:15:80;;1530:10197:73;;4729:22:80;1530:10197:73;;5290:15:80;;;;;;;-1:-1:-1;5290:15:80;;;-1:-1:-1;;;;;;;1530:10197:73;;;;;5269:36:80;;;;:93;;-1:-1:-1;5269:172:80;;;;-1:-1:-1;5269:243:80;;;;-1:-1:-1;5269:313:80;;;;-1:-1:-1;5252:371:80;;1530:10197:73;;-1:-1:-1;;;5646:16:80;;1530:10197:73;;4729:22:80;1530:10197:73;5646:16:80;;;;;;;;-1:-1:-1;5646:16:80;;;-1:-1:-1;5633:29:80;1530:10197:73;5633:29:80;1530:10197:73;;;;;;;5672:22:80;1530:10197:73;5704:19:80;5733:27;1530:10197:73;5733:27:80;5770:18;1530:10197:73;5770:18:80;1530:10197:73;5798:25:80;1530:10197:73;;;;;;;5833:27:80;1530:10197:73;;1903:56;;;1333:11:82;;1530:10197:73;;4729:22:80;1530:10197:73;;;;;;;;1333:11:82;;;;;;;-1:-1:-1;1333:11:82;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;1348:15:82;;1530:10197:73;;4729:22:80;1530:10197:73;1348:15:82;;;;;;;;-1:-1:-1;1348:15:82;;;-1:-1:-1;;;;;;;1530:10197:73;;;;;1333:30:82;;;;:75;;-1:-1:-1;1333:139:82;;;;-1:-1:-1;1329:175:82;;-1:-1:-1;;;;;1530:10197:73;;;1514:10:82;;;1530:10197:73;;-1:-1:-1;;;1623:17:82;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;1623:17:82;;;;;;;4729:22:80;1623:17:82;1530:10197:73;1623:17:82;-1:-1:-1;1623:17:82;;;-1:-1:-1;;1530:10197:73;1605:35:82;1530:10197:73;;-1:-1:-1;;;1669:12:82;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;1669:12:82;;;;;;;-1:-1:-1;1669:12:82;;;-1:-1:-1;;1530:10197:73;1650:31:82;1530:10197:73;;-1:-1:-1;;;1755:16:83;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1755:16:83;;;;;;;-1:-1:-1;1755:16:83;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;1853:16:83;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;4729:22:80;1530:10197:73;1853:16:83;;;;;;;;-1:-1:-1;1853:16:83;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;1920:15:83;;1530:10197:73;;;4729:22:80;1530:10197:73;1920:15:83;;;;;;;;-1:-1:-1;1920:15:83;;;-1:-1:-1;1530:10197:73;;;;;;;:::i;:::-;-1:-1:-1;552:8:42;;1530:10197:73;;;;;;;1804:133:83;;552:8:42;;1530:10197:73;1804:133:83;;552:8:42;1530:10197:73;;;1804:133:83;;552:8:42;1530:10197:73;;;;;;;1804:133:83;;552:8:42;1530:10197:73;;1903:56;;;1959:16:83;;1530:10197:73;1959:16:83;4729:22:80;1959:16:83;;;;;;;;;-1:-1:-1;1959:16:83;;;-1:-1:-1;;;;;;;1530:10197:73;1951:46:83;;;;;:93;;-1:-1:-1;1951:149:83;;;;;-1:-1:-1;1951:212:83;;;;;-1:-1:-1;1951:261:83;;;;;;-1:-1:-1;1947:297:83;;-1:-1:-1;;;;;1530:10197:73;;;2254:26:83;;1530:10197:73;;-1:-1:-1;;;1841:21:99;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;;;1841:21:99;;;;;;;-1:-1:-1;1841:21:99;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;1833:55:99;;;;:111;;-1:-1:-1;1833:168:99;;;;-1:-1:-1;1833:213:99;;;;-1:-1:-1;1829:249:99;;2088:24;;;;1530:10197:73;;;;;;-1:-1:-1;;;925:17:96;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;925:17:96;;;;;;;-1:-1:-1;925:17:96;;;-1:-1:-1;;;;;;;1530:10197:73;;;902:41:96;;1530:10197:73;;;;;;-1:-1:-1;;;973:21:96;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;;973:21:96;;;;;;;-1:-1:-1;973:21:96;;;-1:-1:-1;;953:41:96;;1530:10197:73;;;;;;-1:-1:-1;;;3025:20:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;3025:20:97;;;;;;-1:-1:-1;3025:20:97;;;-1:-1:-1;4729:22:80;1530:10197:73;;;;;;;;;;;;;;;;;;;;;1903:56;;;;;;;3136:19:97;;;;;;;;;-1:-1:-1;3136:19:97;;;-1:-1:-1;4729:22:80;1530:10197:73;;;;;;;;:::i;:::-;-1:-1:-1;552:8:42;;1530:10197:73;;;;;;;2951:215:97;;552:8:42;;1530:10197:73;2951:215:97;;552:8:42;1530:10197:73;2951:215:97;;552:8:42;1530:10197:73;;;;;;;2951:215:97;;552:8:42;1530:10197:73;;;;;;;;;;;;;1903:56;;;;;;;3197:21:97;;;;;;;;;4729:22:80;3197:21:97;-1:-1:-1;3197:21:97;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;3251:16:97;;1530:10197:73;;;;;1903:56;1530:10197;;-1:-1:-1;;;;;1530:10197:73;3251:16:97;;;;;;;-1:-1:-1;3251:16:97;;;-1:-1:-1;;;;;;;1530:10197:73;;3294:31:97;:36;;:98;;;;-1:-1:-1;3294:198:97;;;;-1:-1:-1;3294:258:97;;;;-1:-1:-1;3294:341:97;;;;-1:-1:-1;3294:399:97;;;;;-1:-1:-1;3294:432:97;;;;-1:-1:-1;3294:458:97;;;;-1:-1:-1;3294:512:97;;;;-1:-1:-1;3294:568:97;;;;-1:-1:-1;3277:621:97;;3908:22;;;;-1:-1:-1;;;;;1530:10197:73;;3944:31:97;:36;:98;;;;-1:-1:-1;3944:177:97;;;;-1:-1:-1;3944:233:97;;;;-1:-1:-1;3944:279:97;;;;-1:-1:-1;3940:344:97;;4293:33;;;;4336:28;;4374:30;;-1:-1:-1;;;;;1530:10197:73;;1193:29:98;:34;:89;;;;-1:-1:-1;1193:161:98;;;;-1:-1:-1;1193:236:98;;;;-1:-1:-1;1193:290:98;;;;-1:-1:-1;1193:340:98;;;;-1:-1:-1;1193:382:98;;;;-1:-1:-1;1189:426:98;;1625:21;;;;1530:10197:73;;-1:-1:-1;;;1677:19:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1677:19:98;;;;;;;-1:-1:-1;1677:19:98;;;-1:-1:-1;;1656:40:98;;1530:10197:73;;-1:-1:-1;;;1728:21:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1728:21:98;;;;;;;-1:-1:-1;1728:21:98;;;-1:-1:-1;1706:43:98;;;3407:4:80;2481:13:73;;1530:10197;;;;;;;;2939:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3088:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3238:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3387:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3533:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3679:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3830:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3975:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;4123:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;-1:-1:-1;;;;;1530:10197:73;;4271:42;6140:18;;;;1530:10197;6140:52;;-1:-1:-1;6136:84:73;;;-1:-1:-1;;;;;1530:10197:73;;4418:42;6140:18;;;;1530:10197;6140:52;;-1:-1:-1;6136:84:73;;;-1:-1:-1;;;;;1530:10197:73;;4565:42;6140:18;;;;;;;:52;;-1:-1:-1;6136:84:73;;-1:-1:-1;;;;;1530:10197:73;;4710:42;6140:18;;;;1530:10197;6140:52;;-1:-1:-1;6136:84:73;;;1530:10197;;;;-1:-1:-1;;;;;1530:10197:73;4852:42;4835:59;;;;:162;;-1:-1:-1;4835:195:73;;;;-1:-1:-1;4831:227:73;;1530:10197;;-1:-1:-1;;;;;1530:10197:73;;5163:29;;5206:36;;1530:10197;;5206:36;;1530:10197;;:::i;:::-;5206:36;;;1530:10197;5206:36;;;;;;1530:10197;5196:47;;5163:80;5160:111;;5281:22;;1530:10197;;-1:-1:-1;;;;;1530:10197:73;2939:42;5489:41;;;;1530:10197;5489:74;;-1:-1:-1;5489:105:73;;;;-1:-1:-1;5489:190:73;;;;-1:-1:-1;5489:308:73;;;;-1:-1:-1;5489:389:73;;;;;-1:-1:-1;5489:503:73;;;;;-1:-1:-1;5485:547:73;;;1530:10197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2254:26:83;1530:10197:73;;;;;;;;;;2088:24:99;1530:10197:73;;;;;902:41:96;1530:10197:73;;;;;953:41:96;1530:10197:73;;;;;3908:22:97;1530:10197:73;;;;;;;;;;;;;;;;;;;;4293:33:97;1530:10197:73;;;;;;;;;;4336:28:97;1530:10197:73;;;;;;;;;;4374:30:97;1530:10197:73;;;;;1625:21:98;1530:10197:73;;;;;;;;;;;;;;;1656:40:98;1530:10197:73;;;;;;;;;;;;;;;1706:43:98;1530:10197:73;;;;;2481:13;1530:10197;;;;;5281:22;1530:10197;;;;;;;;;;;;;;;;;;;;;5485:547;6201:19;;;-1:-1:-1;6013:19:73;4729:22:80;-1:-1:-1;6013:19:73;5489:503;-1:-1:-1;;;;;1530:10197:73;5894:28;-1:-1:-1;;;;;;;;;;;5894:98:73;;;-1:-1:-1;5489:503:73;;;:389;;-1:-1:-1;5489:389:73;;;:308;1530:10197;;;-1:-1:-1;;;;;1530:10197:73;5695:32;-1:-1:-1;;;;;;;;;;;5695:102:73;;;-1:-1:-1;5489:308:73;;;:190;1530:10197;;;;-1:-1:-1;;;;;1530:10197:73;3830:42;5610:69;;;-1:-1:-1;5489:190:73;;:105;1530:10197;;;;;;-1:-1:-1;;;5567:19:73;;1530:10197;;-1:-1:-1;1530:10197:73;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;5567:19;;;;;;-1:-1:-1;5567:19:73;;;5489:105;-1:-1:-1;;;;;1530:10197:73;1653:42;5567:27;;;5489:105;-1:-1:-1;5489:105:73;;5567:19;;1530:10197;5567:19;;1530:10197;5567:19;;;;;;1530:10197;5567:19;;;:::i;:::-;;;1903:56;;;;1530:10197;1653:42;1530:10197;;:::i;:::-;5567:19;;1903:56;-1:-1:-1;1530:10197:73;;5567:19;;;-1:-1:-1;5567:19:73;;;1530:10197;;1903:56;-1:-1:-1;1903:56:73;;;;;5489:74;1530:10197;;;;;;-1:-1:-1;;;5534:20:73;;1530:10197;;-1:-1:-1;1530:10197:73;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;5534:20;;;;;;-1:-1:-1;5534:20:73;;;5489:74;-1:-1:-1;;;;;1530:10197:73;1815:42;5534:29;;;5489:74;-1:-1:-1;5489:74:73;;5534:20;;1530:10197;5534:20;;1530:10197;5534:20;;;;;;1530:10197;5534:20;;;:::i;:::-;;;1903:56;;;;1530:10197;1815:42;1530:10197;;:::i;:::-;5534:20;;;;;-1:-1:-1;5534:20:73;;4835:195;1530:10197;;;;;;;;5013:17;;4835:195;;:162;1530:10197;4931:66;1530:10197;;;;4910:87;;4835:162;;6140:52;-1:-1:-1;;;;;1530:10197:73;6162:15;4754:66;6162:30;;;-1:-1:-1;6140:52:73;;;;-1:-1:-1;;;;;;1530:10197:73;;6162:15;-1:-1:-1;;;;;;;;;;;6162:30:73;;6140:52;;;-1:-1:-1;;;;;1530:10197:73;6162:15;4462:66;6162:30;;;-1:-1:-1;6140:52:73;;;;-1:-1:-1;;;;;1530:10197:73;6162:15;4315:66;6162:30;;;-1:-1:-1;6140:52:73;;;;4167:66;6162:15;;;:30;;6140:52;;;;4019:66;6162:15;;;:30;;6140:52;;;;-1:-1:-1;;;;;;;;;;;6162:15:73;;;:30;;6140:52;;;;3723:66;6162:15;;;:30;;6140:52;;;;3577:66;6162:15;;;:30;;6140:52;;;;3431:66;6162:15;;;:30;;6140:52;;;;3282:66;6162:15;;;:30;;6140:52;;;;3132:66;6162:15;;;:30;;6140:52;;;;2983:66;6162:15;;;:30;;6140:52;;;1728:21:98;;;1530:10197:73;1728:21:98;;1530:10197:73;1728:21:98;;;;;;1530:10197:73;1728:21:98;;;:::i;:::-;;;1530:10197:73;;;;;1728:21:98;;;;;;-1:-1:-1;1728:21:98;;1677:19;;;1530:10197:73;1677:19:98;;1530:10197:73;1677:19:98;;;;;;1530:10197:73;1677:19:98;;;:::i;:::-;;;1530:10197:73;;;;;1677:19:98;;;;;;-1:-1:-1;1677:19:98;;1189:426;1596:19;;;-1:-1:-1;1596:19:98;4729:22:80;-1:-1:-1;1596:19:98;1193:382;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1549:16:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1549:16:98;;;;;;-1:-1:-1;1549:16:98;;;1193:382;1569:6;1549:26;;;;1193:382;;1549:16;;1530:10197:73;1549:16:98;;1530:10197:73;1549:16:98;;;;;;1530:10197:73;1549:16:98;;;:::i;:::-;;;1530:10197:73;;;;1569:6:98;1530:10197:73;;1549:16:98;;;;;-1:-1:-1;1549:16:98;;1193:340;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1487:21:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1487:21:98;;;;;;;-1:-1:-1;1487:21:98;;;1193:340;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1512:21:98;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1512:21:98;;;;;;;-1:-1:-1;1512:21:98;;;1193:340;-1:-1:-1;;;;;;1530:10197:73;1487:46:98;;1193:340;;1512:21;;;;1530:10197:73;1512:21:98;1530:10197:73;1512:21:98;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1487;;;1530:10197:73;1487:21:98;;1530:10197:73;1487:21:98;;;;;;1530:10197:73;1487:21:98;;;:::i;:::-;;;1530:10197:73;;;;;1487:21:98;;;;;;-1:-1:-1;1487:21:98;;1193:290;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1445:15:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1445:15:98;;;;;;;-1:-1:-1;1445:15:98;;;1193:290;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1464:19:98;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1464:19:98;;;;;;;-1:-1:-1;1464:19:98;;;1193:290;-1:-1:-1;;;;;;1530:10197:73;;;;;1445:38:98;;1193:290;;1464:19;;;1530:10197:73;1464:19:98;;1530:10197:73;1464:19:98;;;;;;1530:10197:73;1464:19:98;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1464:19:98;;;;;;-1:-1:-1;1464:19:98;;1445:15;;;1530:10197:73;1445:15:98;;1530:10197:73;1445:15:98;;;;;;1530:10197:73;1445:15:98;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1445:15:98;;;;;;-1:-1:-1;1445:15:98;;1193:236;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1378:25:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1378:25:98;;;;;;;-1:-1:-1;1378:25:98;;;1193:236;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;1370:59:98;;1193:236;;1378:25;;;1530:10197:73;1378:25:98;;1530:10197:73;1378:25:98;;;;;;1530:10197:73;1378:25:98;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1378:25:98;;;;;;-1:-1:-1;1378:25:98;;1193:161;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1306:22:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1306:22:98;;;;;;;-1:-1:-1;1306:22:98;;;1193:161;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;1298:56:98;;1193:161;;1306:22;;;1530:10197:73;1306:22:98;;1530:10197:73;1306:22:98;;;;;;1530:10197:73;1306:22:98;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1306:22:98;;;;;;-1:-1:-1;1306:22:98;;1193:89;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1239:21:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1239:21:98;;;;;;;-1:-1:-1;1239:21:98;;;1193:89;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;1231:51:98;;1193:89;;1239:21;;;1530:10197:73;1239:21:98;;1530:10197:73;1239:21:98;;;;;;1530:10197:73;1239:21:98;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;1239:21:98;;;;;;-1:-1:-1;1239:21:98;;3940:344:97;4246:27;;;-1:-1:-1;4246:27:97;4729:22:80;-1:-1:-1;4246:27:97;3944:279;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4181:18:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4181:18:97;;;;;;;-1:-1:-1;4181:18:97;;;3944:279;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;4203:20:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;4203:20:97;;;;;;;-1:-1:-1;4203:20:97;;;3944:279;-1:-1:-1;;;;;;1530:10197:73;;;;;4181:42:97;;3944:279;;4203:20;;;1530:10197:73;4203:20:97;;1530:10197:73;4203:20:97;;;;;;1530:10197:73;4203:20:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4203:20:97;;;;;;-1:-1:-1;4203:20:97;;4181:18;;;1530:10197:73;4181:18:97;;1530:10197:73;4181:18:97;;;;;;1530:10197:73;4181:18:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4181:18:97;;;;;;-1:-1:-1;4181:18:97;;3944:233;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4137:17:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4137:17:97;;;;;;;-1:-1:-1;4137:17:97;;;3944:233;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;4158:19:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;4158:19:97;;;;;;;-1:-1:-1;4158:19:97;;;3944:233;-1:-1:-1;;;;;;1530:10197:73;;;;;4137:40:97;;3944:233;;4158:19;;;1530:10197:73;4158:19:97;;1530:10197:73;4158:19:97;;;;;;1530:10197:73;4158:19:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4158:19:97;;;;;;-1:-1:-1;4158:19:97;;4137:17;;;1530:10197:73;4137:17:97;;1530:10197:73;4137:17:97;;;;;;1530:10197:73;4137:17:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4137:17:97;;;;;;-1:-1:-1;4137:17:97;;3944:177;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4066:29:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4066:29:97;;;;;;;-1:-1:-1;4066:29:97;;;3944:177;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;4058:63:97;;3944:177;;4066:29;;;1530:10197:73;4066:29:97;;1530:10197:73;4066:29:97;;;;;;1530:10197:73;4066:29:97;;;:::i;:::-;;;552:8:42;;;;1530:10197:73;;;:::i;:::-;4066:29:97;;;;;;-1:-1:-1;4066:29:97;;3944:98;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3992:24:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3992:24:97;;;;;;;-1:-1:-1;3992:24:97;;;3944:98;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;3984:58:97;;3944:98;;3992:24;;;1530:10197:73;3992:24:97;;1530:10197:73;3992:24:97;;;;;;1530:10197:73;3992:24:97;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;3992:24:97;;;;;;-1:-1:-1;3992:24:97;;3277:621;3880:18;;;-1:-1:-1;3880:18:97;4729:22:80;-1:-1:-1;3880:18:97;3294:568;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3810:27:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3810:27:97;;;;;;;-1:-1:-1;3810:27:97;;;3294:568;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;3810:52:97;;3294:568;;3810:27;;;1530:10197:73;3810:27:97;;1530:10197:73;3810:27:97;;;;;;1530:10197:73;3810:27:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;3810:27:97;;;;;;-1:-1:-1;3810:27:97;;3294:512;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3772:18:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3772:18:97;;;;;;;;-1:-1:-1;3772:18:97;;;3294:512;3772:34;;;3294:512;;3772:18;;;;1530:10197:73;3772:18:97;;1530:10197:73;3772:18:97;;;;;;1530:10197:73;3772:18:97;;;:::i;:::-;;;1530:10197:73;;;;;;;3772:18:97;;;;;;-1:-1:-1;3772:18:97;;3294:458;3730:22;3746:6;3730:22;;;3294:458;;:432;-1:-1:-1;3711:15:97;-1:-1:-1;;;;;1530:10197:73;;3697:29:97;3294:432;;:399;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3655:23:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3655:23:97;;;;;;;-1:-1:-1;3655:23:97;;;3294:399;-1:-1:-1;;;;;;1530:10197:73;;3655:38:97;;3294:399;;3655:23;;;1530:10197:73;3655:23:97;;1530:10197:73;3655:23:97;;;;;;1530:10197:73;3655:23:97;;;:::i;:::-;;;1530:10197:73;;;;;3655:23:97;;;;;;-1:-1:-1;3655:23:97;;3294:341;1530:10197:73;;-1:-1:-1;;;3586:19:97;;1530:10197:73;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3586:19:97;;;;;;;-1:-1:-1;3586:19:97;;;3294:341;357:173:56;1530:10197:73;357:173:56;;3572:63:97;;3294:341;;;3586:19;;;;1530:10197:73;3586:19:97;;1530:10197:73;3586:19:97;;;;;;1530:10197:73;3586:19:97;;;:::i;:::-;;;1530:10197:73;;;;;;;3586:19:97;;;;;-1:-1:-1;3586:19:97;;3294:258;1530:10197:73;;-1:-1:-1;;;3512:17:97;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3512:17:97;;;;;;;-1:-1:-1;3512:17:97;;;3294:258;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;3533:19:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;3533:19:97;;;;;;;-1:-1:-1;3533:19:97;;;3294:258;-1:-1:-1;;;;;;1530:10197:73;;;;;3512:40:97;;;3294:258;;3533:19;;;1530:10197:73;3533:19:97;;1530:10197:73;3533:19:97;;;;;;1530:10197:73;3533:19:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;3533:19:97;;;;;;-1:-1:-1;3533:19:97;;3512:17;;;1530:10197:73;3512:17:97;;1530:10197:73;3512:17:97;;;;;;1530:10197:73;3512:17:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;3512:17:97;;;;;;-1:-1:-1;3512:17:97;;3294:198;1530:10197:73;;-1:-1:-1;;;3420:28:97;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3420:28:97;;;;;;;-1:-1:-1;3420:28:97;;;3294:198;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;3461:30:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;3461:30:97;;;;;;;-1:-1:-1;3461:30:97;;;3294:198;-1:-1:-1;;;;;;1530:10197:73;;;;;3412:80:97;;;3294:198;;3461:30;;;;1530:10197:73;3461:30:97;1530:10197:73;3461:30:97;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3420:28;;;;1530:10197:73;3420:28:97;1530:10197:73;3420:28:97;;;;;;;:::i;:::-;;;;3294:98;1530:10197:73;;-1:-1:-1;;;3342:24:97;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3342:24:97;;;;;;;-1:-1:-1;3342:24:97;;;3294:98;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;3334:58:97;;;3294:98;;3342:24;;;1530:10197:73;3342:24:97;;1530:10197:73;3342:24:97;;;;;;1530:10197:73;3342:24:97;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;3342:24:97;;;;;;-1:-1:-1;3342:24:97;;3251:16;;;;1530:10197:73;3251:16:97;;1530:10197:73;3251:16:97;;;;;;1530:10197:73;3251:16:97;;;:::i;:::-;;;1530:10197:73;;;;;3251:16:97;;;;;;;-1:-1:-1;3251:16:97;;3197:21;;;;;1530:10197:73;3197:21:97;1530:10197:73;3197:21:97;;;;;;;:::i;:::-;;;;;3136:19;;;1530:10197:73;3136:19:97;;1530:10197:73;3136:19:97;;;;;;1530:10197:73;3136:19:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;4729:22:80;1530:10197:73;;:::i;:::-;3136:19:97;;;;;;-1:-1:-1;3136:19:97;;3025:20;;1530:10197:73;3025:20:97;;1530:10197:73;3025:20:97;;;;;;1530:10197:73;3025:20:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;4729:22:80;1530:10197:73;;:::i;:::-;3025:20:97;;;;;-1:-1:-1;3025:20:97;;973:21:96;;;1530:10197:73;973:21:96;;1530:10197:73;973:21:96;;;;;;1530:10197:73;973:21:96;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;973:21:96;;;;;;-1:-1:-1;973:21:96;;925:17;;;1530:10197:73;925:17:96;;1530:10197:73;925:17:96;;;;;;1530:10197:73;925:17:96;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;925:17:96;;;;;;-1:-1:-1;925:17:96;;1829:249:99;4859:23:80;;;-1:-1:-1;2055:23:99;4729:22:80;-1:-1:-1;2055:23:99;1833:213;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;2005:25:99;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;2005:25:99;;;;;;;-1:-1:-1;2005:25:99;;;1833:213;1530:10197:73;;;;;;;;;;2005:41:99;;1833:213;;2005:25;;;1530:10197:73;2005:25:99;;1530:10197:73;2005:25:99;;;;;;1530:10197:73;2005:25:99;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;2005:25:99;;;;;;-1:-1:-1;2005:25:99;;1833:168;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1960:18:99;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1960:18:99;;;;;;;-1:-1:-1;1960:18:99;;;1833:168;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1982:19:99;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1982:19:99;;;;;;;-1:-1:-1;1982:19:99;;;1833:168;-1:-1:-1;;;;;;1530:10197:73;;;;;1960:41:99;;1833:168;;1982:19;;;1530:10197:73;1982:19:99;;1530:10197:73;1982:19:99;;;;;;1530:10197:73;1982:19:99;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1982:19:99;;;;;;-1:-1:-1;1982:19:99;;1960:18;;;1530:10197:73;1960:18:99;;1530:10197:73;1960:18:99;;;;;;1530:10197:73;1960:18:99;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1960:18:99;;;;;;-1:-1:-1;1960:18:99;;1833:111;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1900:19:99;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1900:19:99;;;;;;;-1:-1:-1;1900:19:99;;;1833:111;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1924:20:99;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1924:20:99;;;;;;;-1:-1:-1;1924:20:99;;;1833:111;-1:-1:-1;;;;;;1530:10197:73;;;;;1892:52:99;;1833:111;;1924:20;;;1530:10197:73;1924:20:99;;1530:10197:73;1924:20:99;;;;;;1530:10197:73;1924:20:99;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1924:20:99;;;;;;-1:-1:-1;1924:20:99;;1900:19;;;;1530:10197:73;1900:19:99;1530:10197:73;1900:19:99;;;;;;;:::i;:::-;;;;1841:21;;;1530:10197:73;1841:21:99;;1530:10197:73;1841:21:99;;;;;;1530:10197:73;1841:21:99;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1841:21:99;;;;;;-1:-1:-1;1841:21:99;;1951:261:83;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;2179:19:83;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;2179:19:83;;;;;;;-1:-1:-1;2179:19:83;;;1951:261;-1:-1:-1;;;;;;1530:10197:73;2179:33:83;1951:261;;2179:19;;;1530:10197:73;2179:19:83;;1530:10197:73;2179:19:83;;;;;;1530:10197:73;2179:19:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;2179:19:83;;;;;;-1:-1:-1;2179:19:83;;1951:212;1530:10197:73;;-1:-1:-1;;;2118:15:83;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;4729:22:80;;1530:10197:73;;2118:15:83;;;;;;;-1:-1:-1;2118:15:83;;;1951:212;357:173:56;1530:10197:73;357:173:56;;2104:59:83;;1951:212;;;;2118:15;;;;1530:10197:73;2118:15:83;;1530:10197:73;2118:15:83;;;;;;1530:10197:73;2118:15:83;;;:::i;:::-;;;1530:10197:73;;;;;;;2118:15:83;;;;;-1:-1:-1;2118:15:83;;1951:149;1530:10197:73;;-1:-1:-1;;;2068:13:83;;1530:10197:73;;-1:-1:-1;1530:10197:73;;;4729:22:80;1530:10197:73;;2068:13:83;;;;;;;-1:-1:-1;2068:13:83;;;1951:149;-1:-1:-1;;;;;;1530:10197:73;2060:40:83;;;1951:149;;;2068:13;;;1530:10197:73;2068:13:83;;1530:10197:73;2068:13:83;;;;;;1530:10197:73;2068:13:83;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;2068:13:83;;;;;;-1:-1:-1;2068:13:83;;1951:93;1530:10197:73;;-1:-1:-1;;;2009:14:83;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;2009:14:83;;;;;;;;-1:-1:-1;2009:14:83;;;1951:93;1530:10197:73;;4729:22:80;1530:10197:73;;;1903:56;;;;;;;2028:16:83;;;;;;;;;-1:-1:-1;2028:16:83;;;1951:93;-1:-1:-1;;;;;;1530:10197:73;;;;;2001:43:83;;;1951:93;;;2028:16;;;1530:10197:73;2028:16:83;;1530:10197:73;2028:16:83;;;;;;1530:10197:73;2028:16:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;2028:16:83;;;;;;-1:-1:-1;2028:16:83;;2009:14;;;;1530:10197:73;2009:14:83;;1530:10197:73;2009:14:83;;;;;;1530:10197:73;2009:14:83;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;2009:14:83;1530:10197:73;2009:14:83;;;;;-1:-1:-1;2009:14:83;;1959:16;;;1530:10197:73;1959:16:83;;1530:10197:73;1959:16:83;;;;;;1530:10197:73;1959:16:83;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1959:16:83;;;;;;-1:-1:-1;1959:16:83;;1920:15;;;;1530:10197:73;1920:15:83;;1530:10197:73;1920:15:83;;;;;;1530:10197:73;1920:15:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1920:15:83;;;;;;;-1:-1:-1;1920:15:83;;1853:16;;;;1530:10197:73;1853:16:83;;1530:10197:73;1853:16:83;;;;;;1530:10197:73;1853:16:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1853:16:83;;;;;;;-1:-1:-1;1853:16:83;;1755;;;1530:10197:73;1755:16:83;;1530:10197:73;1755:16:83;;;;;;1530:10197:73;1755:16:83;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;1755:16:83;;;;;;-1:-1:-1;1755:16:83;;1669:12:82;;;1530:10197:73;1669:12:82;;1530:10197:73;1669:12:82;;;;;;1530:10197:73;1669:12:82;;;:::i;:::-;;;1530:10197:73;;;;;1669:12:82;;;;;;-1:-1:-1;1669:12:82;;1623:17;;;;;;;;;;;;;;:::i;:::-;;;;1333:139;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1432:18:82;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1432:18:82;;;;;;;;-1:-1:-1;1432:18:82;;;1333:139;-1:-1:-1;;;;;;1530:10197:73;1424:48:82;;1333:139;;1432:18;;;;1530:10197:73;1432:18:82;;1530:10197:73;1432:18:82;;;;;;1530:10197:73;1432:18:82;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;1432:18:82;;;;;;-1:-1:-1;1432:18:82;;1333:75;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1375:12:82;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1375:12:82;;;;;;;-1:-1:-1;1375:12:82;;;1333:75;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1392:16:82;;1530:10197:73;;4729:22:80;1530:10197:73;1392:16:82;;;;;;;;-1:-1:-1;1392:16:82;;;1333:75;-1:-1:-1;;;;;;1530:10197:73;;;;;1367:41:82;;1333:75;;1392:16;;;1530:10197:73;1392:16:82;;1530:10197:73;1392:16:82;;;;;;1530:10197:73;1392:16:82;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1392:16:82;;;;;;-1:-1:-1;1392:16:82;;1375:12;;;;1530:10197:73;1375:12:82;1530:10197:73;1375:12:82;;;;;;;:::i;:::-;;;;1348:15;;;1530:10197:73;1348:15:82;;1530:10197:73;1348:15:82;;;;;;1530:10197:73;1348:15:82;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1348:15:82;;;;;;-1:-1:-1;1348:15:82;;1333:11;;;1530:10197:73;1333:11:82;;1530:10197:73;1333:11:82;;;;;;1530:10197:73;1333:11:82;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1333:11:82;;;;;;-1:-1:-1;1333:11:82;;5646:16:80;;;1530:10197:73;5646:16:80;;1530:10197:73;5646:16:80;;;;;;1530:10197:73;5646:16:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5646:16:80;;;;;;-1:-1:-1;5646:16:80;;5269:313;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5540:23:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5540:23:80;;;;;;;;-1:-1:-1;5540:23:80;;;5269:313;-1:-1:-1;;;;;;1530:10197:73;5532:50:80;;5269:313;;5540:23;;;;1530:10197:73;5540:23:80;;1530:10197:73;5540:23:80;;;;;;1530:10197:73;5540:23:80;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;5540:23:80;;;;;;;;-1:-1:-1;5540:23:80;;5269:243;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5469:24:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5469:24:80;;;;;;;;-1:-1:-1;5469:24:80;;;5269:243;-1:-1:-1;;;;;;1530:10197:73;5461:51:80;;5269:243;;5469:24;;;;1530:10197:73;5469:24:80;;1530:10197:73;5469:24:80;;;;;;1530:10197:73;5469:24:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;5469:24:80;;;;;;-1:-1:-1;5469:24:80;;5269:172;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5390:29:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5390:29:80;;;;;;;;-1:-1:-1;5390:29:80;;;5269:172;-1:-1:-1;;;;;;1530:10197:73;5382:59:80;;5269:172;;5390:29;;;;1530:10197:73;5390:29:80;;1530:10197:73;5390:29:80;;;;;;1530:10197:73;5390:29:80;;;:::i;:::-;;;552:8:42;;;;1530:10197:73;;;;:::i;:::-;5390:29:80;;;;;;-1:-1:-1;5390:29:80;;5269:93;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5317:24:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5317:24:80;;;;;;;;-1:-1:-1;5317:24:80;;;5269:93;-1:-1:-1;;;;;;1530:10197:73;5309:53:80;;5269:93;;5317:24;;;;1530:10197:73;5317:24:80;;1530:10197:73;5317:24:80;;;;;;1530:10197:73;5317:24:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;5317:24:80;;;;;;-1:-1:-1;5317:24:80;;5290:15;;;1530:10197:73;5290:15:80;;1530:10197:73;5290:15:80;;;;;;1530:10197:73;5290:15:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5290:15:80;;;;;;-1:-1:-1;5290:15:80;;5269:17;;;1530:10197:73;5269:17:80;;1530:10197:73;5269:17:80;;;;;;1530:10197:73;5269:17:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5269:17:80;;;;;;-1:-1:-1;5269:17:80;;5065:136;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5168:13:80;;1530:10197:73;;4729:22:80;1530:10197:73;5168:13:80;;;;;;;;-1:-1:-1;5168:13:80;;;5065:136;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5185:16:80;;1530:10197:73;;4729:22:80;1530:10197:73;;5185:16:80;;;;;;;-1:-1:-1;5185:16:80;;;5065:136;-1:-1:-1;;;;;;1530:10197:73;;;;;5168:33:80;;5065:136;;5185:16;;;1530:10197:73;5185:16:80;;1530:10197:73;5185:16:80;;;;;;1530:10197:73;5185:16:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5185:16:80;;;;;;-1:-1:-1;5185:16:80;;5168:13;;;1530:10197:73;5168:13:80;;1530:10197:73;5168:13:80;;;;;;1530:10197:73;5168:13:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5168:13:80;;;;;;-1:-1:-1;5168:13:80;;5065:83;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5117:12:80;;1530:10197:73;;4729:22:80;1530:10197:73;5117:12:80;;;;;;;;-1:-1:-1;5117:12:80;;;5065:83;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5133:15:80;;1530:10197:73;;4729:22:80;1530:10197:73;;5133:15:80;;;;;;;-1:-1:-1;5133:15:80;;;5065:83;-1:-1:-1;;;;;;1530:10197:73;;;;;5117:31:80;;5065:83;;5133:15;;;1530:10197:73;5133:15:80;;1530:10197:73;5133:15:80;;;;;;1530:10197:73;5133:15:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5133:15:80;;;;;;-1:-1:-1;5133:15:80;;5117:12;;;1530:10197:73;5117:12:80;;1530:10197:73;5117:12:80;;;;;;1530:10197:73;5117:12:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5117:12:80;;;;;;-1:-1:-1;5117:12:80;;5073:19;;;;1530:10197:73;5073:19:80;;1530:10197:73;5073:19:80;;;;;;1530:10197:73;5073:19:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;5073:19:80;;;;;;-1:-1:-1;5073:19:80;;4906:76;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4961:16:80;;1530:10197:73;;4729:22:80;1530:10197:73;4961:16:80;;;;;;;;-1:-1:-1;4961:16:80;;;4906:76;-1:-1:-1;1530:10197:73;;4981:1:80;4961:21;;4906:76;;4961:16;;;1530:10197:73;4961:16:80;;1530:10197:73;4961:16:80;;;;;;1530:10197:73;4961:16:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;;;;;;4961:16:80;;;;;-1:-1:-1;4961:16:80;;4914:22;;;;1530:10197:73;4914:22:80;;1530:10197:73;4914:22:80;;;;;;1530:10197:73;4914:22:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;4914:22:80;;;;;;-1:-1:-1;4914:22:80;;4721:107;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4784:23:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4784:23:80;;;;;;;;-1:-1:-1;4784:23:80;;;4721:107;-1:-1:-1;;;;;;1530:10197:73;4776:52:80;;4721:107;;4784:23;;;;1530:10197:73;4784:23:80;;1530:10197:73;4784:23:80;;;;;;1530:10197:73;4784:23:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;4784:23:80;;;;;;-1:-1:-1;4784:23:80;;4729:22;;;;1530:10197:73;4729:22:80;;1530:10197:73;4729:22:80;;;;;;1530:10197:73;4729:22:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;4729:22:80;;;;;;-1:-1:-1;4729:22:80;;2487:83:87;2554:16;;;-1:-1:-1;2554:16:87;;-1:-1:-1;2554:16:87;2491:54;2518:27;;;2491:54;;1048:66:86;1094:20;;;-1:-1:-1;1094:20:86;;-1:-1:-1;1094:20:86;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;;-1:-1:-1;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;;;;-1:-1:-1;;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;552:8:42:-;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;552:8:42;:::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a0033","offset":36078},"2":{"value":"0xa2646970667358221220189bf1649881170d63b9bd59e156a5dea6ce48fd5fb34573452e6e59c5139c6264736f6c634300081a0033","offset":39639}},"transformations":[{"type":"insert","offset":39756,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9000000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f3000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede5353000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841900000000000000000000000072d94600a7a57afb6a2090e9739fd8ab21e02eb20000000000000000000000005598aa9146215bc13eb26f2c692ad1461fd3298239eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d787000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f734000000000000000000000000080396c7131159eb92e7e84839e51c9887a7a95d9000000000000000000000000c594bdfba256c79f6069df9e89ea78d6312fadd70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c0aeabdef1760d0dcba28a20c15701f74216e77a000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e00000000000000000000000051629bca14098a4f1ad77cd7e85212d67349823d0000000000000000000000004e5916428452891e1deb59d162c20266ed08cad4000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f91"}},"runtimeBytecode":{"onchainBytecode":"0x608080604052600436101561005b575b50361561001a575f80fd5b7f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330361004c57005b63029a949d60e31b5f5260045ffd5b5f905f3560e01c90816303195cd01461322457508063034e7c47146131d257806305ca342f146131b857806306b7cb9c146122aa578063070fd029146131825780630c7621411461313e5780630e635186146130ff57806310e3c7a7146130e5578063154e1e3f146130ab5780631be052891461308f57806321bdc0d914612f8f57806321d0ee7014612f3857806324048ba114612ef457806324f159c214612eb0578063259982e514612e59578063263cef3c14612e3c57806328accf0914612d91578063293b1c6a146129b2578063375880651461296e5780633923411c146128de5780633bd1325114612847578063402573711461282b578063428a63411461279457806346158ffc1461270c57806346904840146126d8578063470d5fe61461267257806347ccca021461262e57806348e732771461261257806352bf8c27146125f557806354b4bf3914612558578063575e24b4146122e1578063638b12a0146122c7578063690422b2146122aa5780636b9cdad6146122665780636c2bbe7e146122095780636e5dbe86146121ea5780636f2c590a146121d05780636fe7e6eb1461208657806377e70a4b1461206a578063780d3cfe14611eb35780637cc4353b14611e015780637ce73d6714611dbc5780637d73714d14611d975780638009b7bd14611d525780638c2d6cf414611d37578063906f349114611cc357806391dd734614611c3c57806399b5598314611c015780639b75f7c814611be45780639f063efc14611b83578063a53e541214611b66578063a64e13a1146119eb578063af102658146119b0578063b47b2fb1146113a8578063b6a8b0fa1461134f578063b753bfe91461130a578063b827bbe0146112c5578063bb8b353c146112aa578063bbc2520d1461128f578063c269a3e214611267578063c314876d146111e7578063c4408c8a146111a2578063c79d2dfc14610cfe578063ce1b1d4314610cb9578063cffe289e14610c6a578063d16f715814610c25578063d25eae2514610bdc578063dc4c90d314610b97578063dc98354e14610960578063dd6b5e8e14610944578063df4fe917146105e1578063e1b4af6914610579578063e3b3904014610477578063eaf334761461045a578063fb26015f1461043e578063fb73056b146103f95763ffa800820361000f57346103f657806003193601126103f6576040517f000000000000000000000000c0aeabdef1760d0dcba28a20c15701f74216e77a6001600160a01b03168152602090f35b80fd5b50346103f657806003193601126103f6576040517f00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f36001600160a01b03168152602090f35b50346103f657806003193601126103f657602090604051908152f35b50346103f657806003193601126103f65760206040516105dc8152f35b50346103f657806003193601126103f6577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26654604051627eeac760e11b81526001600160a01b037f000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a8116600483015291821660248201529190602090839060449082907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a90165afa90811561056d5790610536575b602090604051908152f35b506020813d602011610565575b8161055060209383613403565b81010312610561576020905161052b565b5f80fd5b3d9150610543565b604051903d90823e3d90fd5b50346103f657610588366133ac565b5050507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330392506105d29150505760405163e1b4af6960e01b8152602090f35b63570c108560e11b8152600490fd5b50346103f65760803660031901126103f6576105fb61323d565b610603613253565b90604435918260020b91828403610940576064356001600160a01b038116939084900361093c57307f000000000000000000000000a62f9b597225779b430024398b70374e8468ce146001600160a01b0316149086908215610908575b82156108f6575b82156108be575b82156108b4575b82156108a9575b505080156108a1575b610892577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26580546001600160a01b039283166001600160a01b0319918216179091557f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2668054939092169216821790555f80516020615d50833981519152805460a09490941b62ffffff60a01b166001600160b81b03199094169390931791909117909155604051638da5cb5b60e01b815290602090829060049082905afa908115610887578291610849575b505f80516020615d7083398151915280546001600160a01b0319166001600160a01b03929092169182179055801590811561079e575b5061078f5780f35b63f92ee8a960e01b8152600490fd5b60405163017d862f60e11b81529091506020816004817f00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f36001600160a01b03165afa90811561083e578391610800575b506001600160a01b031614155f610787565b90506020813d602011610836575b8161081b60209383613403565b810103126108325761082c906134b5565b5f6107ee565b8280fd5b3d915061080e565b6040513d85823e3d90fd5b90506020813d60201161087f575b8161086460209383613403565b8101031261087b57610875906134b5565b5f610751565b5080fd5b3d9150610857565b6040513d84823e3d90fd5b63f92ee8a960e01b8552600485fd5b508215610685565b13159050855f61067c565b843b159250610675565b6001600160a01b038581167f0000000000000000000000001b54e762aa34cf6e28e9c082f2848e28e45da6b89091161415925061066e565b6001600160a01b038416159250610667565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b031615159250610660565b8580fd5b8480fd5b50346103f657806003193601126103f657602060405160018152f35b50346103f65760e03660031901126103f65761097a61323d565b60a036602319011261087b5761098e613362565b7f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03163303610b88577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b03168015928315610b6c575b8315610b58575b50508115610b3d575b8115610af6575b8115610ac7575b8115610aa7575b8115610a82575b8115610a5c575b5061078f575f80516020615d50833981519152805460ff60b81b1916600160b81b179055604051636e4c1aa760e11b8152602090f35b5f80516020615d50833981519152546001600160a01b039182169116141590505f610a26565b905060a4356001600160a01b03811690818103610aa3575030141590610a1f565b8380fd5b905060643562ffffff8116808203610aa357628000009150141590610a18565b90506084358060020b90818103610aa357505f80516020615d508339815191525460a01c60020b141590610a11565b90506001600160a01b03610b08613579565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e266546001600160a01b03169116141590610a0a565b90506001600160a01b03610b4f61358f565b16151590610a03565b6001600160a01b0316141591505f806109fa565b5f80516020615d508339815191525460b81c60ff1693506109f3565b63570c108560e11b8352600483fd5b50346103f657806003193601126103f6576040517f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03168152602090f35b50346103f65760203660031901126103f657600435906001600160401b0382116103f6576101e060031983360301126103f6576020610c1d83600401614474565b604051908152f35b50346103f657806003193601126103f6576040517f0000000000000000000000005598aa9146215bc13eb26f2c692ad1461fd329826001600160a01b03168152602090f35b50346103f657806003193601126103f65760407f2f9e2e20558dbba26f6943f9568ee8724ef17057d8dd3fe037dadf2bb9691382546001600160401b038251918181168352831c166020820152f35b50346103f657806003193601126103f6576040517f000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f73406001600160a01b03168152602090f35b50346103f65760403660031901126103f6576004356001600160401b03811161087b57806004016101e06003198336030112610832576024356001600160401b038111610aa357610d53903690600401613269565b929046602483013514801590611174575b801561115b575b8015611142575b8015611127575b801561110c575b80156110f2575b80156110d8575b80156110cf575b80156110c2575b80156110a3575b8015611083575b8015611055575b801561101f575b611010576020610dcb60848401856143c9565b908092918101031261093c5735938460011c9182158015610ff2575b8015610fe0575b610fd1576001600160401b035f80516020615d108339815191525416831115610fc257610e3c91610e2d610e3392610e2588614474565b92369161443e565b90615b73565b90929192615bad565b6001600160a01b037f0000000000000000000000005598aa9146215bc13eb26f2c692ad1461fd329828116911603610fb357916001600160401b03606092846101c483610ea97f83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b898613529565b1692018284610eb78361440a565b1610610f9f575b50821682195f80516020615d108339815191525416175f80516020615d10833981519152555f80516020615d108339815191525467ffffffffffffffff60401b8260401b169067ffffffffffffffff60401b1916175f80516020615d1083398151915255815f80516020615d10833981519152549660018060ff60801b92161460801b1660ff60801b1988161793845f80516020615d10833981519152553596877ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e5560ff6040519560801c1615158552166020840152166040820152a280f35b83919250610fac9061440a565b9190610ebe565b63027737d360e31b8552600485fd5b6319b5ff4d60e31b8752600487fd5b6383efa26f60e01b8752600487fd5b50610fea83613529565b421015610dee565b506001600160401b036110086101a4860161440a565b168311610de7565b6383efa26f60e01b8552600485fd5b506154606001600160401b0361104e61103b6101c4860161440a565b6110486101a4870161440a565b9061441e565b1611610db8565b506110636101c4830161440a565b6001600160401b03806110796101a4860161440a565b1691161115610db1565b506110916101c4830161440a565b6001600160401b034291161115610daa565b506110b16101a4830161440a565b6001600160401b0342911611610da3565b5061012482013515610d9c565b50823515610d95565b50600561ffff6110eb61018485016143fb565b1611610d8e565b50600461ffff61110561018485016143fb565b1610610d87565b50600461ffff61111f61016485016143fb565b161415610d80565b50600561ffff61113a61014485016143fb565b161415610d79565b50602061115260848401856143c9565b90501415610d72565b50600360ff61116c606485016143bb565b161415610d6b565b507f39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d78760448301351415610d64565b50346103f657806003193601126103f6576040517f0000000000000000000000004e5916428452891e1deb59d162c20266ed08cad46001600160a01b03168152602090f35b50346103f657806003193601126103f65762ffffff6112046135a5565b166148440362ffffff81116112535762ffffff80611220614265565b169116039062ffffff821161123f5760208262ffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b50346103f657806003193601126103f6576020611282614265565b62ffffff60405191168152f35b50346103f657806003193601126103f6576020610c1d61420a565b50346103f657806003193601126103f65760206112826141c9565b50346103f657806003193601126103f6576040517f000000000000000000000000a62f9b597225779b430024398b70374e8468ce146001600160a01b03168152602090f35b50346103f657806003193601126103f6576040517f000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a6001600160a01b03168152602090f35b50346103f65761135e366133ac565b5050507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330392506105d291505057604051635b54587d60e11b8152602090f35b50346103f6576101603660031901126103f6576113c361323d565b60a036602319011261087b5760603660c319011261087b576101243591610144356001600160401b03811161087b57611400903690600401613269565b90937f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b031690338290036119a15761143d614a2f565b839460e435928584129384159081611991575b81611983575b50611974578260801d600f0b918683125f1461196d57611475836136bf565b945b61147f614b6f565b156119145761148c614b87565b811561190557620f42406114a76114a1614854565b836136ac565b04965b8783156118f4576114bb9083613545565b80915b036118e55782156118de57505b925b7f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395c6114f761356a565b156118cf57602061150661358f565b604051634bf466a760e11b81526001600160a01b03909116600482015292839060249082905afa80156118c4578a90611890575b6115449250613545565b61154c61356a565b156117a85761155b9087613538565b620249f08402848104620249f0148515171561179457620f42409004106117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956915b6115ab8886614e42565b60a06040518160248237209360018060a01b031697889560405192835260208301526040820152a36115db61479e565b5f80516020615d908339815191525c6001600160a01b0316908161167a575b60408787805f80516020615db08339815191525d805f80516020615d908339815191525d807f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d81519063b47b2fb160e01b8252600f0b6020820152f35b85977f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef9695965c7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05c61170060018060a01b037f000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f9116936116f861356a565b9a369161443e565b6020815191012091833b15611781576101049689956040519b8c9a8b996321b0221b60e11b8b5260048b015260248a0152151560448901526064880152600f0b608487015260a486015260c485015260e48401525af1801561083e5761176c575b8080808086946115fa565b611777838092613403565b61087b575f611761565b8880fd5b637478d45560e11b8852600488fd5b634e487b7160e01b8a52601160045260248afd5b6117b486600f0b6136bf565b90620249f08202828104620249f0148315171561187c57620f4240810482118015611873575b61186457620f4240820290828204620f4240148315171561185057926118146118209361180e61181a94620f424097613545565b92613545565b9061368e565b856136ac565b0486116117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956916115a1565b634e487b7160e01b8c52601160045260248cfd5b637478d45560e11b8b5260048bfd5b508282146117da565b634e487b7160e01b8b52601160045260248bfd5b506020823d6020116118bc575b816118aa60209383613403565b8101031261056157611544915161153a565b3d915061189d565b6040513d8c823e3d90fd5b60206118d9613579565b611506565b90506114cb565b6337e83fd360e21b8a5260048afd5b6118fe9083613538565b80916114be565b61190e81614dee565b966114aa565b919750811561195e57620f424061193261192c614854565b876136ac565b04915b61194a839684835f1461195057505b93614bc5565b986114cd565b61195991613538565b611944565b61196785614dee565b91611935565b8294611477565b63153f6ec760e21b8652600486fd5b905083600f0b14155f611456565b905061199b61356a565b90611450565b63570c108560e11b8452600484fd5b50346103f657806003193601126103f65760206040517f000000000000000000000000000000000000000000000000000000006acabf1f8152f35b50346103f657806003193601126103f6577337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590611b48575b8015611b25575b8015611b14575b611b05576001600160401b0342166001600160401b03195f80516020615d308339815191525416175f80516020615d30833981519152556201518042018042116112535767ffffffffffffffff60401b805f80516020615d30833981519152549260401b16169067ffffffffffffffff60401b1916175f80516020615d30833981519152557fe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc60605f80516020615d30833981519152546001600160401b0360405191818116835260401c16602082015260026040820152a180f35b635c06dcc560e01b8152600490fd5b5067fffffffffffeae7f4211611a29565b506001600160401b035f80516020615d308339815191525460401c161515611a22565b50731f22e4b065b2f15fed5be556dc0fa636048d29bc331415611a1b565b50346103f657806003193601126103f65760206040516170808152f35b50346103f657611b92366132f9565b5050507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330393506105d29250505057604080516327c18fbf60e21b8152602081019290925290f35b50346103f657806003193601126103f65760206040516107d08152f35b50346103f657806003193601126103f65760206040517f39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d7878152f35b50346103f65760203660031901126103f6576004356001600160401b03811161087b57611c6d903690600401613269565b917f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b031633036105d257611cbf611cab8484613fde565b604051918291602083526020830190613388565b0390f35b50346103f657806003193601126103f657608090611cdf614be6565b908115611d325750611cf7611cf2614c31565b614cce565b50505b5f80516020615e3083398151915254916001600160401b0360405193818116855260401c166020840152151560408301526060820152f35b611cfa565b50346103f657806003193601126103f6576020610c1d613ef1565b50346103f657806003193601126103f6576040517f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03168152602090f35b50346103f65760203660031901126103f657611db9611db461323d565b6136cf565b80f35b50346103f657806003193601126103f6576040517f00000000000000000000000072d94600a7a57afb6a2090e9739fd8ab21e02eb26001600160a01b03168152602090f35b50346103f65760203660031901126103f6575f80516020615d70833981519152546001600160a01b03163303611ea457807f00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f36001600160a01b0316803b15611ea15781809160246040518094819363728b658960e01b835260043560048401525af1801561088757611e905750f35b81611e9a91613403565b6103f65780f35b50fd5b631d713add60e21b8152600490fd5b50346103f65760803660031901126103f6576004356001600160801b03811680910361087b5760405163cb2af14b60e01b81526020816004817f000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a6001600160a01b03165afa90811561083e578391612030575b506001600160a01b031633036120215781611f9491604051906002602083015260408201526024356060820152604435608082015260643560a082015260a08152611f7260c082613403565b604051809381926348c8949160e01b8352602060048401526024830190613388565b0381837f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03165af1908115610887578291611fff575b5060208180518101031261087b57602001516001600160801b03811680910361087b57602090610c1d61479e565b61201b91503d8084833e6120138183613403565b810190613453565b5f611fd1565b631d713add60e21b8252600482fd5b90506020813d602011612062575b8161204b60209383613403565b810103126108325761205c906134b5565b5f611f26565b3d915061203e565b50346103f657806003193601126103f6576020604051600c8152f35b3461056157610100366003190112610561576120a061323d565b5060a0366023190112610561576120b5613362565b506120be613378565b507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316338190036121c157803b1561056157604051635275965160e01b8152906001600160a01b03612116613253565b1660048301526044356001600160a01b0381169081900361056157602483015260643562ffffff81168091036105615760448301526084358060020b80910361056157606483015260a4356001600160a01b03811691908290036105615760c4835f8193819560848401528160a48401525af180156121b6576121a6575b604051636fe7e6eb60e01b8152602090f35b5f6121b091613403565b5f612194565b6040513d5f823e3d90fd5b63570c108560e11b5f5260045ffd5b34610561575f366003190112610561576020611282613633565b34610561575f366003190112610561576339cbe26160e21b5f5260045ffd5b3461056157612217366132f9565b5050507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330393506121c1925050505760408051633615df3f60e11b81525f6020820152f35b34610561575f366003190112610561576040517f000000000000000000000000c594bdfba256c79f6069df9e89ea78d6312fadd76001600160a01b03168152602090f35b34610561575f366003190112610561576020604051620249f08152f35b34610561575f3660031901126105615760206112826135a5565b3461056157610140366003190112610561576122fb61323d565b60a03660231901126105615760603660c319011261056157610124356001600160401b03811161056157612333903690600401613269565b917f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03169190338390036121c157604090612373614a2f565b61237b61356a565b9061239f60e43596879585519687958695638e88a1f160e01b8752600487016134e6565b03817f000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f916001600160a01b03165afa80156121b6575f915f91612527575b505f80516020615db08339815191525d5f80516020615d908339815191525d61240361356a565b1561251857602061241261358f565b604051634bf466a760e11b81526001600160a01b03909116600482015291829060249082905afa9081156121b6575f916124e5575b50606091612486917f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395d5f9061247b614b6f565b6124a7575b50614bc5565b60801b604051906315d7892d60e21b82526020820152624000006040820152f35b90505f6124b2614b87565b9112156124d7576124cf620f4240916124c9614854565b906136ac565b045b83612480565b6124e090614dee565b6124d1565b90506020813d602011612510575b8161250060209383613403565b8101031261056157516060612447565b3d91506124f3565b6020612522613579565b612412565b905061254b915060403d604011612551575b6125438183613403565b8101906134c9565b846123dc565b503d612539565b34610561575f3660031901126105615760805f80516020615d10833981519152546001600160401b038160401c1690814210155f146125da575f915b6001600160401b037ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e549260ff6040519516855216602084015260408301526060820152f35b80831c60ff16156125ee5760025b91612594565b60016125e8565b34610561575f366003190112610561576020604051620151808152f35b34610561575f3660031901126105615760206040516101f48152f35b34610561575f366003190112610561576040517f00000000000000000000000080396c7131159eb92e7e84839e51c9887a7a95d96001600160a01b03168152602090f35b34610561575f36600319011261056157604051632386aff360e11b81526020816004817f000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f73406001600160a01b03165afa80156121b6575f9061053657602090604051908152f35b34610561575f366003190112610561575f80516020615d70833981519152546040516001600160a01b039091168152602090f35b34610561575f3660031901126105615760408051630f77314d60e31b815290816004817f00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f36001600160a01b03165afa80156121b6575f9061277257602090604051908152f35b506040813d60401161278c575b8161055060409383613403565b3d915061277f565b34610561575f3660031901126105615760405163428a634160e01b81526020816004817f000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f73406001600160a01b03165afa80156121b6576020915f916127fe575b506040519015158152f35b61281e9150823d8411612824575b6128168183613403565b810190613552565b826127f3565b503d61280c565b34610561575f3660031901126105615760206040516154608152f35b34610561575f36600319011261056157604051627eeac760e11b81526001600160a01b037f000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a811660048301525f6024830152602090829060449082907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a90165afa80156121b6575f9061053657602090604051908152f35b34610561575f36600319011261056157604080515f6020820181905233828401529181526129129190611f72606082613403565b0381837f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03165af180156121b657612956575b61295461479e565b005b612969903d805f833e6120138183613403565b61294c565b34610561575f366003190112610561576040517f00000000000000000000000051629bca14098a4f1ad77cd7e85212d67349823d6001600160a01b03168152602090f35b34610561576060366003190112610561576004356044356129e26129d461420a565b6129dc613ef1565b90613538565b90804211908115612d67575b508015612d5f575b8015612d57575b8015612d4c575b612d3d576040516318160ddd60e01b8152907f0000000000000000000000001b54e762aa34cf6e28e9c082f2848e28e45da6b86001600160a01b0316602083600481845afa9283156121b6575f93612d09575b506040516370a0823160e01b81527f00000000000000000000000004f1e9f9848c92508699bfcd59e0522e8246dc166001600160a01b03166004820181905292909190602083602481855afa9283156121b6575f93612cd3575b5060408051600160208201523391810191909152612b0591905f90612ae381606081015b03601f198101835282613403565b604051809481926348c8949160e01b8352602060048401526024830190613388565b0381837f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03165af19081156121b657612b6792612b5f92612cbb575b50612b5161479e565b612b5961420a565b90613545565b612b59613ef1565b936040516318160ddd60e01b8152602081600481865afa9081156121b6575f91612c88575b50612b9990602092613545565b936024604051809481936370a0823160e01b835260048301525afa9081156121b6575f91612c54575b50612bd090612bd593613538565b613545565b918115908115612c4b575b8115612c38575b50612c29576040917f0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3838051848152836020820152a182519182526020820152f35b63873d73a960e01b5f5260045ffd5b9050612c448284614895565b1083612be7565b83159150612be0565b90506020813d602011612c80575b81612c6f60209383613403565b810103126105615751612bd5612bc2565b3d9150612c62565b90506020813d602011612cb3575b81612ca360209383613403565b8101031261056157516020612b8c565b3d9150612c96565b612cce903d805f833e6120138183613403565b612b48565b9092506020813d602011612d01575b81612cef60209383613403565b81010312610561575191612b05612ab1565b3d9150612ce2565b9092506020813d602011612d35575b81612d2560209383613403565b8101031261056157519184612a57565b3d9150612d18565b6333b094a160e01b5f5260045ffd5b506024358111612a04565b5080156129fd565b5081156129f6565b905061012c420190814211612d7d5711836129ee565b634e487b7160e01b5f52601160045260245ffd5b34610561575f366003190112610561576040516319b400eb60e21b81526020816004817f00000000000000000000000072d94600a7a57afb6a2090e9739fd8ab21e02eb26001600160a01b03165afa80156121b6575f90612e02575b6040516001600160a01b039091168152602090f35b506020813d602011612e34575b81612e1c60209383613403565b8101031261056157612e2f6020916134b5565b612ded565b3d9150612e0f565b34610561575f366003190112610561576020604051620493e08152f35b3461056157612e6736613296565b5050507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330391506121c190505760405163259982e560e01b8152602090f35b34610561575f366003190112610561576040517f000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f916001600160a01b03168152602090f35b34610561575f366003190112610561576040517f000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede53536001600160a01b03168152602090f35b3461056157612f4636613296565b5050507f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316330391506121c190505760405163021d0ee760e41b8152602090f35b3461056157608036600319011261056157612fa861323d565b60243590811515820361056157606435906001600160401b03821161056157612ffc92612fdb6040933690600401613269565b8451638e88a1f160e01b8152958694859491939160443591600487016134e6565b03817f000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f916001600160a01b03165afa80156121b6575f915f9161306e575b5062ffffff5f199116019062ffffff8211612d7d57604080516001600160a01b03909216825262ffffff929092166020820152f35b9050613089915060403d604011612551576125438183613403565b82613039565b34610561575f36600319011261056157602060405161a8c08152f35b34610561575f3660031901126105615760206040517f43c032f18f863bf5301f80e8812396bc62519b9c402f07184c2255d30d84788f8152f35b34610561575f366003190112610561576020610c1d614854565b34610561575f3660031901126105615730330361004c57604051630321f11f60e21b60208201526004815261295490613139602482613403565b61480d565b34610561575f366003190112610561576040517f000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e6001600160a01b03168152602090f35b34610561575f3660031901126105615760408051600160208201523391810191909152612912905f90611f728160608101612ad5565b34610561575f3660031901126105615760206040515f8152f35b34610561575f3660031901126105615760605f80516020615d3083398151915254600262ffffff613201613633565b16146001600160401b0360405192818116845260401c1660208301526040820152f35b34610561575f3660031901126105615780600160209252f35b600435906001600160a01b038216820361056157565b602435906001600160a01b038216820361056157565b9181601f84011215610561578235916001600160401b038311610561576020838186019501011161056157565b90610160600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c49161014435906001600160401b038211610561576132f591600401613269565b9091565b906101a0600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c4916101443591610164359161018435906001600160401b038211610561576132f591600401613269565b60c435906001600160a01b038216820361056157565b60e435908160020b820361056157565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b610120600319820112610561576004356001600160a01b0381168103610561579160a06023198301126105615760249160c4359160e4359161010435906001600160401b038211610561576132f591600401613269565b90601f801991011681019081106001600160401b0382111761342457604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161342457601f01601f191660200190565b602081830312610561578051906001600160401b038211610561570181601f820112156105615780519061348682613438565b926134946040519485613403565b8284526020838301011161056157815f9260208093018386015e8301015290565b51906001600160a01b038216820361056157565b91908260409103126105615760206134e0836134b5565b92015190565b93909285939260a09693600180891b0316865215156020860152604085015260806060850152816080850152848401375f828201840152601f01601f1916010190565b906154608201809211612d7d57565b91908201809211612d7d57565b91908203918211612d7d57565b90816020910312610561575180151581036105615790565b60c43580151581036105615790565b6044356001600160a01b03811681036105615790565b6024356001600160a01b03811681036105615790565b604051630abb87c960e11b81526020816004817f000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e6001600160a01b03165afa9081156121b6575f91613601575b506135fb575f90565b6107d090565b90506020813d60201161362b575b8161361c60209383613403565b8101031261056157515f6135f2565b3d915061360f565b5f80516020615d30833981519152546001600160401b038160401c16801515918261367a575b5081613670575b501561366b57600290565b600190565b905042105f613660565b6001600160401b031642101591505f613659565b8115613698570490565b634e487b7160e01b5f52601260045260245ffd5b81810292918115918404141715612d7d57565b600160ff1b8114612d7d575f0390565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590613ed3575b613ec4575f6136fb614be6565b15613e855761370b611cf2614c31565b82939291845f80516020615e70833981519152557ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b2555f80516020615e3083398151915254906001600160401b0360c01b9060c01b16906001600160801b036001600160401b0360801b4260801b16911617175f80516020615e30833981519152556040519360a085018581106001600160401b03821117613424576040525f85526020850194731b54e762aa34cf6e28e9c082f2848e28e45da6b88652604081019562800000875260608201966001885260808301977337bfb8ac7c960e558657871d41ca70e07e7dbfff895261380560a08520614e1c565b60038101809111612d7d5760405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa80156121b6575f90613e4c575b6001600160801b039150169780158015613e44575b613de15761386d60a08620614e1c565b60405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91613e12575b506401000276a4996001600160a01b039190911691908a831115613e04576138d08360649261492c565b04809111613dfc575b5060016001607f1b038711613ded575b8615613de1576103e38102908082046103e31490151715612d7d576103e890046001600160a01b0316976401000276a3891115613dd9575b506e04444c5dc75cb358380d2e3de08a903b1561056157604051637a94c56560e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201528660448201525f81606481836e04444c5dc75cb358380d2e3de08a905af180156121b657613dc4575b50613998866136bf565b91604051606081018181106001600160401b03821117613db05760409081526001825260208083019586526001600160a01b03909b1682820190815290518b9590926139e48785613403565b8b8452604051633cf3645360e21b815289516001600160a01b039081166004830152895181166024830152955162ffffff166044820152955160020b60648701529c51841660848601529b51151560a48501529a5160c484015299511660e48201526101206101048201529788908190613a6390610124830190613388565b0381885a6e04444c5dc75cb358380d2e3de08a9090f1968715613cc2578597613d81575b506001600160801b03613a9f8860801d600f0b6136bf565b97169387818110613ce2575b613ac491505f80516020615e7083398151915254613545565b5f80516020615e708339815191525583613bd2575b5060a09020604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff600482015260248101859052909480826044816e04444c5dc75cb358380d2e3de08a905afa94851561056d5794613b80575b5050604080519586526020860192909252908401919091526001600160a01b0316917f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e9080606081015b0390a3565b90809450813d8311613bcb575b613b978183613403565b8101031261056157613b7b7f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e935193613b31565b503d613b8d565b516001600160a01b03166e04444c5dc75cb358380d2e3de08a903b156109405760405190630b0d9c0960e01b825260048201527337bfb8ac7c960e558657871d41ca70e07e7dbfff60248201528360448201528481606481836e04444c5dc75cb358380d2e3de08a905af18015613cc257908591613ccd575b5050731b54e762aa34cf6e28e9c082f2848e28e45da6b83b15610aa357604051630852cd8d60e31b815260048101849052848160248183731b54e762aa34cf6e28e9c082f2848e28e45da6b85af18015613cc257908591613cad575b50613ad9565b81613cb791613403565b610aa357835f613ca7565b6040513d87823e3d90fd5b81613cd791613403565b610aa357835f613c4b565b613ceb91613545565b6e04444c5dc75cb358380d2e3de08a903b1561093c5760405190630ab714fb60e11b82527337bfb8ac7c960e558657871d41ca70e07e7dbfff600483015286602483015260448201528581606481836e04444c5dc75cb358380d2e3de08a905af18015613d7657908691613d61575b5087613aab565b81613d6b91613403565b61094057845f613d5a565b6040513d88823e3d90fd5b9096508581813d8311613da9575b613d998183613403565b810103126109405751955f613a87565b503d613d8f565b634e487b7160e01b8a52604160045260248afd5b613dd19197505f90613403565b5f955f61398e565b97505f613921565b50505050505050505050565b60016001607f1b0396506138e9565b96505f6138d9565b505050505050505050505050565b90506020813d602011613e3c575b81613e2d60209383613403565b8101031261056157515f6138a6565b3d9150613e20565b50881561385d565b506020813d602011613e7d575b81613e6660209383613403565b81010312610561576001600160801b039051613848565b3d9150613e59565b5030330361004c57604051631652585760e01b60208201526001600160a01b039091166024808301919091528152613ec290613139604482613403565b565b63271a26f160e01b5f5260045ffd5b507337bfb8ac7c960e558657871d41ca70e07e7dbfff3314156136ee565b604051627eeac760e11b81526001600160a01b037f00000000000000000000000072d94600a7a57afb6a2090e9739fd8ab21e02eb2811660048301525f6024830152602090829060449082907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a90165afa9081156121b6575f91613f72575090565b90506020813d602011613f99575b81613f8d60209383613403565b81010312610561575190565b3d9150613f80565b359060ff8216820361056157565b3d15613fd9573d90613fc082613438565b91613fce6040519384613403565b82523d5f602084013e565b606090565b805f928101036020811261056157600260ff613ff984613fa1565b16036140b55760a01361087b5761400f81613fa1565b506020810135906001600160801b038216809203610832579082916080604051916020830193630fe1ea1160e01b855260248401526040810135604484015260608101356064840152013560848201526084815261406e60a482613403565b51907f00000000000000000000000051629bca14098a4f1ad77cd7e85212d67349823d6001600160a01b03165af46140a4613faf565b90156140ad5790565b602081519101fd5b7f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b031633036121c1576040136105615760206140f782613fa1565b9101359060018060a01b0382168092036105615760ff168061416c575050303b156103f657604051630731a8c360e11b8152818160048183305af1801561088757908291614157575b50505b60405190614152602083613403565b815290565b8161416191613403565b6103f657805f614140565b6001036141ba57303b156105615760405190637d73714d60e01b825260048201525f8160248183305af180156121b6576141a7575b50614143565b6141b391505f90613403565b5f806141a1565b63091c731b60e31b5f5260045ffd5b5f80516020615d10833981519152546001600160401b038160401c164210156142035760801c60ff16156141fd57610dac90565b6105dc90565b506109c490565b604051627eeac760e11b81523060048201525f60248201526020816044817f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b03165afa9081156121b6575f91613f72575090565b7f000000000000000000000000000000000000000000000000000000006acabf1f421061431a576040516340bd8e6960e11b81526020816004817f0000000000000000000000004e5916428452891e1deb59d162c20266ed08cad46001600160a01b03165afa9081156121b6575f916142e8575b506142e2575f90565b610dac90565b90506020813d602011614312575b8161430360209383613403565b8101031261056157515f6142d9565b3d91506142f6565b6040516318160ddd60e01b81526020816004817f00000000000000000000000080396c7131159eb92e7e84839e51c9887a7a95d96001600160a01b03165afa80156121b6575f90614378575b63ffffffff16151590506142e2575f90565b506020813d6020116143b3575b8161439260209383613403565b81010312610561575163ffffffff811681036105615763ffffffff90614366565b3d9150614385565b3560ff811681036105615790565b903590601e198136030182121561056157018035906001600160401b0382116105615760200191813603831361056157565b3561ffff811681036105615790565b356001600160401b03811681036105615790565b906001600160401b03809116911603906001600160401b038211612d7d57565b92919261444a82613438565b916144586040519384613403565b829481845281830111610561578281602093845f960137010152565b6040516101e081018181106001600160401b03821117613424576145e76101c06042946001600160401b03936040525f60608601525f60808601525f60a08601525f60c08601525f60e08601525f6101008601525f6101208601525f6101408601525f6101608601525f6101808601525f6101a08601525f8286015280358552602081013560208601526040810135604086015260ff614516606083016143bb565b16606086015261453361452c60808301836143c9565b369161443e565b60208151910120608086015260a081013560a08601528361455660c0830161440a565b1660c08601528361456960e0830161440a565b1660e086015261010081013561010086015261012081013561012086015261ffff61459761014083016143fb565b1661014086015261ffff6145ae61016083016143fb565b1661016086015261ffff6145c561018083016143fb565b16610180860152836145da6101a0830161440a565b166101a08601520161440a565b166101c082015260405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fee3b0f8c46969f9c96cbdb258d9bc22f87f49dba9cd39b7a7f091505ea4b9ccd60408201527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260a0815261468060c082613403565b519020906001600160401b036101c0604051927f9c61a909d173aec816b2730e20b6caa3a25ca10c8a084dbf023e026e53874db4602085015280516040850152602081015160608501526040810151608085015260ff60608201511660a0850152608081015160c085015260a081015160e08501528260c0820151166101008501528260e08201511661012085015261010081015161014085015261012081015161016085015261ffff6101408201511661018085015261ffff610160820151166101a085015261ffff6101808201511682850152826101a0820151166101e0850152015116610200820152610200815261477d61022082613403565b602081519101206040519161190160f01b8352600283015260228201522090565b62028dd45a10613ec257604051637de4c18d60e01b81526020816004815f7f000000000000000000000000c594bdfba256c79f6069df9e89ea78d6312fadd76001600160a01b0316620249f0f16147f25750565b61480a9060203d602011612824576128168183613403565b50565b80515f918291906020017f000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f73406001600160a01b03165af461484b613faf565b90156140ad5750565b5f80516020615db08339815191525c801561487d575b62ffffff165f198101908111612d7d5790565b50700dac0007d00005dc000bb80032c80059d961486a565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610561571461492557670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90606082901b905f19600160601b8409928280851094039380850394858411156105615714614925578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f19818509938380861095039480860395868511156105615714614a27579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b5f80516020615d508339815191525460ff8160b81c1615908115614b4f575b8115614b2f575b8115614ae5575b8115614ac4575b8115614aa4575b508015614a86575b614a7857565b62820f3560e61b5f5260045ffd5b5060643562ffffff8116808203610561576280000091501415614a72565b608435600281900b9250828103610561575060a01c60020b14155f614a6a565b905060a4356001600160a01b03811690818103610561575030141590614a63565b90506044356001600160a01b0381169081810361056157507f0000000000000000000000001b54e762aa34cf6e28e9c082f2848e28e45da6b86001600160a01b0316141590614a5c565b90506024356001600160a01b038116908181036105615750151590614a55565b5f80516020615d70833981519152546001600160a01b0316159150614a4e565b60c4358015159081810361056157505f60e435121490565b60e4355f811290815f14614bc05760010190600182128015821691151617612d7d57614bb2906136bf565b60018101809111612d7d5790565b905090565b6001607f1b811015614bd757600f0b90565b6393dafdf160e01b5f5260045ffd5b5f80516020615e30833981519152546001600160401b038160401c168015159182614c1d575b5081614c16575090565b9050421090565b6001600160401b031642101591505f614c0c565b604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201526020816044816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91614c9c575b5080614c8e57505f90565b5f198101908111612d7d5790565b90506020813d602011614cc6575b81614cb760209383613403565b8101031261056157515f614c83565b3d9150614caa565b905f80516020615e7083398151915254917ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b254915f80516020615e30833981519152548060c01c92614d208587613538565b8110613ec45784612bd087614d3493613545565b9084151580614dd9575b614d71575b5080614d4c5750565b9092614d589250613538565b906170804201804211612d7d576001600160401b031690565b94614d94919495844210155f14614d9b5750614d8e868092613538565b95613545565b925f614d43565b614dd26001600160401b03614d8e9260801c166001600160401b03614dca614dc38342613545565b928961441e565b1690896149af565b8092613538565b506001600160401b038160801c164211614d3e565b614e00614df9614854565b80926136ac565b90620f424003620f42408111612d7d57614e199161368e565b90565b604051602081019182526006604082015260408152614e3c606082613403565b51902090565b91907f000000000000000000000000000000000000000000000000000000006acabf1f4210615666575f80516020615db08339815191525c801561564e575b62ffffff614e939160481c16846136ac565b604051630abb87c960e11b81525f94917f000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e6001600160a01b031691620f424090910490602081600481865afa9081156121b6575f9161561c575b506155d1575f905b6040516340bd8e6960e11b81527f0000000000000000000000004e5916428452891e1deb59d162c20266ed08cad46001600160a01b031690602081600481855afa9081156121b6575f9161559f575b50615555575f5b5f80516020615db08339815191525c801561553d575b614f7762ffffff620f42409260301c16886136ac565b04945f80516020615d908339815191525c9284838a8a8a8a6001600160a01b038a166154df57612bd09250614fb994612bd0612bd092612bd05f998a98613545565b9481806154a5575b5050897f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d83615449575b84615410575b620151806150427f000000000000000000000000000000000000000000000000000000006ac4279f42613545565b049186615356575b50826151f5575b505050965f80516020615dd083398151915260405f80516020615df0833981519152945f80516020615e5083398151915282955f80516020615e108339815191529b9c6150b485519283928d846040919493926060820195825260208201520152565b0390a18151908882526020820152a18151908582526020820152a180615199575b6103e882049281841161518f575b83827f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf068161514f8161516d96612bd061511f8861518a9b613545565b887f000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede53536001600160a01b0316615c62565b604080518981526020810192909252810191909152606090a1613545565b604051938493846040919493926060820195825260208201520152565b0390a1565b90925082906150e3565b6151f0816001600160a01b037f000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede53538116907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9016615c21565b6150d5565b8a9061522b84827f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316615c21565b803b1561087b578190602460405180948193632cd49aed60e01b83528860048401525af1801561534b57615332575b505f80516020615df0833981519152945f80516020615e508339815191526040955f80516020615e108339815191529b9c957ff548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea5f80516020615dd0833981519152968c6153228b987f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c0582408a5180615303848888846040919493926060820195825260208201520152565b0390a18951938493846040919493926060820195825260208201520152565b0390a1959c9b5095505094615051565b61533d8b8092613403565b615347575f61525a565b8980fd5b6040513d8d823e3d90fd5b61538a87827f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528c60048401525af180156121b6576153fb575b5060408051898152602081018890529081018390527f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f86190606090a15f61504a565b615408919b505f90613403565b5f995f6153ba565b61544485307f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316615c21565b615014565b6154a0846001600160a01b037f00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f38116907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9016615c21565b61500e565b6154d8917f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316615c21565b5f81614fc1565b614fb994612bd0612bd092612bd0620f424061551c612bd0985f80516020615db08339815191525c8015615525575b60901c62ffffff16906136ac565b04998a98613545565b50700dac0007d00005dc000bb80032c80059d961550e565b50700dac0007d00005dc000bb80032c80059d9614f61565b5f80516020615db08339815191525c8015615587575b61558162ffffff620f42409260781c16876136ac565b04614f4b565b50700dac0007d00005dc000bb80032c80059d961556b565b90506020813d6020116155c9575b816155ba60209383613403565b8101031261056157515f614f44565b3d91506155ad565b5f80516020615db08339815191525c8015615604575b6155fd62ffffff620f42409260601c16856136ac565b0490614ef5565b50700dac0007d00005dc000bb80032c80059d96155e7565b90506020813d602011615646575b8161563760209383613403565b8101031261056157515f614eed565b3d915061562a565b50700dac0007d00005dc000bb80032c80059d9614e81565b5f9260328104936105dc82028281046105dc1483151715612d7d57620f4240900492620f42406156a262ffffff61569b6135a5565b16856136ac565b0490620f42406156be62ffffff6156b7614265565b16866136ac565b04946156dc886156d688612bd087612bd08786613545565b93613545565b9582615b17575b81615ade575b836159bc575b80615841575b50604061518a945f80516020615dd08339815191528261516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152998651938493846040919493926060820195825260208201520152565b0390a18151908a82526020820152a18151908782526020820152a1846157e5575b847f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf066103e8860496879361514f6157b58684613545565b867f000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede53536001600160a01b0316615c62565b61583c856001600160a01b037f000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede53538116907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9016615c21565b61577e565b84808060246001600160a01b037f00000000000000000000000080396c7131159eb92e7e84839e51c9887a7a95d98116906158a190879083907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9016615c21565b604051632cd49aed60e01b8152600481018790529485915af1156159b4575061518a945f80516020615dd0833981519152604061516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152997f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240879a61598a6159636001600160401b037f000000000000000000000000000000000000000000000000000000006ac4279f1642613545565b7f00000000000000000000000000000000000000000000000000000000000151809061368e565b895186815260208101929092526040820152606090a199505050979d9c50509650505094506156f5565b3d86823e3d90fd5b6001600160a01b037f000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e811690615a1790869083907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9016615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528a60048401525af180156121b657615ac9575b507f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861615ac1615aa26159636001600160401b037f000000000000000000000000000000000000000000000000000000006ac4279f1642613545565b604051918291888b846040919493926060820195825260208201520152565b0390a16156ef565b615ad69195505f90613403565b5f935f615a47565b615b1282307f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a906001600160a01b0316615c21565b6156e9565b615b6e836001600160a01b037f00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f38116907f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a9016615c21565b6156e3565b8151919060418303615ba357615b9c9250602082015190606060408401519301515f1a90615c8d565b9192909190565b50505f9160029190565b6004811015615c0d5780615bbf575050565b60018103615bd65763f645eedf60e01b5f5260045ffd5b60028103615bf1575063fce698f760e01b5f5260045260245ffd5b600314615bfb5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60645f92838093604051968793630ab714fb60e11b855260018060a01b0316600485015282602485015260448401525af115615c5a5750565b3d5f823e3d90fd5b60445f92838093604051968793636a770b0f60e01b8552600485015260248401525af115615c5a5750565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615d04579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156121b6575f516001600160a01b03811615615cfa57905f905f90565b505f906001905f90565b5050505f916003919056fefabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8dd5ccc9a085f7022bb20616af7bbc7e01242e18f7a415e423214526aa90e6532c03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26703f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2680e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ee0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ed03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df492127adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b453d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b1954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b3a26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a0033","recompiledBytecode":"0x608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b63029a949d60e31b5f5260045ffd5b5f905f3560e01c90816303195cd01461322457508063034e7c47146131d257806305ca342f146131b857806306b7cb9c146122aa578063070fd029146131825780630c7621411461313e5780630e635186146130ff57806310e3c7a7146130e5578063154e1e3f146130ab5780631be052891461308f57806321bdc0d914612f8f57806321d0ee7014612f3857806324048ba114612ef457806324f159c214612eb0578063259982e514612e59578063263cef3c14612e3c57806328accf0914612d91578063293b1c6a146129b2578063375880651461296e5780633923411c146128de5780633bd1325114612847578063402573711461282b578063428a63411461279457806346158ffc1461270c57806346904840146126d8578063470d5fe61461267257806347ccca021461262e57806348e732771461261257806352bf8c27146125f557806354b4bf3914612558578063575e24b4146122e1578063638b12a0146122c7578063690422b2146122aa5780636b9cdad6146122665780636c2bbe7e146122095780636e5dbe86146121ea5780636f2c590a146121d05780636fe7e6eb1461208657806377e70a4b1461206a578063780d3cfe14611eb35780637cc4353b14611e015780637ce73d6714611dbc5780637d73714d14611d975780638009b7bd14611d525780638c2d6cf414611d37578063906f349114611cc357806391dd734614611c3c57806399b5598314611c015780639b75f7c814611be45780639f063efc14611b83578063a53e541214611b66578063a64e13a1146119eb578063af102658146119b0578063b47b2fb1146113a8578063b6a8b0fa1461134f578063b753bfe91461130a578063b827bbe0146112c5578063bb8b353c146112aa578063bbc2520d1461128f578063c269a3e214611267578063c314876d146111e7578063c4408c8a146111a2578063c79d2dfc14610cfe578063ce1b1d4314610cb9578063cffe289e14610c6a578063d16f715814610c25578063d25eae2514610bdc578063dc4c90d314610b97578063dc98354e14610960578063dd6b5e8e14610944578063df4fe917146105e1578063e1b4af6914610579578063e3b3904014610477578063eaf334761461045a578063fb26015f1461043e578063fb73056b146103f95763ffa800820361000f57346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f657602090604051908152f35b50346103f657806003193601126103f65760206040516105dc8152f35b50346103f657806003193601126103f6577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26654604051627eeac760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291821660248201529190602090839060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa90811561056d5790610536575b602090604051908152f35b506020813d602011610565575b8161055060209383613403565b81010312610561576020905161052b565b5f80fd5b3d9150610543565b604051903d90823e3d90fd5b50346103f657610588366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d29150505760405163e1b4af6960e01b8152602090f35b63570c108560e11b8152600490fd5b50346103f65760803660031901126103f6576105fb61323d565b610603613253565b90604435918260020b91828403610940576064356001600160a01b038116939084900361093c57307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316149086908215610908575b82156108f6575b82156108be575b82156108b4575b82156108a9575b505080156108a1575b610892577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26580546001600160a01b039283166001600160a01b0319918216179091557f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2668054939092169216821790555f80516020615d50833981519152805460a09490941b62ffffff60a01b166001600160b81b03199094169390931791909117909155604051638da5cb5b60e01b815290602090829060049082905afa908115610887578291610849575b505f80516020615d7083398151915280546001600160a01b0319166001600160a01b03929092169182179055801590811561079e575b5061078f5780f35b63f92ee8a960e01b8152600490fd5b60405163017d862f60e11b81529091506020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391610800575b506001600160a01b031614155f610787565b90506020813d602011610836575b8161081b60209383613403565b810103126108325761082c906134b5565b5f6107ee565b8280fd5b3d915061080e565b6040513d85823e3d90fd5b90506020813d60201161087f575b8161086460209383613403565b8101031261087b57610875906134b5565b5f610751565b5080fd5b3d9150610857565b6040513d84823e3d90fd5b63f92ee8a960e01b8552600485fd5b508215610685565b13159050855f61067c565b843b159250610675565b6001600160a01b038581167f00000000000000000000000000000000000000000000000000000000000000009091161415925061066e565b6001600160a01b038416159250610667565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b031615159250610660565b8580fd5b8480fd5b50346103f657806003193601126103f657602060405160018152f35b50346103f65760e03660031901126103f65761097a61323d565b60a036602319011261087b5761098e613362565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610b88577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b03168015928315610b6c575b8315610b58575b50508115610b3d575b8115610af6575b8115610ac7575b8115610aa7575b8115610a82575b8115610a5c575b5061078f575f80516020615d50833981519152805460ff60b81b1916600160b81b179055604051636e4c1aa760e11b8152602090f35b5f80516020615d50833981519152546001600160a01b039182169116141590505f610a26565b905060a4356001600160a01b03811690818103610aa3575030141590610a1f565b8380fd5b905060643562ffffff8116808203610aa357628000009150141590610a18565b90506084358060020b90818103610aa357505f80516020615d508339815191525460a01c60020b141590610a11565b90506001600160a01b03610b08613579565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e266546001600160a01b03169116141590610a0a565b90506001600160a01b03610b4f61358f565b16151590610a03565b6001600160a01b0316141591505f806109fa565b5f80516020615d508339815191525460b81c60ff1693506109f3565b63570c108560e11b8352600483fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657600435906001600160401b0382116103f6576101e060031983360301126103f6576020610c1d83600401614474565b604051908152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65760407f2f9e2e20558dbba26f6943f9568ee8724ef17057d8dd3fe037dadf2bb9691382546001600160401b038251918181168352831c166020820152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760403660031901126103f6576004356001600160401b03811161087b57806004016101e06003198336030112610832576024356001600160401b038111610aa357610d53903690600401613269565b929046602483013514801590611174575b801561115b575b8015611142575b8015611127575b801561110c575b80156110f2575b80156110d8575b80156110cf575b80156110c2575b80156110a3575b8015611083575b8015611055575b801561101f575b611010576020610dcb60848401856143c9565b908092918101031261093c5735938460011c9182158015610ff2575b8015610fe0575b610fd1576001600160401b035f80516020615d108339815191525416831115610fc257610e3c91610e2d610e3392610e2588614474565b92369161443e565b90615b73565b90929192615bad565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603610fb357916001600160401b03606092846101c483610ea97f83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b898613529565b1692018284610eb78361440a565b1610610f9f575b50821682195f80516020615d108339815191525416175f80516020615d10833981519152555f80516020615d108339815191525467ffffffffffffffff60401b8260401b169067ffffffffffffffff60401b1916175f80516020615d1083398151915255815f80516020615d10833981519152549660018060ff60801b92161460801b1660ff60801b1988161793845f80516020615d10833981519152553596877ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e5560ff6040519560801c1615158552166020840152166040820152a280f35b83919250610fac9061440a565b9190610ebe565b63027737d360e31b8552600485fd5b6319b5ff4d60e31b8752600487fd5b6383efa26f60e01b8752600487fd5b50610fea83613529565b421015610dee565b506001600160401b036110086101a4860161440a565b168311610de7565b6383efa26f60e01b8552600485fd5b506154606001600160401b0361104e61103b6101c4860161440a565b6110486101a4870161440a565b9061441e565b1611610db8565b506110636101c4830161440a565b6001600160401b03806110796101a4860161440a565b1691161115610db1565b506110916101c4830161440a565b6001600160401b034291161115610daa565b506110b16101a4830161440a565b6001600160401b0342911611610da3565b5061012482013515610d9c565b50823515610d95565b50600561ffff6110eb61018485016143fb565b1611610d8e565b50600461ffff61110561018485016143fb565b1610610d87565b50600461ffff61111f61016485016143fb565b161415610d80565b50600561ffff61113a61014485016143fb565b161415610d79565b50602061115260848401856143c9565b90501415610d72565b50600360ff61116c606485016143bb565b161415610d6b565b507f000000000000000000000000000000000000000000000000000000000000000060448301351415610d64565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65762ffffff6112046135a5565b166148440362ffffff81116112535762ffffff80611220614265565b169116039062ffffff821161123f5760208262ffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b50346103f657806003193601126103f6576020611282614265565b62ffffff60405191168152f35b50346103f657806003193601126103f6576020610c1d61420a565b50346103f657806003193601126103f65760206112826141c9565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65761135e366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d291505057604051635b54587d60e11b8152602090f35b50346103f6576101603660031901126103f6576113c361323d565b60a036602319011261087b5760603660c319011261087b576101243591610144356001600160401b03811161087b57611400903690600401613269565b90937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036119a15761143d614a2f565b839460e435928584129384159081611991575b81611983575b50611974578260801d600f0b918683125f1461196d57611475836136bf565b945b61147f614b6f565b156119145761148c614b87565b811561190557620f42406114a76114a1614854565b836136ac565b04965b8783156118f4576114bb9083613545565b80915b036118e55782156118de57505b925b7f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395c6114f761356a565b156118cf57602061150661358f565b604051634bf466a760e11b81526001600160a01b03909116600482015292839060249082905afa80156118c4578a90611890575b6115449250613545565b61154c61356a565b156117a85761155b9087613538565b620249f08402848104620249f0148515171561179457620f42409004106117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956915b6115ab8886614e42565b60a06040518160248237209360018060a01b031697889560405192835260208301526040820152a36115db61479e565b5f80516020615d908339815191525c6001600160a01b0316908161167a575b60408787805f80516020615db08339815191525d805f80516020615d908339815191525d807f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d81519063b47b2fb160e01b8252600f0b6020820152f35b85977f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef9695965c7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05c61170060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016936116f861356a565b9a369161443e565b6020815191012091833b15611781576101049689956040519b8c9a8b996321b0221b60e11b8b5260048b015260248a0152151560448901526064880152600f0b608487015260a486015260c485015260e48401525af1801561083e5761176c575b8080808086946115fa565b611777838092613403565b61087b575f611761565b8880fd5b637478d45560e11b8852600488fd5b634e487b7160e01b8a52601160045260248afd5b6117b486600f0b6136bf565b90620249f08202828104620249f0148315171561187c57620f4240810482118015611873575b61186457620f4240820290828204620f4240148315171561185057926118146118209361180e61181a94620f424097613545565b92613545565b9061368e565b856136ac565b0486116117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956916115a1565b634e487b7160e01b8c52601160045260248cfd5b637478d45560e11b8b5260048bfd5b508282146117da565b634e487b7160e01b8b52601160045260248bfd5b506020823d6020116118bc575b816118aa60209383613403565b8101031261056157611544915161153a565b3d915061189d565b6040513d8c823e3d90fd5b60206118d9613579565b611506565b90506114cb565b6337e83fd360e21b8a5260048afd5b6118fe9083613538565b80916114be565b61190e81614dee565b966114aa565b919750811561195e57620f424061193261192c614854565b876136ac565b04915b61194a839684835f1461195057505b93614bc5565b986114cd565b61195991613538565b611944565b61196785614dee565b91611935565b8294611477565b63153f6ec760e21b8652600486fd5b905083600f0b14155f611456565b905061199b61356a565b90611450565b63570c108560e11b8452600484fd5b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f657806003193601126103f6577337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590611b48575b8015611b25575b8015611b14575b611b05576001600160401b0342166001600160401b03195f80516020615d308339815191525416175f80516020615d30833981519152556201518042018042116112535767ffffffffffffffff60401b805f80516020615d30833981519152549260401b16169067ffffffffffffffff60401b1916175f80516020615d30833981519152557fe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc60605f80516020615d30833981519152546001600160401b0360405191818116835260401c16602082015260026040820152a180f35b635c06dcc560e01b8152600490fd5b5067fffffffffffeae7f4211611a29565b506001600160401b035f80516020615d308339815191525460401c161515611a22565b50731f22e4b065b2f15fed5be556dc0fa636048d29bc331415611a1b565b50346103f657806003193601126103f65760206040516170808152f35b50346103f657611b92366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506105d29250505057604080516327c18fbf60e21b8152602081019290925290f35b50346103f657806003193601126103f65760206040516107d08152f35b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f65760203660031901126103f6576004356001600160401b03811161087b57611c6d903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105d257611cbf611cab8484613fde565b604051918291602083526020830190613388565b0390f35b50346103f657806003193601126103f657608090611cdf614be6565b908115611d325750611cf7611cf2614c31565b614cce565b50505b5f80516020615e3083398151915254916001600160401b0360405193818116855260401c166020840152151560408301526060820152f35b611cfa565b50346103f657806003193601126103f6576020610c1d613ef1565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657611db9611db461323d565b6136cf565b80f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f6575f80516020615d70833981519152546001600160a01b03163303611ea457807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15611ea15781809160246040518094819363728b658960e01b835260043560048401525af1801561088757611e905750f35b81611e9a91613403565b6103f65780f35b50fd5b631d713add60e21b8152600490fd5b50346103f65760803660031901126103f6576004356001600160801b03811680910361087b5760405163cb2af14b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391612030575b506001600160a01b031633036120215781611f9491604051906002602083015260408201526024356060820152604435608082015260643560a082015260a08152611f7260c082613403565b604051809381926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610887578291611fff575b5060208180518101031261087b57602001516001600160801b03811680910361087b57602090610c1d61479e565b61201b91503d8084833e6120138183613403565b810190613453565b5f611fd1565b631d713add60e21b8252600482fd5b90506020813d602011612062575b8161204b60209383613403565b810103126108325761205c906134b5565b5f611f26565b3d915061203e565b50346103f657806003193601126103f6576020604051600c8152f35b3461056157610100366003190112610561576120a061323d565b5060a0366023190112610561576120b5613362565b506120be613378565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338190036121c157803b1561056157604051635275965160e01b8152906001600160a01b03612116613253565b1660048301526044356001600160a01b0381169081900361056157602483015260643562ffffff81168091036105615760448301526084358060020b80910361056157606483015260a4356001600160a01b03811691908290036105615760c4835f8193819560848401528160a48401525af180156121b6576121a6575b604051636fe7e6eb60e01b8152602090f35b5f6121b091613403565b5f612194565b6040513d5f823e3d90fd5b63570c108560e11b5f5260045ffd5b34610561575f366003190112610561576020611282613633565b34610561575f366003190112610561576339cbe26160e21b5f5260045ffd5b3461056157612217366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506121c1925050505760408051633615df3f60e11b81525f6020820152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576020604051620249f08152f35b34610561575f3660031901126105615760206112826135a5565b3461056157610140366003190112610561576122fb61323d565b60a03660231901126105615760603660c319011261056157610124356001600160401b03811161056157612333903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190338390036121c157604090612373614a2f565b61237b61356a565b9061239f60e43596879585519687958695638e88a1f160e01b8752600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f91612527575b505f80516020615db08339815191525d5f80516020615d908339815191525d61240361356a565b1561251857602061241261358f565b604051634bf466a760e11b81526001600160a01b03909116600482015291829060249082905afa9081156121b6575f916124e5575b50606091612486917f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395d5f9061247b614b6f565b6124a7575b50614bc5565b60801b604051906315d7892d60e21b82526020820152624000006040820152f35b90505f6124b2614b87565b9112156124d7576124cf620f4240916124c9614854565b906136ac565b045b83612480565b6124e090614dee565b6124d1565b90506020813d602011612510575b8161250060209383613403565b8101031261056157516060612447565b3d91506124f3565b6020612522613579565b612412565b905061254b915060403d604011612551575b6125438183613403565b8101906134c9565b846123dc565b503d612539565b34610561575f3660031901126105615760805f80516020615d10833981519152546001600160401b038160401c1690814210155f146125da575f915b6001600160401b037ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e549260ff6040519516855216602084015260408301526060820152f35b80831c60ff16156125ee5760025b91612594565b60016125e8565b34610561575f366003190112610561576020604051620151808152f35b34610561575f3660031901126105615760206040516101f48152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f36600319011261056157604051632386aff360e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061053657602090604051908152f35b34610561575f366003190112610561575f80516020615d70833981519152546040516001600160a01b039091168152602090f35b34610561575f3660031901126105615760408051630f77314d60e31b815290816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061277257602090604051908152f35b506040813d60401161278c575b8161055060409383613403565b3d915061277f565b34610561575f3660031901126105615760405163428a634160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6576020915f916127fe575b506040519015158152f35b61281e9150823d8411612824575b6128168183613403565b810190613552565b826127f3565b503d61280c565b34610561575f3660031901126105615760206040516154608152f35b34610561575f36600319011261056157604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa80156121b6575f9061053657602090604051908152f35b34610561575f36600319011261056157604080515f6020820181905233828401529181526129129190611f72606082613403565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156121b657612956575b61295461479e565b005b612969903d805f833e6120138183613403565b61294c565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561576060366003190112610561576004356044356129e26129d461420a565b6129dc613ef1565b90613538565b90804211908115612d67575b508015612d5f575b8015612d57575b8015612d4c575b612d3d576040516318160ddd60e01b8152907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083600481845afa9283156121b6575f93612d09575b506040516370a0823160e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004820181905292909190602083602481855afa9283156121b6575f93612cd3575b5060408051600160208201523391810191909152612b0591905f90612ae381606081015b03601f198101835282613403565b604051809481926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156121b657612b6792612b5f92612cbb575b50612b5161479e565b612b5961420a565b90613545565b612b59613ef1565b936040516318160ddd60e01b8152602081600481865afa9081156121b6575f91612c88575b50612b9990602092613545565b936024604051809481936370a0823160e01b835260048301525afa9081156121b6575f91612c54575b50612bd090612bd593613538565b613545565b918115908115612c4b575b8115612c38575b50612c29576040917f0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3838051848152836020820152a182519182526020820152f35b63873d73a960e01b5f5260045ffd5b9050612c448284614895565b1083612be7565b83159150612be0565b90506020813d602011612c80575b81612c6f60209383613403565b810103126105615751612bd5612bc2565b3d9150612c62565b90506020813d602011612cb3575b81612ca360209383613403565b8101031261056157516020612b8c565b3d9150612c96565b612cce903d805f833e6120138183613403565b612b48565b9092506020813d602011612d01575b81612cef60209383613403565b81010312610561575191612b05612ab1565b3d9150612ce2565b9092506020813d602011612d35575b81612d2560209383613403565b8101031261056157519184612a57565b3d9150612d18565b6333b094a160e01b5f5260045ffd5b506024358111612a04565b5080156129fd565b5081156129f6565b905061012c420190814211612d7d5711836129ee565b634e487b7160e01b5f52601160045260245ffd5b34610561575f366003190112610561576040516319b400eb60e21b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90612e02575b6040516001600160a01b039091168152602090f35b506020813d602011612e34575b81612e1c60209383613403565b8101031261056157612e2f6020916134b5565b612ded565b3d9150612e0f565b34610561575f366003190112610561576020604051620493e08152f35b3461056157612e6736613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163259982e560e01b8152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461056157612f4636613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163021d0ee760e41b8152602090f35b3461056157608036600319011261056157612fa861323d565b60243590811515820361056157606435906001600160401b03821161056157612ffc92612fdb6040933690600401613269565b8451638e88a1f160e01b8152958694859491939160443591600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f9161306e575b5062ffffff5f199116019062ffffff8211612d7d57604080516001600160a01b03909216825262ffffff929092166020820152f35b9050613089915060403d604011612551576125438183613403565b82613039565b34610561575f36600319011261056157602060405161a8c08152f35b34610561575f3660031901126105615760206040517f43c032f18f863bf5301f80e8812396bc62519b9c402f07184c2255d30d84788f8152f35b34610561575f366003190112610561576020610c1d614854565b34610561575f3660031901126105615730330361004c57604051630321f11f60e21b60208201526004815261295490613139602482613403565b61480d565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f3660031901126105615760408051600160208201523391810191909152612912905f90611f728160608101612ad5565b34610561575f3660031901126105615760206040515f8152f35b34610561575f3660031901126105615760605f80516020615d3083398151915254600262ffffff613201613633565b16146001600160401b0360405192818116845260401c1660208301526040820152f35b34610561575f3660031901126105615780600160209252f35b600435906001600160a01b038216820361056157565b602435906001600160a01b038216820361056157565b9181601f84011215610561578235916001600160401b038311610561576020838186019501011161056157565b90610160600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c49161014435906001600160401b038211610561576132f591600401613269565b9091565b906101a0600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c4916101443591610164359161018435906001600160401b038211610561576132f591600401613269565b60c435906001600160a01b038216820361056157565b60e435908160020b820361056157565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b610120600319820112610561576004356001600160a01b0381168103610561579160a06023198301126105615760249160c4359160e4359161010435906001600160401b038211610561576132f591600401613269565b90601f801991011681019081106001600160401b0382111761342457604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161342457601f01601f191660200190565b602081830312610561578051906001600160401b038211610561570181601f820112156105615780519061348682613438565b926134946040519485613403565b8284526020838301011161056157815f9260208093018386015e8301015290565b51906001600160a01b038216820361056157565b91908260409103126105615760206134e0836134b5565b92015190565b93909285939260a09693600180891b0316865215156020860152604085015260806060850152816080850152848401375f828201840152601f01601f1916010190565b906154608201809211612d7d57565b91908201809211612d7d57565b91908203918211612d7d57565b90816020910312610561575180151581036105615790565b60c43580151581036105615790565b6044356001600160a01b03811681036105615790565b6024356001600160a01b03811681036105615790565b604051630abb87c960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613601575b506135fb575f90565b6107d090565b90506020813d60201161362b575b8161361c60209383613403565b8101031261056157515f6135f2565b3d915061360f565b5f80516020615d30833981519152546001600160401b038160401c16801515918261367a575b5081613670575b501561366b57600290565b600190565b905042105f613660565b6001600160401b031642101591505f613659565b8115613698570490565b634e487b7160e01b5f52601260045260245ffd5b81810292918115918404141715612d7d57565b600160ff1b8114612d7d575f0390565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590613ed3575b613ec4575f6136fb614be6565b15613e855761370b611cf2614c31565b82939291845f80516020615e70833981519152557ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b2555f80516020615e3083398151915254906001600160401b0360c01b9060c01b16906001600160801b036001600160401b0360801b4260801b16911617175f80516020615e30833981519152556040519360a085018581106001600160401b03821117613424576040525f85526020850194731b54e762aa34cf6e28e9c082f2848e28e45da6b88652604081019562800000875260608201966001885260808301977337bfb8ac7c960e558657871d41ca70e07e7dbfff895261380560a08520614e1c565b60038101809111612d7d5760405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa80156121b6575f90613e4c575b6001600160801b039150169780158015613e44575b613de15761386d60a08620614e1c565b60405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91613e12575b506401000276a4996001600160a01b039190911691908a831115613e04576138d08360649261492c565b04809111613dfc575b5060016001607f1b038711613ded575b8615613de1576103e38102908082046103e31490151715612d7d576103e890046001600160a01b0316976401000276a3891115613dd9575b506e04444c5dc75cb358380d2e3de08a903b1561056157604051637a94c56560e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201528660448201525f81606481836e04444c5dc75cb358380d2e3de08a905af180156121b657613dc4575b50613998866136bf565b91604051606081018181106001600160401b03821117613db05760409081526001825260208083019586526001600160a01b03909b1682820190815290518b9590926139e48785613403565b8b8452604051633cf3645360e21b815289516001600160a01b039081166004830152895181166024830152955162ffffff166044820152955160020b60648701529c51841660848601529b51151560a48501529a5160c484015299511660e48201526101206101048201529788908190613a6390610124830190613388565b0381885a6e04444c5dc75cb358380d2e3de08a9090f1968715613cc2578597613d81575b506001600160801b03613a9f8860801d600f0b6136bf565b97169387818110613ce2575b613ac491505f80516020615e7083398151915254613545565b5f80516020615e708339815191525583613bd2575b5060a09020604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff600482015260248101859052909480826044816e04444c5dc75cb358380d2e3de08a905afa94851561056d5794613b80575b5050604080519586526020860192909252908401919091526001600160a01b0316917f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e9080606081015b0390a3565b90809450813d8311613bcb575b613b978183613403565b8101031261056157613b7b7f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e935193613b31565b503d613b8d565b516001600160a01b03166e04444c5dc75cb358380d2e3de08a903b156109405760405190630b0d9c0960e01b825260048201527337bfb8ac7c960e558657871d41ca70e07e7dbfff60248201528360448201528481606481836e04444c5dc75cb358380d2e3de08a905af18015613cc257908591613ccd575b5050731b54e762aa34cf6e28e9c082f2848e28e45da6b83b15610aa357604051630852cd8d60e31b815260048101849052848160248183731b54e762aa34cf6e28e9c082f2848e28e45da6b85af18015613cc257908591613cad575b50613ad9565b81613cb791613403565b610aa357835f613ca7565b6040513d87823e3d90fd5b81613cd791613403565b610aa357835f613c4b565b613ceb91613545565b6e04444c5dc75cb358380d2e3de08a903b1561093c5760405190630ab714fb60e11b82527337bfb8ac7c960e558657871d41ca70e07e7dbfff600483015286602483015260448201528581606481836e04444c5dc75cb358380d2e3de08a905af18015613d7657908691613d61575b5087613aab565b81613d6b91613403565b61094057845f613d5a565b6040513d88823e3d90fd5b9096508581813d8311613da9575b613d998183613403565b810103126109405751955f613a87565b503d613d8f565b634e487b7160e01b8a52604160045260248afd5b613dd19197505f90613403565b5f955f61398e565b97505f613921565b50505050505050505050565b60016001607f1b0396506138e9565b96505f6138d9565b505050505050505050505050565b90506020813d602011613e3c575b81613e2d60209383613403565b8101031261056157515f6138a6565b3d9150613e20565b50881561385d565b506020813d602011613e7d575b81613e6660209383613403565b81010312610561576001600160801b039051613848565b3d9150613e59565b5030330361004c57604051631652585760e01b60208201526001600160a01b039091166024808301919091528152613ec290613139604482613403565b565b63271a26f160e01b5f5260045ffd5b507337bfb8ac7c960e558657871d41ca70e07e7dbfff3314156136ee565b604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa9081156121b6575f91613f72575090565b90506020813d602011613f99575b81613f8d60209383613403565b81010312610561575190565b3d9150613f80565b359060ff8216820361056157565b3d15613fd9573d90613fc082613438565b91613fce6040519384613403565b82523d5f602084013e565b606090565b805f928101036020811261056157600260ff613ff984613fa1565b16036140b55760a01361087b5761400f81613fa1565b506020810135906001600160801b038216809203610832579082916080604051916020830193630fe1ea1160e01b855260248401526040810135604484015260608101356064840152013560848201526084815261406e60a482613403565b51907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af46140a4613faf565b90156140ad5790565b602081519101fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036121c1576040136105615760206140f782613fa1565b9101359060018060a01b0382168092036105615760ff168061416c575050303b156103f657604051630731a8c360e11b8152818160048183305af1801561088757908291614157575b50505b60405190614152602083613403565b815290565b8161416191613403565b6103f657805f614140565b6001036141ba57303b156105615760405190637d73714d60e01b825260048201525f8160248183305af180156121b6576141a7575b50614143565b6141b391505f90613403565b5f806141a1565b63091c731b60e31b5f5260045ffd5b5f80516020615d10833981519152546001600160401b038160401c164210156142035760801c60ff16156141fd57610dac90565b6105dc90565b506109c490565b604051627eeac760e11b81523060048201525f60248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613f72575090565b7f0000000000000000000000000000000000000000000000000000000000000000421061431a576040516340bd8e6960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f916142e8575b506142e2575f90565b610dac90565b90506020813d602011614312575b8161430360209383613403565b8101031261056157515f6142d9565b3d91506142f6565b6040516318160ddd60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90614378575b63ffffffff16151590506142e2575f90565b506020813d6020116143b3575b8161439260209383613403565b81010312610561575163ffffffff811681036105615763ffffffff90614366565b3d9150614385565b3560ff811681036105615790565b903590601e198136030182121561056157018035906001600160401b0382116105615760200191813603831361056157565b3561ffff811681036105615790565b356001600160401b03811681036105615790565b906001600160401b03809116911603906001600160401b038211612d7d57565b92919261444a82613438565b916144586040519384613403565b829481845281830111610561578281602093845f960137010152565b6040516101e081018181106001600160401b03821117613424576145e76101c06042946001600160401b03936040525f60608601525f60808601525f60a08601525f60c08601525f60e08601525f6101008601525f6101208601525f6101408601525f6101608601525f6101808601525f6101a08601525f8286015280358552602081013560208601526040810135604086015260ff614516606083016143bb565b16606086015261453361452c60808301836143c9565b369161443e565b60208151910120608086015260a081013560a08601528361455660c0830161440a565b1660c08601528361456960e0830161440a565b1660e086015261010081013561010086015261012081013561012086015261ffff61459761014083016143fb565b1661014086015261ffff6145ae61016083016143fb565b1661016086015261ffff6145c561018083016143fb565b16610180860152836145da6101a0830161440a565b166101a08601520161440a565b166101c082015260405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fee3b0f8c46969f9c96cbdb258d9bc22f87f49dba9cd39b7a7f091505ea4b9ccd60408201527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260a0815261468060c082613403565b519020906001600160401b036101c0604051927f9c61a909d173aec816b2730e20b6caa3a25ca10c8a084dbf023e026e53874db4602085015280516040850152602081015160608501526040810151608085015260ff60608201511660a0850152608081015160c085015260a081015160e08501528260c0820151166101008501528260e08201511661012085015261010081015161014085015261012081015161016085015261ffff6101408201511661018085015261ffff610160820151166101a085015261ffff6101808201511682850152826101a0820151166101e0850152015116610200820152610200815261477d61022082613403565b602081519101206040519161190160f01b8352600283015260228201522090565b62028dd45a10613ec257604051637de4c18d60e01b81526020816004815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620249f0f16147f25750565b61480a9060203d602011612824576128168183613403565b50565b80515f918291906020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af461484b613faf565b90156140ad5750565b5f80516020615db08339815191525c801561487d575b62ffffff165f198101908111612d7d5790565b50700dac0007d00005dc000bb80032c80059d961486a565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610561571461492557670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90606082901b905f19600160601b8409928280851094039380850394858411156105615714614925578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f19818509938380861095039480860395868511156105615714614a27579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b5f80516020615d508339815191525460ff8160b81c1615908115614b4f575b8115614b2f575b8115614ae5575b8115614ac4575b8115614aa4575b508015614a86575b614a7857565b62820f3560e61b5f5260045ffd5b5060643562ffffff8116808203610561576280000091501415614a72565b608435600281900b9250828103610561575060a01c60020b14155f614a6a565b905060a4356001600160a01b03811690818103610561575030141590614a63565b90506044356001600160a01b0381169081810361056157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141590614a5c565b90506024356001600160a01b038116908181036105615750151590614a55565b5f80516020615d70833981519152546001600160a01b0316159150614a4e565b60c4358015159081810361056157505f60e435121490565b60e4355f811290815f14614bc05760010190600182128015821691151617612d7d57614bb2906136bf565b60018101809111612d7d5790565b905090565b6001607f1b811015614bd757600f0b90565b6393dafdf160e01b5f5260045ffd5b5f80516020615e30833981519152546001600160401b038160401c168015159182614c1d575b5081614c16575090565b9050421090565b6001600160401b031642101591505f614c0c565b604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201526020816044816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91614c9c575b5080614c8e57505f90565b5f198101908111612d7d5790565b90506020813d602011614cc6575b81614cb760209383613403565b8101031261056157515f614c83565b3d9150614caa565b905f80516020615e7083398151915254917ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b254915f80516020615e30833981519152548060c01c92614d208587613538565b8110613ec45784612bd087614d3493613545565b9084151580614dd9575b614d71575b5080614d4c5750565b9092614d589250613538565b906170804201804211612d7d576001600160401b031690565b94614d94919495844210155f14614d9b5750614d8e868092613538565b95613545565b925f614d43565b614dd26001600160401b03614d8e9260801c166001600160401b03614dca614dc38342613545565b928961441e565b1690896149af565b8092613538565b506001600160401b038160801c164211614d3e565b614e00614df9614854565b80926136ac565b90620f424003620f42408111612d7d57614e199161368e565b90565b604051602081019182526006604082015260408152614e3c606082613403565b51902090565b91907f00000000000000000000000000000000000000000000000000000000000000004210615666575f80516020615db08339815191525c801561564e575b62ffffff614e939160481c16846136ac565b604051630abb87c960e11b81525f94917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691620f424090910490602081600481865afa9081156121b6575f9161561c575b506155d1575f905b6040516340bd8e6960e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081600481855afa9081156121b6575f9161559f575b50615555575f5b5f80516020615db08339815191525c801561553d575b614f7762ffffff620f42409260301c16886136ac565b04945f80516020615d908339815191525c9284838a8a8a8a6001600160a01b038a166154df57612bd09250614fb994612bd0612bd092612bd05f998a98613545565b9481806154a5575b5050897f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d83615449575b84615410575b620151806150427f000000000000000000000000000000000000000000000000000000000000000042613545565b049186615356575b50826151f5575b505050965f80516020615dd083398151915260405f80516020615df0833981519152945f80516020615e5083398151915282955f80516020615e108339815191529b9c6150b485519283928d846040919493926060820195825260208201520152565b0390a18151908882526020820152a18151908582526020820152a180615199575b6103e882049281841161518f575b83827f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf068161514f8161516d96612bd061511f8861518a9b613545565b887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b604080518981526020810192909252810191909152606090a1613545565b604051938493846040919493926060820195825260208201520152565b0390a1565b90925082906150e3565b6151f0816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6150d5565b8a9061522b84827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b1561087b578190602460405180948193632cd49aed60e01b83528860048401525af1801561534b57615332575b505f80516020615df0833981519152945f80516020615e508339815191526040955f80516020615e108339815191529b9c957ff548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea5f80516020615dd0833981519152968c6153228b987f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c0582408a5180615303848888846040919493926060820195825260208201520152565b0390a18951938493846040919493926060820195825260208201520152565b0390a1959c9b5095505094615051565b61533d8b8092613403565b615347575f61525a565b8980fd5b6040513d8d823e3d90fd5b61538a87827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528c60048401525af180156121b6576153fb575b5060408051898152602081018890529081018390527f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f86190606090a15f61504a565b615408919b505f90613403565b5f995f6153ba565b61544485307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b615014565b6154a0846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61500e565b6154d8917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b5f81614fc1565b614fb994612bd0612bd092612bd0620f424061551c612bd0985f80516020615db08339815191525c8015615525575b60901c62ffffff16906136ac565b04998a98613545565b50700dac0007d00005dc000bb80032c80059d961550e565b50700dac0007d00005dc000bb80032c80059d9614f61565b5f80516020615db08339815191525c8015615587575b61558162ffffff620f42409260781c16876136ac565b04614f4b565b50700dac0007d00005dc000bb80032c80059d961556b565b90506020813d6020116155c9575b816155ba60209383613403565b8101031261056157515f614f44565b3d91506155ad565b5f80516020615db08339815191525c8015615604575b6155fd62ffffff620f42409260601c16856136ac565b0490614ef5565b50700dac0007d00005dc000bb80032c80059d96155e7565b90506020813d602011615646575b8161563760209383613403565b8101031261056157515f614eed565b3d915061562a565b50700dac0007d00005dc000bb80032c80059d9614e81565b5f9260328104936105dc82028281046105dc1483151715612d7d57620f4240900492620f42406156a262ffffff61569b6135a5565b16856136ac565b0490620f42406156be62ffffff6156b7614265565b16866136ac565b04946156dc886156d688612bd087612bd08786613545565b93613545565b9582615b17575b81615ade575b836159bc575b80615841575b50604061518a945f80516020615dd08339815191528261516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152998651938493846040919493926060820195825260208201520152565b0390a18151908a82526020820152a18151908782526020820152a1846157e5575b847f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf066103e8860496879361514f6157b58684613545565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b61583c856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61577e565b84808060246001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906158a190879083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b604051632cd49aed60e01b8152600481018790529485915af1156159b4575061518a945f80516020615dd0833981519152604061516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152997f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240879a61598a6159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b7f00000000000000000000000000000000000000000000000000000000000000009061368e565b895186815260208101929092526040820152606090a199505050979d9c50509650505094506156f5565b3d86823e3d90fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690615a1790869083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528a60048401525af180156121b657615ac9575b507f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861615ac1615aa26159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b604051918291888b846040919493926060820195825260208201520152565b0390a16156ef565b615ad69195505f90613403565b5f935f615a47565b615b1282307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b6156e9565b615b6e836001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6156e3565b8151919060418303615ba357615b9c9250602082015190606060408401519301515f1a90615c8d565b9192909190565b50505f9160029190565b6004811015615c0d5780615bbf575050565b60018103615bd65763f645eedf60e01b5f5260045ffd5b60028103615bf1575063fce698f760e01b5f5260045260245ffd5b600314615bfb5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60645f92838093604051968793630ab714fb60e11b855260018060a01b0316600485015282602485015260448401525af115615c5a5750565b3d5f823e3d90fd5b60445f92838093604051968793636a770b0f60e01b8552600485015260248401525af115615c5a5750565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615d04579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156121b6575f516001600160a01b03811615615cfa57905f905f90565b505f906001905f90565b5050505f916003919056fefabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8dd5ccc9a085f7022bb20616af7bbc7e01242e18f7a415e423214526aa90e6532c03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26703f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2680e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ee0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ed03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df492127adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b453d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b1954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b3a26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a0033","sourceMap":"1530:10197:73:-:0;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;;16543:11:80;-1:-1:-1;;;;;1530:10197:73;16521:10:80;:34;16517:57;;1530:10197:73;16517:57:80;18064:10;;;16564;;1530:10197:73;16564:10:80;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12037:23:80;1530:10197:73;12037:23:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;18351:31:80;1530:10197:73;18351:31:80;;;1530:10197:73;;;;;;;;;;18232:29:80;1530:10197:73;18232:29:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1118:43:99;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;4249:46:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5962:5:97;1530:10197:73;;;;;;;;;;;;;;;;16875:15:80;1530:10197:73;;;-1:-1:-1;;;16810:83:80;;-1:-1:-1;;;;;16840:16:80;1530:10197:73;;;16810:83:80;;1530:10197:73;;;;;;;;;;;;;;16810:83:80;;1530:10197:73;;16810:11:80;1530:10197:73;16810:83:80;;;;;;;;;;1530:10197:73;;;;;;;;;16810:83:80;;1530:10197:73;16810:83:80;;1530:10197:73;16810:83:80;;;;;;1530:10197:73;16810:83:80;;;:::i;:::-;;;1530:10197:73;;;;;;;16810:83:80;;1530:10197:73;-1:-1:-1;1530:10197:73;;16810:83:80;;;-1:-1:-1;16810:83:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;1195:63:86;-1:-1:-1;;;1242:16:86;;1530:10197:73;;1242:16:86;1530:10197:73;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;6061:4:80;6070;-1:-1:-1;;;;;1530:10197:73;6053:21:80;;1530:10197:73;;6053:56:80;;;;1530:10197:73;6053:85:80;;;;1530:10197:73;6053:124:80;;;;1530:10197:73;6053:150:80;;;;1530:10197:73;6053:170:80;;;;1530:10197:73;6053:191:80;;;;;;1530:10197:73;6036:249:80;;3604:40;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;-1:-1:-1;;;;;;1530:10197:73;;;;;;;6336:11:80;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;;-1:-1:-1;;;1530:10197:73;-1:-1:-1;;;;;;1530:10197:73;;;;;;;;;;;;;;;;-1:-1:-1;;;6470:32:80;;1530:10197:73;;;;;;;;;6470:32:80;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;6516:32:80;;;:81;;;;1530:10197:73;6512:142:80;;;1530:10197:73;;6512:142:80;-1:-1:-1;;;6620:23:80;;1530:10197:73;;6620:23:80;6516:81;1530:10197:73;;-1:-1:-1;;;6574:23:80;;1530:10197:73;;-1:-1:-1;1530:10197:73;;;;6574:14:80;-1:-1:-1;;;;;1530:10197:73;6574:23:80;;;;;;;;;;;6516:81;-1:-1:-1;;;;;;1530:10197:73;6552:45:80;;6516:81;;;6574:23;;;1530:10197:73;6574:23:80;;1530:10197:73;6574:23:80;;;;;;1530:10197:73;6574:23:80;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;6574:23:80;;;1530:10197:73;;;;6574:23:80;;;-1:-1:-1;6574:23:80;;;1530:10197:73;;;;;;;;;6470:32:80;;;1530:10197:73;6470:32:80;;1530:10197:73;6470:32:80;;;;;;1530:10197:73;6470:32:80;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;6470:32:80;;;1530:10197:73;;;;6470:32:80;;;-1:-1:-1;6470:32:80;;;1530:10197:73;;;;;;;;;6036:249:80;-1:-1:-1;;;6262:23:80;;1530:10197:73;7310:23:80;6262;6053:191;6227:17;;;6053:191;;:170;6207:16;;;-1:-1:-1;6053:170:80;;;;:150;6181:17;;:22;;-1:-1:-1;6053:150:80;;:124;-1:-1:-1;;;;;1530:10197:73;;;6167:10:80;1530:10197:73;;;6158:19:80;;;-1:-1:-1;6053:124:80;;:85;-1:-1:-1;;;;;1530:10197:73;;6113:25:80;;-1:-1:-1;6053:85:80;;:56;3604:40;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;6078:31:80;;;-1:-1:-1;6053:56:80;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;6301:1;1530:10197;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;1195:63;;3604:40:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;6906:31:80;;;:56;;;;1530:10197:73;6906:87:80;;;;1530:10197:73;6906:151:80;;;;;;1530:10197:73;6906:200:80;;;;1530:10197:73;6906:256:80;;;;1530:10197:73;6906:300:80;;;;1530:10197:73;6906:355:80;;;;1530:10197:73;6906:386:80;;;;1530:10197:73;6889:444:80;;;-1:-1:-1;;;;;;;;;;;552:8:42;;-1:-1:-1;;;;552:8:42;-1:-1:-1;;;552:8:42;;;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;6906:386:80;-1:-1:-1;;;;;;;;;;;552:8:42;-1:-1:-1;;;;;1530:10197:73;;;;;7265:27:80;;;-1:-1:-1;6906:386:80;;;:355;7234:9;-1:-1:-1;7234:9:80;552:8:42;-1:-1:-1;;;;;1530:10197:73;;;;;;;;7256:4:80;;7226:35;;6906:355;;;1530:10197:73;;;;6906:300:80;7166:7;;;1530:10197:73;;;;;;;;;552:8:42;1530:10197:73;7166:40:80;;;6906:300;;;:256;7126:15;;;1530:10197:73;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;7126:36:80;;6906:256;;;:200;1530:10197:73;-1:-1:-1;;;;;;7077:13:80;;:::i;:::-;7095:11;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;7061:45:80;;;6906:200;;:151;1530:10197:73;-1:-1:-1;;;;;;7029:13:80;;:::i;:::-;1530:10197:73;7013:44:80;;6906:151;;;:87;-1:-1:-1;;;;;1530:10197:73;6966:27:80;;;-1:-1:-1;6906:87:80;;;;:56;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;-1:-1:-1;6906:56:80;;1195:63:86;-1:-1:-1;;;1242:16:86;;1530:10197:73;1242:16:86;;1530:10197:73;;;;;;;;;;;;;;;895:41:86;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;433:40:87;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;302:32:75;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2042:39:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;2873:13:87;;;1530:10197:73;2860:9:87;;1530:10197:73;2860:26:87;;;:67;;;1530:10197:73;2860:88:87;;;;1530:10197:73;2860:129:87;;;;1530:10197:73;2860:149:87;;;;1530:10197:73;2860:166:87;;;;1530:10197:73;2860:182:87;;;;1530:10197:73;2860:198:87;;;;1530:10197:73;2860:243:87;;;;1530:10197:73;2860:273:87;;;;1530:10197:73;2860:321:87;;;;1530:10197:73;2860:355:87;;;;1530:10197:73;2860:400:87;;;;1530:10197:73;2860:446:87;;;;1530:10197:73;2843:497:87;;1530:10197:73;3380:8:87;;;;;;:::i;:::-;3369:31;;;;;;1530:10197:73;;;;;1862:10:50;;1530:10197:73;1862:10:50;3457:16:87;;;:44;;;;1530:10197:73;3457:96:87;;;;1530:10197:73;3453:150:87;;-1:-1:-1;;;;;;;;;;;;;;;;1530:10197:73;;3661:27:87;;;3657:52;;5489:8:19;3737:16:87;1530:10197:73;5433:27:19;3737:16:87;;;;:::i;:::-;1530:10197:73;;;;:::i;:::-;5433:27:19;;:::i;:::-;5489:8;;;;;:::i;:::-;-1:-1:-1;;;;;3769:15:87;1530:10197:73;;;;3723:61:87;3719:96;;3940:29;-1:-1:-1;;;;;1530:10197:73;3940:29:87;;3984:11;3940:29;;4182:56;3940:29;;:::i;:::-;1530:10197:73;3984:11:87;;;;;;;:::i;:::-;1530:10197:73;3984:19:87;3980:44;;1530:10197:73;;;;2137:42:97;;-1:-1:-1;;;;;;;;;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;-1:-1:-1;;;;;;;;;;;2137:42:97;-1:-1:-1;;;2137:42:97;1530:10197:73;2137:42:97;;;-1:-1:-1;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;;;;4116:16:87;3380:8;1653:42:73;1530:10197;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;1653:42;;4142:11:87;1653:42:73;1530:10197;;;;3380:8:87;1530:10197:73;;;;;;;;;;;;;;;;4182:56:87;1530:10197:73;;3980:44:87;4013:11;;;;;;;:::i;:::-;3980:44;;;;3719:96;-1:-1:-1;;;3793:22:87;;1530:10197:73;3793:22:87;;3657:52;-1:-1:-1;;;3697:12:87;;1530:10197:73;3697:12:87;;3453:150;-1:-1:-1;;;3576:16:87;;1530:10197:73;3324:16:87;3576;3457:96;3505:29;;;;:::i;:::-;3538:15;-1:-1:-1;3505:48:87;3457:96;;:44;3491:10;-1:-1:-1;;;;;3491:10:87;;;;;:::i;:::-;1530:10197:73;3477:24:87;;3457:44;;2843:497;-1:-1:-1;;;3324:16:87;;1530:10197:73;3324:16:87;;2860:446;3264:11;570:7;-1:-1:-1;;;;;3264:24:87;:11;;;;;:::i;:::-;3278:10;;;;;:::i;:::-;3264:24;;:::i;:::-;1530:10197:73;3264:42:87;2860:446;;:400;3235:11;;;;;;:::i;:::-;-1:-1:-1;;;;;3250:10:87;;;;;;:::i;:::-;1530:10197:73;;;3235:25:87;;2860:400;;:355;3185:11;;;;;;:::i;:::-;-1:-1:-1;;;;;3200:15:87;1530:10197:73;;3185:30:87;;2860:355;;:321;3153:10;;;;;;:::i;:::-;-1:-1:-1;;;;;3166:15:87;1530:10197:73;;3153:28:87;2860:321;;:273;3107:12;;;;1530:10197:73;3107:26:87;2860:273;;:243;1530:10197:73;;;3078:25:87;2860:243;;:198;3046:8;3057:1;623:33;3046:8;;;;;:::i;:::-;623:33;3046:12;2860:198;;:182;3030:8;1530:10197:73;623:33:87;3030:8;;;;;:::i;:::-;623:33;3030:12;2860:182;;:166;3013:8;1530:10197:73;623:33:87;3013:8;;;;;:::i;:::-;623:33;3013:13;;2860:166;;:149;2993:11;3008:1;623:33;2993:11;;;;;:::i;:::-;623:33;2993:16;;2860:149;;:129;2968:8;1530:10197:73;2968:8:87;;;;;;:::i;:::-;:21;;;;2860:129;;:88;2931:12;2947:1;1530:10197:73;2931:12:87;;;;;:::i;:::-;1530:10197:73;2931:17:87;;2860:88;;:67;2908:19;;2890:14;;;1530:10197:73;2890:37:87;;2860:67;;1530:10197:73;;;;;;;;;;;;;;;681:43:98;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;6454:20:97;;:::i;:::-;1530:10197:73;;;;;;;;;6477:14:97;;;:::i;:::-;1530:10197:73;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;2435:59;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;2240:50:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;;1199:10:86;:34;;;1195:63;;8799:3:80;;:::i;:::-;10468:18;1530:10197:73;10520:22:80;1530:10197:73;10520:26:80;;;;10560:11;;;:32;;;;1530:10197:73;10560:85:80;;;1530:10197:73;10556:143:80;;;2052:83:53;;;1530:10197:73;;10771:69:80;:12;;;:69;1530:10197:73;;;10794:17:80;;;:::i;:::-;10771:69;;10898:24;;:::i;:::-;;;;10958;;:::i;:::-;11002:70;;;;1880:9:72;1867:12;1873:6;;:::i;:::-;1867:12;;:::i;:::-;1862:10:50;11002:70:80;;10996:76;11105:46;;;;11118:15;;;;:::i;:::-;11105:46;;;11169:21;11165:53;;11240:33;;;;;;10894:601;;14109:49;14586:34;14678:17;;:::i;:::-;:45;;;1530:10197:73;14696:13:80;;:::i;:::-;1530:10197:73;;-1:-1:-1;;;14646:78:80;;-1:-1:-1;;;;;1530:10197:73;;;;14646:78:80;;1530:10197:73;;;;;;;;14646:78:80;;;;;;;;;;14678:45;14646:89;;;;:::i;:::-;14748:17;;:::i;:::-;;;;14783:12;;;;:::i;:::-;14802:7;1862:10:50;;;;;14802:7:80;1862:10:50;;;;;;;14810:9:80;1862:10:50;;-1:-1:-1;14780:66:80;;1530:10197:73;11594:71:80;14745:613;;11575:3;;;;:::i;:::-;1530:10197:73;;15460:143:80;;1530:10197:73;15460:143:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;11594:71:80;9428:6;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1314:35:72;-1:-1:-1;;;;;1530:10197:73;;;7487:225;;14745:613:80;1530:10197:73;1699:90:72;;;-1:-1:-1;;;;;;;;;;;1699:90:72;;-1:-1:-1;;;;;;;;;;;1699:90:72;;;;;;1530:10197:73;;9554:25:80;;;;1530:10197:73;;;;;;;;;7487:225;1587:59:72;;;;;;;;;1530:10197:73;;;;;;7593:10;1530:10197;7625:17;;;:::i;:::-;1530:10197;;;;:::i;:::-;;;;;;7685:15;7593:108;;;;;;;1530:10197;;;;;;;;;;;;;7593:108;;1530:10197;7593:108;;1530:10197;;;;;;;;;;;;;;;;2241:89:53;1530:10197:73;;;;;;;;;;;;10520:22:80;1530:10197:73;;;7593:108;;;;;;;;7487:225;;;;;;;;;7593:108;;;;;;:::i;:::-;1530:10197;;7593:108;;;;1530:10197;;;14780:66:80;-1:-1:-1;;;14828:18:80;;1530:10197:73;15169:18:80;14828;1862:10:50;-1:-1:-1;;;1530:10197:73;;;;;;;;14745:613:80;14897:24;2241:89:53;1530:10197:73;2241:89:53;14897:24:80;:::i;:::-;1862:10:50;15124:7:80;1862:10:50;;;;;15124:7:80;1862:10:50;;;;;;;15132:9:80;1862:10:50;;15109:32:80;;:51;;;;14745:613;15106:81;;15132:9;1862:10:50;;;;;;15132:9:80;1862:10:50;;;;;;;15222:32:80;15257:14;15293:17;15222:32;;15221:51;15222:32;15132:9;15222:32;;:::i;:::-;15257:14;;:::i;:::-;15221:51;;:::i;:::-;15293:17;;:::i;:::-;1862:10:50;15289:31:80;;15286:61;;1530:10197:73;11594:71:80;14745:613;;;1862:10:50;-1:-1:-1;;;1530:10197:73;;;;;;;;15106:81:80;-1:-1:-1;;;15169:18:80;;1530:10197:73;15169:18:80;;15109:51;15145:15;;;;15109:51;;1862:10:50;-1:-1:-1;;;1530:10197:73;;;;;;;;14646:78:80;;1530:10197:73;14646:78:80;;1530:10197:73;14646:78:80;;;;;;1530:10197:73;14646:78:80;;;:::i;:::-;;;1530:10197:73;;;;14646:89:80;1530:10197:73;;14646:78:80;;;;;-1:-1:-1;14646:78:80;;;1530:10197:73;;;;;;;;;14678:45:80;1530:10197:73;14710:13:80;;:::i;:::-;14678:45;;11240:33;;;;;11165:53;-1:-1:-1;;;11199:19:80;;1530:10197:73;11199:19:80;;11105:46;11136:15;;;;:::i;:::-;11105:46;;;;11002:70;795:26:81;;;:::i;:::-;11002:70:80;;;10894:601;11310:70;;-1:-1:-1;11310:70:80;;;;1880:9:72;1867:12;1873:6;;:::i;:::-;1867:12;;:::i;:::-;1862:10:50;11310:70:80;;11470:14;11304:76;11402:40;;;;;;;;;11470:14;;:::i;:::-;10894:601;;;11402:40;11427:15;;;:::i;:::-;11402:40;;11310:70;795:26:81;;;:::i;:::-;11310:70:80;;;10771:69;;;;;10556:143;-1:-1:-1;;;10668:20:80;;1530:10197:73;10668:20:80;;10560:85;2241:89:53;;;;;10596:49:80;;10560:85;;;:32;10575:17;;;;:::i;:::-;10560:32;;;1195:63:86;-1:-1:-1;;;1242:16:86;;1530:10197:73;1242:16:86;;1530:10197:73;;;;;;;;;;;;;;;;730:43:98;1530:10197:73;;;;;;;;;;;;;;;;1653:42;6724:4:97;6716:21;;;:52;;;1530:10197:73;6716:69:97;;;;1530:10197:73;6716:147:97;;;;1530:10197:73;6699:206:97;;-1:-1:-1;;;;;6935:15:97;1530:10197:73;-1:-1:-1;;;;;2137:42:97;-1:-1:-1;;;;;;;;;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;2320:8;6935:15;1530:10197:73;6935:15:97;;1530:10197:73;;;-1:-1:-1;;;2137:42:97;-1:-1:-1;;;;;;;;;;;2137:42:97;;1530:10197:73;2137:42:97;;;;-1:-1:-1;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;7034:45;2137:42;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;2137:42:97;;;1530:10197:73;7077:1:97;1530:10197:73;2137:42:97;;1530:10197:73;7034:45:97;1530:10197:73;;6699:206:97;-1:-1:-1;;;6881:24:97;;1530:10197:73;;6881:24:97;6716:147;6805:15;1530:10197:73;6805:15:97;:58;6716:147;;:69;1530:10197:73;-1:-1:-1;;;;;;;;;;;;;;;;1530:10197:73;;;;6772:13:97;;6716:69;;:52;6741:10;2137:42;6741:10;:27;;6716:52;;1530:10197:73;;;;;;;;;;;;;;;;1998:7;1530:10197;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;;1195:63:86;1530:10197:73;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;2379:5:97;1530:10197:73;;;;;;;;;;;;;;;;;;;479:44:87;1530:10197:73;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;1195:63;;1530:10197:73;5200:676:97;;;;:::i;:::-;1530:10197:73;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;8282:10;;;:::i;:::-;8326:71;;;;;8348:10;8335:24;8348:10;;:::i;:::-;8335:24;:::i;:::-;8326:71;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;8326:71;;;1530:10197;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;2296:39:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;2856:40:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;12410:10:80;:36;12406:66;;1530:10197:73;12482:14:80;-1:-1:-1;;;;;1530:10197:73;12482:34:80;;;;;1530:10197:73;;;12482:34:80;1530:10197:73;;;;;;;;;12482:34:80;;1530:10197:73;;;12482:34:80;;1530:10197:73;12482:34:80;;;;;;;;1530:10197:73;;12482:34:80;;;;;:::i;:::-;1530:10197:73;;12482:34:80;1530:10197:73;12482:34:80;1530:10197:73;;12406:66:80;-1:-1:-1;;;12455:17:80;;1530:10197:73;;12455:17:80;1530:10197:73;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;4921:32:97;;1530:10197:73;;;;4921:16:97;-1:-1:-1;;;;;1530:10197:73;4921:32:97;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;1530:10197:73;4907:10:97;:46;4903:76;;1530:10197:73;;;;;5030:71:97;5047:1;1530:10197:73;5030:71:97;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;5030:71:97;;;;;;:::i;:::-;1530:10197:73;;;;;;;;;5011:91:97;;1530:10197:73;;5011:91:97;;1530:10197:73;;;;;;:::i;:::-;5011:91:97;1530:10197:73;;5011:11:97;-1:-1:-1;;;;;1530:10197:73;5011:91:97;;;;;;;;;;;1530:10197:73;;;;;;5124:29:97;;1530:10197:73;;;;;5124:29:97;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;5112:41:97;;;:::i;5011:91::-;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;4903:76;-1:-1:-1;;;4962:17:97;;1530:10197:73;4962:17:97;;4921:32;;;1530:10197:73;4921:32:97;;1530:10197:73;4921:32:97;;;;;;1530:10197:73;4921:32:97;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;4921:32:97;;;;;;-1:-1:-1;4921:32:97;;1530:10197:73;;;;;;;;;;;;;;;;386:10:75;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;-1:-1:-1;1530:10197:73;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;;1195:63;;7602:38:80;;;;;1530:10197:73;;-1:-1:-1;;;7602:38:80;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;:::i;:::-;;;7602:38:80;;1530:10197:73;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;7602:38:80;;;;;;;;1530:10197:73;;;-1:-1:-1;;;1530:10197:73;;;;;7602:38:80;1530:10197:73;7602:38:80;;;:::i;:::-;1530:10197:73;7602:38:80;;;1530:10197:73;;;;;;;;;1195:63:86;1242:16;;;1530:10197:73;1242:16:86;1530:10197:73;;1242:16:86;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1530:10197:73;;;;7811:19;;;1530:10197;7811:19;1530:10197;;7811:19;1530:10197;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;;1195:63:86;1530:10197:73;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;1137:49:83;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;1234:7:83;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;;;1199:10:86;:34;;;1195:63;;1530:10197:73;7947:3:80;;;:::i;:::-;7180:17:73;;:::i;:::-;1530:10197;7156:70;7198:22;1530:10197;;;;;;;;;;;;;;7156:70;;1530:10197;7156:70;;;:::i;:::-;;1530:10197;7156:10;-1:-1:-1;;;;;1530:10197:73;7156:70;;;;;;1530:10197;;;7156:70;;;1530:10197;831:64:72;-1:-1:-1;;;;;;;;;;;831:64:72;-1:-1:-1;;;;;;;;;;;831:64:72;8040:17:80;;:::i;:::-;:49;;;1530:10197:73;8060:13:80;;:::i;:::-;1530:10197:73;;-1:-1:-1;;;14269:38:80;;-1:-1:-1;;;;;1530:10197:73;;;;14269:38:80;;1530:10197:73;;;;;;;;14269:38:80;;;;;;;1530:10197:73;14269:38:80;;;8040:49;14349:29;1530:10197:73;14349:29:80;8477:14;14349:29;14109:49;14349:29;1530:10197:73;8125:24:80;;;:::i;:::-;8121:293;;8040:49;8477:14;;:::i;:::-;453:132:54;;1530:10197:73;;8431:26:80;;;;1530:10197:73;;;;;;819:8:42;1530:10197:73;;;;;8121:293:80;8185:24;;1530:10197:73;8185:24:80;;:::i;:::-;8229:86;:26;1530:10197:73;;;1867:12:72;1880:9;673:30:81;1873:6:72;;:::i;:::-;1867:12;;:::i;:::-;1862:10:50;8229:86:80;8121:293;;;8229:86;795:26:81;;;:::i;:::-;8229:86:80;;14269:38;;;1530:10197:73;14269:38:80;;1530:10197:73;14269:38:80;;;;;;1530:10197:73;14269:38:80;;;:::i;:::-;;;1530:10197:73;;;;;;14269:38:80;;;;;-1:-1:-1;14269:38:80;;8040:49;1530:10197:73;8076:13:80;;:::i;:::-;8040:49;;7156:70:73;;;;;;1530:10197;7156:70;1530:10197;7156:70;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1530:10197;;;;;;-1:-1:-1;;1530:10197:73;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;4793:51:87;:15;;:31;;:51;:31;;;1530:10197:73;4793:51:87;;-1:-1:-1;;;;;4874:11:87;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;4793:51:87;1530:10197:73;;;;;;;;4839:1:87;4831:13;4793:51;;;4831:13;4843:1;4831:13;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2320:8:97;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2033:3:80;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;743:29:82;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;18232:29:80;;;1530:10197:73;;;18232:9:80;-1:-1:-1;;;;;1530:10197:73;18232:29:80;;;;;;1530:10197:73;18232:29:80;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;12276:25:80;;1530:10197:73;;;;12276:14:80;-1:-1:-1;;;;;1530:10197:73;12276:25:80;;;;;;1530:10197:73;12276:25:80;;;1530:10197:73;;;;;;;;12276:25:80;;1530:10197:73;12276:25:80;;1530:10197:73;12276:25:80;;;;;;1530:10197:73;12276:25:80;;;:::i;:::-;;;-1:-1:-1;12276:25:80;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;18351:31:80;;;1530:10197:73;;;18351:9:80;-1:-1:-1;;;;;1530:10197:73;18351:31:80;;;;;;;;1530:10197:73;18351:31:80;;;1530:10197:73;;;;;;;;;;18351:31:80;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;570:7:87;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;16665:51:80;;-1:-1:-1;;;;;16695:16:80;1530:10197:73;;;16665:51:80;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;;;16665:51:80;;1530:10197:73;;16665:11:80;1530:10197:73;16665:51:80;;;;;;1530:10197:73;16665:51:80;;;1530:10197:73;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;17064:32:80;;;1530:10197:73;;;17085:10:80;1530:10197:73;;;;17064:32:80;;;1530:10197:73;;;17064:32:80;1530:10197:73;;17064:32:80;:::i;1530:10197:73:-;17045:52:80;1530:10197:73;;17045:11:80;-1:-1:-1;;;;;1530:10197:73;17045:52:80;;;;;;;;1530:10197:73;17045:52:80;;:::i;:::-;1530:10197:73;17045:52:80;;;;;1530:10197:73;17045:52:80;;;;;;:::i;:::-;;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;1860:58:97;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;1600:35:96;:16;;:::i;:::-;1619;;:::i;:::-;1600:35;;:::i;:::-;1649:15;;;:26;:68;;;;;1530:10197:73;1649:108:96;;;;;1530:10197:73;1649:124:96;;;;1530:10197:73;1649:155:96;;;;1530:10197:73;1645:182:96;;1530:10197:73;;-1:-1:-1;;;1945:19:96;;1530:10197:73;1852:13:96;-1:-1:-1;;;;;1530:10197:73;;;;;;1945:19:96;;;;;;;1530:10197:73;1945:19:96;;;1530:10197:73;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1998:26:96;;1895:17;-1:-1:-1;;;;;1530:10197:73;;1998:26:96;;1530:10197:73;;;;;;;;;;;;1998:26:96;;;;;;;1530:10197:73;1998:26:96;;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;2053:32:96;;1530:10197:73;2074:10:96;1530:10197:73;;;;;;;;;;;;2053:32:96;1530:10197:73;;;;2053:32:96;;17294::80;;2053::96;;;;;;:::i;:::-;1530:10197:73;;;;;;;;;2034:52:96;;1530:10197:73;;2034:52:96;;1530:10197:73;;;;;;:::i;:::-;2034:52:96;1530:10197:73;;2034:11:96;-1:-1:-1;;;;;1530:10197:73;2034:52:96;;;;;;;2141:45;2034:52;2141:26;2034:52;;;1530:10197:73;2034:52:96;;;:::i;:::-;2151:16;;:::i;:::-;2141:26;;:::i;:::-;2170:16;;:::i;2141:45::-;1530:10197:73;;;;;;2228:19:96;;1530:10197:73;2228:19:96;1530:10197:73;2228:19:96;;;;;;;;;1530:10197:73;2228:19:96;;;1530:10197:73;2213:34:96;;;1530:10197:73;2213:34:96;;:::i;:::-;1530:10197:73;;;;;;;;;;;2250:26:96;;1530:10197:73;2250:26:96;;1530:10197:73;2250:26:96;;;;;;;1530:10197:73;2250:26:96;;;1530:10197:73;2213:63:96;;;:79;:63;;:::i;:::-;:79;:::i;:::-;2306:13;;;:36;;;;;1530:10197:73;2306:124:96;;;;1530:10197:73;2302:156:96;;;1530:10197:73;;2473:47:96;1530:10197:73;;;;;;;;;;;2473:47:96;1530:10197:73;;;;;;;;;;2302:156:96;2439:19;;;1530:10197:73;2439:19:96;1530:10197:73;;2439:19:96;2306:124;2358:50;;;;;;:::i;:::-;:72;2306:124;;;:36;2323:19;;;-1:-1:-1;2306:36:96;;2250:26;;;1530:10197:73;2250:26:96;;1530:10197:73;2250:26:96;;;;;;1530:10197:73;2250:26:96;;;:::i;:::-;;;1530:10197:73;;;;;2213:79:96;2250:26;;;;;-1:-1:-1;2250:26:96;;2228:19;;;1530:10197:73;2228:19:96;;1530:10197:73;2228:19:96;;;;;;1530:10197:73;2228:19:96;;;:::i;:::-;;;1530:10197:73;;;;;;2228:19:96;;;;;-1:-1:-1;2228:19:96;;2034:52;;;;;1530:10197:73;2034:52:96;;;;;;:::i;:::-;;;1998:26;;;;1530:10197:73;1998:26:96;;1530:10197:73;1998:26:96;;;;;;1530:10197:73;1998:26:96;;;:::i;:::-;;;1530:10197:73;;;;;;;1998:26:96;;;;;-1:-1:-1;1998:26:96;;1945:19;;;;1530:10197:73;1945:19:96;;1530:10197:73;1945:19:96;;;;;;1530:10197:73;1945:19:96;;;:::i;:::-;;;1530:10197:73;;;;;1945:19:96;;;;;;;-1:-1:-1;1945:19:96;;1645:182;1813:14;;;1530:10197:73;1813:14:96;1530:10197:73;;1813:14:96;1649:155;1530:10197:73;;;1777:27:96;;1649:155;;:124;1761:12;;;1649:124;;:108;1733:24;;;1649:108;;:68;:15;;1708:9;1649:15;1530:10197:73;1649:15:96;;;1530:10197:73;;;1679:38:96;1649:68;;;1530:10197:73;;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;12037:23:80;;;1530:10197:73;;;12037:11:80;-1:-1:-1;;;;;1530:10197:73;12037:23:80;;;;;;1530:10197:73;12037:23:80;;;1530:10197:73;;;-1:-1:-1;;;;;1530:10197:73;;;;;12037:23:80;;1530:10197:73;12037:23:80;;;;;;;;;;;;;;;;:::i;:::-;;;1530:10197:73;;;;;12037:23:80;1530:10197:73;;:::i;:::-;12037:23:80;;;;;-1:-1:-1;12037:23:80;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2131:7:80;1530:10197:73;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;2500:46;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;4301:48:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;6878:49;1530:10197;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;6878:49:73;;1530:10197;;;;;;;;;;;;6878:49;;;:::i;:::-;;1530:10197;6878:10;-1:-1:-1;;;;;1530:10197:73;6878:49;;;;;;1530:10197;;;6878:49;;;1530:10197;6947:27;1530:10197;;;6954:17;;1530:10197;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;6878:49;;;;;;1530:10197;6878:49;1530:10197;6878:49;;;;;;;:::i;:::-;;;;1530:10197;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2046:8;1530:10197;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;6376:23;1530:10197;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;6560:21;;:::i;1530:10197::-;;;;;;-1:-1:-1;;1530:10197:73;;;;18050:4:80;18028:10;:27;18024:50;;1530:10197:73;;-1:-1:-1;;;18093:49:80;;;;1530:10197:73;18093:49:80;;;;;;1530:10197:73;18093:49:80;:::i;:::-;;:::i;1530:10197:73:-;;;;;;-1:-1:-1;;1530:10197:73;;;;;;1812:42:97;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;17294:32:80;;;1530:10197:73;17315:10:80;1530:10197:73;;;;;;;;;;;17294:32:80;1530:10197:73;;;;17294:32:80;1530:10197:73;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;7292:1:97;1530:10197:73;7270:18:97;;:::i;:::-;1530:10197:73;7270:23:97;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;1171:4:96;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;:::i;:::-;;;:::o;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;:::o;:::-;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;:::i;:::-;;;17294:32:80;;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;;;-1:-1:-1;1530:10197:73;;;;;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;8076:13:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;5980:149:97:-;1530:10197:73;;-1:-1:-1;;;6065:26:97;;;1530:10197:73;6065:26:97;1530:10197:73;6065:9:97;-1:-1:-1;;;;;1530:10197:73;6065:26:97;;;;;;;-1:-1:-1;6065:26:97;;;5980:149;-1:-1:-1;6065:31:97;;-1:-1:-1;5980:149:97;:::o;6065:57::-;2379:5;5980:149;:::o;6065:26::-;;;;;;;;;;;;;1530:10197:73;6065:26:97;;;:::i;:::-;;;1530:10197:73;;;;;6065:26:97;;;;;;-1:-1:-1;6065:26:97;;7307:207;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;7423:13:97;;;:46;;;;7307:207;7423:76;;;;7307:207;-1:-1:-1;7423:84:97;;;7502:1;;7307:207::o;7423:84::-;7506:1;;7307:207::o;7423:76::-;7473:15;;;:26;7423:76;;;:46;-1:-1:-1;;;;;1530:10197:73;7440:15:97;:29;;;-1:-1:-1;7423:46:97;;;1862:10:50;;;;;;;:::o;:::-;1530:10197:73;;;1862:10:50;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;1862:10:50;;;;;;;:::o;8468:1956:73:-;1653:42;8557:4;8549:21;;;:43;;;8468:1956;8545:72;;-1:-1:-1;8674:10:73;;:::i;:::-;8673:11;8669:69;;8800:24;8813:10;;:::i;8800:24::-;8747:77;;;1653:42;;-1:-1:-1;;;;;;;;;;;1653:42:73;8867:11;1653:42;-1:-1:-1;;;;;;;;;;;1653:42:73;;-1:-1:-1;;;;;1653:42:73;;;;;;;-1:-1:-1;;;;;;;;;;1653:42:73;;8919:15;1653:42;;;;;;;-1:-1:-1;;;;;;;;;;;1653:42:73;1530:10197;;;1815:42;1530:10197;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;-1:-1:-1;1815:42:73;;9002:83;;;1815:42;;;;1530:10197;9002:83;;1815:42;9059:8;1815:42;;9002:83;;;1815:42;8867:11;1815:42;;1653;9002:83;;1815:42;1653;1815;;8371:25:49;1815:42:73;357:173:56;;8371:25:49;:::i;:::-;690:1;1530:10197:73;;;;;;;;;;;;;8550:22:49;;;;;1530:10197:73;9002:83;8550:22:49;;;1916:42:73;8550:22:49;;;;;;-1:-1:-1;8550:22:49;;;8468:1956:73;-1:-1:-1;;;;;1530:10197:73;;;9161:11;;;:29;;;;8468:1956;9157:42;;1841:25:49;1815:42:73;357:173:56;;1841:25:49;:::i;:::-;1530:10197:73;;;;;;1892:27:49;;8550:22;1892:27;;1530:10197:73;9002:83;1892:27:49;8550:22;1892:27;1916:42:73;1892:27:49;;;;;;;-1:-1:-1;1892:27:49;;;8468:1956:73;-1:-1:-1;1862:10:50;;-1:-1:-1;;;;;2147:423:49;;;;;9280:27:73;9271:36;;;;9267:49;;9434:60;;9497:3;9434:60;;:::i;:::-;1862:10:50;9514:17:73;;;9510:40;;8468:1956;9564:43;-1:-1:-1;;;;;9564:43:73;;9560:92;;8468:1956;9666:11;;9662:24;;9736:3;1862:10:50;;;;;;9736:3:73;1862:10:50;;;;;;;9742:4:73;1862:10:50;;-1:-1:-1;;;;;1530:10197:73;;1862:10:50;9761:32:73;;;9757:73;;8468:1956;9840:29;1916:42;9840:29;;;;1530:10197;;;;;9840:29;;1653:42;8550:22:49;9840:29:73;;1530:10197;-1:-1:-1;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;;;1530:10197:73;-1:-1:-1;9840:29:73;9497:3;9840:29;;1916:42;9840:29;;;;;;;;8468:1956;9936:15;;;;:::i;:::-;1530:10197;;;9002:83;1530:10197;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;8867:11;1862:10:50;;9002:83:73;9919:40;;;1862:10:50;;;-1:-1:-1;;;;;1530:10197:73;;;9919:40;;;1815:42;;;1530:10197;;9002:83;;1530:10197;;;9002:83;1530:10197;;:::i;:::-;1862:10:50;;;1530:10197:73;;-1:-1:-1;;;9901:70:73;;1862:10:50;;-1:-1:-1;;;;;1530:10197:73;;;8550:22:49;9901:70:73;;1530:10197;1862:10:50;;1530:10197:73;;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;1530:10197:73;;1862:10:50;;;1530:10197:73;1862:10:50;;8834:14:73;1530:10197;9497:3;1862:10:50;;1530:10197:73;1862:10:50;;1530:10197:73;;1862:10:50;;;1530:10197:73;1862:10:50;;1530:10197:73;;1862:10:50;;;1530:10197:73;1862:10:50;;;;;1530:10197:73;1862:10:50;;1530:10197:73;1862:10:50;;;1530:10197:73;1862:10:50;;;;;1530:10197:73;;;;;1862:10:50;;;;;;;:::i;:::-;9901:70:73;;;;1916:42;9901:70;;;;;;;;;;;8468:1956;2052:83:53;-1:-1:-1;;;;;10005:25:73;2052:83:53;1653:42:73;2052:83:53;1530:10197:73;;10005:25;:::i;:::-;1530:10197;;10106:14;;;;;10102:57;;8468:1956;10169:23;1862:10:50;;-1:-1:-1;;;;;;;;;;;1862:10:50;10169:23:73;:::i;:::-;-1:-1:-1;;;;;;;;;;;1653:42:73;10206:11;10202:127;;8468:1956;-1:-1:-1;1815:42:73;357:173:56;;1530:10197:73;;-1:-1:-1;;;10390:26:73;;1653:42;8550:22:49;10390:26:73;;1530:10197;8550:22:49;1530:10197:73;;;;;357:173:56;;1530:10197:73;;1862:10:50;1530:10197:73;1916:42;10390:26;;;;;;;;;;8468:1956;-1:-1:-1;;1530:10197:73;;;;;;1862:10:50;;;1530:10197:73;;;;1862:10:50;;;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;10343:74;;1530:10197;1862:10:50;;;10343:74:73;;;;8468:1956::o;10390:26::-;;;;;;;;;;;;;;;;:::i;:::-;;;1530:10197;;;;10343:74;;1530:10197;;10390:26;;;;;;;;10202:127;1862:10:50;-1:-1:-1;;;;;1530:10197:73;1916:42;10233:41;;;;1530:10197;;;;;;10233:41;;8550:22:49;10233:41:73;;1530:10197;1653:42;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;;;1530:10197:73;10233:41;;9497:3;10233:41;;1916:42;10233:41;;;;;;;;;;;10202:127;10288:30;;1815:42;10288:30;;;;1530:10197;;-1:-1:-1;;;10288:30:73;;8550:22:49;10288:30:73;;1530:10197;;;10288:30;1530:10197;8550:22:49;1530:10197:73;10288:30;1815:42;10288:30;;;;;;;;;;;10202:127;;;;10288:30;;;;;:::i;:::-;1530:10197;;10288:30;;;;;1530:10197;;;;;;;;;10233:41;;;;;:::i;:::-;1530:10197;;10233:41;;;;10102:57;10144:14;;;:::i;:::-;1916:42;10122:37;;;;1530:10197;;;;;;10122:37;;1653:42;8550:22:49;10122:37:73;;1530:10197;1862:10:50;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;;1530:10197:73;10122:37;;9497:3;10122:37;;1916:42;10122:37;;;;;;;;;;;10102:57;;;;;10122:37;;;;;:::i;:::-;1530:10197;;10122:37;;;;;1530:10197;;;;;;;;;9901:70;;;;;;;;;;;;;;;;;:::i;:::-;;;1862:10:50;;;;;9901:70:73;;;;;;;;;1530:10197;-1:-1:-1;;;1530:10197:73;;;8550:22:49;1530:10197:73;8550:22:49;1530:10197:73;;9840:29;;;;;-1:-1:-1;9840:29:73;;:::i;:::-;-1:-1:-1;9840:29:73;;;;9757:73;9795:35;-1:-1:-1;9757:73:73;;;9662:24;9679:7;;;;;;;;;;:::o;9560:92::-;-1:-1:-1;;;;;9589:16:73;-1:-1:-1;9560:92:73;;9510:40;9533:17;-1:-1:-1;9510:40:73;;;9267:49;9309:7;;;;;;;;;;;;:::o;1892:27:49:-;;;9002:83:73;1892:27:49;;9002:83:73;1892:27:49;;;;;;1530:10197:73;1892:27:49;;;:::i;:::-;;;1530:10197:73;;;;;1892:27:49;;;;;;-1:-1:-1;1892:27:49;;9161:29:73;9176:14;;;9161:29;;8550:22:49;;9002:83:73;8550:22:49;;9002:83:73;8550:22:49;;;;;;1530:10197:73;8550:22:49;;;:::i;:::-;;;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;8550:22:49;;;;;-1:-1:-1;8550:22:49;;8669:69:73;8557:4;;17834:10:80;:27;17830:50;;1530:10197:73;;-1:-1:-1;;;17899:54:80;;;;-1:-1:-1;;;;;1530:10197:73;;;17899:54:80;;;;1530:10197:73;;;;17899:54:80;;;;;;1530:10197:73;17899:54:80;:::i;:::-;8729:7:73:o;8545:72::-;8601:16;;;;;;;;8549:43;8574:10;1653:42;8574:10;:18;;8549:43;;11831:126:80;1530:10197:73;;-1:-1:-1;;;11904:46:80;;-1:-1:-1;;;;;11934:11:80;1530:10197:73;;11904:46:80;;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;;;11904:46:80;;1530:10197:73;;11904:11:80;1530:10197:73;11904:46:80;;;;;;;11948:1;11904:46;;;11897:53;11831:126;:::o;11904:46::-;;;1530:10197:73;11904:46:80;;1530:10197:73;11904:46:80;;;;;;1530:10197:73;11904:46:80;;;:::i;:::-;;;1530:10197:73;;;;;11831:126:80;:::o;11904:46::-;;;-1:-1:-1;11904:46:80;;1530:10197:73;;;;;;;;;;:::o;:::-;;;;;;1862:10:50;;;;:::i;:::-;1530:10197:73;;;;;;;:::i;:::-;1862:10:50;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;:::o;:::-;;;:::o;5200:676:97:-;5323:25;-1:-1:-1;5323:25:97;;;1530:10197:73;;;;;;5370:1:97;1530:10197:73;;;;:::i;:::-;;5362:9:97;5358:48;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;5663:84:97;1530:10197:73;5663:84:97;;;;;;;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;5663:84:97;;;;;;:::i;:::-;5607:150;;5615:20;-1:-1:-1;;;;;1530:10197:73;5607:150:97;;;;:::i;:::-;5771:3;;5767:80;;5200:676;:::o;5767:80::-;1530:10197:73;5778:67:97;;;;;5358:48;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;1195:63;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17562:9:80;;;17573:4;;;:33;;;;1530:10197:73;;-1:-1:-1;;;17573:33:80;;:4;1530:10197:73;17573:33:80;1530:10197:73;17573:4:80;;:33;;;;;;;;;;;17558:157;;;;1530:10197:73;;;;;;;:::i;:::-;1862:10:50;;5373:33:97;:::o;17573::80:-;;;;;:::i;:::-;1530:10197:73;;17573:33:80;;;;17558:157;17633:1;17625:9;17633:1;;17636:4;:38;;;;1530:10197:73;;;;;;17636:38:80;;;;;1530:10197:73;-1:-1:-1;17636:4:80;:38;:4;;;:38;;;;;;;;17621:94;;17558:157;;17636:38;;;;-1:-1:-1;17636:38:80;;:::i;:::-;-1:-1:-1;17636:38:80;;;17621:94;17696:19;;;-1:-1:-1;17696:19:80;;-1:-1:-1;17696:19:80;4251:303:87;-1:-1:-1;;;;;;;;;;;4379:48:87;-1:-1:-1;;;;;623:33:87;4474:2;623:33;1530:10197:73;4440:15:87;:37;;4436:55;;4522:3;623:33;1530:10197:73;;4508:23:87;1530:10197:73;;4534:5:87;;4251:303::o;4508:39::-;4542:5;;4251:303::o;4436:55::-;4479:12;4486:5;4479:12;:::o;11706:119:80:-;1530:10197:73;;-1:-1:-1;;;11779:39:80;;11809:4;11779:39;;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;11779:39:80;1530:10197:73;11779:11:80;-1:-1:-1;;;;;1530:10197:73;11779:39:80;;;;;;;11816:1;11779:39;;;11772:46;11706:119;:::o;1762:206:98:-;1856:18;1838:15;:36;1834:69;;1530:10197:73;;-1:-1:-1;;;1920:24:98;;;1530:10197:73;1920:24:98;1530:10197:73;1920:10:98;-1:-1:-1;;;;;1530:10197:73;1920:24:98;;;;;;;1530:10197:73;1920:24:98;;;1762:206;-1:-1:-1;1920:29:98;;1530:10197:73;;1762:206:98:o;1920:41::-;1956:5;;1762:206::o;1920:24::-;;;;;;;;;;;;;1530:10197:73;1920:24:98;;;:::i;:::-;;;1530:10197:73;;;;;1920:24:98;;;;;;-1:-1:-1;1920:24:98;;1834:69;1530:10197:73;;-1:-1:-1;;;6316:17:97;;;1530:10197:73;6316:17:97;1530:10197:73;6316:3:97;-1:-1:-1;;;;;1530:10197:73;6316:17:97;;;;;;1530:10197:73;6316:17:97;;;1834:69:98;1530:10197:73;;6316:22:97;1530:10197:73;;-1:-1:-1;1530:10197:73;;;;1876:27:98:o;6316:17:97:-;;;;;;;;;;;;;;;;:::i;:::-;;;1530:10197:73;;;;;;;;;;;;;6316:17:97;;;;;;-1:-1:-1;6316:17:97;;1530:10197:73;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;:::o;:::-;;623:33:87;;;1530:10197:73;;;;;:::o;:::-;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;-1:-1:-1;;;;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;:::o;4899:906:87:-;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;5517:11:87;1530:10197:73;4037:249:20;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;;;1862:10:50;;1530:10197:73;5069:9:87;;1530:10197:73;;;;1862:10:50;1530:10197:73;5105:14:87;;1530:10197:73;;;;1862:10:50;1530:10197:73;5144:12:87;1530:10197:73;5144:12:87;;;:::i;:::-;1530:10197:73;;;;;;5191:8:87;1530:10197:73;5191:8:87;;;;:::i;:::-;1530:10197:73;;;:::i;:::-;;;;;;5181:19:87;1530:10197:73;;;1862:10:50;1530:10197:73;5221:8:87;;1530:10197:73;;;;1862:10:50;5253:11:87;;1530:10197:73;5253:11:87;;;:::i;:::-;1530:10197:73;;;;;5286:9:87;;1530:10197:73;5286:9:87;;;:::i;:::-;1530:10197:73;;;;;;5319:11:87;;1530:10197:73;;;;1862:10:50;1530:10197:73;5355:12:87;;1530:10197:73;;;;1862:10:50;623:33:87;5391:11;1530:10197:73;5391:11:87;;;:::i;:::-;623:33;1530:10197:73;;;;623:33:87;5423:8;1530:10197:73;5423:8:87;;;:::i;:::-;623:33;1530:10197:73;;;;623:33:87;5452:8;1530:10197:73;5452:8:87;;;:::i;:::-;623:33;1530:10197:73;;;;5483:10:87;;1530:10197:73;5483:10:87;;;:::i;:::-;1530:10197:73;;;;;5517:11:87;;:::i;:::-;1530:10197:73;;;;;;;;5565:127:87;;1530:10197:73;705:109:87;1530:10197:73;;5606:30:87;1530:10197:73;705:109:87;;1530:10197:73;5638:14:87;1530:10197:73;705:109:87;;1530:10197:73;5654:13:87;1530:10197:73;705:109:87;;1530:10197:73;5677:4:87;1530:10197:73;705:109:87;;1530:10197:73;;5565:127:87;;;1530:10197:73;5565:127:87;;:::i;:::-;1530:10197:73;5555:138:87;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;5761:35:87;868:292;1530:10197:73;5761:35:87;;1530:10197:73;868:292:87;;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;623:33:87;1530:10197:73;;;868:292:87;623:33;1530:10197:73;868:292:87;;;623:33;1530:10197:73;;;868:292:87;623:33;1530:10197:73;868:292:87;;;623:33;1530:10197:73;;;868:292:87;623:33;868:292;;;;1530:10197:73;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;868:292:87;1530:10197:73;868:292:87;;;1530:10197:73;868:292:87;5761:35;;;;;;:::i;:::-;1530:10197:73;;;5761:35:87;;5751:46;1530:10197:73;4037:249:20;;-1:-1:-1;;;4037:249:20;;;;;;;;;;;4899:906:87;:::o;2292:310:83:-;1530:10197:73;2444:9:83;:59;2440:72;;1530:10197:73;;-1:-1:-1;;;2525:59:83;;;1530:10197:73;2525:59:83;1530:10197:73;-1:-1:-1;2525:16:83;-1:-1:-1;;;;;1530:10197:73;1234:7:83;2525:59;;;2292:310;:::o;2525:59::-;;;;;;;;;;;;;:::i;:::-;2292:310;:::o;18395:331:80:-;18573:37;;;;;;;;;18581:9;-1:-1:-1;;;;;1530:10197:73;18573:37:80;;;;:::i;:::-;18624:3;;18620:100;;18395:331;:::o;1044:78:72:-;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;1044:78;1109:8;1100:17;1530:10197:73;;;;;;;;;1044:78:72;:::o;1007:30::-;-1:-1:-1;515:134:72;1007:30;;741:4141:41;;2390:7:96;1530:10197:73;;;;;2390:7:96;1347:147:41;;;;;;;;;;;;;1619:19;;;;1530:10197:73;;;1720:10:41;1716:177;;2390:7:96;2224:95:41;;;1530:10197:73;;;;2716:31:41;2811:94;;;3776:1;1530:10197:73;3757:1:41;1530:10197:73;3756:21:41;1530:10197:73;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;3254:96:41;;;;1530:10197:73;3254:96:41;;;2391:145;;;;;;1530:10197:73;2391:145:41;;2977:82;3363:21;1530:10197:73;741:4141:41;:::o;1716:177::-;1750:98;;;;1865:13;:::o;741:4141::-;;1530:10197:73;;;;;-1:-1:-1;;;;;741:4141:41;1347:147;;;;;;;;;;;;1619:19;;;;1530:10197:73;;;1720:10:41;1716:177;;9470:7:73;;-1:-1:-1;;;9470:7:73;2224:95:41;1530:10197:73;;;;2716:31:41;2811:94;;;3776:1;1530:10197:73;3757:1:41;1530:10197:73;3756:21:41;1530:10197:73;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;3254:96:41;;;;1530:10197:73;3254:96:41;;;2391:145;;;;;;1530:10197:73;2391:145:41;;2977:82;3363:21;1530:10197:73;741:4141:41;:::o;:::-;;1530:10197:73;;;;-1:-1:-1;;1530:10197:73;741:4141:41;1347:147;;;;;;;;;;;;1619:19;;;;1530:10197:73;;;1720:10:41;1716:177;;2224:95;;;;1530:10197:73;;;;2716:31:41;2811:94;;;3776:1;1530:10197:73;3757:1:41;1530:10197:73;3756:21:41;1530:10197:73;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;3254:96:41;;;;1530:10197:73;3254:96:41;;;2391:145;;;;;;1530:10197:73;2391:145:41;;2977:82;3363:21;1530:10197:73;741:4141:41;:::o;1716:177::-;1750:98;;;;;1865:13;:::o;15996:478:80:-;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;16127:22:80;1530:10197:73;;;16127:58:80;;15996:478;16127:106;;;;15996:478;16127:170;;;;15996:478;16127:209;;;;15996:478;16127:265;;;;15996:478;16127:309;;;;;15996:478;16110:357;;15996:478::o;16110:357::-;16454:13;;;-1:-1:-1;16454:13:80;;-1:-1:-1;16454:13:80;16127:309;16396:7;;1530:10197:73;;;;;;;;;552:8:42;1530:10197:73;16396:40:80;;;16127:309;;:265;16356:15;1530:10197:73;16128:21:80;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;;;;;16128:21:80;1530:10197:73;16356:36:80;;16127:265;;;:209;16309:9;-1:-1:-1;16309:9:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;16331:4:80;;16301:35;;16127:209;;;:170;16269:13;-1:-1:-1;16269:13:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;16287:10:80;-1:-1:-1;;;;;1530:10197:73;16253:44:80;;;16127:170;;:106;16205:13;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;16189:44:80;;;16127:106;;;:58;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;16153:32:80;;-1:-1:-1;16127:58:80;;15615:155;1530:10197:73;;;;;;;;;;;;-1:-1:-1;15715:22:80;1530:10197:73;15715:26:80;15714:49;15615:155;:::o;15776:214::-;15878:22;1530:10197:73;-1:-1:-1;15878:26:80;;:105;;;;;;1530:10197:73;;;;;;;;;;;;;;;;15915:29:80;;;:::i;:::-;1530:10197:73;;;;;;;;15776:214:80;:::o;15878:105::-;;;15776:214;:::o;2098:168:47:-;-1:-1:-1;;;2172:13:47;;;2168:57;;1530:10197:73;;2098:168:47;:::o;2168:57::-;2187:25;;;814:96:38;;;;;11420:165:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;11502:13;;;:46;;;;11420:165;11502:76;;;;11495:83;11420:165;:::o;11502:76::-;11552:15;;;:26;11420:165;:::o;11502:46::-;-1:-1:-1;;;;;1530:10197:73;11519:15;:29;;;-1:-1:-1;11502:46:73;;;10430:188;1530:10197;;-1:-1:-1;;;10503:26:73;;1653:42;10503:26;;;1530:10197;-1:-1:-1;1530:10197:73;;;;;;10503:26;1530:10197;1916:42;10503:26;;;;;;;10527:1;10503:26;;;10430:188;-1:-1:-1;10546:6:73;;;:18;10527:1;10430:188;:::o;10546:18::-;-1:-1:-1;;1530:10197:73;;;;;;;10430:188;:::o;10503:26::-;;;1530:10197;10503:26;;1530:10197;10503:26;;;;;;1530:10197;10503:26;;;:::i;:::-;;;1530:10197;;;;;10503:26;;;;;;-1:-1:-1;10503:26:73;;10623:792;;-1:-1:-1;;;;;;;;;;;1862:10:50;;10809:11:73;1862:10:50;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;10880:18;;;;;:::i;:::-;10870:28;;10866:57;;10949:19;;;:28;:19;;:::i;:28::-;10991:11;;;;:45;;;10623:792;10987:299;;10623:792;11299:10;;11295:114;;10623:792;:::o;11295:114::-;11325:15;;;;;;:::i;:::-;11373;1998:7;11373:15;1530:10197;11373:15;;1530:10197;;;-1:-1:-1;;;;;1530:10197:73;11295:114;10623:792::o;10987:299::-;11071:137;11257:18;11071:137;;;:15;;:28;;:137;1530:10197;;;11071:137;11222:21;11071:137;;;11222:21;:::i;:::-;11257:18;;:::i;:::-;10987:299;;;;11071:137;11127:81;-1:-1:-1;;;;;11222:21:73;1530:10197;;;;-1:-1:-1;;;;;11183:24:73;11151:30;11071:15;;11151:30;:::i;:::-;11183:24;;;:::i;:::-;1530:10197;11127:81;;;:::i;:::-;11071:137;;11222:21;:::i;10991:45::-;1530:10197;-1:-1:-1;;;;;1530:10197:73;;;;11006:15;:30;10991:45;;1896:106:72;1981:5;1967:6;;:::i;:::-;1981:5;;;:::i;:::-;1530:10197:73;1988:9:72;1530:10197:73;1988:9:72;1530:10197:73;;;;1981:19:72;;;:::i;:::-;1896:106;:::o;14852:160:49:-;1530:10197:73;;14953:51:49;;;1530:10197:73;;;414:1:49;1530:10197:73;398:19:49;;1530:10197:73;;14953:51:49;;;;;;:::i;:::-;1530:10197:73;14943:62:49;;14852:160;:::o;1974:2333:98:-;;;2074:18;2056:15;:36;2052:117;;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;1974:2333:98;1224:8:72;2196:30:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2196:30:98;;:::i;:::-;1530:10197:73;;-1:-1:-1;;;2268:26:98;;-1:-1:-1;;2196:42:98;2268:9;-1:-1:-1;;;;;1530:10197:73;;2229:9:98;1862:10:50;;;;2268:26:98;1530:10197:73;2268:26:98;1530:10197:73;;2268:26:98;;;;;;;-1:-1:-1;2268:26:98;;;1974:2333;-1:-1:-1;2268:29:98;;-1:-1:-1;2268:74:98;;1530:10197:73;;-1:-1:-1;;;2369:24:98;;:10;-1:-1:-1;;;;;1530:10197:73;;2268:26:98;1530:10197:73;2268:26:98;1530:10197:73;;2369:24:98;;;;;;;-1:-1:-1;2369:24:98;;;2268:74;-1:-1:-1;2369:27:98;;-1:-1:-1;2369:72:98;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2369:72:98;2470:30;1224:8:72;2229:9:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2470:30:98;;:::i;:::-;1862:10:50;;-1:-1:-1;;;;;;;;;;;1314:35:72;;1530:10197:73;;;;1862:10:50;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;2772:50:98;2590:63;;2772:62;2590:63;2772:30;:39;2590:63;2772:18;-1:-1:-1;2590:63:98;;;2772:18;:::i;:62::-;2847:12;;;2844:68;;2590:63;1430:59:72;;;;;;;2980:14:98;2976:91;;2590:63;3081:12;3077:77;;2590:63;3222:6;3181:37;3199:19;2056:15;3181:37;:::i;:::-;1862:10:50;3242:14:98;;3238:220;;2590:63;3471:11;;3467:266;;2590:63;1530:10197:73;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;3747:42:98;1530:10197:73;;3747:42:98;;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;3747:42:98;;;;1530:10197:73;;;;;;2268:26:98;1530:10197:73;;;3804:37:98;1530:10197:73;;;;;;2268:26:98;1530:10197:73;;;3856:24:98;3894:13;3890:90;;2590:63;4018:4;1862:10:50;;4035:18:98;;;;4032:40;;2590:63;4139:20;;4175:49;4139:20;4196:17;4139:20;4279;4139;;;;4239:61;4139:20;;:::i;:::-;1530:10197:73;4110:15:98;-1:-1:-1;;;;;1530:10197:73;4139:20:98;:::i;4196:17::-;1530:10197:73;;;;;;1862:10:50;;;1530:10197:73;;;;1862:10:50;;1530:10197:73;;;;1862:10:50;;4175:49:98;4279:20;:::i;:::-;1530:10197:73;;4239:61:98;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;4239:61:98;;;;1974:2333::o;4032:40::-;4054:18;;-1:-1:-1;4054:18:98;;4032:40;;3890:90;3971:8;1530:10197:73;-1:-1:-1;;;;;3953:15:98;1530:10197:73;;;3931:11:98;1530:10197:73;3971:8:98;:::i;:::-;3890:90;;3467:266;1530:10197:73;;3555:6:98;1530:10197:73;;3520:11:98;-1:-1:-1;;;;;1530:10197:73;3555:6:98;:::i;:::-;3576:31;;;;;1530:10197:73;;3576:31:98;1530:10197:73;;;;;;;;;3576:31:98;;;2268:26;3576:31;;1530:10197:73;3576:31:98;;;;;;;;3467:266;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;3680:42:98;-1:-1:-1;;;;;;;;;;;1530:10197:73;;3680:42:98;1530:10197:73;;3626:35:98;1530:10197:73;;3626:35:98;;;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;3626:35:98;;;;1530:10197:73;;3680:42:98;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;3680:42:98;;;;3467:266;;;;;;;;;;3576:31;;;;;;:::i;:::-;1530:10197:73;;3576:31:98;;;1530:10197:73;;;;3576:31:98;1530:10197:73;;;;;;;;;3238:220:98;3328:9;1530:10197:73;;3294:11:98;-1:-1:-1;;;;;1530:10197:73;3328:9:98;:::i;:::-;3352:33;;;;;-1:-1:-1;1530:10197:73;;3352:33:98;1530:10197:73;;;;;;;;;3352:33:98;;;2268:26;3352:33;;1530:10197:73;3352:33:98;;;;;;;;3238:220;-1:-1:-1;1530:10197:73;;;;;;1862:10:50;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;;;3404:43:98;;1862:10:50;;3404:43:98;3238:220;;;3352:33;;;;;-1:-1:-1;3352:33:98;;:::i;:::-;-1:-1:-1;3352:33:98;;;;3077:77;3146:7;3139:4;;3117:11;-1:-1:-1;;;;;1530:10197:73;3146:7:98;:::i;:::-;3077:77;;2976:91;3057:9;1530:10197:73;-1:-1:-1;;;;;3040:14:98;1530:10197:73;;;3018:11:98;1530:10197:73;3057:9:98;:::i;:::-;2976:91;;2844:68;2902:9;;2882:11;-1:-1:-1;;;;;1530:10197:73;2902:9:98;:::i;:::-;2844:68;;;;2590:63;2772:62;2619:22;2772:30;:39;2619:22;2772:18;2229:9;2611:30;2772:50;2619:22;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2590:63:98;1862:10:50;623:33:87;1224:8:72;1195:37;;2611:30:98;:::i;:::-;1862:10:50;2590:63:98;;;2772:18;:::i;1007:30:72:-;-1:-1:-1;515:134:72;1007:30;;;-1:-1:-1;515:134:72;1007:30;;2369:72:98;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2369:72:98;2399:30;1224:8:72;2229:9:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2399:30:98;;:::i;:::-;1862:10:50;2369:72:98;;1007:30:72;-1:-1:-1;515:134:72;1007:30;;2369:24:98;;;2268:26;2369:24;;2268:26;2369:24;;;;;;1530:10197:73;2369:24:98;;;:::i;:::-;;;1530:10197:73;;;;;2369:24:98;;;;;;-1:-1:-1;2369:24:98;;2268:74;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2268:74:98;2300:30;1224:8:72;2229:9:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2300:30:98;;:::i;:::-;1862:10:50;2268:74:98;;;1007:30:72;-1:-1:-1;515:134:72;1007:30;;2268:26:98;;;;;;;;;;;;;1530:10197:73;2268:26:98;;;:::i;:::-;;;1530:10197:73;;;;;2268:26:98;;;;;;-1:-1:-1;2268:26:98;;1007:30:72;-1:-1:-1;515:134:72;1007:30;;2052:117:98;-1:-1:-1;924:10:81;932:2;1862:10:50;;7791:23:97;1530:10197:73;1862:10:50;;;;;1530:10197:73;1862:10:50;;;;;;;7817:9:97;1862:10:50;;7864:20:97;7817:9;7856:28;1530:10197:73;7864:20:97;;:::i;:::-;1530:10197:73;7856:28:97;;:::i;:::-;1862:10:50;7931:14:97;7817:9;7923:22;1530:10197:73;7931:14:97;;:::i;:::-;1530:10197:73;7923:22:97;;:::i;:::-;1862:10:50;7987:17:97;8054:18;7987:17;:38;:17;:29;:17;;;;;:::i;:38::-;8054:18;;:::i;:::-;8086:14;;8082:91;;2052:117:98;8187:12:97;8183:77;;2052:117:98;8274:14:97;8270:267;;2052:117:98;8550:11:97;8546:251;;2052:117:98;1530:10197:73;;9340:61:97;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;9380:20:97;1530:10197:73;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1530:10197:73;;;;8811:42:97;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;8811:42:97;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;8811:42:97;;;;1530:10197:73;;;;;;;;;;8965:37:97;1530:10197:73;;;;;;;;;;9017:24:97;9055:13;9051:90;;2052:117:98;1862:10:50;9286:39:97;9179:4;1862:10:50;;9250:20:97;;;;;;;;:::i;:::-;1530:10197:73;9221:15:97;-1:-1:-1;;;;;1530:10197:73;9250:20:97;:::i;9051:90::-;9132:8;1530:10197:73;-1:-1:-1;;;;;9114:15:97;1530:10197:73;;;9092:11:97;1530:10197:73;9132:8:97;:::i;:::-;9051:90;;8546:251;1530:10197:73;;;775:318:79;-1:-1:-1;;;;;8621:3:97;1530:10197:73;;;8627:6:97;;1530:10197:73;;;;8599:11:97;1530:10197:73;8627:6:97;:::i;:::-;775:318:79;;-1:-1:-1;;;775:318:79;;;;;;;;;;;;;;;;8752:14:97;9340:61;8752:14;-1:-1:-1;;;;;;;;;;;1530:10197:73;9380:20:97;8752:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;8752:14:97;;;;8811:42;-1:-1:-1;;;;;;;;;;;8752:14:97;8704:82;8752:14;;8733:52;8734:32;-1:-1:-1;;;;;8752:14:97;1530:10197:73;2056:15:98;8734:32:97;:::i;:::-;8770:15;8733:52;;:::i;:::-;1530:10197:73;;;;;1862:10:50;;;1530:10197:73;;;;1862:10:50;;;1530:10197:73;1862:10:50;;8704:82:97;8546:251;;;;;;;;;;;;;;;;;775:318:79;;;;;;;;8270:267:97;-1:-1:-1;;;;;8348:9:97;1530:10197:73;;;8360:9:97;;1530:10197:73;;;;8326:11:97;1530:10197:73;8360:9:97;:::i;:::-;8384:33;;;;;-1:-1:-1;1530:10197:73;;8384:33:97;1530:10197:73;;;;;;;;;8384:33:97;;;;;;1530:10197:73;8384:33:97;;;;;;;;8270:267;8492:14;8436:90;;8473:52;8474:32;-1:-1:-1;;;;;8492:14:97;1530:10197:73;2056:15:98;8474:32:97;:::i;8473:52::-;1530:10197:73;;8436:90:97;;;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;8436:90:97;;;;8270:267;;8384:33;;;;;-1:-1:-1;8384:33:97;;:::i;:::-;-1:-1:-1;8384:33:97;;;;8183:77;8252:7;8245:4;;8223:11;-1:-1:-1;;;;;1530:10197:73;8252:7:97;:::i;:::-;8183:77;;8082:91;8163:9;1530:10197:73;-1:-1:-1;;;;;8146:14:97;1530:10197:73;;;8124:11:97;1530:10197:73;8163:9:97;:::i;:::-;8082:91;;2419:778:19;1530:10197:73;;;2419:778:19;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:19;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;11617:532::-;1530:10197:73;;;;;;11703:29:19;;;11748:7;;:::o;11699:444::-;1530:10197:73;11799:38:19;;1530:10197:73;;11860:23:19;;;11712:20;11860:23;1530:10197:73;11712:20:19;11860:23;11795:348;11913:35;11904:44;;11913:35;;11971:46;;;;11712:20;11971:46;1530:10197:73;;;11712:20:19;11971:46;11900:243;12047:30;12038:39;12034:109;;11900:243;11617:532::o;12034:109::-;12100:32;;;11712:20;12100:32;1530:10197:73;;;11712:20:19;12100:32;1530:10197:73;;;;11712:20:19;1530:10197:73;;;;;11712:20:19;1530:10197:73;169:537:79;254:446;;169:537;;;;254:446;;1530:10197:73;;;;;;254:446:79;;1530:10197:73;;;;;254:446:79;;;;;;;;;;;;;;;;;;;169:537;:::o;254:446::-;;;;;;;;1104:470;1200:368;;1104:470;;;;1200:368;;;;;;;;;;;;;;;;;;;;;;;1104:470;:::o;7129:1551:19:-;;;8209:66;8196:79;;8192:164;;1530:10197:73;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;;;;;;;;;;;;8467:24:19;;;;;;;;;-1:-1:-1;8467:24:19;-1:-1:-1;;;;;1530:10197:73;;8505:20:19;8501:113;;8624:49;-1:-1:-1;8624:49:19;-1:-1:-1;7129:1551:19;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:19;8467:24;8541:62;-1:-1:-1;8541:62:19;:::o;8192:164::-;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a0033","offset":24208}},"immutableReferences":{"14598":[{"start":4827,"length":32}],"14601":[{"start":5839,"length":32},{"start":9123,"length":32},{"start":11973,"length":32},{"start":12288,"length":32}],"19858":[{"start":3279,"length":32},{"start":9879,"length":32},{"start":10169,"length":32},{"start":18457,"length":32}],"19870":[{"start":1216,"length":32},{"start":4896,"length":32},{"start":7918,"length":32},{"start":10349,"length":32}],"19873":[{"start":7528,"length":32}],"19921":[{"start":7634,"length":32},{"start":11702,"length":32},{"start":16135,"length":32}],"19970":[{"start":1581,"length":32}],"19972":[{"start":2251,"length":32},{"start":19199,"length":32}],"20024":[{"start":1039,"length":32},{"start":1974,"length":32},{"start":7732,"length":32},{"start":10033,"length":32},{"start":21591,"length":32},{"start":23333,"length":32}],"20027":[{"start":12041,"length":32},{"start":20770,"length":32},{"start":20903,"length":32},{"start":22456,"length":32},{"start":22515,"length":32}],"21785":[{"start":9795,"length":32},{"start":17199,"length":32},{"start":22608,"length":32}],"22184":[{"start":8827,"length":32},{"start":18366,"length":32}],"23986":[{"start":28,"length":32},{"start":1276,"length":32},{"start":1421,"length":32},{"start":2448,"length":32},{"start":2989,"length":32},{"start":4963,"length":32},{"start":5124,"length":32},{"start":7063,"length":32},{"start":7280,"length":32},{"start":8089,"length":32},{"start":8385,"length":32},{"start":8732,"length":32},{"start":9014,"length":32},{"start":10405,"length":32},{"start":10519,"length":32},{"start":11018,"length":32},{"start":11884,"length":32},{"start":12107,"length":32},{"start":16191,"length":32},{"start":16567,"length":32},{"start":16938,"length":32},{"start":20939,"length":32},{"start":20990,"length":32},{"start":21341,"length":32},{"start":21527,"length":32},{"start":21627,"length":32},{"start":21675,"length":32},{"start":22551,"length":32},{"start":22652,"length":32},{"start":23026,"length":32},{"start":23269,"length":32},{"start":23369,"length":32}],"24296":[{"start":3131,"length":32},{"start":3654,"length":32}],"24298":[{"start":4471,"length":32},{"start":7193,"length":32}],"29949":[{"start":10776,"length":32}],"29951":[{"start":10855,"length":32}],"30232":[{"start":12627,"length":32},{"start":13754,"length":32},{"start":20133,"length":32},{"start":22982,"length":32}],"30235":[{"start":10627,"length":32},{"start":16498,"length":32}],"30237":[{"start":22845,"length":32},{"start":23164,"length":32}],"30239":[{"start":22885,"length":32}],"31131":[{"start":4536,"length":32},{"start":17057,"length":32},{"start":20228,"length":32}],"31133":[{"start":6600,"length":32},{"start":16999,"length":32},{"start":20038,"length":32}],"31135":[{"start":20509,"length":32}],"31663":[{"start":967,"length":32}]},"transformations":[{"id":"23986","type":"replace","offset":28,"reason":"immutable"},{"id":"31663","type":"replace","offset":967,"reason":"immutable"},{"id":"20024","type":"replace","offset":1039,"reason":"immutable"},{"id":"19870","type":"replace","offset":1216,"reason":"immutable"},{"id":"23986","type":"replace","offset":1276,"reason":"immutable"},{"id":"23986","type":"replace","offset":1421,"reason":"immutable"},{"id":"19970","type":"replace","offset":1581,"reason":"immutable"},{"id":"20024","type":"replace","offset":1974,"reason":"immutable"},{"id":"19972","type":"replace","offset":2251,"reason":"immutable"},{"id":"23986","type":"replace","offset":2448,"reason":"immutable"},{"id":"23986","type":"replace","offset":2989,"reason":"immutable"},{"id":"24296","type":"replace","offset":3131,"reason":"immutable"},{"id":"19858","type":"replace","offset":3279,"reason":"immutable"},{"id":"24296","type":"replace","offset":3654,"reason":"immutable"},{"id":"24298","type":"replace","offset":4471,"reason":"immutable"},{"id":"31131","type":"replace","offset":4536,"reason":"immutable"},{"id":"14598","type":"replace","offset":4827,"reason":"immutable"},{"id":"19870","type":"replace","offset":4896,"reason":"immutable"},{"id":"23986","type":"replace","offset":4963,"reason":"immutable"},{"id":"23986","type":"replace","offset":5124,"reason":"immutable"},{"id":"14601","type":"replace","offset":5839,"reason":"immutable"},{"id":"31133","type":"replace","offset":6600,"reason":"immutable"},{"id":"23986","type":"replace","offset":7063,"reason":"immutable"},{"id":"24298","type":"replace","offset":7193,"reason":"immutable"},{"id":"23986","type":"replace","offset":7280,"reason":"immutable"},{"id":"19873","type":"replace","offset":7528,"reason":"immutable"},{"id":"19921","type":"replace","offset":7634,"reason":"immutable"},{"id":"20024","type":"replace","offset":7732,"reason":"immutable"},{"id":"19870","type":"replace","offset":7918,"reason":"immutable"},{"id":"23986","type":"replace","offset":8089,"reason":"immutable"},{"id":"23986","type":"replace","offset":8385,"reason":"immutable"},{"id":"23986","type":"replace","offset":8732,"reason":"immutable"},{"id":"22184","type":"replace","offset":8827,"reason":"immutable"},{"id":"23986","type":"replace","offset":9014,"reason":"immutable"},{"id":"14601","type":"replace","offset":9123,"reason":"immutable"},{"id":"21785","type":"replace","offset":9795,"reason":"immutable"},{"id":"19858","type":"replace","offset":9879,"reason":"immutable"},{"id":"20024","type":"replace","offset":10033,"reason":"immutable"},{"id":"19858","type":"replace","offset":10169,"reason":"immutable"},{"id":"19870","type":"replace","offset":10349,"reason":"immutable"},{"id":"23986","type":"replace","offset":10405,"reason":"immutable"},{"id":"23986","type":"replace","offset":10519,"reason":"immutable"},{"id":"30235","type":"replace","offset":10627,"reason":"immutable"},{"id":"29949","type":"replace","offset":10776,"reason":"immutable"},{"id":"29951","type":"replace","offset":10855,"reason":"immutable"},{"id":"23986","type":"replace","offset":11018,"reason":"immutable"},{"id":"19921","type":"replace","offset":11702,"reason":"immutable"},{"id":"23986","type":"replace","offset":11884,"reason":"immutable"},{"id":"14601","type":"replace","offset":11973,"reason":"immutable"},{"id":"20027","type":"replace","offset":12041,"reason":"immutable"},{"id":"23986","type":"replace","offset":12107,"reason":"immutable"},{"id":"14601","type":"replace","offset":12288,"reason":"immutable"},{"id":"30232","type":"replace","offset":12627,"reason":"immutable"},{"id":"30232","type":"replace","offset":13754,"reason":"immutable"},{"id":"19921","type":"replace","offset":16135,"reason":"immutable"},{"id":"23986","type":"replace","offset":16191,"reason":"immutable"},{"id":"30235","type":"replace","offset":16498,"reason":"immutable"},{"id":"23986","type":"replace","offset":16567,"reason":"immutable"},{"id":"23986","type":"replace","offset":16938,"reason":"immutable"},{"id":"31133","type":"replace","offset":16999,"reason":"immutable"},{"id":"31131","type":"replace","offset":17057,"reason":"immutable"},{"id":"21785","type":"replace","offset":17199,"reason":"immutable"},{"id":"22184","type":"replace","offset":18366,"reason":"immutable"},{"id":"19858","type":"replace","offset":18457,"reason":"immutable"},{"id":"19972","type":"replace","offset":19199,"reason":"immutable"},{"id":"31133","type":"replace","offset":20038,"reason":"immutable"},{"id":"30232","type":"replace","offset":20133,"reason":"immutable"},{"id":"31131","type":"replace","offset":20228,"reason":"immutable"},{"id":"31135","type":"replace","offset":20509,"reason":"immutable"},{"id":"20027","type":"replace","offset":20770,"reason":"immutable"},{"id":"20027","type":"replace","offset":20903,"reason":"immutable"},{"id":"23986","type":"replace","offset":20939,"reason":"immutable"},{"id":"23986","type":"replace","offset":20990,"reason":"immutable"},{"id":"23986","type":"replace","offset":21341,"reason":"immutable"},{"id":"23986","type":"replace","offset":21527,"reason":"immutable"},{"id":"20024","type":"replace","offset":21591,"reason":"immutable"},{"id":"23986","type":"replace","offset":21627,"reason":"immutable"},{"id":"23986","type":"replace","offset":21675,"reason":"immutable"},{"id":"20027","type":"replace","offset":22456,"reason":"immutable"},{"id":"20027","type":"replace","offset":22515,"reason":"immutable"},{"id":"23986","type":"replace","offset":22551,"reason":"immutable"},{"id":"21785","type":"replace","offset":22608,"reason":"immutable"},{"id":"23986","type":"replace","offset":22652,"reason":"immutable"},{"id":"30237","type":"replace","offset":22845,"reason":"immutable"},{"id":"30239","type":"replace","offset":22885,"reason":"immutable"},{"id":"30232","type":"replace","offset":22982,"reason":"immutable"},{"id":"23986","type":"replace","offset":23026,"reason":"immutable"},{"id":"30237","type":"replace","offset":23164,"reason":"immutable"},{"id":"23986","type":"replace","offset":23269,"reason":"immutable"},{"id":"20024","type":"replace","offset":23333,"reason":"immutable"},{"id":"23986","type":"replace","offset":23369,"reason":"immutable"}],"transformationValues":{"immutables":{"14598":"0x000000000000000000000000a62f9b597225779b430024398b70374e8468ce14","14601":"0x000000000000000000000000ea0436465676ea7001535bfe2e5cbd4b137b7f91","19858":"0x000000000000000000000000271f808cb55c7cbbb3d4df0da075def9ae5f7340","19870":"0x000000000000000000000000136589be852ab8d9541f923b04064e362c2f357a","19873":"0x0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419","19921":"0x00000000000000000000000072d94600a7a57afb6a2090e9739fd8ab21e02eb2","19970":"0x000000000000000000000000a62f9b597225779b430024398b70374e8468ce14","19972":"0x0000000000000000000000001b54e762aa34cf6e28e9c082f2848e28e45da6b8","20024":"0x00000000000000000000000049a91293a8dff24d5c54b798c45376301d29b9f3","20027":"0x000000000000000000000000f1749e78e76cfe1119206833ae93bed2dede5353","21785":"0x00000000000000000000000080396c7131159eb92e7e84839e51c9887a7a95d9","22184":"0x000000000000000000000000c594bdfba256c79f6069df9e89ea78d6312fadd7","23986":"0x000000000000000000000000000000000004444c5dc75cb358380d2e3de08a90","24296":"0x0000000000000000000000005598aa9146215bc13eb26f2c692ad1461fd32982","24298":"0x39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d787","29949":"0x0000000000000000000000001b54e762aa34cf6e28e9c082f2848e28e45da6b8","29951":"0x00000000000000000000000004f1e9f9848c92508699bfcd59e0522e8246dc16","30232":"0x000000000000000000000000b2304d3de407398de441b147e2c64c7c48daf44e","30235":"0x00000000000000000000000051629bca14098a4f1ad77cd7e85212d67349823d","30237":"0x000000000000000000000000000000000000000000000000000000006ac4279f","30239":"0x0000000000000000000000000000000000000000000000000000000000015180","31131":"0x0000000000000000000000004e5916428452891e1deb59d162c20266ed08cad4","31133":"0x000000000000000000000000000000000000000000000000000000006acabf1f","31135":"0x000000000000000000000000000000000000000000000000000000006ac4279f","31663":"0x000000000000000000000000c0aeabdef1760d0dcba28a20c15701f74216e77a"}}},"deployment":{"transactionHash":"0xd9b1a6f3e0d56b523f71b97a22cd3d0db883235ecadb1aa93eb1ce002320cfd7","blockNumber":"26197758","transactionIndex":"173","deployer":"0xBb145cA83272c3806D4dDc75cA1D5514789cF1C5"},"sources":{"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-721.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.24;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {ERC721Utils} from \"./utils/ERC721Utils.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n    using Strings for uint256;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    mapping(uint256 tokenId => address) private _owners;\n\n    mapping(address owner => uint256) private _balances;\n\n    mapping(uint256 tokenId => address) private _tokenApprovals;\n\n    mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n        return\n            interfaceId == type(IERC721).interfaceId ||\n            interfaceId == type(IERC721Metadata).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /// @inheritdoc IERC721\n    function balanceOf(address owner) public view virtual returns (uint256) {\n        if (owner == address(0)) {\n            revert ERC721InvalidOwner(address(0));\n        }\n        return _balances[owner];\n    }\n\n    /// @inheritdoc IERC721\n    function ownerOf(uint256 tokenId) public view virtual returns (address) {\n        return _requireOwned(tokenId);\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n        _requireOwned(tokenId);\n\n        string memory baseURI = _baseURI();\n        return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n    }\n\n    /**\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n     * by default, can be overridden in child contracts.\n     */\n    function _baseURI() internal view virtual returns (string memory) {\n        return \"\";\n    }\n\n    /// @inheritdoc IERC721\n    function approve(address to, uint256 tokenId) public virtual {\n        _approve(to, tokenId, _msgSender());\n    }\n\n    /// @inheritdoc IERC721\n    function getApproved(uint256 tokenId) public view virtual returns (address) {\n        _requireOwned(tokenId);\n\n        return _getApproved(tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function setApprovalForAll(address operator, bool approved) public virtual {\n        _setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /// @inheritdoc IERC721\n    function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /// @inheritdoc IERC721\n    function transferFrom(address from, address to, uint256 tokenId) public virtual {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n        // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n        address previousOwner = _update(to, tokenId, _msgSender());\n        if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /// @inheritdoc IERC721\n    function safeTransferFrom(address from, address to, uint256 tokenId) public {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /// @inheritdoc IERC721\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n        transferFrom(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n     *\n     * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n     * core ERC-721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n     * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n     * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n     */\n    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n        return _owners[tokenId];\n    }\n\n    /**\n     * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n     */\n    function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n     * particular (ignoring whether it is owned by `owner`).\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n        return\n            spender != address(0) &&\n            (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n    }\n\n    /**\n     * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n     * Reverts if:\n     * - `spender` does not have approval from `owner` for `tokenId`.\n     * - `spender` does not have approval to manage all of `owner`'s assets.\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n        if (!_isAuthorized(owner, spender, tokenId)) {\n            if (owner == address(0)) {\n                revert ERC721NonexistentToken(tokenId);\n            } else {\n                revert ERC721InsufficientApproval(spender, tokenId);\n            }\n        }\n    }\n\n    /**\n     * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n     *\n     * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n     * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n     *\n     * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n     * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n     * remain consistent with one another.\n     */\n    function _increaseBalance(address account, uint128 value) internal virtual {\n        unchecked {\n            _balances[account] += value;\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n     * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n     * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n     */\n    function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n        address from = _ownerOf(tokenId);\n\n        // Perform (optional) operator check\n        if (auth != address(0)) {\n            _checkAuthorized(from, auth, tokenId);\n        }\n\n        // Execute the update\n        if (from != address(0)) {\n            // Clear approval. No need to re-authorize or emit the Approval event\n            _approve(address(0), tokenId, address(0), false);\n\n            unchecked {\n                _balances[from] -= 1;\n            }\n        }\n\n        if (to != address(0)) {\n            unchecked {\n                _balances[to] += 1;\n            }\n        }\n\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n\n        return from;\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner != address(0)) {\n            revert ERC721InvalidSender(address(0));\n        }\n    }\n\n    /**\n     * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n        _mint(to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), address(0), to, tokenId, data);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     * This is an internal function that does not check if the sender is authorized to operate on the token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal {\n        address previousOwner = _update(address(0), tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        } else if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n     * are aware of the ERC-721 standard to prevent tokens from being forever locked.\n     *\n     * `data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is like {safeTransferFrom} in the sense that it invokes\n     * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `tokenId` token must exist and be owned by `from`.\n     * - `to` cannot be the zero address.\n     * - `from` cannot be the zero address.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId) internal {\n        _safeTransfer(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n        _transfer(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Approve `to` to operate on `tokenId`\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n     * either the owner of the token, or approved to operate on all tokens held by this owner.\n     *\n     * Emits an {Approval} event.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address to, uint256 tokenId, address auth) internal {\n        _approve(to, tokenId, auth, true);\n    }\n\n    /**\n     * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n     * emitted in the context of transfers.\n     */\n    function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n        // Avoid reading the owner unless necessary\n        if (emitEvent || auth != address(0)) {\n            address owner = _requireOwned(tokenId);\n\n            // We do not use _isAuthorized because single-token approvals should not be able to call approve\n            if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n                revert ERC721InvalidApprover(auth);\n            }\n\n            if (emitEvent) {\n                emit Approval(owner, to, tokenId);\n            }\n        }\n\n        _tokenApprovals[tokenId] = to;\n    }\n\n    /**\n     * @dev Approve `operator` to operate on all of `owner` tokens\n     *\n     * Requirements:\n     * - operator can't be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n        if (owner == address(0)) {\n            revert ERC721InvalidApprover(address(0));\n        }\n        if (operator == address(0)) {\n            revert ERC721InvalidOperator(operator);\n        }\n        _operatorApprovals[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    /**\n     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n     * Returns the owner.\n     *\n     * Overrides to ownership logic should be done to {_ownerOf}.\n     */\n    function _requireOwned(uint256 tokenId) internal view returns (address) {\n        address owner = _ownerOf(tokenId);\n        if (owner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n        return owner;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC-721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC-721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n     *   {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity >=0.5.0;\n\n/**\n * @title ERC-721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC-721 asset contracts.\n */\ninterface IERC721Receiver {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n     * reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/utils/ERC721Utils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721Receiver} from \"../IERC721Receiver.sol\";\nimport {IERC721Errors} from \"../../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Library that provides common ERC-721 utility functions.\n *\n * See https://eips.ethereum.org/EIPS/eip-721[ERC-721].\n *\n * _Available since v5.1._\n */\nlibrary ERC721Utils {\n    /**\n     * @dev Performs an acceptance check for the provided `operator` by calling {IERC721Receiver-onERC721Received}\n     * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`).\n     *\n     * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA).\n     * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept\n     * the transfer.\n     */\n    function checkOnERC721Received(\n        address operator,\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) internal {\n        if (to.code.length > 0) {\n            try IERC721Receiver(to).onERC721Received(operator, from, tokenId, data) returns (bytes4 retval) {\n                if (retval != IERC721Receiver.onERC721Received.selector) {\n                    // Token rejected\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                }\n            } catch (bytes memory reason) {\n                if (reason.length == 0) {\n                    // non-IERC721Receiver implementer\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                } else {\n                    assembly (\"memory-safe\") {\n                        revert(add(reason, 0x20), mload(reason))\n                    }\n                }\n            }\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Base64.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Base64.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./math/SafeCast.sol\";\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n */\nlibrary Base64 {\n    using SafeCast for bool;\n\n    error InvalidBase64Char(bytes1);\n\n    /**\n     * @dev Converts a `bytes` to its Base64 `string` representation.\n     */\n    function encode(bytes memory data) internal pure returns (string memory) {\n        return string(_encode(data, false));\n    }\n\n    /**\n     * @dev Converts a `bytes` to its Base64Url `string` representation.\n     * Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].\n     */\n    function encodeURL(bytes memory data) internal pure returns (string memory) {\n        return string(_encode(data, true));\n    }\n\n    /**\n     * @dev Converts a Base64 `string` to the `bytes` it represents.\n     *\n     * * Supports padded and unpadded inputs.\n     * * Supports both encoding ({encode} and {encodeURL}) seamlessly.\n     * * Reverts with {InvalidBase64Char} if the input contains an invalid character.\n     */\n    function decode(string memory data) internal pure returns (bytes memory) {\n        return _decode(bytes(data));\n    }\n\n    /**\n     * @dev Internal table-agnostic encoding\n     *\n     * Padding is enabled when using the Base64 table, and disabled when using the Base64Url table.\n     * See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648\n     */\n    function _encode(bytes memory data, bool urlAndFilenameSafe) private pure returns (bytes memory result) {\n        /**\n         * Inspired by Brecht Devos (Brechtpd) implementation - MIT license\n         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n         */\n        if (data.length == 0) return \"\";\n\n        // Padding is enabled by default, but disabled when the \"urlAndFilenameSafe\" alphabet is used\n        //\n        // If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then\n        // multiplied by 4 so that it leaves room for padding the last chunk\n        // - `data.length + 2`  -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // - `4 *`              -> 4 characters for each chunk\n        // This is equivalent to: 4 * Math.ceil(data.length / 3)\n        //\n        // If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as\n        // opposed to when padding is required to fill the last chunk.\n        // - `4 * data.length`  -> 4 characters for each chunk\n        // - ` + 2`             -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // This is equivalent to: Math.ceil((4 * data.length) / 3)\n        uint256 resultLength = urlAndFilenameSafe ? (4 * data.length + 2) / 3 : 4 * ((data.length + 2) / 3);\n\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n\n            // Store the encoding table in the scratch space (and fmp ptr) to avoid memory allocation\n            //\n            // Base64    (ascii)  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /\n            // Base64    (hex)   4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f\n            // Base64Url (ascii)  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 - _\n            // Base64Url (hex)   4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f\n            // xor       (hex)   00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000670\n            mstore(0x1f, \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef\")\n            mstore(0x3f, xor(\"ghijklmnopqrstuvwxyz0123456789+/\", mul(urlAndFilenameSafe, 0x670)))\n\n            // Prepare result pointer, jump over length\n            let resultPtr := add(result, 0x20)\n            let resultEnd := add(resultPtr, resultLength)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to zero to make sure no dirty bytes are read in that section.\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n\n            // Run over the input, 3 bytes at a time\n            for {} lt(dataPtr, endPtr) {} {\n                // Advance 3 bytes\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n\n                // To write each character, shift the 3 byte (24 bits) chunk\n                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n                // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n                // Use this as an index into the lookup table, mload an entire word\n                // so the desired character is in the least significant byte, and\n                // mstore8 this least significant byte into the result and continue.\n                mstore8(resultPtr, mload(and(shr(18, input), 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n                mstore8(resultPtr, mload(and(shr(12, input), 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n                mstore8(resultPtr, mload(and(shr(6, input), 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n                mstore8(resultPtr, mload(and(input, 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            if iszero(urlAndFilenameSafe) {\n                // When data `bytes` is not exactly 3 bytes long\n                // it is padded with `=` characters at the end\n                switch mod(mload(data), 3)\n                case 1 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                    mstore8(sub(resultPtr, 2), 0x3d)\n                }\n                case 2 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                }\n            }\n\n            // Store result length and update FMP to reserve allocated space\n            mstore(result, resultLength)\n            mstore(0x40, resultEnd)\n        }\n    }\n\n    /**\n     * @dev Internal decoding\n     */\n    function _decode(bytes memory data) private pure returns (bytes memory result) {\n        bytes4 errorSelector = InvalidBase64Char.selector;\n\n        uint256 dataLength = data.length;\n        if (dataLength == 0) return \"\";\n\n        uint256 resultLength = (dataLength / 4) * 3;\n        if (dataLength % 4 == 0) {\n            resultLength -= (data[dataLength - 1] == \"=\").toUint() + (data[dataLength - 2] == \"=\").toUint();\n        } else {\n            resultLength += (dataLength % 4) - 1;\n        }\n\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n\n            // Temporarily store the reverse lookup table between in memory. This spans from 0x00 to 0x50, Using:\n            // - all 64bytes of scratch space\n            // - part of the FMP (at location 0x40)\n            mstore(0x30, 0x2425262728292a2b2c2d2e2f30313233)\n            mstore(0x20, 0x0a0b0c0d0e0f10111213141516171819ffffffff3fff1a1b1c1d1e1f20212223)\n            mstore(0x00, 0x3eff3eff3f3435363738393a3b3c3dffffff00ffffff00010203040506070809)\n\n            // Prepare result pointer, jump over length\n            let dataPtr := data\n            let resultPtr := add(result, 0x20)\n            let endPtr := add(resultPtr, resultLength)\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to \"==\" (fake padding) to make sure no dirty bytes are read in that section.\n            let afterPtr := add(add(data, 0x20), dataLength)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, shl(240, 0x3d3d))\n\n            // loop while not everything is decoded\n            for {} lt(resultPtr, endPtr) {} {\n                dataPtr := add(dataPtr, 4)\n\n                // Read a 4 bytes chunk of data\n                let input := mload(dataPtr)\n\n                // Decode each byte in the chunk as a 6 bit block, and align them to form a block of 3 bytes\n                let a := sub(byte(28, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(a, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(a, 43)))\n                    revert(0, 0x24)\n                }\n                let b := sub(byte(29, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(b, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(b, 43)))\n                    revert(0, 0x24)\n                }\n                let c := sub(byte(30, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(c, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(c, 43)))\n                    revert(0, 0x24)\n                }\n                let d := sub(byte(31, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(d, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(d, 43)))\n                    revert(0, 0x24)\n                }\n\n                mstore(\n                    resultPtr,\n                    or(\n                        or(shl(250, byte(0, mload(a))), shl(244, byte(0, mload(b)))),\n                        or(shl(238, byte(0, mload(c))), shl(232, byte(0, mload(d))))\n                    )\n                )\n\n                resultPtr := add(resultPtr, 3)\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            // Store result length and update FMP to reserve allocated space\n            mstore(result, resultLength)\n            mstore(0x40, endPtr)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Bytes.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Bytes.sol)\n\npragma solidity ^0.8.24;\n\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Bytes operations.\n */\nlibrary Bytes {\n    /**\n     * @dev Forward search for `s` in `buffer`\n     * * If `s` is present in the buffer, returns the index of the first instance\n     * * If `s` is not present in the buffer, returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf[Javascript's `Array.indexOf`]\n     */\n    function indexOf(bytes memory buffer, bytes1 s) internal pure returns (uint256) {\n        return indexOf(buffer, s, 0);\n    }\n\n    /**\n     * @dev Forward search for `s` in `buffer` starting at position `pos`\n     * * If `s` is present in the buffer (at or after `pos`), returns the index of the next instance\n     * * If `s` is not present in the buffer (at or after `pos`), returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf[Javascript's `Array.indexOf`]\n     */\n    function indexOf(bytes memory buffer, bytes1 s, uint256 pos) internal pure returns (uint256) {\n        uint256 length = buffer.length;\n        for (uint256 i = pos; i < length; ++i) {\n            if (bytes1(_unsafeReadBytesOffset(buffer, i)) == s) {\n                return i;\n            }\n        }\n        return type(uint256).max;\n    }\n\n    /**\n     * @dev Backward search for `s` in `buffer`\n     * * If `s` is present in the buffer, returns the index of the last instance\n     * * If `s` is not present in the buffer, returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf[Javascript's `Array.lastIndexOf`]\n     */\n    function lastIndexOf(bytes memory buffer, bytes1 s) internal pure returns (uint256) {\n        return lastIndexOf(buffer, s, type(uint256).max);\n    }\n\n    /**\n     * @dev Backward search for `s` in `buffer` starting at position `pos`\n     * * If `s` is present in the buffer (at or before `pos`), returns the index of the previous instance\n     * * If `s` is not present in the buffer (at or before `pos`), returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf[Javascript's `Array.lastIndexOf`]\n     */\n    function lastIndexOf(bytes memory buffer, bytes1 s, uint256 pos) internal pure returns (uint256) {\n        unchecked {\n            uint256 length = buffer.length;\n            for (uint256 i = Math.min(Math.saturatingAdd(pos, 1), length); i > 0; --i) {\n                if (bytes1(_unsafeReadBytesOffset(buffer, i - 1)) == s) {\n                    return i - 1;\n                }\n            }\n            return type(uint256).max;\n        }\n    }\n\n    /**\n     * @dev Copies the content of `buffer`, from `start` (included) to the end of `buffer` into a new bytes object in\n     * memory.\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice[Javascript's `Array.slice`]\n     */\n    function slice(bytes memory buffer, uint256 start) internal pure returns (bytes memory) {\n        return slice(buffer, start, buffer.length);\n    }\n\n    /**\n     * @dev Copies the content of `buffer`, from `start` (included) to `end` (excluded) into a new bytes object in\n     * memory. The `end` argument is truncated to the length of the `buffer`.\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice[Javascript's `Array.slice`]\n     */\n    function slice(bytes memory buffer, uint256 start, uint256 end) internal pure returns (bytes memory) {\n        // sanitize\n        end = Math.min(end, buffer.length);\n        start = Math.min(start, end);\n\n        // allocate and copy\n        bytes memory result = new bytes(end - start);\n        assembly (\"memory-safe\") {\n            mcopy(add(result, 0x20), add(add(buffer, 0x20), start), sub(end, start))\n        }\n\n        return result;\n    }\n\n    /**\n     * @dev Moves the content of `buffer`, from `start` (included) to the end of `buffer` to the start of that buffer,\n     * and shrinks the buffer length accordingly, effectively overriding the content of buffer with buffer[start:].\n     *\n     * NOTE: This function modifies the provided buffer in place. If you need to preserve the original buffer, use {slice} instead\n     */\n    function splice(bytes memory buffer, uint256 start) internal pure returns (bytes memory) {\n        return splice(buffer, start, buffer.length);\n    }\n\n    /**\n     * @dev Moves the content of `buffer`, from `start` (included) to `end` (excluded) to the start of that buffer,\n     * and shrinks the buffer length accordingly, effectively overriding the content of buffer with buffer[start:end].\n     * The `end` argument is truncated to the length of the `buffer`.\n     *\n     * NOTE: This function modifies the provided buffer in place. If you need to preserve the original buffer, use {slice} instead\n     */\n    function splice(bytes memory buffer, uint256 start, uint256 end) internal pure returns (bytes memory) {\n        // sanitize\n        end = Math.min(end, buffer.length);\n        start = Math.min(start, end);\n\n        // move and resize\n        assembly (\"memory-safe\") {\n            mcopy(add(buffer, 0x20), add(add(buffer, 0x20), start), sub(end, start))\n            mstore(buffer, sub(end, start))\n        }\n\n        return buffer;\n    }\n\n    /**\n     * @dev Replaces bytes in `buffer` starting at `pos` with all bytes from `replacement`.\n     *\n     * Parameters are clamped to valid ranges (i.e. `pos` is clamped to `[0, buffer.length]`).\n     * If `pos >= buffer.length`, no replacement occurs and the buffer is returned unchanged.\n     *\n     * NOTE: This function modifies the provided buffer in place.\n     */\n    function replace(bytes memory buffer, uint256 pos, bytes memory replacement) internal pure returns (bytes memory) {\n        return replace(buffer, pos, replacement, 0, replacement.length);\n    }\n\n    /**\n     * @dev Replaces bytes in `buffer` starting at `pos` with bytes from `replacement` starting at `offset`.\n     * Copies at most `length` bytes from `replacement` to `buffer`.\n     *\n     * Parameters are clamped to valid ranges (i.e. `pos` is clamped to `[0, buffer.length]`, `offset` is\n     * clamped to `[0, replacement.length]`, and `length` is clamped to `min(length, replacement.length - offset,\n     * buffer.length - pos))`. If `pos >= buffer.length` or `offset >= replacement.length`, no replacement occurs\n     * and the buffer is returned unchanged.\n     *\n     * NOTE: This function modifies the provided buffer in place.\n     */\n    function replace(\n        bytes memory buffer,\n        uint256 pos,\n        bytes memory replacement,\n        uint256 offset,\n        uint256 length\n    ) internal pure returns (bytes memory) {\n        // sanitize\n        pos = Math.min(pos, buffer.length);\n        offset = Math.min(offset, replacement.length);\n        length = Math.min(length, Math.min(replacement.length - offset, buffer.length - pos));\n\n        // replace\n        assembly (\"memory-safe\") {\n            mcopy(add(add(buffer, 0x20), pos), add(add(replacement, 0x20), offset), length)\n        }\n\n        return buffer;\n    }\n\n    /**\n     * @dev Concatenate an array of bytes into a single bytes object.\n     *\n     * For fixed bytes types, we recommend using the solidity built-in `bytes.concat` or (equivalent)\n     * `abi.encodePacked`.\n     *\n     * NOTE: this could be done in assembly with a single loop that expands starting at the FMP, but that would be\n     * significantly less readable. It might be worth benchmarking the savings of the full-assembly approach.\n     */\n    function concat(bytes[] memory buffers) internal pure returns (bytes memory) {\n        uint256 length = 0;\n        for (uint256 i = 0; i < buffers.length; ++i) {\n            length += buffers[i].length;\n        }\n\n        bytes memory result = new bytes(length);\n\n        uint256 offset = 0x20;\n        for (uint256 i = 0; i < buffers.length; ++i) {\n            bytes memory input = buffers[i];\n            assembly (\"memory-safe\") {\n                mcopy(add(result, offset), add(input, 0x20), mload(input))\n            }\n            unchecked {\n                offset += input.length;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * @dev Split each byte in `input` into two nibbles (4 bits each)\n     *\n     * Example: hex\"01234567\" → hex\"0001020304050607\"\n     */\n    function toNibbles(bytes memory input) internal pure returns (bytes memory output) {\n        assembly (\"memory-safe\") {\n            let length := mload(input)\n            output := mload(0x40)\n            mstore(0x40, add(add(output, 0x20), mul(length, 2)))\n            mstore(output, mul(length, 2))\n            for {\n                let i := 0\n            } lt(i, length) {\n                i := add(i, 0x10)\n            } {\n                let chunk := shr(128, mload(add(add(input, 0x20), i)))\n                chunk := and(\n                    0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff,\n                    or(shl(64, chunk), chunk)\n                )\n                chunk := and(\n                    0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff,\n                    or(shl(32, chunk), chunk)\n                )\n                chunk := and(\n                    0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff,\n                    or(shl(16, chunk), chunk)\n                )\n                chunk := and(\n                    0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff,\n                    or(shl(8, chunk), chunk)\n                )\n                chunk := and(\n                    0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f,\n                    or(shl(4, chunk), chunk)\n                )\n                mstore(add(add(output, 0x20), mul(i, 2)), chunk)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns true if the two byte buffers are equal.\n     */\n    function equal(bytes memory a, bytes memory b) internal pure returns (bool) {\n        return a.length == b.length && keccak256(a) == keccak256(b);\n    }\n\n    /**\n     * @dev Reverses the byte order of a bytes32 value, converting between little-endian and big-endian.\n     * Inspired by https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel[Reverse Parallel]\n     */\n    function reverseBytes32(bytes32 value) internal pure returns (bytes32) {\n        value = // swap bytes\n            ((value >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) |\n            ((value & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\n        value = // swap 2-byte long pairs\n            ((value >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) |\n            ((value & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\n        value = // swap 4-byte long pairs\n            ((value >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) |\n            ((value & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\n        value = // swap 8-byte long pairs\n            ((value >> 64) & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) |\n            ((value & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\n        return (value >> 128) | (value << 128); // swap 16-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 128-bit values.\n    function reverseBytes16(bytes16 value) internal pure returns (bytes16) {\n        value = // swap bytes\n            ((value & 0xFF00FF00FF00FF00FF00FF00FF00FF00) >> 8) |\n            ((value & 0x00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\n        value = // swap 2-byte long pairs\n            ((value & 0xFFFF0000FFFF0000FFFF0000FFFF0000) >> 16) |\n            ((value & 0x0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\n        value = // swap 4-byte long pairs\n            ((value & 0xFFFFFFFF00000000FFFFFFFF00000000) >> 32) |\n            ((value & 0x00000000FFFFFFFF00000000FFFFFFFF) << 32);\n        return (value >> 64) | (value << 64); // swap 8-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 64-bit values.\n    function reverseBytes8(bytes8 value) internal pure returns (bytes8) {\n        value = ((value & 0xFF00FF00FF00FF00) >> 8) | ((value & 0x00FF00FF00FF00FF) << 8); // swap bytes\n        value = ((value & 0xFFFF0000FFFF0000) >> 16) | ((value & 0x0000FFFF0000FFFF) << 16); // swap 2-byte long pairs\n        return (value >> 32) | (value << 32); // swap 4-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 32-bit values.\n    function reverseBytes4(bytes4 value) internal pure returns (bytes4) {\n        value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); // swap bytes\n        return (value >> 16) | (value << 16); // swap 2-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 16-bit values.\n    function reverseBytes2(bytes2 value) internal pure returns (bytes2) {\n        return (value >> 8) | (value << 8);\n    }\n\n    /**\n     * @dev Counts the number of leading zero bits a bytes array. Returns `8 * buffer.length`\n     * if the buffer is all zeros.\n     */\n    function clz(bytes memory buffer) internal pure returns (uint256) {\n        for (uint256 i = 0; i < buffer.length; i += 0x20) {\n            bytes32 chunk = _unsafeReadBytesOffset(buffer, i);\n            if (chunk != bytes32(0)) {\n                return Math.min(8 * i + Math.clz(uint256(chunk)), 8 * buffer.length);\n            }\n        }\n        return 8 * buffer.length;\n    }\n\n    /**\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            value := mload(add(add(buffer, 0x20), offset))\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\nimport {StorageSlot} from \"./StorageSlot.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n *\n * IMPORTANT: Deprecated. This storage-based reentrancy guard will be removed and replaced\n * by the {ReentrancyGuardTransient} variant in v6.0.\n *\n * @custom:stateless\n */\nabstract contract ReentrancyGuard {\n    using StorageSlot for bytes32;\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant REENTRANCY_GUARD_STORAGE =\n        0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _reentrancyGuardStorageSlot().getUint256Slot().value = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    /**\n     * @dev A `view` only version of {nonReentrant}. Use to block view functions\n     * from being called, preventing reading from inconsistent contract state.\n     *\n     * CAUTION: This is a \"view\" modifier and does not change the reentrancy\n     * status. Use it only on view functions. For payable or non-payable functions,\n     * use the standard {nonReentrant} modifier instead.\n     */\n    modifier nonReentrantView() {\n        _nonReentrantBeforeView();\n        _;\n    }\n\n    function _nonReentrantBeforeView() private view {\n        if (_reentrancyGuardEntered()) {\n            revert ReentrancyGuardReentrantCall();\n        }\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        _nonReentrantBeforeView();\n\n        // Any calls to nonReentrant after this point will fail\n        _reentrancyGuardStorageSlot().getUint256Slot().value = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _reentrancyGuardStorageSlot().getUint256Slot().value = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _reentrancyGuardStorageSlot().getUint256Slot().value == ENTERED;\n    }\n\n    function _reentrancyGuardStorageSlot() internal pure virtual returns (bytes32) {\n        return REENTRANCY_GUARD_STORAGE;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Strings.sol)\n\npragma solidity ^0.8.24;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\nimport {Bytes} from \"./Bytes.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    using SafeCast for *;\n\n    bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n    uint8 private constant ADDRESS_LENGTH = 20;\n    uint256 private constant SPECIAL_CHARS_LOOKUP =\n        0xffffffff | // first 32 bits corresponding to the control characters (U+0000 to U+001F)\n            (1 << 0x22) | // double quote\n            (1 << 0x5c); // backslash\n\n    /**\n     * @dev The `value` string doesn't fit in the specified `length`.\n     */\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n    /**\n     * @dev The string being parsed contains characters that are not in scope of the given base.\n     */\n    error StringsInvalidChar();\n\n    /**\n     * @dev The string being parsed is not a properly formatted address.\n     */\n    error StringsInvalidAddressFormat();\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = Math.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            assembly (\"memory-safe\") {\n                ptr := add(add(buffer, 0x20), length)\n            }\n            while (true) {\n                ptr--;\n                assembly (\"memory-safe\") {\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toStringSigned(int256 value) internal pure returns (string memory) {\n        return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, Math.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        uint256 localValue = value;\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = HEX_DIGITS[localValue & 0xf];\n            localValue >>= 4;\n        }\n        if (localValue != 0) {\n            revert StringsInsufficientHexLength(value, length);\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n     * representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n     * representation, according to EIP-55.\n     */\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\n        bytes memory buffer = bytes(toHexString(addr));\n\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\n        uint256 hashValue;\n        assembly (\"memory-safe\") {\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n        }\n\n        for (uint256 i = 41; i > 1; --i) {\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n                // case shift by xoring with 0x20\n                buffer[i] ^= 0x20;\n            }\n            hashValue >>= 4;\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts a `bytes` buffer to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(bytes memory input) internal pure returns (string memory) {\n        unchecked {\n            bytes memory buffer = new bytes(2 * input.length + 2);\n            buffer[0] = \"0\";\n            buffer[1] = \"x\";\n            for (uint256 i = 0; i < input.length; ++i) {\n                uint8 v = uint8(input[i]);\n                buffer[2 * i + 2] = HEX_DIGITS[v >> 4];\n                buffer[2 * i + 3] = HEX_DIGITS[v & 0xf];\n            }\n            return string(buffer);\n        }\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return Bytes.equal(bytes(a), bytes(b));\n    }\n\n    /**\n     * @dev Parse a decimal string and returns the value as a `uint256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `[0-9]*`\n     * - The result must fit into an `uint256` type\n     */\n    function parseUint(string memory input) internal pure returns (uint256) {\n        return parseUint(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `[0-9]*`\n     * - The result must fit into an `uint256` type\n     */\n    function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n        (bool success, uint256 value) = tryParseUint(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n        return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n     * character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseUint(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, uint256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseUintUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseUintUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, uint256 value) {\n        bytes memory buffer = bytes(input);\n\n        uint256 result = 0;\n        for (uint256 i = begin; i < end; ++i) {\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (chr > 9) return (false, 0);\n            result *= 10;\n            result += chr;\n        }\n        return (true, result);\n    }\n\n    /**\n     * @dev Parse a decimal string and returns the value as a `int256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `[-+]?[0-9]*`\n     * - The result must fit in an `int256` type.\n     */\n    function parseInt(string memory input) internal pure returns (int256) {\n        return parseInt(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `[-+]?[0-9]*`\n     * - The result must fit in an `int256` type.\n     */\n    function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n        (bool success, int256 value) = tryParseInt(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n     * the result does not fit in a `int256`.\n     *\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n     */\n    function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n        return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n    /**\n     * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n     * character or if the result does not fit in a `int256`.\n     *\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n     */\n    function tryParseInt(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, int256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseIntUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseIntUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, int256 value) {\n        bytes memory buffer = bytes(input);\n\n        // Check presence of a negative sign.\n        bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        bool positiveSign = sign == bytes1(\"+\");\n        bool negativeSign = sign == bytes1(\"-\");\n        uint256 offset = (positiveSign || negativeSign).toUint();\n\n        (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n        if (absSuccess && absValue < ABS_MIN_INT256) {\n            return (true, negativeSign ? -int256(absValue) : int256(absValue));\n        } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n            return (true, type(int256).min);\n        } else return (false, 0);\n    }\n\n    /**\n     * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n     * - The result must fit in an `uint256` type.\n     */\n    function parseHexUint(string memory input) internal pure returns (uint256) {\n        return parseHexUint(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n     * - The result must fit in an `uint256` type.\n     */\n    function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n        (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n        return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n     * invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseHexUint(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, uint256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseHexUintUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseHexUintUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, uint256 value) {\n        bytes memory buffer = bytes(input);\n\n        // skip 0x prefix if present\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        uint256 offset = hasPrefix.toUint() * 2;\n\n        uint256 result = 0;\n        for (uint256 i = begin + offset; i < end; ++i) {\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (chr > 15) return (false, 0);\n            result *= 16;\n            unchecked {\n                // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n                // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n                result += chr;\n            }\n        }\n        return (true, result);\n    }\n\n    /**\n     * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n     *\n     * Requirements:\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n     */\n    function parseAddress(string memory input) internal pure returns (address) {\n        return parseAddress(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n     */\n    function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n        (bool success, address value) = tryParseAddress(input, begin, end);\n        if (!success) revert StringsInvalidAddressFormat();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n     * formatted address. See {parseAddress-string} requirements.\n     */\n    function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n        return tryParseAddress(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n     * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n     */\n    function tryParseAddress(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, address value) {\n        if (end > bytes(input).length || begin > end) return (false, address(0));\n\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n        // check that input is the correct length\n        if (end - begin == expectedLength) {\n            // length guarantees that this does not overflow, and value is at most type(uint160).max\n            (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n            return (s, address(uint160(v)));\n        } else {\n            return (false, address(0));\n        }\n    }\n\n    function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n        uint8 value = uint8(chr);\n\n        // Try to parse `chr`:\n        // - Case 1: [0-9]\n        // - Case 2: [a-f]\n        // - Case 3: [A-F]\n        // - otherwise not supported\n        unchecked {\n            if (value > 47 && value < 58) value -= 48;\n            else if (value > 96 && value < 103) value -= 87;\n            else if (value > 64 && value < 71) value -= 55;\n            else return type(uint8).max;\n        }\n\n        return value;\n    }\n\n    /**\n     * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n     *\n     * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n     *\n     * NOTE: This function escapes backslashes (including those in \\uXXXX sequences) and the characters in ranges\n     * defined in section 2.5 of RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). All control characters in U+0000\n     * to U+001F are escaped (\\b, \\t, \\n, \\f, \\r use short form; others use \\u00XX). ECMAScript's `JSON.parse` does\n     * recover escaped unicode characters that are not in this range, but other tooling may provide different results.\n     */\n    function escapeJSON(string memory input) internal pure returns (string memory) {\n        bytes memory buffer = bytes(input);\n\n        // Put output at the FMP. Memory will be reserved later when we figure out the actual length of the escaped\n        // string. All write are done using _unsafeWriteBytesOffset, which avoid the (expensive) length checks for\n        // each character written.\n        bytes memory output;\n        assembly (\"memory-safe\") {\n            output := mload(0x40)\n        }\n        uint256 outputLength = 0;\n\n        for (uint256 i = 0; i < buffer.length; ++i) {\n            uint8 char = uint8(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (((SPECIAL_CHARS_LOOKUP & (1 << char)) != 0)) {\n                _unsafeWriteBytesOffset(output, outputLength++, \"\\\\\");\n                if (char == 0x08) _unsafeWriteBytesOffset(output, outputLength++, \"b\");\n                else if (char == 0x09) _unsafeWriteBytesOffset(output, outputLength++, \"t\");\n                else if (char == 0x0a) _unsafeWriteBytesOffset(output, outputLength++, \"n\");\n                else if (char == 0x0c) _unsafeWriteBytesOffset(output, outputLength++, \"f\");\n                else if (char == 0x0d) _unsafeWriteBytesOffset(output, outputLength++, \"r\");\n                else if (char == 0x5c) _unsafeWriteBytesOffset(output, outputLength++, \"\\\\\");\n                else if (char == 0x22) {\n                    // solhint-disable-next-line quotes\n                    _unsafeWriteBytesOffset(output, outputLength++, '\"');\n                } else {\n                    // U+0000 to U+001F without short form: output \\u00XX\n                    _unsafeWriteBytesOffset(output, outputLength++, \"u\");\n                    _unsafeWriteBytesOffset(output, outputLength++, \"0\");\n                    _unsafeWriteBytesOffset(output, outputLength++, \"0\");\n                    _unsafeWriteBytesOffset(output, outputLength++, HEX_DIGITS[char >> 4]);\n                    _unsafeWriteBytesOffset(output, outputLength++, HEX_DIGITS[char & 0x0f]);\n                }\n            } else {\n                _unsafeWriteBytesOffset(output, outputLength++, bytes1(char));\n            }\n        }\n        // write the actual length and reserve memory\n        assembly (\"memory-safe\") {\n            mstore(output, outputLength)\n            mstore(0x40, add(output, add(outputLength, 0x20)))\n        }\n\n        return string(output);\n    }\n\n    /**\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            value := mload(add(add(buffer, 0x20), offset))\n        }\n    }\n\n    /**\n     * @dev Write a bytes1 to a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeWriteBytesOffset(bytes memory buffer, uint256 offset, bytes1 value) private pure {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            mstore8(add(add(buffer, 0x20), offset), shr(248, value))\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n    enum RecoverError {\n        NoError,\n        InvalidSignature,\n        InvalidSignatureLength,\n        InvalidSignatureS\n    }\n\n    /**\n     * @dev The signature is invalid.\n     */\n    error ECDSAInvalidSignature();\n\n    /**\n     * @dev The signature has an invalid length.\n     */\n    error ECDSAInvalidSignatureLength(uint256 length);\n\n    /**\n     * @dev The signature has an S value that is in the upper half order.\n     */\n    error ECDSAInvalidSignatureS(bytes32 s);\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n     * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n     * and a bytes32 providing additional information about the error.\n     *\n     * If no error is returned, then the address can be used for verification purposes.\n     *\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * NOTE: This function only supports 65-byte signatures. ERC-2098 short signatures are rejected. This restriction\n     * is DEPRECATED and will be removed in v6.0. Developers SHOULD NOT use signatures as unique identifiers; use hash\n     * invalidation or nonces for replay protection.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n     *\n     * Documentation for signature generation:\n     *\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes memory signature\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly (\"memory-safe\") {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n        }\n    }\n\n    /**\n     * @dev Variant of {tryRecover} that takes a signature in calldata\n     */\n    function tryRecoverCalldata(\n        bytes32 hash,\n        bytes calldata signature\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, calldata slices would work here, but are\n            // significantly more expensive (length check) than using calldataload in assembly.\n            assembly (\"memory-safe\") {\n                r := calldataload(signature.offset)\n                s := calldataload(add(signature.offset, 0x20))\n                v := byte(0, calldataload(add(signature.offset, 0x40)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * NOTE: This function only supports 65-byte signatures. ERC-2098 short signatures are rejected. This restriction\n     * is DEPRECATED and will be removed in v6.0. Developers SHOULD NOT use signatures as unique identifiers; use hash\n     * invalidation or nonces for replay protection.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Variant of {recover} that takes a signature in calldata\n     */\n    function recoverCalldata(bytes32 hash, bytes calldata signature) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecoverCalldata(hash, signature);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n     *\n     * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        unchecked {\n            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n            // We do not check for an overflow here since the shift operation results in 0 or 1.\n            uint8 v = uint8((uint256(vs) >> 255) + 27);\n            return tryRecover(hash, v, r, s);\n        }\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately.\n     */\n    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function tryRecover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n            return (address(0), RecoverError.InvalidSignatureS, s);\n        }\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        if (signer == address(0)) {\n            return (address(0), RecoverError.InvalidSignature, bytes32(0));\n        }\n\n        return (signer, RecoverError.NoError, bytes32(0));\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Parse a signature into its `v`, `r` and `s` components. Supports 65-byte and 64-byte (ERC-2098)\n     * formats. Returns (0,0,0) for invalid signatures.\n     *\n     * For 64-byte signatures, `v` is automatically normalized to 27 or 28.\n     * For 65-byte signatures, `v` is returned as-is and MUST already be 27 or 28 for use with ecrecover.\n     *\n     * Consider validating the result before use, or use {tryRecover}/{recover} which perform full validation.\n     */\n    function parse(bytes memory signature) internal pure returns (uint8 v, bytes32 r, bytes32 s) {\n        assembly (\"memory-safe\") {\n            // Check the signature length\n            switch mload(signature)\n            // - case 65: r,s,v signature (standard)\n            case 65 {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098)\n            case 64 {\n                let vs := mload(add(signature, 0x40))\n                r := mload(add(signature, 0x20))\n                s := and(vs, shr(1, not(0)))\n                v := add(shr(255, vs), 27)\n            }\n            default {\n                r := 0\n                s := 0\n                v := 0\n            }\n        }\n    }\n\n    /**\n     * @dev Variant of {parse} that takes a signature in calldata\n     */\n    function parseCalldata(bytes calldata signature) internal pure returns (uint8 v, bytes32 r, bytes32 s) {\n        assembly (\"memory-safe\") {\n            // Check the signature length\n            switch signature.length\n            // - case 65: r,s,v signature (standard)\n            case 65 {\n                r := calldataload(signature.offset)\n                s := calldataload(add(signature.offset, 0x20))\n                v := byte(0, calldataload(add(signature.offset, 0x40)))\n            }\n            // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098)\n            case 64 {\n                let vs := calldataload(add(signature.offset, 0x20))\n                r := calldataload(signature.offset)\n                s := and(vs, shr(1, not(0)))\n                v := add(shr(255, vs), 27)\n            }\n            default {\n                r := 0\n                s := 0\n                v := 0\n            }\n        }\n    }\n\n    /**\n     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n     */\n    function _throwError(RecoverError error, bytes32 errorArg) private pure {\n        if (error == RecoverError.NoError) {\n            return; // no error: do nothing\n        } else if (error == RecoverError.InvalidSignature) {\n            revert ECDSAInvalidSignature();\n        } else if (error == RecoverError.InvalidSignatureLength) {\n            revert ECDSAInvalidSignatureLength(uint256(errorArg));\n        } else if (error == RecoverError.InvalidSignatureS) {\n            revert ECDSAInvalidSignatureS(errorArg);\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.24;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n    error ERC5267ExtensionsNotSupported();\n\n    /**\n     * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n     * `0x45` (`personal_sign` messages).\n     *\n     * The digest is calculated by prefixing a bytes32 `messageHash` with\n     * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n     * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n     *\n     * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n     * keccak256, although any bytes32 value can be safely used because the final digest will\n     * be re-hashed.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n        assembly (\"memory-safe\") {\n            mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n        }\n    }\n\n    /**\n     * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n     * `0x45` (`personal_sign` messages).\n     *\n     * The digest is calculated by prefixing an arbitrary `message` with\n     * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n     * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n        return\n            keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n    }\n\n    /**\n     * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n     * `0x00` (data with intended validator).\n     *\n     * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n     * `validator` address. Then hashing the result.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n    }\n\n    /**\n     * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n     */\n    function toDataWithIntendedValidatorHash(\n        address validator,\n        bytes32 messageHash\n    ) internal pure returns (bytes32 digest) {\n        assembly (\"memory-safe\") {\n            mstore(0x00, hex\"19_00\")\n            mstore(0x02, shl(96, validator))\n            mstore(0x16, messageHash)\n            digest := keccak256(0x00, 0x36)\n        }\n    }\n\n    /**\n     * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n     *\n     * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n     * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            mstore(ptr, hex\"19_01\")\n            mstore(add(ptr, 0x02), domainSeparator)\n            mstore(add(ptr, 0x22), structHash)\n            digest := keccak256(ptr, 0x42)\n        }\n    }\n\n    /**\n     * @dev Returns the EIP-712 domain separator constructed from an `eip712Domain`. See {IERC5267-eip712Domain}\n     *\n     * This function dynamically constructs the domain separator based on which fields are present in the\n     * `fields` parameter. It contains flags that indicate which domain fields are present:\n     *\n     * * Bit 0 (0x01): name\n     * * Bit 1 (0x02): version\n     * * Bit 2 (0x04): chainId\n     * * Bit 3 (0x08): verifyingContract\n     * * Bit 4 (0x10): salt\n     *\n     * Arguments that correspond to fields which are not present in `fields` are ignored. For example, if `fields` is\n     * `0x0f` (`0b01111`), then the `salt` parameter is ignored.\n     */\n    function toDomainSeparator(\n        bytes1 fields,\n        string memory name,\n        string memory version,\n        uint256 chainId,\n        address verifyingContract,\n        bytes32 salt\n    ) internal pure returns (bytes32 hash) {\n        return\n            toDomainSeparator(\n                fields,\n                keccak256(bytes(name)),\n                keccak256(bytes(version)),\n                chainId,\n                verifyingContract,\n                salt\n            );\n    }\n\n    /// @dev Variant of {toDomainSeparator-bytes1-string-string-uint256-address-bytes32} that uses hashed name and version.\n    function toDomainSeparator(\n        bytes1 fields,\n        bytes32 nameHash,\n        bytes32 versionHash,\n        uint256 chainId,\n        address verifyingContract,\n        bytes32 salt\n    ) internal pure returns (bytes32 hash) {\n        bytes32 domainTypeHash = toDomainTypeHash(fields);\n\n        assembly (\"memory-safe\") {\n            // align fields to the right for easy processing\n            fields := shr(248, fields)\n\n            // FMP used as scratch space\n            let fmp := mload(0x40)\n            mstore(fmp, domainTypeHash)\n\n            let ptr := add(fmp, 0x20)\n            if and(fields, 0x01) {\n                mstore(ptr, nameHash)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x02) {\n                mstore(ptr, versionHash)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x04) {\n                mstore(ptr, chainId)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x08) {\n                mstore(ptr, verifyingContract)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x10) {\n                mstore(ptr, salt)\n                ptr := add(ptr, 0x20)\n            }\n\n            hash := keccak256(fmp, sub(ptr, fmp))\n        }\n    }\n\n    /// @dev Builds an EIP-712 domain type hash depending on the `fields` provided, following https://eips.ethereum.org/EIPS/eip-5267[ERC-5267]\n    function toDomainTypeHash(bytes1 fields) internal pure returns (bytes32 hash) {\n        if (fields & 0x20 == 0x20) revert ERC5267ExtensionsNotSupported();\n\n        assembly (\"memory-safe\") {\n            // align fields to the right for easy processing\n            fields := shr(248, fields)\n\n            // FMP used as scratch space\n            let fmp := mload(0x40)\n            mstore(fmp, \"EIP712Domain(\")\n\n            let ptr := add(fmp, 0x0d)\n            // name field\n            if and(fields, 0x01) {\n                mstore(ptr, \"string name,\")\n                ptr := add(ptr, 0x0c)\n            }\n            // version field\n            if and(fields, 0x02) {\n                mstore(ptr, \"string version,\")\n                ptr := add(ptr, 0x0f)\n            }\n            // chainId field\n            if and(fields, 0x04) {\n                mstore(ptr, \"uint256 chainId,\")\n                ptr := add(ptr, 0x10)\n            }\n            // verifyingContract field\n            if and(fields, 0x08) {\n                mstore(ptr, \"address verifyingContract,\")\n                ptr := add(ptr, 0x1a)\n            }\n            // salt field\n            if and(fields, 0x10) {\n                mstore(ptr, \"bytes32 salt,\")\n                ptr := add(ptr, 0x0d)\n            }\n            // if any field is enabled, remove the trailing comma\n            ptr := sub(ptr, iszero(iszero(and(fields, 0x1f))))\n            // add the closing brace\n            mstore8(ptr, 0x29) // add closing brace\n            ptr := add(ptr, 1)\n\n            hash := keccak256(fmp, sub(ptr, fmp))\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `condition ? a : b`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `condition ? a : b`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // (a + b) / 2 can overflow.\n            return (a & b) + (a ^ b) / 2;\n        }\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory buffer) private pure returns (bool) {\n        uint256 chunk;\n        for (uint256 i = 0; i < buffer.length; i += 0x20) {\n            // See _unsafeReadBytesOffset from utils/Bytes.sol\n            assembly (\"memory-safe\") {\n                chunk := mload(add(add(buffer, 0x20), i))\n            }\n            if (chunk >> (8 * saturatingSub(i + 0x20, buffer.length)) != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the first 16 bytes (most significant half).\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n\n    /**\n     * @dev Counts the number of leading zero bits in a uint256.\n     */\n    function clz(uint256 x) internal pure returns (uint256) {\n        return ternary(x == 0, 256, 255 - log2(x));\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev A uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n            // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n            int256 mask = n >> 255;\n\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n            return uint256((n + mask) ^ mask);\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IEIP712} from \"./IEIP712.sol\";\n\n/// @title AllowanceTransfer\n/// @notice Handles ERC20 token permissions through signature based allowance setting and ERC20 token transfers by checking allowed amounts\n/// @dev Requires user's token approval on the Permit2 contract\ninterface IAllowanceTransfer is IEIP712 {\n    /// @notice Thrown when an allowance on a token has expired.\n    /// @param deadline The timestamp at which the allowed amount is no longer valid\n    error AllowanceExpired(uint256 deadline);\n\n    /// @notice Thrown when an allowance on a token has been depleted.\n    /// @param amount The maximum amount allowed\n    error InsufficientAllowance(uint256 amount);\n\n    /// @notice Thrown when too many nonces are invalidated.\n    error ExcessiveInvalidation();\n\n    /// @notice Emits an event when the owner successfully invalidates an ordered nonce.\n    event NonceInvalidation(\n        address indexed owner, address indexed token, address indexed spender, uint48 newNonce, uint48 oldNonce\n    );\n\n    /// @notice Emits an event when the owner successfully sets permissions on a token for the spender.\n    event Approval(\n        address indexed owner, address indexed token, address indexed spender, uint160 amount, uint48 expiration\n    );\n\n    /// @notice Emits an event when the owner successfully sets permissions using a permit signature on a token for the spender.\n    event Permit(\n        address indexed owner,\n        address indexed token,\n        address indexed spender,\n        uint160 amount,\n        uint48 expiration,\n        uint48 nonce\n    );\n\n    /// @notice Emits an event when the owner sets the allowance back to 0 with the lockdown function.\n    event Lockdown(address indexed owner, address token, address spender);\n\n    /// @notice The permit data for a token\n    struct PermitDetails {\n        // ERC20 token address\n        address token;\n        // the maximum amount allowed to spend\n        uint160 amount;\n        // timestamp at which a spender's token allowances become invalid\n        uint48 expiration;\n        // an incrementing value indexed per owner,token,and spender for each signature\n        uint48 nonce;\n    }\n\n    /// @notice The permit message signed for a single token allowance\n    struct PermitSingle {\n        // the permit data for a single token alownce\n        PermitDetails details;\n        // address permissioned on the allowed tokens\n        address spender;\n        // deadline on the permit signature\n        uint256 sigDeadline;\n    }\n\n    /// @notice The permit message signed for multiple token allowances\n    struct PermitBatch {\n        // the permit data for multiple token allowances\n        PermitDetails[] details;\n        // address permissioned on the allowed tokens\n        address spender;\n        // deadline on the permit signature\n        uint256 sigDeadline;\n    }\n\n    /// @notice The saved permissions\n    /// @dev This info is saved per owner, per token, per spender and all signed over in the permit message\n    /// @dev Setting amount to type(uint160).max sets an unlimited approval\n    struct PackedAllowance {\n        // amount allowed\n        uint160 amount;\n        // permission expiry\n        uint48 expiration;\n        // an incrementing value indexed per owner,token,and spender for each signature\n        uint48 nonce;\n    }\n\n    /// @notice A token spender pair.\n    struct TokenSpenderPair {\n        // the token the spender is approved\n        address token;\n        // the spender address\n        address spender;\n    }\n\n    /// @notice Details for a token transfer.\n    struct AllowanceTransferDetails {\n        // the owner of the token\n        address from;\n        // the recipient of the token\n        address to;\n        // the amount of the token\n        uint160 amount;\n        // the token to be transferred\n        address token;\n    }\n\n    /// @notice A mapping from owner address to token address to spender address to PackedAllowance struct, which contains details and conditions of the approval.\n    /// @notice The mapping is indexed in the above order see: allowance[ownerAddress][tokenAddress][spenderAddress]\n    /// @dev The packed slot holds the allowed amount, expiration at which the allowed amount is no longer valid, and current nonce thats updated on any signature based approvals.\n    function allowance(address user, address token, address spender)\n        external\n        view\n        returns (uint160 amount, uint48 expiration, uint48 nonce);\n\n    /// @notice Approves the spender to use up to amount of the specified token up until the expiration\n    /// @param token The token to approve\n    /// @param spender The spender address to approve\n    /// @param amount The approved amount of the token\n    /// @param expiration The timestamp at which the approval is no longer valid\n    /// @dev The packed allowance also holds a nonce, which will stay unchanged in approve\n    /// @dev Setting amount to type(uint160).max sets an unlimited approval\n    function approve(address token, address spender, uint160 amount, uint48 expiration) external;\n\n    /// @notice Permit a spender to a given amount of the owners token via the owner's EIP-712 signature\n    /// @dev May fail if the owner's nonce was invalidated in-flight by invalidateNonce\n    /// @param owner The owner of the tokens being approved\n    /// @param permitSingle Data signed over by the owner specifying the terms of approval\n    /// @param signature The owner's signature over the permit data\n    function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external;\n\n    /// @notice Permit a spender to the signed amounts of the owners tokens via the owner's EIP-712 signature\n    /// @dev May fail if the owner's nonce was invalidated in-flight by invalidateNonce\n    /// @param owner The owner of the tokens being approved\n    /// @param permitBatch Data signed over by the owner specifying the terms of approval\n    /// @param signature The owner's signature over the permit data\n    function permit(address owner, PermitBatch memory permitBatch, bytes calldata signature) external;\n\n    /// @notice Transfer approved tokens from one address to another\n    /// @param from The address to transfer from\n    /// @param to The address of the recipient\n    /// @param amount The amount of the token to transfer\n    /// @param token The token address to transfer\n    /// @dev Requires the from address to have approved at least the desired amount\n    /// of tokens to msg.sender.\n    function transferFrom(address from, address to, uint160 amount, address token) external;\n\n    /// @notice Transfer approved tokens in a batch\n    /// @param transferDetails Array of owners, recipients, amounts, and tokens for the transfers\n    /// @dev Requires the from addresses to have approved at least the desired amount\n    /// of tokens to msg.sender.\n    function transferFrom(AllowanceTransferDetails[] calldata transferDetails) external;\n\n    /// @notice Enables performing a \"lockdown\" of the sender's Permit2 identity\n    /// by batch revoking approvals\n    /// @param approvals Array of approvals to revoke.\n    function lockdown(TokenSpenderPair[] calldata approvals) external;\n\n    /// @notice Invalidate nonces for a given (token, spender) pair\n    /// @param token The token to invalidate nonces for\n    /// @param spender The spender to invalidate nonces for\n    /// @param newNonce The new nonce to set. Invalidates all nonces less than it.\n    /// @dev Can't invalidate more than 2**16 nonces per transaction.\n    function invalidateNonces(address token, address spender, uint48 newNonce) external;\n}\n"},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IEIP712 {\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExtsload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for functions to access any storage slot in a contract\ninterface IExtsload {\n    /// @notice Called by external contracts to access granular pool state\n    /// @param slot Key of slot to sload\n    /// @return value The value of the slot as bytes32\n    function extsload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access granular pool state\n    /// @param startSlot Key of slot to start sloading from\n    /// @param nSlots Number of slots to load into return value\n    /// @return values List of loaded values.\n    function extsload(bytes32 startSlot, uint256 nSlots) external view returns (bytes32[] memory values);\n\n    /// @notice Called by external contracts to access sparse pool state\n    /// @param slots List of slots to SLOAD from.\n    /// @return values List of loaded values.\n    function extsload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExttload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/// @notice Interface for functions to access any transient storage slot in a contract\ninterface IExttload {\n    /// @notice Called by external contracts to access transient storage of the contract\n    /// @param slot Key of slot to tload\n    /// @return value The value of the slot as bytes32\n    function exttload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access sparse transient pool state\n    /// @param slots List of slots to tload\n    /// @return values List of loaded values\n    function exttload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IHooks.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {BeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\n/// See the Hooks library for the full spec.\n/// @dev Should only be callable by the v4 PoolManager.\ninterface IHooks {\n    /// @notice The hook called before the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @return bytes4 The function selector for the hook\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96) external returns (bytes4);\n\n    /// @notice The hook called after the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @param tick The current tick after the state of a pool is initialized\n    /// @return bytes4 The function selector for the hook\n    function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n        external\n        returns (bytes4);\n\n    /// @notice The hook called before liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param delta The caller's balance delta after adding liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param delta The caller's balance delta after removing liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BeforeSwapDelta The hook's delta in specified and unspecified currencies. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    /// @return uint24 Optionally override the lp fee, only used if three conditions are met: 1. the Pool has a dynamic fee, 2. the value's 2nd highest bit is set (23rd bit, 0x400000), and 3. the value is less than or equal to the maximum fee (1 million)\n    function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)\n        external\n        returns (bytes4, BeforeSwapDelta, uint24);\n\n    /// @notice The hook called after a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param delta The amount owed to the caller (positive) or owed to the pool (negative)\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return int128 The hook's delta in unspecified currency. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external returns (bytes4, int128);\n\n    /// @notice The hook called before donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function afterDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IPoolManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"./IHooks.sol\";\nimport {IERC6909Claims} from \"./external/IERC6909Claims.sol\";\nimport {IProtocolFees} from \"./IProtocolFees.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IExtsload} from \"./IExtsload.sol\";\nimport {IExttload} from \"./IExttload.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\n\n/// @notice Interface for the PoolManager\ninterface IPoolManager is IProtocolFees, IERC6909Claims, IExtsload, IExttload {\n    /// @notice Thrown when a currency is not netted out after the contract is unlocked\n    error CurrencyNotSettled();\n\n    /// @notice Thrown when trying to interact with a non-initialized pool\n    error PoolNotInitialized();\n\n    /// @notice Thrown when unlock is called, but the contract is already unlocked\n    error AlreadyUnlocked();\n\n    /// @notice Thrown when a function is called that requires the contract to be unlocked, but it is not\n    error ManagerLocked();\n\n    /// @notice Pools are limited to type(int16).max tickSpacing in #initialize, to prevent overflow\n    error TickSpacingTooLarge(int24 tickSpacing);\n\n    /// @notice Pools must have a positive non-zero tickSpacing passed to #initialize\n    error TickSpacingTooSmall(int24 tickSpacing);\n\n    /// @notice PoolKey must have currencies where address(currency0) < address(currency1)\n    error CurrenciesOutOfOrderOrEqual(address currency0, address currency1);\n\n    /// @notice Thrown when a call to updateDynamicLPFee is made by an address that is not the hook,\n    /// or on a pool that does not have a dynamic swap fee.\n    error UnauthorizedDynamicLPFeeUpdate();\n\n    /// @notice Thrown when trying to swap amount of 0\n    error SwapAmountCannotBeZero();\n\n    ///@notice Thrown when native currency is passed to a non native settlement\n    error NonzeroNativeValue();\n\n    /// @notice Thrown when `clear` is called with an amount that is not exactly equal to the open currency delta.\n    error MustClearExactPositiveDelta();\n\n    /// @notice Emitted when a new pool is initialized\n    /// @param id The abi encoded hash of the pool key struct for the new pool\n    /// @param currency0 The first currency of the pool by address sort order\n    /// @param currency1 The second currency of the pool by address sort order\n    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip\n    /// @param tickSpacing The minimum number of ticks between initialized ticks\n    /// @param hooks The hooks contract address for the pool, or address(0) if none\n    /// @param sqrtPriceX96 The price of the pool on initialization\n    /// @param tick The initial tick of the pool corresponding to the initialized price\n    event Initialize(\n        PoolId indexed id,\n        Currency indexed currency0,\n        Currency indexed currency1,\n        uint24 fee,\n        int24 tickSpacing,\n        IHooks hooks,\n        uint160 sqrtPriceX96,\n        int24 tick\n    );\n\n    /// @notice Emitted when a liquidity position is modified\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that modified the pool\n    /// @param tickLower The lower tick of the position\n    /// @param tickUpper The upper tick of the position\n    /// @param liquidityDelta The amount of liquidity that was added or removed\n    /// @param salt The extra data to make positions unique\n    event ModifyLiquidity(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Emitted for swaps between currency0 and currency1\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that initiated the swap call, and that received the callback\n    /// @param amount0 The delta of the currency0 balance of the pool\n    /// @param amount1 The delta of the currency1 balance of the pool\n    /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n    /// @param liquidity The liquidity of the pool after the swap\n    /// @param tick The log base 1.0001 of the price of the pool after the swap\n    /// @param fee The swap fee in hundredths of a bip\n    event Swap(\n        PoolId indexed id,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    /// @notice Emitted for donations\n    /// @param id The abi encoded hash of the pool key struct for the pool that was donated to\n    /// @param sender The address that initiated the donate call\n    /// @param amount0 The amount donated in currency0\n    /// @param amount1 The amount donated in currency1\n    event Donate(PoolId indexed id, address indexed sender, uint256 amount0, uint256 amount1);\n\n    /// @notice All interactions on the contract that account deltas require unlocking. A caller that calls `unlock` must implement\n    /// `IUnlockCallback(msg.sender).unlockCallback(data)`, where they interact with the remaining functions on this contract.\n    /// @dev The only functions callable without an unlocking are `initialize` and `updateDynamicLPFee`\n    /// @param data Any data to pass to the callback, via `IUnlockCallback(msg.sender).unlockCallback(data)`\n    /// @return The data returned by the call to `IUnlockCallback(msg.sender).unlockCallback(data)`\n    function unlock(bytes calldata data) external returns (bytes memory);\n\n    /// @notice Initialize the state for a given pool ID\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The pool key for the pool to initialize\n    /// @param sqrtPriceX96 The initial square root price\n    /// @return tick The initial tick of the pool\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external returns (int24 tick);\n\n    /// @notice Modify the liquidity for the given pool\n    /// @dev Poke by calling with a zero liquidityDelta\n    /// @param key The pool to modify liquidity in\n    /// @param params The parameters for modifying the liquidity\n    /// @param hookData The data to pass through to the add/removeLiquidity hooks\n    /// @return callerDelta The balance delta of the caller of modifyLiquidity. This is the total of both principal, fee deltas, and hook deltas if applicable\n    /// @return feesAccrued The balance delta of the fees generated in the liquidity range. Returned for informational purposes\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious actor and integrators should be careful using the value\n    /// For pools with a single liquidity position, actors can donate to themselves to inflate feeGrowthGlobal (and consequently feesAccrued)\n    /// atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued);\n\n    /// @notice Swap against the given pool\n    /// @param key The pool to swap in\n    /// @param params The parameters for swapping\n    /// @param hookData The data to pass through to the swap hooks\n    /// @return swapDelta The balance delta of the address swapping\n    /// @dev Swapping on low liquidity pools may cause unexpected swap amounts when liquidity available is less than amountSpecified.\n    /// Additionally note that if interacting with hooks that have the BEFORE_SWAP_RETURNS_DELTA_FLAG or AFTER_SWAP_RETURNS_DELTA_FLAG\n    /// the hook may alter the swap input/output. Integrators should perform checks on the returned swapDelta.\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta swapDelta);\n\n    /// @notice Donate the given currency amounts to the in-range liquidity providers of a pool\n    /// @dev Calls to donate can be frontrun adding just-in-time liquidity, with the aim of receiving a portion donated funds.\n    /// Donors should keep this in mind when designing donation mechanisms.\n    /// @dev This function donates to in-range LPs at slot0.tick. In certain edge-cases of the swap algorithm, the `sqrtPrice` of\n    /// a pool can be at the lower boundary of tick `n`, but the `slot0.tick` of the pool is already `n - 1`. In this case a call to\n    /// `donate` would donate to tick `n - 1` (slot0.tick) not tick `n` (getTickAtSqrtPrice(slot0.sqrtPriceX96)).\n    /// Read the comments in `Pool.swap()` for more information about this.\n    /// @param key The key of the pool to donate to\n    /// @param amount0 The amount of currency0 to donate\n    /// @param amount1 The amount of currency1 to donate\n    /// @param hookData The data to pass through to the donate hooks\n    /// @return BalanceDelta The delta of the caller after the donate\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        returns (BalanceDelta);\n\n    /// @notice Writes the current ERC20 balance of the specified currency to transient storage\n    /// This is used to checkpoint balances for the manager and derive deltas for the caller.\n    /// @dev This MUST be called before any ERC20 tokens are sent into the contract, but can be skipped\n    /// for native tokens because the amount to settle is determined by the sent value.\n    /// However, if an ERC20 token has been synced and not settled, and the caller instead wants to settle\n    /// native funds, this function can be called with the native currency to then be able to settle the native currency\n    function sync(Currency currency) external;\n\n    /// @notice Called by the user to net out some value owed to the user\n    /// @dev Will revert if the requested amount is not available, consider using `mint` instead\n    /// @dev Can also be used as a mechanism for free flash loans\n    /// @param currency The currency to withdraw from the pool manager\n    /// @param to The address to withdraw to\n    /// @param amount The amount of currency to withdraw\n    function take(Currency currency, address to, uint256 amount) external;\n\n    /// @notice Called by the user to pay what is owed\n    /// @return paid The amount of currency settled\n    function settle() external payable returns (uint256 paid);\n\n    /// @notice Called by the user to pay on behalf of another address\n    /// @param recipient The address to credit for the payment\n    /// @return paid The amount of currency settled\n    function settleFor(address recipient) external payable returns (uint256 paid);\n\n    /// @notice WARNING - Any currency that is cleared, will be non-retrievable, and locked in the contract permanently.\n    /// A call to clear will zero out a positive balance WITHOUT a corresponding transfer.\n    /// @dev This could be used to clear a balance that is considered dust.\n    /// Additionally, the amount must be the exact positive balance. This is to enforce that the caller is aware of the amount being cleared.\n    function clear(Currency currency, uint256 amount) external;\n\n    /// @notice Called by the user to move value into ERC6909 balance\n    /// @param to The address to mint the tokens to\n    /// @param id The currency address to mint to ERC6909s, as a uint256\n    /// @param amount The amount of currency to mint\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function mint(address to, uint256 id, uint256 amount) external;\n\n    /// @notice Called by the user to move value from ERC6909 balance\n    /// @param from The address to burn the tokens from\n    /// @param id The currency address to burn from ERC6909s, as a uint256\n    /// @param amount The amount of currency to burn\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function burn(address from, uint256 id, uint256 amount) external;\n\n    /// @notice Updates the pools lp fees for the a pool that has enabled dynamic lp fees.\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The key of the pool to update dynamic LP fees for\n    /// @param newDynamicLPFee The new dynamic pool LP fee\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IProtocolFees.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\n\n/// @notice Interface for all protocol-fee related functions in the pool manager\ninterface IProtocolFees {\n    /// @notice Thrown when protocol fee is set too high\n    error ProtocolFeeTooLarge(uint24 fee);\n\n    /// @notice Thrown when collectProtocolFees or setProtocolFee is not called by the controller.\n    error InvalidCaller();\n\n    /// @notice Thrown when collectProtocolFees is attempted on a token that is synced.\n    error ProtocolFeeCurrencySynced();\n\n    /// @notice Emitted when the protocol fee controller address is updated in setProtocolFeeController.\n    event ProtocolFeeControllerUpdated(address indexed protocolFeeController);\n\n    /// @notice Emitted when the protocol fee is updated for a pool.\n    event ProtocolFeeUpdated(PoolId indexed id, uint24 protocolFee);\n\n    /// @notice Given a currency address, returns the protocol fees accrued in that currency\n    /// @param currency The currency to check\n    /// @return amount The amount of protocol fees accrued in the currency\n    function protocolFeesAccrued(Currency currency) external view returns (uint256 amount);\n\n    /// @notice Sets the protocol fee for the given pool\n    /// @param key The key of the pool to set a protocol fee for\n    /// @param newProtocolFee The fee to set\n    function setProtocolFee(PoolKey memory key, uint24 newProtocolFee) external;\n\n    /// @notice Sets the protocol fee controller\n    /// @param controller The new protocol fee controller\n    function setProtocolFeeController(address controller) external;\n\n    /// @notice Collects the protocol fees for a given recipient and currency, returning the amount collected\n    /// @dev This will revert if the contract is unlocked\n    /// @param recipient The address to receive the protocol fees\n    /// @param currency The currency to withdraw\n    /// @param amount The amount of currency to withdraw\n    /// @return amountCollected The amount of currency successfully withdrawn\n    function collectProtocolFees(address recipient, Currency currency, uint256 amount)\n        external\n        returns (uint256 amountCollected);\n\n    /// @notice Returns the current protocol fee controller address\n    /// @return address The current protocol fee controller address\n    function protocolFeeController() external view returns (address);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for the callback executed when an address unlocks the pool manager\ninterface IUnlockCallback {\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    /// @param data The data that was passed to the call to unlock\n    /// @return Any data that you want to be returned from the unlock call\n    function unlockCallback(bytes calldata data) external returns (bytes memory);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Minimal ERC20 interface for Uniswap\n/// @notice Contains a subset of the full ERC20 interface that is used in Uniswap V3\ninterface IERC20Minimal {\n    /// @notice Returns an account's balance in the token\n    /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n    /// @return The number of tokens held by the account\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n    /// @param recipient The account that will receive the amount transferred\n    /// @param amount The number of tokens to send from the sender to the recipient\n    /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Returns the current allowance given to a spender by an owner\n    /// @param owner The account of the token owner\n    /// @param spender The account of the token spender\n    /// @return The current allowance granted by `owner` to `spender`\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n    /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n    /// @param amount The amount of tokens allowed to be used by `spender`\n    /// @return Returns true for a successful approval, false for unsuccessful\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n    /// @param sender The account from which the transfer will be initiated\n    /// @param recipient The recipient of the transfer\n    /// @param amount The amount of the transfer\n    /// @return Returns true for a successful transfer, false for unsuccessful\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n    /// @param from The account from which the tokens were sent, i.e. the balance decreased\n    /// @param to The account to which the tokens were sent, i.e. the balance increased\n    /// @param value The amount of tokens that were transferred\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n    /// @param owner The account that approved spending of its tokens\n    /// @param spender The account for which the spending allowance was modified\n    /// @param value The new allowance from the owner to the spender\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for claims over a contract balance, wrapped as a ERC6909\ninterface IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event OperatorSet(address indexed owner, address indexed operator, bool approved);\n\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);\n\n    event Transfer(address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount);\n\n    /*//////////////////////////////////////////////////////////////\n                                 FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice Owner balance of an id.\n    /// @param owner The address of the owner.\n    /// @param id The id of the token.\n    /// @return amount The balance of the token.\n    function balanceOf(address owner, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Spender allowance of an id.\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @return amount The allowance of the token.\n    function allowance(address owner, address spender, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Checks if a spender is approved by an owner as an operator\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @return approved The approval status.\n    function isOperator(address owner, address spender) external view returns (bool approved);\n\n    /// @notice Transfers an amount of an id from the caller to a receiver.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Transfers an amount of an id from a sender to a receiver.\n    /// @param sender The address of the sender.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Approves an amount of an id to a spender.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always\n    function approve(address spender, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Sets or removes an operator for the caller.\n    /// @param operator The address of the operator.\n    /// @param approved The approval status.\n    /// @return bool True, always\n    function setOperator(address operator, bool approved) external returns (bool);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/BitMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title BitMath\n/// @dev This library provides functionality for computing bit properties of an unsigned integer\n/// @author Solady (https://github.com/Vectorized/solady/blob/8200a70e8dc2a77ecb074fc2e99a2a0d36547522/src/utils/LibBit.sol)\nlibrary BitMath {\n    /// @notice Returns the index of the most significant bit of the number,\n    ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n    /// @param x the value for which to compute the most significant bit, must be greater than 0\n    /// @return r the index of the most significant bit\n    function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n        require(x > 0);\n\n        assembly (\"memory-safe\") {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0x0706060506020500060203020504000106050205030304010505030400000000))\n        }\n    }\n\n    /// @notice Returns the index of the least significant bit of the number,\n    ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n    /// @param x the value for which to compute the least significant bit, must be greater than 0\n    /// @return r the index of the least significant bit\n    function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n        require(x > 0);\n\n        assembly (\"memory-safe\") {\n            // Isolate the least significant bit.\n            x := and(x, sub(0, x))\n            // For the upper 3 bits of the result, use a De Bruijn-like lookup.\n            // Credit to adhusson: https://blog.adhusson.com/cheap-find-first-set-evm/\n            // forgefmt: disable-next-item\n            r := shl(5, shr(252, shl(shl(2, shr(250, mul(x,\n                0xb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff))),\n                0x8040405543005266443200005020610674053026020000107506200176117077)))\n            // For the lower 5 bits of the result, use a De Bruijn lookup.\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(div(0xd76453e0, shr(r, x)), 0x1f),\n                0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405))\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CurrencyReserves.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\nlibrary CurrencyReserves {\n    using CustomRevert for bytes4;\n\n    /// bytes32(uint256(keccak256(\"ReservesOf\")) - 1)\n    bytes32 constant RESERVES_OF_SLOT = 0x1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd95;\n    /// bytes32(uint256(keccak256(\"Currency\")) - 1)\n    bytes32 constant CURRENCY_SLOT = 0x27e098c505d44ec3574004bca052aabf76bd35004c182099d8c575fb238593b9;\n\n    function getSyncedCurrency() internal view returns (Currency currency) {\n        assembly (\"memory-safe\") {\n            currency := tload(CURRENCY_SLOT)\n        }\n    }\n\n    function resetCurrency() internal {\n        assembly (\"memory-safe\") {\n            tstore(CURRENCY_SLOT, 0)\n        }\n    }\n\n    function syncCurrencyAndReserves(Currency currency, uint256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(CURRENCY_SLOT, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            tstore(RESERVES_OF_SLOT, value)\n        }\n    }\n\n    function getSyncedReserves() internal view returns (uint256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(RESERVES_OF_SLOT)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CustomRevert.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Library for reverting with custom errors efficiently\n/// @notice Contains functions for reverting with custom errors with different argument types efficiently\n/// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with\n/// `CustomError.selector.revertWith()`\n/// @dev The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\nlibrary CustomRevert {\n    /// @dev ERC-7751 error for wrapping bubbled up reverts\n    error WrappedError(address target, bytes4 selector, bytes reason, bytes details);\n\n    /// @dev Reverts with the selector of a custom error in the scratch space\n    function revertWith(bytes4 selector) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            revert(0, 0x04)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an address argument in the scratch space\n    function revertWith(bytes4 selector, address addr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an int24 argument in the scratch space\n    function revertWith(bytes4 selector, int24 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, signextend(2, value))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with a uint160 argument in the scratch space\n    function revertWith(bytes4 selector, uint160 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two int24 arguments\n    function revertWith(bytes4 selector, int24 value1, int24 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), signextend(2, value1))\n            mstore(add(fmp, 0x24), signextend(2, value2))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two uint160 arguments\n    function revertWith(bytes4 selector, uint160 value1, uint160 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two address arguments\n    function revertWith(bytes4 selector, address value1, address value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @notice bubble up the revert message returned by a call and revert with a wrapped ERC-7751 error\n    /// @dev this method can be vulnerable to revert data bombs\n    function bubbleUpAndRevertWith(\n        address revertingContract,\n        bytes4 revertingFunctionSelector,\n        bytes4 additionalContext\n    ) internal pure {\n        bytes4 wrappedErrorSelector = WrappedError.selector;\n        assembly (\"memory-safe\") {\n            // Ensure the size of the revert data is a multiple of 32 bytes\n            let encodedDataSize := mul(div(add(returndatasize(), 31), 32), 32)\n\n            let fmp := mload(0x40)\n\n            // Encode wrapped error selector, address, function selector, offset, additional context, size, revert reason\n            mstore(fmp, wrappedErrorSelector)\n            mstore(add(fmp, 0x04), and(revertingContract, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(\n                add(fmp, 0x24),\n                and(revertingFunctionSelector, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            // offset revert reason\n            mstore(add(fmp, 0x44), 0x80)\n            // offset additional context\n            mstore(add(fmp, 0x64), add(0xa0, encodedDataSize))\n            // size revert reason\n            mstore(add(fmp, 0x84), returndatasize())\n            // revert reason\n            returndatacopy(add(fmp, 0xa4), 0, returndatasize())\n            // size additional context\n            mstore(add(fmp, add(0xa4, encodedDataSize)), 0x04)\n            // additional context\n            mstore(\n                add(fmp, add(0xc4, encodedDataSize)),\n                and(additionalContext, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            revert(fmp, add(0xe4, encodedDataSize))\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint128.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n    uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint96.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint96\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\n/// @dev Used in SqrtPriceMath.sol\nlibrary FixedPoint96 {\n    uint8 internal constant RESOLUTION = 96;\n    uint256 internal constant Q96 = 0x1000000000000000000000000;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FullMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n    function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = a * b\n            // Compute the product mod 2**256 and mod 2**256 - 1\n            // then use the Chinese Remainder Theorem to reconstruct\n            // the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2**256 + prod0\n            uint256 prod0 = a * b; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly (\"memory-safe\") {\n                let mm := mulmod(a, b, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Make sure the result is less than 2**256.\n            // Also prevents denominator == 0\n            require(denominator > prod1);\n\n            // Handle non-overflow cases, 256 by 256 division\n            if (prod1 == 0) {\n                assembly (\"memory-safe\") {\n                    result := div(prod0, denominator)\n                }\n                return result;\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0]\n            // Compute remainder using mulmod\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                remainder := mulmod(a, b, denominator)\n            }\n            // Subtract 256 bit number from 512 bit number\n            assembly (\"memory-safe\") {\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator\n            // Compute largest power of two divisor of denominator.\n            // Always >= 1.\n            uint256 twos = (0 - denominator) & denominator;\n            // Divide denominator by power of two\n            assembly (\"memory-safe\") {\n                denominator := div(denominator, twos)\n            }\n\n            // Divide [prod1 prod0] by the factors of two\n            assembly (\"memory-safe\") {\n                prod0 := div(prod0, twos)\n            }\n            // Shift in bits from prod1 into prod0. For this we need\n            // to flip `twos` such that it is 2**256 / twos.\n            // If twos is zero, then it becomes one\n            assembly (\"memory-safe\") {\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2**256\n            // Now that denominator is an odd number, it has an inverse\n            // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n            // Compute the inverse by starting with a seed that is correct\n            // correct for four bits. That is, denominator * inv = 1 mod 2**4\n            uint256 inv = (3 * denominator) ^ 2;\n            // Now use Newton-Raphson iteration to improve the precision.\n            // Thanks to Hensel's lifting lemma, this also works in modular\n            // arithmetic, doubling the correct bits in each step.\n            inv *= 2 - denominator * inv; // inverse mod 2**8\n            inv *= 2 - denominator * inv; // inverse mod 2**16\n            inv *= 2 - denominator * inv; // inverse mod 2**32\n            inv *= 2 - denominator * inv; // inverse mod 2**64\n            inv *= 2 - denominator * inv; // inverse mod 2**128\n            inv *= 2 - denominator * inv; // inverse mod 2**256\n\n            // Because the division is now exact we can divide by multiplying\n            // with the modular inverse of denominator. This will give us the\n            // correct result modulo 2**256. Since the preconditions guarantee\n            // that the outcome is less than 2**256, this is the final result.\n            // We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inv;\n            return result;\n        }\n    }\n\n    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            result = mulDiv(a, b, denominator);\n            if (mulmod(a, b, denominator) != 0) {\n                require(++result > 0);\n            }\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LPFeeLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice Library of helper functions for a pools LP fee\nlibrary LPFeeLibrary {\n    using LPFeeLibrary for uint24;\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the static or dynamic fee on a pool exceeds 100%.\n    error LPFeeTooLarge(uint24 fee);\n\n    /// @notice An lp fee of exactly 0b1000000... signals a dynamic fee pool. This isn't a valid static fee as it is > MAX_LP_FEE\n    uint24 public constant DYNAMIC_FEE_FLAG = 0x800000;\n\n    /// @notice the second bit of the fee returned by beforeSwap is used to signal if the stored LP fee should be overridden in this swap\n    // only dynamic-fee pools can return a fee via the beforeSwap hook\n    uint24 public constant OVERRIDE_FEE_FLAG = 0x400000;\n\n    /// @notice mask to remove the override fee flag from a fee returned by the beforeSwaphook\n    uint24 public constant REMOVE_OVERRIDE_MASK = 0xBFFFFF;\n\n    /// @notice the lp fee is represented in hundredths of a bip, so the max is 100%\n    uint24 public constant MAX_LP_FEE = 1000000;\n\n    /// @notice returns true if a pool's LP fee signals that the pool has a dynamic fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is dynamic\n    function isDynamicFee(uint24 self) internal pure returns (bool) {\n        return self == DYNAMIC_FEE_FLAG;\n    }\n\n    /// @notice returns true if an LP fee is valid, aka not above the maximum permitted fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is valid\n    function isValid(uint24 self) internal pure returns (bool) {\n        return self <= MAX_LP_FEE;\n    }\n\n    /// @notice validates whether an LP fee is larger than the maximum, and reverts if invalid\n    /// @param self The fee to validate\n    function validate(uint24 self) internal pure {\n        if (!self.isValid()) LPFeeTooLarge.selector.revertWith(self);\n    }\n\n    /// @notice gets and validates the initial LP fee for a pool. Dynamic fee pools have an initial fee of 0.\n    /// @dev if a dynamic fee pool wants a non-0 initial fee, it should call `updateDynamicLPFee` in the afterInitialize hook\n    /// @param self The fee to get the initial LP from\n    /// @return initialFee 0 if the fee is dynamic, otherwise the fee (if valid)\n    function getInitialLPFee(uint24 self) internal pure returns (uint24) {\n        // the initial fee for a dynamic fee pool is 0\n        if (self.isDynamicFee()) return 0;\n        self.validate();\n        return self;\n    }\n\n    /// @notice returns true if the fee has the override flag set (2nd highest bit of the uint24)\n    /// @param self The fee to check\n    /// @return bool True of the fee has the override flag set\n    function isOverride(uint24 self) internal pure returns (bool) {\n        return self & OVERRIDE_FEE_FLAG != 0;\n    }\n\n    /// @notice returns a fee with the override flag removed\n    /// @param self The fee to remove the override flag from\n    /// @return fee The fee without the override flag set\n    function removeOverrideFlag(uint24 self) internal pure returns (uint24) {\n        return self & REMOVE_OVERRIDE_MASK;\n    }\n\n    /// @notice Removes the override flag and validates the fee (reverts if the fee is too large)\n    /// @param self The fee to remove the override flag from, and then validate\n    /// @return fee The fee without the override flag set (if valid)\n    function removeOverrideFlagAndValidate(uint24 self) internal pure returns (uint24 fee) {\n        fee = self.removeOverrideFlag();\n        fee.validate();\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LiquidityMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n    /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n    /// @param x The liquidity before change\n    /// @param y The delta by which liquidity should be changed\n    /// @return z The liquidity delta\n    function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n        assembly (\"memory-safe\") {\n            z := add(and(x, 0xffffffffffffffffffffffffffffffff), signextend(15, y))\n            if shr(128, z) {\n                // revert SafeCastOverflow()\n                mstore(0, 0x93dafdf1)\n                revert(0x1c, 0x04)\n            }\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Lock.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\n/// @notice This is a temporary library that allows us to use transient storage (tstore/tload)\n/// TODO: This library can be deleted when we have the transient keyword support in solidity.\nlibrary Lock {\n    // The slot holding the unlocked state, transiently. bytes32(uint256(keccak256(\"Unlocked\")) - 1)\n    bytes32 internal constant IS_UNLOCKED_SLOT = 0xc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab23;\n\n    function unlock() internal {\n        assembly (\"memory-safe\") {\n            // unlock\n            tstore(IS_UNLOCKED_SLOT, true)\n        }\n    }\n\n    function lock() internal {\n        assembly (\"memory-safe\") {\n            tstore(IS_UNLOCKED_SLOT, false)\n        }\n    }\n\n    function isUnlocked() internal view returns (bool unlocked) {\n        assembly (\"memory-safe\") {\n            unlocked := tload(IS_UNLOCKED_SLOT)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/NonzeroDeltaCount.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\n/// @notice This is a temporary library that allows us to use transient storage (tstore/tload)\n/// for the nonzero delta count.\n/// TODO: This library can be deleted when we have the transient keyword support in solidity.\nlibrary NonzeroDeltaCount {\n    // The slot holding the number of nonzero deltas. bytes32(uint256(keccak256(\"NonzeroDeltaCount\")) - 1)\n    bytes32 internal constant NONZERO_DELTA_COUNT_SLOT =\n        0x7d4b3164c6e45b97e7d87b7125a44c5828d005af88f9d751cfd78729c5d99a0b;\n\n    function read() internal view returns (uint256 count) {\n        assembly (\"memory-safe\") {\n            count := tload(NONZERO_DELTA_COUNT_SLOT)\n        }\n    }\n\n    function increment() internal {\n        assembly (\"memory-safe\") {\n            let count := tload(NONZERO_DELTA_COUNT_SLOT)\n            count := add(count, 1)\n            tstore(NONZERO_DELTA_COUNT_SLOT, count)\n        }\n    }\n\n    /// @notice Potential to underflow. Ensure checks are performed by integrating contracts to ensure this does not happen.\n    /// Current usage ensures this will not happen because we call decrement with known boundaries (only up to the number of times we call increment).\n    function decrement() internal {\n        assembly (\"memory-safe\") {\n            let count := tload(NONZERO_DELTA_COUNT_SLOT)\n            count := sub(count, 1)\n            tstore(NONZERO_DELTA_COUNT_SLOT, count)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Position.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {FixedPoint128} from \"./FixedPoint128.sol\";\nimport {LiquidityMath} from \"./LiquidityMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n    using CustomRevert for bytes4;\n\n    /// @notice Cannot update a position with no liquidity\n    error CannotUpdateEmptyPosition();\n\n    // info stored for each user's position\n    struct State {\n        // the amount of liquidity owned by this position\n        uint128 liquidity;\n        // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n        uint256 feeGrowthInside0LastX128;\n        uint256 feeGrowthInside1LastX128;\n    }\n\n    /// @notice Returns the State struct of a position, given an owner and position boundaries\n    /// @param self The mapping containing all user positions\n    /// @param owner The address of the position owner\n    /// @param tickLower The lower tick boundary of the position\n    /// @param tickUpper The upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range\n    /// @return position The position info struct of the given owners' position\n    function get(mapping(bytes32 => State) storage self, address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        view\n        returns (State storage position)\n    {\n        bytes32 positionKey = calculatePositionKey(owner, tickLower, tickUpper, salt);\n        position = self[positionKey];\n    }\n\n    /// @notice A helper function to calculate the position key\n    /// @param owner The address of the position owner\n    /// @param tickLower the lower tick boundary of the position\n    /// @param tickUpper the upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range, by the same owner. Passed in by the caller.\n    function calculatePositionKey(address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        pure\n        returns (bytes32 positionKey)\n    {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(add(fmp, 0x26), salt) // [0x26, 0x46)\n            mstore(add(fmp, 0x06), tickUpper) // [0x23, 0x26)\n            mstore(add(fmp, 0x03), tickLower) // [0x20, 0x23)\n            mstore(fmp, owner) // [0x0c, 0x20)\n            positionKey := keccak256(add(fmp, 0x0c), 0x3a) // len is 58 bytes\n\n            // now clean the memory we used\n            mstore(add(fmp, 0x40), 0) // fmp+0x40 held salt\n            mstore(add(fmp, 0x20), 0) // fmp+0x20 held tickLower, tickUpper, salt\n            mstore(fmp, 0) // fmp held owner\n        }\n    }\n\n    /// @notice Credits accumulated fees to a user's position\n    /// @param self The individual position to update\n    /// @param liquidityDelta The change in pool liquidity as a result of the position update\n    /// @param feeGrowthInside0X128 The all-time fee growth in currency0, per unit of liquidity, inside the position's tick boundaries\n    /// @param feeGrowthInside1X128 The all-time fee growth in currency1, per unit of liquidity, inside the position's tick boundaries\n    /// @return feesOwed0 The amount of currency0 owed to the position owner\n    /// @return feesOwed1 The amount of currency1 owed to the position owner\n    function update(\n        State storage self,\n        int128 liquidityDelta,\n        uint256 feeGrowthInside0X128,\n        uint256 feeGrowthInside1X128\n    ) internal returns (uint256 feesOwed0, uint256 feesOwed1) {\n        uint128 liquidity = self.liquidity;\n\n        if (liquidityDelta == 0) {\n            // disallow pokes for 0 liquidity positions\n            if (liquidity == 0) CannotUpdateEmptyPosition.selector.revertWith();\n        } else {\n            self.liquidity = LiquidityMath.addDelta(liquidity, liquidityDelta);\n        }\n\n        // calculate accumulated fees. overflow in the subtraction of fee growth is expected\n        unchecked {\n            feesOwed0 =\n                FullMath.mulDiv(feeGrowthInside0X128 - self.feeGrowthInside0LastX128, liquidity, FixedPoint128.Q128);\n            feesOwed1 =\n                FullMath.mulDiv(feeGrowthInside1X128 - self.feeGrowthInside1LastX128, liquidity, FixedPoint128.Q128);\n        }\n\n        // update the position\n        self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n        self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n    using CustomRevert for bytes4;\n\n    error SafeCastOverflow();\n\n    /// @notice Cast a uint256 to a uint160, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint160\n    function toUint160(uint256 x) internal pure returns (uint160 y) {\n        y = uint160(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a uint128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint128\n    function toUint128(uint256 x) internal pure returns (uint128 y) {\n        y = uint128(x);\n        if (x != y) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a int128 to a uint128, revert on overflow or underflow\n    /// @param x The int128 to be casted\n    /// @return y The casted integer, now type uint128\n    function toUint128(int128 x) internal pure returns (uint128 y) {\n        if (x < 0) SafeCastOverflow.selector.revertWith();\n        y = uint128(x);\n    }\n\n    /// @notice Cast a int256 to a int128, revert on overflow or underflow\n    /// @param x The int256 to be downcasted\n    /// @return y The downcasted integer, now type int128\n    function toInt128(int256 x) internal pure returns (int128 y) {\n        y = int128(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int256, revert on overflow\n    /// @param x The uint256 to be casted\n    /// @return y The casted integer, now type int256\n    function toInt256(uint256 x) internal pure returns (int256 y) {\n        y = int256(x);\n        if (y < 0) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return The downcasted integer, now type int128\n    function toInt128(uint256 x) internal pure returns (int128) {\n        if (x >= 1 << 127) SafeCastOverflow.selector.revertWith();\n        return int128(int256(x));\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SqrtPriceMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {UnsafeMath} from \"./UnsafeMath.sol\";\nimport {FixedPoint96} from \"./FixedPoint96.sol\";\n\n/// @title Functions based on Q64.96 sqrt price and liquidity\n/// @notice Contains the math that uses square root of price as a Q64.96 and liquidity to compute deltas\nlibrary SqrtPriceMath {\n    using SafeCast for uint256;\n\n    error InvalidPriceOrLiquidity();\n    error InvalidPrice();\n    error NotEnoughLiquidity();\n    error PriceOverflow();\n\n    /// @notice Gets the next sqrt price given a delta of currency0\n    /// @dev Always rounds up, because in the exact output case (increasing price) we need to move the price at least\n    /// far enough to get the desired output amount, and in the exact input case (decreasing price) we need to move the\n    /// price less in order to not send too much output.\n    /// The most precise formula for this is liquidity * sqrtPX96 / (liquidity +- amount * sqrtPX96),\n    /// if this is impossible because of overflow, we calculate liquidity / (liquidity / sqrtPX96 +- amount).\n    /// @param sqrtPX96 The starting price, i.e. before accounting for the currency0 delta\n    /// @param liquidity The amount of usable liquidity\n    /// @param amount How much of currency0 to add or remove from virtual reserves\n    /// @param add Whether to add or remove the amount of currency0\n    /// @return The price after adding or removing amount, depending on add\n    function getNextSqrtPriceFromAmount0RoundingUp(uint160 sqrtPX96, uint128 liquidity, uint256 amount, bool add)\n        internal\n        pure\n        returns (uint160)\n    {\n        // we short circuit amount == 0 because the result is otherwise not guaranteed to equal the input price\n        if (amount == 0) return sqrtPX96;\n        uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n\n        if (add) {\n            unchecked {\n                uint256 product = amount * sqrtPX96;\n                if (product / amount == sqrtPX96) {\n                    uint256 denominator = numerator1 + product;\n                    if (denominator >= numerator1) {\n                        // always fits in 160 bits\n                        return uint160(FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n                    }\n                }\n            }\n            // denominator is checked for overflow\n            return uint160(UnsafeMath.divRoundingUp(numerator1, (numerator1 / sqrtPX96) + amount));\n        } else {\n            unchecked {\n                uint256 product = amount * sqrtPX96;\n                // if the product overflows, we know the denominator underflows\n                // in addition, we must check that the denominator does not underflow\n                // equivalent: if (product / amount != sqrtPX96 || numerator1 <= product) revert PriceOverflow();\n                assembly (\"memory-safe\") {\n                    if iszero(\n                        and(\n                            eq(div(product, amount), and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                            gt(numerator1, product)\n                        )\n                    ) {\n                        mstore(0, 0xf5c787f1) // selector for PriceOverflow()\n                        revert(0x1c, 0x04)\n                    }\n                }\n                uint256 denominator = numerator1 - product;\n                return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator).toUint160();\n            }\n        }\n    }\n\n    /// @notice Gets the next sqrt price given a delta of currency1\n    /// @dev Always rounds down, because in the exact output case (decreasing price) we need to move the price at least\n    /// far enough to get the desired output amount, and in the exact input case (increasing price) we need to move the\n    /// price less in order to not send too much output.\n    /// The formula we compute is within <1 wei of the lossless version: sqrtPX96 +- amount / liquidity\n    /// @param sqrtPX96 The starting price, i.e., before accounting for the currency1 delta\n    /// @param liquidity The amount of usable liquidity\n    /// @param amount How much of currency1 to add, or remove, from virtual reserves\n    /// @param add Whether to add, or remove, the amount of currency1\n    /// @return The price after adding or removing `amount`\n    function getNextSqrtPriceFromAmount1RoundingDown(uint160 sqrtPX96, uint128 liquidity, uint256 amount, bool add)\n        internal\n        pure\n        returns (uint160)\n    {\n        // if we're adding (subtracting), rounding down requires rounding the quotient down (up)\n        // in both cases, avoid a mulDiv for most inputs\n        if (add) {\n            uint256 quotient = (\n                amount <= type(uint160).max\n                    ? (amount << FixedPoint96.RESOLUTION) / liquidity\n                    : FullMath.mulDiv(amount, FixedPoint96.Q96, liquidity)\n            );\n\n            return (uint256(sqrtPX96) + quotient).toUint160();\n        } else {\n            uint256 quotient = (\n                amount <= type(uint160).max\n                    ? UnsafeMath.divRoundingUp(amount << FixedPoint96.RESOLUTION, liquidity)\n                    : FullMath.mulDivRoundingUp(amount, FixedPoint96.Q96, liquidity)\n            );\n\n            // equivalent: if (sqrtPX96 <= quotient) revert NotEnoughLiquidity();\n            assembly (\"memory-safe\") {\n                if iszero(gt(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff), quotient)) {\n                    mstore(0, 0x4323a555) // selector for NotEnoughLiquidity()\n                    revert(0x1c, 0x04)\n                }\n            }\n            // always fits 160 bits\n            unchecked {\n                return uint160(sqrtPX96 - quotient);\n            }\n        }\n    }\n\n    /// @notice Gets the next sqrt price given an input amount of currency0 or currency1\n    /// @dev Throws if price or liquidity are 0, or if the next price is out of bounds\n    /// @param sqrtPX96 The starting price, i.e., before accounting for the input amount\n    /// @param liquidity The amount of usable liquidity\n    /// @param amountIn How much of currency0, or currency1, is being swapped in\n    /// @param zeroForOne Whether the amount in is currency0 or currency1\n    /// @return uint160 The price after adding the input amount to currency0 or currency1\n    function getNextSqrtPriceFromInput(uint160 sqrtPX96, uint128 liquidity, uint256 amountIn, bool zeroForOne)\n        internal\n        pure\n        returns (uint160)\n    {\n        // equivalent: if (sqrtPX96 == 0 || liquidity == 0) revert InvalidPriceOrLiquidity();\n        assembly (\"memory-safe\") {\n            if or(\n                iszero(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                iszero(and(liquidity, 0xffffffffffffffffffffffffffffffff))\n            ) {\n                mstore(0, 0x4f2461b8) // selector for InvalidPriceOrLiquidity()\n                revert(0x1c, 0x04)\n            }\n        }\n\n        // round to make sure that we don't pass the target price\n        return zeroForOne\n            ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true)\n            : getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountIn, true);\n    }\n\n    /// @notice Gets the next sqrt price given an output amount of currency0 or currency1\n    /// @dev Throws if price or liquidity are 0 or the next price is out of bounds\n    /// @param sqrtPX96 The starting price before accounting for the output amount\n    /// @param liquidity The amount of usable liquidity\n    /// @param amountOut How much of currency0, or currency1, is being swapped out\n    /// @param zeroForOne Whether the amount out is currency1 or currency0\n    /// @return uint160 The price after removing the output amount of currency0 or currency1\n    function getNextSqrtPriceFromOutput(uint160 sqrtPX96, uint128 liquidity, uint256 amountOut, bool zeroForOne)\n        internal\n        pure\n        returns (uint160)\n    {\n        // equivalent: if (sqrtPX96 == 0 || liquidity == 0) revert InvalidPriceOrLiquidity();\n        assembly (\"memory-safe\") {\n            if or(\n                iszero(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                iszero(and(liquidity, 0xffffffffffffffffffffffffffffffff))\n            ) {\n                mstore(0, 0x4f2461b8) // selector for InvalidPriceOrLiquidity()\n                revert(0x1c, 0x04)\n            }\n        }\n\n        // round to make sure that we pass the target price\n        return zeroForOne\n            ? getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountOut, false)\n            : getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountOut, false);\n    }\n\n    /// @notice Gets the amount0 delta between two prices\n    /// @dev Calculates liquidity / sqrt(lower) - liquidity / sqrt(upper),\n    /// i.e. liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The amount of usable liquidity\n    /// @param roundUp Whether to round the amount up or down\n    /// @return uint256 Amount of currency0 required to cover a position of size liquidity between the two passed prices\n    function getAmount0Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity, bool roundUp)\n        internal\n        pure\n        returns (uint256)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n            // equivalent: if (sqrtPriceAX96 == 0) revert InvalidPrice();\n            assembly (\"memory-safe\") {\n                if iszero(and(sqrtPriceAX96, 0xffffffffffffffffffffffffffffffffffffffff)) {\n                    mstore(0, 0x00bfc921) // selector for InvalidPrice()\n                    revert(0x1c, 0x04)\n                }\n            }\n\n            uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n            uint256 numerator2 = sqrtPriceBX96 - sqrtPriceAX96;\n\n            return roundUp\n                ? UnsafeMath.divRoundingUp(FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtPriceBX96), sqrtPriceAX96)\n                : FullMath.mulDiv(numerator1, numerator2, sqrtPriceBX96) / sqrtPriceAX96;\n        }\n    }\n\n    /// @notice Equivalent to: `a >= b ? a - b : b - a`\n    function absDiff(uint160 a, uint160 b) internal pure returns (uint256 res) {\n        assembly (\"memory-safe\") {\n            let diff :=\n                sub(and(a, 0xffffffffffffffffffffffffffffffffffffffff), and(b, 0xffffffffffffffffffffffffffffffffffffffff))\n            // mask = 0 if a >= b else -1 (all 1s)\n            let mask := sar(255, diff)\n            // if a >= b, res = a - b = 0 ^ (a - b)\n            // if a < b, res = b - a = ~~(b - a) = ~(-(b - a) - 1) = ~(a - b - 1) = (-1) ^ (a - b - 1)\n            // either way, res = mask ^ (a - b + mask)\n            res := xor(mask, add(mask, diff))\n        }\n    }\n\n    /// @notice Gets the amount1 delta between two prices\n    /// @dev Calculates liquidity * (sqrt(upper) - sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The amount of usable liquidity\n    /// @param roundUp Whether to round the amount up, or down\n    /// @return amount1 Amount of currency1 required to cover a position of size liquidity between the two passed prices\n    function getAmount1Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity, bool roundUp)\n        internal\n        pure\n        returns (uint256 amount1)\n    {\n        uint256 numerator = absDiff(sqrtPriceAX96, sqrtPriceBX96);\n        uint256 denominator = FixedPoint96.Q96;\n        uint256 _liquidity = uint256(liquidity);\n\n        /**\n         * Equivalent to:\n         *   amount1 = roundUp\n         *       ? FullMath.mulDivRoundingUp(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96)\n         *       : FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96);\n         * Cannot overflow because `type(uint128).max * type(uint160).max >> 96 < (1 << 192)`.\n         */\n        amount1 = FullMath.mulDiv(_liquidity, numerator, denominator);\n        assembly (\"memory-safe\") {\n            amount1 := add(amount1, and(gt(mulmod(_liquidity, numerator, denominator), 0), roundUp))\n        }\n    }\n\n    /// @notice Helper that gets signed currency0 delta\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The change in liquidity for which to compute the amount0 delta\n    /// @return int256 Amount of currency0 corresponding to the passed liquidityDelta between the two prices\n    function getAmount0Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, int128 liquidity)\n        internal\n        pure\n        returns (int256)\n    {\n        unchecked {\n            return liquidity < 0\n                ? getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(-liquidity), false).toInt256()\n                : -getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(liquidity), true).toInt256();\n        }\n    }\n\n    /// @notice Helper that gets signed currency1 delta\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The change in liquidity for which to compute the amount1 delta\n    /// @return int256 Amount of currency1 corresponding to the passed liquidityDelta between the two prices\n    function getAmount1Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, int128 liquidity)\n        internal\n        pure\n        returns (int256)\n    {\n        unchecked {\n            return liquidity < 0\n                ? getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(-liquidity), false).toInt256()\n                : -getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(liquidity), true).toInt256();\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/StateLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Position} from \"./Position.sol\";\n\n/// @notice A helper library to provide state getters that use extsload\nlibrary StateLibrary {\n    /// @notice index of pools mapping in the PoolManager\n    bytes32 public constant POOLS_SLOT = bytes32(uint256(6));\n\n    /// @notice index of feeGrowthGlobal0X128 in Pool.State\n    uint256 public constant FEE_GROWTH_GLOBAL0_OFFSET = 1;\n\n    // feeGrowthGlobal1X128 offset in Pool.State = 2\n\n    /// @notice index of liquidity in Pool.State\n    uint256 public constant LIQUIDITY_OFFSET = 3;\n\n    /// @notice index of TicksInfo mapping in Pool.State: mapping(int24 => TickInfo) ticks;\n    uint256 public constant TICKS_OFFSET = 4;\n\n    /// @notice index of tickBitmap mapping in Pool.State\n    uint256 public constant TICK_BITMAP_OFFSET = 5;\n\n    /// @notice index of Position.State mapping in Pool.State: mapping(bytes32 => Position.State) positions;\n    uint256 public constant POSITIONS_OFFSET = 6;\n\n    /**\n     * @notice Get Slot0 of the pool: sqrtPriceX96, tick, protocolFee, lpFee\n     * @dev Corresponds to pools[poolId].slot0\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return sqrtPriceX96 The square root of the price of the pool, in Q96 precision.\n     * @return tick The current tick of the pool.\n     * @return protocolFee The protocol fee of the pool.\n     * @return lpFee The swap fee of the pool.\n     */\n    function getSlot0(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        bytes32 data = manager.extsload(stateSlot);\n\n        //   24 bits  |24bits|24bits      |24 bits|160 bits\n        // 0x000000   |000bb8|000000      |ffff75 |0000000000000000fe3aa841ba359daa0ea9eff7\n        // ---------- | fee  |protocolfee | tick  | sqrtPriceX96\n        assembly (\"memory-safe\") {\n            // bottom 160 bits of data\n            sqrtPriceX96 := and(data, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            // next 24 bits of data\n            tick := signextend(2, shr(160, data))\n            // next 24 bits of data\n            protocolFee := and(shr(184, data), 0xFFFFFF)\n            // last 24 bits of data\n            lpFee := and(shr(208, data), 0xFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the tick information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve information for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickInfo(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (\n            uint128 liquidityGross,\n            int128 liquidityNet,\n            uint256 feeGrowthOutside0X128,\n            uint256 feeGrowthOutside1X128\n        )\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // read all 3 words of the TickInfo struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n        assembly (\"memory-safe\") {\n            let firstWord := mload(add(data, 32))\n            liquidityNet := sar(128, firstWord)\n            liquidityGross := and(firstWord, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            feeGrowthOutside0X128 := mload(add(data, 64))\n            feeGrowthOutside1X128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick].liquidityGross and pools[poolId].ticks[tick].liquidityNet. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve liquidity for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     */\n    function getTickLiquidity(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint128 liquidityGross, int128 liquidityNet)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        bytes32 value = manager.extsload(slot);\n        assembly (\"memory-safe\") {\n            liquidityNet := sar(128, value)\n            liquidityGross := and(value, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the fee growth outside a tick range of a pool\n     * @dev Corresponds to pools[poolId].ticks[tick].feeGrowthOutside0X128 and pools[poolId].ticks[tick].feeGrowthOutside1X128. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve fee growth for.\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickFeeGrowthOutside(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // offset by 1 word, since the first word is liquidityGross + liquidityNet\n        bytes32[] memory data = manager.extsload(bytes32(uint256(slot) + 1), 2);\n        assembly (\"memory-safe\") {\n            feeGrowthOutside0X128 := mload(add(data, 32))\n            feeGrowthOutside1X128 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves the global fee growth of a pool.\n     * @dev Corresponds to pools[poolId].feeGrowthGlobal0X128 and pools[poolId].feeGrowthGlobal1X128\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return feeGrowthGlobal0 The global fee growth for token0.\n     * @return feeGrowthGlobal1 The global fee growth for token1.\n     * @dev Note that feeGrowthGlobal can be artificially inflated\n     * For pools with a single liquidity position, actors can donate to themselves to freely inflate feeGrowthGlobal\n     * atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n     */\n    function getFeeGrowthGlobals(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State, `uint256 feeGrowthGlobal0X128`\n        bytes32 slot_feeGrowthGlobal0X128 = bytes32(uint256(stateSlot) + FEE_GROWTH_GLOBAL0_OFFSET);\n\n        // read the 2 words of feeGrowthGlobal\n        bytes32[] memory data = manager.extsload(slot_feeGrowthGlobal0X128, 2);\n        assembly (\"memory-safe\") {\n            feeGrowthGlobal0 := mload(add(data, 32))\n            feeGrowthGlobal1 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves total the liquidity of a pool.\n     * @dev Corresponds to pools[poolId].liquidity\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return liquidity The liquidity of the pool.\n     */\n    function getLiquidity(IPoolManager manager, PoolId poolId) internal view returns (uint128 liquidity) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `uint128 liquidity`\n        bytes32 slot = bytes32(uint256(stateSlot) + LIQUIDITY_OFFSET);\n\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Retrieves the tick bitmap of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].tickBitmap[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve the bitmap for.\n     * @return tickBitmap The bitmap of the tick.\n     */\n    function getTickBitmap(IPoolManager manager, PoolId poolId, int16 tick)\n        internal\n        view\n        returns (uint256 tickBitmap)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int16 => uint256) tickBitmap;`\n        bytes32 tickBitmapMapping = bytes32(uint256(stateSlot) + TICK_BITMAP_OFFSET);\n\n        // slot id of the mapping key: `pools[poolId].tickBitmap[tick]\n        bytes32 slot = keccak256(abi.encodePacked(int256(tick), tickBitmapMapping));\n\n        tickBitmap = uint256(manager.extsload(slot));\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool without needing to calculate the `positionId`.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param poolId The ID of the pool.\n     * @param owner The owner of the liquidity position.\n     * @param tickLower The lower tick of the liquidity range.\n     * @param tickUpper The upper tick of the liquidity range.\n     * @param salt The bytes32 randomness to further distinguish position state.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(\n        IPoolManager manager,\n        PoolId poolId,\n        address owner,\n        int24 tickLower,\n        int24 tickUpper,\n        bytes32 salt\n    ) internal view returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128) {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        bytes32 positionKey = Position.calculatePositionKey(owner, tickLower, tickUpper, salt);\n\n        (liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128) = getPositionInfo(manager, poolId, positionKey);\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool at a specific position ID.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n\n        // read all 3 words of the Position.State struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n\n        assembly (\"memory-safe\") {\n            liquidity := mload(add(data, 32))\n            feeGrowthInside0LastX128 := mload(add(data, 64))\n            feeGrowthInside1LastX128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity of a position.\n     * @dev Corresponds to pools[poolId].positions[positionId].liquidity. More gas efficient for just retrieiving liquidity as compared to getPositionInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     */\n    function getPositionLiquidity(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Calculate the fee growth inside a tick range of a pool\n     * @dev pools[poolId].feeGrowthInside0LastX128 in Position.State is cached and can become stale. This function will calculate the up to date feeGrowthInside\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tickLower The lower tick of the range.\n     * @param tickUpper The upper tick of the range.\n     * @return feeGrowthInside0X128 The fee growth inside the tick range for token0.\n     * @return feeGrowthInside1X128 The fee growth inside the tick range for token1.\n     */\n    function getFeeGrowthInside(IPoolManager manager, PoolId poolId, int24 tickLower, int24 tickUpper)\n        internal\n        view\n        returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)\n    {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = getFeeGrowthGlobals(manager, poolId);\n\n        (uint256 lowerFeeGrowthOutside0X128, uint256 lowerFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickLower);\n        (uint256 upperFeeGrowthOutside0X128, uint256 upperFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickUpper);\n        (, int24 tickCurrent,,) = getSlot0(manager, poolId);\n        unchecked {\n            if (tickCurrent < tickLower) {\n                feeGrowthInside0X128 = lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            } else if (tickCurrent >= tickUpper) {\n                feeGrowthInside0X128 = upperFeeGrowthOutside0X128 - lowerFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = upperFeeGrowthOutside1X128 - lowerFeeGrowthOutside1X128;\n            } else {\n                feeGrowthInside0X128 = feeGrowthGlobal0X128 - lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = feeGrowthGlobal1X128 - lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            }\n        }\n    }\n\n    function _getPoolStateSlot(PoolId poolId) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(PoolId.unwrap(poolId), POOLS_SLOT));\n    }\n\n    function _getTickInfoSlot(PoolId poolId, int24 tick) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int24 => TickInfo) ticks`\n        bytes32 ticksMappingSlot = bytes32(uint256(stateSlot) + TICKS_OFFSET);\n\n        // slot key of the tick key: `pools[poolId].ticks[tick]\n        return keccak256(abi.encodePacked(int256(tick), ticksMappingSlot));\n    }\n\n    function _getPositionInfoSlot(PoolId poolId, bytes32 positionId) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(bytes32 => Position.State) positions;`\n        bytes32 positionMapping = bytes32(uint256(stateSlot) + POSITIONS_OFFSET);\n\n        // slot of the mapping key: `pools[poolId].positions[positionId]\n        return keccak256(abi.encodePacked(positionId, positionMapping));\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TickMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {BitMath} from \"./BitMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Math library for computing sqrt prices from ticks and vice versa\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\n/// prices between 2**-128 and 2**128\nlibrary TickMath {\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the tick passed to #getSqrtPriceAtTick is not between MIN_TICK and MAX_TICK\n    error InvalidTick(int24 tick);\n    /// @notice Thrown when the price passed to #getTickAtSqrtPrice does not correspond to a price between MIN_TICK and MAX_TICK\n    error InvalidSqrtPrice(uint160 sqrtPriceX96);\n\n    /// @dev The minimum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**-128\n    /// @dev If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\n    int24 internal constant MIN_TICK = -887272;\n    /// @dev The maximum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**128\n    /// @dev If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\n    int24 internal constant MAX_TICK = 887272;\n\n    /// @dev The minimum tick spacing value drawn from the range of type int16 that is greater than 0, i.e. min from the range [1, 32767]\n    int24 internal constant MIN_TICK_SPACING = 1;\n    /// @dev The maximum tick spacing value drawn from the range of type int16, i.e. max from the range [1, 32767]\n    int24 internal constant MAX_TICK_SPACING = type(int16).max;\n\n    /// @dev The minimum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MIN_TICK)\n    uint160 internal constant MIN_SQRT_PRICE = 4295128739;\n    /// @dev The maximum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MAX_TICK)\n    uint160 internal constant MAX_SQRT_PRICE = 1461446703485210103287273052203988822378723970342;\n    /// @dev A threshold used for optimized bounds check, equals `MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1`\n    uint160 internal constant MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE =\n        1461446703485210103287273052203988822378723970342 - 4295128739 - 1;\n\n    /// @notice Given a tickSpacing, compute the maximum usable tick\n    function maxUsableTick(int24 tickSpacing) internal pure returns (int24) {\n        unchecked {\n            return (MAX_TICK / tickSpacing) * tickSpacing;\n        }\n    }\n\n    /// @notice Given a tickSpacing, compute the minimum usable tick\n    function minUsableTick(int24 tickSpacing) internal pure returns (int24) {\n        unchecked {\n            return (MIN_TICK / tickSpacing) * tickSpacing;\n        }\n    }\n\n    /// @notice Calculates sqrt(1.0001^tick) * 2^96\n    /// @dev Throws if |tick| > max tick\n    /// @param tick The input tick for the above formula\n    /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the price of the two assets (currency1/currency0)\n    /// at the given tick\n    function getSqrtPriceAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\n        unchecked {\n            uint256 absTick;\n            assembly (\"memory-safe\") {\n                tick := signextend(2, tick)\n                // mask = 0 if tick >= 0 else -1 (all 1s)\n                let mask := sar(255, tick)\n                // if tick >= 0, |tick| = tick = 0 ^ tick\n                // if tick < 0, |tick| = ~~|tick| = ~(-|tick| - 1) = ~(tick - 1) = (-1) ^ (tick - 1)\n                // either way, |tick| = mask ^ (tick + mask)\n                absTick := xor(mask, add(mask, tick))\n            }\n\n            if (absTick > uint256(int256(MAX_TICK))) InvalidTick.selector.revertWith(tick);\n\n            // The tick is decomposed into bits, and for each bit with index i that is set, the product of 1/sqrt(1.0001^(2^i))\n            // is calculated (using Q128.128). The constants used for this calculation are rounded to the nearest integer\n\n            // Equivalent to:\n            //     price = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;\n            //     or price = int(2**128 / sqrt(1.0001)) if (absTick & 0x1) else 1 << 128\n            uint256 price;\n            assembly (\"memory-safe\") {\n                price := xor(shl(128, 1), mul(xor(shl(128, 1), 0xfffcb933bd6fad37aa2d162d1a594001), and(absTick, 0x1)))\n            }\n            if (absTick & 0x2 != 0) price = (price * 0xfff97272373d413259a46990580e213a) >> 128;\n            if (absTick & 0x4 != 0) price = (price * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n            if (absTick & 0x8 != 0) price = (price * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n            if (absTick & 0x10 != 0) price = (price * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n            if (absTick & 0x20 != 0) price = (price * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n            if (absTick & 0x40 != 0) price = (price * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n            if (absTick & 0x80 != 0) price = (price * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n            if (absTick & 0x100 != 0) price = (price * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n            if (absTick & 0x200 != 0) price = (price * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n            if (absTick & 0x400 != 0) price = (price * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n            if (absTick & 0x800 != 0) price = (price * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n            if (absTick & 0x1000 != 0) price = (price * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n            if (absTick & 0x2000 != 0) price = (price * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n            if (absTick & 0x4000 != 0) price = (price * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n            if (absTick & 0x8000 != 0) price = (price * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n            if (absTick & 0x10000 != 0) price = (price * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n            if (absTick & 0x20000 != 0) price = (price * 0x5d6af8dedb81196699c329225ee604) >> 128;\n            if (absTick & 0x40000 != 0) price = (price * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n            if (absTick & 0x80000 != 0) price = (price * 0x48a170391f7dc42444e8fa2) >> 128;\n\n            assembly (\"memory-safe\") {\n                // if (tick > 0) price = type(uint256).max / price;\n                if sgt(tick, 0) { price := div(not(0), price) }\n\n                // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\n                // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\n                // we round up in the division so getTickAtSqrtPrice of the output price is always consistent\n                // `sub(shl(32, 1), 1)` is `type(uint32).max`\n                // `price + type(uint32).max` will not overflow because `price` fits in 192 bits\n                sqrtPriceX96 := shr(32, add(price, sub(shl(32, 1), 1)))\n            }\n        }\n    }\n\n    /// @notice Calculates the greatest tick value such that getSqrtPriceAtTick(tick) <= sqrtPriceX96\n    /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_PRICE, as MIN_SQRT_PRICE is the lowest value getSqrtPriceAtTick may\n    /// ever return.\n    /// @param sqrtPriceX96 The sqrt price for which to compute the tick as a Q64.96\n    /// @return tick The greatest tick for which the getSqrtPriceAtTick(tick) is less than or equal to the input sqrtPriceX96\n    function getTickAtSqrtPrice(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\n        unchecked {\n            // Equivalent: if (sqrtPriceX96 < MIN_SQRT_PRICE || sqrtPriceX96 >= MAX_SQRT_PRICE) revert InvalidSqrtPrice();\n            // second inequality must be >= because the price can never reach the price at the max tick\n            // if sqrtPriceX96 < MIN_SQRT_PRICE, the `sub` underflows and `gt` is true\n            // if sqrtPriceX96 >= MAX_SQRT_PRICE, sqrtPriceX96 - MIN_SQRT_PRICE > MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1\n            if ((sqrtPriceX96 - MIN_SQRT_PRICE) > MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE) {\n                InvalidSqrtPrice.selector.revertWith(sqrtPriceX96);\n            }\n\n            uint256 price = uint256(sqrtPriceX96) << 32;\n\n            uint256 r = price;\n            uint256 msb = BitMath.mostSignificantBit(r);\n\n            if (msb >= 128) r = price >> (msb - 127);\n            else r = price << (127 - msb);\n\n            int256 log_2 = (int256(msb) - 128) << 64;\n\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(63, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(62, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(61, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(60, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(59, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(58, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(57, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(56, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(55, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(54, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(53, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(52, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(51, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(50, f))\n            }\n\n            int256 log_sqrt10001 = log_2 * 255738958999603826347141; // Q22.128 number\n\n            // Magic number represents the ceiling of the maximum value of the error when approximating log_sqrt10001(x)\n            int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);\n\n            // Magic number represents the minimum value of the error when approximating log_sqrt10001(x), when\n            // sqrtPrice is from the range (2^-64, 2^64). This is safe as MIN_SQRT_PRICE is more than 2^-64. If MIN_SQRT_PRICE\n            // is changed, this may need to be changed too\n            int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);\n\n            tick = tickLow == tickHi ? tickLow : getSqrtPriceAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TransientStateLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {CurrencyReserves} from \"./CurrencyReserves.sol\";\nimport {NonzeroDeltaCount} from \"./NonzeroDeltaCount.sol\";\nimport {Lock} from \"./Lock.sol\";\n\n/// @notice A helper library to provide state getters that use exttload\nlibrary TransientStateLibrary {\n    /// @notice returns the reserves for the synced currency\n    /// @param manager The pool manager contract.\n\n    /// @return uint256 The reserves of the currency.\n    /// @dev returns 0 if the reserves are not synced or value is 0.\n    /// Checks the synced currency to only return valid reserve values (after a sync and before a settle).\n    function getSyncedReserves(IPoolManager manager) internal view returns (uint256) {\n        if (getSyncedCurrency(manager).isAddressZero()) return 0;\n        return uint256(manager.exttload(CurrencyReserves.RESERVES_OF_SLOT));\n    }\n\n    function getSyncedCurrency(IPoolManager manager) internal view returns (Currency) {\n        return Currency.wrap(address(uint160(uint256(manager.exttload(CurrencyReserves.CURRENCY_SLOT)))));\n    }\n\n    /// @notice Returns the number of nonzero deltas open on the PoolManager that must be zeroed out before the contract is locked\n    function getNonzeroDeltaCount(IPoolManager manager) internal view returns (uint256) {\n        return uint256(manager.exttload(NonzeroDeltaCount.NONZERO_DELTA_COUNT_SLOT));\n    }\n\n    /// @notice Get the current delta for a caller in the given currency\n    /// @param target The credited account address\n    /// @param currency The currency for which to lookup the delta\n    function currencyDelta(IPoolManager manager, address target, Currency currency) internal view returns (int256) {\n        bytes32 key;\n        assembly (\"memory-safe\") {\n            mstore(0, and(target, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(32, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            key := keccak256(0, 64)\n        }\n        return int256(uint256(manager.exttload(key)));\n    }\n\n    /// @notice Returns whether the contract is unlocked or not\n    function isUnlocked(IPoolManager manager) internal view returns (bool) {\n        return manager.exttload(Lock.IS_UNLOCKED_SLOT) != 0x0;\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/UnsafeMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math functions that do not check inputs or outputs\n/// @notice Contains methods that perform common math functions but do not do any overflow or underflow checks\nlibrary UnsafeMath {\n    /// @notice Returns ceil(x / y)\n    /// @dev division by 0 will return 0, and should be checked externally\n    /// @param x The dividend\n    /// @param y The divisor\n    /// @return z The quotient, ceil(x / y)\n    function divRoundingUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        assembly (\"memory-safe\") {\n            z := add(div(x, y), gt(mod(x, y), 0))\n        }\n    }\n\n    /// @notice Calculates floor(a×b÷denominator)\n    /// @dev division by 0 will return 0, and should be checked externally\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result, floor(a×b÷denominator)\n    function simpleMulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        assembly (\"memory-safe\") {\n            result := div(mul(a, b), denominator)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/BalanceDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\n\n/// @dev Two `int128` values packed into a single `int256` where the upper 128 bits represent the amount0\n/// and the lower 128 bits represent the amount1.\ntype BalanceDelta is int256;\n\nusing {add as +, sub as -, eq as ==, neq as !=} for BalanceDelta global;\nusing BalanceDeltaLibrary for BalanceDelta global;\nusing SafeCast for int256;\n\nfunction toBalanceDelta(int128 _amount0, int128 _amount1) pure returns (BalanceDelta balanceDelta) {\n    assembly (\"memory-safe\") {\n        balanceDelta := or(shl(128, _amount0), and(sub(shl(128, 1), 1), _amount1))\n    }\n}\n\nfunction add(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := add(a0, b0)\n        res1 := add(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction sub(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := sub(a0, b0)\n        res1 := sub(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction eq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) == BalanceDelta.unwrap(b);\n}\n\nfunction neq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) != BalanceDelta.unwrap(b);\n}\n\n/// @notice Library for getting the amount0 and amount1 deltas from the BalanceDelta type\nlibrary BalanceDeltaLibrary {\n    /// @notice A BalanceDelta of 0\n    BalanceDelta public constant ZERO_DELTA = BalanceDelta.wrap(0);\n\n    function amount0(BalanceDelta balanceDelta) internal pure returns (int128 _amount0) {\n        assembly (\"memory-safe\") {\n            _amount0 := sar(128, balanceDelta)\n        }\n    }\n\n    function amount1(BalanceDelta balanceDelta) internal pure returns (int128 _amount1) {\n        assembly (\"memory-safe\") {\n            _amount1 := signextend(15, balanceDelta)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/BeforeSwapDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Return type of the beforeSwap hook.\n// Upper 128 bits is the delta in specified tokens. Lower 128 bits is delta in unspecified tokens (to match the afterSwap hook)\ntype BeforeSwapDelta is int256;\n\n// Creates a BeforeSwapDelta from specified and unspecified\nfunction toBeforeSwapDelta(int128 deltaSpecified, int128 deltaUnspecified)\n    pure\n    returns (BeforeSwapDelta beforeSwapDelta)\n{\n    assembly (\"memory-safe\") {\n        beforeSwapDelta := or(shl(128, deltaSpecified), and(sub(shl(128, 1), 1), deltaUnspecified))\n    }\n}\n\n/// @notice Library for getting the specified and unspecified deltas from the BeforeSwapDelta type\nlibrary BeforeSwapDeltaLibrary {\n    /// @notice A BeforeSwapDelta of 0\n    BeforeSwapDelta public constant ZERO_DELTA = BeforeSwapDelta.wrap(0);\n\n    /// extracts int128 from the upper 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap\n    function getSpecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaSpecified) {\n        assembly (\"memory-safe\") {\n            deltaSpecified := sar(128, delta)\n        }\n    }\n\n    /// extracts int128 from the lower 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap and afterSwap\n    function getUnspecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaUnspecified) {\n        assembly (\"memory-safe\") {\n            deltaUnspecified := signextend(15, delta)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/Currency.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\nimport {CustomRevert} from \"../libraries/CustomRevert.sol\";\n\ntype Currency is address;\n\nusing {greaterThan as >, lessThan as <, greaterThanOrEqualTo as >=, equals as ==} for Currency global;\nusing CurrencyLibrary for Currency global;\n\nfunction equals(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) == Currency.unwrap(other);\n}\n\nfunction greaterThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) > Currency.unwrap(other);\n}\n\nfunction lessThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) < Currency.unwrap(other);\n}\n\nfunction greaterThanOrEqualTo(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) >= Currency.unwrap(other);\n}\n\n/// @title CurrencyLibrary\n/// @dev This library allows for transferring and holding native tokens and ERC20 tokens\nlibrary CurrencyLibrary {\n    /// @notice Additional context for ERC-7751 wrapped error when a native transfer fails\n    error NativeTransferFailed();\n\n    /// @notice Additional context for ERC-7751 wrapped error when an ERC20 transfer fails\n    error ERC20TransferFailed();\n\n    /// @notice A constant to represent the native currency\n    Currency public constant ADDRESS_ZERO = Currency.wrap(address(0));\n\n    function transfer(Currency currency, address to, uint256 amount) internal {\n        // altered from https://github.com/transmissions11/solmate/blob/44a9963d4c78111f77caa0e65d677b8b46d6f2e6/src/utils/SafeTransferLib.sol\n        // modified custom error selectors\n\n        bool success;\n        if (currency.isAddressZero()) {\n            assembly (\"memory-safe\") {\n                // Transfer the ETH and revert if it fails.\n                success := call(gas(), to, amount, 0, 0, 0, 0)\n            }\n            // revert with NativeTransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(to, bytes4(0), NativeTransferFailed.selector);\n            }\n        } else {\n            assembly (\"memory-safe\") {\n                // Get a pointer to some free memory.\n                let fmp := mload(0x40)\n\n                // Write the abi-encoded calldata into memory, beginning with the function selector.\n                mstore(fmp, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n                mstore(add(fmp, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the \"to\" argument.\n                mstore(add(fmp, 36), amount) // Append the \"amount\" argument. Masking not required as it's a full 32 byte type.\n\n                success :=\n                    and(\n                        // Set success to whether the call reverted, if not we check it either\n                        // returned exactly 1 (can't just be non-zero data), or had no return data.\n                        or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n                        // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n                        // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n                        // Counterintuitively, this call must be positioned second to the or() call in the\n                        // surrounding and() call or else returndatasize() will be zero during the computation.\n                        call(gas(), currency, 0, fmp, 68, 0, 32)\n                    )\n\n                // Now clean the memory we used\n                mstore(fmp, 0) // 4 byte `selector` and 28 bytes of `to` were stored here\n                mstore(add(fmp, 0x20), 0) // 4 bytes of `to` and 28 bytes of `amount` were stored here\n                mstore(add(fmp, 0x40), 0) // 4 bytes of `amount` were stored here\n            }\n            // revert with ERC20TransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(\n                    Currency.unwrap(currency), IERC20Minimal.transfer.selector, ERC20TransferFailed.selector\n                );\n            }\n        }\n    }\n\n    function balanceOfSelf(Currency currency) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return address(this).balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(address(this));\n        }\n    }\n\n    function balanceOf(Currency currency, address owner) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return owner.balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(owner);\n        }\n    }\n\n    function isAddressZero(Currency currency) internal pure returns (bool) {\n        return Currency.unwrap(currency) == Currency.unwrap(ADDRESS_ZERO);\n    }\n\n    function toId(Currency currency) internal pure returns (uint256) {\n        return uint160(Currency.unwrap(currency));\n    }\n\n    // If the upper 12 bytes are non-zero, they will be zero-ed out\n    // Therefore, fromId() and toId() are not inverses of each other\n    function fromId(uint256 id) internal pure returns (Currency) {\n        return Currency.wrap(address(uint160(id)));\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolId.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"./PoolKey.sol\";\n\ntype PoolId is bytes32;\n\n/// @notice Library for computing the ID of a pool\nlibrary PoolIdLibrary {\n    /// @notice Returns value equal to keccak256(abi.encode(poolKey))\n    function toId(PoolKey memory poolKey) internal pure returns (PoolId poolId) {\n        assembly (\"memory-safe\") {\n            // 0xa0 represents the total size of the poolKey struct (5 slots of 32 bytes)\n            poolId := keccak256(poolKey, 0xa0)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolKey.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"./Currency.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {PoolIdLibrary} from \"./PoolId.sol\";\n\nusing PoolIdLibrary for PoolKey global;\n\n/// @notice Returns the key for identifying a pool\nstruct PoolKey {\n    /// @notice The lower currency of the pool, sorted numerically\n    Currency currency0;\n    /// @notice The higher currency of the pool, sorted numerically\n    Currency currency1;\n    /// @notice The pool LP fee, capped at 1_000_000. If the highest bit is 1, the pool has a dynamic fee and must be exactly equal to 0x800000\n    uint24 fee;\n    /// @notice Ticks that involve positions must be a multiple of tick spacing\n    int24 tickSpacing;\n    /// @notice The hooks of the pool\n    IHooks hooks;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolOperation.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\n\n/// @notice Parameter struct for `ModifyLiquidity` pool operations\nstruct ModifyLiquidityParams {\n    // the lower and upper tick of the position\n    int24 tickLower;\n    int24 tickUpper;\n    // how to modify the liquidity\n    int256 liquidityDelta;\n    // a value to set if you want unique liquidity positions at the same range\n    bytes32 salt;\n}\n\n/// @notice Parameter struct for `Swap` pool operations\nstruct SwapParams {\n    /// Whether to swap token0 for token1 or vice versa\n    bool zeroForOne;\n    /// The desired input amount if negative (exactIn), or the desired output amount if positive (exactOut)\n    int256 amountSpecified;\n    /// The sqrt price at which, if reached, the swap will stop executing\n    uint160 sqrtPriceLimitX96;\n}\n"},"../../../lib/v4-periphery/src/interfaces/IEIP712_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IEIP712_v4\n/// @notice Interface for the EIP712 contract\ninterface IEIP712_v4 {\n    /// @notice Returns the domain separator for the current chain.\n    /// @return bytes32 The domain separator\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IERC721Permit_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IERC721Permit_v4\n/// @notice Interface for the ERC721Permit_v4 contract\ninterface IERC721Permit_v4 {\n    error SignatureDeadlineExpired();\n    error NoSelfPermit();\n    error Unauthorized();\n\n    /// @notice Approve of a specific token ID for spending by spender via signature\n    /// @param spender The account that is being approved\n    /// @param tokenId The ID of the token that is being approved for spending\n    /// @param deadline The deadline timestamp by which the call must be mined for the approve to work\n    /// @param nonce a unique value, for an owner, to prevent replay attacks; an unordered nonce where the top 248 bits correspond to a word and the bottom 8 bits calculate the bit position of the word\n    /// @param signature Concatenated data from a valid secp256k1 signature from the holder, i.e. abi.encodePacked(r, s, v)\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    function permit(address spender, uint256 tokenId, uint256 deadline, uint256 nonce, bytes calldata signature)\n        external\n        payable;\n\n    /// @notice Set an operator with full permission to an owner's tokens via signature\n    /// @param owner The address that is setting the operator\n    /// @param operator The address that will be set as an operator for the owner\n    /// @param approved The permission to set on the operator\n    /// @param deadline The deadline timestamp by which the call must be mined for the approve to work\n    /// @param nonce a unique value, for an owner, to prevent replay attacks; an unordered nonce where the top 248 bits correspond to a word and the bottom 8 bits calculate the bit position of the word\n    /// @param signature Concatenated data from a valid secp256k1 signature from the holder, i.e. abi.encodePacked(r, s, v)\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    function permitForAll(\n        address owner,\n        address operator,\n        bool approved,\n        uint256 deadline,\n        uint256 nonce,\n        bytes calldata signature\n    ) external payable;\n}\n"},"../../../lib/v4-periphery/src/interfaces/IImmutableState.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\n\n/// @title IImmutableState\n/// @notice Interface for the ImmutableState contract\ninterface IImmutableState {\n    /// @notice The Uniswap v4 PoolManager contract\n    function poolManager() external view returns (IPoolManager);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IMulticall_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IMulticall_v4\n/// @notice Interface for the Multicall_v4 contract\ninterface IMulticall_v4 {\n    /// @notice Call multiple functions in the current contract and return the data from all of them if they all succeed\n    /// @dev The `msg.value` is passed onto all subcalls, even if a previous subcall has consumed the ether.\n    /// Subcalls can instead use `address(this).value` to see the available ETH, and consume it using {value: x}.\n    /// @param data The encoded function data for each of the calls to make to this contract\n    /// @return results The results from each of the calls passed in via data\n    function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);\n}\n"},"../../../lib/v4-periphery/src/interfaces/INotifier.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {ISubscriber} from \"./ISubscriber.sol\";\n\n/// @title INotifier\n/// @notice Interface for the Notifier contract\ninterface INotifier {\n    /// @notice Thrown when unsubscribing without a subscriber\n    error NotSubscribed();\n    /// @notice Thrown when a subscriber does not have code\n    error NoCodeSubscriber();\n    /// @notice Thrown when a user specifies a gas limit too low to avoid valid unsubscribe notifications\n    error GasLimitTooLow();\n    /// @notice Wraps the revert message of the subscriber contract on a reverting subscription\n    error SubscriptionReverted(address subscriber, bytes reason);\n    /// @notice Wraps the revert message of the subscriber contract on a reverting modify liquidity notification\n    error ModifyLiquidityNotificationReverted(address subscriber, bytes reason);\n    /// @notice Wraps the revert message of the subscriber contract on a reverting burn notification\n    error BurnNotificationReverted(address subscriber, bytes reason);\n    /// @notice Thrown when a tokenId already has a subscriber\n    error AlreadySubscribed(uint256 tokenId, address subscriber);\n\n    /// @notice Emitted on a successful call to subscribe\n    event Subscription(uint256 indexed tokenId, address indexed subscriber);\n    /// @notice Emitted on a successful call to unsubscribe\n    event Unsubscription(uint256 indexed tokenId, address indexed subscriber);\n\n    /// @notice Returns the subscriber for a respective position\n    /// @param tokenId the ERC721 tokenId\n    /// @return subscriber the subscriber contract\n    function subscriber(uint256 tokenId) external view returns (ISubscriber subscriber);\n\n    /// @notice Enables the subscriber to receive notifications for a respective position\n    /// @param tokenId the ERC721 tokenId\n    /// @param newSubscriber the address of the subscriber contract\n    /// @param data caller-provided data that's forwarded to the subscriber contract\n    /// @dev Calling subscribe when a position is already subscribed will revert\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    /// @dev will revert if pool manager is locked\n    function subscribe(uint256 tokenId, address newSubscriber, bytes calldata data) external payable;\n\n    /// @notice Removes the subscriber from receiving notifications for a respective position\n    /// @param tokenId the ERC721 tokenId\n    /// @dev Callers must specify a high gas limit (remaining gas should be higher than unsubscriberGasLimit) such that the subscriber can be notified\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    /// @dev Must always allow a user to unsubscribe. In the case of a malicious subscriber, a user can always unsubscribe safely, ensuring liquidity is always modifiable.\n    /// @dev will revert if pool manager is locked\n    function unsubscribe(uint256 tokenId) external payable;\n\n    /// @notice Returns and determines the maximum allowable gas-used for notifying unsubscribe\n    /// @return uint256 the maximum gas limit when notifying a subscriber's `notifyUnsubscribe` function\n    function unsubscribeGasLimit() external view returns (uint256);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IPermit2Forwarder.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IAllowanceTransfer} from \"permit2/src/interfaces/IAllowanceTransfer.sol\";\n\n/// @title IPermit2Forwarder\n/// @notice Interface for the Permit2Forwarder contract\ninterface IPermit2Forwarder {\n    /// @notice allows forwarding a single permit to permit2\n    /// @dev this function is payable to allow multicall with NATIVE based actions\n    /// @param owner the owner of the tokens\n    /// @param permitSingle the permit data\n    /// @param signature the signature of the permit; abi.encodePacked(r, s, v)\n    /// @return err the error returned by a reverting permit call, empty if successful\n    function permit(address owner, IAllowanceTransfer.PermitSingle calldata permitSingle, bytes calldata signature)\n        external\n        payable\n        returns (bytes memory err);\n\n    /// @notice allows forwarding batch permits to permit2\n    /// @dev this function is payable to allow multicall with NATIVE based actions\n    /// @param owner the owner of the tokens\n    /// @param _permitBatch a batch of approvals\n    /// @param signature the signature of the permit; abi.encodePacked(r, s, v)\n    /// @return err the error returned by a reverting permit call, empty if successful\n    function permitBatch(address owner, IAllowanceTransfer.PermitBatch calldata _permitBatch, bytes calldata signature)\n        external\n        payable\n        returns (bytes memory err);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IPoolInitializer_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\n\n/// @title IPoolInitializer_v4\n/// @notice Interface for the PoolInitializer_v4 contract\ninterface IPoolInitializer_v4 {\n    /// @notice Initialize a Uniswap v4 Pool\n    /// @dev If the pool is already initialized, this function will not revert and just return type(int24).max\n    /// @param key The PoolKey of the pool to initialize\n    /// @param sqrtPriceX96 The initial starting price of the pool, expressed as a sqrtPriceX96\n    /// @return The current tick of the pool, or type(int24).max if the pool creation failed, or the pool already existed\n    function initializePool(PoolKey calldata key, uint160 sqrtPriceX96) external payable returns (int24);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IPositionManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {PositionInfo} from \"../libraries/PositionInfoLibrary.sol\";\n\nimport {INotifier} from \"./INotifier.sol\";\nimport {IImmutableState} from \"./IImmutableState.sol\";\nimport {IERC721Permit_v4} from \"./IERC721Permit_v4.sol\";\nimport {IEIP712_v4} from \"./IEIP712_v4.sol\";\nimport {IMulticall_v4} from \"./IMulticall_v4.sol\";\nimport {IPoolInitializer_v4} from \"./IPoolInitializer_v4.sol\";\nimport {IUnorderedNonce} from \"./IUnorderedNonce.sol\";\nimport {IPermit2Forwarder} from \"./IPermit2Forwarder.sol\";\n\n/// @title IPositionManager\n/// @notice Interface for the PositionManager contract\ninterface IPositionManager is\n    INotifier,\n    IImmutableState,\n    IERC721Permit_v4,\n    IEIP712_v4,\n    IMulticall_v4,\n    IPoolInitializer_v4,\n    IUnorderedNonce,\n    IPermit2Forwarder\n{\n    /// @notice Emitted by the position manager for each modifyLiquidity call, mirroring PoolManager\n    ///         ModifyLiquidity except `sender` is the unlock locker (end user), not the position manager.\n    event ModifyPosition(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Thrown when the caller is not approved to modify a position\n    error NotApproved(address caller);\n    /// @notice Thrown when the block.timestamp exceeds the user-provided deadline\n    error DeadlinePassed(uint256 deadline);\n    /// @notice Thrown when calling transfer, subscribe, or unsubscribe when the PoolManager is unlocked.\n    /// @dev This is to prevent hooks from being able to trigger notifications at the same time the position is being modified.\n    error PoolManagerMustBeLocked();\n\n    /// @notice Unlocks Uniswap v4 PoolManager and batches actions for modifying liquidity\n    /// @dev This is the standard entrypoint for the PositionManager\n    /// @param unlockData is an encoding of actions, and parameters for those actions\n    /// @param deadline is the deadline for the batched actions to be executed\n    function modifyLiquidities(bytes calldata unlockData, uint256 deadline) external payable;\n\n    /// @notice Batches actions for modifying liquidity without unlocking v4 PoolManager\n    /// @dev This must be called by a contract that has already unlocked the v4 PoolManager\n    /// @param actions the actions to perform\n    /// @param params the parameters to provide for the actions\n    function modifyLiquiditiesWithoutUnlock(bytes calldata actions, bytes[] calldata params) external payable;\n\n    /// @notice Used to get the ID that will be used for the next minted liquidity position\n    /// @return uint256 The next token ID\n    function nextTokenId() external view returns (uint256);\n\n    /// @notice Returns the liquidity of a position\n    /// @param tokenId the ERC721 tokenId\n    /// @return liquidity the position's liquidity, as a liquidityAmount\n    /// @dev this value can be processed as an amount0 and amount1 by using the LiquidityAmounts library\n    function getPositionLiquidity(uint256 tokenId) external view returns (uint128 liquidity);\n\n    /// @notice Returns the pool key and position info of a position\n    /// @param tokenId the ERC721 tokenId\n    /// @return poolKey the pool key of the position\n    /// @return PositionInfo a uint256 packed value holding information about the position including the range (tickLower, tickUpper)\n    function getPoolAndPositionInfo(uint256 tokenId) external view returns (PoolKey memory, PositionInfo);\n\n    /// @notice Returns the position info of a position\n    /// @param tokenId the ERC721 tokenId\n    /// @return a uint256 packed value holding information about the position including the range (tickLower, tickUpper)\n    function positionInfo(uint256 tokenId) external view returns (PositionInfo);\n}\n"},"../../../lib/v4-periphery/src/interfaces/ISubscriber.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {PositionInfo} from \"../libraries/PositionInfoLibrary.sol\";\n\n/// @title ISubscriber\n/// @notice Interface that a Subscriber contract should implement to receive updates from the v4 position manager\ninterface ISubscriber {\n    /// @notice Called when a position subscribes to this subscriber contract\n    /// @param tokenId the token ID of the position\n    /// @param data additional data passed in by the caller\n    function notifySubscribe(uint256 tokenId, bytes memory data) external;\n\n    /// @notice Called when a position unsubscribes from the subscriber\n    /// @dev This call's gas is capped at `unsubscribeGasLimit` (set at deployment)\n    /// @dev Because of EIP-150, solidity may only allocate 63/64 of gasleft()\n    /// @param tokenId the token ID of the position\n    function notifyUnsubscribe(uint256 tokenId) external;\n\n    /// @notice Called when a position is burned\n    /// @param tokenId the token ID of the position\n    /// @param owner the current owner of the tokenId\n    /// @param info information about the position\n    /// @param liquidity the amount of liquidity decreased in the position, may be 0\n    /// @param feesAccrued the fees accrued by the position if liquidity was decreased\n    function notifyBurn(uint256 tokenId, address owner, PositionInfo info, uint256 liquidity, BalanceDelta feesAccrued)\n        external;\n\n    /// @notice Called when a position modifies its liquidity or collects fees\n    /// @param tokenId the token ID of the position\n    /// @param liquidityChange the change in liquidity on the underlying position\n    /// @param feesAccrued the fees to be collected from the position as a result of the modifyLiquidity call\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious user\n    /// Pools with a single liquidity position can inflate feeGrowthGlobal (and consequently feesAccrued) by donating to themselves;\n    /// atomically donating and collecting fees within the same unlockCallback may further inflate feeGrowthGlobal/feesAccrued\n    function notifyModifyLiquidity(uint256 tokenId, int256 liquidityChange, BalanceDelta feesAccrued) external;\n}\n"},"../../../lib/v4-periphery/src/interfaces/IUnorderedNonce.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IUnorderedNonce\n/// @notice Interface for the UnorderedNonce contract\ninterface IUnorderedNonce {\n    error NonceAlreadyUsed();\n\n    /// @notice mapping of nonces consumed by each address, where a nonce is a single bit on the 256-bit bitmap\n    /// @dev word is at most type(uint248).max\n    function nonces(address owner, uint256 word) external view returns (uint256);\n\n    /// @notice Revoke a nonce by spending it, preventing it from being used again\n    /// @dev Used in cases where a valid nonce has not been broadcasted onchain, and the owner wants to revoke the validity of the nonce\n    /// @dev payable so it can be multicalled with native-token related actions\n    function revokeNonce(uint256 nonce) external payable;\n}\n"},"../../../lib/v4-periphery/src/libraries/Actions.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Library to define different pool actions.\n/// @dev These are suggested common commands, however additional commands should be defined as required\n/// Some of these actions are not supported in the Router contracts or Position Manager contracts, but are left as they may be helpful commands for other peripheral contracts.\nlibrary Actions {\n    // pool actions\n    // liquidity actions\n    uint256 internal constant INCREASE_LIQUIDITY = 0x00;\n    uint256 internal constant DECREASE_LIQUIDITY = 0x01;\n    uint256 internal constant MINT_POSITION = 0x02;\n    uint256 internal constant BURN_POSITION = 0x03;\n\n    /// @notice DEPRECATED: Vulnerable to sandwich attacks - do not use.\n    /// @dev The delta-based approach lacks minimum liquidity slippage protection, allowing\n    /// attackers to manipulate the price and reduce the liquidity received.\n    /// Use INCREASE_LIQUIDITY instead.\n    uint256 internal constant INCREASE_LIQUIDITY_FROM_DELTAS = 0x04;\n\n    /// @notice DEPRECATED: Vulnerable to sandwich attacks - do not use.\n    /// @dev The delta-based approach lacks minimum liquidity slippage protection, allowing\n    /// attackers to manipulate the price and reduce the liquidity received.\n    /// Use MINT_POSITION instead.\n    uint256 internal constant MINT_POSITION_FROM_DELTAS = 0x05;\n\n    // swapping\n    uint256 internal constant SWAP_EXACT_IN_SINGLE = 0x06;\n    uint256 internal constant SWAP_EXACT_IN = 0x07;\n    uint256 internal constant SWAP_EXACT_OUT_SINGLE = 0x08;\n    uint256 internal constant SWAP_EXACT_OUT = 0x09;\n\n    // donate\n    // note this is not supported in the position manager or router\n    uint256 internal constant DONATE = 0x0a;\n\n    // closing deltas on the pool manager\n    // settling\n    uint256 internal constant SETTLE = 0x0b;\n    uint256 internal constant SETTLE_ALL = 0x0c;\n    uint256 internal constant SETTLE_PAIR = 0x0d;\n    // taking\n    uint256 internal constant TAKE = 0x0e;\n    uint256 internal constant TAKE_ALL = 0x0f;\n    uint256 internal constant TAKE_PORTION = 0x10;\n    uint256 internal constant TAKE_PAIR = 0x11;\n\n    uint256 internal constant CLOSE_CURRENCY = 0x12;\n    uint256 internal constant CLEAR_OR_TAKE = 0x13;\n    uint256 internal constant SWEEP = 0x14;\n\n    uint256 internal constant WRAP = 0x15;\n    uint256 internal constant UNWRAP = 0x16;\n\n    // minting/burning 6909s to close deltas\n    // note this is not supported in the position manager or router\n    uint256 internal constant MINT_6909 = 0x17;\n    uint256 internal constant BURN_6909 = 0x18;\n\n    // permissioned-pools specific actions\n    // burns this contract's 6909 claim for a currency and takes the underlying to a recipient\n    uint256 internal constant UNWIND_WITH_FALLBACK = 0x19;\n}\n"},"../../../lib/v4-periphery/src/libraries/LiquidityAmounts.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {FixedPoint96} from \"@uniswap/v4-core/src/libraries/FixedPoint96.sol\";\nimport {SafeCast} from \"@uniswap/v4-core/src/libraries/SafeCast.sol\";\n\n/// @notice Provides functions for computing liquidity amounts from token amounts and prices\nlibrary LiquidityAmounts {\n    using SafeCast for uint256;\n\n    /// @notice Computes the amount of liquidity received for a given amount of token0 and price range\n    /// @dev Calculates amount0 * (sqrt(upper) * sqrt(lower)) / (sqrt(upper) - sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount0 The amount0 being sent in\n    /// @return liquidity The amount of returned liquidity\n    function getLiquidityForAmount0(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint256 amount0)\n        internal\n        pure\n        returns (uint128 liquidity)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n            uint256 intermediate = FullMath.mulDiv(sqrtPriceAX96, sqrtPriceBX96, FixedPoint96.Q96);\n            return FullMath.mulDiv(amount0, intermediate, sqrtPriceBX96 - sqrtPriceAX96).toUint128();\n        }\n    }\n\n    /// @notice Computes the amount of liquidity received for a given amount of token1 and price range\n    /// @dev Calculates amount1 / (sqrt(upper) - sqrt(lower)).\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount1 The amount1 being sent in\n    /// @return liquidity The amount of returned liquidity\n    function getLiquidityForAmount1(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint256 amount1)\n        internal\n        pure\n        returns (uint128 liquidity)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n            return FullMath.mulDiv(amount1, FixedPoint96.Q96, sqrtPriceBX96 - sqrtPriceAX96).toUint128();\n        }\n    }\n\n    /// @notice Computes the maximum amount of liquidity received for a given amount of token0, token1, the current\n    /// pool prices and the prices at the tick boundaries\n    /// @param sqrtPriceX96 A sqrt price representing the current pool prices\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount0 The amount of token0 being sent in\n    /// @param amount1 The amount of token1 being sent in\n    /// @return liquidity The maximum amount of liquidity received\n    function getLiquidityForAmounts(\n        uint160 sqrtPriceX96,\n        uint160 sqrtPriceAX96,\n        uint160 sqrtPriceBX96,\n        uint256 amount0,\n        uint256 amount1\n    ) internal pure returns (uint128 liquidity) {\n        if (sqrtPriceAX96 > sqrtPriceBX96) {\n            (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n        }\n\n        if (sqrtPriceX96 <= sqrtPriceAX96) {\n            liquidity = getLiquidityForAmount0(sqrtPriceAX96, sqrtPriceBX96, amount0);\n        } else if (sqrtPriceX96 < sqrtPriceBX96) {\n            uint128 liquidity0 = getLiquidityForAmount0(sqrtPriceX96, sqrtPriceBX96, amount0);\n            uint128 liquidity1 = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceX96, amount1);\n\n            liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1;\n        } else {\n            liquidity = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceBX96, amount1);\n        }\n    }\n}\n"},"../../../lib/v4-periphery/src/libraries/PositionInfoLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\n\n/**\n * @dev PositionInfo is a packed version of solidity structure.\n * Using the packaged version saves gas and memory by not storing the structure fields in memory slots.\n *\n * Layout:\n * 200 bits poolId | 24 bits tickUpper | 24 bits tickLower | 8 bits hasSubscriber\n *\n * Fields in the direction from the least significant bit:\n *\n * A flag to know if the tokenId is subscribed to an address\n * uint8 hasSubscriber;\n *\n * The tickUpper of the position\n * int24 tickUpper;\n *\n * The tickLower of the position\n * int24 tickLower;\n *\n * The truncated poolId. Truncates a bytes32 value so the most signifcant (highest) 200 bits are used.\n * bytes25 poolId;\n *\n * Note: If more bits are needed, hasSubscriber can be a single bit.\n *\n */\ntype PositionInfo is uint256;\n\nusing PositionInfoLibrary for PositionInfo global;\n\nlibrary PositionInfoLibrary {\n    PositionInfo internal constant EMPTY_POSITION_INFO = PositionInfo.wrap(0);\n\n    uint256 internal constant MASK_UPPER_200_BITS = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000;\n    uint256 internal constant MASK_8_BITS = 0xFF;\n    uint24 internal constant MASK_24_BITS = 0xFFFFFF;\n    uint256 internal constant SET_UNSUBSCRIBE = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00;\n    uint256 internal constant SET_SUBSCRIBE = 0x01;\n    uint8 internal constant TICK_LOWER_OFFSET = 8;\n    uint8 internal constant TICK_UPPER_OFFSET = 32;\n\n    /// @dev This poolId is NOT compatible with the poolId used in UniswapV4 core. It is truncated to 25 bytes, and just used to lookup PoolKey in the poolKeys mapping.\n    function poolId(PositionInfo info) internal pure returns (bytes25 _poolId) {\n        assembly (\"memory-safe\") {\n            _poolId := and(MASK_UPPER_200_BITS, info)\n        }\n    }\n\n    function tickLower(PositionInfo info) internal pure returns (int24 _tickLower) {\n        assembly (\"memory-safe\") {\n            _tickLower := signextend(2, shr(TICK_LOWER_OFFSET, info))\n        }\n    }\n\n    function tickUpper(PositionInfo info) internal pure returns (int24 _tickUpper) {\n        assembly (\"memory-safe\") {\n            _tickUpper := signextend(2, shr(TICK_UPPER_OFFSET, info))\n        }\n    }\n\n    function hasSubscriber(PositionInfo info) internal pure returns (bool _hasSubscriber) {\n        assembly (\"memory-safe\") {\n            _hasSubscriber := and(MASK_8_BITS, info)\n        }\n    }\n\n    /// @dev this does not actually set any storage\n    function setSubscribe(PositionInfo info) internal pure returns (PositionInfo _info) {\n        assembly (\"memory-safe\") {\n            _info := or(info, SET_SUBSCRIBE)\n        }\n    }\n\n    /// @dev this does not actually set any storage\n    function setUnsubscribe(PositionInfo info) internal pure returns (PositionInfo _info) {\n        assembly (\"memory-safe\") {\n            _info := and(info, SET_UNSUBSCRIBE)\n        }\n    }\n\n    /// @notice Creates the default PositionInfo struct\n    /// @dev Called when minting a new position\n    /// @param _poolKey the pool key of the position\n    /// @param _tickLower the lower tick of the position\n    /// @param _tickUpper the upper tick of the position\n    /// @return info packed position info, with the truncated poolId and the hasSubscriber flag set to false\n    function initialize(PoolKey memory _poolKey, int24 _tickLower, int24 _tickUpper)\n        internal\n        pure\n        returns (PositionInfo info)\n    {\n        bytes25 _poolId = bytes25(PoolId.unwrap(_poolKey.toId()));\n        assembly {\n            info := or(\n                or(and(MASK_UPPER_200_BITS, _poolId), shl(TICK_UPPER_OFFSET, and(MASK_24_BITS, _tickUpper))),\n                shl(TICK_LOWER_OFFSET, and(MASK_24_BITS, _tickLower))\n            )\n        }\n    }\n}\n"},"src/ClausFeeBudget.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @notice One aggregate trading budget and a per-trade allocation snapshot.\n/// @dev Plan fields: project, platform, burn, LP rewards, NFT rewards, module.\n/// Each is 24 bits; low 24 bits hold total rate + 1 (zero is the inactive sentinel).\nlibrary ClausFeeBudget {\n    uint24 internal constant TOTAL_CAP = 150_000;\n    uint24 internal constant MAX_RATE = 149_000;\n    uint24 internal constant BASE = 23_000;\n    uint256 internal constant DEFAULT_PLAN = uint256(23001) | (uint256(13000)<<24)\n        | (uint256(3000)<<48) | (uint256(1500)<<72) | (uint256(2000)<<96) | (uint256(3500)<<120);\n    bytes32 private constant TRADE = keccak256(\"claus.protected.current-trade.v2\");\n    function start(uint256 packed,address selectedModule) internal {\n        bytes32 slot=TRADE;assembly{tstore(slot,packed) tstore(add(slot,1),selectedModule)}\n    }\n    function plan() internal view returns(uint256 value) {bytes32 slot=TRADE;assembly{value:=tload(slot)}if(value==0)value=DEFAULT_PLAN;}\n    function rate() internal view returns(uint256) {return (plan() & 0xffffff)-1;}\n    function pips(uint256 index) internal view returns(uint256) {return (plan() >> ((index+1)*24)) & 0xffffff;}\n    function module() internal view returns(address value) {bytes32 slot=TRADE;assembly{value:=tload(add(slot,1))}}\n    function recordFee(uint256 fee,uint256 extra) internal {bytes32 slot=TRADE;assembly{tstore(add(slot,2),fee) tstore(add(slot,3),extra)}}\n    function recordedFee() internal view returns(uint256 fee,uint256 extra) {bytes32 slot=TRADE;assembly{fee:=tload(add(slot,2)) extra:=tload(add(slot,3))}}\n    function finish() internal {bytes32 slot=TRADE;assembly{tstore(slot,0) tstore(add(slot,1),0) tstore(add(slot,2),0) tstore(add(slot,3),0)}}\n    function grossFee(uint256 gross) internal view returns(uint256) {return gross*rate()/1_000_000;}\n    function netFee(uint256 net) internal view returns(uint256) {uint256 r=rate();return net*r/(1_000_000-r);}\n}\n"},"src/ProtectedHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\n\nimport {FeeNftStakingHook} from \"./legacy/privacy/FeeNftStakingHook.sol\";\nimport {ClausPrivacyBuy} from \"./legacy/privacy/ClausPrivacyBuy.sol\";\nimport {IClausLpRewards} from \"./legacy/privacy/FeeLpRewardsHook.sol\";\nimport {LpRemainderProcessor} from \"./legacy/LpRemainderProcessor.sol\";\nimport {ClausNftStaking} from \"./legacy/ClausNftStaking.sol\";\nimport {TradeExtensionHost} from \"./TradeExtensionHost.sol\";\nimport {ClausFeeBudget} from \"./ClausFeeBudget.sol\";\ninterface IFeeGovernor { function owner() external view returns(address); }\ninterface IBurnToken { function burn(uint256) external; }\n\n/// @notice Protected settlement core with replaceable fee and product programs.\n/// @dev Final inherited accounting kernel. No arbitrary or replaceable delegate target.\ncontract ProtectedHook is FeeNftStakingHook {\n    using StateLibrary for IPoolManager;\n    address private constant HOOK = 0x37Bfb8AC7C960E558657871D41Ca70E07e7DbfFf;\n    address private constant ADMIN = 0x1f22E4B065b2f15Fed5BE556DC0fA636048d29bc;\n    address private constant TOKEN = 0x1b54E762aa34CF6E28E9C082F2848e28E45DA6b8;\n    IPoolManager private constant MANAGER = IPoolManager(0x000000000004444c5dc75cB358380D2e3dE08A90);\n    uint256 public constant WINDOW = 8 hours;\n    uint256 public constant DURATION = 12 hours;\n    bytes32 private constant SLOT = keccak256(\"claus.hook.timed-buyback.2026-10-15.v1\");\n    struct Schedule { uint64 startsAt; uint64 endsAt; uint64 checkpoint; uint64 streamEndsAt; uint256 lockedEth; uint256 availableEth; }\n    error InvalidContext();\n    error InvalidActivation();\n    event TimedBuybackActivated(uint64 startsAt, uint64 endsAt, uint256 windowSeconds);\n\n\n    address public immutable implementationSelf = address(this);\n    TradeExtensionHost public immutable extensions;\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_, IClausLpRewards lpRewards_, LpRemainderProcessor remainder_, ClausNftStaking staking_, TradeExtensionHost extensions_)\n        FeeNftStakingHook(base, privacyBuy_, lpRewards_, remainder_, staking_) {\n        // Existing mandatory dependencies cannot be replaced while sealing the core.\n        _pin(address(base.manager), 0x000000000004444c5dc75cB358380D2e3dE08A90, 0x785f1014552b7ce7d5fb7d0c970ca60edee94fd00425d7ca21609acac7ce1293);\n        _pin(address(base.project), 0x49A91293a8dFf24d5c54b798C45376301D29b9f3, 0x4b7d19bb5a7437581d6359ce496b9b25ef6971ca8776bfc56fb515d8e92edc51);\n        _pin(address(base.platform), 0xF1749E78e76CfE1119206833aE93beD2dede5353, 0x0c809a6af46fb81e31c079263cf6889f1002eb4a3d71508d1cfa0f1fdccd709c);\n        _pin(address(base.reserve), 0x136589bE852aB8D9541F923B04064E362C2F357A, 0x1ba19c78683fcdca321006b491961704038a75d8bae969d4ac7eb363987a4bc9);\n        _pin(address(base.feed), 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419, 0x4b79b5c8aee6da0f7b393e8b53e6265ef7320a1d16184c65bd3841b5aa3d700d);\n        _pin(address(base.fomo), 0x72d94600A7A57Afb6A2090e9739fd8ab21e02EB2, 0x38e9854f45420e983b7e429772e6c0fd3b6ce0327d22f09593d9be5de7c78b4e);\n        _pin(address(base.processor), 0x271f808cb55C7Cbbb3d4df0DA075deF9AE5F7340, 0x5edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c5);\n        _pin(address(base.nft), 0x80396c7131159eB92E7E84839e51C9887A7A95d9, 0x162a8f628e26a75e99b59459595aa3dab79d928bab90263195364a48d91a8212);\n        _pin(address(base.oracle), 0xC594bdFBA256c79F6069df9e89Ea78D6312Fadd7, 0x0c382e71978ff7c7a8ae6ccbb5ae72ff7e3c7348b633fa568e61bc227c0e600f);\n        _pin(address(privacyBuy_), 0xC0AeabdeF1760d0Dcba28A20C15701F74216e77a, 0x895d8d18e1ddae18be624a5d6eb91ecbef32463239286ea0f089cbaf4d73cb14);\n        _pin(address(lpRewards_), 0xB2304d3DE407398de441b147e2c64c7c48DAf44E, 0x6e6bc3de6394814b173f45ad91823a00d221177e3f55ac950aa51b0527aaeee5);\n        _pin(address(remainder_), 0x51629bca14098A4f1AD77cd7E85212d67349823d, 0x63ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2);\n        _pin(address(staking_), 0x4e5916428452891E1deb59d162c20266ED08CAD4, 0xe9609b506e4fb7529489bead6fb1212a3751c585ca01e7ea8162eaf717284ee2);\n        if (base.attester != 0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982\n            || base.questionHash != 0x39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d787\n            || base.spacing != 1) revert InvalidActivation();\n        // The extension host is deployed from this exact fixed source before finalization.\n        if(address(extensions_).codehash != keccak256(type(TradeExtensionHost).runtimeCode)) revert InvalidActivation();\n        extensions=extensions_;\n        // Only the two exact immutable legacy processors may execute in kernel context.\n        // No extension setter can replace them, their code or their destinations.\n        if (address(base.manager) != address(MANAGER) || base.reserve.token() != TOKEN || base.reserve.hook() != HOOK\n            || address(base.processor) != 0x271f808cb55C7Cbbb3d4df0DA075deF9AE5F7340\n            || address(base.processor).codehash != 0x5edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c5\n            || address(remainder_) != 0x51629bca14098A4f1AD77cd7E85212d67349823d\n            || address(remainder_).codehash != 0x63ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2)\n            revert InvalidActivation();\n    }\n    function _pin(address actual, address expected, bytes32 runtimeHash) private view {\n        if (actual != expected || actual.codehash != runtimeHash) revert InvalidActivation();\n    }\n    function protectionVersion() external pure returns(uint256) { return 1; }\n    function protectionKind() external pure returns(bytes32) { return keccak256(\"CLAUS_HOOK\"); }\n    function maximumTotalTaxPips() external pure returns(uint24) { return 150_000; }\n    function totalHookFeePips() external view returns(uint256) { return ClausFeeBudget.rate(); }\n    /// @notice Quote depends on the current program and trade data; default rate alone is not a quote.\n    function quoteTradeFee(address sender,bool buy,int256 amountSpecified,bytes calldata data) public view returns(address module,uint24 totalPips) {\n        uint256 packed;(module,packed)=extensions.quote(sender,buy,amountSpecified,data);\n        totalPips=uint24(packed & 0xffffff)-1;\n    }\n    function _beforeSwapExtension(address sender,PoolKey calldata,SwapParams calldata params,bytes calldata data) internal override {\n        (address module,uint256 packed)=extensions.quote(sender,params.zeroForOne,params.amountSpecified,data);\n        ClausFeeBudget.start(packed,module);\n    }\n    function _afterSwapExtension(address sender,PoolKey calldata,SwapParams calldata params,BalanceDelta delta,bytes calldata data) internal override {\n        address module=ClausFeeBudget.module();\n        if(module!=address(0)){\n            (uint256 fee,uint256 extra)=ClausFeeBudget.recordedFee();\n            extensions.record(module,sender,params.zeroForOne,delta.amount0(),delta.amount1(),fee,extra,keccak256(data));\n        }\n        ClausFeeBudget.finish();\n    }\n    function activateTimedBuyback() external pure { revert InvalidActivation(); }\n\n    /// @notice Linear release of the reserve over eight hours from the latest fee top-up.\n    /// New fees extend the unvested stream; skipped batches keep their vested allowance.\n    /// After twelve hours the previous ordinary processor resumes automatically.\n    function timedBuybackState() external view returns (uint64 startsAt, uint64 endsAt, bool active, uint256 availableEth) {\n        Schedule storage s = _schedule();\n        active = _active(s);\n        (uint256 available,,) = active ? _released(s, _pending()) : (uint256(0), uint256(0), uint64(0));\n        return (s.startsAt, s.endsAt, active, available);\n    }\n\n    function processBuybacksDuringSwap(address sender) public override {\n        if (address(this) != HOOK || msg.sender != HOOK) revert InvalidContext();\n        Schedule storage s = _schedule();\n        if (!_active(s)) { super.processBuybacksDuringSwap(sender); return; }\n        (uint256 budget, uint256 locked, uint64 streamEnd) = _released(s, _pending());\n        s.availableEth = budget;\n        s.lockedEth = locked;\n        s.checkpoint = uint64(block.timestamp);\n        s.streamEndsAt = streamEnd;\n        PoolKey memory key = PoolKey(Currency.wrap(address(0)), Currency.wrap(TOKEN), 0x800000, 1, IHooks(HOOK));\n        uint128 liquidity = MANAGER.getLiquidity(key.toId());\n        if (budget == 0 || liquidity == 0) return;\n        (uint160 price,,,) = MANAGER.getSlot0(key.toId());\n        if (price <= TickMath.MIN_SQRT_PRICE + 1) return;\n        // Keep both the existing ~1% price-impact limit and a 1% active virtual-ETH cap.\n        uint256 depthCap = FullMath.mulDiv(uint256(liquidity), 1 << 96, uint256(price)) / 100;\n        if (budget > depthCap) budget = depthCap;\n        if (budget > uint256(uint128(type(int128).max))) budget = uint256(uint128(type(int128).max));\n        if (budget == 0) return;\n        uint160 limit = uint160(uint256(price) * 995 / 1000);\n        if (limit <= TickMath.MIN_SQRT_PRICE) limit = TickMath.MIN_SQRT_PRICE + 1;\n        MANAGER.burn(HOOK, 0, budget);\n        BalanceDelta bought = MANAGER.swap(key, SwapParams(true, -int256(budget), limit), bytes(\"\"));\n        uint256 spent = uint256(-int256(bought.amount0()));\n        uint256 tokens = uint256(uint128(bought.amount1()));\n        if (spent < budget) MANAGER.mint(HOOK, 0, budget - spent);\n        s.availableEth -= spent;\n        if (tokens != 0) {\n            MANAGER.take(key.currency1, HOOK, tokens);\n            IBurnToken(TOKEN).burn(tokens);\n        }\n        emit BuybackBurn(key.toId(), sender, spent, tokens, MANAGER.balanceOf(HOOK, 0));\n    }\n\n    function _pending() private view returns (uint256) {\n        uint256 p = MANAGER.balanceOf(HOOK, 0);\n        return p == 0 ? 0 : p - 1; // Retain the existing warm-slot reserve dust.\n    }\n    function _released(Schedule storage s, uint256 pending) private view returns (uint256 available, uint256 locked, uint64 streamEnd) {\n        available = s.availableEth;\n        locked = s.lockedEth;\n        streamEnd = s.streamEndsAt;\n        if (pending < available + locked) revert InvalidContext();\n        uint256 added = pending - available - locked;\n        if (locked != 0 && block.timestamp > s.checkpoint) {\n            uint256 released = block.timestamp >= streamEnd ? locked :\n                FullMath.mulDiv(locked, block.timestamp - s.checkpoint, streamEnd - s.checkpoint);\n            available += released;\n            locked -= released;\n        }\n        if (added != 0) {\n            locked += added;\n            streamEnd = uint64(block.timestamp + WINDOW);\n        }\n    }\n    function _active(Schedule storage s) private view returns (bool) {\n        return s.endsAt != 0 && block.timestamp >= s.startsAt && block.timestamp < s.endsAt;\n    }\n    function _schedule() private pure returns (Schedule storage s) {\n        bytes32 slot = SLOT;\n        assembly { s.slot := slot }\n    }\n}\n"},"src/TradeExtensionHost.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol\";\n\nimport {ClausFeeBudget} from \"./ClausFeeBudget.sol\";\n\ninterface IClausGovernor { function owner() external view returns(address); }\n\n/// @notice Replaceable trade programs, isolated from the permanent token/accounting core.\n/// @dev A quote is read-only and bounded. Stateful execution is a separate transaction:\n/// arbitrary CALLs inside an unlocked PoolManager can poison its transient accounting,\n/// so even caught reverts are not a sufficient sandbox for synchronous callbacks.\ncontract TradeExtensionHost {\n    using TransientStateLibrary for IPoolManager;\n    using StateLibrary for IPoolManager;\n    address public constant HOOK = 0x37Bfb8AC7C960E558657871D41Ca70E07e7DbfFf;\n    address public constant TOKEN = 0x1b54E762aa34CF6E28E9C082F2848e28E45DA6b8;\n    IPoolManager public constant MANAGER = IPoolManager(0x000000000004444c5dc75cB358380D2e3dE08A90);\n    uint256 public constant QUOTE_GAS = 80_000;\n    uint24 public constant MAX_RATE = 149_000;\n    address public activeModule;\n    uint256 public nextReceipt;\n    mapping(uint256 => bytes32) public pending;\n    bytes32 private constant EXECUTING = keccak256(\"claus.trade-extension.executing.v1\");\n    struct Trade {\n        uint256 id;\n        address module;\n        address sender;\n        bool buy;\n        int128 amount0;\n        int128 amount1;\n        uint256 feeEth;\n        uint256 moduleFeeEth;\n        uint256 blockNumber;\n        uint256 timestamp;\n        bytes32 dataHash;\n    }\n    event ModuleChanged(address indexed previous,address indexed current);\n    event TradeRecorded(uint256 indexed id,address indexed module,Trade trade);\n    event TradeExecuted(uint256 indexed id,address indexed module);\n    error NotAuthorized();\n    error InvalidModule();\n    error InvalidReceipt();\n    error NotOutsideSwap();\n    error ModuleExecutionFailed();\n    error HookDataTooLarge();\n    error InsufficientQuoteGas();\n\n    function setModule(address module) external {\n        if(msg.sender != IClausGovernor(TOKEN).owner()) revert NotAuthorized();\n        if(module==address(this) || module==HOOK || module==TOKEN || module==address(MANAGER)\n            || (module!=address(0) && module.code.length==0)) revert InvalidModule();\n        address previous=activeModule;activeModule=module;emit ModuleChanged(previous,module);\n    }\n\n    /// @notice Six fee allocations in pips: project, platform, burn, LP, NFT, module.\n    /// Invalid, reverting, oversized or out-of-gas programs use the existing default.\n    /// No allocation is a second fee: their SUM is the single quoted rate.\n    function quote(address sender,bool buy,int256 amountSpecified,bytes calldata data)\n        external view returns(address module,uint256 packed)\n    {\n        // Caller-chosen malformed inputs must not select the fallback fee plan.\n        // Program failures still fall back below; ordinary empty-data trades work.\n        if(data.length>4096) revert HookDataTooLarge();\n        module=activeModule;packed=ClausFeeBudget.DEFAULT_PLAN;\n        if(module==address(0)) return(module,packed);\n        if(gasleft()<QUOTE_GAS+25_000) revert InsufficientQuoteGas();\n        PoolKey memory key=PoolKey(Currency.wrap(address(0)),Currency.wrap(TOKEN),0x800000,1,IHooks(HOOK));\n        (uint160 price,,,)=MANAGER.getSlot0(key.toId());\n        bytes memory input=abi.encodeWithSelector(IClausTradeModule.quote.selector,sender,buy,amountSpecified,price,MANAGER.getLiquidity(key.toId()),data);\n        uint256[6] memory allocations;bool ok;\n        assembly (\"memory-safe\") {\n            ok := staticcall(80000,module,add(input,32),mload(input),allocations,192)\n            ok := and(ok,eq(returndatasize(),192))\n        }\n        if(!ok) return(module,packed);\n        uint256 sum;uint256 proposed;\n        for(uint256 i=0;i<6;i++){\n            uint256 value=allocations[i];\n            if(value>MAX_RATE) return(module,packed);\n            sum+=value;proposed|=value<<((i+1)*24);\n        }\n        // Ignore the entire invalid plan; it can never force a swap revert.\n        if(sum>MAX_RATE)return(module,packed);\n        packed=proposed | (sum+1);\n    }\n\n    /// @dev Only the fixed hook can attest a successfully accounted trade.\n    /// Receipt stays bound to its original module even if a new module is installed.\n    function record(address module,address sender,bool buy,int128 amount0,int128 amount1,uint256 feeEth,uint256 moduleFeeEth,bytes32 dataHash) external {\n        if(msg.sender!=HOOK) revert NotAuthorized();\n        Trade memory trade=Trade(++nextReceipt,module,sender,buy,amount0,amount1,feeEth,moduleFeeEth,block.number,block.timestamp,dataHash);\n        pending[trade.id]=keccak256(abi.encode(trade));emit TradeRecorded(trade.id,module,trade);\n    }\n\n    /// @notice Anyone can deliver an original receipt once, with no authority over funds.\n    /// Failure rolls back only this delivery; the original swap remains completed.\n    /// No value or allowance is granted. The module can use only its own assets.\n    function execute(Trade calldata trade,bytes calldata hookData,uint256 gasLimit) external {\n        bytes32 slot=EXECUTING;uint256 busy;assembly{busy:=tload(slot)}\n        if(busy!=0 || MANAGER.isUnlocked()) revert NotOutsideSwap();\n        if(trade.module==address(0) || hookData.length>4096 || trade.dataHash!=keccak256(hookData) || pending[trade.id]!=keccak256(abi.encode(trade))) revert InvalidReceipt();\n        if(gasLimit<10_000 || gasLimit>5_000_000 || gasleft()<gasLimit+gasLimit/63+30_000) revert ModuleExecutionFailed();\n        delete pending[trade.id];assembly{tstore(slot,1)}\n        bytes memory data=abi.encodeCall(IClausTradeModule.onTrade,(trade,hookData));bool ok;bytes32 result;address module=trade.module;\n        assembly (\"memory-safe\") {\n            let out:=mload(0x40)\n            ok:=call(gasLimit,module,0,add(data,32),mload(data),out,32)\n            ok:=and(ok,eq(returndatasize(),32))\n            result:=mload(out)\n        }\n        if(!ok || result!=bytes32(IClausTradeModule.onTrade.selector)) revert ModuleExecutionFailed();\n        assembly{tstore(slot,0)}emit TradeExecuted(trade.id,trade.module);\n    }\n}\n\ninterface IClausTradeModule {\n    function quote(address sender,bool buy,int256 amountSpecified,uint160 price,uint128 liquidity,bytes calldata data) external view returns(uint256[6] memory allocationPips);\n    function onTrade(TradeExtensionHost.Trade calldata trade,bytes calldata data) external returns(bytes4);\n}\n"},"src/legacy/ArenaTide.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @notice Bounded market pulses for the offchain, wallet-free Claus arena.\n/// @dev No player custody, game results, randomness, prizes, oracle calls or external writes.\nabstract contract ArenaTide {\n    bytes32 private constant ARENA_SLOT = keccak256(\"claus.arena.tide.v1\");\n    uint64 public constant ARENA_PULSE_INTERVAL = 12 seconds;\n\n    // Deliberately one storage word. Existing launch/weather/reserve slots are untouched.\n    struct ArenaState { uint64 sequence; uint64 lastPulseAt; }\n    event ArenaPulse(uint64 indexed sequence, uint64 timestamp);\n\n    function arenaState() external view returns (uint64 sequence, uint64 lastPulseAt) {\n        ArenaState storage state = _arena();\n        return (state.sequence, state.lastPulseAt);\n    }\n\n    function _recordArenaTrade() internal {\n        ArenaState storage state = _arena();\n        uint256 packed;\n        assembly (\"memory-safe\") { packed := sload(state.slot) }\n        uint64 sequence = uint64(packed);\n        uint64 lastPulseAt = uint64(packed >> 64);\n        if (block.timestamp < uint256(lastPulseAt) + ARENA_PULSE_INTERVAL ||\n            sequence == type(uint64).max || block.timestamp > type(uint64).max) return;\n        unchecked { ++sequence; }\n        uint64 timestamp = uint64(block.timestamp);\n        // One write; retain the unused high half of the existing storage word.\n        uint256 next = (packed & (type(uint256).max << 128)) | uint256(sequence) | (uint256(timestamp) << 64);\n        assembly (\"memory-safe\") { sstore(state.slot, next) }\n        emit ArenaPulse(sequence, timestamp);\n    }\n\n    function _arena() private pure returns (ArenaState storage state) {\n        bytes32 slot = ARENA_SLOT;\n        assembly { state.slot := slot }\n    }\n}\n"},"src/legacy/ClausArt.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Base64} from \"@openzeppelin/contracts/utils/Base64.sol\";\nimport {Strings} from \"@openzeppelin/contracts/utils/Strings.sol\";\n\n/// @notice Immutable data, not an executable art generator or an upgradeable URL.\ncontract ClausArtData {\n    constructor(bytes memory data) {\n        require(data.length <= 24_000, \"art chunk too large\");\n        bytes memory runtime = bytes.concat(hex\"00\", data);\n        assembly (\"memory-safe\") { return(add(runtime, 32), mload(runtime)) }\n    }\n}\n\n/// @notice All 300 original SVGs are frozen in deployed bytecode.\ncontract ClausArt {\n    using Strings for uint256;\n    address[] public banks;\n    uint64[300] private locations;\n    bytes32 public immutable manifestHash;\n\n    constructor(address[] memory banks_, uint64[300] memory locations_, bytes32 hash_) {\n        require(banks_.length > 0 && banks_.length < 256 && hash_ != bytes32(0), \"art config\");\n        for (uint256 i; i < banks_.length; ++i) require(banks_[i].code.length > 1, \"empty bank\");\n        banks = banks_; locations = locations_; manifestHash = hash_;\n        for (uint256 i; i < 300; ++i) {\n            uint64 v = locations_[i]; uint256 bank = v >> 32;\n            uint256 offset = uint16(v >> 16); uint256 length = uint16(v);\n            require(bank < banks_.length && length > 0 && offset > 0\n                && offset + length <= banks_[bank].code.length, \"invalid art pointer\");\n        }\n    }\n\n    function image(uint256 id) public view returns (string memory) {\n        require(id > 0 && id <= 300, \"unknown identity\");\n        uint64 loc = locations[id - 1]; address bank = banks[loc >> 32];\n        uint256 offset = uint16(loc >> 16); uint256 length = uint16(loc);\n        bytes memory data = new bytes(length);\n        assembly (\"memory-safe\") { extcodecopy(bank, add(data, 32), offset, length) }\n        return string(data);\n    }\n\n    function tokenURI(uint256 id) external view returns (string memory) {\n        string memory label = id.toString();\n        return string.concat(\"data:application/json;base64,\", Base64.encode(bytes(string.concat(\n            '{\"name\":\"Claus #', label, '\",\"description\":\"One of 300 fixed Claus identities. Backed by 50,000 deposited CLAUS, redeemable by its current owner. Equal time-weighted participation in the NFT reward allocation. Artwork and identity remain the same after redemption and remint.\",\"image\":\"data:image/svg+xml;base64,',\n            Base64.encode(bytes(image(id))), '\",\"external_url\":\"https://claus.si/Hooks/NFTs?identity=', label,\n            '\",\"attributes\":[{\"trait_type\":\"Identity\",\"value\":', label,\n            '},{\"trait_type\":\"Backing (CLAUS)\",\"value\":50000},{\"trait_type\":\"Reward weight\",\"value\":1}]}'\n        ))));\n    }\n\n    function contractURI() external pure returns (string memory) {\n        return string.concat(\"data:application/json;base64,\", Base64.encode(bytes(\n            '{\"name\":\"Claus\",\"description\":\"300 fixed identities. Each live NFT holds 50,000 deposited CLAUS and participates equally by holding time in the NFT reward allocation.\",\"external_link\":\"https://claus.si/Hooks/NFTs\",\"image\":\"https://claus.si/assets/claus-profile.png\",\"collaborators\":[]}'\n        )));\n    }\n}\n"},"src/legacy/ClausNFT.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {ERC721} from \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {NftRewards} from \"./NftRewards.sol\";\nimport {ClausArt} from \"./ClausArt.sol\";\nimport {VRFV2PlusWrapperConsumerBase} from \"./vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol\";\nimport {VRFV2PlusClient} from \"./vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol\";\n\n/// @notice 300 fixed identities backed only by existing deposited CLAUS.\n/// @dev No admin collateral withdrawal, mint bypass, art replacement or random reroll.\ncontract ClausNFT is ERC721, NftRewards, VRFV2PlusWrapperConsumerBase {\n    using SafeERC20 for IERC20;\n    uint256 public constant BACKING = 50_000 ether;\n    uint256 public constant CAPACITY = 300;\n    uint32 public constant CALLBACK_GAS = 110_000;\n    uint16 public constant CONFIRMATIONS = 10;\n    IERC20 public immutable token;\n    ClausArt public immutable art;\n    address public immutable owner;\n    bool public mintOpen;\n    uint32 public totalSupply;\n    uint32 public pendingCount;\n    uint256 public reservedBacking;\n    mapping(address => bool) public mintUsed;\n    mapping(address => uint256) public mintRequest;\n    mapping(uint256 => uint256) public transferNonce;\n    mapping(address => uint256) public nativeRefund;\n    uint256 public refundLiability;\n\n    struct Request { address minter; uint64 created; bool ready; bool cancelled; bool settled; uint256 randomness; }\n    mapping(uint256 => Request) public requests;\n    uint256[] public queue;\n    uint256 public queueHead;\n    uint16[] private freeIds;\n    uint16[] private returnedIds;\n    error MintUnavailable();\n    error MintAlreadyUsed();\n    error InvalidBacking();\n    error NotOwner();\n    error InvalidRequest();\n    error RefundFailed();\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    event MintOpened();\n    event MintRequested(address indexed minter, uint256 indexed requestId, uint256 oracleFee);\n    event RandomnessReady(uint256 indexed requestId);\n    event MintCancelled(address indexed minter, uint256 indexed requestId);\n    event Minted(address indexed minter, uint256 indexed id, uint256 indexed requestId);\n    event Redeemed(address indexed account, uint256 indexed id, uint256 returnedTokens);\n\n    constructor(IERC20 token_, IPoolManager manager_, address hook_, ClausArt art_, address wrapper_, address owner_)\n        ERC721(\"Claus\", \"CLAUS-NFT\") NftRewards(manager_, hook_) VRFV2PlusWrapperConsumerBase(wrapper_)\n    {\n        require(address(token_).code.length != 0 && address(art_).code.length != 0 && owner_ != address(0), \"NFT config\");\n        token = token_; art = art_; owner = owner_;\n        for (uint16 id = 1; id <= CAPACITY; ++id) freeIds.push(id);\n        emit OwnershipTransferred(address(0), owner_);\n    }\n\n    function openMint() external {\n        if (msg.sender != owner) revert NotOwner();\n        if (mintOpen) revert MintUnavailable();\n        mintOpen = true; emit MintOpened();\n    }\n\n    function tokenURI(uint256 id) public view override returns (string memory) {\n        _requireOwned(id); return art.tokenURI(id);\n    }\n    function contractURI() external view returns (string memory) { return art.contractURI(); }\n    function available() public view returns (uint256) { return freeIds.length - pendingCount; }\n    function waitingForReveal() external view returns (uint256) { return returnedIds.length; }\n    function requiredBacking() public view returns (uint256) { return uint256(totalSupply) * BACKING + reservedBacking; }\n\n    function mintPrice(uint256 gasPriceWei) external view returns (uint256) {\n        if (freeIds.length == 1 && pendingCount == 0) return 0;\n        return i_vrfV2PlusWrapper.estimateRequestPriceNative(CALLBACK_GAS, 1, gasPriceWei);\n    }\n\n    /// @notice Commit once per wallet. A sole free identity is already known and needs no oracle.\n    function requestMint() external payable nonReentrant returns (uint256 requestId) {\n        if (!mintOpen || available() == 0) revert MintUnavailable();\n        if (mintUsed[msg.sender]) revert MintAlreadyUsed();\n        uint256 oraclePrice = freeIds.length == 1 && pendingCount == 0 ? 0\n            : i_vrfV2PlusWrapper.calculateRequestPriceNative(CALLBACK_GAS, 1);\n        if (msg.value < oraclePrice) revert InvalidRequest();\n        mintUsed[msg.sender] = true;\n        uint256 beforeBalance = token.balanceOf(address(this));\n        token.safeTransferFrom(msg.sender, address(this), BACKING);\n        if (token.balanceOf(address(this)) != beforeBalance + BACKING) revert InvalidBacking();\n        if (oraclePrice == 0) {\n            uint256 id = freeIds[freeIds.length - 1]; freeIds.pop();\n            _mint(msg.sender, id);\n            emit Minted(msg.sender, id, 0);\n        } else {\n            reservedBacking += BACKING;\n            ++pendingCount;\n            (requestId,) = requestRandomnessPayInNative(CALLBACK_GAS, CONFIRMATIONS, 1,\n                VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})));\n            if (requestId == 0 || requests[requestId].minter != address(0)) revert InvalidRequest();\n            requests[requestId] = Request(msg.sender, uint64(block.timestamp), false, false, false, 0);\n            mintRequest[msg.sender] = requestId;\n            queue.push(requestId);\n            emit MintRequested(msg.sender, requestId, oraclePrice);\n        }\n        uint256 excess = msg.value - oraclePrice;\n        if (excess != 0) {\n            (bool ok,) = payable(msg.sender).call{value: excess, gas: 30_000}(\"\");\n            if (!ok) { nativeRefund[msg.sender] += excess; refundLiability += excess; }\n        }\n    }\n\n    /// @notice Return pending principal immediately; the wallet's committed mint opportunity stays used.\n    /// @dev The request is never rerolled or removed from the random queue. Its eventual identity is recycled.\n    function cancelMint() external nonReentrant {\n        uint256 id = mintRequest[msg.sender]; Request storage request = requests[id];\n        if (id == 0 || request.minter != msg.sender || request.cancelled || request.settled) revert InvalidRequest();\n        request.cancelled = true; reservedBacking -= BACKING;\n        token.safeTransfer(msg.sender, BACKING);\n        emit MintCancelled(msg.sender, id);\n    }\n\n    function withdrawNativeRefund(address payable recipient) external nonReentrant {\n        uint256 amount = nativeRefund[msg.sender];\n        if (amount == 0 || recipient == address(0)) revert InvalidRequest();\n        nativeRefund[msg.sender] = 0; refundLiability -= amount;\n        (bool ok,) = recipient.call{value: amount}(\"\"); if (!ok) revert RefundFailed();\n    }\n\n    /// @dev Only the authenticated wrapper can call the inherited entry point. Store first, do no receiver calls.\n    function fulfillRandomWords(uint256 requestId, uint256[] memory words) internal override {\n        Request storage request = requests[requestId];\n        if (request.minter == address(0) || request.ready || words.length == 0) return;\n        request.randomness = words[0]; request.ready = true;\n        emit RandomnessReady(requestId);\n    }\n\n    /// @notice Ordered processing makes out-of-order oracle callbacks irrelevant to allocation.\n    function finishMints(uint256 limit) external nonReentrant {\n        if (limit == 0 || limit > 20) revert InvalidRequest();\n        uint256 stop = queueHead + limit;\n        while (queueHead < queue.length && queueHead < stop) {\n            uint256 requestId = queue[queueHead]; Request storage request = requests[requestId];\n            if (!request.ready) break;\n            uint256 index = request.randomness % freeIds.length;\n            uint256 id = freeIds[index];\n            freeIds[index] = freeIds[freeIds.length - 1]; freeIds.pop();\n            request.settled = true; ++queueHead; --pendingCount;\n            if (request.cancelled) returnedIds.push(uint16(id));\n            else {\n                reservedBacking -= BACKING;\n                // The minter explicitly requested delivery to this same address; no arbitrary receiver callback.\n                _mint(request.minter, id);\n                emit Minted(request.minter, id, requestId);\n            }\n        }\n        if (pendingCount == 0) _releaseReturned();\n        if (token.balanceOf(address(this)) < requiredBacking()) revert InvalidBacking();\n    }\n\n    function redeem(uint256 id) external nonReentrant {\n        if (ownerOf(id) != msg.sender) revert NotOwner();\n        _burn(id);\n        if (pendingCount == 0) freeIds.push(uint16(id)); else returnedIds.push(uint16(id));\n        token.safeTransfer(msg.sender, BACKING);\n        emit Redeemed(msg.sender, id, BACKING);\n    }\n\n    function _releaseReturned() private {\n        while (returnedIds.length != 0) { freeIds.push(returnedIds[returnedIds.length - 1]); returnedIds.pop(); }\n    }\n\n    function _update(address to, uint256 id, address auth) internal override returns (address from) {\n        from = super._update(to, id, auth);\n        ++transferNonce[id];\n        if (from != to) {\n            if (from != address(0)) _recordOwnerUnits(from, uint32(balanceOf(from)));\n            if (to != address(0)) _recordOwnerUnits(to, uint32(balanceOf(to)));\n            if (from == address(0)) { ++totalSupply; _recordSupply(totalSupply); }\n            else if (to == address(0)) { --totalSupply; _recordSupply(totalSupply); }\n        }\n    }\n}\n"},"src/legacy/ClausNftStaking.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {IERC721Receiver} from \"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\n\ninterface IClausNftBinding {\n    function poolManager() external view returns (IPoolManager);\n    function hook() external view returns (address);\n    function token() external view returns (address);\n    function epochStart() external view returns (uint256);\n    function EPOCH() external view returns (uint256);\n    function owed(address account, uint256 epoch) external view returns (uint256);\n    function payRewards(uint256 epoch, address[] calldata accounts) external;\n}\ninterface IClausStakingHook { function nftStaking() external view returns (address); }\n\n/// @notice Existing CLAUS NFT custody with time-weighted daily ETH rewards.\n/// @dev No administrator, transferable receipt, approvals, redemption or arbitrary calls.\n/// Plain ERC721 transferFrom can bypass receiver checks; such unsolicited NFTs are not stakes.\ncontract ClausNftStaking is IERC721Receiver, IUnlockCallback, ReentrancyGuard {\n    struct Checkpoint { uint256 time; uint256 units; uint256 integral; }\n\n    address public constant CLAUS = 0x1b54E762aa34CF6E28E9C082F2848e28E45DA6b8;\n    uint256 public constant EPOCH = 1 days;\n    uint256 public constant PAYOUT_GAS = 60_000;\n    IPoolManager public immutable poolManager;\n    IERC721 public immutable collection;\n    uint256 public immutable startEpoch;\n    uint256 public immutable startsAt;\n    ProjectRevenue public immutable projectRevenue;\n    address public immutable hook;\n    uint256 public immutable epochStart;\n\n    mapping(uint256 => address) public stakerOf;\n    mapping(address => uint256) public stakedBalanceOf;\n    uint256 public totalStaked;\n    mapping(address => uint256[]) private positions;\n    mapping(uint256 => uint256) private positionIndex;\n    mapping(address => Checkpoint[]) private histories;\n    Checkpoint[] private supplyHistory;\n    address[] public rewardAccounts;\n    mapping(address => bool) private knownAccount;\n    mapping(uint256 => uint256) public epochPot;\n    mapping(uint256 => mapping(address => uint256)) public paid;\n    uint256 public totalAccrued;\n    uint256 public totalPaid;\n    uint256 public totalReturnedToOwner;\n    uint256 public uncollected;\n    uint256 public legacyRewardsReceived;\n    uint256 private receivingLegacy;\n    address private expectedStaker;\n    uint256 private expectedToken;\n    uint256 private collecting;\n    uint256 private receiving;\n    uint256 private returning;\n\n    error StakingClosed();\n    error InvalidConfig();\n    error Unauthorized();\n    error InvalidPosition();\n    error InvalidReward();\n    error EpochOpen();\n    event Staked(address indexed account, uint256 indexed tokenId, uint256 units);\n    event Unstaked(address indexed account, uint256 indexed tokenId, uint256 units);\n    event LegacyRewardAccrued(uint256 indexed epoch, uint256 amount);\n    event RewardAccrued(uint256 indexed epoch, uint256 amount);\n    event RewardReturnedToOwner(uint256 amount);\n    event EmptyEpochFinalized(uint256 indexed epoch, uint256 amount);\n    event RewardPaid(uint256 indexed epoch, address indexed account, uint256 amount);\n    event RewardDeferred(uint256 indexed epoch, address indexed account, uint256 amount);\n\n    constructor(IPoolManager manager_, IERC721 collection_, ProjectRevenue project_, address hook_, uint256 startEpoch_) {\n        if (address(manager_).code.length == 0 || address(collection_).code.length == 0\n            || address(project_).code.length == 0 || hook_.code.length == 0) revert InvalidConfig();\n        IClausNftBinding binding = IClausNftBinding(address(collection_));\n        uint256 origin = binding.epochStart();\n        if (address(binding.poolManager()) != address(manager_) || binding.hook() != hook_\n            || binding.token() != CLAUS || binding.EPOCH() != EPOCH || origin == 0 || origin > block.timestamp\n            || address(project_.poolManager()) != address(manager_) || project_.active() == address(0)\n            || startEpoch_ < (block.timestamp - origin) / EPOCH\n            || startEpoch_ > (type(uint256).max - origin) / EPOCH) revert InvalidConfig();\n        poolManager = manager_;\n        collection = collection_;\n        projectRevenue = project_;\n        hook = hook_;\n        epochStart = origin;\n        startEpoch = startEpoch_;\n        startsAt = origin + startEpoch_ * EPOCH;\n    }\n\n    function stakingOpen() public view returns (bool) {\n        if (block.timestamp < startsAt) return false;\n        // New stakes must never silently enter a disconnected reward vault.\n        try IClausStakingHook(hook).nftStaking() returns (address vault) { return vault == address(this); }\n        catch { return false; }\n    }\n\n    function stakedTokensOf(address account) external view returns (uint256[] memory) { return positions[account]; }\n    function rewardAccountCount() external view returns (uint256) { return rewardAccounts.length; }\n    function currentEpoch() public view returns (uint256) { return (block.timestamp - epochStart) / EPOCH; }\n    /// @notice Compatibility getter: empty-participation rewards are returned, never held unallocated.\n    function unallocated() external pure returns (uint256) { return 0; }\n\n    function stake(uint256 tokenId) external nonReentrant {\n        if (!stakingOpen()) revert StakingClosed();\n        if (stakerOf[tokenId] != address(0) || collection.ownerOf(tokenId) != msg.sender) revert Unauthorized();\n        expectedStaker = msg.sender;\n        expectedToken = tokenId;\n        collection.safeTransferFrom(msg.sender, address(this), tokenId);\n        if (expectedStaker != address(0) || collection.ownerOf(tokenId) != address(this)\n            || collection.getApproved(tokenId) != address(0)) revert InvalidPosition();\n        stakerOf[tokenId] = msg.sender;\n        positionIndex[tokenId] = positions[msg.sender].length;\n        positions[msg.sender].push(tokenId);\n        _setStakes(msg.sender, stakedBalanceOf[msg.sender] + 1, totalStaked + 1);\n        emit Staked(msg.sender, tokenId, 1);\n    }\n\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata)\n        external returns (bytes4)\n    {\n        if (msg.sender != address(collection) || operator != address(this)\n            || expectedStaker == address(0) || from != expectedStaker || tokenId != expectedToken)\n            revert InvalidPosition();\n        expectedStaker = address(0);\n        delete expectedToken;\n        return IERC721Receiver.onERC721Received.selector;\n    }\n\n    /// @notice Returns principal without collecting rewards or opening the PoolManager.\n    function unstake(uint256 tokenId) external nonReentrant {\n        if (stakerOf[tokenId] != msg.sender) revert Unauthorized();\n        delete stakerOf[tokenId];\n        uint256 index = positionIndex[tokenId];\n        uint256 last = positions[msg.sender][positions[msg.sender].length - 1];\n        positions[msg.sender][index] = last;\n        positionIndex[last] = index;\n        positions[msg.sender].pop();\n        delete positionIndex[tokenId];\n        _setStakes(msg.sender, stakedBalanceOf[msg.sender] - 1, totalStaked - 1);\n        // The recorded staker may be a contract that does not implement ERC721Receiver.\n        collection.transferFrom(address(this), msg.sender, tokenId);\n        emit Unstaked(msg.sender, tokenId, 1);\n    }\n\n    function _setStakes(address account, uint256 units, uint256 supply) private {\n        if (!knownAccount[account]) { knownAccount[account] = true; rewardAccounts.push(account); }\n        _checkpoint(histories[account], units);\n        _checkpoint(supplyHistory, supply);\n        stakedBalanceOf[account] = units;\n        totalStaked = supply;\n    }\n\n    function _checkpoint(Checkpoint[] storage history, uint256 units) private {\n        uint256 integral;\n        uint256 n = history.length;\n        if (n != 0) {\n            Checkpoint storage previous = history[n - 1];\n            // Preserve historical NFT-seconds across stake, withdrawal and restake.\n            integral = previous.integral + (block.timestamp - previous.time) * previous.units;\n            if (previous.time == block.timestamp) { previous.units = units; return; }\n        }\n        history.push(Checkpoint(block.timestamp, units, integral));\n    }\n\n    function _integralAt(Checkpoint[] storage history, uint256 time) private view returns (uint256) {\n        uint256 lo;\n        uint256 hi = history.length;\n        while (lo < hi) {\n            uint256 mid = lo + (hi - lo) / 2;\n            if (history[mid].time <= time) lo = mid + 1; else hi = mid;\n        }\n        if (lo == 0) return 0;\n        Checkpoint storage point = history[lo - 1];\n        return point.integral + (time - point.time) * point.units;\n    }\n\n    function _holdingSeconds(Checkpoint[] storage history, uint256 epoch) private view returns (uint256) {\n        // Also makes arbitrary far-future epoch queries safe from multiplication overflow.\n        if (epoch > currentEpoch()) return 0;\n        uint256 start = epochStart + epoch * EPOCH;\n        uint256 end = start + Math.min(EPOCH, block.timestamp - start);\n        return _integralAt(history, end) - _integralAt(history, start);\n    }\n\n    function holdingSeconds(address account, uint256 epoch) public view returns (uint256) {\n        return _holdingSeconds(histories[account], epoch);\n    }\n\n    function totalHoldingSeconds(uint256 epoch) public view returns (uint256) {\n        return _holdingSeconds(supplyHistory, epoch);\n    }\n\n    function owed(address account, uint256 epoch) public view returns (uint256) {\n        if (epoch >= currentEpoch()) return 0;\n        uint256 denominator = totalHoldingSeconds(epoch);\n        if (denominator == 0) return 0;\n        uint256 legacy = IClausNftBinding(address(collection)).owed(address(this), epoch);\n        return Math.mulDiv(epochPot[epoch] + legacy, holdingSeconds(account, epoch), denominator) - paid[epoch][account];\n    }\n\n    /// @dev Called only after the immutable hook mints native claims to this vault.\n    function recordReward(uint256 amount) external nonReentrant {\n        if (msg.sender != hook) revert Unauthorized();\n        if (!stakingOpen()) revert StakingClosed();\n        if (amount == 0 || poolManager.balanceOf(address(this), 0) < uncollected + amount) revert InvalidReward();\n        totalAccrued += amount; // Accrued = epoch pots (including paid rewards) + returned owner rewards.\n        if (totalStaked == 0) {\n            totalReturnedToOwner += amount;\n            if (!poolManager.transfer(address(projectRevenue), 0, amount)) revert InvalidReward();\n            emit RewardReturnedToOwner(amount);\n        } else {\n            uncollected += amount;\n            uint256 epoch = currentEpoch();\n            epochPot[epoch] += amount;\n            emit RewardAccrued(epoch, amount);\n        }\n    }\n\n    function collectRewards() external nonReentrant { _collect(); }\n\n    /// @notice Returns fees from a closed epoch with no elapsed participation to the fixed project vault.\n    /// @dev A stake, swap and unstake at the same timestamp has no NFT-seconds.\n    /// Clearing the pot makes repeated calls harmless; earned epochs are immutable.\n    function finalizeEmptyEpoch(uint256 epoch) public nonReentrant {\n        if (epoch >= currentEpoch()) revert EpochOpen();\n        if (totalHoldingSeconds(epoch) != 0) revert InvalidReward();\n        uint256 amount = epochPot[epoch];\n        if (amount == 0) return;\n        epochPot[epoch] = 0;\n        totalReturnedToOwner += amount;\n        uint256 claims = Math.min(amount, uncollected);\n        uncollected -= claims;\n        if (claims != 0 && !poolManager.transfer(address(projectRevenue), 0, claims)) revert InvalidReward();\n        uint256 liquid = amount - claims;\n        if (liquid != 0) {\n            returning = liquid;\n            uint256 beforeBalance = address(this).balance;\n            poolManager.unlock(abi.encode(liquid));\n            if (returning != 0 || collecting != 0 || receiving != 0\n                || address(this).balance + liquid != beforeBalance) revert InvalidReward();\n        }\n        emit EmptyEpochFinalized(epoch, amount);\n    }\n\n    function _collect() private {\n        uint256 amount = uncollected;\n        if (amount == 0) return;\n        collecting = amount;\n        uncollected = 0;\n        uint256 beforeBalance = address(this).balance;\n        poolManager.unlock(abi.encode(amount));\n        if (collecting != 0 || receiving != 0 || returning != 0\n            || address(this).balance != beforeBalance + amount)\n            revert InvalidReward();\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert Unauthorized();\n        if (data.length != 32) revert InvalidReward();\n        uint256 amount = abi.decode(data, (uint256));\n        if (amount == 0 || (collecting != 0 && returning != 0)) revert InvalidReward();\n        if (returning != 0) {\n            if (amount != returning) revert InvalidReward();\n            returning = 0;\n            poolManager.sync(Currency.wrap(address(0)));\n            if (poolManager.settle{value: amount}() != amount) revert InvalidReward();\n            poolManager.mint(address(projectRevenue), 0, amount);\n            return \"\";\n        }\n        if (amount != collecting) revert InvalidReward();\n        collecting = 0;\n        poolManager.burn(address(this), 0, amount);\n        receiving = amount;\n        poolManager.take(Currency.wrap(address(0)), address(this), amount);\n        if (receiving != 0) revert InvalidReward();\n        return \"\";\n    }\n\n    /// @notice Permissionless trigger; recipients can only be historical recorded accounts.\n    function payRewards(uint256 epoch, address[] calldata accounts) external nonReentrant {\n        if (epoch >= currentEpoch()) revert EpochOpen();\n        if (accounts.length > 40) revert InvalidReward();\n        _syncLegacyRewards(epoch);\n        _collect();\n        for (uint256 i; i < accounts.length; ++i) {\n            address account = accounts[i];\n            uint256 amount = owed(account, epoch);\n            if (amount == 0) continue;\n            paid[epoch][account] += amount;\n            totalPaid += amount;\n            (bool ok,) = payable(account).call{value: amount, gas: PAYOUT_GAS}(\"\");\n            if (!ok) {\n                paid[epoch][account] -= amount;\n                totalPaid -= amount;\n                emit RewardDeferred(epoch, account, amount);\n            } else emit RewardPaid(epoch, account, amount);\n        }\n    }\n\n    // Custody still earns ownership-time rewards in the original collection's transition round.\n    // Pull only this vault's exact entitlement and include it in the same round's staker pot.\n    // The original collection marks it paid before its bounded ETH callback.\n    function _syncLegacyRewards(uint256 epoch) private {\n        uint256 amount = IClausNftBinding(address(collection)).owed(address(this), epoch);\n        if (amount == 0 || totalHoldingSeconds(epoch) == 0) return;\n        uint256 beforeBalance = address(this).balance;\n        receivingLegacy = amount;\n        address[] memory accounts = new address[](1);\n        accounts[0] = address(this);\n        IClausNftBinding(address(collection)).payRewards(epoch, accounts);\n        if (receivingLegacy != 0 || address(this).balance != beforeBalance + amount) revert InvalidReward();\n        legacyRewardsReceived += amount;\n        totalAccrued += amount;\n        epochPot[epoch] += amount;\n        emit LegacyRewardAccrued(epoch, amount);\n    }\n\n    receive() external payable {\n        if (msg.sender == address(collection)) {\n            if (msg.value == 0 || msg.value != receivingLegacy) revert InvalidReward();\n            receivingLegacy = 0;\n            return;\n        }\n        if (msg.sender != address(poolManager)) revert Unauthorized();\n        if (msg.value == 0 || msg.value != receiving) revert InvalidReward();\n        receiving = 0;\n    }\n}\n"},"src/legacy/FeeCalls.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n/// @dev Only for immutable, constructor-validated fee contracts. Not arbitrary targets.\nlibrary FeeCalls {\n    function mint(address manager, address recipient, uint256 amount) internal {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, shl(224, 0x156e29f6))\n            mstore(add(p,4), and(recipient, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(p,36), 0)\n            mstore(add(p,68), amount)\n            if iszero(call(gas(), manager, 0, p, 100, 0, 0)) {\n                returndatacopy(p,0,returndatasize())\n                revert(p,returndatasize())\n            }\n        }\n    }\n    function reward(address nft, uint256 amount) internal {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, shl(224, 0x2cd49aed))\n            mstore(add(p,4), amount)\n            if iszero(call(gas(), nft, 0, p, 36, 0, 0)) {\n                returndatacopy(p,0,returndatasize())\n                revert(p,returndatasize())\n            }\n        }\n    }\n    function allocation(address platform, uint256 canonical, uint256 additional) internal {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, shl(224, 0x6a770b0f))\n            mstore(add(p,4), canonical)\n            mstore(add(p,36), additional)\n            if iszero(call(gas(), platform, 0, p, 68, 0, 0)) {\n                returndatacopy(p,0,returndatasize())\n                revert(p,returndatasize())\n            }\n        }\n    }\n}\n"},"src/legacy/FeeEfficientHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeProcessor} from \"./FeeProcessor.sol\";\n\nimport {ArenaTide} from \"./ArenaTide.sol\";\n\nimport {IMDWeather} from \"./IMDWeather.sol\";\n\nimport {FomoReserve} from \"./FomoReserve.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {HookBase} from \"./HookBase.sol\";\nimport {FeeMath} from \"./FeeMath.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"./PlatformRevenue.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {BeforeSwapDelta, toBeforeSwapDelta} from \"@uniswap/v4-core/src/types/BeforeSwapDelta.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\nimport {SafeCast} from \"@uniswap/v4-core/src/libraries/SafeCast.sol\";\n\ninterface ILaunchTokenOwner {\n    function owner() external view returns (address);\n}\n\ninterface IEthUsdFeed {\n    function decimals() external view returns (uint8);\n    function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80);\n}\n\n/// @notice Fee accounting and market signals for the existing CLAUS pool.\n/// @dev A fixed processor shares the burn/Fomo purchase; LP runs outside user swaps.\n/// Existing namespaces, claim owners, destinations and weather allocations are preserved.\ncontract FeeEfficientHook is HookBase, IMDWeather, ArenaTide {\n    function LIQUIDITY_FEE_PIPS() public view virtual returns (uint24) {\n        return 5_000 - BURN_FEE_PIPS();\n    }\n    uint256 public constant BATCH_USD = 500;\n    FeeProcessor public immutable processor;\n    uint256 public constant BUYBACK_GAS_LIMIT = 300_000;\n    error InsufficientBuybackGas();\n    error InvalidProcessing();\n    event BuybackDeferred();\n    LiquidityReserve public immutable liquidityReserve;\n    IEthUsdFeed public immutable ethUsdFeed;\n    event LiquidityFeeAccrued(uint256 grossEth, uint256 liquidityEth);\n    event LiquidityAdded(\n        uint256 indexed tokenId, uint128 liquidity, uint256 ethAdded, uint256 tokensAdded, uint256 buyEth\n    );\n    error OnlySelf();\n\n    function BURN_FEE_PIPS() public view virtual returns (uint24) {\n        return weatherBurnFeePips();\n    }\n    function WALLET_FEE_PIPS() public view virtual returns (uint24) { return 13_500; }\n    function FOMO_FEE_PIPS() public view virtual returns (uint24) { return 1_500; }\n    FomoReserve public immutable fomoReserve;\n    event FomoFeeAccrued(uint256 grossEth, uint256 fomoEth);\n    event FomoBuyback(\n        PoolId indexed poolId, address indexed recipient, uint256 spentEth, uint256 sentTokens, uint256 pendingEth\n    );\n    event ProjectFeeSplit(uint256 grossEth, uint256 walletEth, uint256 burnEth);\n    event BuybackBurn(\n        PoolId indexed poolId, address indexed sender, uint256 spentEth, uint256 burnedTokens, uint256 pendingEth\n    );\n    using SafeCast for uint256;\n\n    address private immutable SELF = address(this);\n    address private immutable POOL_TOKEN;\n    // Dedicated unstructured storage namespace; future versions must preserve or explicitly migrate it.\n    bytes32 private constant LAUNCH_SLOT = keccak256(\"test.hook.initial-launch.v1\");\n\n    struct LaunchState {\n        address initializer;\n        address token;\n        uint160 openingPrice;\n        int24 tickSpacing;\n        bool poolInitialized;\n        address feeRecipient;\n    }\n\n    error InvalidInitialization();\n    error InvalidPool();\n    error PartialNativeFill();\n    error PartialTokenOutput();\n    error NotFeeRecipient();\n    error InvalidFeeClaim();\n\n    event ProjectFeeAccrued(\n        PoolId indexed poolId, address indexed sender, bool exactInput, uint256 grossEth, uint256 feeEth\n    );\n    event ProjectFeesClaimed(address indexed recipient, uint256 amount);\n\n    ProjectRevenue public immutable projectRevenue;\n    PlatformRevenue public immutable platformRevenue;\n\n    constructor(\n        IPoolManager manager,\n        ProjectRevenue project_,\n        PlatformRevenue platform_,\n        LiquidityReserve reserve_,\n        IEthUsdFeed feed_,\n        FomoReserve fomo_,\n        address attester_,\n        bytes32 questionHash_,\n        FeeProcessor processor_\n    ) HookBase(manager) IMDWeather(attester_, questionHash_) {\n        if (address(project_.poolManager()) != address(manager) || address(platform_.poolManager()) != address(manager))\n        {\n            revert InvalidInitialization();\n        }\n        if (address(reserve_.poolManager()) != address(manager) || feed_.decimals() != 8) {\n            revert InvalidInitialization();\n        }\n        if (\n            address(fomo_.poolManager()) != address(manager) || fomo_.hook() != reserve_.hook()\n                || fomo_.token() != reserve_.token()\n        ) revert InvalidInitialization();\n        if (\n            processor_.hook() != reserve_.hook() || address(processor_.poolManager()) != address(manager)\n                || address(processor_.liquidityReserve()) != address(reserve_)\n                || address(processor_.fomoReserve()) != address(fomo_)\n                || address(processor_.ethUsdFeed()) != address(feed_)\n        ) revert InvalidInitialization();\n        POOL_TOKEN = reserve_.token();\n        processor = processor_;\n        fomoReserve = fomo_;\n        liquidityReserve = reserve_;\n        ethUsdFeed = feed_;\n        projectRevenue = project_;\n        platformRevenue = platform_;\n    }\n\n    function initialize(address initializer, address token, int24 tickSpacing, uint160 openingPrice) external {\n        LaunchState storage state = _launch();\n        if (\n            address(this) == SELF || state.initializer != address(0) || initializer == address(0)\n                || token != POOL_TOKEN || token.code.length == 0 || tickSpacing <= 0 || openingPrice == 0\n        ) revert InvalidInitialization();\n        state.initializer = initializer;\n        state.token = token;\n        state.tickSpacing = tickSpacing;\n        state.openingPrice = openingPrice;\n        state.feeRecipient = ILaunchTokenOwner(token).owner();\n        if (state.feeRecipient == address(0) || state.feeRecipient != projectRevenue.active()) {\n            revert InvalidInitialization();\n        }\n    }\n\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 price)\n        external\n        override\n        onlyPoolManager\n        returns (bytes4)\n    {\n        LaunchState storage state = _launch();\n        if (\n            state.initializer == address(0) || state.poolInitialized || sender != state.initializer\n                || Currency.unwrap(key.currency0) != address(0) || Currency.unwrap(key.currency1) != state.token\n                || key.tickSpacing != state.tickSpacing || key.fee != LPFeeLibrary.DYNAMIC_FEE_FLAG\n                || address(key.hooks) != address(this) || price != state.openingPrice\n        ) revert InvalidInitialization();\n        state.poolInitialized = true;\n        return IHooks.beforeInitialize.selector;\n    }\n\n    function afterInitialize(address, PoolKey calldata key, uint160, int24)\n        external\n        override\n        onlyPoolManager\n        returns (bytes4)\n    {\n        poolManager.updateDynamicLPFee(key, 0);\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)\n        external\n        override\n        onlyPoolManager\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        _requirePool(key);\n        _beforeSwapExtension(sender, key, params, hookData);\n        _snapshotProtocol(params.zeroForOne ? key.currency0 : key.currency1);\n        uint256 fee;\n        if (_nativeSpecified(params)) {\n            uint256 requested = _specifiedAmount(params);\n            fee = params.amountSpecified < 0 ? FeeMath.fromGross(requested) : FeeMath.fromNet(requested);\n            // Accrual is deferred until the complete swap and fee ceiling are checked.\n        }\n        return (IHooks.beforeSwap.selector, toBeforeSwapDelta(fee.toInt128(), 0), LPFeeLibrary.OVERRIDE_FEE_FLAG);\n    }\n\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external override onlyPoolManager returns (bytes4, int128) {\n        _requirePool(key);\n        int128 returnedFee = _settleFee(sender, key, params, delta);\n        // Rising Tide is retired. Preserve its stored history without recording new rounds.\n        if (_processBuybacksInSwap() && (pendingBurnEth() != 0 || pendingFomoEth() != 0)) {\n            // Make estimation include the work. Unused gas is returned, not charged.\n            if (gasleft() < BUYBACK_GAS_LIMIT + 60_000) revert InsufficientBuybackGas();\n            try this.processBuybacksDuringSwap{gas: BUYBACK_GAS_LIMIT}(sender) {}\n            catch {\n                emit BuybackDeferred();\n            }\n        }\n        _afterFeeProcessing(sender);\n        _checkpointPredictions();\n        _afterSwapExtension(sender, key, params, delta, hookData);\n        return (IHooks.afterSwap.selector, returnedFee);\n    }\n\n    function _processBuybacksInSwap() internal pure virtual returns (bool) { return true; }\n\n    /// @dev Default no-op; extensions must preserve ordinary routing and accounting.\n    function _beforeSwapExtension(address, PoolKey calldata, SwapParams calldata, bytes calldata) internal virtual {}\n\n    function _afterSwapExtension(address, PoolKey calldata, SwapParams calldata, BalanceDelta, bytes calldata)\n        internal virtual {}\n\n    /// @dev Optional isolated extension, after the existing fees and buybacks.\n    function _afterFeeProcessing(address) internal virtual {}\n\n    /// @dev Optional observation extension. Existing implementations add no work.\n    function _checkpointPredictions() internal virtual {}\n\n    function _settleFee(address sender, PoolKey calldata key, SwapParams calldata params, BalanceDelta delta)\n        private\n        returns (int128 returnedFee)\n    {\n        bool exactInput = params.amountSpecified < 0;\n        if (!exactInput && params.zeroForOne && int256(delta.amount1()) != params.amountSpecified) {\n            revert PartialTokenOutput();\n        }\n        int128 ethDelta = delta.amount0();\n        uint256 ethAmount = ethDelta < 0 ? uint256(-int256(ethDelta)) : uint256(int256(ethDelta));\n        uint256 fee;\n        uint256 gross;\n        if (_nativeSpecified(params)) {\n            uint256 requested = _specifiedAmount(params);\n            fee = exactInput ? FeeMath.fromGross(requested) : FeeMath.fromNet(requested);\n            uint256 expected = exactInput ? requested - fee : requested + fee;\n            if (ethAmount != expected) revert PartialNativeFill();\n            gross = exactInput ? requested : expected;\n        } else {\n            fee = exactInput ? FeeMath.fromGross(ethAmount) : FeeMath.fromNet(ethAmount);\n            gross = exactInput ? ethAmount : ethAmount + fee;\n            returnedFee = fee.toInt128();\n        }\n        _checkTotalTax(key, params, delta, gross, fee);\n        _accrue(gross, fee);\n        emit ProjectFeeAccrued(_calldataPoolId(key), sender, exactInput, gross, fee);\n        return returnedFee;\n    }\n\n    function pendingBurnEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(this), 0);\n    }\n\n    function pendingFomoEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(fomoReserve), 0);\n    }\n\n    function fomoRecipient() external view returns (address) {\n        return fomoReserve.recipient();\n    }\n\n    function feeRecipient() external view returns (address) {\n        return _launch().feeRecipient;\n    }\n\n    function projectFeeBalance() public view returns (uint256) {\n        (uint256 activeAmount,) = projectRevenue.balances();\n        return activeAmount;\n    }\n\n    function collectProjectFees(uint256 amount) external {\n        if (msg.sender != _launch().feeRecipient) revert NotFeeRecipient();\n        projectRevenue.claimActive(amount);\n    }\n\n    event FeeAllocation(uint256 grossEth, uint256 projectEth, uint256 platformEth);\n\n    event PlatformFeeAllocation(uint256 grossEth, uint256 canonicalEth, uint256 additionalEth);\n\n    function _accrue(uint256 gross, uint256 totalFee) internal virtual {\n        uint256 project = FeeMath.projectFromGross(gross);\n        uint24 burnPips = BURN_FEE_PIPS();\n        uint256 burnEth = FullMath.mulDiv(gross, burnPips, 1_000_000);\n        uint256 liquidityEth = FullMath.mulDiv(gross, LIQUIDITY_FEE_PIPS(), 1_000_000);\n        uint256 fomoEth = FullMath.mulDiv(gross, FOMO_FEE_PIPS(), 1_000_000);\n        uint256 walletEth = project - burnEth - liquidityEth - fomoEth;\n        uint256 platform = totalFee - project;\n        if (walletEth != 0) poolManager.mint(address(projectRevenue), 0, walletEth);\n        if (burnEth != 0) poolManager.mint(address(this), 0, burnEth);\n        if (liquidityEth != 0) poolManager.mint(address(liquidityReserve), 0, liquidityEth);\n        emit ProjectFeeSplit(gross, walletEth, burnEth);\n        emit LiquidityFeeAccrued(gross, liquidityEth);\n        if (fomoEth != 0) poolManager.mint(address(fomoReserve), 0, fomoEth);\n        emit FomoFeeAccrued(gross, fomoEth);\n        if (platform != 0) poolManager.mint(address(platformRevenue), 0, platform);\n        uint256 canonical = gross / 1000;\n        platformRevenue.recordAllocation(canonical, platform - canonical);\n        emit FeeAllocation(gross, project, platform);\n        emit PlatformFeeAllocation(gross, canonical, platform - canonical);\n    }\n\n    bytes32 private constant PROTOCOL_SNAPSHOT = keccak256(\"claus.protected.protocol-snapshot.v1\");\n    error TotalTaxExceeded();\n    function _snapshotProtocol(Currency input) private {\n        uint256 value=poolManager.protocolFeesAccrued(input);\n        bytes32 slot=PROTOCOL_SNAPSHOT; assembly {tstore(slot,value)}\n    }\n    function _checkTotalTax(PoolKey calldata key, SwapParams calldata params, BalanceDelta delta, uint256 gross, uint256 fee) private view {\n        bytes32 slot=PROTOCOL_SNAPSHOT; uint256 beforeFees; assembly {beforeFees:=tload(slot)}\n        uint256 protocol=poolManager.protocolFeesAccrued(params.zeroForOne?key.currency0:key.currency1)-beforeFees;\n        if(params.zeroForOne){\n            if(fee+protocol>gross*150_000/1_000_000) revert TotalTaxExceeded();\n        }else{\n            uint256 input=uint256(-int256(delta.amount1()));\n            // Express the token-side protocol charge and ETH-side hook fee on one\n            // proportional pre-fee trade basis, without treating price impact as tax.\n            if(protocol>input*150_000/1_000_000 || protocol==input) revert TotalTaxExceeded();\n            uint256 allowedPips=(input*150_000-protocol*1_000_000)/(input-protocol);\n            if(fee>gross*allowedPips/1_000_000) revert TotalTaxExceeded();\n        }\n    }\n\n    function _calldataPoolId(PoolKey calldata key) private pure returns (PoolId id) {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            calldatacopy(p, key, 160)\n            id := keccak256(p, 160)\n        }\n    }\n\n    function _nativeSpecified(SwapParams calldata params) private pure returns (bool) {\n        return (params.amountSpecified < 0) == params.zeroForOne;\n    }\n\n    function _specifiedAmount(SwapParams calldata params) private pure returns (uint256) {\n        return params.amountSpecified < 0 ? uint256(-(params.amountSpecified + 1)) + 1 : uint256(params.amountSpecified);\n    }\n\n    function _requirePool(PoolKey calldata key) private view {\n        LaunchState storage state = _launch();\n        if (\n            !state.poolInitialized || state.feeRecipient == address(0) || Currency.unwrap(key.currency0) != address(0)\n                || Currency.unwrap(key.currency1) != POOL_TOKEN || address(key.hooks) != address(this)\n                || key.tickSpacing != state.tickSpacing || key.fee != LPFeeLibrary.DYNAMIC_FEE_FLAG\n        ) revert InvalidPool();\n    }\n\n    receive() external payable {\n        if (msg.sender != address(poolManager)) revert OnlySelf();\n    }\n\n    function pendingLiquidityEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), 0);\n    }\n\n    function pendingLiquidityTokens() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), uint256(uint160(_launch().token)));\n    }\n\n    /// @notice Fixed-destination processing; callers cannot withdraw or redirect reserves.\n    function processLiquidity() external {\n        poolManager.unlock(abi.encode(uint8(0), msg.sender));\n        // Processor swaps originate from this hook, so v4 skips its swap callbacks.\n        _checkpointPredictions();\n    }\n\n    function processBuybacks() external {\n        poolManager.unlock(abi.encode(uint8(1), msg.sender));\n        _checkpointPredictions();\n    }\n\n    function unlockCallback(bytes calldata data) public virtual onlyPoolManager returns (bytes memory) {\n        (uint8 kind, address caller) = abi.decode(data, (uint8, address));\n        if (kind == 0) this.processLiquidityDuringSwap();\n        else if (kind == 1) this.processBuybacksDuringSwap(caller);\n        else revert InvalidProcessing();\n        return bytes(\"\");\n    }\n\n    function processBuybacksDuringSwap(address sender) public virtual {\n        if (msg.sender != address(this)) revert OnlySelf();\n        _process(abi.encodeCall(FeeProcessor.executeBuybacks, (sender)));\n    }\n\n    function processLiquidityDuringSwap() external {\n        if (msg.sender != address(this)) revert OnlySelf();\n        _process(abi.encodeCall(FeeProcessor.executeLiquidity, ()));\n    }\n\n    function batchThresholdWei() public view returns (uint256) {\n        return processor.batchThresholdWei();\n    }\n\n    function liquidityBatchReady() external view returns (bool) {\n        return processor.liquidityBatchReady();\n    }\n\n    function _process(bytes memory data) private {\n        // Immutable reviewed module; no user-supplied destination or arbitrary calldata.\n        (bool ok, bytes memory result) = address(processor).delegatecall(data);\n        if (!ok) {\n            assembly (\"memory-safe\") { revert(add(result, 32), mload(result)) }\n        }\n    }\n\n    function _launch() private pure returns (LaunchState storage state) {\n        bytes32 slot = LAUNCH_SLOT;\n        assembly { state.slot := slot }\n    }\n}\n"},"src/legacy/FeeMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {ClausFeeBudget} from \"../ClausFeeBudget.sol\";\n\n/// @notice Starting 2% project plus 0.3% platform on the same gross ETH basis.\n/// @dev Fixed base allocation plus the globally bounded surcharge.\nlibrary FeeMath {\n    uint24 internal constant TOTAL_PIPS = 23_000;\n    uint24 internal constant PROJECT_PIPS = 20_000;\n    uint256 internal constant DENOMINATOR = 1_000_000;\n\n    function fromGross(uint256 gross) internal view returns (uint256) {\n        // A valid v4 native delta bounds successful inputs below 2^128.\n        // Checked multiplication rejects oversized, unfulfillable requests.\n        return ClausFeeBudget.grossFee(gross);\n    }\n\n    function fromNet(uint256 net) internal view returns (uint256) {\n        return ClausFeeBudget.netFee(net);\n    }\n\n    function projectFromGross(uint256 gross) internal pure returns (uint256) {\n        return gross / 50;\n    }\n}\n"},"src/legacy/FeeNftHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeEfficientHook, IEthUsdFeed} from \"./FeeEfficientHook.sol\";\nimport {FeeProcessor} from \"./FeeProcessor.sol\";\nimport {FeeCalls} from \"./FeeCalls.sol\";\nimport {FeeMath} from \"./FeeMath.sol\";\nimport {ClausNFT} from \"./ClausNFT.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"./PlatformRevenue.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FomoReserve} from \"./FomoReserve.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\n\n/// @notice Adds the fixed NFT allocation while retaining existing weather, market signals and processing.\ncontract FeeNftHook is FeeEfficientHook {\n    ClausNFT public immutable nft;\n    uint64 private immutable NFT_EPOCH_START;\n    uint256 private immutable NFT_EPOCH_LENGTH;\n    event NftFeeAccrued(uint256 grossEth, uint256 nftEth, uint256 epoch);\n\n    constructor(IPoolManager manager_, ProjectRevenue project_, PlatformRevenue platform_,\n        LiquidityReserve reserve_, IEthUsdFeed feed_, FomoReserve fomo_, address attester_,\n        bytes32 questionHash_, FeeProcessor processor_, ClausNFT nft_)\n        FeeEfficientHook(manager_, project_, platform_, reserve_, feed_, fomo_, attester_, questionHash_, processor_)\n    {\n        if (nft_.hook() != reserve_.hook() || address(nft_.token()) != reserve_.token()\n            || address(nft_.poolManager()) != address(manager_)) revert InvalidInitialization();\n        nft = nft_;\n        // Both are immutable in the existing, non-proxy NFT contract.\n        NFT_EPOCH_START = nft_.epochStart();\n        NFT_EPOCH_LENGTH = nft_.EPOCH();\n    }\n\n    function NFT_FEE_PIPS() public view virtual returns (uint24) { return nft.totalSupply() == 0 ? 0 : 3_500; }\n    function WALLET_FEE_PIPS() public view virtual override returns (uint24) { return 13_500 - NFT_FEE_PIPS(); }\n\n    function _accrue(uint256 gross, uint256 totalFee) internal virtual override {\n        uint256 project = FeeMath.projectFromGross(gross);\n        uint24 burnPips = BURN_FEE_PIPS();\n        // Preserve every individual floor and the wallet rounding remainder.\n        // Checked multiplication is sufficient: every successful v4 swap's\n        // native delta is int128. Larger rejected requests cannot overflow\n        // into a smaller fee because arithmetic remains checked.\n        uint256 burnEth = gross * burnPips / 1_000_000;\n        uint256 liquidityEth = gross * LIQUIDITY_FEE_PIPS() / 1_000_000;\n        uint256 fomoEth = gross * FOMO_FEE_PIPS() / 1_000_000;\n        uint256 nftEth = gross * NFT_FEE_PIPS() / 1_000_000;\n        uint256 walletEth = project - burnEth - liquidityEth - fomoEth - nftEth;\n        uint256 platform = totalFee - project;\n        if (walletEth != 0) FeeCalls.mint(address(poolManager), address(projectRevenue), walletEth);\n        if (burnEth != 0) FeeCalls.mint(address(poolManager), address(this), burnEth);\n        if (liquidityEth != 0) FeeCalls.mint(address(poolManager), address(liquidityReserve), liquidityEth);\n        if (fomoEth != 0) FeeCalls.mint(address(poolManager), address(fomoReserve), fomoEth);\n        if (nftEth != 0) {\n            FeeCalls.mint(address(poolManager), address(nft), nftEth);\n            FeeCalls.reward(address(nft), nftEth);\n            uint256 epoch = (block.timestamp - NFT_EPOCH_START) / NFT_EPOCH_LENGTH;\n            assembly (\"memory-safe\") {\n                let p := mload(0x40)\n                mstore(p, gross) mstore(add(p, 32), nftEth) mstore(add(p, 64), epoch)\n                // NftFeeAccrued(uint256,uint256,uint256)\n                log1(p, 96, 0x29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240)\n            }\n        }\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, gross) mstore(add(p, 32), walletEth) mstore(add(p, 64), burnEth)\n            // ProjectFeeSplit(uint256,uint256,uint256)\n            log1(p, 96, 0x954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7)\n            mstore(add(p, 32), liquidityEth)\n            // LiquidityFeeAccrued(uint256,uint256)\n            log1(p, 64, 0x03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df4921)\n            mstore(add(p, 32), fomoEth)\n            // FomoFeeAccrued(uint256,uint256)\n            log1(p, 64, 0x27adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b4)\n        }\n        if (platform != 0) FeeCalls.mint(address(poolManager), address(platformRevenue), platform);\n        uint256 canonical = gross / 1000;\n        FeeCalls.allocation(address(platformRevenue), canonical, platform - canonical);\n        // The subtraction is checked in the allocation call above.\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, gross) mstore(add(p, 32), project) mstore(add(p, 64), platform)\n            // FeeAllocation(uint256,uint256,uint256)\n            log1(p, 96, 0x30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf06)\n            mstore(add(p, 32), canonical) mstore(add(p, 64), sub(platform, canonical))\n            // PlatformFeeAllocation(uint256,uint256,uint256)\n            log1(p, 96, 0x53d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122)\n        }\n    }\n}\n"},"src/legacy/FeePredictionHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {FeeNftHook} from \"./FeeNftHook.sol\";\nimport {FeeEfficientHook, IEthUsdFeed} from \"./FeeEfficientHook.sol\";\nimport {MarketCapOracle} from \"./MarketCapOracle.sol\";\nimport {PoolCapSource} from \"./PoolCapSource.sol\";\nimport {FeeProcessor} from \"./FeeProcessor.sol\";\nimport {ClausNFT} from \"./ClausNFT.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"./PlatformRevenue.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FomoReserve} from \"./FomoReserve.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\n\n/// @notice Preserves all existing fee allocations and adds a genuine afterSwap observation.\ncontract FeePredictionHook is FeeNftHook {\n    MarketCapOracle public immutable predictionOracle;\n    uint256 public constant OBSERVATION_GAS = 150_000;\n    error InsufficientObservationGas();\n    constructor(IPoolManager manager_, ProjectRevenue project_, PlatformRevenue platform_,\n        LiquidityReserve reserve_, IEthUsdFeed feed_, FomoReserve fomo_, address attester_,\n        bytes32 questionHash_, FeeProcessor processor_, ClausNFT nft_, MarketCapOracle oracle_, int24 spacing_)\n        FeeNftHook(manager_, project_, platform_, reserve_, feed_, fomo_, attester_, questionHash_, processor_, nft_)\n    {\n        PoolCapSource source = PoolCapSource(address(oracle_.source()));\n        PoolKey memory key = PoolKey(Currency.wrap(address(0)), Currency.wrap(reserve_.token()), LPFeeLibrary.DYNAMIC_FEE_FLAG, spacing_, IHooks(reserve_.hook()));\n        if (address(source.manager()) != address(manager_) || address(source.token()) != reserve_.token()\n            || address(source.feed()) != address(feed_) || PoolId.unwrap(source.poolId()) != PoolId.unwrap(key.toId())\n            || oracle_.scheduler() == address(0)) revert InvalidInitialization();\n        predictionOracle = oracle_;\n    }\n    function _checkpointPredictions() internal override {\n        // Keep existing observations when gas permits; they must never gate trading.\n        if (gasleft() < OBSERVATION_GAS + OBSERVATION_GAS / 63 + 15_000) return;\n        try predictionOracle.checkpointIfNeeded{gas: OBSERVATION_GAS}() {} catch {}\n    }\n}\n"},"src/legacy/FeeProcessor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {SqrtPriceMath} from \"@uniswap/v4-core/src/libraries/SqrtPriceMath.sol\";\nimport {LiquidityAmounts} from \"@uniswap/v4-periphery/src/libraries/LiquidityAmounts.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FomoReserve} from \"./FomoReserve.sol\";\n\ninterface IProcessorEthUsdFeed {\n    function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80);\n}\n\ninterface IProcessorBurnToken {\n    function burn(uint256 amount) external;\n}\n\n/// @notice Fixed-purpose, stateless settlement code for the existing hook proxy.\n/// @dev Mutations are possible only through a self-call of that proxy followed by delegatecall.\ncontract FeeProcessor {\n    using StateLibrary for IPoolManager;\n    IPoolManager public immutable poolManager;\n    LiquidityReserve public immutable liquidityReserve;\n    FomoReserve public immutable fomoReserve;\n    IProcessorEthUsdFeed public immutable ethUsdFeed;\n    address public immutable hook;\n    address public immutable token;\n    address private immutable FOMO_RECIPIENT;\n    uint256 public constant BATCH_USD = 500;\n    uint256 private constant Q96 = 1 << 96;\n    error InvalidContext();\n    error InvalidConfiguration();\n    error EmptyLiquidity();\n    error BatchNotReady();\n    event BuybackBurn(\n        PoolId indexed poolId, address indexed sender, uint256 spentEth, uint256 burnedTokens, uint256 pendingEth\n    );\n    event FomoBuyback(\n        PoolId indexed poolId, address indexed recipient, uint256 spentEth, uint256 sentTokens, uint256 pendingEth\n    );\n    event LiquidityAdded(\n        uint256 indexed tokenId, uint128 liquidity, uint256 ethAdded, uint256 tokensAdded, uint256 buyEth\n    );\n\n    constructor(IPoolManager manager, LiquidityReserve reserve_, FomoReserve fomo_, IProcessorEthUsdFeed feed_) {\n        if (\n            address(reserve_.poolManager()) != address(manager) || address(fomo_.poolManager()) != address(manager)\n                || reserve_.hook() != fomo_.hook() || reserve_.token() != fomo_.token()\n                || address(feed_).code.length == 0\n        ) revert InvalidConfiguration();\n        poolManager = manager;\n        liquidityReserve = reserve_;\n        fomoReserve = fomo_;\n        ethUsdFeed = feed_;\n        hook = reserve_.hook();\n        token = reserve_.token();\n        FOMO_RECIPIENT = fomo_.recipient();\n    }\n    modifier onlyDelegatedSelf() {\n        if (address(this) != hook || msg.sender != hook) revert InvalidContext();\n        _;\n    }\n\n    function _key() private view returns (PoolKey memory) {\n        return PoolKey(Currency.wrap(address(0)), Currency.wrap(token), 0x800000, 1, IHooks(hook));\n    }\n\n    function pendingLiquidityEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), 0);\n    }\n\n    function pendingLiquidityTokens() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), uint256(uint160(token)));\n    }\n\n    function liquidityBatchReady() external view returns (bool) {\n        return _prepareBatch(_key()).price != 0;\n    }\n\n    function executeLiquidity() external onlyDelegatedSelf {\n        _addLiquidity();\n    }\n\n    struct Purchase {\n        uint256 burnBudget;\n        uint256 fomoBudget;\n        uint256 total;\n        uint256 spent;\n        uint256 tokens;\n    }\n\n    function executeBuybacks(address sender) external onlyDelegatedSelf {\n        Purchase memory p;\n        p.burnBudget = poolManager.balanceOf(hook, 0);\n        p.fomoBudget = poolManager.balanceOf(address(fomoReserve), 0);\n        // Keep one wei in each existing claim account. Clearing the balance\n        // makes the next user pay for a zero-to-nonzero storage write.\n        // Dust retains the same owner and purpose; it is not a new charge.\n        if (p.burnBudget != 0) --p.burnBudget;\n        if (p.fomoBudget != 0) --p.fomoBudget;\n        p.total = p.burnBudget + p.fomoBudget;\n        PoolKey memory key = _key();\n        if (p.total == 0 || poolManager.getLiquidity(key.toId()) == 0) return;\n        (uint160 price,,,) = poolManager.getSlot0(key.toId());\n        if (price <= TickMath.MIN_SQRT_PRICE + 1) return;\n        uint160 limit = uint160(uint256(price) * 995 / 1000);\n        if (limit <= TickMath.MIN_SQRT_PRICE) limit = TickMath.MIN_SQRT_PRICE + 1;\n        uint256 maximum = uint256(uint128(type(int128).max));\n        if (p.total > maximum) {\n            p.fomoBudget = FullMath.mulDiv(maximum, p.fomoBudget, p.total);\n            p.burnBudget = maximum - p.fomoBudget;\n            p.total = maximum;\n        }\n        if (p.burnBudget != 0) poolManager.burn(hook, 0, p.burnBudget);\n        if (p.fomoBudget != 0) poolManager.burn(address(fomoReserve), 0, p.fomoBudget);\n        BalanceDelta bought = poolManager.swap(key, SwapParams(true, -int256(p.total), limit), bytes(\"\"));\n        p.spent = uint256(-int256(bought.amount0()));\n        p.tokens = uint256(uint128(bought.amount1()));\n        _distribute(key, sender, p);\n    }\n\n    function _distribute(PoolKey memory key, address sender, Purchase memory p) private {\n        PoolId id = key.toId();\n        uint256 spentFomo = FullMath.mulDiv(p.spent, p.fomoBudget, p.total);\n        uint256 spentBurn = p.spent - spentFomo;\n        if (p.burnBudget > spentBurn) poolManager.mint(hook, 0, p.burnBudget - spentBurn);\n        if (p.fomoBudget > spentFomo) poolManager.mint(address(fomoReserve), 0, p.fomoBudget - spentFomo);\n        uint256 fomoTokens = p.spent == 0 ? 0 : FullMath.mulDiv(p.tokens, spentFomo, p.spent);\n        uint256 burnTokens = p.tokens - fomoTokens;\n        if (burnTokens != 0) {\n            poolManager.take(key.currency1, hook, burnTokens);\n            IProcessorBurnToken(token).burn(burnTokens);\n        }\n        address recipient = FOMO_RECIPIENT;\n        if (fomoTokens != 0) poolManager.take(key.currency1, recipient, fomoTokens);\n        if (p.burnBudget != 0) emit BuybackBurn(\n            id, sender, spentBurn, burnTokens, poolManager.balanceOf(hook, 0)\n        );\n        if (p.fomoBudget != 0) {\n            emit FomoBuyback(\n                id, recipient, spentFomo, fomoTokens, poolManager.balanceOf(address(fomoReserve), 0)\n            );\n        }\n    }\n\n    function batchThresholdWei() public view returns (uint256) {\n        (uint80 round, int256 answer,, uint256 updated, uint80 answered) = ethUsdFeed.latestRoundData();\n        if (\n            answer <= 0 || updated == 0 || updated > block.timestamp || block.timestamp - updated > 2 hours\n                || answered < round\n        ) {\n            return 0;\n        }\n        return FullMath.mulDiv(BATCH_USD * 1e8, 1 ether, uint256(answer));\n    }\n\n    function _tokenValue(uint256 amount, uint160 price) private pure returns (uint256) {\n        return FullMath.mulDiv(FullMath.mulDiv(amount, Q96, price), Q96, price);\n    }\n\n    function _amounts(uint160 price, uint160 lower, uint160 upper, uint128 liquidity)\n        private\n        pure\n        returns (uint256 eth, uint256 tokens)\n    {\n        if (price < upper) {\n            eth = SqrtPriceMath.getAmount0Delta(price > lower ? price : lower, upper, liquidity, true);\n        }\n        if (price > lower) {\n            tokens = SqrtPriceMath.getAmount1Delta(lower, price < upper ? price : upper, liquidity, true);\n        }\n    }\n\n    struct Batch {\n        uint160 price;\n        uint160 lower;\n        uint160 upper;\n        uint256 ethBudget;\n        uint256 oldTokens;\n        uint256 spent;\n        uint256 bought;\n    }\n\n    function _prepareBatch(PoolKey memory key) private view returns (Batch memory b) {\n        uint256 threshold = batchThresholdWei();\n        if (threshold == 0 || poolManager.getLiquidity(key.toId()) == 0) return b;\n        (b.price,,,) = poolManager.getSlot0(key.toId());\n        b.oldTokens = pendingLiquidityTokens();\n        uint256 oldValue = _tokenValue(b.oldTokens, b.price);\n        uint256 ethReserve = pendingLiquidityEth();\n        if (ethReserve < threshold && oldValue < threshold - ethReserve) {\n            b.price = 0;\n            return b;\n        }\n        // Both assets count toward $500; unspent amounts remain earmarked.\n        if (oldValue > threshold) {\n            b.oldTokens = FullMath.mulDiv(b.oldTokens, threshold, oldValue);\n            oldValue = _tokenValue(b.oldTokens, b.price);\n        }\n        b.ethBudget = threshold - oldValue;\n        if (b.ethBudget > ethReserve) b.ethBudget = ethReserve;\n        b.lower = TickMath.getSqrtPriceAtTick(liquidityReserve.tickLower());\n        b.upper = TickMath.getSqrtPriceAtTick(liquidityReserve.tickUpper());\n    }\n\n    function _buyForLiquidity(PoolKey memory key, Batch memory b) private {\n        (uint256 ratioEth, uint256 ratioTokens) = _amounts(b.price, b.lower, b.upper, 1e18);\n        uint256 ratioTokenValue = _tokenValue(ratioTokens, b.price);\n        uint256 oldValue = _tokenValue(b.oldTokens, b.price);\n        uint256 wanted = FullMath.mulDiv(b.ethBudget + oldValue, ratioTokenValue, ratioEth + ratioTokenValue);\n        uint256 buyEth = wanted > oldValue ? wanted - oldValue : 0;\n        if (buyEth > b.ethBudget) buyEth = b.ethBudget;\n        if (buyEth == 0) return;\n        uint160 limit = uint160(uint256(b.price) * 995 / 1000);\n        if (limit <= TickMath.MIN_SQRT_PRICE) limit = TickMath.MIN_SQRT_PRICE + 1;\n        poolManager.burn(address(liquidityReserve), 0, buyEth);\n        BalanceDelta delta = poolManager.swap(key, SwapParams(true, -int256(buyEth), limit), bytes(\"\"));\n        b.spent = uint256(-int256(delta.amount0()));\n        b.bought = uint256(uint128(delta.amount1()));\n        if (b.spent < buyEth) poolManager.mint(address(liquidityReserve), 0, buyEth - b.spent);\n        if (b.bought != 0) poolManager.mint(address(liquidityReserve), uint256(uint160(token)), b.bought);\n    }\n\n    function _addLiquidity() private {\n        PoolKey memory key = _key();\n        Batch memory b = _prepareBatch(key);\n        if (b.price == 0) revert BatchNotReady();\n        _buyForLiquidity(key, b);\n        (b.price,,,) = poolManager.getSlot0(key.toId());\n        uint128 liquidity = LiquidityAmounts.getLiquidityForAmounts(\n            b.price, b.lower, b.upper, b.ethBudget - b.spent, b.oldTokens + b.bought\n        );\n        if (liquidity <= 1) revert EmptyLiquidity();\n        liquidity -= 1;\n        (uint256 ethAmount, uint256 tokenAmount) = _amounts(b.price, b.lower, b.upper, liquidity);\n        if (\n            ethAmount > b.ethBudget - b.spent || tokenAmount > b.oldTokens + b.bought || ethAmount > type(uint128).max\n                || tokenAmount > type(uint128).max\n        ) revert EmptyLiquidity();\n        poolManager.burn(address(liquidityReserve), 0, ethAmount);\n        poolManager.take(key.currency0, address(this), ethAmount);\n        poolManager.burn(address(liquidityReserve), uint256(uint160(token)), tokenAmount);\n        poolManager.take(key.currency1, address(liquidityReserve), tokenAmount);\n        liquidityReserve.increase{value: ethAmount}(liquidity, uint128(ethAmount), uint128(tokenAmount));\n        emit LiquidityAdded(liquidityReserve.tokenId(), liquidity, ethAmount, tokenAmount, b.spent);\n    }\n}\n"},"src/legacy/FomoReserve.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\n\n/// @notice Separate fee-claim account for the existing hook's fixed-recipient buybacks.\n/// @dev No public transfer, approval, arbitrary-call or withdrawal function.\n/// The upgradeable hook remains the authorized ERC-6909 operator.\ncontract FomoReserve {\n    IPoolManager public immutable poolManager;\n    address public immutable hook;\n    address public immutable token;\n    address public immutable recipient;\n\n    error InvalidConfiguration();\n\n    constructor(IPoolManager manager, address hook_, address token_, address recipient_) {\n        if (address(manager).code.length == 0 || hook_.code.length == 0\n            || token_.code.length == 0 || recipient_ == address(0)\n            || recipient_ == hook_ || recipient_ == address(manager) || recipient_ == token_)\n            revert InvalidConfiguration();\n        poolManager = manager;\n        hook = hook_;\n        token = token_;\n        recipient = recipient_;\n        manager.setOperator(hook_, true);\n    }\n}\n"},"src/legacy/HookBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"@uniswap/v4-core/src/types/BeforeSwapDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\n\n/// @notice Optional starting point for proxy implementations; not a feature whitelist.\n/// @dev No address-bit validation here: callbacks execute at the proxy, not this implementation.\n///      An override must keep appropriate caller checks. Immutable manager is part of code identity.\nabstract contract HookBase is IHooks {\n    IPoolManager public immutable poolManager;\n\n    error NotPoolManager();\n    error InvalidPoolManager();\n\n    constructor(IPoolManager manager) {\n        if (address(manager).code.length == 0) revert InvalidPoolManager();\n        poolManager = manager;\n    }\n\n    modifier onlyPoolManager() {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        _;\n    }\n\n    function beforeInitialize(address, PoolKey calldata, uint160) external virtual onlyPoolManager returns (bytes4) {\n        return IHooks.beforeInitialize.selector;\n    }\n\n    function afterInitialize(address, PoolKey calldata, uint160, int24)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeAddLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.beforeAddLiquidity.selector;\n    }\n\n    function afterAddLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata\n    ) external virtual onlyPoolManager returns (bytes4, BalanceDelta) {\n        return (IHooks.afterAddLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeRemoveLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.beforeRemoveLiquidity.selector;\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata\n    ) external virtual onlyPoolManager returns (bytes4, BalanceDelta) {\n        return (IHooks.afterRemoveLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeSwap(address, PoolKey calldata, SwapParams calldata, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);\n    }\n\n    function afterSwap(address, PoolKey calldata, SwapParams calldata, BalanceDelta, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4, int128)\n    {\n        return (IHooks.afterSwap.selector, 0);\n    }\n\n    function beforeDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.beforeDonate.selector;\n    }\n\n    function afterDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.afterDonate.selector;\n    }\n}\n"},"src/legacy/IMDWeather.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\n\n/// @notice A fresh IMD panel answer changes only the burn/LP split.\n/// @dev IMD is a trusted attester. Its signature authenticates a report, not physical weather.\nabstract contract IMDWeather {\n    address public immutable weatherAttester;\n    bytes32 public immutable weatherQuestionHash;\n    uint64 public constant WEATHER_MAX_AGE = 6 hours;\n    bytes32 private constant WEATHER_SLOT = keccak256(\"claus.weather.imd.v1\");\n    bytes32 private constant DOMAIN_TYPEHASH = keccak256(\n        \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n    );\n    bytes32 private constant ATTESTATION_TYPEHASH = keccak256(\n        \"OracleAttestation(bytes32 requestId,uint256 chainId,bytes32 questionHash,uint8 answerType,bytes answer,uint256 figure,uint64 fromBlock,uint64 toBlock,bytes32 blockHash,bytes32 panelJobId,uint16 panelSize,uint16 quorum,uint16 agreed,uint64 issuedAt,uint64 expiresAt)\"\n    );\n\n    struct Attestation {\n        bytes32 requestId;\n        uint256 chainId;\n        bytes32 questionHash;\n        uint8 answerType;\n        bytes answer;\n        uint256 figure;\n        uint64 fromBlock;\n        uint64 toBlock;\n        bytes32 blockHash;\n        bytes32 panelJobId;\n        uint16 panelSize;\n        uint16 quorum;\n        uint16 agreed;\n        uint64 issuedAt;\n        uint64 expiresAt;\n    }\n\n    // All fields are static: abi.encode(TYPEHASH, this tuple) is the EIP-712 struct encoding.\n    struct HashedAttestation {\n        bytes32 requestId;\n        uint256 chainId;\n        bytes32 questionHash;\n        uint8 answerType;\n        bytes32 answerHash;\n        uint256 figure;\n        uint64 fromBlock;\n        uint64 toBlock;\n        bytes32 blockHash;\n        bytes32 panelJobId;\n        uint16 panelSize;\n        uint16 quorum;\n        uint16 agreed;\n        uint64 issuedAt;\n        uint64 expiresAt;\n    }\n\n    struct WeatherState {\n        uint64 observedAt;\n        uint64 validUntil;\n        bool wet;\n        bytes32 requestId;\n    }\n\n    event WeatherAccepted(bytes32 indexed requestId, bool wet, uint64 observedAt, uint64 validUntil);\n    error InvalidWeather();\n    error InvalidWeatherSigner();\n    error OldWeather();\n\n    constructor(address attester_, bytes32 questionHash_) {\n        if (attester_ == address(0) || questionHash_ == bytes32(0)) revert InvalidWeather();\n        weatherAttester = attester_;\n        weatherQuestionHash = questionHash_;\n    }\n\n    /// @notice Anyone may relay a valid answer for this exact consumer and question.\n    function submitWeather(Attestation calldata a, bytes calldata signature) external {\n        if (\n            a.chainId != block.chainid || a.questionHash != weatherQuestionHash || a.answerType != 3\n                || a.answer.length != 32 || a.panelSize != 5 || a.quorum != 4 || a.agreed < 4 || a.agreed > 5\n                || a.requestId == bytes32(0) || a.panelJobId == bytes32(0)\n                || a.issuedAt > block.timestamp || a.expiresAt <= block.timestamp\n                || a.expiresAt <= a.issuedAt || a.expiresAt - a.issuedAt > WEATHER_MAX_AGE\n        ) revert InvalidWeather();\n\n        uint256 encoded = abi.decode(a.answer, (uint256));\n        uint256 observation = encoded / 2;\n        if (observation == 0 || observation > a.issuedAt || observation + WEATHER_MAX_AGE <= block.timestamp) {\n            revert InvalidWeather();\n        }\n        WeatherState storage s = _weather();\n        if (observation <= s.observedAt) revert OldWeather();\n        if (ECDSA.recover(weatherDigest(a), signature) != weatherAttester) revert InvalidWeatherSigner();\n\n        // The observation's age independently limits validity even if signing was delayed.\n        uint64 until = uint64(observation + WEATHER_MAX_AGE);\n        if (a.expiresAt < until) until = a.expiresAt;\n        s.observedAt = uint64(observation);\n        s.validUntil = until;\n        s.wet = encoded % 2 == 1;\n        s.requestId = a.requestId;\n        emit WeatherAccepted(a.requestId, s.wet, s.observedAt, until);\n    }\n\n    function weatherBurnFeePips() public view returns (uint24) {\n        uint256 word;\n        bytes32 slot = WEATHER_SLOT;\n        assembly (\"memory-safe\") { word := sload(slot) }\n        if (block.timestamp >= uint64(word >> 64)) return 2_500;\n        return uint8(word >> 128) != 0 ? 3_500 : 1_500;\n    }\n\n    /// @return mode 0 = fallback, 1 = dry, 2 = rain.\n    function weatherState() external view returns (uint8 mode, uint64 observedAt, uint64 validUntil, bytes32 requestId) {\n        WeatherState storage s = _weather();\n        return (block.timestamp >= s.validUntil ? 0 : s.wet ? 2 : 1, s.observedAt, s.validUntil, s.requestId);\n    }\n\n    function weatherDigest(Attestation calldata a) public view returns (bytes32) {\n        HashedAttestation memory h;\n        h.requestId = a.requestId;\n        h.chainId = a.chainId;\n        h.questionHash = a.questionHash;\n        h.answerType = a.answerType;\n        h.answerHash = keccak256(a.answer);\n        h.figure = a.figure;\n        h.fromBlock = a.fromBlock;\n        h.toBlock = a.toBlock;\n        h.blockHash = a.blockHash;\n        h.panelJobId = a.panelJobId;\n        h.panelSize = a.panelSize;\n        h.quorum = a.quorum;\n        h.agreed = a.agreed;\n        h.issuedAt = a.issuedAt;\n        h.expiresAt = a.expiresAt;\n        bytes32 domain = keccak256(abi.encode(\n            DOMAIN_TYPEHASH, keccak256(\"IdentityMD Oracle\"), keccak256(\"2\"), block.chainid, address(this)\n        ));\n        return MessageHashUtils.toTypedDataHash(domain, keccak256(abi.encode(ATTESTATION_TYPEHASH, h)));\n    }\n\n    function _weather() private pure returns (WeatherState storage s) {\n        bytes32 slot = WEATHER_SLOT;\n        assembly (\"memory-safe\") { s.slot := slot }\n    }\n}\n"},"src/legacy/LiquidityReserve.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IPositionManager} from \"@uniswap/v4-periphery/src/interfaces/IPositionManager.sol\";\nimport {PositionInfo} from \"@uniswap/v4-periphery/src/libraries/PositionInfoLibrary.sol\";\nimport {Actions} from \"@uniswap/v4-periphery/src/libraries/Actions.sol\";\nimport {IAllowanceTransfer} from \"permit2/src/interfaces/IAllowanceTransfer.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\n\n/// @notice Holds separately earmarked liquidity claims and can only increase one existing NFT.\n/// @dev NFT approval confers no externally callable withdrawal, transfer or arbitrary-call path.\ncontract LiquidityReserve {\n    IPoolManager public immutable poolManager;\n    IPositionManager public immutable positionManager;\n    IAllowanceTransfer public immutable permit2;\n    address public immutable hook;\n    address public immutable token;\n    address public immutable positionOwner;\n    uint256 public immutable tokenId;\n    int24 public immutable tickLower;\n    int24 public immutable tickUpper;\n\n    error Unauthorized();\n    error InvalidPosition();\n    error TransferFailed();\n\n    constructor(IPoolManager manager, IPositionManager posm, IAllowanceTransfer permits,\n        address hook_, address token_, address owner_, uint256 id) {\n        (PoolKey memory key, PositionInfo info) = posm.getPoolAndPositionInfo(id);\n        if (address(posm.poolManager()) != address(manager) || address(key.hooks) != hook_\n            || Currency.unwrap(key.currency0) != address(0) || Currency.unwrap(key.currency1) != token_\n            || key.fee != 0x800000 || key.tickSpacing != 1 || IERC721(address(posm)).ownerOf(id) != owner_)\n            revert InvalidPosition();\n        poolManager = manager;\n        positionManager = posm;\n        permit2 = permits;\n        hook = hook_;\n        token = token_;\n        positionOwner = owner_;\n        tokenId = id;\n        tickLower = info.tickLower();\n        tickUpper = info.tickUpper();\n        manager.setOperator(hook_, true);\n        if (!IERC20(token_).approve(address(permits), type(uint256).max)) revert TransferFailed();\n    }\n\n    receive() external payable {\n        if (msg.sender != address(positionManager) && msg.sender != address(poolManager)) revert Unauthorized();\n    }\n\n    function increase(uint128 liquidity, uint128 amount0, uint128 amount1) external payable {\n        if (msg.sender != hook || msg.value != amount0) revert Unauthorized();\n        if (IERC721(address(positionManager)).ownerOf(tokenId) != positionOwner) revert InvalidPosition();\n        permit2.approve(token, address(positionManager), amount1, uint48(block.timestamp));\n        bytes[] memory args = new bytes[](4);\n        args[0] = abi.encode(tokenId, uint256(liquidity), amount0, amount1, bytes(\"\"));\n        args[1] = abi.encode(Currency.wrap(address(0)));\n        args[2] = abi.encode(Currency.wrap(token));\n        args[3] = abi.encode(Currency.wrap(address(0)), address(this));\n        positionManager.modifyLiquiditiesWithoutUnlock{value: amount0}(\n            abi.encodePacked(uint8(Actions.INCREASE_LIQUIDITY), uint8(Actions.CLOSE_CURRENCY),\n                uint8(Actions.CLOSE_CURRENCY), uint8(Actions.SWEEP)), args);\n        permit2.approve(token, address(positionManager), 0, 0);\n        // Any unused input or collected LP fees stay in the dedicated reserve.\n        uint256 tokens = IERC20(token).balanceOf(address(this));\n        if (tokens != 0) {\n            poolManager.sync(Currency.wrap(token));\n            if (!IERC20(token).transfer(address(poolManager), tokens)) revert TransferFailed();\n            poolManager.settle();\n            poolManager.mint(address(this), uint256(uint160(token)), tokens);\n        }\n        uint256 eth = address(this).balance;\n        if (eth != 0) {\n            poolManager.sync(Currency.wrap(address(0)));\n            poolManager.settle{value: eth}();\n            poolManager.mint(address(this), 0, eth);\n        }\n    }\n}\n"},"src/legacy/LpRemainderProcessor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {SqrtPriceMath} from \"@uniswap/v4-core/src/libraries/SqrtPriceMath.sol\";\nimport {LiquidityAmounts} from \"@uniswap/v4-periphery/src/libraries/LiquidityAmounts.sol\";\nimport {IPositionManager} from \"@uniswap/v4-periphery/src/interfaces/IPositionManager.sol\";\nimport {PositionInfo} from \"@uniswap/v4-periphery/src/libraries/PositionInfoLibrary.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\n\n/// @notice Threshold-free final settlement of the original reserve into its original NFT.\n/// @dev Stateless delegate module. The parent MUST admit this only through its protected\n/// final-lane unlock kind after future auto-LP funding retires. An unlocked manager alone\n/// does not authenticate an unlock kind; that authorization belongs to the parent.\n///\n/// Quotes must simulate this complete call at a pinned block and supply a nonzero minimum\n/// on its ONE total liquidity increase, plus short-lived caps on BOTH observed claim balances.\n/// Spot value is used only to converge the asset ratio, never as an oracle of fair value.\n/// Every swap shares the initial sqrt-price +/-0.5% envelope (roughly +/-1% price).\n/// Fee losses are covered by the output minimum, not that price envelope. This is not MEV\n/// protection against a manipulated initial spot: the caller's\n/// independently checked minLiquidity is the output protection. No USD threshold/feed is used.\n///\n/// At most 32 exact-input corrections are attempted. Non-convergence or a partial fill that\n/// leaves material surplus REVERTS atomically; it never deposits just the matched fraction.\n/// Dust is <= 1e6 wei of ETH value, plus four token atoms and two liquidity units per side.\n/// Extreme prices/ranges may make a single indivisible unit valuable: quote accordingly.\n/// All observed ERC6909 claims are considered. Fees/refunds recycled by reserve.increase\n/// remain in that same reserve and can use this lane again; there is no one-shot latch.\ncontract LpRemainderProcessor {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    IPoolManager public immutable poolManager;\n    LiquidityReserve public immutable liquidityReserve;\n    IPositionManager public immutable positionManager;\n    address public immutable hook;\n    address public immutable token;\n    address public immutable positionOwner;\n    uint256 public immutable tokenId;\n    int24 public immutable tickLower;\n    int24 public immutable tickUpper;\n    uint256 private constant Q96 = 1 << 96;\n    uint256 public constant DUST_WEI = 1_000_000;\n    uint256 public constant MAX_CORRECTIONS = 32;\n\n    error InvalidConfiguration();\n    error InvalidContext();\n    error InvalidDeadline();\n    error InvalidBounds();\n    error InvalidPosition();\n    error EmptyLiquidity();\n    error InsufficientLiquidity();\n    error MaterialRemainder();\n    error InvalidSwap();\n\n    event RemainderAdded(uint256 indexed tokenId, uint128 liquidity, uint256 ethAdded, uint256 tokensAdded);\n\n    constructor(IPoolManager manager, address hook_, LiquidityReserve reserve_, address token_) {\n        if (\n            address(manager).code.length == 0 || hook_ == address(0) || token_ == address(0)\n                || address(reserve_).code.length == 0 || address(reserve_.poolManager()) != address(manager)\n                || reserve_.hook() != hook_ || reserve_.token() != token_\n        ) revert InvalidConfiguration();\n        poolManager = manager;\n        liquidityReserve = reserve_;\n        positionManager = reserve_.positionManager();\n        hook = hook_;\n        token = token_;\n        positionOwner = reserve_.positionOwner();\n        tokenId = reserve_.tokenId();\n        tickLower = reserve_.tickLower();\n        tickUpper = reserve_.tickUpper();\n        _checkPosition();\n    }\n\n    /// @dev Supports direct delegatecall in the PM callback or the parent's protected self-call.\n    /// No user-selected target, owner, position, pool, recipient, allowance or arbitrary calldata.\n    function execute(uint128 minLiquidity, uint256 maximumEth, uint256 maximumTokens, uint256 deadline)\n        external\n        returns (uint128 liquidity)\n    {\n        if (\n            address(this) != hook || (msg.sender != hook && msg.sender != address(poolManager))\n                || !poolManager.isUnlocked()\n        ) revert InvalidContext();\n        if (deadline < block.timestamp || deadline - block.timestamp > 5 minutes) revert InvalidDeadline();\n        if (minLiquidity == 0) revert InvalidBounds();\n        _checkPosition();\n        Work memory w;\n        w.eth = poolManager.balanceOf(address(liquidityReserve), 0);\n        w.tokens = poolManager.balanceOf(address(liquidityReserve), uint256(uint160(token)));\n        // Signed swap deltas are int128; do not truncate balances or silently leave a capped batch.\n        uint256 maxAmount = uint256(uint128(type(int128).max));\n        if (w.eth > maximumEth || w.tokens > maximumTokens || w.eth > maxAmount || w.tokens > maxAmount) {\n            revert InvalidBounds();\n        }\n        if (w.eth == 0 && w.tokens == 0) revert EmptyLiquidity();\n        PoolKey memory key = _key();\n        (w.price,,,) = poolManager.getSlot0(key.toId());\n        if (w.price <= TickMath.MIN_SQRT_PRICE || w.price >= TickMath.MAX_SQRT_PRICE) revert InvalidSwap();\n        w.lower = TickMath.getSqrtPriceAtTick(tickLower);\n        w.upper = TickMath.getSqrtPriceAtTick(tickUpper);\n        w.limitDown = uint160(uint256(w.price) * 995 / 1000);\n        uint256 upperLimit = uint256(w.price) * 1005 / 1000;\n        w.limitUp = upperLimit >= TickMath.MAX_SQRT_PRICE ? TickMath.MAX_SQRT_PRICE - 1 : uint160(upperLimit);\n        if (w.limitDown <= TickMath.MIN_SQRT_PRICE) w.limitDown = TickMath.MIN_SQRT_PRICE + 1;\n\n        for (uint256 i; ; ++i) {\n            liquidity = LiquidityAmounts.getLiquidityForAmounts(w.price, w.lower, w.upper, w.eth, w.tokens);\n            // Reserve one liquidity unit for the periphery's rounded-up token requirements.\n            if (liquidity != 0) --liquidity;\n            (w.addEth, w.addTokens) = _amounts(w, liquidity);\n            if (_onlyDust(w)) break;\n            if (i == MAX_CORRECTIONS) revert MaterialRemainder();\n            _correct(key, w);\n        }\n        if (liquidity == 0) revert EmptyLiquidity();\n        // Check total output BEFORE take/increase; swaps and claim movements also roll back on failure.\n        if (liquidity < minLiquidity) revert InsufficientLiquidity();\n        if (w.addEth > type(uint128).max || w.addTokens > type(uint128).max) revert InvalidBounds();\n        if (w.addEth != 0) {\n            poolManager.burn(address(liquidityReserve), 0, w.addEth);\n            poolManager.take(key.currency0, hook, w.addEth);\n        }\n        if (w.addTokens != 0) {\n            poolManager.burn(address(liquidityReserve), uint256(uint160(token)), w.addTokens);\n            poolManager.take(key.currency1, address(liquidityReserve), w.addTokens);\n        }\n        liquidityReserve.increase{value: w.addEth}(liquidity, uint128(w.addEth), uint128(w.addTokens));\n        emit RemainderAdded(tokenId, liquidity, w.addEth, w.addTokens);\n    }\n\n    struct Work {\n        uint256 eth;\n        uint256 tokens;\n        uint256 addEth;\n        uint256 addTokens;\n        uint160 price;\n        uint160 lower;\n        uint160 upper;\n        uint160 limitDown;\n        uint160 limitUp;\n    }\n\n    function _key() private view returns (PoolKey memory) {\n        return PoolKey(Currency.wrap(address(0)), Currency.wrap(token), 0x800000, 1, IHooks(hook));\n    }\n\n    function _checkPosition() private view {\n        (PoolKey memory key, PositionInfo info) = positionManager.getPoolAndPositionInfo(tokenId);\n        if (\n            address(positionManager.poolManager()) != address(poolManager)\n                || IERC721(address(positionManager)).ownerOf(tokenId) != positionOwner\n                || Currency.unwrap(key.currency0) != address(0) || Currency.unwrap(key.currency1) != token\n                || key.fee != 0x800000 || key.tickSpacing != 1 || address(key.hooks) != hook\n                || info.tickLower() != tickLower || info.tickUpper() != tickUpper || tickLower >= tickUpper\n        ) revert InvalidPosition();\n    }\n\n    function _tokenValue(uint256 amount, uint160 price) private pure returns (uint256) {\n        return FullMath.mulDiv(FullMath.mulDiv(amount, Q96, price), Q96, price);\n    }\n\n    function _amounts(Work memory w, uint128 liquidity) private pure returns (uint256 eth, uint256 tokens) {\n        if (w.price < w.upper) {\n            eth = SqrtPriceMath.getAmount0Delta(w.price > w.lower ? w.price : w.lower, w.upper, liquidity, true);\n        }\n        if (w.price > w.lower) {\n            tokens = SqrtPriceMath.getAmount1Delta(w.lower, w.price < w.upper ? w.price : w.upper, liquidity, true);\n        }\n    }\n\n    function _onlyDust(Work memory w) private pure returns (bool) {\n        if (w.addEth > w.eth || w.addTokens > w.tokens) return false;\n        (uint256 roundingEth, uint256 roundingTokens) = _amounts(w, 2);\n        uint256 tokenDust = FullMath.mulDiv(FullMath.mulDiv(DUST_WEI, w.price, Q96), w.price, Q96) + 4;\n        return w.eth - w.addEth <= DUST_WEI + roundingEth + _tokenValue(4, w.price)\n            && w.tokens - w.addTokens <= tokenDust + roundingTokens;\n    }\n\n    function _correct(PoolKey memory key, Work memory w) private {\n        (uint256 ratioEth, uint256 ratioTokens) = _amounts(w, 1e18);\n        uint256 ratioValue = _tokenValue(ratioTokens, w.price);\n        uint256 oldValue = _tokenValue(w.tokens, w.price);\n        if (ratioEth + ratioValue == 0) revert InvalidSwap();\n        uint256 targetValue = FullMath.mulDiv(w.eth + oldValue, ratioValue, ratioEth + ratioValue);\n        bool buy = targetValue > oldValue;\n        uint256 input = buy ? targetValue - oldValue\n            : (oldValue == 0 ? 0 : FullMath.mulDiv(w.tokens, oldValue - targetValue, oldValue));\n        _swap(key, w, buy, input);\n    }\n\n    function _swap(PoolKey memory key, Work memory w, bool buy, uint256 input) private {\n        uint160 limit = buy ? w.limitDown : w.limitUp;\n        if (\n            input == 0 || input > uint256(uint128(type(int128).max))\n                || (buy ? (input > w.eth || w.price <= limit) : (input > w.tokens || w.price >= limit))\n        ) revert MaterialRemainder();\n        uint256 inputId = buy ? 0 : uint256(uint160(token));\n        uint256 outputId = buy ? uint256(uint160(token)) : 0;\n        poolManager.burn(address(liquidityReserve), inputId, input);\n        BalanceDelta delta = poolManager.swap(key, SwapParams(buy, -int256(input), limit), bytes(\"\"));\n        int128 inputDelta = buy ? delta.amount0() : delta.amount1();\n        int128 outputDelta = buy ? delta.amount1() : delta.amount0();\n        if (inputDelta >= 0 || outputDelta <= 0) revert InvalidSwap();\n        uint256 spent = uint256(-int256(inputDelta));\n        uint256 output = uint256(uint128(outputDelta));\n        if (spent > input) revert InvalidSwap();\n        if (spent < input) poolManager.mint(address(liquidityReserve), inputId, input - spent);\n        poolManager.mint(address(liquidityReserve), outputId, output);\n        if (buy) { w.eth -= spent; w.tokens += output; }\n        else { w.tokens -= spent; w.eth += output; }\n        (w.price,,,) = poolManager.getSlot0(key.toId());\n        if (w.price < w.limitDown || w.price > w.limitUp) revert InvalidSwap();\n    }\n}\n"},"src/legacy/MarketCapOracle.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\ninterface ICapSource { function marketCap() external view returns (uint256); }\ninterface IPredictionCapSource { function predictionReady() external view returns (bool); }\ninterface IObservationScheduler { function oracle() external view returns (address); }\n\n/// @notice Time average of recorded USD capitalization, scaled by 1e8.\n/// @dev Bounded observation gaps are mandatory. Missing coverage produces no result.\ncontract MarketCapOracle {\n    uint64 public constant MAX_GAP = 120;\n    uint256 public constant SOURCE_READ_GAS = 60_000;\n    ICapSource public immutable source;\n    address private immutable installer;\n    address public scheduler;\n    struct Observation { uint64 time; uint192 cumulative; uint128 cap; uint64 invalidThrough; bool valid; }\n    // Append-only: settling late must never erase a winner's recorded price window.\n    Observation[] private observations;\n    // Eight checked 32-bit reference counts per slot; overlapping markets share each minute.\n    mapping(uint64 => uint256) private scheduledMinuteCounts;\n\n    constructor(ICapSource source_) { require(address(source_).code.length != 0); source = source_; installer = msg.sender; }\n\n    function bindScheduler(address market) external {\n        require(msg.sender == installer && scheduler == address(0) && market.code.length != 0);\n        require(IObservationScheduler(market).oracle() == address(this));\n        scheduler = market;\n    }\n    function schedule(uint64 start, uint64 end) external {\n        _changeWindow(start, end, true);\n    }\n    function cancel(uint64 start, uint64 end) external {\n        _changeWindow(start, end, false);\n    }\n    function _changeWindow(uint64 start, uint64 end, bool adding) private {\n        require(msg.sender == scheduler && start < end && end - start <= 1 hours);\n        uint64 first = start / 60; uint64 last = end / 60;\n        while (first <= last) {\n            uint64 word = first / 8; uint64 stop = last < word * 8 + 7 ? last : word * 8 + 7;\n            uint256 packed = scheduledMinuteCounts[word];\n            for (uint64 minute = first; minute <= stop; ++minute) {\n                uint256 shift = (minute % 8) * 32;\n                uint256 references = uint32(packed >> shift);\n                require(adding ? references < type(uint32).max : references != 0);\n                uint256 next = adding ? references + 1 : references - 1;\n                packed = (packed & ~(uint256(type(uint32).max) << shift)) | (next << shift);\n            }\n            scheduledMinuteCounts[word] = packed;\n            first = stop + 1;\n        }\n    }\n    function needsObservation() public view returns (bool) {\n        uint64 minute = uint64(block.timestamp / 60);\n        return uint32(scheduledMinuteCounts[minute / 8] >> ((minute % 8) * 32)) != 0;\n    }\n    function checkpointIfNeeded() external returns (bool) { return needsObservation() ? checkpoint() : false; }\n    function count() external view returns (uint256) { return observations.length; }\n    function current() public view returns (bool valid, uint256 value) {\n        // Leave enough gas to record an invalid interval even if the source exhausts its call.\n        try source.marketCap{gas: SOURCE_READ_GAS}() returns (uint256 cap) { if (cap > 0 && cap <= 1e22) return (true, cap); } catch {}\n    }\n    /// @dev A source must opt in explicitly. This signal is not proof of economic safety.\n    function predictionReady() external view returns (bool) {\n        try IPredictionCapSource(address(source)).predictionReady() returns (bool ready) { return ready; } catch { return false; }\n    }\n\n    function checkpoint() public returns (bool valid) {\n        uint256 value; (valid, value) = current();\n        uint256 length = observations.length;\n        if (length == 0) {\n            if (!valid) return false;\n            observations.push(Observation(uint64(block.timestamp), 0, uint128(value), 0, true)); return true;\n        }\n        uint256 previous = length - 1;\n        Observation memory p = observations[previous];\n        uint64 time = uint64(block.timestamp);\n        uint64 invalid = !valid || !p.valid || time - p.time > MAX_GAP ? time : p.invalidThrough;\n        if (p.invalidThrough > invalid) invalid = p.invalidThrough;\n        Observation memory n = Observation(time, uint192(uint256(p.cumulative) + uint256(p.cap) * (time - p.time)), valid ? uint128(value) : p.cap, invalid, valid);\n        if (time == p.time) { observations[previous] = n; return valid; }\n        observations.push(n);\n    }\n\n    function latest() external view returns (Observation memory) { require(observations.length != 0); return _at(observations.length - 1); }\n    function average(uint64 start, uint64 end) external view returns (bool valid, uint256 capUsd) {\n        uint256 length = observations.length;\n        if (start >= end || length < 2 || _at(0).time > start || _at(length - 1).time < end) return (false, 0);\n        (uint256 a,) = _cumulative(start); (uint256 b, uint64 invalidThrough) = _cumulative(end);\n        if (invalidThrough > start) return (false, 0);\n        return (true, (b - a) / (end - start));\n    }\n    function _cumulative(uint64 time) private view returns (uint256 value, uint64 invalidThrough) {\n        uint256 lo; uint256 hi = observations.length - 1;\n        while (lo < hi) { uint256 mid = (lo + hi + 1) / 2; if (_at(mid).time <= time) lo = mid; else hi = mid - 1; }\n        Observation memory p = _at(lo); invalidThrough = p.invalidThrough;\n        if (p.time < time) invalidThrough = _at(lo + 1).invalidThrough;\n        return (uint256(p.cumulative) + uint256(p.cap) * (time - p.time), invalidThrough);\n    }\n    function _at(uint256 logical) private view returns (Observation memory) { return observations[logical]; }\n}\n"},"src/legacy/NftRewards.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/// @notice Closed daily pots belong to the wallets that held the NFTs during that day.\n/// @dev No owner withdrawal and no holder enumeration inside pool swaps.\nabstract contract NftRewards is ReentrancyGuard {\n    struct Checkpoint { uint64 time; uint32 units; uint160 integral; }\n    IPoolManager public immutable poolManager;\n    address public immutable hook;\n    uint64 public immutable epochStart;\n    uint256 public constant EPOCH = 1 days;\n    uint256 public constant PAYOUT_GAS = 60_000;\n    mapping(address => Checkpoint[]) private histories;\n    Checkpoint[] private supplyHistory;\n    mapping(uint256 => uint256) public epochPot;\n    mapping(uint256 => mapping(address => uint256)) public paid;\n    uint256 public totalAccrued;\n    uint256 public totalPaid;\n    uint256 public uncollected;\n    uint256 private collecting;\n    address[] public rewardAccounts;\n    mapping(address => bool) private knownAccount;\n\n    error RewardsUnauthorized();\n    error InvalidReward();\n    error EpochOpen();\n    event NftRewardAccrued(uint256 indexed epoch, uint256 amount);\n    event NftRewardPaid(uint256 indexed epoch, address indexed account, uint256 amount);\n    event NftRewardDeferred(uint256 indexed epoch, address indexed account, uint256 amount);\n\n    constructor(IPoolManager manager_, address hook_) {\n        require(address(manager_).code.length != 0 && hook_ != address(0), \"reward config\");\n        poolManager = manager_;\n        hook = hook_;\n        epochStart = uint64(block.timestamp);\n    }\n\n    function currentEpoch() public view returns (uint256) { return (block.timestamp - epochStart) / EPOCH; }\n    function rewardAccountCount() external view returns (uint256) { return rewardAccounts.length; }\n\n    function _checkpoint(Checkpoint[] storage h, uint32 units) private {\n        uint160 integral;\n        uint256 n = h.length;\n        if (n != 0) {\n            Checkpoint memory p = h[n - 1];\n            integral = p.integral + uint160((block.timestamp - p.time) * p.units);\n            if (p.time == block.timestamp) { h[n - 1].units = units; return; }\n        }\n        h.push(Checkpoint(uint64(block.timestamp), units, integral));\n    }\n\n    function _recordOwnerUnits(address account, uint32 units) internal {\n        if (account == address(0)) return;\n        if (!knownAccount[account]) { knownAccount[account] = true; rewardAccounts.push(account); }\n        _checkpoint(histories[account], units);\n    }\n\n    function _recordSupply(uint32 units) internal { _checkpoint(supplyHistory, units); }\n\n    function _integralAt(Checkpoint[] storage h, uint256 time) private view returns (uint256) {\n        uint256 lo; uint256 hi = h.length;\n        while (lo < hi) {\n            uint256 mid = (lo + hi) / 2;\n            if (h[mid].time <= time) lo = mid + 1; else hi = mid;\n        }\n        if (lo == 0) return 0;\n        Checkpoint memory p = h[lo - 1];\n        return p.integral + (time - p.time) * p.units;\n    }\n\n    function holdingSeconds(address account, uint256 epoch) public view returns (uint256) {\n        uint256 start = epochStart + epoch * EPOCH;\n        uint256 end = Math.min(start + EPOCH, block.timestamp);\n        if (end <= start) return 0;\n        return _integralAt(histories[account], end) - _integralAt(histories[account], start);\n    }\n\n    function totalHoldingSeconds(uint256 epoch) public view returns (uint256) {\n        uint256 start = epochStart + epoch * EPOCH;\n        uint256 end = Math.min(start + EPOCH, block.timestamp);\n        if (end <= start) return 0;\n        return _integralAt(supplyHistory, end) - _integralAt(supplyHistory, start);\n    }\n\n    function owed(address account, uint256 epoch) public view returns (uint256) {\n        if (epoch >= currentEpoch()) return 0;\n        uint256 denominator = totalHoldingSeconds(epoch);\n        if (denominator == 0) return 0;\n        uint256 entitlement = Math.mulDiv(epochPot[epoch], holdingSeconds(account, epoch), denominator);\n        return entitlement - paid[epoch][account];\n    }\n\n    /// @dev The hook has already minted exactly this many native-ETH claims here.\n    function recordReward(uint256 amount) external {\n        if (msg.sender != hook) revert RewardsUnauthorized();\n        uint256 n = supplyHistory.length;\n        if (amount == 0 || n == 0 || supplyHistory[n - 1].units == 0) revert InvalidReward();\n        if (poolManager.balanceOf(address(this), 0) < uncollected + amount) revert InvalidReward();\n        epochPot[currentEpoch()] += amount;\n        totalAccrued += amount;\n        uncollected += amount;\n        emit NftRewardAccrued(currentEpoch(), amount);\n    }\n\n    function collectRewards() external nonReentrant { _collect(); }\n\n    function _collect() private {\n        uint256 amount = uncollected;\n        if (amount == 0) return;\n        collecting = amount;\n        uncollected = 0;\n        poolManager.unlock(abi.encode(amount));\n        if (collecting != 0) revert InvalidReward();\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert RewardsUnauthorized();\n        uint256 amount = abi.decode(data, (uint256));\n        if (amount == 0 || amount != collecting) revert InvalidReward();\n        collecting = 0;\n        poolManager.burn(address(this), 0, amount);\n        poolManager.take(Currency.wrap(address(0)), address(this), amount);\n        return \"\";\n    }\n\n    /// @notice Anyone can trigger payment, always to the recorded historical recipient.\n    function payRewards(uint256 epoch, address[] calldata accounts) external nonReentrant {\n        if (epoch >= currentEpoch()) revert EpochOpen();\n        if (accounts.length > 40) revert InvalidReward();\n        _collect();\n        for (uint256 i; i < accounts.length; ++i) {\n            address account = accounts[i];\n            uint256 amount = owed(account, epoch);\n            if (amount == 0) continue;\n            paid[epoch][account] += amount;\n            totalPaid += amount;\n            (bool ok,) = payable(account).call{value: amount, gas: PAYOUT_GAS}(\"\");\n            if (!ok) {\n                paid[epoch][account] -= amount;\n                totalPaid -= amount;\n                emit NftRewardDeferred(epoch, account, amount);\n            } else emit NftRewardPaid(epoch, account, amount);\n        }\n    }\n\n    receive() external payable {\n        if (msg.sender != address(poolManager)) revert RewardsUnauthorized();\n    }\n}\n"},"src/legacy/PlatformRevenue.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\n\n/// @notice Separately provable canonical and additional platform credits with one fixed payout destination.\n/// @dev No owner, upgrades, delegated spending or arbitrary recipient. Existing credits survive hook replacement.\ncontract PlatformRevenue {\n    IPoolManager public immutable poolManager;\n    address public immutable beneficiary;\n    address public immutable graphFactory;\n    address public hook;\n    uint256 public canonicalPlatformBalance;\n    uint256 public additionalPlatformBalance;\n    error InvalidConfiguration();\n    error InvalidClaim();\n    error NotPoolManager();\n    error NotHook();\n    event Allocated(uint256 canonicalAmount, uint256 additionalAmount);\n    event Claimed(address indexed beneficiary, bool canonical, uint256 amount);\n\n    constructor(IPoolManager manager, address beneficiary_, address factory_) {\n        if (address(manager).code.length == 0 || beneficiary_ == address(0) || factory_.code.length == 0) {\n            revert InvalidConfiguration();\n        }\n        poolManager = manager;\n        beneficiary = beneficiary_;\n        graphFactory = factory_;\n    }\n\n    function initialize(address hook_) external {\n        if (msg.sender != graphFactory || hook != address(0) || hook_.code.length == 0) revert InvalidConfiguration();\n        hook = hook_;\n    }\n\n    function balance() public view returns (uint256) {\n        return poolManager.balanceOf(address(this), 0);\n    }\n\n    function recordAllocation(uint256 canonicalAmount, uint256 additionalAmount) external {\n        if (msg.sender != hook) revert NotHook();\n        if (balance() < canonicalPlatformBalance + additionalPlatformBalance + canonicalAmount + additionalAmount) {\n            revert InvalidConfiguration();\n        }\n        canonicalPlatformBalance += canonicalAmount;\n        additionalPlatformBalance += additionalAmount;\n        emit Allocated(canonicalAmount, additionalAmount);\n    }\n\n    function unassignedBalance() public view returns (uint256) {\n        return balance() - canonicalPlatformBalance - additionalPlatformBalance;\n    }\n\n    function claimUnassigned(uint256 amount) external {\n        if (amount == 0 || amount > unassignedBalance()) revert InvalidClaim();\n        poolManager.unlock(abi.encode(uint8(2), amount));\n    }\n\n    function claimCanonical(uint256 amount) external {\n        _claim(true, amount);\n    }\n\n    function claimAdditional(uint256 amount) external {\n        _claim(false, amount);\n    }\n\n    function _claim(bool canonical, uint256 amount) private {\n        uint256 available = canonical ? canonicalPlatformBalance : additionalPlatformBalance;\n        if (amount == 0 || amount > available) revert InvalidClaim();\n        if (canonical) canonicalPlatformBalance -= amount;\n        else additionalPlatformBalance -= amount;\n        poolManager.unlock(abi.encode(canonical ? uint8(0) : uint8(1), amount));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        (uint8 kind, uint256 amount) = abi.decode(data, (uint8, uint256));\n        poolManager.burn(address(this), 0, amount);\n        poolManager.take(Currency.wrap(address(0)), beneficiary, amount);\n        emit Claimed(beneficiary, kind == 0, amount);\n        return \"\";\n    }\n}\n"},"src/legacy/PoolCapSource.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {IEthUsdFeed} from \"./FeeEfficientHook.sol\";\n\n/// @notice Native-ETH / 18-decimal CLAUS valuation from the fixed official pool.\ncontract PoolCapSource {\n    using StateLibrary for IPoolManager;\n    IPoolManager public immutable manager;\n    PoolId public immutable poolId;\n    IERC20Metadata public immutable token;\n    IEthUsdFeed public immutable feed;\n    uint128 public immutable minimumLiquidity;\n    error InvalidData();\n    constructor(IPoolManager manager_, PoolId id_, IERC20Metadata token_, IEthUsdFeed feed_, uint128 minimum_) {\n        if (address(manager_).code.length == 0 || token_.decimals() != 18 || feed_.decimals() != 8 || minimum_ == 0) revert InvalidData();\n        manager = manager_; poolId = id_; token = token_; feed = feed_; minimumLiquidity = minimum_;\n    }\n    // The ordinary source remains display-only. A price game must explicitly opt in\n    // to participant-influenced outcomes through its separate source implementation.\n    function predictionReady() external pure virtual returns (bool) { return false; }\n    function marketCap() external view returns (uint256) {\n        (uint160 price,,,) = manager.getSlot0(poolId);\n        (uint80 round, int256 usd,, uint256 updated, uint80 answered) = feed.latestRoundData();\n        if (price == 0 || usd <= 0 || updated == 0 || updated > block.timestamp || block.timestamp - updated > 1 hours || answered < round || manager.getLiquidity(poolId) < minimumLiquidity) revert InvalidData();\n        uint256 inverse = FullMath.mulDiv(1 << 96, 1 << 96, price);\n        uint256 ethValue = FullMath.mulDiv(inverse, token.totalSupply(), price);\n        return FullMath.mulDiv(ethValue, uint256(usd), 1 ether);\n    }\n}\n"},"src/legacy/ProjectRevenue.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\n\n/// @notice Every new project-fee claim belongs to the one fixed project wallet.\n/// @dev Deliberately non-upgradeable; an upgraded hook may choose a new vault,\n/// but cannot redirect claims already earned here. Existing old vaults stay intact.\ncontract ProjectRevenue {\n    IPoolManager public immutable poolManager;\n    address public immutable active;\n    error InvalidConfiguration();\n    error InvalidClaim();\n    error NotPoolManager();\n    event RevenueClaimed(address indexed recipient, uint256 amount);\n\n    constructor(IPoolManager manager, address recipient) {\n        if (address(manager).code.length == 0 || recipient == address(0)) revert InvalidConfiguration();\n        poolManager = manager;\n        active = recipient;\n    }\n\n    function treasury() external pure returns (address) {\n        return address(0);\n    }\n\n    function balances() external view returns (uint256 activeAmount, uint256 treasuryAmount) {\n        return (poolManager.balanceOf(address(this), 0), 0);\n    }\n\n    function claimActive(uint256 amount) external {\n        if (amount == 0 || amount > poolManager.balanceOf(address(this), 0)) revert InvalidClaim();\n        poolManager.unlock(abi.encode(amount));\n    }\n\n    function claimTreasury(uint256) external pure {\n        revert InvalidClaim();\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        uint256 amount = abi.decode(data, (uint256));\n        poolManager.burn(address(this), 0, amount);\n        poolManager.take(Currency.wrap(address(0)), active, amount);\n        emit RevenueClaimed(active, amount);\n        return \"\";\n    }\n}\n"},"src/legacy/privacy/ClausPrivacyBuy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPrivacyPool} from \"./IPrivacyPool.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/// @notice Spend an approved ETH Privacy Pools note on the existing CLAUS pool.\n/// @dev No deposits, admin, arbitrary calls or owner withdrawal path. Every spend\n/// is bound to its complete purchase instruction by the upstream ZK verifier.\ncontract ClausPrivacyBuy is IUnlockCallback {\n    using BalanceDeltaLibrary for BalanceDelta;\n\n    struct Intent {\n        address recipient;\n        address relayer;\n        uint256 amount;\n        uint256 minAmountOut;\n        uint256 relayFee;\n        uint256 deadline;\n    }\n\n    IPoolManager public immutable manager;\n    IPrivacyPool public immutable privacyPool;\n    IERC20 public immutable token;\n    address public immutable hook;\n    int24 public immutable tickSpacing;\n\n    // The hook must authenticate both callbacks within this one atomic spend.\n    // 0 idle, 1 withdrawing, 2 before swap, 3 after swap, 4 settling, 5 paying.\n    uint8 private phase;\n    bytes32 public activeIntent;\n    uint256 private activeAmount;\n    uint256 private activeMinimum;\n    address private activeRecipient;\n\n    error InvalidConfiguration();\n    error InvalidIntent();\n    error InvalidProofAmount();\n    error InvalidCallerOrPhase();\n    error IncompleteSwap();\n    error InsufficientOutput();\n    error UnexpectedBalance();\n    error FeeTransferFailed();\n\n    event PrivateBuy(uint256 indexed nullifierHash, address indexed recipient,\n        uint256 amount, uint256 amountOut, address relayer, uint256 relayFee);\n\n    constructor(IPoolManager manager_, IPrivacyPool privacyPool_, IERC20 token_, address hook_, int24 spacing_) {\n        if (address(manager_).code.length == 0 || address(privacyPool_).code.length == 0\n            || address(token_).code.length == 0 || hook_.code.length == 0\n            || privacyPool_.ASSET() != 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\n            || spacing_ <= 0 || spacing_ > TickMath.MAX_TICK_SPACING) revert InvalidConfiguration();\n        manager = manager_;\n        privacyPool = privacyPool_;\n        token = token_;\n        hook = hook_;\n        tickSpacing = spacing_;\n    }\n\n    receive() external payable {\n        if (msg.sender != address(privacyPool) || phase != 1) revert InvalidCallerOrPhase();\n    }\n\n    function buy(Intent calldata intent, IPrivacyPool.WithdrawProof calldata proof)\n        external returns (uint256 amountOut)\n    {\n        if (phase != 0 || msg.sender != intent.relayer) revert InvalidCallerOrPhase();\n        if (intent.recipient == address(0) || intent.recipient == address(this)\n            || intent.recipient == address(manager) || intent.recipient == address(privacyPool)\n            || intent.recipient == hook || intent.recipient == address(token)\n            || intent.amount <= intent.relayFee || intent.amount >= type(uint128).max\n            || intent.minAmountOut == 0 || intent.deadline < block.timestamp) {\n            revert InvalidIntent();\n        }\n        // The buyer approves the exact fee and minimum output in the proof.\n        // Network prices may change; the fee must leave a positive swap amount.\n        if (proof.pubSignals[2] != intent.amount) revert InvalidProofAmount();\n        uint256 initialBalance = address(this).balance;\n        phase = 1;\n        // The pool validates the proof, context, roots and unused nullifier.\n        privacyPool.withdraw(IPrivacyPool.Withdrawal(address(this), abi.encode(intent)), proof);\n        if (address(this).balance != initialBalance + intent.amount) revert UnexpectedBalance();\n        activeIntent = keccak256(abi.encode(intent));\n        activeAmount = intent.amount - intent.relayFee;\n        activeMinimum = intent.minAmountOut;\n        activeRecipient = intent.recipient;\n        phase = 2;\n        amountOut = abi.decode(manager.unlock(\"\"), (uint256));\n        if (phase != 4) revert InvalidCallerOrPhase();\n        phase = 5;\n        delete activeIntent;\n        delete activeAmount;\n        delete activeMinimum;\n        delete activeRecipient;\n        if (intent.relayFee != 0) {\n            (bool paid,) = intent.relayer.call{value: intent.relayFee}(\"\");\n            if (!paid) revert FeeTransferFailed();\n        }\n        if (address(this).balance != initialBalance) revert UnexpectedBalance();\n        phase = 0;\n        emit PrivateBuy(proof.pubSignals[1], intent.recipient, intent.amount, amountOut, intent.relayer, intent.relayFee);\n    }\n\n    /// @dev Called by the actual pool hook, not by a caller-supplied adapter.\n    function authorizeBeforeSwap(bytes32 intentHash, bool zeroForOne, int256 amountSpecified) external {\n        if (msg.sender != hook || phase != 2 || intentHash != activeIntent\n            || !zeroForOne || amountSpecified != -int256(activeAmount)) revert InvalidCallerOrPhase();\n        phase = 3;\n    }\n\n    function authorizeAfterSwap(bytes32 intentHash, int128 amountOut) external {\n        if (msg.sender != hook || phase != 3 || intentHash != activeIntent) revert InvalidCallerOrPhase();\n        if (amountOut <= 0 || uint128(amountOut) < activeMinimum) revert InsufficientOutput();\n        phase = 4;\n    }\n\n    function unlockCallback(bytes calldata) external returns (bytes memory) {\n        if (msg.sender != address(manager) || phase != 2) revert InvalidCallerOrPhase();\n        PoolKey memory key = PoolKey(Currency.wrap(address(0)), Currency.wrap(address(token)),\n            LPFeeLibrary.DYNAMIC_FEE_FLAG, tickSpacing, IHooks(hook));\n        BalanceDelta delta = manager.swap(key,\n            SwapParams(true, -int256(activeAmount), TickMath.MIN_SQRT_PRICE + 1), abi.encode(activeIntent));\n        if (phase != 4) revert InvalidCallerOrPhase();\n        if (delta.amount0() >= 0 || uint256(-int256(delta.amount0())) != activeAmount) revert IncompleteSwap();\n        if (delta.amount1() <= 0 || uint128(delta.amount1()) < activeMinimum) revert InsufficientOutput();\n        uint256 amountOut = uint128(delta.amount1());\n        // Native currency is settled without ERC-20 approvals or intermediary custody.\n        manager.sync(key.currency0);\n        if (manager.settle{value: activeAmount}() != activeAmount) revert UnexpectedBalance();\n        uint256 balanceBefore = token.balanceOf(activeRecipient);\n        manager.take(key.currency1, activeRecipient, amountOut);\n        if (token.balanceOf(activeRecipient) != balanceBefore + amountOut) revert UnexpectedBalance();\n        return abi.encode(amountOut);\n    }\n}\n"},"src/legacy/privacy/FeeBatchedPrivacyHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeePrivacyHook} from \"./FeePrivacyHook.sol\";\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\n\n/// @notice Retains every allocation; ordinary buys/sells accrue buybacks for separate processing.\n/// @dev No new storage. Existing permissionless fixed-destination processing remains available.\ncontract FeeBatchedPrivacyHook is FeePrivacyHook {\n    IERC20 private immutable BUYBACK_TOKEN;\n    address private immutable BUYBACK_RECIPIENT;\n    error InvalidBatch();\n    error BatchOutputTooLow();\n    event BuybackBatchProcessed(uint256 spentEth, uint256 receivedTokens);\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_)\n        FeePrivacyHook(base, privacyBuy_) {\n        BUYBACK_TOKEN = IERC20(base.fomo.token());\n        BUYBACK_RECIPIENT = base.fomo.recipient();\n    }\n\n    function _processBuybacksInSwap() internal pure override returns (bool) { return false; }\n    function batchBuybacksEnabled() external pure returns (bool) { return true; }\n\n    /// @notice Anyone may pay gas, but cannot select recipients, change allocations or withdraw funds.\n    /// @dev Minimum tokens per ETH spent protects partial batches and newly accrued fees proportionally.\n    function processBuybacksGuarded(uint256 minimumTokensPerEth, uint256 maximumPendingEth, uint256 deadline)\n        external returns (uint256 spentEth, uint256 receivedTokens)\n    {\n        uint256 pending = pendingBurnEth() + pendingFomoEth();\n        if (block.timestamp > deadline || deadline > block.timestamp + 5 minutes\n            || minimumTokensPerEth == 0 || pending == 0 || pending > maximumPendingEth) revert InvalidBatch();\n        IERC20 token = BUYBACK_TOKEN;\n        address recipient = BUYBACK_RECIPIENT;\n        uint256 supplyBefore = token.totalSupply();\n        uint256 balanceBefore = token.balanceOf(recipient);\n        poolManager.unlock(abi.encode(uint8(1), msg.sender));\n        _checkpointPredictions();\n        spentEth = pending - pendingBurnEth() - pendingFomoEth();\n        receivedTokens = supplyBefore - token.totalSupply() + token.balanceOf(recipient) - balanceBefore;\n        if (spentEth == 0 || receivedTokens == 0\n            || FullMath.mulDiv(receivedTokens, 1 ether, spentEth) < minimumTokensPerEth) revert BatchOutputTooLow();\n        emit BuybackBatchProcessed(spentEth, receivedTokens);\n    }\n}\n"},"src/legacy/privacy/FeeLpRewardsHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeBatchedPrivacyHook} from \"./FeeBatchedPrivacyHook.sol\";\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {FeeCalls} from \"../FeeCalls.sol\";\nimport {FeeMath} from \"../FeeMath.sol\";\nimport {ClausFeeBudget} from \"../../ClausFeeBudget.sol\";\nimport {LpRemainderProcessor} from \"../LpRemainderProcessor.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IPositionManager} from \"@uniswap/v4-periphery/src/interfaces/IPositionManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\n\n/// @dev Minimal immutable binding and funding surface of the independent rewards vault.\ninterface IClausLpRewards {\n    function poolManager() external view returns (IPoolManager);\n    function positionManager() external view returns (IPositionManager);\n    function hook() external view returns (address);\n    function poolId() external view returns (PoolId);\n    function epochStart() external view returns (uint256);\n    function EPOCH() external view returns (uint256);\n    function totalLiquidity() external view returns (uint256);\n    function projectRevenue() external view returns (address);\n    function recordReward(uint256 amount) external;\n}\n\n/// @notice Fixed 0.15% burn and 0.20% participant LP rewards, preserving old reserve processing.\n/// @dev Adds only immutables. All inherited storage namespaces, delegates and claim owners remain intact.\ncontract FeeLpRewardsHook is FeeBatchedPrivacyHook {\n    IClausLpRewards public immutable lpRewards;\n    LpRemainderProcessor public immutable lpRemainderProcessor;\n    uint64 private immutable LP_EPOCH_START;\n    uint256 private immutable LP_EPOCH_LENGTH;\n    address private constant HOOK = 0x37Bfb8AC7C960E558657871D41Ca70E07e7DbfFf;\n    address private constant UPGRADE_ADMIN = 0x1f22E4B065b2f15Fed5BE556DC0fA636048d29bc;\n    bytes32 private constant BOOST_SLOT = keccak256(\"claus.hook.reward-boost.24h.v1\");\n    uint256 public constant REWARD_BOOST_DURATION = 24 hours;\n    uint24 public constant LP_REWARDS_FEE_PIPS = 2_000;\n\n    struct RewardBoost {\n        uint64 startsAt;\n        uint64 endsAt;\n    }\n    error InvalidLpRewards();\n    error InvalidRemainderProcessor();\n    error InvalidBoostActivation();\n    event RewardBoostActivated(uint64 startsAt, uint64 endsAt, uint24 multiplier);\n    event LpRewardFeeAccrued(uint256 grossEth, uint256 rewardEth, uint256 epoch);\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_, IClausLpRewards lpRewards_, LpRemainderProcessor remainder_)\n        FeeBatchedPrivacyHook(base, privacyBuy_)\n    {\n        PoolKey memory key = PoolKey(\n            Currency.wrap(address(0)),\n            Currency.wrap(base.reserve.token()),\n            LPFeeLibrary.DYNAMIC_FEE_FLAG,\n            base.spacing,\n            IHooks(base.reserve.hook())\n        );\n        uint64 epochStart_ = base.nft.epochStart();\n        uint256 epochLength_ = base.nft.EPOCH();\n        if (\n            address(lpRewards_).code.length == 0 || address(lpRewards_.poolManager()) != address(base.manager)\n                || address(lpRewards_.positionManager()) != address(base.reserve.positionManager())\n                || lpRewards_.hook() != base.reserve.hook()\n                || PoolId.unwrap(lpRewards_.poolId()) != PoolId.unwrap(key.toId())\n                || lpRewards_.epochStart() != epochStart_ || epochStart_ > block.timestamp || epochLength_ != 1 days\n                || lpRewards_.EPOCH() != epochLength_ || lpRewards_.projectRevenue() != address(base.project)\n        ) revert InvalidLpRewards();\n        lpRewards = lpRewards_;\n        if (address(remainder_).code.length == 0 || address(remainder_.poolManager()) != address(base.manager)\n            || address(remainder_.liquidityReserve()) != address(base.reserve)\n            || remainder_.hook() != base.reserve.hook() || remainder_.token() != base.reserve.token()) {\n            revert InvalidRemainderProcessor();\n        }\n        lpRemainderProcessor = remainder_;\n        LP_EPOCH_START = epochStart_;\n        LP_EPOCH_LENGTH = epochLength_;\n    }\n\n    function weatherAllocationEnabled() external pure returns (bool) {\n        return false;\n    }\n\n    /// @notice Finish old auto-LP reserves into their original position, even below its old batch threshold.\n    /// @dev Only the original position owner may choose the short-lived minimum and reserve caps.\n    function processLiquidityRemainder(uint128 minLiquidity, uint256 maximumEth, uint256 maximumTokens, uint256 deadline)\n        external returns (uint128 liquidity)\n    {\n        if (msg.sender != liquidityReserve.positionOwner()) revert NotFeeRecipient();\n        bytes memory result = poolManager.unlock(abi.encode(uint8(2), minLiquidity, maximumEth, maximumTokens, deadline));\n        liquidity = abi.decode(result, (uint128));\n        _checkpointPredictions();\n    }\n\n    function unlockCallback(bytes calldata data) public override onlyPoolManager returns (bytes memory) {\n        uint8 kind = abi.decode(data, (uint8));\n        if (kind != 2) return super.unlockCallback(data);\n        (, uint128 minimum, uint256 maxEth, uint256 maxTokens, uint256 deadline) =\n            abi.decode(data, (uint8, uint128, uint256, uint256, uint256));\n        (bool ok, bytes memory result) = address(lpRemainderProcessor).delegatecall(\n            abi.encodeCall(LpRemainderProcessor.execute, (minimum, maxEth, maxTokens, deadline))\n        );\n        if (!ok) { assembly (\"memory-safe\") { revert(add(result, 32), mload(result)) } }\n        return result;\n    }\n\n    function BURN_FEE_PIPS() public pure override returns (uint24) {\n        return 1_500;\n    }\n\n    function LIQUIDITY_FEE_PIPS() public view override returns (uint24) {\n        return lpRewards.totalLiquidity() == 0 ? 0 : LP_REWARDS_FEE_PIPS;\n    }\n\n    function FOMO_FEE_PIPS() public pure override returns (uint24) {\n        return 0;\n    }\n\n    function NFT_FEE_PIPS() public view virtual override returns (uint24) {\n        return nft.totalSupply() == 0 ? 0 : 3_500;\n    }\n\n    function WALLET_FEE_PIPS() public view override returns (uint24) {\n        return 18_500 - LIQUIDITY_FEE_PIPS() - NFT_FEE_PIPS();\n    }\n\n    /// @dev Retains the historical ABI and one-shot namespace; history no longer sets any allocation.\n    function activateRewardBoost() external {\n        RewardBoost storage s = _boost();\n        if (\n            address(this) != HOOK || msg.sender != UPGRADE_ADMIN || s.endsAt != 0\n                || block.timestamp > type(uint64).max - REWARD_BOOST_DURATION\n        ) revert InvalidBoostActivation();\n        s.startsAt = uint64(block.timestamp);\n        s.endsAt = uint64(block.timestamp + REWARD_BOOST_DURATION);\n        emit RewardBoostActivated(s.startsAt, s.endsAt, 2);\n    }\n\n    function rewardBoostState() external view returns (uint64 startsAt, uint64 endsAt, bool active) {\n        RewardBoost storage s = _boost();\n        return (s.startsAt, s.endsAt, rewardMultiplier() == 2);\n    }\n\n    function rewardMultiplier() public view returns (uint24) {\n        RewardBoost storage s = _boost();\n        return s.endsAt != 0 && block.timestamp >= s.startsAt && block.timestamp < s.endsAt ? 2 : 1;\n    }\n\n    /// @dev Overrides the NFT-layer accrual, retaining individual floors and the owner rounding remainder.\n    function _accrue(uint256 gross, uint256 totalFee) internal virtual override {\n        uint256 project = FeeMath.projectFromGross(gross);\n        uint256 burnEth = gross * BURN_FEE_PIPS() / 1_000_000;\n        uint256 rewardEth = gross * LIQUIDITY_FEE_PIPS() / 1_000_000;\n        uint256 nftEth = gross * NFT_FEE_PIPS() / 1_000_000;\n        uint256 walletEth = project - burnEth - rewardEth - nftEth;\n        uint256 platform = totalFee - project;\n        if (walletEth != 0) FeeCalls.mint(address(poolManager), address(projectRevenue), walletEth);\n        if (burnEth != 0) FeeCalls.mint(address(poolManager), address(this), burnEth);\n        if (rewardEth != 0) {\n            FeeCalls.mint(address(poolManager), address(lpRewards), rewardEth);\n            lpRewards.recordReward(rewardEth);\n            emit LpRewardFeeAccrued(gross, rewardEth, (block.timestamp - LP_EPOCH_START) / LP_EPOCH_LENGTH);\n        }\n        if (nftEth != 0) {\n            FeeCalls.mint(address(poolManager), address(nft), nftEth);\n            FeeCalls.reward(address(nft), nftEth);\n            emit NftFeeAccrued(gross, nftEth, (block.timestamp - LP_EPOCH_START) / LP_EPOCH_LENGTH);\n        }\n        emit ProjectFeeSplit(gross, walletEth, burnEth);\n        // Preserve the allocation event; this amount now belongs to the separate rewards vault.\n        emit LiquidityFeeAccrued(gross, rewardEth);\n        emit FomoFeeAccrued(gross, 0);\n        if (platform != 0) FeeCalls.mint(address(poolManager), address(platformRevenue), platform);\n        uint256 canonical = gross / 1000;\n        FeeCalls.allocation(address(platformRevenue), canonical, platform - canonical);\n        emit FeeAllocation(gross, project, platform);\n        emit PlatformFeeAllocation(gross, canonical, platform - canonical);\n    }\n\n    function _boost() private pure returns (RewardBoost storage s) {\n        bytes32 slot = BOOST_SLOT;\n        assembly { s.slot := slot }\n    }\n}\n"},"src/legacy/privacy/FeeNftStakingHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeLpRewardsHook, IClausLpRewards} from \"./FeeLpRewardsHook.sol\";\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {ClausNftStaking} from \"../ClausNftStaking.sol\";\nimport {LpRemainderProcessor} from \"../LpRemainderProcessor.sol\";\nimport {FeeCalls} from \"../FeeCalls.sol\";\nimport {ClausFeeBudget} from \"../../ClausFeeBudget.sol\";\nimport {FeeMath} from \"../FeeMath.sol\";\n\n/// @notice Changes only future NFT fee routing when the new vault is active.\n/// @dev No new mutable proxy storage. Old NFT balances and debts remain in the original collection.\ncontract FeeNftStakingHook is FeeLpRewardsHook {\n    ClausNftStaking public immutable nftStaking;\n    uint256 public immutable nftStakingStartsAt;\n    uint256 private immutable STAKING_EPOCH_START;\n\n    error InvalidNftStaking();\n    event NftStakingFeeAccrued(uint256 grossEth, uint256 rewardEth, uint256 epoch);\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_, IClausLpRewards lpRewards_,\n        LpRemainderProcessor remainder_, ClausNftStaking staking_)\n        FeeLpRewardsHook(base, privacyBuy_, lpRewards_, remainder_)\n    {\n        if (address(staking_).code.length == 0 || address(staking_.collection()) != address(base.nft)\n            || address(staking_.poolManager()) != address(base.manager)\n            || address(staking_.projectRevenue()) != address(base.project)\n            || staking_.hook() != base.reserve.hook() || staking_.epochStart() != base.nft.epochStart()\n            || staking_.EPOCH() != 1 days)\n            revert InvalidNftStaking();\n        nftStaking = staking_;\n        nftStakingStartsAt = staking_.startsAt();\n        STAKING_EPOCH_START = staking_.epochStart();\n    }\n\n    function NFT_FEE_PIPS() public view override returns (uint24) {\n        if (block.timestamp < nftStakingStartsAt) return super.NFT_FEE_PIPS();\n        return nftStaking.totalStaked() == 0 ? 0 : 3_500;\n    }\n\n    function _accrue(uint256 gross, uint256 totalFee) internal override {\n        if (block.timestamp < nftStakingStartsAt) {\n            super._accrue(gross, totalFee);\n            return;\n        }\n        uint256 burnEth = gross * ClausFeeBudget.pips(2) / 1_000_000;\n        uint256 rewardEth = lpRewards.totalLiquidity()==0?0:gross * ClausFeeBudget.pips(3) / 1_000_000;\n        uint256 nftEth = nftStaking.totalStaked()==0?0:gross * ClausFeeBudget.pips(4) / 1_000_000;\n        uint256 platform = gross * ClausFeeBudget.pips(1) / 1_000_000;\n        address module=ClausFeeBudget.module();\n        uint256 moduleEth = module==address(0)?0:gross * ClausFeeBudget.pips(5) / 1_000_000;\n        // Rounding dust and inactive rewards preserve the existing project destination.\n        uint256 walletEth = totalFee - burnEth - rewardEth - nftEth - platform - moduleEth;\n        if(moduleEth!=0)FeeCalls.mint(address(poolManager),module,moduleEth);\n        ClausFeeBudget.recordFee(totalFee,moduleEth);\n        if (walletEth != 0) FeeCalls.mint(address(poolManager), address(projectRevenue), walletEth);\n        if (burnEth != 0) FeeCalls.mint(address(poolManager), address(this), burnEth);\n        uint256 epoch = (block.timestamp - STAKING_EPOCH_START) / 1 days;\n        if (rewardEth != 0) {\n            FeeCalls.mint(address(poolManager), address(lpRewards), rewardEth);\n            lpRewards.recordReward(rewardEth);\n            emit LpRewardFeeAccrued(gross, rewardEth, epoch);\n        }\n        if (nftEth != 0) {\n            FeeCalls.mint(address(poolManager), address(nftStaking), nftEth);\n            nftStaking.recordReward(nftEth);\n            emit NftFeeAccrued(gross, nftEth, epoch);\n            emit NftStakingFeeAccrued(gross, nftEth, epoch);\n        }\n        emit ProjectFeeSplit(gross, walletEth, burnEth);\n        emit LiquidityFeeAccrued(gross, rewardEth);\n        emit FomoFeeAccrued(gross, 0);\n        if (platform != 0) FeeCalls.mint(address(poolManager), address(platformRevenue), platform);\n        uint256 canonical = gross / 1000;\n        if(canonical>platform)canonical=platform;\n        FeeCalls.allocation(address(platformRevenue), canonical, platform - canonical);\n        emit FeeAllocation(gross, totalFee-platform, platform);\n        emit PlatformFeeAllocation(gross, canonical, platform - canonical);\n    }\n}\n"},"src/legacy/privacy/FeePrivacyHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {FeePredictionHook} from \"../FeePredictionHook.sol\";\nimport {IEthUsdFeed} from \"../FeeEfficientHook.sol\";\nimport {FeeProcessor} from \"../FeeProcessor.sol\";\nimport {ClausNFT} from \"../ClausNFT.sol\";\nimport {MarketCapOracle} from \"../MarketCapOracle.sol\";\nimport {ProjectRevenue} from \"../ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"../PlatformRevenue.sol\";\nimport {LiquidityReserve} from \"../LiquidityReserve.sol\";\nimport {FomoReserve} from \"../FomoReserve.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\n\n/// @notice Retains accounting and historical bindings; new privacy buys are retired.\ncontract FeePrivacyHook is FeePredictionHook {\n    using BalanceDeltaLibrary for BalanceDelta;\n    error PrivacyBuyRetired();\n    ClausPrivacyBuy public immutable privacyBuy;\n\n    struct BaseConfig {\n        IPoolManager manager;\n        ProjectRevenue project;\n        PlatformRevenue platform;\n        LiquidityReserve reserve;\n        IEthUsdFeed feed;\n        FomoReserve fomo;\n        address attester;\n        bytes32 questionHash;\n        FeeProcessor processor;\n        ClausNFT nft;\n        MarketCapOracle oracle;\n        int24 spacing;\n    }\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_)\n        FeePredictionHook(base.manager, base.project, base.platform, base.reserve, base.feed,\n            base.fomo, base.attester, base.questionHash, base.processor, base.nft, base.oracle, base.spacing)\n    {\n        if (address(privacyBuy_.manager()) != address(base.manager) || address(privacyBuy_.token()) != base.reserve.token()\n            || privacyBuy_.hook() != base.reserve.hook() || privacyBuy_.tickSpacing() != base.spacing) revert InvalidInitialization();\n        privacyBuy = privacyBuy_;\n    }\n\n    function _beforeSwapExtension(address sender, PoolKey calldata, SwapParams calldata, bytes calldata)\n        internal virtual override\n    {\n        // Final core has no sender-specific trading blacklist.\n    }\n\n    function _afterSwapExtension(address sender, PoolKey calldata, SwapParams calldata, BalanceDelta delta, bytes calldata data)\n        internal virtual override\n    {\n        // No external feature callback on the trading path.\n    }\n}\n"},"src/legacy/privacy/IPrivacyPool.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.26;\n\n/// @dev ABI subset of 0xbow/privacy-pools-core, commit\n/// d494b63e79f33bb2b0c8ece6cdacdca465c3b884. Field order is protocol-defined.\ninterface IPrivacyPool {\n    struct Withdrawal { address processooor; bytes data; }\n    struct WithdrawProof {\n        uint256[2] pA;\n        uint256[2][2] pB;\n        uint256[2] pC;\n        uint256[8] pubSignals;\n    }\n    function ASSET() external view returns (address);\n    function SCOPE() external view returns (uint256);\n    function withdraw(Withdrawal memory withdrawal, WithdrawProof memory proof) external;\n}\n"},"src/legacy/vendor/chainlink/shared/interfaces/LinkTokenInterface.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// solhint-disable-next-line interface-starts-with-i\ninterface LinkTokenInterface {\n  function allowance(address owner, address spender) external view returns (uint256 remaining);\n\n  function approve(address spender, uint256 value) external returns (bool success);\n\n  function balanceOf(\n    address owner\n  ) external view returns (uint256 balance);\n\n  function decimals() external view returns (uint8 decimalPlaces);\n\n  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n\n  function increaseApproval(address spender, uint256 subtractedValue) external;\n\n  function name() external view returns (string memory tokenName);\n\n  function symbol() external view returns (string memory tokenSymbol);\n\n  function totalSupply() external view returns (uint256 totalTokensIssued);\n\n  function transfer(address to, uint256 value) external returns (bool success);\n\n  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n\n  function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n"},"src/legacy/vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {LinkTokenInterface} from \"../../shared/interfaces/LinkTokenInterface.sol\";\nimport {IVRFV2PlusWrapper} from \"./interfaces/IVRFV2PlusWrapper.sol\";\n\n/**\n *\n * @notice Interface for contracts using VRF randomness through the VRF V2 wrapper\n * ********************************************************************************\n * @dev PURPOSE\n *\n * @dev Create VRF V2+ requests without the need for subscription management. Rather than creating\n * @dev and funding a VRF V2+ subscription, a user can use this wrapper to create one off requests,\n * @dev paying up front rather than at fulfillment.\n *\n * @dev Since the price is determined using the gas price of the request transaction rather than\n * @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas\n * @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.\n * *****************************************************************************\n * @dev USAGE\n *\n * @dev Calling contracts must inherit from VRFV2PlusWrapperConsumerBase. The consumer must be funded\n * @dev with enough LINK or ether to make the request, otherwise requests will revert. To request randomness,\n * @dev call the 'requestRandomWords' function with the desired VRF parameters. This function handles\n * @dev paying for the request based on the current pricing.\n *\n * @dev Consumers must implement the fullfillRandomWords function, which will be called during\n * @dev fulfillment with the randomness result.\n */\nabstract contract VRFV2PlusWrapperConsumerBase {\n  error OnlyVRFWrapperCanFulfill(address have, address want);\n\n  LinkTokenInterface internal immutable i_linkToken;\n  IVRFV2PlusWrapper public immutable i_vrfV2PlusWrapper;\n\n  /**\n   * @param _vrfV2PlusWrapper is the address of the VRFV2Wrapper contract\n   */\n  constructor(\n    address _vrfV2PlusWrapper\n  ) {\n    IVRFV2PlusWrapper vrfV2PlusWrapper = IVRFV2PlusWrapper(_vrfV2PlusWrapper);\n\n    i_linkToken = LinkTokenInterface(vrfV2PlusWrapper.link());\n    i_vrfV2PlusWrapper = vrfV2PlusWrapper;\n  }\n\n  /**\n   * @dev Requests randomness from the VRF V2+ wrapper.\n   *\n   * @param _callbackGasLimit is the gas limit that should be used when calling the consumer's\n   *        fulfillRandomWords function.\n   * @param _requestConfirmations is the number of confirmations to wait before fulfilling the\n   *        request. A higher number of confirmations increases security by reducing the likelihood\n   *        that a chain re-org changes a published randomness outcome.\n   * @param _numWords is the number of random words to request.\n   *\n   * @return requestId is the VRF V2+ request ID of the newly created randomness request.\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function requestRandomness(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords,\n    bytes memory extraArgs\n  ) internal returns (uint256 requestId, uint256 reqPrice) {\n    reqPrice = i_vrfV2PlusWrapper.calculateRequestPrice(_callbackGasLimit, _numWords);\n    i_linkToken.transferAndCall(\n      address(i_vrfV2PlusWrapper), reqPrice, abi.encode(_callbackGasLimit, _requestConfirmations, _numWords, extraArgs)\n    );\n    return (i_vrfV2PlusWrapper.lastRequestId(), reqPrice);\n  }\n\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function requestRandomnessPayInNative(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords,\n    bytes memory extraArgs\n  ) internal returns (uint256 requestId, uint256 requestPrice) {\n    requestPrice = i_vrfV2PlusWrapper.calculateRequestPriceNative(_callbackGasLimit, _numWords);\n    return (\n      i_vrfV2PlusWrapper.requestRandomWordsInNative{value: requestPrice}(\n        _callbackGasLimit, _requestConfirmations, _numWords, extraArgs\n      ),\n      requestPrice\n    );\n  }\n\n  /**\n   * @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must\n   * @notice implement it.\n   *\n   * @param _requestId is the VRF V2 request ID.\n   * @param _randomWords is the randomness result.\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal virtual;\n\n  function rawFulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) external {\n    address vrfWrapperAddr = address(i_vrfV2PlusWrapper);\n    if (msg.sender != vrfWrapperAddr) {\n      revert OnlyVRFWrapperCanFulfill(msg.sender, vrfWrapperAddr);\n    }\n    fulfillRandomWords(_requestId, _randomWords);\n  }\n\n  /// @notice getBalance returns the native balance of the consumer contract\n  function getBalance() public view returns (uint256) {\n    return address(this).balance;\n  }\n\n  /// @notice getLinkToken returns the link token contract\n  function getLinkToken() public view returns (LinkTokenInterface) {\n    return i_linkToken;\n  }\n}\n"},"src/legacy/vendor/chainlink/vrf/dev/interfaces/IVRFV2PlusWrapper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IVRFV2PlusWrapper {\n  /**\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\n   * be relied option within the same transaction that the request was made.\n   */\n  function lastRequestId() external view returns (uint256);\n\n  /**\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\n   * @notice block.\n   *\n   * @dev This function relies on the transaction gas price which is not automatically set during\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   */\n  function calculateRequestPrice(uint32 _callbackGasLimit, uint32 _numWords) external view returns (uint256);\n\n  /**\n   * @notice Calculates the price of a VRF request in native with the given callbackGasLimit at the current\n   * @notice block.\n   *\n   * @dev This function relies on the transaction gas price which is not automatically set during\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   */\n  function calculateRequestPriceNative(uint32 _callbackGasLimit, uint32 _numWords) external view returns (uint256);\n\n  /**\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\n   *\n   * @dev This is a convenience function that can be called in simulation to better understand\n   * @dev pricing.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\n   */\n  function estimateRequestPrice(\n    uint32 _callbackGasLimit,\n    uint32 _numWords,\n    uint256 _requestGasPriceWei\n  ) external view returns (uint256);\n\n  /**\n   * @notice Estimates the price of a VRF request in native with a specific gas limit and gas price.\n   *\n   * @dev This is a convenience function that can be called in simulation to better understand\n   * @dev pricing.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\n   */\n  function estimateRequestPriceNative(\n    uint32 _callbackGasLimit,\n    uint32 _numWords,\n    uint256 _requestGasPriceWei\n  ) external view returns (uint256);\n\n  /**\n   * @notice Requests randomness from the VRF V2 wrapper, paying in native token.\n   *\n   * @param _callbackGasLimit is the gas limit for the request.\n   * @param _requestConfirmations number of request confirmations to wait before serving a request.\n   * @param _numWords is the number of words to request.\n   */\n  function requestRandomWordsInNative(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords,\n    bytes calldata extraArgs\n  ) external payable returns (uint256 requestId);\n\n  function link() external view returns (address);\n  function linkNativeFeed() external view returns (address);\n}\n"},"src/legacy/vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n// End consumer library.\nlibrary VRFV2PlusClient {\n  // extraArgs will evolve to support new features\n  bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n\n  struct ExtraArgsV1 {\n    bool nativePayment;\n  }\n\n  struct RandomWordsRequest {\n    bytes32 keyHash;\n    uint256 subId;\n    uint16 requestConfirmations;\n    uint32 callbackGasLimit;\n    uint32 numWords;\n    bytes extraArgs;\n  }\n\n  function _argsToBytes(\n    ExtraArgsV1 memory extraArgs\n  ) internal pure returns (bytes memory bts) {\n    return abi.encodeWithSelector(EXTRA_ARGS_V1_TAG, extraArgs);\n  }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.26+commit.8a97fa7a","compilerSettings":{"viaIR":true,"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"runs":200,"enabled":true},"evmVersion":"cancun","remappings":["@openzeppelin/contracts-upgradeable/=../../../lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=../../../lib/openzeppelin-contracts/contracts/","@uniswap/v4-core/=../../../lib/v4-periphery/lib/v4-core/","@uniswap/v4-periphery/=../../../lib/v4-periphery/","forge-std/=../../../lib/forge-std/src/","permit2/=../../../lib/v4-periphery/lib/permit2/","solmate/=../../../lib/v4-periphery/lib/v4-core/lib/solmate/"]},"name":"ProtectedHook","fullyQualifiedName":"src/ProtectedHook.sol:ProtectedHook"},"abi":[{"type":"constructor","inputs":[{"name":"base","type":"tuple","components":[{"name":"manager","type":"address","internalType":"contract IPoolManager"},{"name":"project","type":"address","internalType":"contract ProjectRevenue"},{"name":"platform","type":"address","internalType":"contract PlatformRevenue"},{"name":"reserve","type":"address","internalType":"contract LiquidityReserve"},{"name":"feed","type":"address","internalType":"contract IEthUsdFeed"},{"name":"fomo","type":"address","internalType":"contract FomoReserve"},{"name":"attester","type":"address","internalType":"address"},{"name":"questionHash","type":"bytes32","internalType":"bytes32"},{"name":"processor","type":"address","internalType":"contract FeeProcessor"},{"name":"nft","type":"address","internalType":"contract ClausNFT"},{"name":"oracle","type":"address","internalType":"contract MarketCapOracle"},{"name":"spacing","type":"int24","internalType":"int24"}],"internalType":"struct FeePrivacyHook.BaseConfig"},{"name":"privacyBuy_","type":"address","internalType":"contract ClausPrivacyBuy"},{"name":"lpRewards_","type":"address","internalType":"contract IClausLpRewards"},{"name":"remainder_","type":"address","internalType":"contract LpRemainderProcessor"},{"name":"staking_","type":"address","internalType":"contract ClausNftStaking"},{"name":"extensions_","type":"address","internalType":"contract TradeExtensionHost"}],"stateMutability":"nonpayable"},{"name":"BatchOutputTooLow","type":"error","inputs":[]},{"name":"ECDSAInvalidSignature","type":"error","inputs":[]},{"name":"ECDSAInvalidSignatureLength","type":"error","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"name":"ECDSAInvalidSignatureS","type":"error","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"InsufficientBuybackGas","type":"error","inputs":[]},{"name":"InsufficientObservationGas","type":"error","inputs":[]},{"name":"InvalidActivation","type":"error","inputs":[]},{"name":"InvalidBatch","type":"error","inputs":[]},{"name":"InvalidBoostActivation","type":"error","inputs":[]},{"name":"InvalidContext","type":"error","inputs":[]},{"name":"InvalidFeeClaim","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"InvalidLpRewards","type":"error","inputs":[]},{"name":"InvalidNftStaking","type":"error","inputs":[]},{"name":"InvalidPool","type":"error","inputs":[]},{"name":"InvalidPoolManager","type":"error","inputs":[]},{"name":"InvalidProcessing","type":"error","inputs":[]},{"name":"InvalidRemainderProcessor","type":"error","inputs":[]},{"name":"InvalidWeather","type":"error","inputs":[]},{"name":"InvalidWeatherSigner","type":"error","inputs":[]},{"name":"NotFeeRecipient","type":"error","inputs":[]},{"name":"NotPoolManager","type":"error","inputs":[]},{"name":"OldWeather","type":"error","inputs":[]},{"name":"OnlySelf","type":"error","inputs":[]},{"name":"PartialNativeFill","type":"error","inputs":[]},{"name":"PartialTokenOutput","type":"error","inputs":[]},{"name":"PrivacyBuyRetired","type":"error","inputs":[]},{"name":"TotalTaxExceeded","type":"error","inputs":[]},{"name":"ArenaPulse","type":"event","inputs":[{"name":"sequence","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"timestamp","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"BuybackBatchProcessed","type":"event","inputs":[{"name":"spentEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"receivedTokens","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BuybackBurn","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"spentEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burnedTokens","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pendingEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BuybackDeferred","type":"event","inputs":[],"anonymous":false},{"name":"FeeAllocation","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"projectEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"platformEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FomoBuyback","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"spentEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"sentTokens","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pendingEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FomoFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"fomoEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LiquidityAdded","type":"event","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"ethAdded","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"tokensAdded","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"buyEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LiquidityFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"liquidityEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LpRewardFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"rewardEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"epoch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NftFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"nftEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"epoch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NftStakingFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"rewardEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"epoch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PlatformFeeAllocation","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"canonicalEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"additionalEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ProjectFeeAccrued","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"exactInput","type":"bool","indexed":false,"internalType":"bool"},{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ProjectFeeSplit","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"walletEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burnEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ProjectFeesClaimed","type":"event","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardBoostActivated","type":"event","inputs":[{"name":"startsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"endsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"multiplier","type":"uint24","indexed":false,"internalType":"uint24"}],"anonymous":false},{"name":"TimedBuybackActivated","type":"event","inputs":[{"name":"startsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"endsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"windowSeconds","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"WeatherAccepted","type":"event","inputs":[{"name":"requestId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"wet","type":"bool","indexed":false,"internalType":"bool"},{"name":"observedAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"validUntil","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"ARENA_PULSE_INTERVAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"BATCH_USD","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"BURN_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"pure"},{"name":"BUYBACK_GAS_LIMIT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FOMO_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"pure"},{"name":"LIQUIDITY_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"LP_REWARDS_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"NFT_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"OBSERVATION_GAS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REWARD_BOOST_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"WALLET_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"WEATHER_MAX_AGE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activateRewardBoost","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"activateTimedBuyback","type":"function","inputs":[],"outputs":[],"stateMutability":"pure"},{"name":"afterAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"uint160","internalType":"uint160"},{"name":"","type":"int24","internalType":"int24"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct SwapParams"},{"name":"delta","type":"int256","internalType":"BalanceDelta"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int128","internalType":"int128"}],"stateMutability":"nonpayable"},{"name":"arenaState","type":"function","inputs":[],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"},{"name":"lastPulseAt","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"batchBuybacksEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"batchThresholdWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"beforeAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeInitialize","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"price","type":"uint160","internalType":"uint160"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct SwapParams"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BeforeSwapDelta"},{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"nonpayable"},{"name":"collectProjectFees","type":"function","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"ethUsdFeed","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEthUsdFeed"}],"stateMutability":"view"},{"name":"extensions","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract TradeExtensionHost"}],"stateMutability":"view"},{"name":"feeRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"fomoRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"fomoReserve","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract FomoReserve"}],"stateMutability":"view"},{"name":"implementationSelf","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"initializer","type":"address","internalType":"address"},{"name":"token","type":"address","internalType":"address"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"openingPrice","type":"uint160","internalType":"uint160"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"liquidityBatchReady","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"liquidityReserve","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract LiquidityReserve"}],"stateMutability":"view"},{"name":"lpRemainderProcessor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract LpRemainderProcessor"}],"stateMutability":"view"},{"name":"lpRewards","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IClausLpRewards"}],"stateMutability":"view"},{"name":"maximumTotalTaxPips","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"pure"},{"name":"nft","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ClausNFT"}],"stateMutability":"view"},{"name":"nftStaking","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ClausNftStaking"}],"stateMutability":"view"},{"name":"nftStakingStartsAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingBurnEth","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingFomoEth","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingLiquidityEth","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingLiquidityTokens","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"platformRevenue","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract PlatformRevenue"}],"stateMutability":"view"},{"name":"poolManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPoolManager"}],"stateMutability":"view"},{"name":"predictionOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract MarketCapOracle"}],"stateMutability":"view"},{"name":"privacyBuy","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ClausPrivacyBuy"}],"stateMutability":"view"},{"name":"processBuybacks","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"processBuybacksDuringSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"processBuybacksGuarded","type":"function","inputs":[{"name":"minimumTokensPerEth","type":"uint256","internalType":"uint256"},{"name":"maximumPendingEth","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"spentEth","type":"uint256","internalType":"uint256"},{"name":"receivedTokens","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"processLiquidity","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"processLiquidityDuringSwap","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"processLiquidityRemainder","type":"function","inputs":[{"name":"minLiquidity","type":"uint128","internalType":"uint128"},{"name":"maximumEth","type":"uint256","internalType":"uint256"},{"name":"maximumTokens","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"liquidity","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"processor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract FeeProcessor"}],"stateMutability":"view"},{"name":"projectFeeBalance","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"projectRevenue","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ProjectRevenue"}],"stateMutability":"view"},{"name":"protectionKind","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"name":"protectionVersion","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"quoteTradeFee","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"buy","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"module","type":"address","internalType":"address"},{"name":"totalPips","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"rewardBoostState","type":"function","inputs":[],"outputs":[{"name":"startsAt","type":"uint64","internalType":"uint64"},{"name":"endsAt","type":"uint64","internalType":"uint64"},{"name":"active","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"rewardMultiplier","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"submitWeather","type":"function","inputs":[{"name":"a","type":"tuple","components":[{"name":"requestId","type":"bytes32","internalType":"bytes32"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"questionHash","type":"bytes32","internalType":"bytes32"},{"name":"answerType","type":"uint8","internalType":"uint8"},{"name":"answer","type":"bytes","internalType":"bytes"},{"name":"figure","type":"uint256","internalType":"uint256"},{"name":"fromBlock","type":"uint64","internalType":"uint64"},{"name":"toBlock","type":"uint64","internalType":"uint64"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"panelJobId","type":"bytes32","internalType":"bytes32"},{"name":"panelSize","type":"uint16","internalType":"uint16"},{"name":"quorum","type":"uint16","internalType":"uint16"},{"name":"agreed","type":"uint16","internalType":"uint16"},{"name":"issuedAt","type":"uint64","internalType":"uint64"},{"name":"expiresAt","type":"uint64","internalType":"uint64"}],"internalType":"struct IMDWeather.Attestation"},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"timedBuybackState","type":"function","inputs":[],"outputs":[{"name":"startsAt","type":"uint64","internalType":"uint64"},{"name":"endsAt","type":"uint64","internalType":"uint64"},{"name":"active","type":"bool","internalType":"bool"},{"name":"availableEth","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalHookFeePips","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"unlockCallback","type":"function","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"weatherAllocationEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"weatherAttester","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"weatherBurnFeePips","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"weatherDigest","type":"function","inputs":[{"name":"a","type":"tuple","components":[{"name":"requestId","type":"bytes32","internalType":"bytes32"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"questionHash","type":"bytes32","internalType":"bytes32"},{"name":"answerType","type":"uint8","internalType":"uint8"},{"name":"answer","type":"bytes","internalType":"bytes"},{"name":"figure","type":"uint256","internalType":"uint256"},{"name":"fromBlock","type":"uint64","internalType":"uint64"},{"name":"toBlock","type":"uint64","internalType":"uint64"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"panelJobId","type":"bytes32","internalType":"bytes32"},{"name":"panelSize","type":"uint16","internalType":"uint16"},{"name":"quorum","type":"uint16","internalType":"uint16"},{"name":"agreed","type":"uint16","internalType":"uint16"},{"name":"issuedAt","type":"uint64","internalType":"uint64"},{"name":"expiresAt","type":"uint64","internalType":"uint64"}],"internalType":"struct IMDWeather.Attestation"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"weatherQuestionHash","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"weatherState","type":"function","inputs":[],"outputs":[{"name":"mode","type":"uint8","internalType":"uint8"},{"name":"observedAt","type":"uint64","internalType":"uint64"},{"name":"validUntil","type":"uint64","internalType":"uint64"},{"name":"requestId","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"components":[{"internalType":"contract IPoolManager","name":"manager","type":"address"},{"internalType":"contract ProjectRevenue","name":"project","type":"address"},{"internalType":"contract PlatformRevenue","name":"platform","type":"address"},{"internalType":"contract LiquidityReserve","name":"reserve","type":"address"},{"internalType":"contract IEthUsdFeed","name":"feed","type":"address"},{"internalType":"contract FomoReserve","name":"fomo","type":"address"},{"internalType":"address","name":"attester","type":"address"},{"internalType":"bytes32","name":"questionHash","type":"bytes32"},{"internalType":"contract FeeProcessor","name":"processor","type":"address"},{"internalType":"contract ClausNFT","name":"nft","type":"address"},{"internalType":"contract MarketCapOracle","name":"oracle","type":"address"},{"internalType":"int24","name":"spacing","type":"int24"}],"internalType":"struct FeePrivacyHook.BaseConfig","name":"base","type":"tuple"},{"internalType":"contract ClausPrivacyBuy","name":"privacyBuy_","type":"address"},{"internalType":"contract IClausLpRewards","name":"lpRewards_","type":"address"},{"internalType":"contract LpRemainderProcessor","name":"remainder_","type":"address"},{"internalType":"contract ClausNftStaking","name":"staking_","type":"address"},{"internalType":"contract TradeExtensionHost","name":"extensions_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BatchOutputTooLow","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"InsufficientBuybackGas","type":"error"},{"inputs":[],"name":"InsufficientObservationGas","type":"error"},{"inputs":[],"name":"InvalidActivation","type":"error"},{"inputs":[],"name":"InvalidBatch","type":"error"},{"inputs":[],"name":"InvalidBoostActivation","type":"error"},{"inputs":[],"name":"InvalidContext","type":"error"},{"inputs":[],"name":"InvalidFeeClaim","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidLpRewards","type":"error"},{"inputs":[],"name":"InvalidNftStaking","type":"error"},{"inputs":[],"name":"InvalidPool","type":"error"},{"inputs":[],"name":"InvalidPoolManager","type":"error"},{"inputs":[],"name":"InvalidProcessing","type":"error"},{"inputs":[],"name":"InvalidRemainderProcessor","type":"error"},{"inputs":[],"name":"InvalidWeather","type":"error"},{"inputs":[],"name":"InvalidWeatherSigner","type":"error"},{"inputs":[],"name":"NotFeeRecipient","type":"error"},{"inputs":[],"name":"NotPoolManager","type":"error"},{"inputs":[],"name":"OldWeather","type":"error"},{"inputs":[],"name":"OnlySelf","type":"error"},{"inputs":[],"name":"PartialNativeFill","type":"error"},{"inputs":[],"name":"PartialTokenOutput","type":"error"},{"inputs":[],"name":"PrivacyBuyRetired","type":"error"},{"inputs":[],"name":"TotalTaxExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"sequence","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"ArenaPulse","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"spentEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedTokens","type":"uint256"}],"name":"BuybackBatchProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pendingEth","type":"uint256"}],"name":"BuybackBurn","type":"event"},{"anonymous":false,"inputs":[],"name":"BuybackDeferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"projectEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformEth","type":"uint256"}],"name":"FeeAllocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sentTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pendingEth","type":"uint256"}],"name":"FomoBuyback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fomoEth","type":"uint256"}],"name":"FomoFeeAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"ethAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyEth","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidityEth","type":"uint256"}],"name":"LiquidityFeeAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"LpRewardFeeAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"NftFeeAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"NftStakingFeeAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"canonicalEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"additionalEth","type":"uint256"}],"name":"PlatformFeeAllocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bool","name":"exactInput","type":"bool"},{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeEth","type":"uint256"}],"name":"ProjectFeeAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"grossEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"walletEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnEth","type":"uint256"}],"name":"ProjectFeeSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProjectFeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"startsAt","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endsAt","type":"uint64"},{"indexed":false,"internalType":"uint24","name":"multiplier","type":"uint24"}],"name":"RewardBoostActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"startsAt","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endsAt","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"windowSeconds","type":"uint256"}],"name":"TimedBuybackActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"wet","type":"bool"},{"indexed":false,"internalType":"uint64","name":"observedAt","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"validUntil","type":"uint64"}],"name":"WeatherAccepted","type":"event"},{"inputs":[],"name":"ARENA_PULSE_INTERVAL","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BATCH_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_FEE_PIPS","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"BUYBACK_GAS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FOMO_FEE_PIPS","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"LIQUIDITY_FEE_PIPS","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_REWARDS_FEE_PIPS","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_FEE_PIPS","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OBSERVATION_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_BOOST_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_FEE_PIPS","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WEATHER_MAX_AGE","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WINDOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateRewardBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateTimedBuyback","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct ModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"BalanceDelta","name":"","type":"int256"},{"internalType":"BalanceDelta","name":"","type":"int256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"afterAddLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BalanceDelta","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"afterDonate","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"key","type":"tuple"},{"internalType":"uint160","name":"","type":"uint160"},{"internalType":"int24","name":"","type":"int24"}],"name":"afterInitialize","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct ModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"BalanceDelta","name":"","type":"int256"},{"internalType":"BalanceDelta","name":"","type":"int256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"afterRemoveLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BalanceDelta","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"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":"key","type":"tuple"},{"components":[{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct SwapParams","name":"params","type":"tuple"},{"internalType":"BalanceDelta","name":"delta","type":"int256"},{"internalType":"bytes","name":"hookData","type":"bytes"}],"name":"afterSwap","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arenaState","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"},{"internalType":"uint64","name":"lastPulseAt","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchBuybacksEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"batchThresholdWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct ModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeAddLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeDonate","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"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":"key","type":"tuple"},{"internalType":"uint160","name":"price","type":"uint160"}],"name":"beforeInitialize","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct ModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeRemoveLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"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":"key","type":"tuple"},{"components":[{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct SwapParams","name":"params","type":"tuple"},{"internalType":"bytes","name":"hookData","type":"bytes"}],"name":"beforeSwap","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BeforeSwapDelta","name":"","type":"int256"},{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"collectProjectFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethUsdFeed","outputs":[{"internalType":"contract IEthUsdFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extensions","outputs":[{"internalType":"contract TradeExtensionHost","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fomoRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fomoReserve","outputs":[{"internalType":"contract FomoReserve","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementationSelf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initializer","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"uint160","name":"openingPrice","type":"uint160"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityBatchReady","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityReserve","outputs":[{"internalType":"contract LiquidityReserve","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpRemainderProcessor","outputs":[{"internalType":"contract LpRemainderProcessor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpRewards","outputs":[{"internalType":"contract IClausLpRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumTotalTaxPips","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract ClausNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftStaking","outputs":[{"internalType":"contract ClausNftStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftStakingStartsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingBurnEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingFomoEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingLiquidityEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingLiquidityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformRevenue","outputs":[{"internalType":"contract PlatformRevenue","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"contract IPoolManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predictionOracle","outputs":[{"internalType":"contract MarketCapOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privacyBuy","outputs":[{"internalType":"contract ClausPrivacyBuy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processBuybacks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"processBuybacksDuringSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumTokensPerEth","type":"uint256"},{"internalType":"uint256","name":"maximumPendingEth","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"processBuybacksGuarded","outputs":[{"internalType":"uint256","name":"spentEth","type":"uint256"},{"internalType":"uint256","name":"receivedTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processLiquidityDuringSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"minLiquidity","type":"uint128"},{"internalType":"uint256","name":"maximumEth","type":"uint256"},{"internalType":"uint256","name":"maximumTokens","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"processLiquidityRemainder","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processor","outputs":[{"internalType":"contract FeeProcessor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectRevenue","outputs":[{"internalType":"contract ProjectRevenue","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protectionKind","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"protectionVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"quoteTradeFee","outputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"uint24","name":"totalPips","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardBoostState","outputs":[{"internalType":"uint64","name":"startsAt","type":"uint64"},{"internalType":"uint64","name":"endsAt","type":"uint64"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardMultiplier","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bytes32","name":"questionHash","type":"bytes32"},{"internalType":"uint8","name":"answerType","type":"uint8"},{"internalType":"bytes","name":"answer","type":"bytes"},{"internalType":"uint256","name":"figure","type":"uint256"},{"internalType":"uint64","name":"fromBlock","type":"uint64"},{"internalType":"uint64","name":"toBlock","type":"uint64"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"panelJobId","type":"bytes32"},{"internalType":"uint16","name":"panelSize","type":"uint16"},{"internalType":"uint16","name":"quorum","type":"uint16"},{"internalType":"uint16","name":"agreed","type":"uint16"},{"internalType":"uint64","name":"issuedAt","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"}],"internalType":"struct IMDWeather.Attestation","name":"a","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"submitWeather","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timedBuybackState","outputs":[{"internalType":"uint64","name":"startsAt","type":"uint64"},{"internalType":"uint64","name":"endsAt","type":"uint64"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"availableEth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHookFeePips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unlockCallback","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weatherAllocationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"weatherAttester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weatherBurnFeePips","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bytes32","name":"questionHash","type":"bytes32"},{"internalType":"uint8","name":"answerType","type":"uint8"},{"internalType":"bytes","name":"answer","type":"bytes"},{"internalType":"uint256","name":"figure","type":"uint256"},{"internalType":"uint64","name":"fromBlock","type":"uint64"},{"internalType":"uint64","name":"toBlock","type":"uint64"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"panelJobId","type":"bytes32"},{"internalType":"uint16","name":"panelSize","type":"uint16"},{"internalType":"uint16","name":"quorum","type":"uint16"},{"internalType":"uint16","name":"agreed","type":"uint16"},{"internalType":"uint64","name":"issuedAt","type":"uint64"},{"internalType":"uint64","name":"expiresAt","type":"uint64"}],"internalType":"struct IMDWeather.Attestation","name":"a","type":"tuple"}],"name":"weatherDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weatherQuestionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weatherState","outputs":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint64","name":"observedAt","type":"uint64"},{"internalType":"uint64","name":"validUntil","type":"uint64"},{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"Final inherited accounting kernel. No arbitrary or replaceable delegate target.","errors":{"ECDSAInvalidSignature()":[{"details":"The signature is invalid."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}]},"kind":"dev","methods":{"activateRewardBoost()":{"details":"Retains the historical ABI and one-shot namespace; history no longer sets any allocation."},"processBuybacksGuarded(uint256,uint256,uint256)":{"details":"Minimum tokens per ETH spent protects partial batches and newly accrued fees proportionally."},"processLiquidityRemainder(uint128,uint256,uint256,uint256)":{"details":"Only the original position owner may choose the short-lived minimum and reserve caps."},"weatherState()":{"returns":{"mode":"0 = fallback, 1 = dry, 2 = rain."}}},"version":1},"userdoc":{"kind":"user","methods":{"processBuybacksGuarded(uint256,uint256,uint256)":{"notice":"Anyone may pay gas, but cannot select recipients, change allocations or withdraw funds."},"processLiquidity()":{"notice":"Fixed-destination processing; callers cannot withdraw or redirect reserves."},"processLiquidityRemainder(uint128,uint256,uint256,uint256)":{"notice":"Finish old auto-LP reserves into their original position, even below its old batch threshold."},"quoteTradeFee(address,bool,int256,bytes)":{"notice":"Quote depends on the current program and trade data; default rate alone is not a quote."},"submitWeather((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)":{"notice":"Anyone may relay a valid answer for this exact consumer and question."},"timedBuybackState()":{"notice":"Linear release of the reserve over eight hours from the latest fee top-up. New fees extend the unvested stream; skipped batches keep their vested allowance. After twelve hours the previous ordinary processor resumes automatically."}},"notice":"Protected settlement core with replaceable fee and product programs.","version":1}},"settings":{"compilationTarget":{"src/ProtectedHook.sol":"ProtectedHook"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[":@openzeppelin/contracts-upgradeable/=../../../lib/openzeppelin-contracts-upgradeable/contracts/",":@openzeppelin/contracts/=../../../lib/openzeppelin-contracts/contracts/",":@uniswap/v4-core/=../../../lib/v4-periphery/lib/v4-core/",":@uniswap/v4-periphery/=../../../lib/v4-periphery/",":forge-std/=../../../lib/forge-std/src/",":permit2/=../../../lib/v4-periphery/lib/permit2/",":solmate/=../../../lib/v4-periphery/lib/v4-core/lib/solmate/"],"viaIR":true},"sources":{"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","license":"MIT","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"]},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","license":"MIT","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"]},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","license":"MIT","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"]},"../../../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998","license":"MIT","urls":["bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c","dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f","license":"MIT","urls":["bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e","dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098","license":"MIT","urls":["bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0","dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol":{"keccak256":"0xf6bb0dc431a9c50e25756412ec14cfcd4dc61dd40b8dc0e1b58ec09fce6d5564","license":"MIT","urls":["bzz-raw://eb87fef7e8ed754b8600cd5d42e4f23128059006368ffd19e4d50cc166471ee5","dweb:/ipfs/Qmc1vy1cevKreGUsG7S79gyhNvDtPnNz9qG47eYVHmMKLs"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"keccak256":"0xf78f05f3b8c9f75570e85300d7b4600d7f6f6a198449273f31d44c1641adb46f","license":"MIT","urls":["bzz-raw://e28b872613b45e0e801d4995aa4380be2531147bfe2d85c1d6275f1de514fba3","dweb:/ipfs/QmeeFcfShHYaS3BdgVj78nxR28ZaVUwbvr66ud8bT6kzw9"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol":{"keccak256":"0x88cd5e3bee2e8c36b8d9058fbcaa81ad5704281b25634122234b55ea853d8055","license":"MIT","urls":["bzz-raw://8dc7e7ab5b8ea36c15027ab04221b05d1c970f47a53e9fd47ead8ca665d49c7e","dweb:/ipfs/Qmeeph7fsDyfRr8vb2L8KcDEmKPb224TAayMvgqgGAnqpL"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"keccak256":"0xf46268c37522320bb2119a5a394bc5c739a95c0c574c8d08e8c643f4d06e5c76","license":"MIT","urls":["bzz-raw://517e4b295f35b9947c72ad7379a6089439ece7bb6f4a2ea0a159da13046c039e","dweb:/ipfs/QmZXzkSfLUbvujig3zVbpDHykpHhqLpvQtdiN3B5j4TA3u"]},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol":{"keccak256":"0xc7efbc23214ad7dced8bf2249460f4bda114d57f6a0079f84040654280f455bd","license":"MIT","urls":["bzz-raw://1f5bd44efca8c8c0d74439e7b808d1f9c4af1df78f91fef8e8bbca8104645435","dweb:/ipfs/Qmb42XSd8MKsEitp42sZkSFGqDRigk6QgGXtiJyJqUZJJ6"]},"../../../lib/openzeppelin-contracts/contracts/utils/Base64.sol":{"keccak256":"0xe802369c4d2d254590d371eca16c8d247d7e0782ad2faaaa0180159ea8e736af","license":"MIT","urls":["bzz-raw://3afb5bedd76d842847c730499c3acc9c28e91ac981bb95467671118ec0c7cdc8","dweb:/ipfs/QmWzjmjvZPJEvNTiN22V3E9hQ2JnGeZgYfhFjqGMPMcSNH"]},"../../../lib/openzeppelin-contracts/contracts/utils/Bytes.sol":{"keccak256":"0xf80e4b96b6849936ea0fabd76cf81b13d7276295fddb1e1c07afb3ddf650b0ac","license":"MIT","urls":["bzz-raw://6430007255ac11c6e9c4331a418f3af52ff66fbbae959f645301d025b20aeb08","dweb:/ipfs/QmQE5fjmBBRw9ndnzJuC2uskYss1gbaR7JdazoCf1FGoBj"]},"../../../lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"../../../lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","license":"MIT","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"]},"../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0xa516cbf1c7d15d3517c2d668601ce016c54395bf5171918a14e2686977465f53","license":"MIT","urls":["bzz-raw://1e1d079e8edfb58efd23a311e315a4807b01b5d1cf153f8fa2d0608b9dec3e99","dweb:/ipfs/QmTBExeX2SDTkn5xbk5ssbYSx7VqRp9H4Ux1CY4uQM4b9N"]},"../../../lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","license":"MIT","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"]},"../../../lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0x1fdc2de9585ab0f1c417f02a873a2b6343cd64bb7ffec6b00ffa11a4a158d9e8","license":"MIT","urls":["bzz-raw://1ab223a3d969c6cd7610049431dd42740960c477e45878f5d8b54411f7a32bdc","dweb:/ipfs/QmWumhjvhpKcwx3vDPQninsNVTc3BGvqaihkQakFkQYpaS"]},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","license":"MIT","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"]},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0x6d8579873b9650426bfbd2a754092d1725049ca05e4e3c8c2c82dd9f3453129d","license":"MIT","urls":["bzz-raw://1fa3127a8968d55096d37124a9e212013af112affa5e30b84a1d22263c31576c","dweb:/ipfs/QmetxaVcn5Q6nkpF9yXzaxPQ7d3rgrhV13sTH9BgiuzGJL"]},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","license":"MIT","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"]},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"../../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857","license":"MIT","urls":["bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5","dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y"]},"../../../lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083","license":"MIT","urls":["bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9","dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif"]},"../../../lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","license":"MIT","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"]},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sol":{"keccak256":"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29","license":"MIT","urls":["bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0","dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN"]},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sol":{"keccak256":"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138","license":"MIT","urls":["bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72","dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExtsload.sol":{"keccak256":"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43","license":"MIT","urls":["bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1","dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExttload.sol":{"keccak256":"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937","license":"MIT","urls":["bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8","dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IHooks.sol":{"keccak256":"0xc131ffa2d04c10a012fe715fe2c115811526b7ea34285cf0a04ce7ce8320da8d","license":"MIT","urls":["bzz-raw://3b212358897db5d99c21244d88f97b2e788527552cb430629b472a8cc6289aec","dweb:/ipfs/QmQtwV4dDe2RYk2ErLpaAX7U82jWh1L6Lw2HRuKDvBi84G"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IPoolManager.sol":{"keccak256":"0xbdab3544da3d32dfdf7457baa94e17d5a3012952428559e013ffac45d067038e","license":"MIT","urls":["bzz-raw://ce95ff864468e37c76adf71df061d4f3d6f3a5ec1f9bc3aea090463bc72798f4","dweb:/ipfs/QmSbWh1pLbz51yQF4HEu5NRhr8XVv9JYGEw1hq1HudAnCi"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IProtocolFees.sol":{"keccak256":"0x32a666e588a2f66334430357bb1e2424fe7eebeb98a3364b1dd16eb6ccca9848","license":"MIT","urls":["bzz-raw://85751d302125881f72e5f8af051c2d5d9b1f606ebaea8ca7d04fccdd27cc252d","dweb:/ipfs/QmeRwomeh9NWm6A6fgNA4KZPQZHPpdKsPQyYsHSFmvud7J"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"keccak256":"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719","license":"MIT","urls":["bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b","dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"keccak256":"0xeccadf1bf69ba2eb51f2fe4fa511bc7bb05bbd6b9f9a3cb8e5d83d9582613e0f","license":"MIT","urls":["bzz-raw://118757369892687b99ef46ce28d6861f62c098285bd7687a4f17f7e44e5f81de","dweb:/ipfs/QmUxqbYqQtcEwwFbb9e6BBMePEaSgN8C45v6RKubD4ib8d"]},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"keccak256":"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48","license":"MIT","urls":["bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f","dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/BitMath.sol":{"keccak256":"0x51b9be4f5c4fd3e80cbc9631a65244a2eb2be250b6b7f128a2035080e18aee8d","license":"MIT","urls":["bzz-raw://fe98bbd5498e912146b9319827fc63621eb66ff55d5baae0fa02a7a972ab8d1e","dweb:/ipfs/QmY5hCuyrtgsJtk4AavrxcvBkRrChfr4N6ZnhdC8roPpNi"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CurrencyReserves.sol":{"keccak256":"0x1576616129933fcdf3b684cea33cffd9c95e18fafbd2832a8c48ac3d8526d4c3","license":"BUSL-1.1","urls":["bzz-raw://33b050efb9b81803b18f562271e7cca2ec5362c4d505860d6419b4a345636725","dweb:/ipfs/QmQtFtTwKZ5pFVGD2ENDUXvp7ECFvzqeCuJ1miJcUHdmiX"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CustomRevert.sol":{"keccak256":"0x111ed3031b6990c80a93ae35dde6b6ac0b7e6af471388fdd7461e91edda9b7de","license":"MIT","urls":["bzz-raw://c9ea883c98d6ae1829160d0977bb5195761cfd5bc81692d0a941f45717f594cd","dweb:/ipfs/QmZPwxzaeMNv536wzrAMrMswu7vMHuqPVpjcqL3YvCMoxt"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint128.sol":{"keccak256":"0xad236e10853f4b4b20a35a9bb52b857c4fc79874846b7e444e06ead7f2630542","license":"MIT","urls":["bzz-raw://0de1f9a06520b1a689660943faa14fc0b8344ab41fab9e6012ea34bff4b9b3eb","dweb:/ipfs/QmRNMPTyko7W6d6KxuTsnDBa9oZgDK4xiwRRq3H9ASTbwy"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint96.sol":{"keccak256":"0xef5c3fd41aee26bb12aa1c32873cfee88e67eddfe7c2b32283786265ac669741","license":"MIT","urls":["bzz-raw://4de298d02f662a1c36c7be0a150f18c2a161408a5d3e48432e707efd01fac9a4","dweb:/ipfs/QmSiM4oeMmLVKmAtJXz2feYkv4R9ZcyBpkTRW5Nhw5KDyJ"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FullMath.sol":{"keccak256":"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2","license":"MIT","urls":["bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52","dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LPFeeLibrary.sol":{"keccak256":"0xbf6914e01014e7c1044111feb7df7a3d96bb503b3da827ad8464b1955580d13b","license":"MIT","urls":["bzz-raw://33823c20a91882c9aacdcbb02f0558c05209f4d5954aa6dd4fa17c95664db475","dweb:/ipfs/QmR7owkFgpfztpp1QUg3ut3nw9iPVQqLGP4hzgmZtRUQ2J"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LiquidityMath.sol":{"keccak256":"0x000ef2eadcc1eb7b2c18a77655f94e76e0e860f605783484657ef65fd6eda353","license":"MIT","urls":["bzz-raw://a766b620a7a22798b43c6c1f23b5c6cff0ebf588deb89842bad05208d448cd99","dweb:/ipfs/QmVKjaFJdzkqA3ey2Byum8iTCMssWVD8MmVC8rw62Tj5WD"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Lock.sol":{"keccak256":"0x9338be4b5695f1da5f3d3f7a3eeaf7a356c1045458289586ac0cbe9cef77c6d5","license":"BUSL-1.1","urls":["bzz-raw://485ec42ed6155469d612a9a0c18068ebfbad74448792a338a435503de3ef1b2c","dweb:/ipfs/QmVnnv5u74MYatfRmBgrcfFYQcsMAJMG9jQ6ju8UiydKNF"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/NonzeroDeltaCount.sol":{"keccak256":"0x0666ebd5d3528d7d52c48538296367a4cff97a578cf13365c51983fae3219b87","license":"BUSL-1.1","urls":["bzz-raw://d27f1be3bd09d85c53d3e6a539dd6529ddd8b2b764ccb47fd7765fc81f9add59","dweb:/ipfs/QmQdZujNXhKEXQBkKtF5jbdvo1yXMqPDUoBBaF9S5u3Kpm"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Position.sol":{"keccak256":"0xddab2a831f1befb6abf5567e77c4582169ca8156cf69eb4f22d8e87f7226a3f9","license":"BUSL-1.1","urls":["bzz-raw://c79fe61b50f3b70cff503abfa6f5643fcbefb9b794855bee1019b1e6d9c083b2","dweb:/ipfs/QmbKmYNQesaMz8bo1b7TMHQcAwaDd3eDPrE5pAdPPZTtk5"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SafeCast.sol":{"keccak256":"0x42c4a24f996a14d358be397b71f7ec9d7daf666aaec78002c63315a6ee67aa86","license":"MIT","urls":["bzz-raw://c3db86e2ba3679105fc32edec656c70282e1fede6cab11217702443f6c26fa59","dweb:/ipfs/QmX4yaaSPdKQzYNRsezjTvZKsubzS8JRTEGFD3fPpTTCcj"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SqrtPriceMath.sol":{"keccak256":"0xf8079fe6e3460db495451d06b1705e18f1c4075c1af96a31ad313545f7082982","license":"MIT","urls":["bzz-raw://582fc51546723a0a8acccf782f69b530bacf9b3ef929458e82569b7121f0b138","dweb:/ipfs/QmSBXcmqZdFsM7M4sRaiyQAxykCeMNFKyKgBcwSMTw1bcF"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/StateLibrary.sol":{"keccak256":"0x96db333ee126a841dd959e38e452cc59d73583cb0437a1d48b2052e33a74f952","license":"MIT","urls":["bzz-raw://8672bba1eb69608299b0904f4ff305238eb18479d371c26518f278c9ee184cd0","dweb:/ipfs/QmTLu3s6ECvsEDHStQv8HTVHYtvkviBbdjPrFJd4SpVRFY"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TickMath.sol":{"keccak256":"0x4e1a11e154eb06106cb1c4598f06cca5f5ca16eaa33494ba2f0e74981123eca8","license":"MIT","urls":["bzz-raw://a79a57f7b240783b045168d1c4f774ac1812caf8f9a83cb6959a86b0b07b6c70","dweb:/ipfs/QmTb5kvxwDNW8jDuQaqdJ445cCFejNkUqEB17Bjo8UBiva"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TransientStateLibrary.sol":{"keccak256":"0x7d1e0875747bd89b32c25f1a48da2766e5f4aff1f671ad5f3c0c07ebbbcb946a","license":"MIT","urls":["bzz-raw://d76cfeb1cb60595b41ecc51c8a12fb4bf63a7fc733d0b1a2e3adb55abeb1f9d5","dweb:/ipfs/Qmb8oX7DtsRpw3tTtdWZwGhauj1evq43d3PLwe4nSDAKkV"]},"../../../lib/v4-periphery/lib/v4-core/src/libraries/UnsafeMath.sol":{"keccak256":"0xa6e55e0a43a15df2df471d9972cd48f613d07c663ecb8bbeaf7623f6f99bcce4","license":"MIT","urls":["bzz-raw://02ea6e13879fc5a5f35149a2f1cd8af3a1f0877ff69101dad53841d16f515572","dweb:/ipfs/QmcpL4gdG6hL2w1wqs2Vw4J1EFCwBs9T1Qd4p16CtECQkn"]},"../../../lib/v4-periphery/lib/v4-core/src/types/BalanceDelta.sol":{"keccak256":"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f","license":"MIT","urls":["bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9","dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H"]},"../../../lib/v4-periphery/lib/v4-core/src/types/BeforeSwapDelta.sol":{"keccak256":"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78","license":"MIT","urls":["bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782","dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K"]},"../../../lib/v4-periphery/lib/v4-core/src/types/Currency.sol":{"keccak256":"0x4a0b84b282577ff6f8acf13ec9f4d32dbb9348748b49611d00e68bee96609c93","license":"MIT","urls":["bzz-raw://45f9d62ab3d51b52957279e353853ba1547c3182c9a1e3d1846ada4a90263b01","dweb:/ipfs/QmS8NG84ccQS1yXVD8cv3eKX7J1UKxuJhbUfHTQR2opKF5"]},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolId.sol":{"keccak256":"0x308311916ea0f5c2fd878b6a2751eb223d170a69e33f601fae56dfe3c5d392af","license":"MIT","urls":["bzz-raw://669c2cd7ac17690b5d8831e0bda72822376c3a04b36afed6d31df4d75fe60918","dweb:/ipfs/QmT6EpkxqU8VF3WsgrZ66F3s1cCQRffR95z1HDYZz7ph6y"]},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolKey.sol":{"keccak256":"0xf89856e0580d7a4856d3187a76858377ccee9d59702d230c338d84388221b786","license":"MIT","urls":["bzz-raw://6f3118fa189025695c37fdf0bdd1190f085ad097484d3c88cf4c56d1db65f639","dweb:/ipfs/QmamXpgtB8GV1CaFLvqefPWSoikLDhMk1yU4heBnVzU8gi"]},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolOperation.sol":{"keccak256":"0x7a1a107fc1f2208abb2c9364c8c54e56e98dca27673e9441bed2b949b6382162","license":"MIT","urls":["bzz-raw://4ad2470383bc5595d5af17840c64971f457adac68895a4db41ba5c71a4478e07","dweb:/ipfs/QmdwKhBHDZFuqXrR2BfDBD9r7rB2ULGQBznsajRTkTmL4c"]},"../../../lib/v4-periphery/src/interfaces/IEIP712_v4.sol":{"keccak256":"0xd7f7115476e307a0bfc32a0f0a0f5434e9e5ca62a6c5af1e18b75e48161bb408","license":"MIT","urls":["bzz-raw://b1600b953556da38a7adc5ad2a2925ec5fb138fecf8eec48743646543195b736","dweb:/ipfs/QmarZi2aiLVAfHXgnDWV1cCFiZk2DdPW7KJnWHqzuRChJR"]},"../../../lib/v4-periphery/src/interfaces/IERC721Permit_v4.sol":{"keccak256":"0x103adbba724ef536abc536fe8a4d7dc12880724c562109b69f2adce4a91fa017","license":"MIT","urls":["bzz-raw://06f51b5a5a218e0bc866a83e7821be53c9db9de0ca921f16abd3d13ea0eab69d","dweb:/ipfs/QmbnhLy992hpQZyphTkj7fpr6jKKVva2AzfmLiDZEuqHAk"]},"../../../lib/v4-periphery/src/interfaces/IImmutableState.sol":{"keccak256":"0x36ab3100e87457ecf04887f4f540e34fd7f21d8e3b83880cb679239e60b7b06b","license":"MIT","urls":["bzz-raw://7f290c7ce8e4832608d637a51b13dff95abecf6549485448e647a11c8ed01341","dweb:/ipfs/QmfD1R6mTp8j4EjQXmQZW3vCh11EYFjnvoaw8rXRP27mMq"]},"../../../lib/v4-periphery/src/interfaces/IMulticall_v4.sol":{"keccak256":"0x336bec303f7ff86497d2679464c5adad5040f412b3d0769ce5e1d2a42f7e2c08","license":"MIT","urls":["bzz-raw://7734f047d98d331c8abc51ad9f358ceee0a6dcae8d89ac49084b84de0d2d42e7","dweb:/ipfs/QmWij2h7mU36LsXhb9P6pkYXrSCua4ixeWaVFSrsEcEmPQ"]},"../../../lib/v4-periphery/src/interfaces/INotifier.sol":{"keccak256":"0xfdc5187a98240a1691aae98b7dd2444d4c2bfb4746f3c34de9f3d18399c17c5e","license":"MIT","urls":["bzz-raw://683af56401ec4f8817e8dfe150e7b3febaf0baaf40efe8d0d0475f735275f746","dweb:/ipfs/QmRQ6S3nFnSc2jjDcQTvUJdTf4xKPojmvCkpvgyr6qTuVV"]},"../../../lib/v4-periphery/src/interfaces/IPermit2Forwarder.sol":{"keccak256":"0xfad472937280e861125ff12aa6f9c2cf7440fbb20a2cc29485c24662ad4279c5","license":"MIT","urls":["bzz-raw://31bfbc331f5972fc373d9469fd1ca1d14818db3275f21b7b590f20820cb4439d","dweb:/ipfs/QmX3Bv9wfYpAFZKBcxKsQSXUrSC8mqNBdzh6XVMS72aNx9"]},"../../../lib/v4-periphery/src/interfaces/IPoolInitializer_v4.sol":{"keccak256":"0x2e4feda94650a2642039e0309ffdec480ee050bc40864bf5e1dba42bb4dc9e98","license":"MIT","urls":["bzz-raw://964c178b4da8bab9ef898b94bb26d7c17cc44c5cf20485f55dcf5e9c7e1b1d92","dweb:/ipfs/QmVd2c3SYteyr5xZgUS4sDAiZF43dLwVAEKdCfvQbkZpRJ"]},"../../../lib/v4-periphery/src/interfaces/IPositionManager.sol":{"keccak256":"0x4ee45da4de6eada7f85c3e167ed3b3957a8591b2ebc195da5c9fbd9669223de3","license":"MIT","urls":["bzz-raw://a604665c0c9e4a8b7b09a0b93c9c00e2f98322f9b5b5288553837dfba2c80648","dweb:/ipfs/QmYZ2DLw98PMobepsjUzT8y9sFXL7a8nXzCGgpeu3FYBgx"]},"../../../lib/v4-periphery/src/interfaces/ISubscriber.sol":{"keccak256":"0x34ceadec4a63019680e543fe73197f198a55c825d86e18f327840354760b57e7","license":"MIT","urls":["bzz-raw://31734feafe1fe162a0702ddf862fcc3bd97505931afb3c685033c0185d898051","dweb:/ipfs/QmQEANYVyaXTNzXKcjUVfPhLU71Bix5vxQH75BpPWMkWgw"]},"../../../lib/v4-periphery/src/interfaces/IUnorderedNonce.sol":{"keccak256":"0xd7f32fee74dc7d1a3b078ca1263961baccaa6bf434c79e8fe0e092e30c3e0ec3","license":"MIT","urls":["bzz-raw://e7d1e92d89d5f49c84aa82f3b259678c2c97a4473b22d753ca4411a6b0cec36d","dweb:/ipfs/QmNZoQyminStaAdaLqoDLoWaBU5QWrWjXFjmBm4aFhzL8i"]},"../../../lib/v4-periphery/src/libraries/Actions.sol":{"keccak256":"0x603e8587a13213dab422d14efdbce3a5cbefbca6aff62820c1959645147073fe","license":"MIT","urls":["bzz-raw://9c651fcb6764d0437c9685f323e5372dc50ca5a3e92429fd25221e94bfc243f4","dweb:/ipfs/QmXoNCDGghiW3tQMzGNGGSi2aaAE63aTjup92P6FRviYTh"]},"../../../lib/v4-periphery/src/libraries/LiquidityAmounts.sol":{"keccak256":"0xc1ed6daa98eee0330327cf8b98ded5172f904a0db107258f9ce571144803773d","license":"MIT","urls":["bzz-raw://32285a7dd49dbc48e89157e6d064fbbe292de673baf7b00776f2d86fb8484e00","dweb:/ipfs/QmQLmrc9KrTofxYzgmpqKfXEY351RzQAVKs1t3HTVWQdP5"]},"../../../lib/v4-periphery/src/libraries/PositionInfoLibrary.sol":{"keccak256":"0xcc0b58aad30f51783d24f73a74064c1e488030fdb5e359bf435813034517c784","license":"MIT","urls":["bzz-raw://4b7c493f68c12cc41c5e51be2833f997b09c2f011e2c1566cc8808ce4613714c","dweb:/ipfs/QmbVJ7YNzTkAHkp9Ds4t5xboHk916zQx9uysWYvphLSSBp"]},"src/ClausFeeBudget.sol":{"keccak256":"0xc70f0572daceb8aeba812f2020ff4853b3026b89a291bb49cf426c8560ec2627","license":"MIT","urls":["bzz-raw://09f1922cacd0b162fda870594c589c0484085569a4cd8da585899b448bf50637","dweb:/ipfs/QmUvLHZ5xMcpgomdyreH1DPpH4U6VQWzRDHjNCrjGfz2mp"]},"src/ProtectedHook.sol":{"keccak256":"0x3ee7f6eeef1c531869e9a26bc5864f691c3b76292dca7f24cdd81ee4cac5c953","license":"MIT","urls":["bzz-raw://7cc0105ce0dac0d34d18348f43b047a52f033d2e76e0b90bf0599d1282ce8837","dweb:/ipfs/QmZ3Z1kpQTLQQZEbUuZ9gckBSfP4CNPusDPk2fqfNRV6Lk"]},"src/TradeExtensionHost.sol":{"keccak256":"0xd86041554ad6e00a6d4a92fe869a0e3c86940e8b1a31922cb0aacb53d6230299","license":"MIT","urls":["bzz-raw://35d0b791b05d1b6d716f0bc9fce42f41e264876bb9add360cb1f7be6b78d61f7","dweb:/ipfs/QmRk9qCzaui2AACfJxc4LPAuXgiY5FktQcASBoaBcEHu2F"]},"src/legacy/ArenaTide.sol":{"keccak256":"0xcfceaa052aaccb310edfa5db8255773cfcc12d6cbf2727f4c773cd2b199ff170","license":"MIT","urls":["bzz-raw://f26c09112e410c6f1afb6f303e46ee5ac5a65b34d766c30dad61bdfc14e4c25d","dweb:/ipfs/QmR5cLkASJ3f23J5qNR6KTbLVXnzn1qbcLgaxe4rpMeopy"]},"src/legacy/ClausArt.sol":{"keccak256":"0x403c313e26169a325279b7dcc4cec66711c08c0b609ffa942bdd42a0aa410c47","license":"MIT","urls":["bzz-raw://9a6ca36cb91ed6d2403fb8838f074545251093e74a54f81bed954d1269aaa613","dweb:/ipfs/QmZoP4FKPhtT3KdGHeZqVSQsiTSVmNFfPg1r225zCvhXT1"]},"src/legacy/ClausNFT.sol":{"keccak256":"0xec981e6c79bf9b662c132711ae70f1e7dc7daf15ddcbda2202cf172c4a8fedaa","license":"MIT","urls":["bzz-raw://214fd9ebf766ff4d42de143972ef285483346b9b32dc1e8b22de3e402d448537","dweb:/ipfs/QmQi9eZuNNMhEG2ABZyjPwKSQcE9L4wJUVWGgQmEoiznYc"]},"src/legacy/ClausNftStaking.sol":{"keccak256":"0x4357a4ccdfaf0d703c286605f4580efa51998d277b0a9335abdf90c2927140d5","license":"MIT","urls":["bzz-raw://72e736fd549354c0c6b28f411b2912ff476dfaea338799a81af59f8e42e44a07","dweb:/ipfs/QmansqkizyjV2Y3jTPuD7hq6owg8nzuVmt2uirSDB7YCqq"]},"src/legacy/FeeCalls.sol":{"keccak256":"0xa0e1cfcb3f07ac5f7c544166bca1f075d2040e478178049663ebd8ef2a2a348b","license":"MIT","urls":["bzz-raw://ed95ee22fd6a3cd5d28ca2b385afe681da6b5a2bc0c939a7ccd5b0433874e7a0","dweb:/ipfs/QmVmiFGLD2NjZocRArBcFZweFfwQotbnpC7tbwvmQDWPoE"]},"src/legacy/FeeEfficientHook.sol":{"keccak256":"0x83e8278e27361ff8c7bf8813c7e9e986a96c6ba23b137da18f15398bf1f8d51d","license":"MIT","urls":["bzz-raw://f414539e80dbfa223dd338c5409b9919007cf5f1cf5b1619743e6fc7fd4067d7","dweb:/ipfs/QmWcyaQmoRGQrrLtbMBmhUKj8KQckRmoueBRYF9WUxmfkF"]},"src/legacy/FeeMath.sol":{"keccak256":"0x4f53cf323be5a05dc41eb70e7c3e3ad6afa5b5b0e689b7c40beb615a3ee0f243","license":"MIT","urls":["bzz-raw://3bdde35900316d4b4d292a95375bb62ac44e2b0bc8cdd509cc4b80d203be02d5","dweb:/ipfs/Qmd2YbBQikW4CVvagrad3B7wfGvY1r8FKmEQyt6aq3JbKy"]},"src/legacy/FeeNftHook.sol":{"keccak256":"0x4b6a5e0ffc39f3a9d6d8c54a37e5fec11beb60f485f4b66da98e794c4d173141","license":"MIT","urls":["bzz-raw://feda53ed2917f429df6372c421cf383b0a8e8fa3a5b925f661c455f4cbeacbe0","dweb:/ipfs/QmNpUaURFr8VsPb8Kwn7CtG5atTwLq3WdCDg8rLVURJJiN"]},"src/legacy/FeePredictionHook.sol":{"keccak256":"0xfc5927b85c620f9ab1082f3fae5094f3ce8ea4fb03fcc72e076de2a9ed7ab5ae","license":"MIT","urls":["bzz-raw://d668bf8109a0bb27840cdc3aa989d83d834b3b5ba0c9538314fcb88b7234220a","dweb:/ipfs/QmVC5QcPz8ShPKCypgR4dNTAMFfsf69SerDXbrpSVokV5Y"]},"src/legacy/FeeProcessor.sol":{"keccak256":"0x311ed4c7d9b59c8ee2763ac6caddc1c3799415d81625bd4d73f5fb004455f4c9","license":"MIT","urls":["bzz-raw://a4d0575882f68e2f0b87471a444f6abee19e00fb51ab0e1c279cd604741866b5","dweb:/ipfs/QmbcYfJ1cBWeaBoD4KyGgyZ8PphyzFnPemkUAHayR5V8bV"]},"src/legacy/FomoReserve.sol":{"keccak256":"0x786d12d96acd386b5575d397b71a4bf8edb5ba8b98e761b0e1a5bd2861a6a8ac","license":"MIT","urls":["bzz-raw://63480ccdf3342d1f1b1828a9c164dd3cad63ac2251111bb7bb4f49115de6f396","dweb:/ipfs/Qmdwz2LGF7eF5kcucrQS6ztWLRcA3KHDzvprWS5vnvi77Y"]},"src/legacy/HookBase.sol":{"keccak256":"0xf0d35f294c24a6dceca7a2c9bab3bcbc29af608b8e382af39bb4295013243fa1","license":"MIT","urls":["bzz-raw://da0421b525a52bb5a63a8c63560435db9fb9a0ae899c4cd7d234aef6b02a2412","dweb:/ipfs/QmUyLjUFMeNddwagFbGJDGvUZuc2SQ6D4ZEgG7rBmkMqRQ"]},"src/legacy/IMDWeather.sol":{"keccak256":"0x324eb69a66a925a07cd308ccb90f06033f0f0042cc2ce4dfb2ece86105a7fc72","license":"MIT","urls":["bzz-raw://b924f601b66a64b4c4416729038d95f3f3be7b64c686580055932d4ba5479a6e","dweb:/ipfs/QmPD6YwYmRtqEP1MjnbyqojdZiNLFe3TLhLFSAoUy2mBjE"]},"src/legacy/LiquidityReserve.sol":{"keccak256":"0xea76e34d7e9efe2da87a30f49014138ef7859e3bf771263b0fa67c24f617d822","license":"MIT","urls":["bzz-raw://82b66c8a76cc22733bf4e50aa04dfdde1cc31bc10c3a4e52d2640abfe5205252","dweb:/ipfs/QmPpqjua2Uf6xfZZfSmtGdvmPtRhF6Ktdut3EyDSg6YFx4"]},"src/legacy/LpRemainderProcessor.sol":{"keccak256":"0x81b4a27c77eeae75de7e44e8220b8fd821d17cbb14a4dd168caac2c2648b38c9","license":"MIT","urls":["bzz-raw://7d7e0234d2c5e8a03389bd150e0d9758efd5973ef19126c1432ef6444567e459","dweb:/ipfs/QmPKJ2DCPJ78A7Ac1mGV7WsDW3HSP619Yj9WsNuCdnjwUG"]},"src/legacy/MarketCapOracle.sol":{"keccak256":"0x57e448efa8277b2a35031303ac79f49c8f80e101524cacf300309c0dfebe11a5","license":"MIT","urls":["bzz-raw://01fa8896f1041915e4f0927aa334a3006aae6d6718a1ecc2952e4ab21326d8ae","dweb:/ipfs/QmX3StqC3ytVYnpQnsEb9N7TjkQJhb4LrVShfDGYRnxu2G"]},"src/legacy/NftRewards.sol":{"keccak256":"0x351663c2c9180347891ac22842240ff4264f0a1dcae8fe8968cd54079f4b0eab","license":"MIT","urls":["bzz-raw://5acd6e22c5c4cd621355b66bdb2c90f76ae4932dc8bc770d7aadc47482fa1e7d","dweb:/ipfs/QmWV9vUBqt9zyQTE64mhoNTh1FMaKwh19eJVnKCzNXet2N"]},"src/legacy/PlatformRevenue.sol":{"keccak256":"0x2aaa84fb314b61b0c7fbe8474dc874170ed0f92314bdb6bbef3b5f81469e312b","license":"MIT","urls":["bzz-raw://4947ff13d6d906a3443f60dedd8687fbb5fbd758bb17905f0bb26b892f7be7ed","dweb:/ipfs/QmY4ak6Q7aS1huDnZLMY974J8WSQJMV6oqsiYhiudcpcew"]},"src/legacy/PoolCapSource.sol":{"keccak256":"0x8d1c00140577d94ec903ef30682b73cad9179c1519590eccda15c3cbade78456","license":"MIT","urls":["bzz-raw://90b165830b9840a23ba871e0b757be4398aa00f2ec3a94521e801ea224c82af8","dweb:/ipfs/QmVzDDuPJx47STYvkesGjxfssfZjRrSWRLHgE8MJrvwFbA"]},"src/legacy/ProjectRevenue.sol":{"keccak256":"0x5f4d6fab31d0d212e4546fcde1fb0c8e7f22dc85c6cf69333db83eb7e788741a","license":"MIT","urls":["bzz-raw://6a2e8f4589f244af48f16e8ed2ed77dcf649b2cabe706ecde4e48be695dcf6cd","dweb:/ipfs/QmXDnHRmGNbY9H8nszoNWrpRjDWyJyGvbidRBBFvBi7jJB"]},"src/legacy/privacy/ClausPrivacyBuy.sol":{"keccak256":"0x79cf86cd0b6510d72343ec86d378f997e3d2e88b29c81a06e5679f96e83087ac","license":"MIT","urls":["bzz-raw://ffc62c6b65f29189fdf1a6c3eb1ff2427e1b1ca098c9ed252e40ed6cd8cee131","dweb:/ipfs/QmdTwZTycAt5hmp6TZ8Epvp6QUUGoQan3gYtiNG9xfqbF7"]},"src/legacy/privacy/FeeBatchedPrivacyHook.sol":{"keccak256":"0xf98f4e86a2dd640081418323d89c1cf1cf3564a2bd9d15eb73c250d85eb287fb","license":"MIT","urls":["bzz-raw://733f12fae778943ee223fb864c53a90fa52295062374f79f4b26882750b6975f","dweb:/ipfs/Qme5G4FJeGS1TgmCcoWzmKFbkA7Vn3AFKn2Bz5n6w646Vt"]},"src/legacy/privacy/FeeLpRewardsHook.sol":{"keccak256":"0x6ce3128863bd4b05db02fee1f4e1d315548e5d8de76fa29ded443ff60e5facb2","license":"MIT","urls":["bzz-raw://493feafb1e378ac44efb0deea52a56a153533d69c920a32385a4b1b6dbcd01ba","dweb:/ipfs/QmX9nRhcnZUcbzKCpfXukXZucRCzGG1fKp6EUVpspieEvn"]},"src/legacy/privacy/FeeNftStakingHook.sol":{"keccak256":"0xba4c1fc43d4a97c10414144da44168a98766f6e8223bd6d9503bb722a07dc23d","license":"MIT","urls":["bzz-raw://87a07daa2fb8b33810f0f57395ae40ee3d761f9b5d4da92a8d84a29cdd126347","dweb:/ipfs/QmTLSd1zSACvmKNHxi8SvJHNQebgTzzWQyfHJh6jSJvZJU"]},"src/legacy/privacy/FeePrivacyHook.sol":{"keccak256":"0x2e38e0d9b72b75a253174dd71174f44e47654f13d86cb132424a62d489113be0","license":"MIT","urls":["bzz-raw://7beaacbb1612f350a513d7415ef278e980f34e2621e4f623be5bd01d823f5d1d","dweb:/ipfs/QmZQ2soAj1vR5kn9LXDBCjUV1bFLEWjE31va7cnWmh7gfC"]},"src/legacy/privacy/IPrivacyPool.sol":{"keccak256":"0x6b138b31a85ddf8872578f8cb2c73ae72812d95d9c1d00706f40d803938ec96c","license":"Apache-2.0","urls":["bzz-raw://8cb7b891bc9276b5574573ab5949924f479daad0cae161400b2040a6bab746aa","dweb:/ipfs/QmT2rViViy2Nu1G6M6Vp8dpxLgVbSa9tVFMJ7RtG28mvMW"]},"src/legacy/vendor/chainlink/shared/interfaces/LinkTokenInterface.sol":{"keccak256":"0xcee9303d524c29fefc346775ec0be31d134a5f14c990fe04961a9f516eb23ad5","license":"MIT","urls":["bzz-raw://f8b8e522c3aa8d22f0c6c6e2ed0b0aee2a224a961099205e4d847129abecd496","dweb:/ipfs/QmRsTaN1CFJADHtBNsE9kJT8F4P8qVSggGHh3iXL5dDcmc"]},"src/legacy/vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol":{"keccak256":"0x49eef0f77dd5b06a6aeead7945d9a4d0948137dc228fe045e07f62e80a4c5aa2","license":"MIT","urls":["bzz-raw://b8aa31c59918c1b3f6d1f3aec72c53118ef1eb6d58007daaf067165946ef2486","dweb:/ipfs/QmPpp5ykgufVzcHxfu3orkiJKwczUfs3VXcjN1AvApAbSA"]},"src/legacy/vendor/chainlink/vrf/dev/interfaces/IVRFV2PlusWrapper.sol":{"keccak256":"0x23a19b6fa394e21359d39d78a081ddaa68160cca4b8850afbec5843bd16a844f","license":"MIT","urls":["bzz-raw://f545db93aff28a897f8df61834b05be9c2f96ae953263d8c1f6d5c6648c4f3a5","dweb:/ipfs/QmbwriSRDKrEYW2HqWN2YJjco5wMgr7NBc9yUaHwr2bifu"]},"src/legacy/vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol":{"keccak256":"0xb0b1a6f3f0d59aca5c805994d8f64c24f570c280422f976dbae20f8b5b24b47c","license":"MIT","urls":["bzz-raw://f50a9db38564469f443866bb1e8067f4f934616195afe282c00733d1c1cc7419","dweb:/ipfs/QmfKLv5z7KzxNKCZfH9wC9b4ukkXqz8w8HEqmJcYAvdREH"]}},"version":1},"storageLayout":{"types":null,"storage":[]},"transientStorageLayout":null,"userdoc":{"kind":"user","notice":"Protected settlement core with replaceable fee and product programs.","methods":{"processLiquidity()":{"notice":"Fixed-destination processing; callers cannot withdraw or redirect reserves."},"timedBuybackState()":{"notice":"Linear release of the reserve over eight hours from the latest fee top-up. New fees extend the unvested stream; skipped batches keep their vested allowance. After twelve hours the previous ordinary processor resumes automatically."},"quoteTradeFee(address,bool,int256,bytes)":{"notice":"Quote depends on the current program and trade data; default rate alone is not a quote."},"processBuybacksGuarded(uint256,uint256,uint256)":{"notice":"Anyone may pay gas, but cannot select recipients, change allocations or withdraw funds."},"processLiquidityRemainder(uint128,uint256,uint256,uint256)":{"notice":"Finish old auto-LP reserves into their original position, even below its old batch threshold."},"submitWeather((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)":{"notice":"Anyone may relay a valid answer for this exact consumer and question."}},"version":1},"devdoc":{"kind":"dev","errors":{"ECDSAInvalidSignature()":[{"details":"The signature is invalid."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}]},"details":"Final inherited accounting kernel. No arbitrary or replaceable delegate target.","methods":{"weatherState()":{"returns":{"mode":"0 = fallback, 1 = dry, 2 = rain."}},"activateRewardBoost()":{"details":"Retains the historical ABI and one-shot namespace; history no longer sets any allocation."},"processBuybacksGuarded(uint256,uint256,uint256)":{"details":"Minimum tokens per ETH spent protects partial batches and newly accrued fees proportionally."},"processLiquidityRemainder(uint128,uint256,uint256,uint256)":{"details":"Only the original position owner may choose the short-lived minimum and reserve caps."}},"version":1},"sourceIds":{"src/ProtectedHook.sol":{"id":73},"src/ClausFeeBudget.sol":{"id":72},"src/legacy/FeeMath.sol":{"id":81},"src/legacy/ClausArt.sol":{"id":76},"src/legacy/ClausNFT.sol":{"id":77},"src/legacy/FeeCalls.sol":{"id":79},"src/legacy/HookBase.sol":{"id":86},"src/legacy/ArenaTide.sol":{"id":75},"src/legacy/FeeNftHook.sol":{"id":82},"src/legacy/IMDWeather.sol":{"id":87},"src/legacy/NftRewards.sol":{"id":91},"src/TradeExtensionHost.sol":{"id":74},"src/legacy/FomoReserve.sol":{"id":85},"src/legacy/FeeProcessor.sol":{"id":84},"src/legacy/PoolCapSource.sol":{"id":93},"src/legacy/ProjectRevenue.sol":{"id":94},"src/legacy/ClausNftStaking.sol":{"id":78},"src/legacy/MarketCapOracle.sol":{"id":90},"src/legacy/PlatformRevenue.sol":{"id":92},"src/legacy/FeeEfficientHook.sol":{"id":80},"src/legacy/LiquidityReserve.sol":{"id":88},"src/legacy/FeePredictionHook.sol":{"id":83},"src/legacy/LpRemainderProcessor.sol":{"id":89},"src/legacy/privacy/IPrivacyPool.sol":{"id":100},"src/legacy/privacy/FeePrivacyHook.sol":{"id":99},"src/legacy/privacy/ClausPrivacyBuy.sol":{"id":95},"src/legacy/privacy/FeeLpRewardsHook.sol":{"id":97},"src/legacy/privacy/FeeNftStakingHook.sol":{"id":98},"src/legacy/privacy/FeeBatchedPrivacyHook.sol":{"id":96},"../../../lib/v4-periphery/src/libraries/Actions.sol":{"id":69},"../../../lib/v4-periphery/src/interfaces/INotifier.sol":{"id":63},"../../../lib/v4-periphery/src/interfaces/IEIP712_v4.sol":{"id":59},"../../../lib/v4-periphery/src/interfaces/ISubscriber.sol":{"id":67},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolId.sol":{"id":56},"../../../lib/v4-periphery/src/interfaces/IMulticall_v4.sol":{"id":62},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolKey.sol":{"id":57},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Lock.sol":{"id":44},"../../../lib/v4-periphery/lib/v4-core/src/types/Currency.sol":{"id":55},"../../../lib/v4-periphery/src/interfaces/IImmutableState.sol":{"id":61},"../../../lib/v4-periphery/src/interfaces/IUnorderedNonce.sol":{"id":68},"../../../lib/v4-periphery/src/libraries/LiquidityAmounts.sol":{"id":70},"../../../lib/openzeppelin-contracts/contracts/utils/Bytes.sol":{"id":13},"../../../lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"id":15},"../../../lib/v4-periphery/src/interfaces/IERC721Permit_v4.sol":{"id":60},"../../../lib/v4-periphery/src/interfaces/IPositionManager.sol":{"id":66},"../../../lib/openzeppelin-contracts/contracts/utils/Base64.sol":{"id":12},"../../../lib/v4-periphery/src/interfaces/IPermit2Forwarder.sol":{"id":64},"../../../lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":14},"../../../lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"id":18},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IHooks.sol":{"id":30},"../../../lib/v4-periphery/lib/v4-core/src/libraries/BitMath.sol":{"id":36},"../../../lib/v4-periphery/src/libraries/PositionInfoLibrary.sol":{"id":71},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sol":{"id":27},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FullMath.sol":{"id":41},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Position.sol":{"id":46},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SafeCast.sol":{"id":47},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TickMath.sol":{"id":50},"../../../lib/v4-periphery/lib/v4-core/src/types/BalanceDelta.sol":{"id":53},"../../../lib/v4-periphery/src/interfaces/IPoolInitializer_v4.sol":{"id":65},"../../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"id":23},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolOperation.sol":{"id":58},"src/legacy/vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol":{"id":104},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExtsload.sol":{"id":28},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExttload.sol":{"id":29},"../../../lib/v4-periphery/lib/v4-core/src/libraries/UnsafeMath.sol":{"id":52},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":2},"../../../lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"id":17},"../../../lib/v4-periphery/lib/v4-core/src/types/BeforeSwapDelta.sol":{"id":54},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":1},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":4},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CustomRevert.sol":{"id":38},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint96.sol":{"id":40},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LPFeeLibrary.sol":{"id":42},"../../../lib/v4-periphery/lib/v4-core/src/libraries/StateLibrary.sol":{"id":49},"src/legacy/vendor/chainlink/shared/interfaces/LinkTokenInterface.sol":{"id":101},"src/legacy/vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol":{"id":102},"src/legacy/vendor/chainlink/vrf/dev/interfaces/IVRFV2PlusWrapper.sol":{"id":103},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":0},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol":{"id":7},"../../../lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"id":24},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IPoolManager.sol":{"id":31},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint128.sol":{"id":39},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LiquidityMath.sol":{"id":43},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SqrtPriceMath.sol":{"id":48},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"id":8},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IProtocolFees.sol":{"id":32},"../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"id":16},"../../../lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"id":25},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CurrencyReserves.sol":{"id":37},"../../../lib/v4-periphery/lib/v4-core/src/libraries/NonzeroDeltaCount.sol":{"id":45},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"id":19},"../../../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"id":3},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sol":{"id":26},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"id":21},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":6},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":22},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TransientStateLibrary.sol":{"id":51},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol":{"id":9},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"id":34},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol":{"id":11},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"id":35},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"id":33},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"id":20},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":5},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"id":10}},"additionalInput":null,"stdJsonInput":{"sources":{"src/ProtectedHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\n\nimport {FeeNftStakingHook} from \"./legacy/privacy/FeeNftStakingHook.sol\";\nimport {ClausPrivacyBuy} from \"./legacy/privacy/ClausPrivacyBuy.sol\";\nimport {IClausLpRewards} from \"./legacy/privacy/FeeLpRewardsHook.sol\";\nimport {LpRemainderProcessor} from \"./legacy/LpRemainderProcessor.sol\";\nimport {ClausNftStaking} from \"./legacy/ClausNftStaking.sol\";\nimport {TradeExtensionHost} from \"./TradeExtensionHost.sol\";\nimport {ClausFeeBudget} from \"./ClausFeeBudget.sol\";\ninterface IFeeGovernor { function owner() external view returns(address); }\ninterface IBurnToken { function burn(uint256) external; }\n\n/// @notice Protected settlement core with replaceable fee and product programs.\n/// @dev Final inherited accounting kernel. No arbitrary or replaceable delegate target.\ncontract ProtectedHook is FeeNftStakingHook {\n    using StateLibrary for IPoolManager;\n    address private constant HOOK = 0x37Bfb8AC7C960E558657871D41Ca70E07e7DbfFf;\n    address private constant ADMIN = 0x1f22E4B065b2f15Fed5BE556DC0fA636048d29bc;\n    address private constant TOKEN = 0x1b54E762aa34CF6E28E9C082F2848e28E45DA6b8;\n    IPoolManager private constant MANAGER = IPoolManager(0x000000000004444c5dc75cB358380D2e3dE08A90);\n    uint256 public constant WINDOW = 8 hours;\n    uint256 public constant DURATION = 12 hours;\n    bytes32 private constant SLOT = keccak256(\"claus.hook.timed-buyback.2026-10-15.v1\");\n    struct Schedule { uint64 startsAt; uint64 endsAt; uint64 checkpoint; uint64 streamEndsAt; uint256 lockedEth; uint256 availableEth; }\n    error InvalidContext();\n    error InvalidActivation();\n    event TimedBuybackActivated(uint64 startsAt, uint64 endsAt, uint256 windowSeconds);\n\n\n    address public immutable implementationSelf = address(this);\n    TradeExtensionHost public immutable extensions;\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_, IClausLpRewards lpRewards_, LpRemainderProcessor remainder_, ClausNftStaking staking_, TradeExtensionHost extensions_)\n        FeeNftStakingHook(base, privacyBuy_, lpRewards_, remainder_, staking_) {\n        // Existing mandatory dependencies cannot be replaced while sealing the core.\n        _pin(address(base.manager), 0x000000000004444c5dc75cB358380D2e3dE08A90, 0x785f1014552b7ce7d5fb7d0c970ca60edee94fd00425d7ca21609acac7ce1293);\n        _pin(address(base.project), 0x49A91293a8dFf24d5c54b798C45376301D29b9f3, 0x4b7d19bb5a7437581d6359ce496b9b25ef6971ca8776bfc56fb515d8e92edc51);\n        _pin(address(base.platform), 0xF1749E78e76CfE1119206833aE93beD2dede5353, 0x0c809a6af46fb81e31c079263cf6889f1002eb4a3d71508d1cfa0f1fdccd709c);\n        _pin(address(base.reserve), 0x136589bE852aB8D9541F923B04064E362C2F357A, 0x1ba19c78683fcdca321006b491961704038a75d8bae969d4ac7eb363987a4bc9);\n        _pin(address(base.feed), 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419, 0x4b79b5c8aee6da0f7b393e8b53e6265ef7320a1d16184c65bd3841b5aa3d700d);\n        _pin(address(base.fomo), 0x72d94600A7A57Afb6A2090e9739fd8ab21e02EB2, 0x38e9854f45420e983b7e429772e6c0fd3b6ce0327d22f09593d9be5de7c78b4e);\n        _pin(address(base.processor), 0x271f808cb55C7Cbbb3d4df0DA075deF9AE5F7340, 0x5edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c5);\n        _pin(address(base.nft), 0x80396c7131159eB92E7E84839e51C9887A7A95d9, 0x162a8f628e26a75e99b59459595aa3dab79d928bab90263195364a48d91a8212);\n        _pin(address(base.oracle), 0xC594bdFBA256c79F6069df9e89Ea78D6312Fadd7, 0x0c382e71978ff7c7a8ae6ccbb5ae72ff7e3c7348b633fa568e61bc227c0e600f);\n        _pin(address(privacyBuy_), 0xC0AeabdeF1760d0Dcba28A20C15701F74216e77a, 0x895d8d18e1ddae18be624a5d6eb91ecbef32463239286ea0f089cbaf4d73cb14);\n        _pin(address(lpRewards_), 0xB2304d3DE407398de441b147e2c64c7c48DAf44E, 0x6e6bc3de6394814b173f45ad91823a00d221177e3f55ac950aa51b0527aaeee5);\n        _pin(address(remainder_), 0x51629bca14098A4f1AD77cd7E85212d67349823d, 0x63ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2);\n        _pin(address(staking_), 0x4e5916428452891E1deb59d162c20266ED08CAD4, 0xe9609b506e4fb7529489bead6fb1212a3751c585ca01e7ea8162eaf717284ee2);\n        if (base.attester != 0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982\n            || base.questionHash != 0x39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d787\n            || base.spacing != 1) revert InvalidActivation();\n        // The extension host is deployed from this exact fixed source before finalization.\n        if(address(extensions_).codehash != keccak256(type(TradeExtensionHost).runtimeCode)) revert InvalidActivation();\n        extensions=extensions_;\n        // Only the two exact immutable legacy processors may execute in kernel context.\n        // No extension setter can replace them, their code or their destinations.\n        if (address(base.manager) != address(MANAGER) || base.reserve.token() != TOKEN || base.reserve.hook() != HOOK\n            || address(base.processor) != 0x271f808cb55C7Cbbb3d4df0DA075deF9AE5F7340\n            || address(base.processor).codehash != 0x5edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c5\n            || address(remainder_) != 0x51629bca14098A4f1AD77cd7E85212d67349823d\n            || address(remainder_).codehash != 0x63ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2)\n            revert InvalidActivation();\n    }\n    function _pin(address actual, address expected, bytes32 runtimeHash) private view {\n        if (actual != expected || actual.codehash != runtimeHash) revert InvalidActivation();\n    }\n    function protectionVersion() external pure returns(uint256) { return 1; }\n    function protectionKind() external pure returns(bytes32) { return keccak256(\"CLAUS_HOOK\"); }\n    function maximumTotalTaxPips() external pure returns(uint24) { return 150_000; }\n    function totalHookFeePips() external view returns(uint256) { return ClausFeeBudget.rate(); }\n    /// @notice Quote depends on the current program and trade data; default rate alone is not a quote.\n    function quoteTradeFee(address sender,bool buy,int256 amountSpecified,bytes calldata data) public view returns(address module,uint24 totalPips) {\n        uint256 packed;(module,packed)=extensions.quote(sender,buy,amountSpecified,data);\n        totalPips=uint24(packed & 0xffffff)-1;\n    }\n    function _beforeSwapExtension(address sender,PoolKey calldata,SwapParams calldata params,bytes calldata data) internal override {\n        (address module,uint256 packed)=extensions.quote(sender,params.zeroForOne,params.amountSpecified,data);\n        ClausFeeBudget.start(packed,module);\n    }\n    function _afterSwapExtension(address sender,PoolKey calldata,SwapParams calldata params,BalanceDelta delta,bytes calldata data) internal override {\n        address module=ClausFeeBudget.module();\n        if(module!=address(0)){\n            (uint256 fee,uint256 extra)=ClausFeeBudget.recordedFee();\n            extensions.record(module,sender,params.zeroForOne,delta.amount0(),delta.amount1(),fee,extra,keccak256(data));\n        }\n        ClausFeeBudget.finish();\n    }\n    function activateTimedBuyback() external pure { revert InvalidActivation(); }\n\n    /// @notice Linear release of the reserve over eight hours from the latest fee top-up.\n    /// New fees extend the unvested stream; skipped batches keep their vested allowance.\n    /// After twelve hours the previous ordinary processor resumes automatically.\n    function timedBuybackState() external view returns (uint64 startsAt, uint64 endsAt, bool active, uint256 availableEth) {\n        Schedule storage s = _schedule();\n        active = _active(s);\n        (uint256 available,,) = active ? _released(s, _pending()) : (uint256(0), uint256(0), uint64(0));\n        return (s.startsAt, s.endsAt, active, available);\n    }\n\n    function processBuybacksDuringSwap(address sender) public override {\n        if (address(this) != HOOK || msg.sender != HOOK) revert InvalidContext();\n        Schedule storage s = _schedule();\n        if (!_active(s)) { super.processBuybacksDuringSwap(sender); return; }\n        (uint256 budget, uint256 locked, uint64 streamEnd) = _released(s, _pending());\n        s.availableEth = budget;\n        s.lockedEth = locked;\n        s.checkpoint = uint64(block.timestamp);\n        s.streamEndsAt = streamEnd;\n        PoolKey memory key = PoolKey(Currency.wrap(address(0)), Currency.wrap(TOKEN), 0x800000, 1, IHooks(HOOK));\n        uint128 liquidity = MANAGER.getLiquidity(key.toId());\n        if (budget == 0 || liquidity == 0) return;\n        (uint160 price,,,) = MANAGER.getSlot0(key.toId());\n        if (price <= TickMath.MIN_SQRT_PRICE + 1) return;\n        // Keep both the existing ~1% price-impact limit and a 1% active virtual-ETH cap.\n        uint256 depthCap = FullMath.mulDiv(uint256(liquidity), 1 << 96, uint256(price)) / 100;\n        if (budget > depthCap) budget = depthCap;\n        if (budget > uint256(uint128(type(int128).max))) budget = uint256(uint128(type(int128).max));\n        if (budget == 0) return;\n        uint160 limit = uint160(uint256(price) * 995 / 1000);\n        if (limit <= TickMath.MIN_SQRT_PRICE) limit = TickMath.MIN_SQRT_PRICE + 1;\n        MANAGER.burn(HOOK, 0, budget);\n        BalanceDelta bought = MANAGER.swap(key, SwapParams(true, -int256(budget), limit), bytes(\"\"));\n        uint256 spent = uint256(-int256(bought.amount0()));\n        uint256 tokens = uint256(uint128(bought.amount1()));\n        if (spent < budget) MANAGER.mint(HOOK, 0, budget - spent);\n        s.availableEth -= spent;\n        if (tokens != 0) {\n            MANAGER.take(key.currency1, HOOK, tokens);\n            IBurnToken(TOKEN).burn(tokens);\n        }\n        emit BuybackBurn(key.toId(), sender, spent, tokens, MANAGER.balanceOf(HOOK, 0));\n    }\n\n    function _pending() private view returns (uint256) {\n        uint256 p = MANAGER.balanceOf(HOOK, 0);\n        return p == 0 ? 0 : p - 1; // Retain the existing warm-slot reserve dust.\n    }\n    function _released(Schedule storage s, uint256 pending) private view returns (uint256 available, uint256 locked, uint64 streamEnd) {\n        available = s.availableEth;\n        locked = s.lockedEth;\n        streamEnd = s.streamEndsAt;\n        if (pending < available + locked) revert InvalidContext();\n        uint256 added = pending - available - locked;\n        if (locked != 0 && block.timestamp > s.checkpoint) {\n            uint256 released = block.timestamp >= streamEnd ? locked :\n                FullMath.mulDiv(locked, block.timestamp - s.checkpoint, streamEnd - s.checkpoint);\n            available += released;\n            locked -= released;\n        }\n        if (added != 0) {\n            locked += added;\n            streamEnd = uint64(block.timestamp + WINDOW);\n        }\n    }\n    function _active(Schedule storage s) private view returns (bool) {\n        return s.endsAt != 0 && block.timestamp >= s.startsAt && block.timestamp < s.endsAt;\n    }\n    function _schedule() private pure returns (Schedule storage s) {\n        bytes32 slot = SLOT;\n        assembly { s.slot := slot }\n    }\n}\n"},"src/ClausFeeBudget.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @notice One aggregate trading budget and a per-trade allocation snapshot.\n/// @dev Plan fields: project, platform, burn, LP rewards, NFT rewards, module.\n/// Each is 24 bits; low 24 bits hold total rate + 1 (zero is the inactive sentinel).\nlibrary ClausFeeBudget {\n    uint24 internal constant TOTAL_CAP = 150_000;\n    uint24 internal constant MAX_RATE = 149_000;\n    uint24 internal constant BASE = 23_000;\n    uint256 internal constant DEFAULT_PLAN = uint256(23001) | (uint256(13000)<<24)\n        | (uint256(3000)<<48) | (uint256(1500)<<72) | (uint256(2000)<<96) | (uint256(3500)<<120);\n    bytes32 private constant TRADE = keccak256(\"claus.protected.current-trade.v2\");\n    function start(uint256 packed,address selectedModule) internal {\n        bytes32 slot=TRADE;assembly{tstore(slot,packed) tstore(add(slot,1),selectedModule)}\n    }\n    function plan() internal view returns(uint256 value) {bytes32 slot=TRADE;assembly{value:=tload(slot)}if(value==0)value=DEFAULT_PLAN;}\n    function rate() internal view returns(uint256) {return (plan() & 0xffffff)-1;}\n    function pips(uint256 index) internal view returns(uint256) {return (plan() >> ((index+1)*24)) & 0xffffff;}\n    function module() internal view returns(address value) {bytes32 slot=TRADE;assembly{value:=tload(add(slot,1))}}\n    function recordFee(uint256 fee,uint256 extra) internal {bytes32 slot=TRADE;assembly{tstore(add(slot,2),fee) tstore(add(slot,3),extra)}}\n    function recordedFee() internal view returns(uint256 fee,uint256 extra) {bytes32 slot=TRADE;assembly{fee:=tload(add(slot,2)) extra:=tload(add(slot,3))}}\n    function finish() internal {bytes32 slot=TRADE;assembly{tstore(slot,0) tstore(add(slot,1),0) tstore(add(slot,2),0) tstore(add(slot,3),0)}}\n    function grossFee(uint256 gross) internal view returns(uint256) {return gross*rate()/1_000_000;}\n    function netFee(uint256 net) internal view returns(uint256) {uint256 r=rate();return net*r/(1_000_000-r);}\n}\n"},"src/legacy/FeeMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {ClausFeeBudget} from \"../ClausFeeBudget.sol\";\n\n/// @notice Starting 2% project plus 0.3% platform on the same gross ETH basis.\n/// @dev Fixed base allocation plus the globally bounded surcharge.\nlibrary FeeMath {\n    uint24 internal constant TOTAL_PIPS = 23_000;\n    uint24 internal constant PROJECT_PIPS = 20_000;\n    uint256 internal constant DENOMINATOR = 1_000_000;\n\n    function fromGross(uint256 gross) internal view returns (uint256) {\n        // A valid v4 native delta bounds successful inputs below 2^128.\n        // Checked multiplication rejects oversized, unfulfillable requests.\n        return ClausFeeBudget.grossFee(gross);\n    }\n\n    function fromNet(uint256 net) internal view returns (uint256) {\n        return ClausFeeBudget.netFee(net);\n    }\n\n    function projectFromGross(uint256 gross) internal pure returns (uint256) {\n        return gross / 50;\n    }\n}\n"},"src/legacy/ClausArt.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Base64} from \"@openzeppelin/contracts/utils/Base64.sol\";\nimport {Strings} from \"@openzeppelin/contracts/utils/Strings.sol\";\n\n/// @notice Immutable data, not an executable art generator or an upgradeable URL.\ncontract ClausArtData {\n    constructor(bytes memory data) {\n        require(data.length <= 24_000, \"art chunk too large\");\n        bytes memory runtime = bytes.concat(hex\"00\", data);\n        assembly (\"memory-safe\") { return(add(runtime, 32), mload(runtime)) }\n    }\n}\n\n/// @notice All 300 original SVGs are frozen in deployed bytecode.\ncontract ClausArt {\n    using Strings for uint256;\n    address[] public banks;\n    uint64[300] private locations;\n    bytes32 public immutable manifestHash;\n\n    constructor(address[] memory banks_, uint64[300] memory locations_, bytes32 hash_) {\n        require(banks_.length > 0 && banks_.length < 256 && hash_ != bytes32(0), \"art config\");\n        for (uint256 i; i < banks_.length; ++i) require(banks_[i].code.length > 1, \"empty bank\");\n        banks = banks_; locations = locations_; manifestHash = hash_;\n        for (uint256 i; i < 300; ++i) {\n            uint64 v = locations_[i]; uint256 bank = v >> 32;\n            uint256 offset = uint16(v >> 16); uint256 length = uint16(v);\n            require(bank < banks_.length && length > 0 && offset > 0\n                && offset + length <= banks_[bank].code.length, \"invalid art pointer\");\n        }\n    }\n\n    function image(uint256 id) public view returns (string memory) {\n        require(id > 0 && id <= 300, \"unknown identity\");\n        uint64 loc = locations[id - 1]; address bank = banks[loc >> 32];\n        uint256 offset = uint16(loc >> 16); uint256 length = uint16(loc);\n        bytes memory data = new bytes(length);\n        assembly (\"memory-safe\") { extcodecopy(bank, add(data, 32), offset, length) }\n        return string(data);\n    }\n\n    function tokenURI(uint256 id) external view returns (string memory) {\n        string memory label = id.toString();\n        return string.concat(\"data:application/json;base64,\", Base64.encode(bytes(string.concat(\n            '{\"name\":\"Claus #', label, '\",\"description\":\"One of 300 fixed Claus identities. Backed by 50,000 deposited CLAUS, redeemable by its current owner. Equal time-weighted participation in the NFT reward allocation. Artwork and identity remain the same after redemption and remint.\",\"image\":\"data:image/svg+xml;base64,',\n            Base64.encode(bytes(image(id))), '\",\"external_url\":\"https://claus.si/Hooks/NFTs?identity=', label,\n            '\",\"attributes\":[{\"trait_type\":\"Identity\",\"value\":', label,\n            '},{\"trait_type\":\"Backing (CLAUS)\",\"value\":50000},{\"trait_type\":\"Reward weight\",\"value\":1}]}'\n        ))));\n    }\n\n    function contractURI() external pure returns (string memory) {\n        return string.concat(\"data:application/json;base64,\", Base64.encode(bytes(\n            '{\"name\":\"Claus\",\"description\":\"300 fixed identities. Each live NFT holds 50,000 deposited CLAUS and participates equally by holding time in the NFT reward allocation.\",\"external_link\":\"https://claus.si/Hooks/NFTs\",\"image\":\"https://claus.si/assets/claus-profile.png\",\"collaborators\":[]}'\n        )));\n    }\n}\n"},"src/legacy/ClausNFT.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {ERC721} from \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {NftRewards} from \"./NftRewards.sol\";\nimport {ClausArt} from \"./ClausArt.sol\";\nimport {VRFV2PlusWrapperConsumerBase} from \"./vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol\";\nimport {VRFV2PlusClient} from \"./vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol\";\n\n/// @notice 300 fixed identities backed only by existing deposited CLAUS.\n/// @dev No admin collateral withdrawal, mint bypass, art replacement or random reroll.\ncontract ClausNFT is ERC721, NftRewards, VRFV2PlusWrapperConsumerBase {\n    using SafeERC20 for IERC20;\n    uint256 public constant BACKING = 50_000 ether;\n    uint256 public constant CAPACITY = 300;\n    uint32 public constant CALLBACK_GAS = 110_000;\n    uint16 public constant CONFIRMATIONS = 10;\n    IERC20 public immutable token;\n    ClausArt public immutable art;\n    address public immutable owner;\n    bool public mintOpen;\n    uint32 public totalSupply;\n    uint32 public pendingCount;\n    uint256 public reservedBacking;\n    mapping(address => bool) public mintUsed;\n    mapping(address => uint256) public mintRequest;\n    mapping(uint256 => uint256) public transferNonce;\n    mapping(address => uint256) public nativeRefund;\n    uint256 public refundLiability;\n\n    struct Request { address minter; uint64 created; bool ready; bool cancelled; bool settled; uint256 randomness; }\n    mapping(uint256 => Request) public requests;\n    uint256[] public queue;\n    uint256 public queueHead;\n    uint16[] private freeIds;\n    uint16[] private returnedIds;\n    error MintUnavailable();\n    error MintAlreadyUsed();\n    error InvalidBacking();\n    error NotOwner();\n    error InvalidRequest();\n    error RefundFailed();\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    event MintOpened();\n    event MintRequested(address indexed minter, uint256 indexed requestId, uint256 oracleFee);\n    event RandomnessReady(uint256 indexed requestId);\n    event MintCancelled(address indexed minter, uint256 indexed requestId);\n    event Minted(address indexed minter, uint256 indexed id, uint256 indexed requestId);\n    event Redeemed(address indexed account, uint256 indexed id, uint256 returnedTokens);\n\n    constructor(IERC20 token_, IPoolManager manager_, address hook_, ClausArt art_, address wrapper_, address owner_)\n        ERC721(\"Claus\", \"CLAUS-NFT\") NftRewards(manager_, hook_) VRFV2PlusWrapperConsumerBase(wrapper_)\n    {\n        require(address(token_).code.length != 0 && address(art_).code.length != 0 && owner_ != address(0), \"NFT config\");\n        token = token_; art = art_; owner = owner_;\n        for (uint16 id = 1; id <= CAPACITY; ++id) freeIds.push(id);\n        emit OwnershipTransferred(address(0), owner_);\n    }\n\n    function openMint() external {\n        if (msg.sender != owner) revert NotOwner();\n        if (mintOpen) revert MintUnavailable();\n        mintOpen = true; emit MintOpened();\n    }\n\n    function tokenURI(uint256 id) public view override returns (string memory) {\n        _requireOwned(id); return art.tokenURI(id);\n    }\n    function contractURI() external view returns (string memory) { return art.contractURI(); }\n    function available() public view returns (uint256) { return freeIds.length - pendingCount; }\n    function waitingForReveal() external view returns (uint256) { return returnedIds.length; }\n    function requiredBacking() public view returns (uint256) { return uint256(totalSupply) * BACKING + reservedBacking; }\n\n    function mintPrice(uint256 gasPriceWei) external view returns (uint256) {\n        if (freeIds.length == 1 && pendingCount == 0) return 0;\n        return i_vrfV2PlusWrapper.estimateRequestPriceNative(CALLBACK_GAS, 1, gasPriceWei);\n    }\n\n    /// @notice Commit once per wallet. A sole free identity is already known and needs no oracle.\n    function requestMint() external payable nonReentrant returns (uint256 requestId) {\n        if (!mintOpen || available() == 0) revert MintUnavailable();\n        if (mintUsed[msg.sender]) revert MintAlreadyUsed();\n        uint256 oraclePrice = freeIds.length == 1 && pendingCount == 0 ? 0\n            : i_vrfV2PlusWrapper.calculateRequestPriceNative(CALLBACK_GAS, 1);\n        if (msg.value < oraclePrice) revert InvalidRequest();\n        mintUsed[msg.sender] = true;\n        uint256 beforeBalance = token.balanceOf(address(this));\n        token.safeTransferFrom(msg.sender, address(this), BACKING);\n        if (token.balanceOf(address(this)) != beforeBalance + BACKING) revert InvalidBacking();\n        if (oraclePrice == 0) {\n            uint256 id = freeIds[freeIds.length - 1]; freeIds.pop();\n            _mint(msg.sender, id);\n            emit Minted(msg.sender, id, 0);\n        } else {\n            reservedBacking += BACKING;\n            ++pendingCount;\n            (requestId,) = requestRandomnessPayInNative(CALLBACK_GAS, CONFIRMATIONS, 1,\n                VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})));\n            if (requestId == 0 || requests[requestId].minter != address(0)) revert InvalidRequest();\n            requests[requestId] = Request(msg.sender, uint64(block.timestamp), false, false, false, 0);\n            mintRequest[msg.sender] = requestId;\n            queue.push(requestId);\n            emit MintRequested(msg.sender, requestId, oraclePrice);\n        }\n        uint256 excess = msg.value - oraclePrice;\n        if (excess != 0) {\n            (bool ok,) = payable(msg.sender).call{value: excess, gas: 30_000}(\"\");\n            if (!ok) { nativeRefund[msg.sender] += excess; refundLiability += excess; }\n        }\n    }\n\n    /// @notice Return pending principal immediately; the wallet's committed mint opportunity stays used.\n    /// @dev The request is never rerolled or removed from the random queue. Its eventual identity is recycled.\n    function cancelMint() external nonReentrant {\n        uint256 id = mintRequest[msg.sender]; Request storage request = requests[id];\n        if (id == 0 || request.minter != msg.sender || request.cancelled || request.settled) revert InvalidRequest();\n        request.cancelled = true; reservedBacking -= BACKING;\n        token.safeTransfer(msg.sender, BACKING);\n        emit MintCancelled(msg.sender, id);\n    }\n\n    function withdrawNativeRefund(address payable recipient) external nonReentrant {\n        uint256 amount = nativeRefund[msg.sender];\n        if (amount == 0 || recipient == address(0)) revert InvalidRequest();\n        nativeRefund[msg.sender] = 0; refundLiability -= amount;\n        (bool ok,) = recipient.call{value: amount}(\"\"); if (!ok) revert RefundFailed();\n    }\n\n    /// @dev Only the authenticated wrapper can call the inherited entry point. Store first, do no receiver calls.\n    function fulfillRandomWords(uint256 requestId, uint256[] memory words) internal override {\n        Request storage request = requests[requestId];\n        if (request.minter == address(0) || request.ready || words.length == 0) return;\n        request.randomness = words[0]; request.ready = true;\n        emit RandomnessReady(requestId);\n    }\n\n    /// @notice Ordered processing makes out-of-order oracle callbacks irrelevant to allocation.\n    function finishMints(uint256 limit) external nonReentrant {\n        if (limit == 0 || limit > 20) revert InvalidRequest();\n        uint256 stop = queueHead + limit;\n        while (queueHead < queue.length && queueHead < stop) {\n            uint256 requestId = queue[queueHead]; Request storage request = requests[requestId];\n            if (!request.ready) break;\n            uint256 index = request.randomness % freeIds.length;\n            uint256 id = freeIds[index];\n            freeIds[index] = freeIds[freeIds.length - 1]; freeIds.pop();\n            request.settled = true; ++queueHead; --pendingCount;\n            if (request.cancelled) returnedIds.push(uint16(id));\n            else {\n                reservedBacking -= BACKING;\n                // The minter explicitly requested delivery to this same address; no arbitrary receiver callback.\n                _mint(request.minter, id);\n                emit Minted(request.minter, id, requestId);\n            }\n        }\n        if (pendingCount == 0) _releaseReturned();\n        if (token.balanceOf(address(this)) < requiredBacking()) revert InvalidBacking();\n    }\n\n    function redeem(uint256 id) external nonReentrant {\n        if (ownerOf(id) != msg.sender) revert NotOwner();\n        _burn(id);\n        if (pendingCount == 0) freeIds.push(uint16(id)); else returnedIds.push(uint16(id));\n        token.safeTransfer(msg.sender, BACKING);\n        emit Redeemed(msg.sender, id, BACKING);\n    }\n\n    function _releaseReturned() private {\n        while (returnedIds.length != 0) { freeIds.push(returnedIds[returnedIds.length - 1]); returnedIds.pop(); }\n    }\n\n    function _update(address to, uint256 id, address auth) internal override returns (address from) {\n        from = super._update(to, id, auth);\n        ++transferNonce[id];\n        if (from != to) {\n            if (from != address(0)) _recordOwnerUnits(from, uint32(balanceOf(from)));\n            if (to != address(0)) _recordOwnerUnits(to, uint32(balanceOf(to)));\n            if (from == address(0)) { ++totalSupply; _recordSupply(totalSupply); }\n            else if (to == address(0)) { --totalSupply; _recordSupply(totalSupply); }\n        }\n    }\n}\n"},"src/legacy/FeeCalls.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n/// @dev Only for immutable, constructor-validated fee contracts. Not arbitrary targets.\nlibrary FeeCalls {\n    function mint(address manager, address recipient, uint256 amount) internal {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, shl(224, 0x156e29f6))\n            mstore(add(p,4), and(recipient, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(p,36), 0)\n            mstore(add(p,68), amount)\n            if iszero(call(gas(), manager, 0, p, 100, 0, 0)) {\n                returndatacopy(p,0,returndatasize())\n                revert(p,returndatasize())\n            }\n        }\n    }\n    function reward(address nft, uint256 amount) internal {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, shl(224, 0x2cd49aed))\n            mstore(add(p,4), amount)\n            if iszero(call(gas(), nft, 0, p, 36, 0, 0)) {\n                returndatacopy(p,0,returndatasize())\n                revert(p,returndatasize())\n            }\n        }\n    }\n    function allocation(address platform, uint256 canonical, uint256 additional) internal {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, shl(224, 0x6a770b0f))\n            mstore(add(p,4), canonical)\n            mstore(add(p,36), additional)\n            if iszero(call(gas(), platform, 0, p, 68, 0, 0)) {\n                returndatacopy(p,0,returndatasize())\n                revert(p,returndatasize())\n            }\n        }\n    }\n}\n"},"src/legacy/HookBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"@uniswap/v4-core/src/types/BeforeSwapDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\n\n/// @notice Optional starting point for proxy implementations; not a feature whitelist.\n/// @dev No address-bit validation here: callbacks execute at the proxy, not this implementation.\n///      An override must keep appropriate caller checks. Immutable manager is part of code identity.\nabstract contract HookBase is IHooks {\n    IPoolManager public immutable poolManager;\n\n    error NotPoolManager();\n    error InvalidPoolManager();\n\n    constructor(IPoolManager manager) {\n        if (address(manager).code.length == 0) revert InvalidPoolManager();\n        poolManager = manager;\n    }\n\n    modifier onlyPoolManager() {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        _;\n    }\n\n    function beforeInitialize(address, PoolKey calldata, uint160) external virtual onlyPoolManager returns (bytes4) {\n        return IHooks.beforeInitialize.selector;\n    }\n\n    function afterInitialize(address, PoolKey calldata, uint160, int24)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeAddLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.beforeAddLiquidity.selector;\n    }\n\n    function afterAddLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata\n    ) external virtual onlyPoolManager returns (bytes4, BalanceDelta) {\n        return (IHooks.afterAddLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeRemoveLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.beforeRemoveLiquidity.selector;\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata\n    ) external virtual onlyPoolManager returns (bytes4, BalanceDelta) {\n        return (IHooks.afterRemoveLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeSwap(address, PoolKey calldata, SwapParams calldata, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);\n    }\n\n    function afterSwap(address, PoolKey calldata, SwapParams calldata, BalanceDelta, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4, int128)\n    {\n        return (IHooks.afterSwap.selector, 0);\n    }\n\n    function beforeDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.beforeDonate.selector;\n    }\n\n    function afterDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        onlyPoolManager\n        returns (bytes4)\n    {\n        return IHooks.afterDonate.selector;\n    }\n}\n"},"src/legacy/ArenaTide.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\n/// @notice Bounded market pulses for the offchain, wallet-free Claus arena.\n/// @dev No player custody, game results, randomness, prizes, oracle calls or external writes.\nabstract contract ArenaTide {\n    bytes32 private constant ARENA_SLOT = keccak256(\"claus.arena.tide.v1\");\n    uint64 public constant ARENA_PULSE_INTERVAL = 12 seconds;\n\n    // Deliberately one storage word. Existing launch/weather/reserve slots are untouched.\n    struct ArenaState { uint64 sequence; uint64 lastPulseAt; }\n    event ArenaPulse(uint64 indexed sequence, uint64 timestamp);\n\n    function arenaState() external view returns (uint64 sequence, uint64 lastPulseAt) {\n        ArenaState storage state = _arena();\n        return (state.sequence, state.lastPulseAt);\n    }\n\n    function _recordArenaTrade() internal {\n        ArenaState storage state = _arena();\n        uint256 packed;\n        assembly (\"memory-safe\") { packed := sload(state.slot) }\n        uint64 sequence = uint64(packed);\n        uint64 lastPulseAt = uint64(packed >> 64);\n        if (block.timestamp < uint256(lastPulseAt) + ARENA_PULSE_INTERVAL ||\n            sequence == type(uint64).max || block.timestamp > type(uint64).max) return;\n        unchecked { ++sequence; }\n        uint64 timestamp = uint64(block.timestamp);\n        // One write; retain the unused high half of the existing storage word.\n        uint256 next = (packed & (type(uint256).max << 128)) | uint256(sequence) | (uint256(timestamp) << 64);\n        assembly (\"memory-safe\") { sstore(state.slot, next) }\n        emit ArenaPulse(sequence, timestamp);\n    }\n\n    function _arena() private pure returns (ArenaState storage state) {\n        bytes32 slot = ARENA_SLOT;\n        assembly { state.slot := slot }\n    }\n}\n"},"src/legacy/FeeNftHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeEfficientHook, IEthUsdFeed} from \"./FeeEfficientHook.sol\";\nimport {FeeProcessor} from \"./FeeProcessor.sol\";\nimport {FeeCalls} from \"./FeeCalls.sol\";\nimport {FeeMath} from \"./FeeMath.sol\";\nimport {ClausNFT} from \"./ClausNFT.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"./PlatformRevenue.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FomoReserve} from \"./FomoReserve.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\n\n/// @notice Adds the fixed NFT allocation while retaining existing weather, market signals and processing.\ncontract FeeNftHook is FeeEfficientHook {\n    ClausNFT public immutable nft;\n    uint64 private immutable NFT_EPOCH_START;\n    uint256 private immutable NFT_EPOCH_LENGTH;\n    event NftFeeAccrued(uint256 grossEth, uint256 nftEth, uint256 epoch);\n\n    constructor(IPoolManager manager_, ProjectRevenue project_, PlatformRevenue platform_,\n        LiquidityReserve reserve_, IEthUsdFeed feed_, FomoReserve fomo_, address attester_,\n        bytes32 questionHash_, FeeProcessor processor_, ClausNFT nft_)\n        FeeEfficientHook(manager_, project_, platform_, reserve_, feed_, fomo_, attester_, questionHash_, processor_)\n    {\n        if (nft_.hook() != reserve_.hook() || address(nft_.token()) != reserve_.token()\n            || address(nft_.poolManager()) != address(manager_)) revert InvalidInitialization();\n        nft = nft_;\n        // Both are immutable in the existing, non-proxy NFT contract.\n        NFT_EPOCH_START = nft_.epochStart();\n        NFT_EPOCH_LENGTH = nft_.EPOCH();\n    }\n\n    function NFT_FEE_PIPS() public view virtual returns (uint24) { return nft.totalSupply() == 0 ? 0 : 3_500; }\n    function WALLET_FEE_PIPS() public view virtual override returns (uint24) { return 13_500 - NFT_FEE_PIPS(); }\n\n    function _accrue(uint256 gross, uint256 totalFee) internal virtual override {\n        uint256 project = FeeMath.projectFromGross(gross);\n        uint24 burnPips = BURN_FEE_PIPS();\n        // Preserve every individual floor and the wallet rounding remainder.\n        // Checked multiplication is sufficient: every successful v4 swap's\n        // native delta is int128. Larger rejected requests cannot overflow\n        // into a smaller fee because arithmetic remains checked.\n        uint256 burnEth = gross * burnPips / 1_000_000;\n        uint256 liquidityEth = gross * LIQUIDITY_FEE_PIPS() / 1_000_000;\n        uint256 fomoEth = gross * FOMO_FEE_PIPS() / 1_000_000;\n        uint256 nftEth = gross * NFT_FEE_PIPS() / 1_000_000;\n        uint256 walletEth = project - burnEth - liquidityEth - fomoEth - nftEth;\n        uint256 platform = totalFee - project;\n        if (walletEth != 0) FeeCalls.mint(address(poolManager), address(projectRevenue), walletEth);\n        if (burnEth != 0) FeeCalls.mint(address(poolManager), address(this), burnEth);\n        if (liquidityEth != 0) FeeCalls.mint(address(poolManager), address(liquidityReserve), liquidityEth);\n        if (fomoEth != 0) FeeCalls.mint(address(poolManager), address(fomoReserve), fomoEth);\n        if (nftEth != 0) {\n            FeeCalls.mint(address(poolManager), address(nft), nftEth);\n            FeeCalls.reward(address(nft), nftEth);\n            uint256 epoch = (block.timestamp - NFT_EPOCH_START) / NFT_EPOCH_LENGTH;\n            assembly (\"memory-safe\") {\n                let p := mload(0x40)\n                mstore(p, gross) mstore(add(p, 32), nftEth) mstore(add(p, 64), epoch)\n                // NftFeeAccrued(uint256,uint256,uint256)\n                log1(p, 96, 0x29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240)\n            }\n        }\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, gross) mstore(add(p, 32), walletEth) mstore(add(p, 64), burnEth)\n            // ProjectFeeSplit(uint256,uint256,uint256)\n            log1(p, 96, 0x954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7)\n            mstore(add(p, 32), liquidityEth)\n            // LiquidityFeeAccrued(uint256,uint256)\n            log1(p, 64, 0x03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df4921)\n            mstore(add(p, 32), fomoEth)\n            // FomoFeeAccrued(uint256,uint256)\n            log1(p, 64, 0x27adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b4)\n        }\n        if (platform != 0) FeeCalls.mint(address(poolManager), address(platformRevenue), platform);\n        uint256 canonical = gross / 1000;\n        FeeCalls.allocation(address(platformRevenue), canonical, platform - canonical);\n        // The subtraction is checked in the allocation call above.\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            mstore(p, gross) mstore(add(p, 32), project) mstore(add(p, 64), platform)\n            // FeeAllocation(uint256,uint256,uint256)\n            log1(p, 96, 0x30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf06)\n            mstore(add(p, 32), canonical) mstore(add(p, 64), sub(platform, canonical))\n            // PlatformFeeAllocation(uint256,uint256,uint256)\n            log1(p, 96, 0x53d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122)\n        }\n    }\n}\n"},"src/legacy/IMDWeather.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\n\n/// @notice A fresh IMD panel answer changes only the burn/LP split.\n/// @dev IMD is a trusted attester. Its signature authenticates a report, not physical weather.\nabstract contract IMDWeather {\n    address public immutable weatherAttester;\n    bytes32 public immutable weatherQuestionHash;\n    uint64 public constant WEATHER_MAX_AGE = 6 hours;\n    bytes32 private constant WEATHER_SLOT = keccak256(\"claus.weather.imd.v1\");\n    bytes32 private constant DOMAIN_TYPEHASH = keccak256(\n        \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n    );\n    bytes32 private constant ATTESTATION_TYPEHASH = keccak256(\n        \"OracleAttestation(bytes32 requestId,uint256 chainId,bytes32 questionHash,uint8 answerType,bytes answer,uint256 figure,uint64 fromBlock,uint64 toBlock,bytes32 blockHash,bytes32 panelJobId,uint16 panelSize,uint16 quorum,uint16 agreed,uint64 issuedAt,uint64 expiresAt)\"\n    );\n\n    struct Attestation {\n        bytes32 requestId;\n        uint256 chainId;\n        bytes32 questionHash;\n        uint8 answerType;\n        bytes answer;\n        uint256 figure;\n        uint64 fromBlock;\n        uint64 toBlock;\n        bytes32 blockHash;\n        bytes32 panelJobId;\n        uint16 panelSize;\n        uint16 quorum;\n        uint16 agreed;\n        uint64 issuedAt;\n        uint64 expiresAt;\n    }\n\n    // All fields are static: abi.encode(TYPEHASH, this tuple) is the EIP-712 struct encoding.\n    struct HashedAttestation {\n        bytes32 requestId;\n        uint256 chainId;\n        bytes32 questionHash;\n        uint8 answerType;\n        bytes32 answerHash;\n        uint256 figure;\n        uint64 fromBlock;\n        uint64 toBlock;\n        bytes32 blockHash;\n        bytes32 panelJobId;\n        uint16 panelSize;\n        uint16 quorum;\n        uint16 agreed;\n        uint64 issuedAt;\n        uint64 expiresAt;\n    }\n\n    struct WeatherState {\n        uint64 observedAt;\n        uint64 validUntil;\n        bool wet;\n        bytes32 requestId;\n    }\n\n    event WeatherAccepted(bytes32 indexed requestId, bool wet, uint64 observedAt, uint64 validUntil);\n    error InvalidWeather();\n    error InvalidWeatherSigner();\n    error OldWeather();\n\n    constructor(address attester_, bytes32 questionHash_) {\n        if (attester_ == address(0) || questionHash_ == bytes32(0)) revert InvalidWeather();\n        weatherAttester = attester_;\n        weatherQuestionHash = questionHash_;\n    }\n\n    /// @notice Anyone may relay a valid answer for this exact consumer and question.\n    function submitWeather(Attestation calldata a, bytes calldata signature) external {\n        if (\n            a.chainId != block.chainid || a.questionHash != weatherQuestionHash || a.answerType != 3\n                || a.answer.length != 32 || a.panelSize != 5 || a.quorum != 4 || a.agreed < 4 || a.agreed > 5\n                || a.requestId == bytes32(0) || a.panelJobId == bytes32(0)\n                || a.issuedAt > block.timestamp || a.expiresAt <= block.timestamp\n                || a.expiresAt <= a.issuedAt || a.expiresAt - a.issuedAt > WEATHER_MAX_AGE\n        ) revert InvalidWeather();\n\n        uint256 encoded = abi.decode(a.answer, (uint256));\n        uint256 observation = encoded / 2;\n        if (observation == 0 || observation > a.issuedAt || observation + WEATHER_MAX_AGE <= block.timestamp) {\n            revert InvalidWeather();\n        }\n        WeatherState storage s = _weather();\n        if (observation <= s.observedAt) revert OldWeather();\n        if (ECDSA.recover(weatherDigest(a), signature) != weatherAttester) revert InvalidWeatherSigner();\n\n        // The observation's age independently limits validity even if signing was delayed.\n        uint64 until = uint64(observation + WEATHER_MAX_AGE);\n        if (a.expiresAt < until) until = a.expiresAt;\n        s.observedAt = uint64(observation);\n        s.validUntil = until;\n        s.wet = encoded % 2 == 1;\n        s.requestId = a.requestId;\n        emit WeatherAccepted(a.requestId, s.wet, s.observedAt, until);\n    }\n\n    function weatherBurnFeePips() public view returns (uint24) {\n        uint256 word;\n        bytes32 slot = WEATHER_SLOT;\n        assembly (\"memory-safe\") { word := sload(slot) }\n        if (block.timestamp >= uint64(word >> 64)) return 2_500;\n        return uint8(word >> 128) != 0 ? 3_500 : 1_500;\n    }\n\n    /// @return mode 0 = fallback, 1 = dry, 2 = rain.\n    function weatherState() external view returns (uint8 mode, uint64 observedAt, uint64 validUntil, bytes32 requestId) {\n        WeatherState storage s = _weather();\n        return (block.timestamp >= s.validUntil ? 0 : s.wet ? 2 : 1, s.observedAt, s.validUntil, s.requestId);\n    }\n\n    function weatherDigest(Attestation calldata a) public view returns (bytes32) {\n        HashedAttestation memory h;\n        h.requestId = a.requestId;\n        h.chainId = a.chainId;\n        h.questionHash = a.questionHash;\n        h.answerType = a.answerType;\n        h.answerHash = keccak256(a.answer);\n        h.figure = a.figure;\n        h.fromBlock = a.fromBlock;\n        h.toBlock = a.toBlock;\n        h.blockHash = a.blockHash;\n        h.panelJobId = a.panelJobId;\n        h.panelSize = a.panelSize;\n        h.quorum = a.quorum;\n        h.agreed = a.agreed;\n        h.issuedAt = a.issuedAt;\n        h.expiresAt = a.expiresAt;\n        bytes32 domain = keccak256(abi.encode(\n            DOMAIN_TYPEHASH, keccak256(\"IdentityMD Oracle\"), keccak256(\"2\"), block.chainid, address(this)\n        ));\n        return MessageHashUtils.toTypedDataHash(domain, keccak256(abi.encode(ATTESTATION_TYPEHASH, h)));\n    }\n\n    function _weather() private pure returns (WeatherState storage s) {\n        bytes32 slot = WEATHER_SLOT;\n        assembly (\"memory-safe\") { s.slot := slot }\n    }\n}\n"},"src/legacy/NftRewards.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/// @notice Closed daily pots belong to the wallets that held the NFTs during that day.\n/// @dev No owner withdrawal and no holder enumeration inside pool swaps.\nabstract contract NftRewards is ReentrancyGuard {\n    struct Checkpoint { uint64 time; uint32 units; uint160 integral; }\n    IPoolManager public immutable poolManager;\n    address public immutable hook;\n    uint64 public immutable epochStart;\n    uint256 public constant EPOCH = 1 days;\n    uint256 public constant PAYOUT_GAS = 60_000;\n    mapping(address => Checkpoint[]) private histories;\n    Checkpoint[] private supplyHistory;\n    mapping(uint256 => uint256) public epochPot;\n    mapping(uint256 => mapping(address => uint256)) public paid;\n    uint256 public totalAccrued;\n    uint256 public totalPaid;\n    uint256 public uncollected;\n    uint256 private collecting;\n    address[] public rewardAccounts;\n    mapping(address => bool) private knownAccount;\n\n    error RewardsUnauthorized();\n    error InvalidReward();\n    error EpochOpen();\n    event NftRewardAccrued(uint256 indexed epoch, uint256 amount);\n    event NftRewardPaid(uint256 indexed epoch, address indexed account, uint256 amount);\n    event NftRewardDeferred(uint256 indexed epoch, address indexed account, uint256 amount);\n\n    constructor(IPoolManager manager_, address hook_) {\n        require(address(manager_).code.length != 0 && hook_ != address(0), \"reward config\");\n        poolManager = manager_;\n        hook = hook_;\n        epochStart = uint64(block.timestamp);\n    }\n\n    function currentEpoch() public view returns (uint256) { return (block.timestamp - epochStart) / EPOCH; }\n    function rewardAccountCount() external view returns (uint256) { return rewardAccounts.length; }\n\n    function _checkpoint(Checkpoint[] storage h, uint32 units) private {\n        uint160 integral;\n        uint256 n = h.length;\n        if (n != 0) {\n            Checkpoint memory p = h[n - 1];\n            integral = p.integral + uint160((block.timestamp - p.time) * p.units);\n            if (p.time == block.timestamp) { h[n - 1].units = units; return; }\n        }\n        h.push(Checkpoint(uint64(block.timestamp), units, integral));\n    }\n\n    function _recordOwnerUnits(address account, uint32 units) internal {\n        if (account == address(0)) return;\n        if (!knownAccount[account]) { knownAccount[account] = true; rewardAccounts.push(account); }\n        _checkpoint(histories[account], units);\n    }\n\n    function _recordSupply(uint32 units) internal { _checkpoint(supplyHistory, units); }\n\n    function _integralAt(Checkpoint[] storage h, uint256 time) private view returns (uint256) {\n        uint256 lo; uint256 hi = h.length;\n        while (lo < hi) {\n            uint256 mid = (lo + hi) / 2;\n            if (h[mid].time <= time) lo = mid + 1; else hi = mid;\n        }\n        if (lo == 0) return 0;\n        Checkpoint memory p = h[lo - 1];\n        return p.integral + (time - p.time) * p.units;\n    }\n\n    function holdingSeconds(address account, uint256 epoch) public view returns (uint256) {\n        uint256 start = epochStart + epoch * EPOCH;\n        uint256 end = Math.min(start + EPOCH, block.timestamp);\n        if (end <= start) return 0;\n        return _integralAt(histories[account], end) - _integralAt(histories[account], start);\n    }\n\n    function totalHoldingSeconds(uint256 epoch) public view returns (uint256) {\n        uint256 start = epochStart + epoch * EPOCH;\n        uint256 end = Math.min(start + EPOCH, block.timestamp);\n        if (end <= start) return 0;\n        return _integralAt(supplyHistory, end) - _integralAt(supplyHistory, start);\n    }\n\n    function owed(address account, uint256 epoch) public view returns (uint256) {\n        if (epoch >= currentEpoch()) return 0;\n        uint256 denominator = totalHoldingSeconds(epoch);\n        if (denominator == 0) return 0;\n        uint256 entitlement = Math.mulDiv(epochPot[epoch], holdingSeconds(account, epoch), denominator);\n        return entitlement - paid[epoch][account];\n    }\n\n    /// @dev The hook has already minted exactly this many native-ETH claims here.\n    function recordReward(uint256 amount) external {\n        if (msg.sender != hook) revert RewardsUnauthorized();\n        uint256 n = supplyHistory.length;\n        if (amount == 0 || n == 0 || supplyHistory[n - 1].units == 0) revert InvalidReward();\n        if (poolManager.balanceOf(address(this), 0) < uncollected + amount) revert InvalidReward();\n        epochPot[currentEpoch()] += amount;\n        totalAccrued += amount;\n        uncollected += amount;\n        emit NftRewardAccrued(currentEpoch(), amount);\n    }\n\n    function collectRewards() external nonReentrant { _collect(); }\n\n    function _collect() private {\n        uint256 amount = uncollected;\n        if (amount == 0) return;\n        collecting = amount;\n        uncollected = 0;\n        poolManager.unlock(abi.encode(amount));\n        if (collecting != 0) revert InvalidReward();\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert RewardsUnauthorized();\n        uint256 amount = abi.decode(data, (uint256));\n        if (amount == 0 || amount != collecting) revert InvalidReward();\n        collecting = 0;\n        poolManager.burn(address(this), 0, amount);\n        poolManager.take(Currency.wrap(address(0)), address(this), amount);\n        return \"\";\n    }\n\n    /// @notice Anyone can trigger payment, always to the recorded historical recipient.\n    function payRewards(uint256 epoch, address[] calldata accounts) external nonReentrant {\n        if (epoch >= currentEpoch()) revert EpochOpen();\n        if (accounts.length > 40) revert InvalidReward();\n        _collect();\n        for (uint256 i; i < accounts.length; ++i) {\n            address account = accounts[i];\n            uint256 amount = owed(account, epoch);\n            if (amount == 0) continue;\n            paid[epoch][account] += amount;\n            totalPaid += amount;\n            (bool ok,) = payable(account).call{value: amount, gas: PAYOUT_GAS}(\"\");\n            if (!ok) {\n                paid[epoch][account] -= amount;\n                totalPaid -= amount;\n                emit NftRewardDeferred(epoch, account, amount);\n            } else emit NftRewardPaid(epoch, account, amount);\n        }\n    }\n\n    receive() external payable {\n        if (msg.sender != address(poolManager)) revert RewardsUnauthorized();\n    }\n}\n"},"src/TradeExtensionHost.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol\";\n\nimport {ClausFeeBudget} from \"./ClausFeeBudget.sol\";\n\ninterface IClausGovernor { function owner() external view returns(address); }\n\n/// @notice Replaceable trade programs, isolated from the permanent token/accounting core.\n/// @dev A quote is read-only and bounded. Stateful execution is a separate transaction:\n/// arbitrary CALLs inside an unlocked PoolManager can poison its transient accounting,\n/// so even caught reverts are not a sufficient sandbox for synchronous callbacks.\ncontract TradeExtensionHost {\n    using TransientStateLibrary for IPoolManager;\n    using StateLibrary for IPoolManager;\n    address public constant HOOK = 0x37Bfb8AC7C960E558657871D41Ca70E07e7DbfFf;\n    address public constant TOKEN = 0x1b54E762aa34CF6E28E9C082F2848e28E45DA6b8;\n    IPoolManager public constant MANAGER = IPoolManager(0x000000000004444c5dc75cB358380D2e3dE08A90);\n    uint256 public constant QUOTE_GAS = 80_000;\n    uint24 public constant MAX_RATE = 149_000;\n    address public activeModule;\n    uint256 public nextReceipt;\n    mapping(uint256 => bytes32) public pending;\n    bytes32 private constant EXECUTING = keccak256(\"claus.trade-extension.executing.v1\");\n    struct Trade {\n        uint256 id;\n        address module;\n        address sender;\n        bool buy;\n        int128 amount0;\n        int128 amount1;\n        uint256 feeEth;\n        uint256 moduleFeeEth;\n        uint256 blockNumber;\n        uint256 timestamp;\n        bytes32 dataHash;\n    }\n    event ModuleChanged(address indexed previous,address indexed current);\n    event TradeRecorded(uint256 indexed id,address indexed module,Trade trade);\n    event TradeExecuted(uint256 indexed id,address indexed module);\n    error NotAuthorized();\n    error InvalidModule();\n    error InvalidReceipt();\n    error NotOutsideSwap();\n    error ModuleExecutionFailed();\n    error HookDataTooLarge();\n    error InsufficientQuoteGas();\n\n    function setModule(address module) external {\n        if(msg.sender != IClausGovernor(TOKEN).owner()) revert NotAuthorized();\n        if(module==address(this) || module==HOOK || module==TOKEN || module==address(MANAGER)\n            || (module!=address(0) && module.code.length==0)) revert InvalidModule();\n        address previous=activeModule;activeModule=module;emit ModuleChanged(previous,module);\n    }\n\n    /// @notice Six fee allocations in pips: project, platform, burn, LP, NFT, module.\n    /// Invalid, reverting, oversized or out-of-gas programs use the existing default.\n    /// No allocation is a second fee: their SUM is the single quoted rate.\n    function quote(address sender,bool buy,int256 amountSpecified,bytes calldata data)\n        external view returns(address module,uint256 packed)\n    {\n        // Caller-chosen malformed inputs must not select the fallback fee plan.\n        // Program failures still fall back below; ordinary empty-data trades work.\n        if(data.length>4096) revert HookDataTooLarge();\n        module=activeModule;packed=ClausFeeBudget.DEFAULT_PLAN;\n        if(module==address(0)) return(module,packed);\n        if(gasleft()<QUOTE_GAS+25_000) revert InsufficientQuoteGas();\n        PoolKey memory key=PoolKey(Currency.wrap(address(0)),Currency.wrap(TOKEN),0x800000,1,IHooks(HOOK));\n        (uint160 price,,,)=MANAGER.getSlot0(key.toId());\n        bytes memory input=abi.encodeWithSelector(IClausTradeModule.quote.selector,sender,buy,amountSpecified,price,MANAGER.getLiquidity(key.toId()),data);\n        uint256[6] memory allocations;bool ok;\n        assembly (\"memory-safe\") {\n            ok := staticcall(80000,module,add(input,32),mload(input),allocations,192)\n            ok := and(ok,eq(returndatasize(),192))\n        }\n        if(!ok) return(module,packed);\n        uint256 sum;uint256 proposed;\n        for(uint256 i=0;i<6;i++){\n            uint256 value=allocations[i];\n            if(value>MAX_RATE) return(module,packed);\n            sum+=value;proposed|=value<<((i+1)*24);\n        }\n        // Ignore the entire invalid plan; it can never force a swap revert.\n        if(sum>MAX_RATE)return(module,packed);\n        packed=proposed | (sum+1);\n    }\n\n    /// @dev Only the fixed hook can attest a successfully accounted trade.\n    /// Receipt stays bound to its original module even if a new module is installed.\n    function record(address module,address sender,bool buy,int128 amount0,int128 amount1,uint256 feeEth,uint256 moduleFeeEth,bytes32 dataHash) external {\n        if(msg.sender!=HOOK) revert NotAuthorized();\n        Trade memory trade=Trade(++nextReceipt,module,sender,buy,amount0,amount1,feeEth,moduleFeeEth,block.number,block.timestamp,dataHash);\n        pending[trade.id]=keccak256(abi.encode(trade));emit TradeRecorded(trade.id,module,trade);\n    }\n\n    /// @notice Anyone can deliver an original receipt once, with no authority over funds.\n    /// Failure rolls back only this delivery; the original swap remains completed.\n    /// No value or allowance is granted. The module can use only its own assets.\n    function execute(Trade calldata trade,bytes calldata hookData,uint256 gasLimit) external {\n        bytes32 slot=EXECUTING;uint256 busy;assembly{busy:=tload(slot)}\n        if(busy!=0 || MANAGER.isUnlocked()) revert NotOutsideSwap();\n        if(trade.module==address(0) || hookData.length>4096 || trade.dataHash!=keccak256(hookData) || pending[trade.id]!=keccak256(abi.encode(trade))) revert InvalidReceipt();\n        if(gasLimit<10_000 || gasLimit>5_000_000 || gasleft()<gasLimit+gasLimit/63+30_000) revert ModuleExecutionFailed();\n        delete pending[trade.id];assembly{tstore(slot,1)}\n        bytes memory data=abi.encodeCall(IClausTradeModule.onTrade,(trade,hookData));bool ok;bytes32 result;address module=trade.module;\n        assembly (\"memory-safe\") {\n            let out:=mload(0x40)\n            ok:=call(gasLimit,module,0,add(data,32),mload(data),out,32)\n            ok:=and(ok,eq(returndatasize(),32))\n            result:=mload(out)\n        }\n        if(!ok || result!=bytes32(IClausTradeModule.onTrade.selector)) revert ModuleExecutionFailed();\n        assembly{tstore(slot,0)}emit TradeExecuted(trade.id,trade.module);\n    }\n}\n\ninterface IClausTradeModule {\n    function quote(address sender,bool buy,int256 amountSpecified,uint160 price,uint128 liquidity,bytes calldata data) external view returns(uint256[6] memory allocationPips);\n    function onTrade(TradeExtensionHost.Trade calldata trade,bytes calldata data) external returns(bytes4);\n}\n"},"src/legacy/FomoReserve.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\n\n/// @notice Separate fee-claim account for the existing hook's fixed-recipient buybacks.\n/// @dev No public transfer, approval, arbitrary-call or withdrawal function.\n/// The upgradeable hook remains the authorized ERC-6909 operator.\ncontract FomoReserve {\n    IPoolManager public immutable poolManager;\n    address public immutable hook;\n    address public immutable token;\n    address public immutable recipient;\n\n    error InvalidConfiguration();\n\n    constructor(IPoolManager manager, address hook_, address token_, address recipient_) {\n        if (address(manager).code.length == 0 || hook_.code.length == 0\n            || token_.code.length == 0 || recipient_ == address(0)\n            || recipient_ == hook_ || recipient_ == address(manager) || recipient_ == token_)\n            revert InvalidConfiguration();\n        poolManager = manager;\n        hook = hook_;\n        token = token_;\n        recipient = recipient_;\n        manager.setOperator(hook_, true);\n    }\n}\n"},"src/legacy/FeeProcessor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {SqrtPriceMath} from \"@uniswap/v4-core/src/libraries/SqrtPriceMath.sol\";\nimport {LiquidityAmounts} from \"@uniswap/v4-periphery/src/libraries/LiquidityAmounts.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FomoReserve} from \"./FomoReserve.sol\";\n\ninterface IProcessorEthUsdFeed {\n    function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80);\n}\n\ninterface IProcessorBurnToken {\n    function burn(uint256 amount) external;\n}\n\n/// @notice Fixed-purpose, stateless settlement code for the existing hook proxy.\n/// @dev Mutations are possible only through a self-call of that proxy followed by delegatecall.\ncontract FeeProcessor {\n    using StateLibrary for IPoolManager;\n    IPoolManager public immutable poolManager;\n    LiquidityReserve public immutable liquidityReserve;\n    FomoReserve public immutable fomoReserve;\n    IProcessorEthUsdFeed public immutable ethUsdFeed;\n    address public immutable hook;\n    address public immutable token;\n    address private immutable FOMO_RECIPIENT;\n    uint256 public constant BATCH_USD = 500;\n    uint256 private constant Q96 = 1 << 96;\n    error InvalidContext();\n    error InvalidConfiguration();\n    error EmptyLiquidity();\n    error BatchNotReady();\n    event BuybackBurn(\n        PoolId indexed poolId, address indexed sender, uint256 spentEth, uint256 burnedTokens, uint256 pendingEth\n    );\n    event FomoBuyback(\n        PoolId indexed poolId, address indexed recipient, uint256 spentEth, uint256 sentTokens, uint256 pendingEth\n    );\n    event LiquidityAdded(\n        uint256 indexed tokenId, uint128 liquidity, uint256 ethAdded, uint256 tokensAdded, uint256 buyEth\n    );\n\n    constructor(IPoolManager manager, LiquidityReserve reserve_, FomoReserve fomo_, IProcessorEthUsdFeed feed_) {\n        if (\n            address(reserve_.poolManager()) != address(manager) || address(fomo_.poolManager()) != address(manager)\n                || reserve_.hook() != fomo_.hook() || reserve_.token() != fomo_.token()\n                || address(feed_).code.length == 0\n        ) revert InvalidConfiguration();\n        poolManager = manager;\n        liquidityReserve = reserve_;\n        fomoReserve = fomo_;\n        ethUsdFeed = feed_;\n        hook = reserve_.hook();\n        token = reserve_.token();\n        FOMO_RECIPIENT = fomo_.recipient();\n    }\n    modifier onlyDelegatedSelf() {\n        if (address(this) != hook || msg.sender != hook) revert InvalidContext();\n        _;\n    }\n\n    function _key() private view returns (PoolKey memory) {\n        return PoolKey(Currency.wrap(address(0)), Currency.wrap(token), 0x800000, 1, IHooks(hook));\n    }\n\n    function pendingLiquidityEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), 0);\n    }\n\n    function pendingLiquidityTokens() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), uint256(uint160(token)));\n    }\n\n    function liquidityBatchReady() external view returns (bool) {\n        return _prepareBatch(_key()).price != 0;\n    }\n\n    function executeLiquidity() external onlyDelegatedSelf {\n        _addLiquidity();\n    }\n\n    struct Purchase {\n        uint256 burnBudget;\n        uint256 fomoBudget;\n        uint256 total;\n        uint256 spent;\n        uint256 tokens;\n    }\n\n    function executeBuybacks(address sender) external onlyDelegatedSelf {\n        Purchase memory p;\n        p.burnBudget = poolManager.balanceOf(hook, 0);\n        p.fomoBudget = poolManager.balanceOf(address(fomoReserve), 0);\n        // Keep one wei in each existing claim account. Clearing the balance\n        // makes the next user pay for a zero-to-nonzero storage write.\n        // Dust retains the same owner and purpose; it is not a new charge.\n        if (p.burnBudget != 0) --p.burnBudget;\n        if (p.fomoBudget != 0) --p.fomoBudget;\n        p.total = p.burnBudget + p.fomoBudget;\n        PoolKey memory key = _key();\n        if (p.total == 0 || poolManager.getLiquidity(key.toId()) == 0) return;\n        (uint160 price,,,) = poolManager.getSlot0(key.toId());\n        if (price <= TickMath.MIN_SQRT_PRICE + 1) return;\n        uint160 limit = uint160(uint256(price) * 995 / 1000);\n        if (limit <= TickMath.MIN_SQRT_PRICE) limit = TickMath.MIN_SQRT_PRICE + 1;\n        uint256 maximum = uint256(uint128(type(int128).max));\n        if (p.total > maximum) {\n            p.fomoBudget = FullMath.mulDiv(maximum, p.fomoBudget, p.total);\n            p.burnBudget = maximum - p.fomoBudget;\n            p.total = maximum;\n        }\n        if (p.burnBudget != 0) poolManager.burn(hook, 0, p.burnBudget);\n        if (p.fomoBudget != 0) poolManager.burn(address(fomoReserve), 0, p.fomoBudget);\n        BalanceDelta bought = poolManager.swap(key, SwapParams(true, -int256(p.total), limit), bytes(\"\"));\n        p.spent = uint256(-int256(bought.amount0()));\n        p.tokens = uint256(uint128(bought.amount1()));\n        _distribute(key, sender, p);\n    }\n\n    function _distribute(PoolKey memory key, address sender, Purchase memory p) private {\n        PoolId id = key.toId();\n        uint256 spentFomo = FullMath.mulDiv(p.spent, p.fomoBudget, p.total);\n        uint256 spentBurn = p.spent - spentFomo;\n        if (p.burnBudget > spentBurn) poolManager.mint(hook, 0, p.burnBudget - spentBurn);\n        if (p.fomoBudget > spentFomo) poolManager.mint(address(fomoReserve), 0, p.fomoBudget - spentFomo);\n        uint256 fomoTokens = p.spent == 0 ? 0 : FullMath.mulDiv(p.tokens, spentFomo, p.spent);\n        uint256 burnTokens = p.tokens - fomoTokens;\n        if (burnTokens != 0) {\n            poolManager.take(key.currency1, hook, burnTokens);\n            IProcessorBurnToken(token).burn(burnTokens);\n        }\n        address recipient = FOMO_RECIPIENT;\n        if (fomoTokens != 0) poolManager.take(key.currency1, recipient, fomoTokens);\n        if (p.burnBudget != 0) emit BuybackBurn(\n            id, sender, spentBurn, burnTokens, poolManager.balanceOf(hook, 0)\n        );\n        if (p.fomoBudget != 0) {\n            emit FomoBuyback(\n                id, recipient, spentFomo, fomoTokens, poolManager.balanceOf(address(fomoReserve), 0)\n            );\n        }\n    }\n\n    function batchThresholdWei() public view returns (uint256) {\n        (uint80 round, int256 answer,, uint256 updated, uint80 answered) = ethUsdFeed.latestRoundData();\n        if (\n            answer <= 0 || updated == 0 || updated > block.timestamp || block.timestamp - updated > 2 hours\n                || answered < round\n        ) {\n            return 0;\n        }\n        return FullMath.mulDiv(BATCH_USD * 1e8, 1 ether, uint256(answer));\n    }\n\n    function _tokenValue(uint256 amount, uint160 price) private pure returns (uint256) {\n        return FullMath.mulDiv(FullMath.mulDiv(amount, Q96, price), Q96, price);\n    }\n\n    function _amounts(uint160 price, uint160 lower, uint160 upper, uint128 liquidity)\n        private\n        pure\n        returns (uint256 eth, uint256 tokens)\n    {\n        if (price < upper) {\n            eth = SqrtPriceMath.getAmount0Delta(price > lower ? price : lower, upper, liquidity, true);\n        }\n        if (price > lower) {\n            tokens = SqrtPriceMath.getAmount1Delta(lower, price < upper ? price : upper, liquidity, true);\n        }\n    }\n\n    struct Batch {\n        uint160 price;\n        uint160 lower;\n        uint160 upper;\n        uint256 ethBudget;\n        uint256 oldTokens;\n        uint256 spent;\n        uint256 bought;\n    }\n\n    function _prepareBatch(PoolKey memory key) private view returns (Batch memory b) {\n        uint256 threshold = batchThresholdWei();\n        if (threshold == 0 || poolManager.getLiquidity(key.toId()) == 0) return b;\n        (b.price,,,) = poolManager.getSlot0(key.toId());\n        b.oldTokens = pendingLiquidityTokens();\n        uint256 oldValue = _tokenValue(b.oldTokens, b.price);\n        uint256 ethReserve = pendingLiquidityEth();\n        if (ethReserve < threshold && oldValue < threshold - ethReserve) {\n            b.price = 0;\n            return b;\n        }\n        // Both assets count toward $500; unspent amounts remain earmarked.\n        if (oldValue > threshold) {\n            b.oldTokens = FullMath.mulDiv(b.oldTokens, threshold, oldValue);\n            oldValue = _tokenValue(b.oldTokens, b.price);\n        }\n        b.ethBudget = threshold - oldValue;\n        if (b.ethBudget > ethReserve) b.ethBudget = ethReserve;\n        b.lower = TickMath.getSqrtPriceAtTick(liquidityReserve.tickLower());\n        b.upper = TickMath.getSqrtPriceAtTick(liquidityReserve.tickUpper());\n    }\n\n    function _buyForLiquidity(PoolKey memory key, Batch memory b) private {\n        (uint256 ratioEth, uint256 ratioTokens) = _amounts(b.price, b.lower, b.upper, 1e18);\n        uint256 ratioTokenValue = _tokenValue(ratioTokens, b.price);\n        uint256 oldValue = _tokenValue(b.oldTokens, b.price);\n        uint256 wanted = FullMath.mulDiv(b.ethBudget + oldValue, ratioTokenValue, ratioEth + ratioTokenValue);\n        uint256 buyEth = wanted > oldValue ? wanted - oldValue : 0;\n        if (buyEth > b.ethBudget) buyEth = b.ethBudget;\n        if (buyEth == 0) return;\n        uint160 limit = uint160(uint256(b.price) * 995 / 1000);\n        if (limit <= TickMath.MIN_SQRT_PRICE) limit = TickMath.MIN_SQRT_PRICE + 1;\n        poolManager.burn(address(liquidityReserve), 0, buyEth);\n        BalanceDelta delta = poolManager.swap(key, SwapParams(true, -int256(buyEth), limit), bytes(\"\"));\n        b.spent = uint256(-int256(delta.amount0()));\n        b.bought = uint256(uint128(delta.amount1()));\n        if (b.spent < buyEth) poolManager.mint(address(liquidityReserve), 0, buyEth - b.spent);\n        if (b.bought != 0) poolManager.mint(address(liquidityReserve), uint256(uint160(token)), b.bought);\n    }\n\n    function _addLiquidity() private {\n        PoolKey memory key = _key();\n        Batch memory b = _prepareBatch(key);\n        if (b.price == 0) revert BatchNotReady();\n        _buyForLiquidity(key, b);\n        (b.price,,,) = poolManager.getSlot0(key.toId());\n        uint128 liquidity = LiquidityAmounts.getLiquidityForAmounts(\n            b.price, b.lower, b.upper, b.ethBudget - b.spent, b.oldTokens + b.bought\n        );\n        if (liquidity <= 1) revert EmptyLiquidity();\n        liquidity -= 1;\n        (uint256 ethAmount, uint256 tokenAmount) = _amounts(b.price, b.lower, b.upper, liquidity);\n        if (\n            ethAmount > b.ethBudget - b.spent || tokenAmount > b.oldTokens + b.bought || ethAmount > type(uint128).max\n                || tokenAmount > type(uint128).max\n        ) revert EmptyLiquidity();\n        poolManager.burn(address(liquidityReserve), 0, ethAmount);\n        poolManager.take(key.currency0, address(this), ethAmount);\n        poolManager.burn(address(liquidityReserve), uint256(uint160(token)), tokenAmount);\n        poolManager.take(key.currency1, address(liquidityReserve), tokenAmount);\n        liquidityReserve.increase{value: ethAmount}(liquidity, uint128(ethAmount), uint128(tokenAmount));\n        emit LiquidityAdded(liquidityReserve.tokenId(), liquidity, ethAmount, tokenAmount, b.spent);\n    }\n}\n"},"src/legacy/PoolCapSource.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {IEthUsdFeed} from \"./FeeEfficientHook.sol\";\n\n/// @notice Native-ETH / 18-decimal CLAUS valuation from the fixed official pool.\ncontract PoolCapSource {\n    using StateLibrary for IPoolManager;\n    IPoolManager public immutable manager;\n    PoolId public immutable poolId;\n    IERC20Metadata public immutable token;\n    IEthUsdFeed public immutable feed;\n    uint128 public immutable minimumLiquidity;\n    error InvalidData();\n    constructor(IPoolManager manager_, PoolId id_, IERC20Metadata token_, IEthUsdFeed feed_, uint128 minimum_) {\n        if (address(manager_).code.length == 0 || token_.decimals() != 18 || feed_.decimals() != 8 || minimum_ == 0) revert InvalidData();\n        manager = manager_; poolId = id_; token = token_; feed = feed_; minimumLiquidity = minimum_;\n    }\n    // The ordinary source remains display-only. A price game must explicitly opt in\n    // to participant-influenced outcomes through its separate source implementation.\n    function predictionReady() external pure virtual returns (bool) { return false; }\n    function marketCap() external view returns (uint256) {\n        (uint160 price,,,) = manager.getSlot0(poolId);\n        (uint80 round, int256 usd,, uint256 updated, uint80 answered) = feed.latestRoundData();\n        if (price == 0 || usd <= 0 || updated == 0 || updated > block.timestamp || block.timestamp - updated > 1 hours || answered < round || manager.getLiquidity(poolId) < minimumLiquidity) revert InvalidData();\n        uint256 inverse = FullMath.mulDiv(1 << 96, 1 << 96, price);\n        uint256 ethValue = FullMath.mulDiv(inverse, token.totalSupply(), price);\n        return FullMath.mulDiv(ethValue, uint256(usd), 1 ether);\n    }\n}\n"},"src/legacy/ProjectRevenue.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\n\n/// @notice Every new project-fee claim belongs to the one fixed project wallet.\n/// @dev Deliberately non-upgradeable; an upgraded hook may choose a new vault,\n/// but cannot redirect claims already earned here. Existing old vaults stay intact.\ncontract ProjectRevenue {\n    IPoolManager public immutable poolManager;\n    address public immutable active;\n    error InvalidConfiguration();\n    error InvalidClaim();\n    error NotPoolManager();\n    event RevenueClaimed(address indexed recipient, uint256 amount);\n\n    constructor(IPoolManager manager, address recipient) {\n        if (address(manager).code.length == 0 || recipient == address(0)) revert InvalidConfiguration();\n        poolManager = manager;\n        active = recipient;\n    }\n\n    function treasury() external pure returns (address) {\n        return address(0);\n    }\n\n    function balances() external view returns (uint256 activeAmount, uint256 treasuryAmount) {\n        return (poolManager.balanceOf(address(this), 0), 0);\n    }\n\n    function claimActive(uint256 amount) external {\n        if (amount == 0 || amount > poolManager.balanceOf(address(this), 0)) revert InvalidClaim();\n        poolManager.unlock(abi.encode(amount));\n    }\n\n    function claimTreasury(uint256) external pure {\n        revert InvalidClaim();\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        uint256 amount = abi.decode(data, (uint256));\n        poolManager.burn(address(this), 0, amount);\n        poolManager.take(Currency.wrap(address(0)), active, amount);\n        emit RevenueClaimed(active, amount);\n        return \"\";\n    }\n}\n"},"src/legacy/ClausNftStaking.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {IERC721Receiver} from \"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\n\ninterface IClausNftBinding {\n    function poolManager() external view returns (IPoolManager);\n    function hook() external view returns (address);\n    function token() external view returns (address);\n    function epochStart() external view returns (uint256);\n    function EPOCH() external view returns (uint256);\n    function owed(address account, uint256 epoch) external view returns (uint256);\n    function payRewards(uint256 epoch, address[] calldata accounts) external;\n}\ninterface IClausStakingHook { function nftStaking() external view returns (address); }\n\n/// @notice Existing CLAUS NFT custody with time-weighted daily ETH rewards.\n/// @dev No administrator, transferable receipt, approvals, redemption or arbitrary calls.\n/// Plain ERC721 transferFrom can bypass receiver checks; such unsolicited NFTs are not stakes.\ncontract ClausNftStaking is IERC721Receiver, IUnlockCallback, ReentrancyGuard {\n    struct Checkpoint { uint256 time; uint256 units; uint256 integral; }\n\n    address public constant CLAUS = 0x1b54E762aa34CF6E28E9C082F2848e28E45DA6b8;\n    uint256 public constant EPOCH = 1 days;\n    uint256 public constant PAYOUT_GAS = 60_000;\n    IPoolManager public immutable poolManager;\n    IERC721 public immutable collection;\n    uint256 public immutable startEpoch;\n    uint256 public immutable startsAt;\n    ProjectRevenue public immutable projectRevenue;\n    address public immutable hook;\n    uint256 public immutable epochStart;\n\n    mapping(uint256 => address) public stakerOf;\n    mapping(address => uint256) public stakedBalanceOf;\n    uint256 public totalStaked;\n    mapping(address => uint256[]) private positions;\n    mapping(uint256 => uint256) private positionIndex;\n    mapping(address => Checkpoint[]) private histories;\n    Checkpoint[] private supplyHistory;\n    address[] public rewardAccounts;\n    mapping(address => bool) private knownAccount;\n    mapping(uint256 => uint256) public epochPot;\n    mapping(uint256 => mapping(address => uint256)) public paid;\n    uint256 public totalAccrued;\n    uint256 public totalPaid;\n    uint256 public totalReturnedToOwner;\n    uint256 public uncollected;\n    uint256 public legacyRewardsReceived;\n    uint256 private receivingLegacy;\n    address private expectedStaker;\n    uint256 private expectedToken;\n    uint256 private collecting;\n    uint256 private receiving;\n    uint256 private returning;\n\n    error StakingClosed();\n    error InvalidConfig();\n    error Unauthorized();\n    error InvalidPosition();\n    error InvalidReward();\n    error EpochOpen();\n    event Staked(address indexed account, uint256 indexed tokenId, uint256 units);\n    event Unstaked(address indexed account, uint256 indexed tokenId, uint256 units);\n    event LegacyRewardAccrued(uint256 indexed epoch, uint256 amount);\n    event RewardAccrued(uint256 indexed epoch, uint256 amount);\n    event RewardReturnedToOwner(uint256 amount);\n    event EmptyEpochFinalized(uint256 indexed epoch, uint256 amount);\n    event RewardPaid(uint256 indexed epoch, address indexed account, uint256 amount);\n    event RewardDeferred(uint256 indexed epoch, address indexed account, uint256 amount);\n\n    constructor(IPoolManager manager_, IERC721 collection_, ProjectRevenue project_, address hook_, uint256 startEpoch_) {\n        if (address(manager_).code.length == 0 || address(collection_).code.length == 0\n            || address(project_).code.length == 0 || hook_.code.length == 0) revert InvalidConfig();\n        IClausNftBinding binding = IClausNftBinding(address(collection_));\n        uint256 origin = binding.epochStart();\n        if (address(binding.poolManager()) != address(manager_) || binding.hook() != hook_\n            || binding.token() != CLAUS || binding.EPOCH() != EPOCH || origin == 0 || origin > block.timestamp\n            || address(project_.poolManager()) != address(manager_) || project_.active() == address(0)\n            || startEpoch_ < (block.timestamp - origin) / EPOCH\n            || startEpoch_ > (type(uint256).max - origin) / EPOCH) revert InvalidConfig();\n        poolManager = manager_;\n        collection = collection_;\n        projectRevenue = project_;\n        hook = hook_;\n        epochStart = origin;\n        startEpoch = startEpoch_;\n        startsAt = origin + startEpoch_ * EPOCH;\n    }\n\n    function stakingOpen() public view returns (bool) {\n        if (block.timestamp < startsAt) return false;\n        // New stakes must never silently enter a disconnected reward vault.\n        try IClausStakingHook(hook).nftStaking() returns (address vault) { return vault == address(this); }\n        catch { return false; }\n    }\n\n    function stakedTokensOf(address account) external view returns (uint256[] memory) { return positions[account]; }\n    function rewardAccountCount() external view returns (uint256) { return rewardAccounts.length; }\n    function currentEpoch() public view returns (uint256) { return (block.timestamp - epochStart) / EPOCH; }\n    /// @notice Compatibility getter: empty-participation rewards are returned, never held unallocated.\n    function unallocated() external pure returns (uint256) { return 0; }\n\n    function stake(uint256 tokenId) external nonReentrant {\n        if (!stakingOpen()) revert StakingClosed();\n        if (stakerOf[tokenId] != address(0) || collection.ownerOf(tokenId) != msg.sender) revert Unauthorized();\n        expectedStaker = msg.sender;\n        expectedToken = tokenId;\n        collection.safeTransferFrom(msg.sender, address(this), tokenId);\n        if (expectedStaker != address(0) || collection.ownerOf(tokenId) != address(this)\n            || collection.getApproved(tokenId) != address(0)) revert InvalidPosition();\n        stakerOf[tokenId] = msg.sender;\n        positionIndex[tokenId] = positions[msg.sender].length;\n        positions[msg.sender].push(tokenId);\n        _setStakes(msg.sender, stakedBalanceOf[msg.sender] + 1, totalStaked + 1);\n        emit Staked(msg.sender, tokenId, 1);\n    }\n\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata)\n        external returns (bytes4)\n    {\n        if (msg.sender != address(collection) || operator != address(this)\n            || expectedStaker == address(0) || from != expectedStaker || tokenId != expectedToken)\n            revert InvalidPosition();\n        expectedStaker = address(0);\n        delete expectedToken;\n        return IERC721Receiver.onERC721Received.selector;\n    }\n\n    /// @notice Returns principal without collecting rewards or opening the PoolManager.\n    function unstake(uint256 tokenId) external nonReentrant {\n        if (stakerOf[tokenId] != msg.sender) revert Unauthorized();\n        delete stakerOf[tokenId];\n        uint256 index = positionIndex[tokenId];\n        uint256 last = positions[msg.sender][positions[msg.sender].length - 1];\n        positions[msg.sender][index] = last;\n        positionIndex[last] = index;\n        positions[msg.sender].pop();\n        delete positionIndex[tokenId];\n        _setStakes(msg.sender, stakedBalanceOf[msg.sender] - 1, totalStaked - 1);\n        // The recorded staker may be a contract that does not implement ERC721Receiver.\n        collection.transferFrom(address(this), msg.sender, tokenId);\n        emit Unstaked(msg.sender, tokenId, 1);\n    }\n\n    function _setStakes(address account, uint256 units, uint256 supply) private {\n        if (!knownAccount[account]) { knownAccount[account] = true; rewardAccounts.push(account); }\n        _checkpoint(histories[account], units);\n        _checkpoint(supplyHistory, supply);\n        stakedBalanceOf[account] = units;\n        totalStaked = supply;\n    }\n\n    function _checkpoint(Checkpoint[] storage history, uint256 units) private {\n        uint256 integral;\n        uint256 n = history.length;\n        if (n != 0) {\n            Checkpoint storage previous = history[n - 1];\n            // Preserve historical NFT-seconds across stake, withdrawal and restake.\n            integral = previous.integral + (block.timestamp - previous.time) * previous.units;\n            if (previous.time == block.timestamp) { previous.units = units; return; }\n        }\n        history.push(Checkpoint(block.timestamp, units, integral));\n    }\n\n    function _integralAt(Checkpoint[] storage history, uint256 time) private view returns (uint256) {\n        uint256 lo;\n        uint256 hi = history.length;\n        while (lo < hi) {\n            uint256 mid = lo + (hi - lo) / 2;\n            if (history[mid].time <= time) lo = mid + 1; else hi = mid;\n        }\n        if (lo == 0) return 0;\n        Checkpoint storage point = history[lo - 1];\n        return point.integral + (time - point.time) * point.units;\n    }\n\n    function _holdingSeconds(Checkpoint[] storage history, uint256 epoch) private view returns (uint256) {\n        // Also makes arbitrary far-future epoch queries safe from multiplication overflow.\n        if (epoch > currentEpoch()) return 0;\n        uint256 start = epochStart + epoch * EPOCH;\n        uint256 end = start + Math.min(EPOCH, block.timestamp - start);\n        return _integralAt(history, end) - _integralAt(history, start);\n    }\n\n    function holdingSeconds(address account, uint256 epoch) public view returns (uint256) {\n        return _holdingSeconds(histories[account], epoch);\n    }\n\n    function totalHoldingSeconds(uint256 epoch) public view returns (uint256) {\n        return _holdingSeconds(supplyHistory, epoch);\n    }\n\n    function owed(address account, uint256 epoch) public view returns (uint256) {\n        if (epoch >= currentEpoch()) return 0;\n        uint256 denominator = totalHoldingSeconds(epoch);\n        if (denominator == 0) return 0;\n        uint256 legacy = IClausNftBinding(address(collection)).owed(address(this), epoch);\n        return Math.mulDiv(epochPot[epoch] + legacy, holdingSeconds(account, epoch), denominator) - paid[epoch][account];\n    }\n\n    /// @dev Called only after the immutable hook mints native claims to this vault.\n    function recordReward(uint256 amount) external nonReentrant {\n        if (msg.sender != hook) revert Unauthorized();\n        if (!stakingOpen()) revert StakingClosed();\n        if (amount == 0 || poolManager.balanceOf(address(this), 0) < uncollected + amount) revert InvalidReward();\n        totalAccrued += amount; // Accrued = epoch pots (including paid rewards) + returned owner rewards.\n        if (totalStaked == 0) {\n            totalReturnedToOwner += amount;\n            if (!poolManager.transfer(address(projectRevenue), 0, amount)) revert InvalidReward();\n            emit RewardReturnedToOwner(amount);\n        } else {\n            uncollected += amount;\n            uint256 epoch = currentEpoch();\n            epochPot[epoch] += amount;\n            emit RewardAccrued(epoch, amount);\n        }\n    }\n\n    function collectRewards() external nonReentrant { _collect(); }\n\n    /// @notice Returns fees from a closed epoch with no elapsed participation to the fixed project vault.\n    /// @dev A stake, swap and unstake at the same timestamp has no NFT-seconds.\n    /// Clearing the pot makes repeated calls harmless; earned epochs are immutable.\n    function finalizeEmptyEpoch(uint256 epoch) public nonReentrant {\n        if (epoch >= currentEpoch()) revert EpochOpen();\n        if (totalHoldingSeconds(epoch) != 0) revert InvalidReward();\n        uint256 amount = epochPot[epoch];\n        if (amount == 0) return;\n        epochPot[epoch] = 0;\n        totalReturnedToOwner += amount;\n        uint256 claims = Math.min(amount, uncollected);\n        uncollected -= claims;\n        if (claims != 0 && !poolManager.transfer(address(projectRevenue), 0, claims)) revert InvalidReward();\n        uint256 liquid = amount - claims;\n        if (liquid != 0) {\n            returning = liquid;\n            uint256 beforeBalance = address(this).balance;\n            poolManager.unlock(abi.encode(liquid));\n            if (returning != 0 || collecting != 0 || receiving != 0\n                || address(this).balance + liquid != beforeBalance) revert InvalidReward();\n        }\n        emit EmptyEpochFinalized(epoch, amount);\n    }\n\n    function _collect() private {\n        uint256 amount = uncollected;\n        if (amount == 0) return;\n        collecting = amount;\n        uncollected = 0;\n        uint256 beforeBalance = address(this).balance;\n        poolManager.unlock(abi.encode(amount));\n        if (collecting != 0 || receiving != 0 || returning != 0\n            || address(this).balance != beforeBalance + amount)\n            revert InvalidReward();\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert Unauthorized();\n        if (data.length != 32) revert InvalidReward();\n        uint256 amount = abi.decode(data, (uint256));\n        if (amount == 0 || (collecting != 0 && returning != 0)) revert InvalidReward();\n        if (returning != 0) {\n            if (amount != returning) revert InvalidReward();\n            returning = 0;\n            poolManager.sync(Currency.wrap(address(0)));\n            if (poolManager.settle{value: amount}() != amount) revert InvalidReward();\n            poolManager.mint(address(projectRevenue), 0, amount);\n            return \"\";\n        }\n        if (amount != collecting) revert InvalidReward();\n        collecting = 0;\n        poolManager.burn(address(this), 0, amount);\n        receiving = amount;\n        poolManager.take(Currency.wrap(address(0)), address(this), amount);\n        if (receiving != 0) revert InvalidReward();\n        return \"\";\n    }\n\n    /// @notice Permissionless trigger; recipients can only be historical recorded accounts.\n    function payRewards(uint256 epoch, address[] calldata accounts) external nonReentrant {\n        if (epoch >= currentEpoch()) revert EpochOpen();\n        if (accounts.length > 40) revert InvalidReward();\n        _syncLegacyRewards(epoch);\n        _collect();\n        for (uint256 i; i < accounts.length; ++i) {\n            address account = accounts[i];\n            uint256 amount = owed(account, epoch);\n            if (amount == 0) continue;\n            paid[epoch][account] += amount;\n            totalPaid += amount;\n            (bool ok,) = payable(account).call{value: amount, gas: PAYOUT_GAS}(\"\");\n            if (!ok) {\n                paid[epoch][account] -= amount;\n                totalPaid -= amount;\n                emit RewardDeferred(epoch, account, amount);\n            } else emit RewardPaid(epoch, account, amount);\n        }\n    }\n\n    // Custody still earns ownership-time rewards in the original collection's transition round.\n    // Pull only this vault's exact entitlement and include it in the same round's staker pot.\n    // The original collection marks it paid before its bounded ETH callback.\n    function _syncLegacyRewards(uint256 epoch) private {\n        uint256 amount = IClausNftBinding(address(collection)).owed(address(this), epoch);\n        if (amount == 0 || totalHoldingSeconds(epoch) == 0) return;\n        uint256 beforeBalance = address(this).balance;\n        receivingLegacy = amount;\n        address[] memory accounts = new address[](1);\n        accounts[0] = address(this);\n        IClausNftBinding(address(collection)).payRewards(epoch, accounts);\n        if (receivingLegacy != 0 || address(this).balance != beforeBalance + amount) revert InvalidReward();\n        legacyRewardsReceived += amount;\n        totalAccrued += amount;\n        epochPot[epoch] += amount;\n        emit LegacyRewardAccrued(epoch, amount);\n    }\n\n    receive() external payable {\n        if (msg.sender == address(collection)) {\n            if (msg.value == 0 || msg.value != receivingLegacy) revert InvalidReward();\n            receivingLegacy = 0;\n            return;\n        }\n        if (msg.sender != address(poolManager)) revert Unauthorized();\n        if (msg.value == 0 || msg.value != receiving) revert InvalidReward();\n        receiving = 0;\n    }\n}\n"},"src/legacy/MarketCapOracle.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\ninterface ICapSource { function marketCap() external view returns (uint256); }\ninterface IPredictionCapSource { function predictionReady() external view returns (bool); }\ninterface IObservationScheduler { function oracle() external view returns (address); }\n\n/// @notice Time average of recorded USD capitalization, scaled by 1e8.\n/// @dev Bounded observation gaps are mandatory. Missing coverage produces no result.\ncontract MarketCapOracle {\n    uint64 public constant MAX_GAP = 120;\n    uint256 public constant SOURCE_READ_GAS = 60_000;\n    ICapSource public immutable source;\n    address private immutable installer;\n    address public scheduler;\n    struct Observation { uint64 time; uint192 cumulative; uint128 cap; uint64 invalidThrough; bool valid; }\n    // Append-only: settling late must never erase a winner's recorded price window.\n    Observation[] private observations;\n    // Eight checked 32-bit reference counts per slot; overlapping markets share each minute.\n    mapping(uint64 => uint256) private scheduledMinuteCounts;\n\n    constructor(ICapSource source_) { require(address(source_).code.length != 0); source = source_; installer = msg.sender; }\n\n    function bindScheduler(address market) external {\n        require(msg.sender == installer && scheduler == address(0) && market.code.length != 0);\n        require(IObservationScheduler(market).oracle() == address(this));\n        scheduler = market;\n    }\n    function schedule(uint64 start, uint64 end) external {\n        _changeWindow(start, end, true);\n    }\n    function cancel(uint64 start, uint64 end) external {\n        _changeWindow(start, end, false);\n    }\n    function _changeWindow(uint64 start, uint64 end, bool adding) private {\n        require(msg.sender == scheduler && start < end && end - start <= 1 hours);\n        uint64 first = start / 60; uint64 last = end / 60;\n        while (first <= last) {\n            uint64 word = first / 8; uint64 stop = last < word * 8 + 7 ? last : word * 8 + 7;\n            uint256 packed = scheduledMinuteCounts[word];\n            for (uint64 minute = first; minute <= stop; ++minute) {\n                uint256 shift = (minute % 8) * 32;\n                uint256 references = uint32(packed >> shift);\n                require(adding ? references < type(uint32).max : references != 0);\n                uint256 next = adding ? references + 1 : references - 1;\n                packed = (packed & ~(uint256(type(uint32).max) << shift)) | (next << shift);\n            }\n            scheduledMinuteCounts[word] = packed;\n            first = stop + 1;\n        }\n    }\n    function needsObservation() public view returns (bool) {\n        uint64 minute = uint64(block.timestamp / 60);\n        return uint32(scheduledMinuteCounts[minute / 8] >> ((minute % 8) * 32)) != 0;\n    }\n    function checkpointIfNeeded() external returns (bool) { return needsObservation() ? checkpoint() : false; }\n    function count() external view returns (uint256) { return observations.length; }\n    function current() public view returns (bool valid, uint256 value) {\n        // Leave enough gas to record an invalid interval even if the source exhausts its call.\n        try source.marketCap{gas: SOURCE_READ_GAS}() returns (uint256 cap) { if (cap > 0 && cap <= 1e22) return (true, cap); } catch {}\n    }\n    /// @dev A source must opt in explicitly. This signal is not proof of economic safety.\n    function predictionReady() external view returns (bool) {\n        try IPredictionCapSource(address(source)).predictionReady() returns (bool ready) { return ready; } catch { return false; }\n    }\n\n    function checkpoint() public returns (bool valid) {\n        uint256 value; (valid, value) = current();\n        uint256 length = observations.length;\n        if (length == 0) {\n            if (!valid) return false;\n            observations.push(Observation(uint64(block.timestamp), 0, uint128(value), 0, true)); return true;\n        }\n        uint256 previous = length - 1;\n        Observation memory p = observations[previous];\n        uint64 time = uint64(block.timestamp);\n        uint64 invalid = !valid || !p.valid || time - p.time > MAX_GAP ? time : p.invalidThrough;\n        if (p.invalidThrough > invalid) invalid = p.invalidThrough;\n        Observation memory n = Observation(time, uint192(uint256(p.cumulative) + uint256(p.cap) * (time - p.time)), valid ? uint128(value) : p.cap, invalid, valid);\n        if (time == p.time) { observations[previous] = n; return valid; }\n        observations.push(n);\n    }\n\n    function latest() external view returns (Observation memory) { require(observations.length != 0); return _at(observations.length - 1); }\n    function average(uint64 start, uint64 end) external view returns (bool valid, uint256 capUsd) {\n        uint256 length = observations.length;\n        if (start >= end || length < 2 || _at(0).time > start || _at(length - 1).time < end) return (false, 0);\n        (uint256 a,) = _cumulative(start); (uint256 b, uint64 invalidThrough) = _cumulative(end);\n        if (invalidThrough > start) return (false, 0);\n        return (true, (b - a) / (end - start));\n    }\n    function _cumulative(uint64 time) private view returns (uint256 value, uint64 invalidThrough) {\n        uint256 lo; uint256 hi = observations.length - 1;\n        while (lo < hi) { uint256 mid = (lo + hi + 1) / 2; if (_at(mid).time <= time) lo = mid; else hi = mid - 1; }\n        Observation memory p = _at(lo); invalidThrough = p.invalidThrough;\n        if (p.time < time) invalidThrough = _at(lo + 1).invalidThrough;\n        return (uint256(p.cumulative) + uint256(p.cap) * (time - p.time), invalidThrough);\n    }\n    function _at(uint256 logical) private view returns (Observation memory) { return observations[logical]; }\n}\n"},"src/legacy/PlatformRevenue.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\n\n/// @notice Separately provable canonical and additional platform credits with one fixed payout destination.\n/// @dev No owner, upgrades, delegated spending or arbitrary recipient. Existing credits survive hook replacement.\ncontract PlatformRevenue {\n    IPoolManager public immutable poolManager;\n    address public immutable beneficiary;\n    address public immutable graphFactory;\n    address public hook;\n    uint256 public canonicalPlatformBalance;\n    uint256 public additionalPlatformBalance;\n    error InvalidConfiguration();\n    error InvalidClaim();\n    error NotPoolManager();\n    error NotHook();\n    event Allocated(uint256 canonicalAmount, uint256 additionalAmount);\n    event Claimed(address indexed beneficiary, bool canonical, uint256 amount);\n\n    constructor(IPoolManager manager, address beneficiary_, address factory_) {\n        if (address(manager).code.length == 0 || beneficiary_ == address(0) || factory_.code.length == 0) {\n            revert InvalidConfiguration();\n        }\n        poolManager = manager;\n        beneficiary = beneficiary_;\n        graphFactory = factory_;\n    }\n\n    function initialize(address hook_) external {\n        if (msg.sender != graphFactory || hook != address(0) || hook_.code.length == 0) revert InvalidConfiguration();\n        hook = hook_;\n    }\n\n    function balance() public view returns (uint256) {\n        return poolManager.balanceOf(address(this), 0);\n    }\n\n    function recordAllocation(uint256 canonicalAmount, uint256 additionalAmount) external {\n        if (msg.sender != hook) revert NotHook();\n        if (balance() < canonicalPlatformBalance + additionalPlatformBalance + canonicalAmount + additionalAmount) {\n            revert InvalidConfiguration();\n        }\n        canonicalPlatformBalance += canonicalAmount;\n        additionalPlatformBalance += additionalAmount;\n        emit Allocated(canonicalAmount, additionalAmount);\n    }\n\n    function unassignedBalance() public view returns (uint256) {\n        return balance() - canonicalPlatformBalance - additionalPlatformBalance;\n    }\n\n    function claimUnassigned(uint256 amount) external {\n        if (amount == 0 || amount > unassignedBalance()) revert InvalidClaim();\n        poolManager.unlock(abi.encode(uint8(2), amount));\n    }\n\n    function claimCanonical(uint256 amount) external {\n        _claim(true, amount);\n    }\n\n    function claimAdditional(uint256 amount) external {\n        _claim(false, amount);\n    }\n\n    function _claim(bool canonical, uint256 amount) private {\n        uint256 available = canonical ? canonicalPlatformBalance : additionalPlatformBalance;\n        if (amount == 0 || amount > available) revert InvalidClaim();\n        if (canonical) canonicalPlatformBalance -= amount;\n        else additionalPlatformBalance -= amount;\n        poolManager.unlock(abi.encode(canonical ? uint8(0) : uint8(1), amount));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        (uint8 kind, uint256 amount) = abi.decode(data, (uint8, uint256));\n        poolManager.burn(address(this), 0, amount);\n        poolManager.take(Currency.wrap(address(0)), beneficiary, amount);\n        emit Claimed(beneficiary, kind == 0, amount);\n        return \"\";\n    }\n}\n"},"src/legacy/FeeEfficientHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeProcessor} from \"./FeeProcessor.sol\";\n\nimport {ArenaTide} from \"./ArenaTide.sol\";\n\nimport {IMDWeather} from \"./IMDWeather.sol\";\n\nimport {FomoReserve} from \"./FomoReserve.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {HookBase} from \"./HookBase.sol\";\nimport {FeeMath} from \"./FeeMath.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"./PlatformRevenue.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {BeforeSwapDelta, toBeforeSwapDelta} from \"@uniswap/v4-core/src/types/BeforeSwapDelta.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\nimport {SafeCast} from \"@uniswap/v4-core/src/libraries/SafeCast.sol\";\n\ninterface ILaunchTokenOwner {\n    function owner() external view returns (address);\n}\n\ninterface IEthUsdFeed {\n    function decimals() external view returns (uint8);\n    function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80);\n}\n\n/// @notice Fee accounting and market signals for the existing CLAUS pool.\n/// @dev A fixed processor shares the burn/Fomo purchase; LP runs outside user swaps.\n/// Existing namespaces, claim owners, destinations and weather allocations are preserved.\ncontract FeeEfficientHook is HookBase, IMDWeather, ArenaTide {\n    function LIQUIDITY_FEE_PIPS() public view virtual returns (uint24) {\n        return 5_000 - BURN_FEE_PIPS();\n    }\n    uint256 public constant BATCH_USD = 500;\n    FeeProcessor public immutable processor;\n    uint256 public constant BUYBACK_GAS_LIMIT = 300_000;\n    error InsufficientBuybackGas();\n    error InvalidProcessing();\n    event BuybackDeferred();\n    LiquidityReserve public immutable liquidityReserve;\n    IEthUsdFeed public immutable ethUsdFeed;\n    event LiquidityFeeAccrued(uint256 grossEth, uint256 liquidityEth);\n    event LiquidityAdded(\n        uint256 indexed tokenId, uint128 liquidity, uint256 ethAdded, uint256 tokensAdded, uint256 buyEth\n    );\n    error OnlySelf();\n\n    function BURN_FEE_PIPS() public view virtual returns (uint24) {\n        return weatherBurnFeePips();\n    }\n    function WALLET_FEE_PIPS() public view virtual returns (uint24) { return 13_500; }\n    function FOMO_FEE_PIPS() public view virtual returns (uint24) { return 1_500; }\n    FomoReserve public immutable fomoReserve;\n    event FomoFeeAccrued(uint256 grossEth, uint256 fomoEth);\n    event FomoBuyback(\n        PoolId indexed poolId, address indexed recipient, uint256 spentEth, uint256 sentTokens, uint256 pendingEth\n    );\n    event ProjectFeeSplit(uint256 grossEth, uint256 walletEth, uint256 burnEth);\n    event BuybackBurn(\n        PoolId indexed poolId, address indexed sender, uint256 spentEth, uint256 burnedTokens, uint256 pendingEth\n    );\n    using SafeCast for uint256;\n\n    address private immutable SELF = address(this);\n    address private immutable POOL_TOKEN;\n    // Dedicated unstructured storage namespace; future versions must preserve or explicitly migrate it.\n    bytes32 private constant LAUNCH_SLOT = keccak256(\"test.hook.initial-launch.v1\");\n\n    struct LaunchState {\n        address initializer;\n        address token;\n        uint160 openingPrice;\n        int24 tickSpacing;\n        bool poolInitialized;\n        address feeRecipient;\n    }\n\n    error InvalidInitialization();\n    error InvalidPool();\n    error PartialNativeFill();\n    error PartialTokenOutput();\n    error NotFeeRecipient();\n    error InvalidFeeClaim();\n\n    event ProjectFeeAccrued(\n        PoolId indexed poolId, address indexed sender, bool exactInput, uint256 grossEth, uint256 feeEth\n    );\n    event ProjectFeesClaimed(address indexed recipient, uint256 amount);\n\n    ProjectRevenue public immutable projectRevenue;\n    PlatformRevenue public immutable platformRevenue;\n\n    constructor(\n        IPoolManager manager,\n        ProjectRevenue project_,\n        PlatformRevenue platform_,\n        LiquidityReserve reserve_,\n        IEthUsdFeed feed_,\n        FomoReserve fomo_,\n        address attester_,\n        bytes32 questionHash_,\n        FeeProcessor processor_\n    ) HookBase(manager) IMDWeather(attester_, questionHash_) {\n        if (address(project_.poolManager()) != address(manager) || address(platform_.poolManager()) != address(manager))\n        {\n            revert InvalidInitialization();\n        }\n        if (address(reserve_.poolManager()) != address(manager) || feed_.decimals() != 8) {\n            revert InvalidInitialization();\n        }\n        if (\n            address(fomo_.poolManager()) != address(manager) || fomo_.hook() != reserve_.hook()\n                || fomo_.token() != reserve_.token()\n        ) revert InvalidInitialization();\n        if (\n            processor_.hook() != reserve_.hook() || address(processor_.poolManager()) != address(manager)\n                || address(processor_.liquidityReserve()) != address(reserve_)\n                || address(processor_.fomoReserve()) != address(fomo_)\n                || address(processor_.ethUsdFeed()) != address(feed_)\n        ) revert InvalidInitialization();\n        POOL_TOKEN = reserve_.token();\n        processor = processor_;\n        fomoReserve = fomo_;\n        liquidityReserve = reserve_;\n        ethUsdFeed = feed_;\n        projectRevenue = project_;\n        platformRevenue = platform_;\n    }\n\n    function initialize(address initializer, address token, int24 tickSpacing, uint160 openingPrice) external {\n        LaunchState storage state = _launch();\n        if (\n            address(this) == SELF || state.initializer != address(0) || initializer == address(0)\n                || token != POOL_TOKEN || token.code.length == 0 || tickSpacing <= 0 || openingPrice == 0\n        ) revert InvalidInitialization();\n        state.initializer = initializer;\n        state.token = token;\n        state.tickSpacing = tickSpacing;\n        state.openingPrice = openingPrice;\n        state.feeRecipient = ILaunchTokenOwner(token).owner();\n        if (state.feeRecipient == address(0) || state.feeRecipient != projectRevenue.active()) {\n            revert InvalidInitialization();\n        }\n    }\n\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 price)\n        external\n        override\n        onlyPoolManager\n        returns (bytes4)\n    {\n        LaunchState storage state = _launch();\n        if (\n            state.initializer == address(0) || state.poolInitialized || sender != state.initializer\n                || Currency.unwrap(key.currency0) != address(0) || Currency.unwrap(key.currency1) != state.token\n                || key.tickSpacing != state.tickSpacing || key.fee != LPFeeLibrary.DYNAMIC_FEE_FLAG\n                || address(key.hooks) != address(this) || price != state.openingPrice\n        ) revert InvalidInitialization();\n        state.poolInitialized = true;\n        return IHooks.beforeInitialize.selector;\n    }\n\n    function afterInitialize(address, PoolKey calldata key, uint160, int24)\n        external\n        override\n        onlyPoolManager\n        returns (bytes4)\n    {\n        poolManager.updateDynamicLPFee(key, 0);\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)\n        external\n        override\n        onlyPoolManager\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        _requirePool(key);\n        _beforeSwapExtension(sender, key, params, hookData);\n        _snapshotProtocol(params.zeroForOne ? key.currency0 : key.currency1);\n        uint256 fee;\n        if (_nativeSpecified(params)) {\n            uint256 requested = _specifiedAmount(params);\n            fee = params.amountSpecified < 0 ? FeeMath.fromGross(requested) : FeeMath.fromNet(requested);\n            // Accrual is deferred until the complete swap and fee ceiling are checked.\n        }\n        return (IHooks.beforeSwap.selector, toBeforeSwapDelta(fee.toInt128(), 0), LPFeeLibrary.OVERRIDE_FEE_FLAG);\n    }\n\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external override onlyPoolManager returns (bytes4, int128) {\n        _requirePool(key);\n        int128 returnedFee = _settleFee(sender, key, params, delta);\n        // Rising Tide is retired. Preserve its stored history without recording new rounds.\n        if (_processBuybacksInSwap() && (pendingBurnEth() != 0 || pendingFomoEth() != 0)) {\n            // Make estimation include the work. Unused gas is returned, not charged.\n            if (gasleft() < BUYBACK_GAS_LIMIT + 60_000) revert InsufficientBuybackGas();\n            try this.processBuybacksDuringSwap{gas: BUYBACK_GAS_LIMIT}(sender) {}\n            catch {\n                emit BuybackDeferred();\n            }\n        }\n        _afterFeeProcessing(sender);\n        _checkpointPredictions();\n        _afterSwapExtension(sender, key, params, delta, hookData);\n        return (IHooks.afterSwap.selector, returnedFee);\n    }\n\n    function _processBuybacksInSwap() internal pure virtual returns (bool) { return true; }\n\n    /// @dev Default no-op; extensions must preserve ordinary routing and accounting.\n    function _beforeSwapExtension(address, PoolKey calldata, SwapParams calldata, bytes calldata) internal virtual {}\n\n    function _afterSwapExtension(address, PoolKey calldata, SwapParams calldata, BalanceDelta, bytes calldata)\n        internal virtual {}\n\n    /// @dev Optional isolated extension, after the existing fees and buybacks.\n    function _afterFeeProcessing(address) internal virtual {}\n\n    /// @dev Optional observation extension. Existing implementations add no work.\n    function _checkpointPredictions() internal virtual {}\n\n    function _settleFee(address sender, PoolKey calldata key, SwapParams calldata params, BalanceDelta delta)\n        private\n        returns (int128 returnedFee)\n    {\n        bool exactInput = params.amountSpecified < 0;\n        if (!exactInput && params.zeroForOne && int256(delta.amount1()) != params.amountSpecified) {\n            revert PartialTokenOutput();\n        }\n        int128 ethDelta = delta.amount0();\n        uint256 ethAmount = ethDelta < 0 ? uint256(-int256(ethDelta)) : uint256(int256(ethDelta));\n        uint256 fee;\n        uint256 gross;\n        if (_nativeSpecified(params)) {\n            uint256 requested = _specifiedAmount(params);\n            fee = exactInput ? FeeMath.fromGross(requested) : FeeMath.fromNet(requested);\n            uint256 expected = exactInput ? requested - fee : requested + fee;\n            if (ethAmount != expected) revert PartialNativeFill();\n            gross = exactInput ? requested : expected;\n        } else {\n            fee = exactInput ? FeeMath.fromGross(ethAmount) : FeeMath.fromNet(ethAmount);\n            gross = exactInput ? ethAmount : ethAmount + fee;\n            returnedFee = fee.toInt128();\n        }\n        _checkTotalTax(key, params, delta, gross, fee);\n        _accrue(gross, fee);\n        emit ProjectFeeAccrued(_calldataPoolId(key), sender, exactInput, gross, fee);\n        return returnedFee;\n    }\n\n    function pendingBurnEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(this), 0);\n    }\n\n    function pendingFomoEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(fomoReserve), 0);\n    }\n\n    function fomoRecipient() external view returns (address) {\n        return fomoReserve.recipient();\n    }\n\n    function feeRecipient() external view returns (address) {\n        return _launch().feeRecipient;\n    }\n\n    function projectFeeBalance() public view returns (uint256) {\n        (uint256 activeAmount,) = projectRevenue.balances();\n        return activeAmount;\n    }\n\n    function collectProjectFees(uint256 amount) external {\n        if (msg.sender != _launch().feeRecipient) revert NotFeeRecipient();\n        projectRevenue.claimActive(amount);\n    }\n\n    event FeeAllocation(uint256 grossEth, uint256 projectEth, uint256 platformEth);\n\n    event PlatformFeeAllocation(uint256 grossEth, uint256 canonicalEth, uint256 additionalEth);\n\n    function _accrue(uint256 gross, uint256 totalFee) internal virtual {\n        uint256 project = FeeMath.projectFromGross(gross);\n        uint24 burnPips = BURN_FEE_PIPS();\n        uint256 burnEth = FullMath.mulDiv(gross, burnPips, 1_000_000);\n        uint256 liquidityEth = FullMath.mulDiv(gross, LIQUIDITY_FEE_PIPS(), 1_000_000);\n        uint256 fomoEth = FullMath.mulDiv(gross, FOMO_FEE_PIPS(), 1_000_000);\n        uint256 walletEth = project - burnEth - liquidityEth - fomoEth;\n        uint256 platform = totalFee - project;\n        if (walletEth != 0) poolManager.mint(address(projectRevenue), 0, walletEth);\n        if (burnEth != 0) poolManager.mint(address(this), 0, burnEth);\n        if (liquidityEth != 0) poolManager.mint(address(liquidityReserve), 0, liquidityEth);\n        emit ProjectFeeSplit(gross, walletEth, burnEth);\n        emit LiquidityFeeAccrued(gross, liquidityEth);\n        if (fomoEth != 0) poolManager.mint(address(fomoReserve), 0, fomoEth);\n        emit FomoFeeAccrued(gross, fomoEth);\n        if (platform != 0) poolManager.mint(address(platformRevenue), 0, platform);\n        uint256 canonical = gross / 1000;\n        platformRevenue.recordAllocation(canonical, platform - canonical);\n        emit FeeAllocation(gross, project, platform);\n        emit PlatformFeeAllocation(gross, canonical, platform - canonical);\n    }\n\n    bytes32 private constant PROTOCOL_SNAPSHOT = keccak256(\"claus.protected.protocol-snapshot.v1\");\n    error TotalTaxExceeded();\n    function _snapshotProtocol(Currency input) private {\n        uint256 value=poolManager.protocolFeesAccrued(input);\n        bytes32 slot=PROTOCOL_SNAPSHOT; assembly {tstore(slot,value)}\n    }\n    function _checkTotalTax(PoolKey calldata key, SwapParams calldata params, BalanceDelta delta, uint256 gross, uint256 fee) private view {\n        bytes32 slot=PROTOCOL_SNAPSHOT; uint256 beforeFees; assembly {beforeFees:=tload(slot)}\n        uint256 protocol=poolManager.protocolFeesAccrued(params.zeroForOne?key.currency0:key.currency1)-beforeFees;\n        if(params.zeroForOne){\n            if(fee+protocol>gross*150_000/1_000_000) revert TotalTaxExceeded();\n        }else{\n            uint256 input=uint256(-int256(delta.amount1()));\n            // Express the token-side protocol charge and ETH-side hook fee on one\n            // proportional pre-fee trade basis, without treating price impact as tax.\n            if(protocol>input*150_000/1_000_000 || protocol==input) revert TotalTaxExceeded();\n            uint256 allowedPips=(input*150_000-protocol*1_000_000)/(input-protocol);\n            if(fee>gross*allowedPips/1_000_000) revert TotalTaxExceeded();\n        }\n    }\n\n    function _calldataPoolId(PoolKey calldata key) private pure returns (PoolId id) {\n        assembly (\"memory-safe\") {\n            let p := mload(0x40)\n            calldatacopy(p, key, 160)\n            id := keccak256(p, 160)\n        }\n    }\n\n    function _nativeSpecified(SwapParams calldata params) private pure returns (bool) {\n        return (params.amountSpecified < 0) == params.zeroForOne;\n    }\n\n    function _specifiedAmount(SwapParams calldata params) private pure returns (uint256) {\n        return params.amountSpecified < 0 ? uint256(-(params.amountSpecified + 1)) + 1 : uint256(params.amountSpecified);\n    }\n\n    function _requirePool(PoolKey calldata key) private view {\n        LaunchState storage state = _launch();\n        if (\n            !state.poolInitialized || state.feeRecipient == address(0) || Currency.unwrap(key.currency0) != address(0)\n                || Currency.unwrap(key.currency1) != POOL_TOKEN || address(key.hooks) != address(this)\n                || key.tickSpacing != state.tickSpacing || key.fee != LPFeeLibrary.DYNAMIC_FEE_FLAG\n        ) revert InvalidPool();\n    }\n\n    receive() external payable {\n        if (msg.sender != address(poolManager)) revert OnlySelf();\n    }\n\n    function pendingLiquidityEth() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), 0);\n    }\n\n    function pendingLiquidityTokens() public view returns (uint256) {\n        return poolManager.balanceOf(address(liquidityReserve), uint256(uint160(_launch().token)));\n    }\n\n    /// @notice Fixed-destination processing; callers cannot withdraw or redirect reserves.\n    function processLiquidity() external {\n        poolManager.unlock(abi.encode(uint8(0), msg.sender));\n        // Processor swaps originate from this hook, so v4 skips its swap callbacks.\n        _checkpointPredictions();\n    }\n\n    function processBuybacks() external {\n        poolManager.unlock(abi.encode(uint8(1), msg.sender));\n        _checkpointPredictions();\n    }\n\n    function unlockCallback(bytes calldata data) public virtual onlyPoolManager returns (bytes memory) {\n        (uint8 kind, address caller) = abi.decode(data, (uint8, address));\n        if (kind == 0) this.processLiquidityDuringSwap();\n        else if (kind == 1) this.processBuybacksDuringSwap(caller);\n        else revert InvalidProcessing();\n        return bytes(\"\");\n    }\n\n    function processBuybacksDuringSwap(address sender) public virtual {\n        if (msg.sender != address(this)) revert OnlySelf();\n        _process(abi.encodeCall(FeeProcessor.executeBuybacks, (sender)));\n    }\n\n    function processLiquidityDuringSwap() external {\n        if (msg.sender != address(this)) revert OnlySelf();\n        _process(abi.encodeCall(FeeProcessor.executeLiquidity, ()));\n    }\n\n    function batchThresholdWei() public view returns (uint256) {\n        return processor.batchThresholdWei();\n    }\n\n    function liquidityBatchReady() external view returns (bool) {\n        return processor.liquidityBatchReady();\n    }\n\n    function _process(bytes memory data) private {\n        // Immutable reviewed module; no user-supplied destination or arbitrary calldata.\n        (bool ok, bytes memory result) = address(processor).delegatecall(data);\n        if (!ok) {\n            assembly (\"memory-safe\") { revert(add(result, 32), mload(result)) }\n        }\n    }\n\n    function _launch() private pure returns (LaunchState storage state) {\n        bytes32 slot = LAUNCH_SLOT;\n        assembly { state.slot := slot }\n    }\n}\n"},"src/legacy/LiquidityReserve.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IPositionManager} from \"@uniswap/v4-periphery/src/interfaces/IPositionManager.sol\";\nimport {PositionInfo} from \"@uniswap/v4-periphery/src/libraries/PositionInfoLibrary.sol\";\nimport {Actions} from \"@uniswap/v4-periphery/src/libraries/Actions.sol\";\nimport {IAllowanceTransfer} from \"permit2/src/interfaces/IAllowanceTransfer.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\n\n/// @notice Holds separately earmarked liquidity claims and can only increase one existing NFT.\n/// @dev NFT approval confers no externally callable withdrawal, transfer or arbitrary-call path.\ncontract LiquidityReserve {\n    IPoolManager public immutable poolManager;\n    IPositionManager public immutable positionManager;\n    IAllowanceTransfer public immutable permit2;\n    address public immutable hook;\n    address public immutable token;\n    address public immutable positionOwner;\n    uint256 public immutable tokenId;\n    int24 public immutable tickLower;\n    int24 public immutable tickUpper;\n\n    error Unauthorized();\n    error InvalidPosition();\n    error TransferFailed();\n\n    constructor(IPoolManager manager, IPositionManager posm, IAllowanceTransfer permits,\n        address hook_, address token_, address owner_, uint256 id) {\n        (PoolKey memory key, PositionInfo info) = posm.getPoolAndPositionInfo(id);\n        if (address(posm.poolManager()) != address(manager) || address(key.hooks) != hook_\n            || Currency.unwrap(key.currency0) != address(0) || Currency.unwrap(key.currency1) != token_\n            || key.fee != 0x800000 || key.tickSpacing != 1 || IERC721(address(posm)).ownerOf(id) != owner_)\n            revert InvalidPosition();\n        poolManager = manager;\n        positionManager = posm;\n        permit2 = permits;\n        hook = hook_;\n        token = token_;\n        positionOwner = owner_;\n        tokenId = id;\n        tickLower = info.tickLower();\n        tickUpper = info.tickUpper();\n        manager.setOperator(hook_, true);\n        if (!IERC20(token_).approve(address(permits), type(uint256).max)) revert TransferFailed();\n    }\n\n    receive() external payable {\n        if (msg.sender != address(positionManager) && msg.sender != address(poolManager)) revert Unauthorized();\n    }\n\n    function increase(uint128 liquidity, uint128 amount0, uint128 amount1) external payable {\n        if (msg.sender != hook || msg.value != amount0) revert Unauthorized();\n        if (IERC721(address(positionManager)).ownerOf(tokenId) != positionOwner) revert InvalidPosition();\n        permit2.approve(token, address(positionManager), amount1, uint48(block.timestamp));\n        bytes[] memory args = new bytes[](4);\n        args[0] = abi.encode(tokenId, uint256(liquidity), amount0, amount1, bytes(\"\"));\n        args[1] = abi.encode(Currency.wrap(address(0)));\n        args[2] = abi.encode(Currency.wrap(token));\n        args[3] = abi.encode(Currency.wrap(address(0)), address(this));\n        positionManager.modifyLiquiditiesWithoutUnlock{value: amount0}(\n            abi.encodePacked(uint8(Actions.INCREASE_LIQUIDITY), uint8(Actions.CLOSE_CURRENCY),\n                uint8(Actions.CLOSE_CURRENCY), uint8(Actions.SWEEP)), args);\n        permit2.approve(token, address(positionManager), 0, 0);\n        // Any unused input or collected LP fees stay in the dedicated reserve.\n        uint256 tokens = IERC20(token).balanceOf(address(this));\n        if (tokens != 0) {\n            poolManager.sync(Currency.wrap(token));\n            if (!IERC20(token).transfer(address(poolManager), tokens)) revert TransferFailed();\n            poolManager.settle();\n            poolManager.mint(address(this), uint256(uint160(token)), tokens);\n        }\n        uint256 eth = address(this).balance;\n        if (eth != 0) {\n            poolManager.sync(Currency.wrap(address(0)));\n            poolManager.settle{value: eth}();\n            poolManager.mint(address(this), 0, eth);\n        }\n    }\n}\n"},"src/legacy/FeePredictionHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\nimport {FeeNftHook} from \"./FeeNftHook.sol\";\nimport {FeeEfficientHook, IEthUsdFeed} from \"./FeeEfficientHook.sol\";\nimport {MarketCapOracle} from \"./MarketCapOracle.sol\";\nimport {PoolCapSource} from \"./PoolCapSource.sol\";\nimport {FeeProcessor} from \"./FeeProcessor.sol\";\nimport {ClausNFT} from \"./ClausNFT.sol\";\nimport {ProjectRevenue} from \"./ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"./PlatformRevenue.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\nimport {FomoReserve} from \"./FomoReserve.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\n\n/// @notice Preserves all existing fee allocations and adds a genuine afterSwap observation.\ncontract FeePredictionHook is FeeNftHook {\n    MarketCapOracle public immutable predictionOracle;\n    uint256 public constant OBSERVATION_GAS = 150_000;\n    error InsufficientObservationGas();\n    constructor(IPoolManager manager_, ProjectRevenue project_, PlatformRevenue platform_,\n        LiquidityReserve reserve_, IEthUsdFeed feed_, FomoReserve fomo_, address attester_,\n        bytes32 questionHash_, FeeProcessor processor_, ClausNFT nft_, MarketCapOracle oracle_, int24 spacing_)\n        FeeNftHook(manager_, project_, platform_, reserve_, feed_, fomo_, attester_, questionHash_, processor_, nft_)\n    {\n        PoolCapSource source = PoolCapSource(address(oracle_.source()));\n        PoolKey memory key = PoolKey(Currency.wrap(address(0)), Currency.wrap(reserve_.token()), LPFeeLibrary.DYNAMIC_FEE_FLAG, spacing_, IHooks(reserve_.hook()));\n        if (address(source.manager()) != address(manager_) || address(source.token()) != reserve_.token()\n            || address(source.feed()) != address(feed_) || PoolId.unwrap(source.poolId()) != PoolId.unwrap(key.toId())\n            || oracle_.scheduler() == address(0)) revert InvalidInitialization();\n        predictionOracle = oracle_;\n    }\n    function _checkpointPredictions() internal override {\n        // Keep existing observations when gas permits; they must never gate trading.\n        if (gasleft() < OBSERVATION_GAS + OBSERVATION_GAS / 63 + 15_000) return;\n        try predictionOracle.checkpointIfNeeded{gas: OBSERVATION_GAS}() {} catch {}\n    }\n}\n"},"src/legacy/LpRemainderProcessor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {StateLibrary} from \"@uniswap/v4-core/src/libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"@uniswap/v4-core/src/libraries/TransientStateLibrary.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {SqrtPriceMath} from \"@uniswap/v4-core/src/libraries/SqrtPriceMath.sol\";\nimport {LiquidityAmounts} from \"@uniswap/v4-periphery/src/libraries/LiquidityAmounts.sol\";\nimport {IPositionManager} from \"@uniswap/v4-periphery/src/interfaces/IPositionManager.sol\";\nimport {PositionInfo} from \"@uniswap/v4-periphery/src/libraries/PositionInfoLibrary.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {LiquidityReserve} from \"./LiquidityReserve.sol\";\n\n/// @notice Threshold-free final settlement of the original reserve into its original NFT.\n/// @dev Stateless delegate module. The parent MUST admit this only through its protected\n/// final-lane unlock kind after future auto-LP funding retires. An unlocked manager alone\n/// does not authenticate an unlock kind; that authorization belongs to the parent.\n///\n/// Quotes must simulate this complete call at a pinned block and supply a nonzero minimum\n/// on its ONE total liquidity increase, plus short-lived caps on BOTH observed claim balances.\n/// Spot value is used only to converge the asset ratio, never as an oracle of fair value.\n/// Every swap shares the initial sqrt-price +/-0.5% envelope (roughly +/-1% price).\n/// Fee losses are covered by the output minimum, not that price envelope. This is not MEV\n/// protection against a manipulated initial spot: the caller's\n/// independently checked minLiquidity is the output protection. No USD threshold/feed is used.\n///\n/// At most 32 exact-input corrections are attempted. Non-convergence or a partial fill that\n/// leaves material surplus REVERTS atomically; it never deposits just the matched fraction.\n/// Dust is <= 1e6 wei of ETH value, plus four token atoms and two liquidity units per side.\n/// Extreme prices/ranges may make a single indivisible unit valuable: quote accordingly.\n/// All observed ERC6909 claims are considered. Fees/refunds recycled by reserve.increase\n/// remain in that same reserve and can use this lane again; there is no one-shot latch.\ncontract LpRemainderProcessor {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    IPoolManager public immutable poolManager;\n    LiquidityReserve public immutable liquidityReserve;\n    IPositionManager public immutable positionManager;\n    address public immutable hook;\n    address public immutable token;\n    address public immutable positionOwner;\n    uint256 public immutable tokenId;\n    int24 public immutable tickLower;\n    int24 public immutable tickUpper;\n    uint256 private constant Q96 = 1 << 96;\n    uint256 public constant DUST_WEI = 1_000_000;\n    uint256 public constant MAX_CORRECTIONS = 32;\n\n    error InvalidConfiguration();\n    error InvalidContext();\n    error InvalidDeadline();\n    error InvalidBounds();\n    error InvalidPosition();\n    error EmptyLiquidity();\n    error InsufficientLiquidity();\n    error MaterialRemainder();\n    error InvalidSwap();\n\n    event RemainderAdded(uint256 indexed tokenId, uint128 liquidity, uint256 ethAdded, uint256 tokensAdded);\n\n    constructor(IPoolManager manager, address hook_, LiquidityReserve reserve_, address token_) {\n        if (\n            address(manager).code.length == 0 || hook_ == address(0) || token_ == address(0)\n                || address(reserve_).code.length == 0 || address(reserve_.poolManager()) != address(manager)\n                || reserve_.hook() != hook_ || reserve_.token() != token_\n        ) revert InvalidConfiguration();\n        poolManager = manager;\n        liquidityReserve = reserve_;\n        positionManager = reserve_.positionManager();\n        hook = hook_;\n        token = token_;\n        positionOwner = reserve_.positionOwner();\n        tokenId = reserve_.tokenId();\n        tickLower = reserve_.tickLower();\n        tickUpper = reserve_.tickUpper();\n        _checkPosition();\n    }\n\n    /// @dev Supports direct delegatecall in the PM callback or the parent's protected self-call.\n    /// No user-selected target, owner, position, pool, recipient, allowance or arbitrary calldata.\n    function execute(uint128 minLiquidity, uint256 maximumEth, uint256 maximumTokens, uint256 deadline)\n        external\n        returns (uint128 liquidity)\n    {\n        if (\n            address(this) != hook || (msg.sender != hook && msg.sender != address(poolManager))\n                || !poolManager.isUnlocked()\n        ) revert InvalidContext();\n        if (deadline < block.timestamp || deadline - block.timestamp > 5 minutes) revert InvalidDeadline();\n        if (minLiquidity == 0) revert InvalidBounds();\n        _checkPosition();\n        Work memory w;\n        w.eth = poolManager.balanceOf(address(liquidityReserve), 0);\n        w.tokens = poolManager.balanceOf(address(liquidityReserve), uint256(uint160(token)));\n        // Signed swap deltas are int128; do not truncate balances or silently leave a capped batch.\n        uint256 maxAmount = uint256(uint128(type(int128).max));\n        if (w.eth > maximumEth || w.tokens > maximumTokens || w.eth > maxAmount || w.tokens > maxAmount) {\n            revert InvalidBounds();\n        }\n        if (w.eth == 0 && w.tokens == 0) revert EmptyLiquidity();\n        PoolKey memory key = _key();\n        (w.price,,,) = poolManager.getSlot0(key.toId());\n        if (w.price <= TickMath.MIN_SQRT_PRICE || w.price >= TickMath.MAX_SQRT_PRICE) revert InvalidSwap();\n        w.lower = TickMath.getSqrtPriceAtTick(tickLower);\n        w.upper = TickMath.getSqrtPriceAtTick(tickUpper);\n        w.limitDown = uint160(uint256(w.price) * 995 / 1000);\n        uint256 upperLimit = uint256(w.price) * 1005 / 1000;\n        w.limitUp = upperLimit >= TickMath.MAX_SQRT_PRICE ? TickMath.MAX_SQRT_PRICE - 1 : uint160(upperLimit);\n        if (w.limitDown <= TickMath.MIN_SQRT_PRICE) w.limitDown = TickMath.MIN_SQRT_PRICE + 1;\n\n        for (uint256 i; ; ++i) {\n            liquidity = LiquidityAmounts.getLiquidityForAmounts(w.price, w.lower, w.upper, w.eth, w.tokens);\n            // Reserve one liquidity unit for the periphery's rounded-up token requirements.\n            if (liquidity != 0) --liquidity;\n            (w.addEth, w.addTokens) = _amounts(w, liquidity);\n            if (_onlyDust(w)) break;\n            if (i == MAX_CORRECTIONS) revert MaterialRemainder();\n            _correct(key, w);\n        }\n        if (liquidity == 0) revert EmptyLiquidity();\n        // Check total output BEFORE take/increase; swaps and claim movements also roll back on failure.\n        if (liquidity < minLiquidity) revert InsufficientLiquidity();\n        if (w.addEth > type(uint128).max || w.addTokens > type(uint128).max) revert InvalidBounds();\n        if (w.addEth != 0) {\n            poolManager.burn(address(liquidityReserve), 0, w.addEth);\n            poolManager.take(key.currency0, hook, w.addEth);\n        }\n        if (w.addTokens != 0) {\n            poolManager.burn(address(liquidityReserve), uint256(uint160(token)), w.addTokens);\n            poolManager.take(key.currency1, address(liquidityReserve), w.addTokens);\n        }\n        liquidityReserve.increase{value: w.addEth}(liquidity, uint128(w.addEth), uint128(w.addTokens));\n        emit RemainderAdded(tokenId, liquidity, w.addEth, w.addTokens);\n    }\n\n    struct Work {\n        uint256 eth;\n        uint256 tokens;\n        uint256 addEth;\n        uint256 addTokens;\n        uint160 price;\n        uint160 lower;\n        uint160 upper;\n        uint160 limitDown;\n        uint160 limitUp;\n    }\n\n    function _key() private view returns (PoolKey memory) {\n        return PoolKey(Currency.wrap(address(0)), Currency.wrap(token), 0x800000, 1, IHooks(hook));\n    }\n\n    function _checkPosition() private view {\n        (PoolKey memory key, PositionInfo info) = positionManager.getPoolAndPositionInfo(tokenId);\n        if (\n            address(positionManager.poolManager()) != address(poolManager)\n                || IERC721(address(positionManager)).ownerOf(tokenId) != positionOwner\n                || Currency.unwrap(key.currency0) != address(0) || Currency.unwrap(key.currency1) != token\n                || key.fee != 0x800000 || key.tickSpacing != 1 || address(key.hooks) != hook\n                || info.tickLower() != tickLower || info.tickUpper() != tickUpper || tickLower >= tickUpper\n        ) revert InvalidPosition();\n    }\n\n    function _tokenValue(uint256 amount, uint160 price) private pure returns (uint256) {\n        return FullMath.mulDiv(FullMath.mulDiv(amount, Q96, price), Q96, price);\n    }\n\n    function _amounts(Work memory w, uint128 liquidity) private pure returns (uint256 eth, uint256 tokens) {\n        if (w.price < w.upper) {\n            eth = SqrtPriceMath.getAmount0Delta(w.price > w.lower ? w.price : w.lower, w.upper, liquidity, true);\n        }\n        if (w.price > w.lower) {\n            tokens = SqrtPriceMath.getAmount1Delta(w.lower, w.price < w.upper ? w.price : w.upper, liquidity, true);\n        }\n    }\n\n    function _onlyDust(Work memory w) private pure returns (bool) {\n        if (w.addEth > w.eth || w.addTokens > w.tokens) return false;\n        (uint256 roundingEth, uint256 roundingTokens) = _amounts(w, 2);\n        uint256 tokenDust = FullMath.mulDiv(FullMath.mulDiv(DUST_WEI, w.price, Q96), w.price, Q96) + 4;\n        return w.eth - w.addEth <= DUST_WEI + roundingEth + _tokenValue(4, w.price)\n            && w.tokens - w.addTokens <= tokenDust + roundingTokens;\n    }\n\n    function _correct(PoolKey memory key, Work memory w) private {\n        (uint256 ratioEth, uint256 ratioTokens) = _amounts(w, 1e18);\n        uint256 ratioValue = _tokenValue(ratioTokens, w.price);\n        uint256 oldValue = _tokenValue(w.tokens, w.price);\n        if (ratioEth + ratioValue == 0) revert InvalidSwap();\n        uint256 targetValue = FullMath.mulDiv(w.eth + oldValue, ratioValue, ratioEth + ratioValue);\n        bool buy = targetValue > oldValue;\n        uint256 input = buy ? targetValue - oldValue\n            : (oldValue == 0 ? 0 : FullMath.mulDiv(w.tokens, oldValue - targetValue, oldValue));\n        _swap(key, w, buy, input);\n    }\n\n    function _swap(PoolKey memory key, Work memory w, bool buy, uint256 input) private {\n        uint160 limit = buy ? w.limitDown : w.limitUp;\n        if (\n            input == 0 || input > uint256(uint128(type(int128).max))\n                || (buy ? (input > w.eth || w.price <= limit) : (input > w.tokens || w.price >= limit))\n        ) revert MaterialRemainder();\n        uint256 inputId = buy ? 0 : uint256(uint160(token));\n        uint256 outputId = buy ? uint256(uint160(token)) : 0;\n        poolManager.burn(address(liquidityReserve), inputId, input);\n        BalanceDelta delta = poolManager.swap(key, SwapParams(buy, -int256(input), limit), bytes(\"\"));\n        int128 inputDelta = buy ? delta.amount0() : delta.amount1();\n        int128 outputDelta = buy ? delta.amount1() : delta.amount0();\n        if (inputDelta >= 0 || outputDelta <= 0) revert InvalidSwap();\n        uint256 spent = uint256(-int256(inputDelta));\n        uint256 output = uint256(uint128(outputDelta));\n        if (spent > input) revert InvalidSwap();\n        if (spent < input) poolManager.mint(address(liquidityReserve), inputId, input - spent);\n        poolManager.mint(address(liquidityReserve), outputId, output);\n        if (buy) { w.eth -= spent; w.tokens += output; }\n        else { w.tokens -= spent; w.eth += output; }\n        (w.price,,,) = poolManager.getSlot0(key.toId());\n        if (w.price < w.limitDown || w.price > w.limitUp) revert InvalidSwap();\n    }\n}\n"},"src/legacy/privacy/IPrivacyPool.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.26;\n\n/// @dev ABI subset of 0xbow/privacy-pools-core, commit\n/// d494b63e79f33bb2b0c8ece6cdacdca465c3b884. Field order is protocol-defined.\ninterface IPrivacyPool {\n    struct Withdrawal { address processooor; bytes data; }\n    struct WithdrawProof {\n        uint256[2] pA;\n        uint256[2][2] pB;\n        uint256[2] pC;\n        uint256[8] pubSignals;\n    }\n    function ASSET() external view returns (address);\n    function SCOPE() external view returns (uint256);\n    function withdraw(Withdrawal memory withdrawal, WithdrawProof memory proof) external;\n}\n"},"src/legacy/privacy/FeePrivacyHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {FeePredictionHook} from \"../FeePredictionHook.sol\";\nimport {IEthUsdFeed} from \"../FeeEfficientHook.sol\";\nimport {FeeProcessor} from \"../FeeProcessor.sol\";\nimport {ClausNFT} from \"../ClausNFT.sol\";\nimport {MarketCapOracle} from \"../MarketCapOracle.sol\";\nimport {ProjectRevenue} from \"../ProjectRevenue.sol\";\nimport {PlatformRevenue} from \"../PlatformRevenue.sol\";\nimport {LiquidityReserve} from \"../LiquidityReserve.sol\";\nimport {FomoReserve} from \"../FomoReserve.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\n\n/// @notice Retains accounting and historical bindings; new privacy buys are retired.\ncontract FeePrivacyHook is FeePredictionHook {\n    using BalanceDeltaLibrary for BalanceDelta;\n    error PrivacyBuyRetired();\n    ClausPrivacyBuy public immutable privacyBuy;\n\n    struct BaseConfig {\n        IPoolManager manager;\n        ProjectRevenue project;\n        PlatformRevenue platform;\n        LiquidityReserve reserve;\n        IEthUsdFeed feed;\n        FomoReserve fomo;\n        address attester;\n        bytes32 questionHash;\n        FeeProcessor processor;\n        ClausNFT nft;\n        MarketCapOracle oracle;\n        int24 spacing;\n    }\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_)\n        FeePredictionHook(base.manager, base.project, base.platform, base.reserve, base.feed,\n            base.fomo, base.attester, base.questionHash, base.processor, base.nft, base.oracle, base.spacing)\n    {\n        if (address(privacyBuy_.manager()) != address(base.manager) || address(privacyBuy_.token()) != base.reserve.token()\n            || privacyBuy_.hook() != base.reserve.hook() || privacyBuy_.tickSpacing() != base.spacing) revert InvalidInitialization();\n        privacyBuy = privacyBuy_;\n    }\n\n    function _beforeSwapExtension(address sender, PoolKey calldata, SwapParams calldata, bytes calldata)\n        internal virtual override\n    {\n        // Final core has no sender-specific trading blacklist.\n    }\n\n    function _afterSwapExtension(address sender, PoolKey calldata, SwapParams calldata, BalanceDelta delta, bytes calldata data)\n        internal virtual override\n    {\n        // No external feature callback on the trading path.\n    }\n}\n"},"src/legacy/privacy/ClausPrivacyBuy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {IPrivacyPool} from \"./IPrivacyPool.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {SwapParams} from \"@uniswap/v4-core/src/types/PoolOperation.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {TickMath} from \"@uniswap/v4-core/src/libraries/TickMath.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/// @notice Spend an approved ETH Privacy Pools note on the existing CLAUS pool.\n/// @dev No deposits, admin, arbitrary calls or owner withdrawal path. Every spend\n/// is bound to its complete purchase instruction by the upstream ZK verifier.\ncontract ClausPrivacyBuy is IUnlockCallback {\n    using BalanceDeltaLibrary for BalanceDelta;\n\n    struct Intent {\n        address recipient;\n        address relayer;\n        uint256 amount;\n        uint256 minAmountOut;\n        uint256 relayFee;\n        uint256 deadline;\n    }\n\n    IPoolManager public immutable manager;\n    IPrivacyPool public immutable privacyPool;\n    IERC20 public immutable token;\n    address public immutable hook;\n    int24 public immutable tickSpacing;\n\n    // The hook must authenticate both callbacks within this one atomic spend.\n    // 0 idle, 1 withdrawing, 2 before swap, 3 after swap, 4 settling, 5 paying.\n    uint8 private phase;\n    bytes32 public activeIntent;\n    uint256 private activeAmount;\n    uint256 private activeMinimum;\n    address private activeRecipient;\n\n    error InvalidConfiguration();\n    error InvalidIntent();\n    error InvalidProofAmount();\n    error InvalidCallerOrPhase();\n    error IncompleteSwap();\n    error InsufficientOutput();\n    error UnexpectedBalance();\n    error FeeTransferFailed();\n\n    event PrivateBuy(uint256 indexed nullifierHash, address indexed recipient,\n        uint256 amount, uint256 amountOut, address relayer, uint256 relayFee);\n\n    constructor(IPoolManager manager_, IPrivacyPool privacyPool_, IERC20 token_, address hook_, int24 spacing_) {\n        if (address(manager_).code.length == 0 || address(privacyPool_).code.length == 0\n            || address(token_).code.length == 0 || hook_.code.length == 0\n            || privacyPool_.ASSET() != 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\n            || spacing_ <= 0 || spacing_ > TickMath.MAX_TICK_SPACING) revert InvalidConfiguration();\n        manager = manager_;\n        privacyPool = privacyPool_;\n        token = token_;\n        hook = hook_;\n        tickSpacing = spacing_;\n    }\n\n    receive() external payable {\n        if (msg.sender != address(privacyPool) || phase != 1) revert InvalidCallerOrPhase();\n    }\n\n    function buy(Intent calldata intent, IPrivacyPool.WithdrawProof calldata proof)\n        external returns (uint256 amountOut)\n    {\n        if (phase != 0 || msg.sender != intent.relayer) revert InvalidCallerOrPhase();\n        if (intent.recipient == address(0) || intent.recipient == address(this)\n            || intent.recipient == address(manager) || intent.recipient == address(privacyPool)\n            || intent.recipient == hook || intent.recipient == address(token)\n            || intent.amount <= intent.relayFee || intent.amount >= type(uint128).max\n            || intent.minAmountOut == 0 || intent.deadline < block.timestamp) {\n            revert InvalidIntent();\n        }\n        // The buyer approves the exact fee and minimum output in the proof.\n        // Network prices may change; the fee must leave a positive swap amount.\n        if (proof.pubSignals[2] != intent.amount) revert InvalidProofAmount();\n        uint256 initialBalance = address(this).balance;\n        phase = 1;\n        // The pool validates the proof, context, roots and unused nullifier.\n        privacyPool.withdraw(IPrivacyPool.Withdrawal(address(this), abi.encode(intent)), proof);\n        if (address(this).balance != initialBalance + intent.amount) revert UnexpectedBalance();\n        activeIntent = keccak256(abi.encode(intent));\n        activeAmount = intent.amount - intent.relayFee;\n        activeMinimum = intent.minAmountOut;\n        activeRecipient = intent.recipient;\n        phase = 2;\n        amountOut = abi.decode(manager.unlock(\"\"), (uint256));\n        if (phase != 4) revert InvalidCallerOrPhase();\n        phase = 5;\n        delete activeIntent;\n        delete activeAmount;\n        delete activeMinimum;\n        delete activeRecipient;\n        if (intent.relayFee != 0) {\n            (bool paid,) = intent.relayer.call{value: intent.relayFee}(\"\");\n            if (!paid) revert FeeTransferFailed();\n        }\n        if (address(this).balance != initialBalance) revert UnexpectedBalance();\n        phase = 0;\n        emit PrivateBuy(proof.pubSignals[1], intent.recipient, intent.amount, amountOut, intent.relayer, intent.relayFee);\n    }\n\n    /// @dev Called by the actual pool hook, not by a caller-supplied adapter.\n    function authorizeBeforeSwap(bytes32 intentHash, bool zeroForOne, int256 amountSpecified) external {\n        if (msg.sender != hook || phase != 2 || intentHash != activeIntent\n            || !zeroForOne || amountSpecified != -int256(activeAmount)) revert InvalidCallerOrPhase();\n        phase = 3;\n    }\n\n    function authorizeAfterSwap(bytes32 intentHash, int128 amountOut) external {\n        if (msg.sender != hook || phase != 3 || intentHash != activeIntent) revert InvalidCallerOrPhase();\n        if (amountOut <= 0 || uint128(amountOut) < activeMinimum) revert InsufficientOutput();\n        phase = 4;\n    }\n\n    function unlockCallback(bytes calldata) external returns (bytes memory) {\n        if (msg.sender != address(manager) || phase != 2) revert InvalidCallerOrPhase();\n        PoolKey memory key = PoolKey(Currency.wrap(address(0)), Currency.wrap(address(token)),\n            LPFeeLibrary.DYNAMIC_FEE_FLAG, tickSpacing, IHooks(hook));\n        BalanceDelta delta = manager.swap(key,\n            SwapParams(true, -int256(activeAmount), TickMath.MIN_SQRT_PRICE + 1), abi.encode(activeIntent));\n        if (phase != 4) revert InvalidCallerOrPhase();\n        if (delta.amount0() >= 0 || uint256(-int256(delta.amount0())) != activeAmount) revert IncompleteSwap();\n        if (delta.amount1() <= 0 || uint128(delta.amount1()) < activeMinimum) revert InsufficientOutput();\n        uint256 amountOut = uint128(delta.amount1());\n        // Native currency is settled without ERC-20 approvals or intermediary custody.\n        manager.sync(key.currency0);\n        if (manager.settle{value: activeAmount}() != activeAmount) revert UnexpectedBalance();\n        uint256 balanceBefore = token.balanceOf(activeRecipient);\n        manager.take(key.currency1, activeRecipient, amountOut);\n        if (token.balanceOf(activeRecipient) != balanceBefore + amountOut) revert UnexpectedBalance();\n        return abi.encode(amountOut);\n    }\n}\n"},"src/legacy/privacy/FeeLpRewardsHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeBatchedPrivacyHook} from \"./FeeBatchedPrivacyHook.sol\";\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {FeeCalls} from \"../FeeCalls.sol\";\nimport {FeeMath} from \"../FeeMath.sol\";\nimport {ClausFeeBudget} from \"../../ClausFeeBudget.sol\";\nimport {LpRemainderProcessor} from \"../LpRemainderProcessor.sol\";\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\nimport {IPositionManager} from \"@uniswap/v4-periphery/src/interfaces/IPositionManager.sol\";\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {Currency} from \"@uniswap/v4-core/src/types/Currency.sol\";\nimport {IHooks} from \"@uniswap/v4-core/src/interfaces/IHooks.sol\";\nimport {LPFeeLibrary} from \"@uniswap/v4-core/src/libraries/LPFeeLibrary.sol\";\n\n/// @dev Minimal immutable binding and funding surface of the independent rewards vault.\ninterface IClausLpRewards {\n    function poolManager() external view returns (IPoolManager);\n    function positionManager() external view returns (IPositionManager);\n    function hook() external view returns (address);\n    function poolId() external view returns (PoolId);\n    function epochStart() external view returns (uint256);\n    function EPOCH() external view returns (uint256);\n    function totalLiquidity() external view returns (uint256);\n    function projectRevenue() external view returns (address);\n    function recordReward(uint256 amount) external;\n}\n\n/// @notice Fixed 0.15% burn and 0.20% participant LP rewards, preserving old reserve processing.\n/// @dev Adds only immutables. All inherited storage namespaces, delegates and claim owners remain intact.\ncontract FeeLpRewardsHook is FeeBatchedPrivacyHook {\n    IClausLpRewards public immutable lpRewards;\n    LpRemainderProcessor public immutable lpRemainderProcessor;\n    uint64 private immutable LP_EPOCH_START;\n    uint256 private immutable LP_EPOCH_LENGTH;\n    address private constant HOOK = 0x37Bfb8AC7C960E558657871D41Ca70E07e7DbfFf;\n    address private constant UPGRADE_ADMIN = 0x1f22E4B065b2f15Fed5BE556DC0fA636048d29bc;\n    bytes32 private constant BOOST_SLOT = keccak256(\"claus.hook.reward-boost.24h.v1\");\n    uint256 public constant REWARD_BOOST_DURATION = 24 hours;\n    uint24 public constant LP_REWARDS_FEE_PIPS = 2_000;\n\n    struct RewardBoost {\n        uint64 startsAt;\n        uint64 endsAt;\n    }\n    error InvalidLpRewards();\n    error InvalidRemainderProcessor();\n    error InvalidBoostActivation();\n    event RewardBoostActivated(uint64 startsAt, uint64 endsAt, uint24 multiplier);\n    event LpRewardFeeAccrued(uint256 grossEth, uint256 rewardEth, uint256 epoch);\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_, IClausLpRewards lpRewards_, LpRemainderProcessor remainder_)\n        FeeBatchedPrivacyHook(base, privacyBuy_)\n    {\n        PoolKey memory key = PoolKey(\n            Currency.wrap(address(0)),\n            Currency.wrap(base.reserve.token()),\n            LPFeeLibrary.DYNAMIC_FEE_FLAG,\n            base.spacing,\n            IHooks(base.reserve.hook())\n        );\n        uint64 epochStart_ = base.nft.epochStart();\n        uint256 epochLength_ = base.nft.EPOCH();\n        if (\n            address(lpRewards_).code.length == 0 || address(lpRewards_.poolManager()) != address(base.manager)\n                || address(lpRewards_.positionManager()) != address(base.reserve.positionManager())\n                || lpRewards_.hook() != base.reserve.hook()\n                || PoolId.unwrap(lpRewards_.poolId()) != PoolId.unwrap(key.toId())\n                || lpRewards_.epochStart() != epochStart_ || epochStart_ > block.timestamp || epochLength_ != 1 days\n                || lpRewards_.EPOCH() != epochLength_ || lpRewards_.projectRevenue() != address(base.project)\n        ) revert InvalidLpRewards();\n        lpRewards = lpRewards_;\n        if (address(remainder_).code.length == 0 || address(remainder_.poolManager()) != address(base.manager)\n            || address(remainder_.liquidityReserve()) != address(base.reserve)\n            || remainder_.hook() != base.reserve.hook() || remainder_.token() != base.reserve.token()) {\n            revert InvalidRemainderProcessor();\n        }\n        lpRemainderProcessor = remainder_;\n        LP_EPOCH_START = epochStart_;\n        LP_EPOCH_LENGTH = epochLength_;\n    }\n\n    function weatherAllocationEnabled() external pure returns (bool) {\n        return false;\n    }\n\n    /// @notice Finish old auto-LP reserves into their original position, even below its old batch threshold.\n    /// @dev Only the original position owner may choose the short-lived minimum and reserve caps.\n    function processLiquidityRemainder(uint128 minLiquidity, uint256 maximumEth, uint256 maximumTokens, uint256 deadline)\n        external returns (uint128 liquidity)\n    {\n        if (msg.sender != liquidityReserve.positionOwner()) revert NotFeeRecipient();\n        bytes memory result = poolManager.unlock(abi.encode(uint8(2), minLiquidity, maximumEth, maximumTokens, deadline));\n        liquidity = abi.decode(result, (uint128));\n        _checkpointPredictions();\n    }\n\n    function unlockCallback(bytes calldata data) public override onlyPoolManager returns (bytes memory) {\n        uint8 kind = abi.decode(data, (uint8));\n        if (kind != 2) return super.unlockCallback(data);\n        (, uint128 minimum, uint256 maxEth, uint256 maxTokens, uint256 deadline) =\n            abi.decode(data, (uint8, uint128, uint256, uint256, uint256));\n        (bool ok, bytes memory result) = address(lpRemainderProcessor).delegatecall(\n            abi.encodeCall(LpRemainderProcessor.execute, (minimum, maxEth, maxTokens, deadline))\n        );\n        if (!ok) { assembly (\"memory-safe\") { revert(add(result, 32), mload(result)) } }\n        return result;\n    }\n\n    function BURN_FEE_PIPS() public pure override returns (uint24) {\n        return 1_500;\n    }\n\n    function LIQUIDITY_FEE_PIPS() public view override returns (uint24) {\n        return lpRewards.totalLiquidity() == 0 ? 0 : LP_REWARDS_FEE_PIPS;\n    }\n\n    function FOMO_FEE_PIPS() public pure override returns (uint24) {\n        return 0;\n    }\n\n    function NFT_FEE_PIPS() public view virtual override returns (uint24) {\n        return nft.totalSupply() == 0 ? 0 : 3_500;\n    }\n\n    function WALLET_FEE_PIPS() public view override returns (uint24) {\n        return 18_500 - LIQUIDITY_FEE_PIPS() - NFT_FEE_PIPS();\n    }\n\n    /// @dev Retains the historical ABI and one-shot namespace; history no longer sets any allocation.\n    function activateRewardBoost() external {\n        RewardBoost storage s = _boost();\n        if (\n            address(this) != HOOK || msg.sender != UPGRADE_ADMIN || s.endsAt != 0\n                || block.timestamp > type(uint64).max - REWARD_BOOST_DURATION\n        ) revert InvalidBoostActivation();\n        s.startsAt = uint64(block.timestamp);\n        s.endsAt = uint64(block.timestamp + REWARD_BOOST_DURATION);\n        emit RewardBoostActivated(s.startsAt, s.endsAt, 2);\n    }\n\n    function rewardBoostState() external view returns (uint64 startsAt, uint64 endsAt, bool active) {\n        RewardBoost storage s = _boost();\n        return (s.startsAt, s.endsAt, rewardMultiplier() == 2);\n    }\n\n    function rewardMultiplier() public view returns (uint24) {\n        RewardBoost storage s = _boost();\n        return s.endsAt != 0 && block.timestamp >= s.startsAt && block.timestamp < s.endsAt ? 2 : 1;\n    }\n\n    /// @dev Overrides the NFT-layer accrual, retaining individual floors and the owner rounding remainder.\n    function _accrue(uint256 gross, uint256 totalFee) internal virtual override {\n        uint256 project = FeeMath.projectFromGross(gross);\n        uint256 burnEth = gross * BURN_FEE_PIPS() / 1_000_000;\n        uint256 rewardEth = gross * LIQUIDITY_FEE_PIPS() / 1_000_000;\n        uint256 nftEth = gross * NFT_FEE_PIPS() / 1_000_000;\n        uint256 walletEth = project - burnEth - rewardEth - nftEth;\n        uint256 platform = totalFee - project;\n        if (walletEth != 0) FeeCalls.mint(address(poolManager), address(projectRevenue), walletEth);\n        if (burnEth != 0) FeeCalls.mint(address(poolManager), address(this), burnEth);\n        if (rewardEth != 0) {\n            FeeCalls.mint(address(poolManager), address(lpRewards), rewardEth);\n            lpRewards.recordReward(rewardEth);\n            emit LpRewardFeeAccrued(gross, rewardEth, (block.timestamp - LP_EPOCH_START) / LP_EPOCH_LENGTH);\n        }\n        if (nftEth != 0) {\n            FeeCalls.mint(address(poolManager), address(nft), nftEth);\n            FeeCalls.reward(address(nft), nftEth);\n            emit NftFeeAccrued(gross, nftEth, (block.timestamp - LP_EPOCH_START) / LP_EPOCH_LENGTH);\n        }\n        emit ProjectFeeSplit(gross, walletEth, burnEth);\n        // Preserve the allocation event; this amount now belongs to the separate rewards vault.\n        emit LiquidityFeeAccrued(gross, rewardEth);\n        emit FomoFeeAccrued(gross, 0);\n        if (platform != 0) FeeCalls.mint(address(poolManager), address(platformRevenue), platform);\n        uint256 canonical = gross / 1000;\n        FeeCalls.allocation(address(platformRevenue), canonical, platform - canonical);\n        emit FeeAllocation(gross, project, platform);\n        emit PlatformFeeAllocation(gross, canonical, platform - canonical);\n    }\n\n    function _boost() private pure returns (RewardBoost storage s) {\n        bytes32 slot = BOOST_SLOT;\n        assembly { s.slot := slot }\n    }\n}\n"},"src/legacy/privacy/FeeNftStakingHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeeLpRewardsHook, IClausLpRewards} from \"./FeeLpRewardsHook.sol\";\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {ClausNftStaking} from \"../ClausNftStaking.sol\";\nimport {LpRemainderProcessor} from \"../LpRemainderProcessor.sol\";\nimport {FeeCalls} from \"../FeeCalls.sol\";\nimport {ClausFeeBudget} from \"../../ClausFeeBudget.sol\";\nimport {FeeMath} from \"../FeeMath.sol\";\n\n/// @notice Changes only future NFT fee routing when the new vault is active.\n/// @dev No new mutable proxy storage. Old NFT balances and debts remain in the original collection.\ncontract FeeNftStakingHook is FeeLpRewardsHook {\n    ClausNftStaking public immutable nftStaking;\n    uint256 public immutable nftStakingStartsAt;\n    uint256 private immutable STAKING_EPOCH_START;\n\n    error InvalidNftStaking();\n    event NftStakingFeeAccrued(uint256 grossEth, uint256 rewardEth, uint256 epoch);\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_, IClausLpRewards lpRewards_,\n        LpRemainderProcessor remainder_, ClausNftStaking staking_)\n        FeeLpRewardsHook(base, privacyBuy_, lpRewards_, remainder_)\n    {\n        if (address(staking_).code.length == 0 || address(staking_.collection()) != address(base.nft)\n            || address(staking_.poolManager()) != address(base.manager)\n            || address(staking_.projectRevenue()) != address(base.project)\n            || staking_.hook() != base.reserve.hook() || staking_.epochStart() != base.nft.epochStart()\n            || staking_.EPOCH() != 1 days)\n            revert InvalidNftStaking();\n        nftStaking = staking_;\n        nftStakingStartsAt = staking_.startsAt();\n        STAKING_EPOCH_START = staking_.epochStart();\n    }\n\n    function NFT_FEE_PIPS() public view override returns (uint24) {\n        if (block.timestamp < nftStakingStartsAt) return super.NFT_FEE_PIPS();\n        return nftStaking.totalStaked() == 0 ? 0 : 3_500;\n    }\n\n    function _accrue(uint256 gross, uint256 totalFee) internal override {\n        if (block.timestamp < nftStakingStartsAt) {\n            super._accrue(gross, totalFee);\n            return;\n        }\n        uint256 burnEth = gross * ClausFeeBudget.pips(2) / 1_000_000;\n        uint256 rewardEth = lpRewards.totalLiquidity()==0?0:gross * ClausFeeBudget.pips(3) / 1_000_000;\n        uint256 nftEth = nftStaking.totalStaked()==0?0:gross * ClausFeeBudget.pips(4) / 1_000_000;\n        uint256 platform = gross * ClausFeeBudget.pips(1) / 1_000_000;\n        address module=ClausFeeBudget.module();\n        uint256 moduleEth = module==address(0)?0:gross * ClausFeeBudget.pips(5) / 1_000_000;\n        // Rounding dust and inactive rewards preserve the existing project destination.\n        uint256 walletEth = totalFee - burnEth - rewardEth - nftEth - platform - moduleEth;\n        if(moduleEth!=0)FeeCalls.mint(address(poolManager),module,moduleEth);\n        ClausFeeBudget.recordFee(totalFee,moduleEth);\n        if (walletEth != 0) FeeCalls.mint(address(poolManager), address(projectRevenue), walletEth);\n        if (burnEth != 0) FeeCalls.mint(address(poolManager), address(this), burnEth);\n        uint256 epoch = (block.timestamp - STAKING_EPOCH_START) / 1 days;\n        if (rewardEth != 0) {\n            FeeCalls.mint(address(poolManager), address(lpRewards), rewardEth);\n            lpRewards.recordReward(rewardEth);\n            emit LpRewardFeeAccrued(gross, rewardEth, epoch);\n        }\n        if (nftEth != 0) {\n            FeeCalls.mint(address(poolManager), address(nftStaking), nftEth);\n            nftStaking.recordReward(nftEth);\n            emit NftFeeAccrued(gross, nftEth, epoch);\n            emit NftStakingFeeAccrued(gross, nftEth, epoch);\n        }\n        emit ProjectFeeSplit(gross, walletEth, burnEth);\n        emit LiquidityFeeAccrued(gross, rewardEth);\n        emit FomoFeeAccrued(gross, 0);\n        if (platform != 0) FeeCalls.mint(address(poolManager), address(platformRevenue), platform);\n        uint256 canonical = gross / 1000;\n        if(canonical>platform)canonical=platform;\n        FeeCalls.allocation(address(platformRevenue), canonical, platform - canonical);\n        emit FeeAllocation(gross, totalFee-platform, platform);\n        emit PlatformFeeAllocation(gross, canonical, platform - canonical);\n    }\n}\n"},"src/legacy/privacy/FeeBatchedPrivacyHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {FeePrivacyHook} from \"./FeePrivacyHook.sol\";\nimport {ClausPrivacyBuy} from \"./ClausPrivacyBuy.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\n\n/// @notice Retains every allocation; ordinary buys/sells accrue buybacks for separate processing.\n/// @dev No new storage. Existing permissionless fixed-destination processing remains available.\ncontract FeeBatchedPrivacyHook is FeePrivacyHook {\n    IERC20 private immutable BUYBACK_TOKEN;\n    address private immutable BUYBACK_RECIPIENT;\n    error InvalidBatch();\n    error BatchOutputTooLow();\n    event BuybackBatchProcessed(uint256 spentEth, uint256 receivedTokens);\n\n    constructor(BaseConfig memory base, ClausPrivacyBuy privacyBuy_)\n        FeePrivacyHook(base, privacyBuy_) {\n        BUYBACK_TOKEN = IERC20(base.fomo.token());\n        BUYBACK_RECIPIENT = base.fomo.recipient();\n    }\n\n    function _processBuybacksInSwap() internal pure override returns (bool) { return false; }\n    function batchBuybacksEnabled() external pure returns (bool) { return true; }\n\n    /// @notice Anyone may pay gas, but cannot select recipients, change allocations or withdraw funds.\n    /// @dev Minimum tokens per ETH spent protects partial batches and newly accrued fees proportionally.\n    function processBuybacksGuarded(uint256 minimumTokensPerEth, uint256 maximumPendingEth, uint256 deadline)\n        external returns (uint256 spentEth, uint256 receivedTokens)\n    {\n        uint256 pending = pendingBurnEth() + pendingFomoEth();\n        if (block.timestamp > deadline || deadline > block.timestamp + 5 minutes\n            || minimumTokensPerEth == 0 || pending == 0 || pending > maximumPendingEth) revert InvalidBatch();\n        IERC20 token = BUYBACK_TOKEN;\n        address recipient = BUYBACK_RECIPIENT;\n        uint256 supplyBefore = token.totalSupply();\n        uint256 balanceBefore = token.balanceOf(recipient);\n        poolManager.unlock(abi.encode(uint8(1), msg.sender));\n        _checkpointPredictions();\n        spentEth = pending - pendingBurnEth() - pendingFomoEth();\n        receivedTokens = supplyBefore - token.totalSupply() + token.balanceOf(recipient) - balanceBefore;\n        if (spentEth == 0 || receivedTokens == 0\n            || FullMath.mulDiv(receivedTokens, 1 ether, spentEth) < minimumTokensPerEth) revert BatchOutputTooLow();\n        emit BuybackBatchProcessed(spentEth, receivedTokens);\n    }\n}\n"},"../../../lib/v4-periphery/src/libraries/Actions.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Library to define different pool actions.\n/// @dev These are suggested common commands, however additional commands should be defined as required\n/// Some of these actions are not supported in the Router contracts or Position Manager contracts, but are left as they may be helpful commands for other peripheral contracts.\nlibrary Actions {\n    // pool actions\n    // liquidity actions\n    uint256 internal constant INCREASE_LIQUIDITY = 0x00;\n    uint256 internal constant DECREASE_LIQUIDITY = 0x01;\n    uint256 internal constant MINT_POSITION = 0x02;\n    uint256 internal constant BURN_POSITION = 0x03;\n\n    /// @notice DEPRECATED: Vulnerable to sandwich attacks - do not use.\n    /// @dev The delta-based approach lacks minimum liquidity slippage protection, allowing\n    /// attackers to manipulate the price and reduce the liquidity received.\n    /// Use INCREASE_LIQUIDITY instead.\n    uint256 internal constant INCREASE_LIQUIDITY_FROM_DELTAS = 0x04;\n\n    /// @notice DEPRECATED: Vulnerable to sandwich attacks - do not use.\n    /// @dev The delta-based approach lacks minimum liquidity slippage protection, allowing\n    /// attackers to manipulate the price and reduce the liquidity received.\n    /// Use MINT_POSITION instead.\n    uint256 internal constant MINT_POSITION_FROM_DELTAS = 0x05;\n\n    // swapping\n    uint256 internal constant SWAP_EXACT_IN_SINGLE = 0x06;\n    uint256 internal constant SWAP_EXACT_IN = 0x07;\n    uint256 internal constant SWAP_EXACT_OUT_SINGLE = 0x08;\n    uint256 internal constant SWAP_EXACT_OUT = 0x09;\n\n    // donate\n    // note this is not supported in the position manager or router\n    uint256 internal constant DONATE = 0x0a;\n\n    // closing deltas on the pool manager\n    // settling\n    uint256 internal constant SETTLE = 0x0b;\n    uint256 internal constant SETTLE_ALL = 0x0c;\n    uint256 internal constant SETTLE_PAIR = 0x0d;\n    // taking\n    uint256 internal constant TAKE = 0x0e;\n    uint256 internal constant TAKE_ALL = 0x0f;\n    uint256 internal constant TAKE_PORTION = 0x10;\n    uint256 internal constant TAKE_PAIR = 0x11;\n\n    uint256 internal constant CLOSE_CURRENCY = 0x12;\n    uint256 internal constant CLEAR_OR_TAKE = 0x13;\n    uint256 internal constant SWEEP = 0x14;\n\n    uint256 internal constant WRAP = 0x15;\n    uint256 internal constant UNWRAP = 0x16;\n\n    // minting/burning 6909s to close deltas\n    // note this is not supported in the position manager or router\n    uint256 internal constant MINT_6909 = 0x17;\n    uint256 internal constant BURN_6909 = 0x18;\n\n    // permissioned-pools specific actions\n    // burns this contract's 6909 claim for a currency and takes the underlying to a recipient\n    uint256 internal constant UNWIND_WITH_FALLBACK = 0x19;\n}\n"},"../../../lib/v4-periphery/src/interfaces/INotifier.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {ISubscriber} from \"./ISubscriber.sol\";\n\n/// @title INotifier\n/// @notice Interface for the Notifier contract\ninterface INotifier {\n    /// @notice Thrown when unsubscribing without a subscriber\n    error NotSubscribed();\n    /// @notice Thrown when a subscriber does not have code\n    error NoCodeSubscriber();\n    /// @notice Thrown when a user specifies a gas limit too low to avoid valid unsubscribe notifications\n    error GasLimitTooLow();\n    /// @notice Wraps the revert message of the subscriber contract on a reverting subscription\n    error SubscriptionReverted(address subscriber, bytes reason);\n    /// @notice Wraps the revert message of the subscriber contract on a reverting modify liquidity notification\n    error ModifyLiquidityNotificationReverted(address subscriber, bytes reason);\n    /// @notice Wraps the revert message of the subscriber contract on a reverting burn notification\n    error BurnNotificationReverted(address subscriber, bytes reason);\n    /// @notice Thrown when a tokenId already has a subscriber\n    error AlreadySubscribed(uint256 tokenId, address subscriber);\n\n    /// @notice Emitted on a successful call to subscribe\n    event Subscription(uint256 indexed tokenId, address indexed subscriber);\n    /// @notice Emitted on a successful call to unsubscribe\n    event Unsubscription(uint256 indexed tokenId, address indexed subscriber);\n\n    /// @notice Returns the subscriber for a respective position\n    /// @param tokenId the ERC721 tokenId\n    /// @return subscriber the subscriber contract\n    function subscriber(uint256 tokenId) external view returns (ISubscriber subscriber);\n\n    /// @notice Enables the subscriber to receive notifications for a respective position\n    /// @param tokenId the ERC721 tokenId\n    /// @param newSubscriber the address of the subscriber contract\n    /// @param data caller-provided data that's forwarded to the subscriber contract\n    /// @dev Calling subscribe when a position is already subscribed will revert\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    /// @dev will revert if pool manager is locked\n    function subscribe(uint256 tokenId, address newSubscriber, bytes calldata data) external payable;\n\n    /// @notice Removes the subscriber from receiving notifications for a respective position\n    /// @param tokenId the ERC721 tokenId\n    /// @dev Callers must specify a high gas limit (remaining gas should be higher than unsubscriberGasLimit) such that the subscriber can be notified\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    /// @dev Must always allow a user to unsubscribe. In the case of a malicious subscriber, a user can always unsubscribe safely, ensuring liquidity is always modifiable.\n    /// @dev will revert if pool manager is locked\n    function unsubscribe(uint256 tokenId) external payable;\n\n    /// @notice Returns and determines the maximum allowable gas-used for notifying unsubscribe\n    /// @return uint256 the maximum gas limit when notifying a subscriber's `notifyUnsubscribe` function\n    function unsubscribeGasLimit() external view returns (uint256);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IEIP712_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IEIP712_v4\n/// @notice Interface for the EIP712 contract\ninterface IEIP712_v4 {\n    /// @notice Returns the domain separator for the current chain.\n    /// @return bytes32 The domain separator\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"../../../lib/v4-periphery/src/interfaces/ISubscriber.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {BalanceDelta} from \"@uniswap/v4-core/src/types/BalanceDelta.sol\";\nimport {PositionInfo} from \"../libraries/PositionInfoLibrary.sol\";\n\n/// @title ISubscriber\n/// @notice Interface that a Subscriber contract should implement to receive updates from the v4 position manager\ninterface ISubscriber {\n    /// @notice Called when a position subscribes to this subscriber contract\n    /// @param tokenId the token ID of the position\n    /// @param data additional data passed in by the caller\n    function notifySubscribe(uint256 tokenId, bytes memory data) external;\n\n    /// @notice Called when a position unsubscribes from the subscriber\n    /// @dev This call's gas is capped at `unsubscribeGasLimit` (set at deployment)\n    /// @dev Because of EIP-150, solidity may only allocate 63/64 of gasleft()\n    /// @param tokenId the token ID of the position\n    function notifyUnsubscribe(uint256 tokenId) external;\n\n    /// @notice Called when a position is burned\n    /// @param tokenId the token ID of the position\n    /// @param owner the current owner of the tokenId\n    /// @param info information about the position\n    /// @param liquidity the amount of liquidity decreased in the position, may be 0\n    /// @param feesAccrued the fees accrued by the position if liquidity was decreased\n    function notifyBurn(uint256 tokenId, address owner, PositionInfo info, uint256 liquidity, BalanceDelta feesAccrued)\n        external;\n\n    /// @notice Called when a position modifies its liquidity or collects fees\n    /// @param tokenId the token ID of the position\n    /// @param liquidityChange the change in liquidity on the underlying position\n    /// @param feesAccrued the fees to be collected from the position as a result of the modifyLiquidity call\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious user\n    /// Pools with a single liquidity position can inflate feeGrowthGlobal (and consequently feesAccrued) by donating to themselves;\n    /// atomically donating and collecting fees within the same unlockCallback may further inflate feeGrowthGlobal/feesAccrued\n    function notifyModifyLiquidity(uint256 tokenId, int256 liquidityChange, BalanceDelta feesAccrued) external;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolId.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"./PoolKey.sol\";\n\ntype PoolId is bytes32;\n\n/// @notice Library for computing the ID of a pool\nlibrary PoolIdLibrary {\n    /// @notice Returns value equal to keccak256(abi.encode(poolKey))\n    function toId(PoolKey memory poolKey) internal pure returns (PoolId poolId) {\n        assembly (\"memory-safe\") {\n            // 0xa0 represents the total size of the poolKey struct (5 slots of 32 bytes)\n            poolId := keccak256(poolKey, 0xa0)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/src/interfaces/IMulticall_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IMulticall_v4\n/// @notice Interface for the Multicall_v4 contract\ninterface IMulticall_v4 {\n    /// @notice Call multiple functions in the current contract and return the data from all of them if they all succeed\n    /// @dev The `msg.value` is passed onto all subcalls, even if a previous subcall has consumed the ether.\n    /// Subcalls can instead use `address(this).value` to see the available ETH, and consume it using {value: x}.\n    /// @param data The encoded function data for each of the calls to make to this contract\n    /// @return results The results from each of the calls passed in via data\n    function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolKey.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"./Currency.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {PoolIdLibrary} from \"./PoolId.sol\";\n\nusing PoolIdLibrary for PoolKey global;\n\n/// @notice Returns the key for identifying a pool\nstruct PoolKey {\n    /// @notice The lower currency of the pool, sorted numerically\n    Currency currency0;\n    /// @notice The higher currency of the pool, sorted numerically\n    Currency currency1;\n    /// @notice The pool LP fee, capped at 1_000_000. If the highest bit is 1, the pool has a dynamic fee and must be exactly equal to 0x800000\n    uint24 fee;\n    /// @notice Ticks that involve positions must be a multiple of tick spacing\n    int24 tickSpacing;\n    /// @notice The hooks of the pool\n    IHooks hooks;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Lock.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\n/// @notice This is a temporary library that allows us to use transient storage (tstore/tload)\n/// TODO: This library can be deleted when we have the transient keyword support in solidity.\nlibrary Lock {\n    // The slot holding the unlocked state, transiently. bytes32(uint256(keccak256(\"Unlocked\")) - 1)\n    bytes32 internal constant IS_UNLOCKED_SLOT = 0xc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab23;\n\n    function unlock() internal {\n        assembly (\"memory-safe\") {\n            // unlock\n            tstore(IS_UNLOCKED_SLOT, true)\n        }\n    }\n\n    function lock() internal {\n        assembly (\"memory-safe\") {\n            tstore(IS_UNLOCKED_SLOT, false)\n        }\n    }\n\n    function isUnlocked() internal view returns (bool unlocked) {\n        assembly (\"memory-safe\") {\n            unlocked := tload(IS_UNLOCKED_SLOT)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/Currency.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\nimport {CustomRevert} from \"../libraries/CustomRevert.sol\";\n\ntype Currency is address;\n\nusing {greaterThan as >, lessThan as <, greaterThanOrEqualTo as >=, equals as ==} for Currency global;\nusing CurrencyLibrary for Currency global;\n\nfunction equals(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) == Currency.unwrap(other);\n}\n\nfunction greaterThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) > Currency.unwrap(other);\n}\n\nfunction lessThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) < Currency.unwrap(other);\n}\n\nfunction greaterThanOrEqualTo(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) >= Currency.unwrap(other);\n}\n\n/// @title CurrencyLibrary\n/// @dev This library allows for transferring and holding native tokens and ERC20 tokens\nlibrary CurrencyLibrary {\n    /// @notice Additional context for ERC-7751 wrapped error when a native transfer fails\n    error NativeTransferFailed();\n\n    /// @notice Additional context for ERC-7751 wrapped error when an ERC20 transfer fails\n    error ERC20TransferFailed();\n\n    /// @notice A constant to represent the native currency\n    Currency public constant ADDRESS_ZERO = Currency.wrap(address(0));\n\n    function transfer(Currency currency, address to, uint256 amount) internal {\n        // altered from https://github.com/transmissions11/solmate/blob/44a9963d4c78111f77caa0e65d677b8b46d6f2e6/src/utils/SafeTransferLib.sol\n        // modified custom error selectors\n\n        bool success;\n        if (currency.isAddressZero()) {\n            assembly (\"memory-safe\") {\n                // Transfer the ETH and revert if it fails.\n                success := call(gas(), to, amount, 0, 0, 0, 0)\n            }\n            // revert with NativeTransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(to, bytes4(0), NativeTransferFailed.selector);\n            }\n        } else {\n            assembly (\"memory-safe\") {\n                // Get a pointer to some free memory.\n                let fmp := mload(0x40)\n\n                // Write the abi-encoded calldata into memory, beginning with the function selector.\n                mstore(fmp, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n                mstore(add(fmp, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the \"to\" argument.\n                mstore(add(fmp, 36), amount) // Append the \"amount\" argument. Masking not required as it's a full 32 byte type.\n\n                success :=\n                    and(\n                        // Set success to whether the call reverted, if not we check it either\n                        // returned exactly 1 (can't just be non-zero data), or had no return data.\n                        or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n                        // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n                        // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n                        // Counterintuitively, this call must be positioned second to the or() call in the\n                        // surrounding and() call or else returndatasize() will be zero during the computation.\n                        call(gas(), currency, 0, fmp, 68, 0, 32)\n                    )\n\n                // Now clean the memory we used\n                mstore(fmp, 0) // 4 byte `selector` and 28 bytes of `to` were stored here\n                mstore(add(fmp, 0x20), 0) // 4 bytes of `to` and 28 bytes of `amount` were stored here\n                mstore(add(fmp, 0x40), 0) // 4 bytes of `amount` were stored here\n            }\n            // revert with ERC20TransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(\n                    Currency.unwrap(currency), IERC20Minimal.transfer.selector, ERC20TransferFailed.selector\n                );\n            }\n        }\n    }\n\n    function balanceOfSelf(Currency currency) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return address(this).balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(address(this));\n        }\n    }\n\n    function balanceOf(Currency currency, address owner) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return owner.balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(owner);\n        }\n    }\n\n    function isAddressZero(Currency currency) internal pure returns (bool) {\n        return Currency.unwrap(currency) == Currency.unwrap(ADDRESS_ZERO);\n    }\n\n    function toId(Currency currency) internal pure returns (uint256) {\n        return uint160(Currency.unwrap(currency));\n    }\n\n    // If the upper 12 bytes are non-zero, they will be zero-ed out\n    // Therefore, fromId() and toId() are not inverses of each other\n    function fromId(uint256 id) internal pure returns (Currency) {\n        return Currency.wrap(address(uint160(id)));\n    }\n}\n"},"../../../lib/v4-periphery/src/interfaces/IImmutableState.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IPoolManager} from \"@uniswap/v4-core/src/interfaces/IPoolManager.sol\";\n\n/// @title IImmutableState\n/// @notice Interface for the ImmutableState contract\ninterface IImmutableState {\n    /// @notice The Uniswap v4 PoolManager contract\n    function poolManager() external view returns (IPoolManager);\n}\n"},"../../../lib/v4-periphery/src/interfaces/IUnorderedNonce.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IUnorderedNonce\n/// @notice Interface for the UnorderedNonce contract\ninterface IUnorderedNonce {\n    error NonceAlreadyUsed();\n\n    /// @notice mapping of nonces consumed by each address, where a nonce is a single bit on the 256-bit bitmap\n    /// @dev word is at most type(uint248).max\n    function nonces(address owner, uint256 word) external view returns (uint256);\n\n    /// @notice Revoke a nonce by spending it, preventing it from being used again\n    /// @dev Used in cases where a valid nonce has not been broadcasted onchain, and the owner wants to revoke the validity of the nonce\n    /// @dev payable so it can be multicalled with native-token related actions\n    function revokeNonce(uint256 nonce) external payable;\n}\n"},"../../../lib/v4-periphery/src/libraries/LiquidityAmounts.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"@uniswap/v4-core/src/libraries/FullMath.sol\";\nimport {FixedPoint96} from \"@uniswap/v4-core/src/libraries/FixedPoint96.sol\";\nimport {SafeCast} from \"@uniswap/v4-core/src/libraries/SafeCast.sol\";\n\n/// @notice Provides functions for computing liquidity amounts from token amounts and prices\nlibrary LiquidityAmounts {\n    using SafeCast for uint256;\n\n    /// @notice Computes the amount of liquidity received for a given amount of token0 and price range\n    /// @dev Calculates amount0 * (sqrt(upper) * sqrt(lower)) / (sqrt(upper) - sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount0 The amount0 being sent in\n    /// @return liquidity The amount of returned liquidity\n    function getLiquidityForAmount0(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint256 amount0)\n        internal\n        pure\n        returns (uint128 liquidity)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n            uint256 intermediate = FullMath.mulDiv(sqrtPriceAX96, sqrtPriceBX96, FixedPoint96.Q96);\n            return FullMath.mulDiv(amount0, intermediate, sqrtPriceBX96 - sqrtPriceAX96).toUint128();\n        }\n    }\n\n    /// @notice Computes the amount of liquidity received for a given amount of token1 and price range\n    /// @dev Calculates amount1 / (sqrt(upper) - sqrt(lower)).\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount1 The amount1 being sent in\n    /// @return liquidity The amount of returned liquidity\n    function getLiquidityForAmount1(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint256 amount1)\n        internal\n        pure\n        returns (uint128 liquidity)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n            return FullMath.mulDiv(amount1, FixedPoint96.Q96, sqrtPriceBX96 - sqrtPriceAX96).toUint128();\n        }\n    }\n\n    /// @notice Computes the maximum amount of liquidity received for a given amount of token0, token1, the current\n    /// pool prices and the prices at the tick boundaries\n    /// @param sqrtPriceX96 A sqrt price representing the current pool prices\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount0 The amount of token0 being sent in\n    /// @param amount1 The amount of token1 being sent in\n    /// @return liquidity The maximum amount of liquidity received\n    function getLiquidityForAmounts(\n        uint160 sqrtPriceX96,\n        uint160 sqrtPriceAX96,\n        uint160 sqrtPriceBX96,\n        uint256 amount0,\n        uint256 amount1\n    ) internal pure returns (uint128 liquidity) {\n        if (sqrtPriceAX96 > sqrtPriceBX96) {\n            (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n        }\n\n        if (sqrtPriceX96 <= sqrtPriceAX96) {\n            liquidity = getLiquidityForAmount0(sqrtPriceAX96, sqrtPriceBX96, amount0);\n        } else if (sqrtPriceX96 < sqrtPriceBX96) {\n            uint128 liquidity0 = getLiquidityForAmount0(sqrtPriceX96, sqrtPriceBX96, amount0);\n            uint128 liquidity1 = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceX96, amount1);\n\n            liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1;\n        } else {\n            liquidity = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceBX96, amount1);\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Bytes.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Bytes.sol)\n\npragma solidity ^0.8.24;\n\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Bytes operations.\n */\nlibrary Bytes {\n    /**\n     * @dev Forward search for `s` in `buffer`\n     * * If `s` is present in the buffer, returns the index of the first instance\n     * * If `s` is not present in the buffer, returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf[Javascript's `Array.indexOf`]\n     */\n    function indexOf(bytes memory buffer, bytes1 s) internal pure returns (uint256) {\n        return indexOf(buffer, s, 0);\n    }\n\n    /**\n     * @dev Forward search for `s` in `buffer` starting at position `pos`\n     * * If `s` is present in the buffer (at or after `pos`), returns the index of the next instance\n     * * If `s` is not present in the buffer (at or after `pos`), returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf[Javascript's `Array.indexOf`]\n     */\n    function indexOf(bytes memory buffer, bytes1 s, uint256 pos) internal pure returns (uint256) {\n        uint256 length = buffer.length;\n        for (uint256 i = pos; i < length; ++i) {\n            if (bytes1(_unsafeReadBytesOffset(buffer, i)) == s) {\n                return i;\n            }\n        }\n        return type(uint256).max;\n    }\n\n    /**\n     * @dev Backward search for `s` in `buffer`\n     * * If `s` is present in the buffer, returns the index of the last instance\n     * * If `s` is not present in the buffer, returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf[Javascript's `Array.lastIndexOf`]\n     */\n    function lastIndexOf(bytes memory buffer, bytes1 s) internal pure returns (uint256) {\n        return lastIndexOf(buffer, s, type(uint256).max);\n    }\n\n    /**\n     * @dev Backward search for `s` in `buffer` starting at position `pos`\n     * * If `s` is present in the buffer (at or before `pos`), returns the index of the previous instance\n     * * If `s` is not present in the buffer (at or before `pos`), returns type(uint256).max\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf[Javascript's `Array.lastIndexOf`]\n     */\n    function lastIndexOf(bytes memory buffer, bytes1 s, uint256 pos) internal pure returns (uint256) {\n        unchecked {\n            uint256 length = buffer.length;\n            for (uint256 i = Math.min(Math.saturatingAdd(pos, 1), length); i > 0; --i) {\n                if (bytes1(_unsafeReadBytesOffset(buffer, i - 1)) == s) {\n                    return i - 1;\n                }\n            }\n            return type(uint256).max;\n        }\n    }\n\n    /**\n     * @dev Copies the content of `buffer`, from `start` (included) to the end of `buffer` into a new bytes object in\n     * memory.\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice[Javascript's `Array.slice`]\n     */\n    function slice(bytes memory buffer, uint256 start) internal pure returns (bytes memory) {\n        return slice(buffer, start, buffer.length);\n    }\n\n    /**\n     * @dev Copies the content of `buffer`, from `start` (included) to `end` (excluded) into a new bytes object in\n     * memory. The `end` argument is truncated to the length of the `buffer`.\n     *\n     * NOTE: replicates the behavior of https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice[Javascript's `Array.slice`]\n     */\n    function slice(bytes memory buffer, uint256 start, uint256 end) internal pure returns (bytes memory) {\n        // sanitize\n        end = Math.min(end, buffer.length);\n        start = Math.min(start, end);\n\n        // allocate and copy\n        bytes memory result = new bytes(end - start);\n        assembly (\"memory-safe\") {\n            mcopy(add(result, 0x20), add(add(buffer, 0x20), start), sub(end, start))\n        }\n\n        return result;\n    }\n\n    /**\n     * @dev Moves the content of `buffer`, from `start` (included) to the end of `buffer` to the start of that buffer,\n     * and shrinks the buffer length accordingly, effectively overriding the content of buffer with buffer[start:].\n     *\n     * NOTE: This function modifies the provided buffer in place. If you need to preserve the original buffer, use {slice} instead\n     */\n    function splice(bytes memory buffer, uint256 start) internal pure returns (bytes memory) {\n        return splice(buffer, start, buffer.length);\n    }\n\n    /**\n     * @dev Moves the content of `buffer`, from `start` (included) to `end` (excluded) to the start of that buffer,\n     * and shrinks the buffer length accordingly, effectively overriding the content of buffer with buffer[start:end].\n     * The `end` argument is truncated to the length of the `buffer`.\n     *\n     * NOTE: This function modifies the provided buffer in place. If you need to preserve the original buffer, use {slice} instead\n     */\n    function splice(bytes memory buffer, uint256 start, uint256 end) internal pure returns (bytes memory) {\n        // sanitize\n        end = Math.min(end, buffer.length);\n        start = Math.min(start, end);\n\n        // move and resize\n        assembly (\"memory-safe\") {\n            mcopy(add(buffer, 0x20), add(add(buffer, 0x20), start), sub(end, start))\n            mstore(buffer, sub(end, start))\n        }\n\n        return buffer;\n    }\n\n    /**\n     * @dev Replaces bytes in `buffer` starting at `pos` with all bytes from `replacement`.\n     *\n     * Parameters are clamped to valid ranges (i.e. `pos` is clamped to `[0, buffer.length]`).\n     * If `pos >= buffer.length`, no replacement occurs and the buffer is returned unchanged.\n     *\n     * NOTE: This function modifies the provided buffer in place.\n     */\n    function replace(bytes memory buffer, uint256 pos, bytes memory replacement) internal pure returns (bytes memory) {\n        return replace(buffer, pos, replacement, 0, replacement.length);\n    }\n\n    /**\n     * @dev Replaces bytes in `buffer` starting at `pos` with bytes from `replacement` starting at `offset`.\n     * Copies at most `length` bytes from `replacement` to `buffer`.\n     *\n     * Parameters are clamped to valid ranges (i.e. `pos` is clamped to `[0, buffer.length]`, `offset` is\n     * clamped to `[0, replacement.length]`, and `length` is clamped to `min(length, replacement.length - offset,\n     * buffer.length - pos))`. If `pos >= buffer.length` or `offset >= replacement.length`, no replacement occurs\n     * and the buffer is returned unchanged.\n     *\n     * NOTE: This function modifies the provided buffer in place.\n     */\n    function replace(\n        bytes memory buffer,\n        uint256 pos,\n        bytes memory replacement,\n        uint256 offset,\n        uint256 length\n    ) internal pure returns (bytes memory) {\n        // sanitize\n        pos = Math.min(pos, buffer.length);\n        offset = Math.min(offset, replacement.length);\n        length = Math.min(length, Math.min(replacement.length - offset, buffer.length - pos));\n\n        // replace\n        assembly (\"memory-safe\") {\n            mcopy(add(add(buffer, 0x20), pos), add(add(replacement, 0x20), offset), length)\n        }\n\n        return buffer;\n    }\n\n    /**\n     * @dev Concatenate an array of bytes into a single bytes object.\n     *\n     * For fixed bytes types, we recommend using the solidity built-in `bytes.concat` or (equivalent)\n     * `abi.encodePacked`.\n     *\n     * NOTE: this could be done in assembly with a single loop that expands starting at the FMP, but that would be\n     * significantly less readable. It might be worth benchmarking the savings of the full-assembly approach.\n     */\n    function concat(bytes[] memory buffers) internal pure returns (bytes memory) {\n        uint256 length = 0;\n        for (uint256 i = 0; i < buffers.length; ++i) {\n            length += buffers[i].length;\n        }\n\n        bytes memory result = new bytes(length);\n\n        uint256 offset = 0x20;\n        for (uint256 i = 0; i < buffers.length; ++i) {\n            bytes memory input = buffers[i];\n            assembly (\"memory-safe\") {\n                mcopy(add(result, offset), add(input, 0x20), mload(input))\n            }\n            unchecked {\n                offset += input.length;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * @dev Split each byte in `input` into two nibbles (4 bits each)\n     *\n     * Example: hex\"01234567\" → hex\"0001020304050607\"\n     */\n    function toNibbles(bytes memory input) internal pure returns (bytes memory output) {\n        assembly (\"memory-safe\") {\n            let length := mload(input)\n            output := mload(0x40)\n            mstore(0x40, add(add(output, 0x20), mul(length, 2)))\n            mstore(output, mul(length, 2))\n            for {\n                let i := 0\n            } lt(i, length) {\n                i := add(i, 0x10)\n            } {\n                let chunk := shr(128, mload(add(add(input, 0x20), i)))\n                chunk := and(\n                    0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff,\n                    or(shl(64, chunk), chunk)\n                )\n                chunk := and(\n                    0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff,\n                    or(shl(32, chunk), chunk)\n                )\n                chunk := and(\n                    0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff,\n                    or(shl(16, chunk), chunk)\n                )\n                chunk := and(\n                    0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff,\n                    or(shl(8, chunk), chunk)\n                )\n                chunk := and(\n                    0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f,\n                    or(shl(4, chunk), chunk)\n                )\n                mstore(add(add(output, 0x20), mul(i, 2)), chunk)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns true if the two byte buffers are equal.\n     */\n    function equal(bytes memory a, bytes memory b) internal pure returns (bool) {\n        return a.length == b.length && keccak256(a) == keccak256(b);\n    }\n\n    /**\n     * @dev Reverses the byte order of a bytes32 value, converting between little-endian and big-endian.\n     * Inspired by https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel[Reverse Parallel]\n     */\n    function reverseBytes32(bytes32 value) internal pure returns (bytes32) {\n        value = // swap bytes\n            ((value >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) |\n            ((value & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\n        value = // swap 2-byte long pairs\n            ((value >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) |\n            ((value & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\n        value = // swap 4-byte long pairs\n            ((value >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) |\n            ((value & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\n        value = // swap 8-byte long pairs\n            ((value >> 64) & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) |\n            ((value & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\n        return (value >> 128) | (value << 128); // swap 16-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 128-bit values.\n    function reverseBytes16(bytes16 value) internal pure returns (bytes16) {\n        value = // swap bytes\n            ((value & 0xFF00FF00FF00FF00FF00FF00FF00FF00) >> 8) |\n            ((value & 0x00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\n        value = // swap 2-byte long pairs\n            ((value & 0xFFFF0000FFFF0000FFFF0000FFFF0000) >> 16) |\n            ((value & 0x0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\n        value = // swap 4-byte long pairs\n            ((value & 0xFFFFFFFF00000000FFFFFFFF00000000) >> 32) |\n            ((value & 0x00000000FFFFFFFF00000000FFFFFFFF) << 32);\n        return (value >> 64) | (value << 64); // swap 8-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 64-bit values.\n    function reverseBytes8(bytes8 value) internal pure returns (bytes8) {\n        value = ((value & 0xFF00FF00FF00FF00) >> 8) | ((value & 0x00FF00FF00FF00FF) << 8); // swap bytes\n        value = ((value & 0xFFFF0000FFFF0000) >> 16) | ((value & 0x0000FFFF0000FFFF) << 16); // swap 2-byte long pairs\n        return (value >> 32) | (value << 32); // swap 4-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 32-bit values.\n    function reverseBytes4(bytes4 value) internal pure returns (bytes4) {\n        value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); // swap bytes\n        return (value >> 16) | (value << 16); // swap 2-byte long pairs\n    }\n\n    /// @dev Same as {reverseBytes32} but optimized for 16-bit values.\n    function reverseBytes2(bytes2 value) internal pure returns (bytes2) {\n        return (value >> 8) | (value << 8);\n    }\n\n    /**\n     * @dev Counts the number of leading zero bits a bytes array. Returns `8 * buffer.length`\n     * if the buffer is all zeros.\n     */\n    function clz(bytes memory buffer) internal pure returns (uint256) {\n        for (uint256 i = 0; i < buffer.length; i += 0x20) {\n            bytes32 chunk = _unsafeReadBytesOffset(buffer, i);\n            if (chunk != bytes32(0)) {\n                return Math.min(8 * i + Math.clz(uint256(chunk)), 8 * buffer.length);\n            }\n        }\n        return 8 * buffer.length;\n    }\n\n    /**\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            value := mload(add(add(buffer, 0x20), offset))\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/src/interfaces/IERC721Permit_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title IERC721Permit_v4\n/// @notice Interface for the ERC721Permit_v4 contract\ninterface IERC721Permit_v4 {\n    error SignatureDeadlineExpired();\n    error NoSelfPermit();\n    error Unauthorized();\n\n    /// @notice Approve of a specific token ID for spending by spender via signature\n    /// @param spender The account that is being approved\n    /// @param tokenId The ID of the token that is being approved for spending\n    /// @param deadline The deadline timestamp by which the call must be mined for the approve to work\n    /// @param nonce a unique value, for an owner, to prevent replay attacks; an unordered nonce where the top 248 bits correspond to a word and the bottom 8 bits calculate the bit position of the word\n    /// @param signature Concatenated data from a valid secp256k1 signature from the holder, i.e. abi.encodePacked(r, s, v)\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    function permit(address spender, uint256 tokenId, uint256 deadline, uint256 nonce, bytes calldata signature)\n        external\n        payable;\n\n    /// @notice Set an operator with full permission to an owner's tokens via signature\n    /// @param owner The address that is setting the operator\n    /// @param operator The address that will be set as an operator for the owner\n    /// @param approved The permission to set on the operator\n    /// @param deadline The deadline timestamp by which the call must be mined for the approve to work\n    /// @param nonce a unique value, for an owner, to prevent replay attacks; an unordered nonce where the top 248 bits correspond to a word and the bottom 8 bits calculate the bit position of the word\n    /// @param signature Concatenated data from a valid secp256k1 signature from the holder, i.e. abi.encodePacked(r, s, v)\n    /// @dev payable so it can be multicalled with NATIVE related actions\n    function permitForAll(\n        address owner,\n        address operator,\n        bool approved,\n        uint256 deadline,\n        uint256 nonce,\n        bytes calldata signature\n    ) external payable;\n}\n"},"../../../lib/v4-periphery/src/interfaces/IPositionManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\nimport {PositionInfo} from \"../libraries/PositionInfoLibrary.sol\";\n\nimport {INotifier} from \"./INotifier.sol\";\nimport {IImmutableState} from \"./IImmutableState.sol\";\nimport {IERC721Permit_v4} from \"./IERC721Permit_v4.sol\";\nimport {IEIP712_v4} from \"./IEIP712_v4.sol\";\nimport {IMulticall_v4} from \"./IMulticall_v4.sol\";\nimport {IPoolInitializer_v4} from \"./IPoolInitializer_v4.sol\";\nimport {IUnorderedNonce} from \"./IUnorderedNonce.sol\";\nimport {IPermit2Forwarder} from \"./IPermit2Forwarder.sol\";\n\n/// @title IPositionManager\n/// @notice Interface for the PositionManager contract\ninterface IPositionManager is\n    INotifier,\n    IImmutableState,\n    IERC721Permit_v4,\n    IEIP712_v4,\n    IMulticall_v4,\n    IPoolInitializer_v4,\n    IUnorderedNonce,\n    IPermit2Forwarder\n{\n    /// @notice Emitted by the position manager for each modifyLiquidity call, mirroring PoolManager\n    ///         ModifyLiquidity except `sender` is the unlock locker (end user), not the position manager.\n    event ModifyPosition(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Thrown when the caller is not approved to modify a position\n    error NotApproved(address caller);\n    /// @notice Thrown when the block.timestamp exceeds the user-provided deadline\n    error DeadlinePassed(uint256 deadline);\n    /// @notice Thrown when calling transfer, subscribe, or unsubscribe when the PoolManager is unlocked.\n    /// @dev This is to prevent hooks from being able to trigger notifications at the same time the position is being modified.\n    error PoolManagerMustBeLocked();\n\n    /// @notice Unlocks Uniswap v4 PoolManager and batches actions for modifying liquidity\n    /// @dev This is the standard entrypoint for the PositionManager\n    /// @param unlockData is an encoding of actions, and parameters for those actions\n    /// @param deadline is the deadline for the batched actions to be executed\n    function modifyLiquidities(bytes calldata unlockData, uint256 deadline) external payable;\n\n    /// @notice Batches actions for modifying liquidity without unlocking v4 PoolManager\n    /// @dev This must be called by a contract that has already unlocked the v4 PoolManager\n    /// @param actions the actions to perform\n    /// @param params the parameters to provide for the actions\n    function modifyLiquiditiesWithoutUnlock(bytes calldata actions, bytes[] calldata params) external payable;\n\n    /// @notice Used to get the ID that will be used for the next minted liquidity position\n    /// @return uint256 The next token ID\n    function nextTokenId() external view returns (uint256);\n\n    /// @notice Returns the liquidity of a position\n    /// @param tokenId the ERC721 tokenId\n    /// @return liquidity the position's liquidity, as a liquidityAmount\n    /// @dev this value can be processed as an amount0 and amount1 by using the LiquidityAmounts library\n    function getPositionLiquidity(uint256 tokenId) external view returns (uint128 liquidity);\n\n    /// @notice Returns the pool key and position info of a position\n    /// @param tokenId the ERC721 tokenId\n    /// @return poolKey the pool key of the position\n    /// @return PositionInfo a uint256 packed value holding information about the position including the range (tickLower, tickUpper)\n    function getPoolAndPositionInfo(uint256 tokenId) external view returns (PoolKey memory, PositionInfo);\n\n    /// @notice Returns the position info of a position\n    /// @param tokenId the ERC721 tokenId\n    /// @return a uint256 packed value holding information about the position including the range (tickLower, tickUpper)\n    function positionInfo(uint256 tokenId) external view returns (PositionInfo);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Base64.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Base64.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./math/SafeCast.sol\";\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n */\nlibrary Base64 {\n    using SafeCast for bool;\n\n    error InvalidBase64Char(bytes1);\n\n    /**\n     * @dev Converts a `bytes` to its Base64 `string` representation.\n     */\n    function encode(bytes memory data) internal pure returns (string memory) {\n        return string(_encode(data, false));\n    }\n\n    /**\n     * @dev Converts a `bytes` to its Base64Url `string` representation.\n     * Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].\n     */\n    function encodeURL(bytes memory data) internal pure returns (string memory) {\n        return string(_encode(data, true));\n    }\n\n    /**\n     * @dev Converts a Base64 `string` to the `bytes` it represents.\n     *\n     * * Supports padded and unpadded inputs.\n     * * Supports both encoding ({encode} and {encodeURL}) seamlessly.\n     * * Reverts with {InvalidBase64Char} if the input contains an invalid character.\n     */\n    function decode(string memory data) internal pure returns (bytes memory) {\n        return _decode(bytes(data));\n    }\n\n    /**\n     * @dev Internal table-agnostic encoding\n     *\n     * Padding is enabled when using the Base64 table, and disabled when using the Base64Url table.\n     * See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648\n     */\n    function _encode(bytes memory data, bool urlAndFilenameSafe) private pure returns (bytes memory result) {\n        /**\n         * Inspired by Brecht Devos (Brechtpd) implementation - MIT license\n         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n         */\n        if (data.length == 0) return \"\";\n\n        // Padding is enabled by default, but disabled when the \"urlAndFilenameSafe\" alphabet is used\n        //\n        // If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then\n        // multiplied by 4 so that it leaves room for padding the last chunk\n        // - `data.length + 2`  -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // - `4 *`              -> 4 characters for each chunk\n        // This is equivalent to: 4 * Math.ceil(data.length / 3)\n        //\n        // If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as\n        // opposed to when padding is required to fill the last chunk.\n        // - `4 * data.length`  -> 4 characters for each chunk\n        // - ` + 2`             -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // This is equivalent to: Math.ceil((4 * data.length) / 3)\n        uint256 resultLength = urlAndFilenameSafe ? (4 * data.length + 2) / 3 : 4 * ((data.length + 2) / 3);\n\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n\n            // Store the encoding table in the scratch space (and fmp ptr) to avoid memory allocation\n            //\n            // Base64    (ascii)  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /\n            // Base64    (hex)   4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f\n            // Base64Url (ascii)  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 - _\n            // Base64Url (hex)   4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f\n            // xor       (hex)   00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000670\n            mstore(0x1f, \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef\")\n            mstore(0x3f, xor(\"ghijklmnopqrstuvwxyz0123456789+/\", mul(urlAndFilenameSafe, 0x670)))\n\n            // Prepare result pointer, jump over length\n            let resultPtr := add(result, 0x20)\n            let resultEnd := add(resultPtr, resultLength)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to zero to make sure no dirty bytes are read in that section.\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n\n            // Run over the input, 3 bytes at a time\n            for {} lt(dataPtr, endPtr) {} {\n                // Advance 3 bytes\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n\n                // To write each character, shift the 3 byte (24 bits) chunk\n                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n                // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n                // Use this as an index into the lookup table, mload an entire word\n                // so the desired character is in the least significant byte, and\n                // mstore8 this least significant byte into the result and continue.\n                mstore8(resultPtr, mload(and(shr(18, input), 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n                mstore8(resultPtr, mload(and(shr(12, input), 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n                mstore8(resultPtr, mload(and(shr(6, input), 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n                mstore8(resultPtr, mload(and(input, 0x3F)))\n                resultPtr := add(resultPtr, 1) // Advance\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            if iszero(urlAndFilenameSafe) {\n                // When data `bytes` is not exactly 3 bytes long\n                // it is padded with `=` characters at the end\n                switch mod(mload(data), 3)\n                case 1 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                    mstore8(sub(resultPtr, 2), 0x3d)\n                }\n                case 2 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                }\n            }\n\n            // Store result length and update FMP to reserve allocated space\n            mstore(result, resultLength)\n            mstore(0x40, resultEnd)\n        }\n    }\n\n    /**\n     * @dev Internal decoding\n     */\n    function _decode(bytes memory data) private pure returns (bytes memory result) {\n        bytes4 errorSelector = InvalidBase64Char.selector;\n\n        uint256 dataLength = data.length;\n        if (dataLength == 0) return \"\";\n\n        uint256 resultLength = (dataLength / 4) * 3;\n        if (dataLength % 4 == 0) {\n            resultLength -= (data[dataLength - 1] == \"=\").toUint() + (data[dataLength - 2] == \"=\").toUint();\n        } else {\n            resultLength += (dataLength % 4) - 1;\n        }\n\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n\n            // Temporarily store the reverse lookup table between in memory. This spans from 0x00 to 0x50, Using:\n            // - all 64bytes of scratch space\n            // - part of the FMP (at location 0x40)\n            mstore(0x30, 0x2425262728292a2b2c2d2e2f30313233)\n            mstore(0x20, 0x0a0b0c0d0e0f10111213141516171819ffffffff3fff1a1b1c1d1e1f20212223)\n            mstore(0x00, 0x3eff3eff3f3435363738393a3b3c3dffffff00ffffff00010203040506070809)\n\n            // Prepare result pointer, jump over length\n            let dataPtr := data\n            let resultPtr := add(result, 0x20)\n            let endPtr := add(resultPtr, resultLength)\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to \"==\" (fake padding) to make sure no dirty bytes are read in that section.\n            let afterPtr := add(add(data, 0x20), dataLength)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, shl(240, 0x3d3d))\n\n            // loop while not everything is decoded\n            for {} lt(resultPtr, endPtr) {} {\n                dataPtr := add(dataPtr, 4)\n\n                // Read a 4 bytes chunk of data\n                let input := mload(dataPtr)\n\n                // Decode each byte in the chunk as a 6 bit block, and align them to form a block of 3 bytes\n                let a := sub(byte(28, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(a, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(a, 43)))\n                    revert(0, 0x24)\n                }\n                let b := sub(byte(29, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(b, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(b, 43)))\n                    revert(0, 0x24)\n                }\n                let c := sub(byte(30, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(c, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(c, 43)))\n                    revert(0, 0x24)\n                }\n                let d := sub(byte(31, input), 43)\n                // slither-disable-next-line incorrect-shift\n                if iszero(and(shl(d, 1), 0xffffffd0ffffffc47ff5)) {\n                    mstore(0, errorSelector)\n                    mstore(4, shl(248, add(d, 43)))\n                    revert(0, 0x24)\n                }\n\n                mstore(\n                    resultPtr,\n                    or(\n                        or(shl(250, byte(0, mload(a))), shl(244, byte(0, mload(b)))),\n                        or(shl(238, byte(0, mload(c))), shl(232, byte(0, mload(d))))\n                    )\n                )\n\n                resultPtr := add(resultPtr, 3)\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            // Store result length and update FMP to reserve allocated space\n            mstore(result, resultLength)\n            mstore(0x40, endPtr)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/src/interfaces/IPermit2Forwarder.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IAllowanceTransfer} from \"permit2/src/interfaces/IAllowanceTransfer.sol\";\n\n/// @title IPermit2Forwarder\n/// @notice Interface for the Permit2Forwarder contract\ninterface IPermit2Forwarder {\n    /// @notice allows forwarding a single permit to permit2\n    /// @dev this function is payable to allow multicall with NATIVE based actions\n    /// @param owner the owner of the tokens\n    /// @param permitSingle the permit data\n    /// @param signature the signature of the permit; abi.encodePacked(r, s, v)\n    /// @return err the error returned by a reverting permit call, empty if successful\n    function permit(address owner, IAllowanceTransfer.PermitSingle calldata permitSingle, bytes calldata signature)\n        external\n        payable\n        returns (bytes memory err);\n\n    /// @notice allows forwarding batch permits to permit2\n    /// @dev this function is payable to allow multicall with NATIVE based actions\n    /// @param owner the owner of the tokens\n    /// @param _permitBatch a batch of approvals\n    /// @param signature the signature of the permit; abi.encodePacked(r, s, v)\n    /// @return err the error returned by a reverting permit call, empty if successful\n    function permitBatch(address owner, IAllowanceTransfer.PermitBatch calldata _permitBatch, bytes calldata signature)\n        external\n        payable\n        returns (bytes memory err);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Strings.sol)\n\npragma solidity ^0.8.24;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\nimport {Bytes} from \"./Bytes.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    using SafeCast for *;\n\n    bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n    uint8 private constant ADDRESS_LENGTH = 20;\n    uint256 private constant SPECIAL_CHARS_LOOKUP =\n        0xffffffff | // first 32 bits corresponding to the control characters (U+0000 to U+001F)\n            (1 << 0x22) | // double quote\n            (1 << 0x5c); // backslash\n\n    /**\n     * @dev The `value` string doesn't fit in the specified `length`.\n     */\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n    /**\n     * @dev The string being parsed contains characters that are not in scope of the given base.\n     */\n    error StringsInvalidChar();\n\n    /**\n     * @dev The string being parsed is not a properly formatted address.\n     */\n    error StringsInvalidAddressFormat();\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = Math.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            assembly (\"memory-safe\") {\n                ptr := add(add(buffer, 0x20), length)\n            }\n            while (true) {\n                ptr--;\n                assembly (\"memory-safe\") {\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toStringSigned(int256 value) internal pure returns (string memory) {\n        return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, Math.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        uint256 localValue = value;\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = HEX_DIGITS[localValue & 0xf];\n            localValue >>= 4;\n        }\n        if (localValue != 0) {\n            revert StringsInsufficientHexLength(value, length);\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n     * representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n     * representation, according to EIP-55.\n     */\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\n        bytes memory buffer = bytes(toHexString(addr));\n\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\n        uint256 hashValue;\n        assembly (\"memory-safe\") {\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n        }\n\n        for (uint256 i = 41; i > 1; --i) {\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n                // case shift by xoring with 0x20\n                buffer[i] ^= 0x20;\n            }\n            hashValue >>= 4;\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts a `bytes` buffer to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(bytes memory input) internal pure returns (string memory) {\n        unchecked {\n            bytes memory buffer = new bytes(2 * input.length + 2);\n            buffer[0] = \"0\";\n            buffer[1] = \"x\";\n            for (uint256 i = 0; i < input.length; ++i) {\n                uint8 v = uint8(input[i]);\n                buffer[2 * i + 2] = HEX_DIGITS[v >> 4];\n                buffer[2 * i + 3] = HEX_DIGITS[v & 0xf];\n            }\n            return string(buffer);\n        }\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return Bytes.equal(bytes(a), bytes(b));\n    }\n\n    /**\n     * @dev Parse a decimal string and returns the value as a `uint256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `[0-9]*`\n     * - The result must fit into an `uint256` type\n     */\n    function parseUint(string memory input) internal pure returns (uint256) {\n        return parseUint(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `[0-9]*`\n     * - The result must fit into an `uint256` type\n     */\n    function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n        (bool success, uint256 value) = tryParseUint(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n        return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n     * character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseUint(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, uint256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseUintUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseUintUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, uint256 value) {\n        bytes memory buffer = bytes(input);\n\n        uint256 result = 0;\n        for (uint256 i = begin; i < end; ++i) {\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (chr > 9) return (false, 0);\n            result *= 10;\n            result += chr;\n        }\n        return (true, result);\n    }\n\n    /**\n     * @dev Parse a decimal string and returns the value as a `int256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `[-+]?[0-9]*`\n     * - The result must fit in an `int256` type.\n     */\n    function parseInt(string memory input) internal pure returns (int256) {\n        return parseInt(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `[-+]?[0-9]*`\n     * - The result must fit in an `int256` type.\n     */\n    function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n        (bool success, int256 value) = tryParseInt(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n     * the result does not fit in a `int256`.\n     *\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n     */\n    function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n        return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n    /**\n     * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n     * character or if the result does not fit in a `int256`.\n     *\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n     */\n    function tryParseInt(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, int256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseIntUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseIntUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, int256 value) {\n        bytes memory buffer = bytes(input);\n\n        // Check presence of a negative sign.\n        bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        bool positiveSign = sign == bytes1(\"+\");\n        bool negativeSign = sign == bytes1(\"-\");\n        uint256 offset = (positiveSign || negativeSign).toUint();\n\n        (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n        if (absSuccess && absValue < ABS_MIN_INT256) {\n            return (true, negativeSign ? -int256(absValue) : int256(absValue));\n        } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n            return (true, type(int256).min);\n        } else return (false, 0);\n    }\n\n    /**\n     * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n     * - The result must fit in an `uint256` type.\n     */\n    function parseHexUint(string memory input) internal pure returns (uint256) {\n        return parseHexUint(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n     * - The result must fit in an `uint256` type.\n     */\n    function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n        (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n        return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n     * invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseHexUint(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, uint256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseHexUintUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseHexUintUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, uint256 value) {\n        bytes memory buffer = bytes(input);\n\n        // skip 0x prefix if present\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        uint256 offset = hasPrefix.toUint() * 2;\n\n        uint256 result = 0;\n        for (uint256 i = begin + offset; i < end; ++i) {\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (chr > 15) return (false, 0);\n            result *= 16;\n            unchecked {\n                // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n                // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n                result += chr;\n            }\n        }\n        return (true, result);\n    }\n\n    /**\n     * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n     *\n     * Requirements:\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n     */\n    function parseAddress(string memory input) internal pure returns (address) {\n        return parseAddress(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n     */\n    function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n        (bool success, address value) = tryParseAddress(input, begin, end);\n        if (!success) revert StringsInvalidAddressFormat();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n     * formatted address. See {parseAddress-string} requirements.\n     */\n    function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n        return tryParseAddress(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n     * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n     */\n    function tryParseAddress(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, address value) {\n        if (end > bytes(input).length || begin > end) return (false, address(0));\n\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n        // check that input is the correct length\n        if (end - begin == expectedLength) {\n            // length guarantees that this does not overflow, and value is at most type(uint160).max\n            (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n            return (s, address(uint160(v)));\n        } else {\n            return (false, address(0));\n        }\n    }\n\n    function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n        uint8 value = uint8(chr);\n\n        // Try to parse `chr`:\n        // - Case 1: [0-9]\n        // - Case 2: [a-f]\n        // - Case 3: [A-F]\n        // - otherwise not supported\n        unchecked {\n            if (value > 47 && value < 58) value -= 48;\n            else if (value > 96 && value < 103) value -= 87;\n            else if (value > 64 && value < 71) value -= 55;\n            else return type(uint8).max;\n        }\n\n        return value;\n    }\n\n    /**\n     * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n     *\n     * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n     *\n     * NOTE: This function escapes backslashes (including those in \\uXXXX sequences) and the characters in ranges\n     * defined in section 2.5 of RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). All control characters in U+0000\n     * to U+001F are escaped (\\b, \\t, \\n, \\f, \\r use short form; others use \\u00XX). ECMAScript's `JSON.parse` does\n     * recover escaped unicode characters that are not in this range, but other tooling may provide different results.\n     */\n    function escapeJSON(string memory input) internal pure returns (string memory) {\n        bytes memory buffer = bytes(input);\n\n        // Put output at the FMP. Memory will be reserved later when we figure out the actual length of the escaped\n        // string. All write are done using _unsafeWriteBytesOffset, which avoid the (expensive) length checks for\n        // each character written.\n        bytes memory output;\n        assembly (\"memory-safe\") {\n            output := mload(0x40)\n        }\n        uint256 outputLength = 0;\n\n        for (uint256 i = 0; i < buffer.length; ++i) {\n            uint8 char = uint8(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (((SPECIAL_CHARS_LOOKUP & (1 << char)) != 0)) {\n                _unsafeWriteBytesOffset(output, outputLength++, \"\\\\\");\n                if (char == 0x08) _unsafeWriteBytesOffset(output, outputLength++, \"b\");\n                else if (char == 0x09) _unsafeWriteBytesOffset(output, outputLength++, \"t\");\n                else if (char == 0x0a) _unsafeWriteBytesOffset(output, outputLength++, \"n\");\n                else if (char == 0x0c) _unsafeWriteBytesOffset(output, outputLength++, \"f\");\n                else if (char == 0x0d) _unsafeWriteBytesOffset(output, outputLength++, \"r\");\n                else if (char == 0x5c) _unsafeWriteBytesOffset(output, outputLength++, \"\\\\\");\n                else if (char == 0x22) {\n                    // solhint-disable-next-line quotes\n                    _unsafeWriteBytesOffset(output, outputLength++, '\"');\n                } else {\n                    // U+0000 to U+001F without short form: output \\u00XX\n                    _unsafeWriteBytesOffset(output, outputLength++, \"u\");\n                    _unsafeWriteBytesOffset(output, outputLength++, \"0\");\n                    _unsafeWriteBytesOffset(output, outputLength++, \"0\");\n                    _unsafeWriteBytesOffset(output, outputLength++, HEX_DIGITS[char >> 4]);\n                    _unsafeWriteBytesOffset(output, outputLength++, HEX_DIGITS[char & 0x0f]);\n                }\n            } else {\n                _unsafeWriteBytesOffset(output, outputLength++, bytes1(char));\n            }\n        }\n        // write the actual length and reserve memory\n        assembly (\"memory-safe\") {\n            mstore(output, outputLength)\n            mstore(0x40, add(output, add(outputLength, 0x20)))\n        }\n\n        return string(output);\n    }\n\n    /**\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            value := mload(add(add(buffer, 0x20), offset))\n        }\n    }\n\n    /**\n     * @dev Write a bytes1 to a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeWriteBytesOffset(bytes memory buffer, uint256 offset, bytes1 value) private pure {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            mstore8(add(add(buffer, 0x20), offset), shr(248, value))\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IHooks.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {BeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\n/// See the Hooks library for the full spec.\n/// @dev Should only be callable by the v4 PoolManager.\ninterface IHooks {\n    /// @notice The hook called before the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @return bytes4 The function selector for the hook\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96) external returns (bytes4);\n\n    /// @notice The hook called after the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @param tick The current tick after the state of a pool is initialized\n    /// @return bytes4 The function selector for the hook\n    function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n        external\n        returns (bytes4);\n\n    /// @notice The hook called before liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param delta The caller's balance delta after adding liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param delta The caller's balance delta after removing liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BeforeSwapDelta The hook's delta in specified and unspecified currencies. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    /// @return uint24 Optionally override the lp fee, only used if three conditions are met: 1. the Pool has a dynamic fee, 2. the value's 2nd highest bit is set (23rd bit, 0x400000), and 3. the value is less than or equal to the maximum fee (1 million)\n    function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)\n        external\n        returns (bytes4, BeforeSwapDelta, uint24);\n\n    /// @notice The hook called after a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param delta The amount owed to the caller (positive) or owed to the pool (negative)\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return int128 The hook's delta in unspecified currency. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external returns (bytes4, int128);\n\n    /// @notice The hook called before donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function afterDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/BitMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title BitMath\n/// @dev This library provides functionality for computing bit properties of an unsigned integer\n/// @author Solady (https://github.com/Vectorized/solady/blob/8200a70e8dc2a77ecb074fc2e99a2a0d36547522/src/utils/LibBit.sol)\nlibrary BitMath {\n    /// @notice Returns the index of the most significant bit of the number,\n    ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n    /// @param x the value for which to compute the most significant bit, must be greater than 0\n    /// @return r the index of the most significant bit\n    function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n        require(x > 0);\n\n        assembly (\"memory-safe\") {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0x0706060506020500060203020504000106050205030304010505030400000000))\n        }\n    }\n\n    /// @notice Returns the index of the least significant bit of the number,\n    ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n    /// @param x the value for which to compute the least significant bit, must be greater than 0\n    /// @return r the index of the least significant bit\n    function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n        require(x > 0);\n\n        assembly (\"memory-safe\") {\n            // Isolate the least significant bit.\n            x := and(x, sub(0, x))\n            // For the upper 3 bits of the result, use a De Bruijn-like lookup.\n            // Credit to adhusson: https://blog.adhusson.com/cheap-find-first-set-evm/\n            // forgefmt: disable-next-item\n            r := shl(5, shr(252, shl(shl(2, shr(250, mul(x,\n                0xb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff))),\n                0x8040405543005266443200005020610674053026020000107506200176117077)))\n            // For the lower 5 bits of the result, use a De Bruijn lookup.\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(div(0xd76453e0, shr(r, x)), 0x1f),\n                0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405))\n        }\n    }\n}\n"},"../../../lib/v4-periphery/src/libraries/PositionInfoLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\nimport {PoolId} from \"@uniswap/v4-core/src/types/PoolId.sol\";\n\n/**\n * @dev PositionInfo is a packed version of solidity structure.\n * Using the packaged version saves gas and memory by not storing the structure fields in memory slots.\n *\n * Layout:\n * 200 bits poolId | 24 bits tickUpper | 24 bits tickLower | 8 bits hasSubscriber\n *\n * Fields in the direction from the least significant bit:\n *\n * A flag to know if the tokenId is subscribed to an address\n * uint8 hasSubscriber;\n *\n * The tickUpper of the position\n * int24 tickUpper;\n *\n * The tickLower of the position\n * int24 tickLower;\n *\n * The truncated poolId. Truncates a bytes32 value so the most signifcant (highest) 200 bits are used.\n * bytes25 poolId;\n *\n * Note: If more bits are needed, hasSubscriber can be a single bit.\n *\n */\ntype PositionInfo is uint256;\n\nusing PositionInfoLibrary for PositionInfo global;\n\nlibrary PositionInfoLibrary {\n    PositionInfo internal constant EMPTY_POSITION_INFO = PositionInfo.wrap(0);\n\n    uint256 internal constant MASK_UPPER_200_BITS = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000;\n    uint256 internal constant MASK_8_BITS = 0xFF;\n    uint24 internal constant MASK_24_BITS = 0xFFFFFF;\n    uint256 internal constant SET_UNSUBSCRIBE = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00;\n    uint256 internal constant SET_SUBSCRIBE = 0x01;\n    uint8 internal constant TICK_LOWER_OFFSET = 8;\n    uint8 internal constant TICK_UPPER_OFFSET = 32;\n\n    /// @dev This poolId is NOT compatible with the poolId used in UniswapV4 core. It is truncated to 25 bytes, and just used to lookup PoolKey in the poolKeys mapping.\n    function poolId(PositionInfo info) internal pure returns (bytes25 _poolId) {\n        assembly (\"memory-safe\") {\n            _poolId := and(MASK_UPPER_200_BITS, info)\n        }\n    }\n\n    function tickLower(PositionInfo info) internal pure returns (int24 _tickLower) {\n        assembly (\"memory-safe\") {\n            _tickLower := signextend(2, shr(TICK_LOWER_OFFSET, info))\n        }\n    }\n\n    function tickUpper(PositionInfo info) internal pure returns (int24 _tickUpper) {\n        assembly (\"memory-safe\") {\n            _tickUpper := signextend(2, shr(TICK_UPPER_OFFSET, info))\n        }\n    }\n\n    function hasSubscriber(PositionInfo info) internal pure returns (bool _hasSubscriber) {\n        assembly (\"memory-safe\") {\n            _hasSubscriber := and(MASK_8_BITS, info)\n        }\n    }\n\n    /// @dev this does not actually set any storage\n    function setSubscribe(PositionInfo info) internal pure returns (PositionInfo _info) {\n        assembly (\"memory-safe\") {\n            _info := or(info, SET_SUBSCRIBE)\n        }\n    }\n\n    /// @dev this does not actually set any storage\n    function setUnsubscribe(PositionInfo info) internal pure returns (PositionInfo _info) {\n        assembly (\"memory-safe\") {\n            _info := and(info, SET_UNSUBSCRIBE)\n        }\n    }\n\n    /// @notice Creates the default PositionInfo struct\n    /// @dev Called when minting a new position\n    /// @param _poolKey the pool key of the position\n    /// @param _tickLower the lower tick of the position\n    /// @param _tickUpper the upper tick of the position\n    /// @return info packed position info, with the truncated poolId and the hasSubscriber flag set to false\n    function initialize(PoolKey memory _poolKey, int24 _tickLower, int24 _tickUpper)\n        internal\n        pure\n        returns (PositionInfo info)\n    {\n        bytes25 _poolId = bytes25(PoolId.unwrap(_poolKey.toId()));\n        assembly {\n            info := or(\n                or(and(MASK_UPPER_200_BITS, _poolId), shl(TICK_UPPER_OFFSET, and(MASK_24_BITS, _tickUpper))),\n                shl(TICK_LOWER_OFFSET, and(MASK_24_BITS, _tickLower))\n            )\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IEIP712 {\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FullMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n    function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = a * b\n            // Compute the product mod 2**256 and mod 2**256 - 1\n            // then use the Chinese Remainder Theorem to reconstruct\n            // the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2**256 + prod0\n            uint256 prod0 = a * b; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly (\"memory-safe\") {\n                let mm := mulmod(a, b, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Make sure the result is less than 2**256.\n            // Also prevents denominator == 0\n            require(denominator > prod1);\n\n            // Handle non-overflow cases, 256 by 256 division\n            if (prod1 == 0) {\n                assembly (\"memory-safe\") {\n                    result := div(prod0, denominator)\n                }\n                return result;\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0]\n            // Compute remainder using mulmod\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                remainder := mulmod(a, b, denominator)\n            }\n            // Subtract 256 bit number from 512 bit number\n            assembly (\"memory-safe\") {\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator\n            // Compute largest power of two divisor of denominator.\n            // Always >= 1.\n            uint256 twos = (0 - denominator) & denominator;\n            // Divide denominator by power of two\n            assembly (\"memory-safe\") {\n                denominator := div(denominator, twos)\n            }\n\n            // Divide [prod1 prod0] by the factors of two\n            assembly (\"memory-safe\") {\n                prod0 := div(prod0, twos)\n            }\n            // Shift in bits from prod1 into prod0. For this we need\n            // to flip `twos` such that it is 2**256 / twos.\n            // If twos is zero, then it becomes one\n            assembly (\"memory-safe\") {\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2**256\n            // Now that denominator is an odd number, it has an inverse\n            // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n            // Compute the inverse by starting with a seed that is correct\n            // correct for four bits. That is, denominator * inv = 1 mod 2**4\n            uint256 inv = (3 * denominator) ^ 2;\n            // Now use Newton-Raphson iteration to improve the precision.\n            // Thanks to Hensel's lifting lemma, this also works in modular\n            // arithmetic, doubling the correct bits in each step.\n            inv *= 2 - denominator * inv; // inverse mod 2**8\n            inv *= 2 - denominator * inv; // inverse mod 2**16\n            inv *= 2 - denominator * inv; // inverse mod 2**32\n            inv *= 2 - denominator * inv; // inverse mod 2**64\n            inv *= 2 - denominator * inv; // inverse mod 2**128\n            inv *= 2 - denominator * inv; // inverse mod 2**256\n\n            // Because the division is now exact we can divide by multiplying\n            // with the modular inverse of denominator. This will give us the\n            // correct result modulo 2**256. Since the preconditions guarantee\n            // that the outcome is less than 2**256, this is the final result.\n            // We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inv;\n            return result;\n        }\n    }\n\n    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            result = mulDiv(a, b, denominator);\n            if (mulmod(a, b, denominator) != 0) {\n                require(++result > 0);\n            }\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Position.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {FixedPoint128} from \"./FixedPoint128.sol\";\nimport {LiquidityMath} from \"./LiquidityMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n    using CustomRevert for bytes4;\n\n    /// @notice Cannot update a position with no liquidity\n    error CannotUpdateEmptyPosition();\n\n    // info stored for each user's position\n    struct State {\n        // the amount of liquidity owned by this position\n        uint128 liquidity;\n        // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n        uint256 feeGrowthInside0LastX128;\n        uint256 feeGrowthInside1LastX128;\n    }\n\n    /// @notice Returns the State struct of a position, given an owner and position boundaries\n    /// @param self The mapping containing all user positions\n    /// @param owner The address of the position owner\n    /// @param tickLower The lower tick boundary of the position\n    /// @param tickUpper The upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range\n    /// @return position The position info struct of the given owners' position\n    function get(mapping(bytes32 => State) storage self, address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        view\n        returns (State storage position)\n    {\n        bytes32 positionKey = calculatePositionKey(owner, tickLower, tickUpper, salt);\n        position = self[positionKey];\n    }\n\n    /// @notice A helper function to calculate the position key\n    /// @param owner The address of the position owner\n    /// @param tickLower the lower tick boundary of the position\n    /// @param tickUpper the upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range, by the same owner. Passed in by the caller.\n    function calculatePositionKey(address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        pure\n        returns (bytes32 positionKey)\n    {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(add(fmp, 0x26), salt) // [0x26, 0x46)\n            mstore(add(fmp, 0x06), tickUpper) // [0x23, 0x26)\n            mstore(add(fmp, 0x03), tickLower) // [0x20, 0x23)\n            mstore(fmp, owner) // [0x0c, 0x20)\n            positionKey := keccak256(add(fmp, 0x0c), 0x3a) // len is 58 bytes\n\n            // now clean the memory we used\n            mstore(add(fmp, 0x40), 0) // fmp+0x40 held salt\n            mstore(add(fmp, 0x20), 0) // fmp+0x20 held tickLower, tickUpper, salt\n            mstore(fmp, 0) // fmp held owner\n        }\n    }\n\n    /// @notice Credits accumulated fees to a user's position\n    /// @param self The individual position to update\n    /// @param liquidityDelta The change in pool liquidity as a result of the position update\n    /// @param feeGrowthInside0X128 The all-time fee growth in currency0, per unit of liquidity, inside the position's tick boundaries\n    /// @param feeGrowthInside1X128 The all-time fee growth in currency1, per unit of liquidity, inside the position's tick boundaries\n    /// @return feesOwed0 The amount of currency0 owed to the position owner\n    /// @return feesOwed1 The amount of currency1 owed to the position owner\n    function update(\n        State storage self,\n        int128 liquidityDelta,\n        uint256 feeGrowthInside0X128,\n        uint256 feeGrowthInside1X128\n    ) internal returns (uint256 feesOwed0, uint256 feesOwed1) {\n        uint128 liquidity = self.liquidity;\n\n        if (liquidityDelta == 0) {\n            // disallow pokes for 0 liquidity positions\n            if (liquidity == 0) CannotUpdateEmptyPosition.selector.revertWith();\n        } else {\n            self.liquidity = LiquidityMath.addDelta(liquidity, liquidityDelta);\n        }\n\n        // calculate accumulated fees. overflow in the subtraction of fee growth is expected\n        unchecked {\n            feesOwed0 =\n                FullMath.mulDiv(feeGrowthInside0X128 - self.feeGrowthInside0LastX128, liquidity, FixedPoint128.Q128);\n            feesOwed1 =\n                FullMath.mulDiv(feeGrowthInside1X128 - self.feeGrowthInside1LastX128, liquidity, FixedPoint128.Q128);\n        }\n\n        // update the position\n        self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n        self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n    using CustomRevert for bytes4;\n\n    error SafeCastOverflow();\n\n    /// @notice Cast a uint256 to a uint160, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint160\n    function toUint160(uint256 x) internal pure returns (uint160 y) {\n        y = uint160(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a uint128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint128\n    function toUint128(uint256 x) internal pure returns (uint128 y) {\n        y = uint128(x);\n        if (x != y) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a int128 to a uint128, revert on overflow or underflow\n    /// @param x The int128 to be casted\n    /// @return y The casted integer, now type uint128\n    function toUint128(int128 x) internal pure returns (uint128 y) {\n        if (x < 0) SafeCastOverflow.selector.revertWith();\n        y = uint128(x);\n    }\n\n    /// @notice Cast a int256 to a int128, revert on overflow or underflow\n    /// @param x The int256 to be downcasted\n    /// @return y The downcasted integer, now type int128\n    function toInt128(int256 x) internal pure returns (int128 y) {\n        y = int128(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int256, revert on overflow\n    /// @param x The uint256 to be casted\n    /// @return y The casted integer, now type int256\n    function toInt256(uint256 x) internal pure returns (int256 y) {\n        y = int256(x);\n        if (y < 0) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return The downcasted integer, now type int128\n    function toInt128(uint256 x) internal pure returns (int128) {\n        if (x >= 1 << 127) SafeCastOverflow.selector.revertWith();\n        return int128(int256(x));\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TickMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {BitMath} from \"./BitMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Math library for computing sqrt prices from ticks and vice versa\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\n/// prices between 2**-128 and 2**128\nlibrary TickMath {\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the tick passed to #getSqrtPriceAtTick is not between MIN_TICK and MAX_TICK\n    error InvalidTick(int24 tick);\n    /// @notice Thrown when the price passed to #getTickAtSqrtPrice does not correspond to a price between MIN_TICK and MAX_TICK\n    error InvalidSqrtPrice(uint160 sqrtPriceX96);\n\n    /// @dev The minimum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**-128\n    /// @dev If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\n    int24 internal constant MIN_TICK = -887272;\n    /// @dev The maximum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**128\n    /// @dev If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\n    int24 internal constant MAX_TICK = 887272;\n\n    /// @dev The minimum tick spacing value drawn from the range of type int16 that is greater than 0, i.e. min from the range [1, 32767]\n    int24 internal constant MIN_TICK_SPACING = 1;\n    /// @dev The maximum tick spacing value drawn from the range of type int16, i.e. max from the range [1, 32767]\n    int24 internal constant MAX_TICK_SPACING = type(int16).max;\n\n    /// @dev The minimum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MIN_TICK)\n    uint160 internal constant MIN_SQRT_PRICE = 4295128739;\n    /// @dev The maximum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MAX_TICK)\n    uint160 internal constant MAX_SQRT_PRICE = 1461446703485210103287273052203988822378723970342;\n    /// @dev A threshold used for optimized bounds check, equals `MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1`\n    uint160 internal constant MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE =\n        1461446703485210103287273052203988822378723970342 - 4295128739 - 1;\n\n    /// @notice Given a tickSpacing, compute the maximum usable tick\n    function maxUsableTick(int24 tickSpacing) internal pure returns (int24) {\n        unchecked {\n            return (MAX_TICK / tickSpacing) * tickSpacing;\n        }\n    }\n\n    /// @notice Given a tickSpacing, compute the minimum usable tick\n    function minUsableTick(int24 tickSpacing) internal pure returns (int24) {\n        unchecked {\n            return (MIN_TICK / tickSpacing) * tickSpacing;\n        }\n    }\n\n    /// @notice Calculates sqrt(1.0001^tick) * 2^96\n    /// @dev Throws if |tick| > max tick\n    /// @param tick The input tick for the above formula\n    /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the price of the two assets (currency1/currency0)\n    /// at the given tick\n    function getSqrtPriceAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\n        unchecked {\n            uint256 absTick;\n            assembly (\"memory-safe\") {\n                tick := signextend(2, tick)\n                // mask = 0 if tick >= 0 else -1 (all 1s)\n                let mask := sar(255, tick)\n                // if tick >= 0, |tick| = tick = 0 ^ tick\n                // if tick < 0, |tick| = ~~|tick| = ~(-|tick| - 1) = ~(tick - 1) = (-1) ^ (tick - 1)\n                // either way, |tick| = mask ^ (tick + mask)\n                absTick := xor(mask, add(mask, tick))\n            }\n\n            if (absTick > uint256(int256(MAX_TICK))) InvalidTick.selector.revertWith(tick);\n\n            // The tick is decomposed into bits, and for each bit with index i that is set, the product of 1/sqrt(1.0001^(2^i))\n            // is calculated (using Q128.128). The constants used for this calculation are rounded to the nearest integer\n\n            // Equivalent to:\n            //     price = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;\n            //     or price = int(2**128 / sqrt(1.0001)) if (absTick & 0x1) else 1 << 128\n            uint256 price;\n            assembly (\"memory-safe\") {\n                price := xor(shl(128, 1), mul(xor(shl(128, 1), 0xfffcb933bd6fad37aa2d162d1a594001), and(absTick, 0x1)))\n            }\n            if (absTick & 0x2 != 0) price = (price * 0xfff97272373d413259a46990580e213a) >> 128;\n            if (absTick & 0x4 != 0) price = (price * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n            if (absTick & 0x8 != 0) price = (price * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n            if (absTick & 0x10 != 0) price = (price * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n            if (absTick & 0x20 != 0) price = (price * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n            if (absTick & 0x40 != 0) price = (price * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n            if (absTick & 0x80 != 0) price = (price * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n            if (absTick & 0x100 != 0) price = (price * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n            if (absTick & 0x200 != 0) price = (price * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n            if (absTick & 0x400 != 0) price = (price * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n            if (absTick & 0x800 != 0) price = (price * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n            if (absTick & 0x1000 != 0) price = (price * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n            if (absTick & 0x2000 != 0) price = (price * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n            if (absTick & 0x4000 != 0) price = (price * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n            if (absTick & 0x8000 != 0) price = (price * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n            if (absTick & 0x10000 != 0) price = (price * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n            if (absTick & 0x20000 != 0) price = (price * 0x5d6af8dedb81196699c329225ee604) >> 128;\n            if (absTick & 0x40000 != 0) price = (price * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n            if (absTick & 0x80000 != 0) price = (price * 0x48a170391f7dc42444e8fa2) >> 128;\n\n            assembly (\"memory-safe\") {\n                // if (tick > 0) price = type(uint256).max / price;\n                if sgt(tick, 0) { price := div(not(0), price) }\n\n                // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\n                // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\n                // we round up in the division so getTickAtSqrtPrice of the output price is always consistent\n                // `sub(shl(32, 1), 1)` is `type(uint32).max`\n                // `price + type(uint32).max` will not overflow because `price` fits in 192 bits\n                sqrtPriceX96 := shr(32, add(price, sub(shl(32, 1), 1)))\n            }\n        }\n    }\n\n    /// @notice Calculates the greatest tick value such that getSqrtPriceAtTick(tick) <= sqrtPriceX96\n    /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_PRICE, as MIN_SQRT_PRICE is the lowest value getSqrtPriceAtTick may\n    /// ever return.\n    /// @param sqrtPriceX96 The sqrt price for which to compute the tick as a Q64.96\n    /// @return tick The greatest tick for which the getSqrtPriceAtTick(tick) is less than or equal to the input sqrtPriceX96\n    function getTickAtSqrtPrice(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\n        unchecked {\n            // Equivalent: if (sqrtPriceX96 < MIN_SQRT_PRICE || sqrtPriceX96 >= MAX_SQRT_PRICE) revert InvalidSqrtPrice();\n            // second inequality must be >= because the price can never reach the price at the max tick\n            // if sqrtPriceX96 < MIN_SQRT_PRICE, the `sub` underflows and `gt` is true\n            // if sqrtPriceX96 >= MAX_SQRT_PRICE, sqrtPriceX96 - MIN_SQRT_PRICE > MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1\n            if ((sqrtPriceX96 - MIN_SQRT_PRICE) > MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE) {\n                InvalidSqrtPrice.selector.revertWith(sqrtPriceX96);\n            }\n\n            uint256 price = uint256(sqrtPriceX96) << 32;\n\n            uint256 r = price;\n            uint256 msb = BitMath.mostSignificantBit(r);\n\n            if (msb >= 128) r = price >> (msb - 127);\n            else r = price << (127 - msb);\n\n            int256 log_2 = (int256(msb) - 128) << 64;\n\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(63, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(62, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(61, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(60, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(59, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(58, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(57, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(56, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(55, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(54, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(53, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(52, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(51, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(50, f))\n            }\n\n            int256 log_sqrt10001 = log_2 * 255738958999603826347141; // Q22.128 number\n\n            // Magic number represents the ceiling of the maximum value of the error when approximating log_sqrt10001(x)\n            int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);\n\n            // Magic number represents the minimum value of the error when approximating log_sqrt10001(x), when\n            // sqrtPrice is from the range (2^-64, 2^64). This is safe as MIN_SQRT_PRICE is more than 2^-64. If MIN_SQRT_PRICE\n            // is changed, this may need to be changed too\n            int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);\n\n            tick = tickLow == tickHi ? tickLow : getSqrtPriceAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/BalanceDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\n\n/// @dev Two `int128` values packed into a single `int256` where the upper 128 bits represent the amount0\n/// and the lower 128 bits represent the amount1.\ntype BalanceDelta is int256;\n\nusing {add as +, sub as -, eq as ==, neq as !=} for BalanceDelta global;\nusing BalanceDeltaLibrary for BalanceDelta global;\nusing SafeCast for int256;\n\nfunction toBalanceDelta(int128 _amount0, int128 _amount1) pure returns (BalanceDelta balanceDelta) {\n    assembly (\"memory-safe\") {\n        balanceDelta := or(shl(128, _amount0), and(sub(shl(128, 1), 1), _amount1))\n    }\n}\n\nfunction add(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := add(a0, b0)\n        res1 := add(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction sub(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := sub(a0, b0)\n        res1 := sub(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction eq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) == BalanceDelta.unwrap(b);\n}\n\nfunction neq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) != BalanceDelta.unwrap(b);\n}\n\n/// @notice Library for getting the amount0 and amount1 deltas from the BalanceDelta type\nlibrary BalanceDeltaLibrary {\n    /// @notice A BalanceDelta of 0\n    BalanceDelta public constant ZERO_DELTA = BalanceDelta.wrap(0);\n\n    function amount0(BalanceDelta balanceDelta) internal pure returns (int128 _amount0) {\n        assembly (\"memory-safe\") {\n            _amount0 := sar(128, balanceDelta)\n        }\n    }\n\n    function amount1(BalanceDelta balanceDelta) internal pure returns (int128 _amount1) {\n        assembly (\"memory-safe\") {\n            _amount1 := signextend(15, balanceDelta)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/src/interfaces/IPoolInitializer_v4.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"@uniswap/v4-core/src/types/PoolKey.sol\";\n\n/// @title IPoolInitializer_v4\n/// @notice Interface for the PoolInitializer_v4 contract\ninterface IPoolInitializer_v4 {\n    /// @notice Initialize a Uniswap v4 Pool\n    /// @dev If the pool is already initialized, this function will not revert and just return type(int24).max\n    /// @param key The PoolKey of the pool to initialize\n    /// @param sqrtPriceX96 The initial starting price of the pool, expressed as a sqrtPriceX96\n    /// @return The current tick of the pool, or type(int24).max if the pool creation failed, or the pool already existed\n    function initializePool(PoolKey calldata key, uint160 sqrtPriceX96) external payable returns (int24);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `condition ? a : b`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `condition ? a : b`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // (a + b) / 2 can overflow.\n            return (a & b) + (a ^ b) / 2;\n        }\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory buffer) private pure returns (bool) {\n        uint256 chunk;\n        for (uint256 i = 0; i < buffer.length; i += 0x20) {\n            // See _unsafeReadBytesOffset from utils/Bytes.sol\n            assembly (\"memory-safe\") {\n                chunk := mload(add(add(buffer, 0x20), i))\n            }\n            if (chunk >> (8 * saturatingSub(i + 0x20, buffer.length)) != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the first 16 bytes (most significant half).\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n\n    /**\n     * @dev Counts the number of leading zero bits in a uint256.\n     */\n    function clz(uint256 x) internal pure returns (uint256) {\n        return ternary(x == 0, 256, 255 - log2(x));\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolOperation.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\n\n/// @notice Parameter struct for `ModifyLiquidity` pool operations\nstruct ModifyLiquidityParams {\n    // the lower and upper tick of the position\n    int24 tickLower;\n    int24 tickUpper;\n    // how to modify the liquidity\n    int256 liquidityDelta;\n    // a value to set if you want unique liquidity positions at the same range\n    bytes32 salt;\n}\n\n/// @notice Parameter struct for `Swap` pool operations\nstruct SwapParams {\n    /// Whether to swap token0 for token1 or vice versa\n    bool zeroForOne;\n    /// The desired input amount if negative (exactIn), or the desired output amount if positive (exactOut)\n    int256 amountSpecified;\n    /// The sqrt price at which, if reached, the swap will stop executing\n    uint160 sqrtPriceLimitX96;\n}\n"},"src/legacy/vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n// End consumer library.\nlibrary VRFV2PlusClient {\n  // extraArgs will evolve to support new features\n  bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n\n  struct ExtraArgsV1 {\n    bool nativePayment;\n  }\n\n  struct RandomWordsRequest {\n    bytes32 keyHash;\n    uint256 subId;\n    uint16 requestConfirmations;\n    uint32 callbackGasLimit;\n    uint32 numWords;\n    bytes extraArgs;\n  }\n\n  function _argsToBytes(\n    ExtraArgsV1 memory extraArgs\n  ) internal pure returns (bytes memory bts) {\n    return abi.encodeWithSelector(EXTRA_ARGS_V1_TAG, extraArgs);\n  }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExtsload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for functions to access any storage slot in a contract\ninterface IExtsload {\n    /// @notice Called by external contracts to access granular pool state\n    /// @param slot Key of slot to sload\n    /// @return value The value of the slot as bytes32\n    function extsload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access granular pool state\n    /// @param startSlot Key of slot to start sloading from\n    /// @param nSlots Number of slots to load into return value\n    /// @return values List of loaded values.\n    function extsload(bytes32 startSlot, uint256 nSlots) external view returns (bytes32[] memory values);\n\n    /// @notice Called by external contracts to access sparse pool state\n    /// @param slots List of slots to SLOAD from.\n    /// @return values List of loaded values.\n    function extsload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExttload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/// @notice Interface for functions to access any transient storage slot in a contract\ninterface IExttload {\n    /// @notice Called by external contracts to access transient storage of the contract\n    /// @param slot Key of slot to tload\n    /// @return value The value of the slot as bytes32\n    function exttload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access sparse transient pool state\n    /// @param slots List of slots to tload\n    /// @return values List of loaded values\n    function exttload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/UnsafeMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math functions that do not check inputs or outputs\n/// @notice Contains methods that perform common math functions but do not do any overflow or underflow checks\nlibrary UnsafeMath {\n    /// @notice Returns ceil(x / y)\n    /// @dev division by 0 will return 0, and should be checked externally\n    /// @param x The dividend\n    /// @param y The divisor\n    /// @return z The quotient, ceil(x / y)\n    function divRoundingUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        assembly (\"memory-safe\") {\n            z := add(div(x, y), gt(mod(x, y), 0))\n        }\n    }\n\n    /// @notice Calculates floor(a×b÷denominator)\n    /// @dev division by 0 will return 0, and should be checked externally\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result, floor(a×b÷denominator)\n    function simpleMulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        assembly (\"memory-safe\") {\n            result := div(mul(a, b), denominator)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"../../../lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/types/BeforeSwapDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Return type of the beforeSwap hook.\n// Upper 128 bits is the delta in specified tokens. Lower 128 bits is delta in unspecified tokens (to match the afterSwap hook)\ntype BeforeSwapDelta is int256;\n\n// Creates a BeforeSwapDelta from specified and unspecified\nfunction toBeforeSwapDelta(int128 deltaSpecified, int128 deltaUnspecified)\n    pure\n    returns (BeforeSwapDelta beforeSwapDelta)\n{\n    assembly (\"memory-safe\") {\n        beforeSwapDelta := or(shl(128, deltaSpecified), and(sub(shl(128, 1), 1), deltaUnspecified))\n    }\n}\n\n/// @notice Library for getting the specified and unspecified deltas from the BeforeSwapDelta type\nlibrary BeforeSwapDeltaLibrary {\n    /// @notice A BeforeSwapDelta of 0\n    BeforeSwapDelta public constant ZERO_DELTA = BeforeSwapDelta.wrap(0);\n\n    /// extracts int128 from the upper 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap\n    function getSpecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaSpecified) {\n        assembly (\"memory-safe\") {\n            deltaSpecified := sar(128, delta)\n        }\n    }\n\n    /// extracts int128 from the lower 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap and afterSwap\n    function getUnspecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaUnspecified) {\n        assembly (\"memory-safe\") {\n            deltaUnspecified := signextend(15, delta)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CustomRevert.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Library for reverting with custom errors efficiently\n/// @notice Contains functions for reverting with custom errors with different argument types efficiently\n/// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with\n/// `CustomError.selector.revertWith()`\n/// @dev The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\nlibrary CustomRevert {\n    /// @dev ERC-7751 error for wrapping bubbled up reverts\n    error WrappedError(address target, bytes4 selector, bytes reason, bytes details);\n\n    /// @dev Reverts with the selector of a custom error in the scratch space\n    function revertWith(bytes4 selector) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            revert(0, 0x04)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an address argument in the scratch space\n    function revertWith(bytes4 selector, address addr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an int24 argument in the scratch space\n    function revertWith(bytes4 selector, int24 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, signextend(2, value))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with a uint160 argument in the scratch space\n    function revertWith(bytes4 selector, uint160 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two int24 arguments\n    function revertWith(bytes4 selector, int24 value1, int24 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), signextend(2, value1))\n            mstore(add(fmp, 0x24), signextend(2, value2))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two uint160 arguments\n    function revertWith(bytes4 selector, uint160 value1, uint160 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two address arguments\n    function revertWith(bytes4 selector, address value1, address value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @notice bubble up the revert message returned by a call and revert with a wrapped ERC-7751 error\n    /// @dev this method can be vulnerable to revert data bombs\n    function bubbleUpAndRevertWith(\n        address revertingContract,\n        bytes4 revertingFunctionSelector,\n        bytes4 additionalContext\n    ) internal pure {\n        bytes4 wrappedErrorSelector = WrappedError.selector;\n        assembly (\"memory-safe\") {\n            // Ensure the size of the revert data is a multiple of 32 bytes\n            let encodedDataSize := mul(div(add(returndatasize(), 31), 32), 32)\n\n            let fmp := mload(0x40)\n\n            // Encode wrapped error selector, address, function selector, offset, additional context, size, revert reason\n            mstore(fmp, wrappedErrorSelector)\n            mstore(add(fmp, 0x04), and(revertingContract, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(\n                add(fmp, 0x24),\n                and(revertingFunctionSelector, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            // offset revert reason\n            mstore(add(fmp, 0x44), 0x80)\n            // offset additional context\n            mstore(add(fmp, 0x64), add(0xa0, encodedDataSize))\n            // size revert reason\n            mstore(add(fmp, 0x84), returndatasize())\n            // revert reason\n            returndatacopy(add(fmp, 0xa4), 0, returndatasize())\n            // size additional context\n            mstore(add(fmp, add(0xa4, encodedDataSize)), 0x04)\n            // additional context\n            mstore(\n                add(fmp, add(0xc4, encodedDataSize)),\n                and(additionalContext, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            revert(fmp, add(0xe4, encodedDataSize))\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint96.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint96\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\n/// @dev Used in SqrtPriceMath.sol\nlibrary FixedPoint96 {\n    uint8 internal constant RESOLUTION = 96;\n    uint256 internal constant Q96 = 0x1000000000000000000000000;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LPFeeLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice Library of helper functions for a pools LP fee\nlibrary LPFeeLibrary {\n    using LPFeeLibrary for uint24;\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the static or dynamic fee on a pool exceeds 100%.\n    error LPFeeTooLarge(uint24 fee);\n\n    /// @notice An lp fee of exactly 0b1000000... signals a dynamic fee pool. This isn't a valid static fee as it is > MAX_LP_FEE\n    uint24 public constant DYNAMIC_FEE_FLAG = 0x800000;\n\n    /// @notice the second bit of the fee returned by beforeSwap is used to signal if the stored LP fee should be overridden in this swap\n    // only dynamic-fee pools can return a fee via the beforeSwap hook\n    uint24 public constant OVERRIDE_FEE_FLAG = 0x400000;\n\n    /// @notice mask to remove the override fee flag from a fee returned by the beforeSwaphook\n    uint24 public constant REMOVE_OVERRIDE_MASK = 0xBFFFFF;\n\n    /// @notice the lp fee is represented in hundredths of a bip, so the max is 100%\n    uint24 public constant MAX_LP_FEE = 1000000;\n\n    /// @notice returns true if a pool's LP fee signals that the pool has a dynamic fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is dynamic\n    function isDynamicFee(uint24 self) internal pure returns (bool) {\n        return self == DYNAMIC_FEE_FLAG;\n    }\n\n    /// @notice returns true if an LP fee is valid, aka not above the maximum permitted fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is valid\n    function isValid(uint24 self) internal pure returns (bool) {\n        return self <= MAX_LP_FEE;\n    }\n\n    /// @notice validates whether an LP fee is larger than the maximum, and reverts if invalid\n    /// @param self The fee to validate\n    function validate(uint24 self) internal pure {\n        if (!self.isValid()) LPFeeTooLarge.selector.revertWith(self);\n    }\n\n    /// @notice gets and validates the initial LP fee for a pool. Dynamic fee pools have an initial fee of 0.\n    /// @dev if a dynamic fee pool wants a non-0 initial fee, it should call `updateDynamicLPFee` in the afterInitialize hook\n    /// @param self The fee to get the initial LP from\n    /// @return initialFee 0 if the fee is dynamic, otherwise the fee (if valid)\n    function getInitialLPFee(uint24 self) internal pure returns (uint24) {\n        // the initial fee for a dynamic fee pool is 0\n        if (self.isDynamicFee()) return 0;\n        self.validate();\n        return self;\n    }\n\n    /// @notice returns true if the fee has the override flag set (2nd highest bit of the uint24)\n    /// @param self The fee to check\n    /// @return bool True of the fee has the override flag set\n    function isOverride(uint24 self) internal pure returns (bool) {\n        return self & OVERRIDE_FEE_FLAG != 0;\n    }\n\n    /// @notice returns a fee with the override flag removed\n    /// @param self The fee to remove the override flag from\n    /// @return fee The fee without the override flag set\n    function removeOverrideFlag(uint24 self) internal pure returns (uint24) {\n        return self & REMOVE_OVERRIDE_MASK;\n    }\n\n    /// @notice Removes the override flag and validates the fee (reverts if the fee is too large)\n    /// @param self The fee to remove the override flag from, and then validate\n    /// @return fee The fee without the override flag set (if valid)\n    function removeOverrideFlagAndValidate(uint24 self) internal pure returns (uint24 fee) {\n        fee = self.removeOverrideFlag();\n        fee.validate();\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/StateLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Position} from \"./Position.sol\";\n\n/// @notice A helper library to provide state getters that use extsload\nlibrary StateLibrary {\n    /// @notice index of pools mapping in the PoolManager\n    bytes32 public constant POOLS_SLOT = bytes32(uint256(6));\n\n    /// @notice index of feeGrowthGlobal0X128 in Pool.State\n    uint256 public constant FEE_GROWTH_GLOBAL0_OFFSET = 1;\n\n    // feeGrowthGlobal1X128 offset in Pool.State = 2\n\n    /// @notice index of liquidity in Pool.State\n    uint256 public constant LIQUIDITY_OFFSET = 3;\n\n    /// @notice index of TicksInfo mapping in Pool.State: mapping(int24 => TickInfo) ticks;\n    uint256 public constant TICKS_OFFSET = 4;\n\n    /// @notice index of tickBitmap mapping in Pool.State\n    uint256 public constant TICK_BITMAP_OFFSET = 5;\n\n    /// @notice index of Position.State mapping in Pool.State: mapping(bytes32 => Position.State) positions;\n    uint256 public constant POSITIONS_OFFSET = 6;\n\n    /**\n     * @notice Get Slot0 of the pool: sqrtPriceX96, tick, protocolFee, lpFee\n     * @dev Corresponds to pools[poolId].slot0\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return sqrtPriceX96 The square root of the price of the pool, in Q96 precision.\n     * @return tick The current tick of the pool.\n     * @return protocolFee The protocol fee of the pool.\n     * @return lpFee The swap fee of the pool.\n     */\n    function getSlot0(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        bytes32 data = manager.extsload(stateSlot);\n\n        //   24 bits  |24bits|24bits      |24 bits|160 bits\n        // 0x000000   |000bb8|000000      |ffff75 |0000000000000000fe3aa841ba359daa0ea9eff7\n        // ---------- | fee  |protocolfee | tick  | sqrtPriceX96\n        assembly (\"memory-safe\") {\n            // bottom 160 bits of data\n            sqrtPriceX96 := and(data, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            // next 24 bits of data\n            tick := signextend(2, shr(160, data))\n            // next 24 bits of data\n            protocolFee := and(shr(184, data), 0xFFFFFF)\n            // last 24 bits of data\n            lpFee := and(shr(208, data), 0xFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the tick information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve information for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickInfo(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (\n            uint128 liquidityGross,\n            int128 liquidityNet,\n            uint256 feeGrowthOutside0X128,\n            uint256 feeGrowthOutside1X128\n        )\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // read all 3 words of the TickInfo struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n        assembly (\"memory-safe\") {\n            let firstWord := mload(add(data, 32))\n            liquidityNet := sar(128, firstWord)\n            liquidityGross := and(firstWord, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            feeGrowthOutside0X128 := mload(add(data, 64))\n            feeGrowthOutside1X128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick].liquidityGross and pools[poolId].ticks[tick].liquidityNet. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve liquidity for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     */\n    function getTickLiquidity(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint128 liquidityGross, int128 liquidityNet)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        bytes32 value = manager.extsload(slot);\n        assembly (\"memory-safe\") {\n            liquidityNet := sar(128, value)\n            liquidityGross := and(value, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the fee growth outside a tick range of a pool\n     * @dev Corresponds to pools[poolId].ticks[tick].feeGrowthOutside0X128 and pools[poolId].ticks[tick].feeGrowthOutside1X128. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve fee growth for.\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickFeeGrowthOutside(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // offset by 1 word, since the first word is liquidityGross + liquidityNet\n        bytes32[] memory data = manager.extsload(bytes32(uint256(slot) + 1), 2);\n        assembly (\"memory-safe\") {\n            feeGrowthOutside0X128 := mload(add(data, 32))\n            feeGrowthOutside1X128 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves the global fee growth of a pool.\n     * @dev Corresponds to pools[poolId].feeGrowthGlobal0X128 and pools[poolId].feeGrowthGlobal1X128\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return feeGrowthGlobal0 The global fee growth for token0.\n     * @return feeGrowthGlobal1 The global fee growth for token1.\n     * @dev Note that feeGrowthGlobal can be artificially inflated\n     * For pools with a single liquidity position, actors can donate to themselves to freely inflate feeGrowthGlobal\n     * atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n     */\n    function getFeeGrowthGlobals(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State, `uint256 feeGrowthGlobal0X128`\n        bytes32 slot_feeGrowthGlobal0X128 = bytes32(uint256(stateSlot) + FEE_GROWTH_GLOBAL0_OFFSET);\n\n        // read the 2 words of feeGrowthGlobal\n        bytes32[] memory data = manager.extsload(slot_feeGrowthGlobal0X128, 2);\n        assembly (\"memory-safe\") {\n            feeGrowthGlobal0 := mload(add(data, 32))\n            feeGrowthGlobal1 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves total the liquidity of a pool.\n     * @dev Corresponds to pools[poolId].liquidity\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return liquidity The liquidity of the pool.\n     */\n    function getLiquidity(IPoolManager manager, PoolId poolId) internal view returns (uint128 liquidity) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `uint128 liquidity`\n        bytes32 slot = bytes32(uint256(stateSlot) + LIQUIDITY_OFFSET);\n\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Retrieves the tick bitmap of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].tickBitmap[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve the bitmap for.\n     * @return tickBitmap The bitmap of the tick.\n     */\n    function getTickBitmap(IPoolManager manager, PoolId poolId, int16 tick)\n        internal\n        view\n        returns (uint256 tickBitmap)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int16 => uint256) tickBitmap;`\n        bytes32 tickBitmapMapping = bytes32(uint256(stateSlot) + TICK_BITMAP_OFFSET);\n\n        // slot id of the mapping key: `pools[poolId].tickBitmap[tick]\n        bytes32 slot = keccak256(abi.encodePacked(int256(tick), tickBitmapMapping));\n\n        tickBitmap = uint256(manager.extsload(slot));\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool without needing to calculate the `positionId`.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param poolId The ID of the pool.\n     * @param owner The owner of the liquidity position.\n     * @param tickLower The lower tick of the liquidity range.\n     * @param tickUpper The upper tick of the liquidity range.\n     * @param salt The bytes32 randomness to further distinguish position state.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(\n        IPoolManager manager,\n        PoolId poolId,\n        address owner,\n        int24 tickLower,\n        int24 tickUpper,\n        bytes32 salt\n    ) internal view returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128) {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        bytes32 positionKey = Position.calculatePositionKey(owner, tickLower, tickUpper, salt);\n\n        (liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128) = getPositionInfo(manager, poolId, positionKey);\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool at a specific position ID.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n\n        // read all 3 words of the Position.State struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n\n        assembly (\"memory-safe\") {\n            liquidity := mload(add(data, 32))\n            feeGrowthInside0LastX128 := mload(add(data, 64))\n            feeGrowthInside1LastX128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity of a position.\n     * @dev Corresponds to pools[poolId].positions[positionId].liquidity. More gas efficient for just retrieiving liquidity as compared to getPositionInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     */\n    function getPositionLiquidity(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Calculate the fee growth inside a tick range of a pool\n     * @dev pools[poolId].feeGrowthInside0LastX128 in Position.State is cached and can become stale. This function will calculate the up to date feeGrowthInside\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tickLower The lower tick of the range.\n     * @param tickUpper The upper tick of the range.\n     * @return feeGrowthInside0X128 The fee growth inside the tick range for token0.\n     * @return feeGrowthInside1X128 The fee growth inside the tick range for token1.\n     */\n    function getFeeGrowthInside(IPoolManager manager, PoolId poolId, int24 tickLower, int24 tickUpper)\n        internal\n        view\n        returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)\n    {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = getFeeGrowthGlobals(manager, poolId);\n\n        (uint256 lowerFeeGrowthOutside0X128, uint256 lowerFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickLower);\n        (uint256 upperFeeGrowthOutside0X128, uint256 upperFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickUpper);\n        (, int24 tickCurrent,,) = getSlot0(manager, poolId);\n        unchecked {\n            if (tickCurrent < tickLower) {\n                feeGrowthInside0X128 = lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            } else if (tickCurrent >= tickUpper) {\n                feeGrowthInside0X128 = upperFeeGrowthOutside0X128 - lowerFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = upperFeeGrowthOutside1X128 - lowerFeeGrowthOutside1X128;\n            } else {\n                feeGrowthInside0X128 = feeGrowthGlobal0X128 - lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = feeGrowthGlobal1X128 - lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            }\n        }\n    }\n\n    function _getPoolStateSlot(PoolId poolId) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(PoolId.unwrap(poolId), POOLS_SLOT));\n    }\n\n    function _getTickInfoSlot(PoolId poolId, int24 tick) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int24 => TickInfo) ticks`\n        bytes32 ticksMappingSlot = bytes32(uint256(stateSlot) + TICKS_OFFSET);\n\n        // slot key of the tick key: `pools[poolId].ticks[tick]\n        return keccak256(abi.encodePacked(int256(tick), ticksMappingSlot));\n    }\n\n    function _getPositionInfoSlot(PoolId poolId, bytes32 positionId) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(bytes32 => Position.State) positions;`\n        bytes32 positionMapping = bytes32(uint256(stateSlot) + POSITIONS_OFFSET);\n\n        // slot of the mapping key: `pools[poolId].positions[positionId]\n        return keccak256(abi.encodePacked(positionId, positionMapping));\n    }\n}\n"},"src/legacy/vendor/chainlink/shared/interfaces/LinkTokenInterface.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// solhint-disable-next-line interface-starts-with-i\ninterface LinkTokenInterface {\n  function allowance(address owner, address spender) external view returns (uint256 remaining);\n\n  function approve(address spender, uint256 value) external returns (bool success);\n\n  function balanceOf(\n    address owner\n  ) external view returns (uint256 balance);\n\n  function decimals() external view returns (uint8 decimalPlaces);\n\n  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n\n  function increaseApproval(address spender, uint256 subtractedValue) external;\n\n  function name() external view returns (string memory tokenName);\n\n  function symbol() external view returns (string memory tokenSymbol);\n\n  function totalSupply() external view returns (uint256 totalTokensIssued);\n\n  function transfer(address to, uint256 value) external returns (bool success);\n\n  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n\n  function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n"},"src/legacy/vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {LinkTokenInterface} from \"../../shared/interfaces/LinkTokenInterface.sol\";\nimport {IVRFV2PlusWrapper} from \"./interfaces/IVRFV2PlusWrapper.sol\";\n\n/**\n *\n * @notice Interface for contracts using VRF randomness through the VRF V2 wrapper\n * ********************************************************************************\n * @dev PURPOSE\n *\n * @dev Create VRF V2+ requests without the need for subscription management. Rather than creating\n * @dev and funding a VRF V2+ subscription, a user can use this wrapper to create one off requests,\n * @dev paying up front rather than at fulfillment.\n *\n * @dev Since the price is determined using the gas price of the request transaction rather than\n * @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas\n * @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.\n * *****************************************************************************\n * @dev USAGE\n *\n * @dev Calling contracts must inherit from VRFV2PlusWrapperConsumerBase. The consumer must be funded\n * @dev with enough LINK or ether to make the request, otherwise requests will revert. To request randomness,\n * @dev call the 'requestRandomWords' function with the desired VRF parameters. This function handles\n * @dev paying for the request based on the current pricing.\n *\n * @dev Consumers must implement the fullfillRandomWords function, which will be called during\n * @dev fulfillment with the randomness result.\n */\nabstract contract VRFV2PlusWrapperConsumerBase {\n  error OnlyVRFWrapperCanFulfill(address have, address want);\n\n  LinkTokenInterface internal immutable i_linkToken;\n  IVRFV2PlusWrapper public immutable i_vrfV2PlusWrapper;\n\n  /**\n   * @param _vrfV2PlusWrapper is the address of the VRFV2Wrapper contract\n   */\n  constructor(\n    address _vrfV2PlusWrapper\n  ) {\n    IVRFV2PlusWrapper vrfV2PlusWrapper = IVRFV2PlusWrapper(_vrfV2PlusWrapper);\n\n    i_linkToken = LinkTokenInterface(vrfV2PlusWrapper.link());\n    i_vrfV2PlusWrapper = vrfV2PlusWrapper;\n  }\n\n  /**\n   * @dev Requests randomness from the VRF V2+ wrapper.\n   *\n   * @param _callbackGasLimit is the gas limit that should be used when calling the consumer's\n   *        fulfillRandomWords function.\n   * @param _requestConfirmations is the number of confirmations to wait before fulfilling the\n   *        request. A higher number of confirmations increases security by reducing the likelihood\n   *        that a chain re-org changes a published randomness outcome.\n   * @param _numWords is the number of random words to request.\n   *\n   * @return requestId is the VRF V2+ request ID of the newly created randomness request.\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function requestRandomness(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords,\n    bytes memory extraArgs\n  ) internal returns (uint256 requestId, uint256 reqPrice) {\n    reqPrice = i_vrfV2PlusWrapper.calculateRequestPrice(_callbackGasLimit, _numWords);\n    i_linkToken.transferAndCall(\n      address(i_vrfV2PlusWrapper), reqPrice, abi.encode(_callbackGasLimit, _requestConfirmations, _numWords, extraArgs)\n    );\n    return (i_vrfV2PlusWrapper.lastRequestId(), reqPrice);\n  }\n\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function requestRandomnessPayInNative(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords,\n    bytes memory extraArgs\n  ) internal returns (uint256 requestId, uint256 requestPrice) {\n    requestPrice = i_vrfV2PlusWrapper.calculateRequestPriceNative(_callbackGasLimit, _numWords);\n    return (\n      i_vrfV2PlusWrapper.requestRandomWordsInNative{value: requestPrice}(\n        _callbackGasLimit, _requestConfirmations, _numWords, extraArgs\n      ),\n      requestPrice\n    );\n  }\n\n  /**\n   * @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must\n   * @notice implement it.\n   *\n   * @param _requestId is the VRF V2 request ID.\n   * @param _randomWords is the randomness result.\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal virtual;\n\n  function rawFulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) external {\n    address vrfWrapperAddr = address(i_vrfV2PlusWrapper);\n    if (msg.sender != vrfWrapperAddr) {\n      revert OnlyVRFWrapperCanFulfill(msg.sender, vrfWrapperAddr);\n    }\n    fulfillRandomWords(_requestId, _randomWords);\n  }\n\n  /// @notice getBalance returns the native balance of the consumer contract\n  function getBalance() public view returns (uint256) {\n    return address(this).balance;\n  }\n\n  /// @notice getLinkToken returns the link token contract\n  function getLinkToken() public view returns (LinkTokenInterface) {\n    return i_linkToken;\n  }\n}\n"},"src/legacy/vendor/chainlink/vrf/dev/interfaces/IVRFV2PlusWrapper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IVRFV2PlusWrapper {\n  /**\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\n   * be relied option within the same transaction that the request was made.\n   */\n  function lastRequestId() external view returns (uint256);\n\n  /**\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\n   * @notice block.\n   *\n   * @dev This function relies on the transaction gas price which is not automatically set during\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   */\n  function calculateRequestPrice(uint32 _callbackGasLimit, uint32 _numWords) external view returns (uint256);\n\n  /**\n   * @notice Calculates the price of a VRF request in native with the given callbackGasLimit at the current\n   * @notice block.\n   *\n   * @dev This function relies on the transaction gas price which is not automatically set during\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   */\n  function calculateRequestPriceNative(uint32 _callbackGasLimit, uint32 _numWords) external view returns (uint256);\n\n  /**\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\n   *\n   * @dev This is a convenience function that can be called in simulation to better understand\n   * @dev pricing.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\n   */\n  function estimateRequestPrice(\n    uint32 _callbackGasLimit,\n    uint32 _numWords,\n    uint256 _requestGasPriceWei\n  ) external view returns (uint256);\n\n  /**\n   * @notice Estimates the price of a VRF request in native with a specific gas limit and gas price.\n   *\n   * @dev This is a convenience function that can be called in simulation to better understand\n   * @dev pricing.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _numWords is the number of words to request.\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\n   */\n  function estimateRequestPriceNative(\n    uint32 _callbackGasLimit,\n    uint32 _numWords,\n    uint256 _requestGasPriceWei\n  ) external view returns (uint256);\n\n  /**\n   * @notice Requests randomness from the VRF V2 wrapper, paying in native token.\n   *\n   * @param _callbackGasLimit is the gas limit for the request.\n   * @param _requestConfirmations number of request confirmations to wait before serving a request.\n   * @param _numWords is the number of words to request.\n   */\n  function requestRandomWordsInNative(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords,\n    bytes calldata extraArgs\n  ) external payable returns (uint256 requestId);\n\n  function link() external view returns (address);\n  function linkNativeFeed() external view returns (address);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.24;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {ERC721Utils} from \"./utils/ERC721Utils.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n    using Strings for uint256;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    mapping(uint256 tokenId => address) private _owners;\n\n    mapping(address owner => uint256) private _balances;\n\n    mapping(uint256 tokenId => address) private _tokenApprovals;\n\n    mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n        return\n            interfaceId == type(IERC721).interfaceId ||\n            interfaceId == type(IERC721Metadata).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /// @inheritdoc IERC721\n    function balanceOf(address owner) public view virtual returns (uint256) {\n        if (owner == address(0)) {\n            revert ERC721InvalidOwner(address(0));\n        }\n        return _balances[owner];\n    }\n\n    /// @inheritdoc IERC721\n    function ownerOf(uint256 tokenId) public view virtual returns (address) {\n        return _requireOwned(tokenId);\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n        _requireOwned(tokenId);\n\n        string memory baseURI = _baseURI();\n        return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n    }\n\n    /**\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n     * by default, can be overridden in child contracts.\n     */\n    function _baseURI() internal view virtual returns (string memory) {\n        return \"\";\n    }\n\n    /// @inheritdoc IERC721\n    function approve(address to, uint256 tokenId) public virtual {\n        _approve(to, tokenId, _msgSender());\n    }\n\n    /// @inheritdoc IERC721\n    function getApproved(uint256 tokenId) public view virtual returns (address) {\n        _requireOwned(tokenId);\n\n        return _getApproved(tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function setApprovalForAll(address operator, bool approved) public virtual {\n        _setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /// @inheritdoc IERC721\n    function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /// @inheritdoc IERC721\n    function transferFrom(address from, address to, uint256 tokenId) public virtual {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n        // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n        address previousOwner = _update(to, tokenId, _msgSender());\n        if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /// @inheritdoc IERC721\n    function safeTransferFrom(address from, address to, uint256 tokenId) public {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /// @inheritdoc IERC721\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n        transferFrom(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n     *\n     * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n     * core ERC-721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n     * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n     * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n     */\n    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n        return _owners[tokenId];\n    }\n\n    /**\n     * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n     */\n    function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n     * particular (ignoring whether it is owned by `owner`).\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n        return\n            spender != address(0) &&\n            (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n    }\n\n    /**\n     * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n     * Reverts if:\n     * - `spender` does not have approval from `owner` for `tokenId`.\n     * - `spender` does not have approval to manage all of `owner`'s assets.\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n        if (!_isAuthorized(owner, spender, tokenId)) {\n            if (owner == address(0)) {\n                revert ERC721NonexistentToken(tokenId);\n            } else {\n                revert ERC721InsufficientApproval(spender, tokenId);\n            }\n        }\n    }\n\n    /**\n     * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n     *\n     * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n     * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n     *\n     * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n     * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n     * remain consistent with one another.\n     */\n    function _increaseBalance(address account, uint128 value) internal virtual {\n        unchecked {\n            _balances[account] += value;\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n     * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n     * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n     */\n    function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n        address from = _ownerOf(tokenId);\n\n        // Perform (optional) operator check\n        if (auth != address(0)) {\n            _checkAuthorized(from, auth, tokenId);\n        }\n\n        // Execute the update\n        if (from != address(0)) {\n            // Clear approval. No need to re-authorize or emit the Approval event\n            _approve(address(0), tokenId, address(0), false);\n\n            unchecked {\n                _balances[from] -= 1;\n            }\n        }\n\n        if (to != address(0)) {\n            unchecked {\n                _balances[to] += 1;\n            }\n        }\n\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n\n        return from;\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner != address(0)) {\n            revert ERC721InvalidSender(address(0));\n        }\n    }\n\n    /**\n     * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n        _mint(to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), address(0), to, tokenId, data);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     * This is an internal function that does not check if the sender is authorized to operate on the token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal {\n        address previousOwner = _update(address(0), tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        } else if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n     * are aware of the ERC-721 standard to prevent tokens from being forever locked.\n     *\n     * `data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is like {safeTransferFrom} in the sense that it invokes\n     * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `tokenId` token must exist and be owned by `from`.\n     * - `to` cannot be the zero address.\n     * - `from` cannot be the zero address.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId) internal {\n        _safeTransfer(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n        _transfer(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Approve `to` to operate on `tokenId`\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n     * either the owner of the token, or approved to operate on all tokens held by this owner.\n     *\n     * Emits an {Approval} event.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address to, uint256 tokenId, address auth) internal {\n        _approve(to, tokenId, auth, true);\n    }\n\n    /**\n     * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n     * emitted in the context of transfers.\n     */\n    function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n        // Avoid reading the owner unless necessary\n        if (emitEvent || auth != address(0)) {\n            address owner = _requireOwned(tokenId);\n\n            // We do not use _isAuthorized because single-token approvals should not be able to call approve\n            if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n                revert ERC721InvalidApprover(auth);\n            }\n\n            if (emitEvent) {\n                emit Approval(owner, to, tokenId);\n            }\n        }\n\n        _tokenApprovals[tokenId] = to;\n    }\n\n    /**\n     * @dev Approve `operator` to operate on all of `owner` tokens\n     *\n     * Requirements:\n     * - operator can't be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n        if (owner == address(0)) {\n            revert ERC721InvalidApprover(address(0));\n        }\n        if (operator == address(0)) {\n            revert ERC721InvalidOperator(operator);\n        }\n        _operatorApprovals[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    /**\n     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n     * Returns the owner.\n     *\n     * Overrides to ownership logic should be done to {_ownerOf}.\n     */\n    function _requireOwned(uint256 tokenId) internal view returns (address) {\n        address owner = _ownerOf(tokenId);\n        if (owner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n        return owner;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev A uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IPoolManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"./IHooks.sol\";\nimport {IERC6909Claims} from \"./external/IERC6909Claims.sol\";\nimport {IProtocolFees} from \"./IProtocolFees.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IExtsload} from \"./IExtsload.sol\";\nimport {IExttload} from \"./IExttload.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\n\n/// @notice Interface for the PoolManager\ninterface IPoolManager is IProtocolFees, IERC6909Claims, IExtsload, IExttload {\n    /// @notice Thrown when a currency is not netted out after the contract is unlocked\n    error CurrencyNotSettled();\n\n    /// @notice Thrown when trying to interact with a non-initialized pool\n    error PoolNotInitialized();\n\n    /// @notice Thrown when unlock is called, but the contract is already unlocked\n    error AlreadyUnlocked();\n\n    /// @notice Thrown when a function is called that requires the contract to be unlocked, but it is not\n    error ManagerLocked();\n\n    /// @notice Pools are limited to type(int16).max tickSpacing in #initialize, to prevent overflow\n    error TickSpacingTooLarge(int24 tickSpacing);\n\n    /// @notice Pools must have a positive non-zero tickSpacing passed to #initialize\n    error TickSpacingTooSmall(int24 tickSpacing);\n\n    /// @notice PoolKey must have currencies where address(currency0) < address(currency1)\n    error CurrenciesOutOfOrderOrEqual(address currency0, address currency1);\n\n    /// @notice Thrown when a call to updateDynamicLPFee is made by an address that is not the hook,\n    /// or on a pool that does not have a dynamic swap fee.\n    error UnauthorizedDynamicLPFeeUpdate();\n\n    /// @notice Thrown when trying to swap amount of 0\n    error SwapAmountCannotBeZero();\n\n    ///@notice Thrown when native currency is passed to a non native settlement\n    error NonzeroNativeValue();\n\n    /// @notice Thrown when `clear` is called with an amount that is not exactly equal to the open currency delta.\n    error MustClearExactPositiveDelta();\n\n    /// @notice Emitted when a new pool is initialized\n    /// @param id The abi encoded hash of the pool key struct for the new pool\n    /// @param currency0 The first currency of the pool by address sort order\n    /// @param currency1 The second currency of the pool by address sort order\n    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip\n    /// @param tickSpacing The minimum number of ticks between initialized ticks\n    /// @param hooks The hooks contract address for the pool, or address(0) if none\n    /// @param sqrtPriceX96 The price of the pool on initialization\n    /// @param tick The initial tick of the pool corresponding to the initialized price\n    event Initialize(\n        PoolId indexed id,\n        Currency indexed currency0,\n        Currency indexed currency1,\n        uint24 fee,\n        int24 tickSpacing,\n        IHooks hooks,\n        uint160 sqrtPriceX96,\n        int24 tick\n    );\n\n    /// @notice Emitted when a liquidity position is modified\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that modified the pool\n    /// @param tickLower The lower tick of the position\n    /// @param tickUpper The upper tick of the position\n    /// @param liquidityDelta The amount of liquidity that was added or removed\n    /// @param salt The extra data to make positions unique\n    event ModifyLiquidity(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Emitted for swaps between currency0 and currency1\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that initiated the swap call, and that received the callback\n    /// @param amount0 The delta of the currency0 balance of the pool\n    /// @param amount1 The delta of the currency1 balance of the pool\n    /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n    /// @param liquidity The liquidity of the pool after the swap\n    /// @param tick The log base 1.0001 of the price of the pool after the swap\n    /// @param fee The swap fee in hundredths of a bip\n    event Swap(\n        PoolId indexed id,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    /// @notice Emitted for donations\n    /// @param id The abi encoded hash of the pool key struct for the pool that was donated to\n    /// @param sender The address that initiated the donate call\n    /// @param amount0 The amount donated in currency0\n    /// @param amount1 The amount donated in currency1\n    event Donate(PoolId indexed id, address indexed sender, uint256 amount0, uint256 amount1);\n\n    /// @notice All interactions on the contract that account deltas require unlocking. A caller that calls `unlock` must implement\n    /// `IUnlockCallback(msg.sender).unlockCallback(data)`, where they interact with the remaining functions on this contract.\n    /// @dev The only functions callable without an unlocking are `initialize` and `updateDynamicLPFee`\n    /// @param data Any data to pass to the callback, via `IUnlockCallback(msg.sender).unlockCallback(data)`\n    /// @return The data returned by the call to `IUnlockCallback(msg.sender).unlockCallback(data)`\n    function unlock(bytes calldata data) external returns (bytes memory);\n\n    /// @notice Initialize the state for a given pool ID\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The pool key for the pool to initialize\n    /// @param sqrtPriceX96 The initial square root price\n    /// @return tick The initial tick of the pool\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external returns (int24 tick);\n\n    /// @notice Modify the liquidity for the given pool\n    /// @dev Poke by calling with a zero liquidityDelta\n    /// @param key The pool to modify liquidity in\n    /// @param params The parameters for modifying the liquidity\n    /// @param hookData The data to pass through to the add/removeLiquidity hooks\n    /// @return callerDelta The balance delta of the caller of modifyLiquidity. This is the total of both principal, fee deltas, and hook deltas if applicable\n    /// @return feesAccrued The balance delta of the fees generated in the liquidity range. Returned for informational purposes\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious actor and integrators should be careful using the value\n    /// For pools with a single liquidity position, actors can donate to themselves to inflate feeGrowthGlobal (and consequently feesAccrued)\n    /// atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued);\n\n    /// @notice Swap against the given pool\n    /// @param key The pool to swap in\n    /// @param params The parameters for swapping\n    /// @param hookData The data to pass through to the swap hooks\n    /// @return swapDelta The balance delta of the address swapping\n    /// @dev Swapping on low liquidity pools may cause unexpected swap amounts when liquidity available is less than amountSpecified.\n    /// Additionally note that if interacting with hooks that have the BEFORE_SWAP_RETURNS_DELTA_FLAG or AFTER_SWAP_RETURNS_DELTA_FLAG\n    /// the hook may alter the swap input/output. Integrators should perform checks on the returned swapDelta.\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta swapDelta);\n\n    /// @notice Donate the given currency amounts to the in-range liquidity providers of a pool\n    /// @dev Calls to donate can be frontrun adding just-in-time liquidity, with the aim of receiving a portion donated funds.\n    /// Donors should keep this in mind when designing donation mechanisms.\n    /// @dev This function donates to in-range LPs at slot0.tick. In certain edge-cases of the swap algorithm, the `sqrtPrice` of\n    /// a pool can be at the lower boundary of tick `n`, but the `slot0.tick` of the pool is already `n - 1`. In this case a call to\n    /// `donate` would donate to tick `n - 1` (slot0.tick) not tick `n` (getTickAtSqrtPrice(slot0.sqrtPriceX96)).\n    /// Read the comments in `Pool.swap()` for more information about this.\n    /// @param key The key of the pool to donate to\n    /// @param amount0 The amount of currency0 to donate\n    /// @param amount1 The amount of currency1 to donate\n    /// @param hookData The data to pass through to the donate hooks\n    /// @return BalanceDelta The delta of the caller after the donate\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        returns (BalanceDelta);\n\n    /// @notice Writes the current ERC20 balance of the specified currency to transient storage\n    /// This is used to checkpoint balances for the manager and derive deltas for the caller.\n    /// @dev This MUST be called before any ERC20 tokens are sent into the contract, but can be skipped\n    /// for native tokens because the amount to settle is determined by the sent value.\n    /// However, if an ERC20 token has been synced and not settled, and the caller instead wants to settle\n    /// native funds, this function can be called with the native currency to then be able to settle the native currency\n    function sync(Currency currency) external;\n\n    /// @notice Called by the user to net out some value owed to the user\n    /// @dev Will revert if the requested amount is not available, consider using `mint` instead\n    /// @dev Can also be used as a mechanism for free flash loans\n    /// @param currency The currency to withdraw from the pool manager\n    /// @param to The address to withdraw to\n    /// @param amount The amount of currency to withdraw\n    function take(Currency currency, address to, uint256 amount) external;\n\n    /// @notice Called by the user to pay what is owed\n    /// @return paid The amount of currency settled\n    function settle() external payable returns (uint256 paid);\n\n    /// @notice Called by the user to pay on behalf of another address\n    /// @param recipient The address to credit for the payment\n    /// @return paid The amount of currency settled\n    function settleFor(address recipient) external payable returns (uint256 paid);\n\n    /// @notice WARNING - Any currency that is cleared, will be non-retrievable, and locked in the contract permanently.\n    /// A call to clear will zero out a positive balance WITHOUT a corresponding transfer.\n    /// @dev This could be used to clear a balance that is considered dust.\n    /// Additionally, the amount must be the exact positive balance. This is to enforce that the caller is aware of the amount being cleared.\n    function clear(Currency currency, uint256 amount) external;\n\n    /// @notice Called by the user to move value into ERC6909 balance\n    /// @param to The address to mint the tokens to\n    /// @param id The currency address to mint to ERC6909s, as a uint256\n    /// @param amount The amount of currency to mint\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function mint(address to, uint256 id, uint256 amount) external;\n\n    /// @notice Called by the user to move value from ERC6909 balance\n    /// @param from The address to burn the tokens from\n    /// @param id The currency address to burn from ERC6909s, as a uint256\n    /// @param amount The amount of currency to burn\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function burn(address from, uint256 id, uint256 amount) external;\n\n    /// @notice Updates the pools lp fees for the a pool that has enabled dynamic lp fees.\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The key of the pool to update dynamic LP fees for\n    /// @param newDynamicLPFee The new dynamic pool LP fee\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint128.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n    uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LiquidityMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n    /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n    /// @param x The liquidity before change\n    /// @param y The delta by which liquidity should be changed\n    /// @return z The liquidity delta\n    function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n        assembly (\"memory-safe\") {\n            z := add(and(x, 0xffffffffffffffffffffffffffffffff), signextend(15, y))\n            if shr(128, z) {\n                // revert SafeCastOverflow()\n                mstore(0, 0x93dafdf1)\n                revert(0x1c, 0x04)\n            }\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SqrtPriceMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {UnsafeMath} from \"./UnsafeMath.sol\";\nimport {FixedPoint96} from \"./FixedPoint96.sol\";\n\n/// @title Functions based on Q64.96 sqrt price and liquidity\n/// @notice Contains the math that uses square root of price as a Q64.96 and liquidity to compute deltas\nlibrary SqrtPriceMath {\n    using SafeCast for uint256;\n\n    error InvalidPriceOrLiquidity();\n    error InvalidPrice();\n    error NotEnoughLiquidity();\n    error PriceOverflow();\n\n    /// @notice Gets the next sqrt price given a delta of currency0\n    /// @dev Always rounds up, because in the exact output case (increasing price) we need to move the price at least\n    /// far enough to get the desired output amount, and in the exact input case (decreasing price) we need to move the\n    /// price less in order to not send too much output.\n    /// The most precise formula for this is liquidity * sqrtPX96 / (liquidity +- amount * sqrtPX96),\n    /// if this is impossible because of overflow, we calculate liquidity / (liquidity / sqrtPX96 +- amount).\n    /// @param sqrtPX96 The starting price, i.e. before accounting for the currency0 delta\n    /// @param liquidity The amount of usable liquidity\n    /// @param amount How much of currency0 to add or remove from virtual reserves\n    /// @param add Whether to add or remove the amount of currency0\n    /// @return The price after adding or removing amount, depending on add\n    function getNextSqrtPriceFromAmount0RoundingUp(uint160 sqrtPX96, uint128 liquidity, uint256 amount, bool add)\n        internal\n        pure\n        returns (uint160)\n    {\n        // we short circuit amount == 0 because the result is otherwise not guaranteed to equal the input price\n        if (amount == 0) return sqrtPX96;\n        uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n\n        if (add) {\n            unchecked {\n                uint256 product = amount * sqrtPX96;\n                if (product / amount == sqrtPX96) {\n                    uint256 denominator = numerator1 + product;\n                    if (denominator >= numerator1) {\n                        // always fits in 160 bits\n                        return uint160(FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n                    }\n                }\n            }\n            // denominator is checked for overflow\n            return uint160(UnsafeMath.divRoundingUp(numerator1, (numerator1 / sqrtPX96) + amount));\n        } else {\n            unchecked {\n                uint256 product = amount * sqrtPX96;\n                // if the product overflows, we know the denominator underflows\n                // in addition, we must check that the denominator does not underflow\n                // equivalent: if (product / amount != sqrtPX96 || numerator1 <= product) revert PriceOverflow();\n                assembly (\"memory-safe\") {\n                    if iszero(\n                        and(\n                            eq(div(product, amount), and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                            gt(numerator1, product)\n                        )\n                    ) {\n                        mstore(0, 0xf5c787f1) // selector for PriceOverflow()\n                        revert(0x1c, 0x04)\n                    }\n                }\n                uint256 denominator = numerator1 - product;\n                return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator).toUint160();\n            }\n        }\n    }\n\n    /// @notice Gets the next sqrt price given a delta of currency1\n    /// @dev Always rounds down, because in the exact output case (decreasing price) we need to move the price at least\n    /// far enough to get the desired output amount, and in the exact input case (increasing price) we need to move the\n    /// price less in order to not send too much output.\n    /// The formula we compute is within <1 wei of the lossless version: sqrtPX96 +- amount / liquidity\n    /// @param sqrtPX96 The starting price, i.e., before accounting for the currency1 delta\n    /// @param liquidity The amount of usable liquidity\n    /// @param amount How much of currency1 to add, or remove, from virtual reserves\n    /// @param add Whether to add, or remove, the amount of currency1\n    /// @return The price after adding or removing `amount`\n    function getNextSqrtPriceFromAmount1RoundingDown(uint160 sqrtPX96, uint128 liquidity, uint256 amount, bool add)\n        internal\n        pure\n        returns (uint160)\n    {\n        // if we're adding (subtracting), rounding down requires rounding the quotient down (up)\n        // in both cases, avoid a mulDiv for most inputs\n        if (add) {\n            uint256 quotient = (\n                amount <= type(uint160).max\n                    ? (amount << FixedPoint96.RESOLUTION) / liquidity\n                    : FullMath.mulDiv(amount, FixedPoint96.Q96, liquidity)\n            );\n\n            return (uint256(sqrtPX96) + quotient).toUint160();\n        } else {\n            uint256 quotient = (\n                amount <= type(uint160).max\n                    ? UnsafeMath.divRoundingUp(amount << FixedPoint96.RESOLUTION, liquidity)\n                    : FullMath.mulDivRoundingUp(amount, FixedPoint96.Q96, liquidity)\n            );\n\n            // equivalent: if (sqrtPX96 <= quotient) revert NotEnoughLiquidity();\n            assembly (\"memory-safe\") {\n                if iszero(gt(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff), quotient)) {\n                    mstore(0, 0x4323a555) // selector for NotEnoughLiquidity()\n                    revert(0x1c, 0x04)\n                }\n            }\n            // always fits 160 bits\n            unchecked {\n                return uint160(sqrtPX96 - quotient);\n            }\n        }\n    }\n\n    /// @notice Gets the next sqrt price given an input amount of currency0 or currency1\n    /// @dev Throws if price or liquidity are 0, or if the next price is out of bounds\n    /// @param sqrtPX96 The starting price, i.e., before accounting for the input amount\n    /// @param liquidity The amount of usable liquidity\n    /// @param amountIn How much of currency0, or currency1, is being swapped in\n    /// @param zeroForOne Whether the amount in is currency0 or currency1\n    /// @return uint160 The price after adding the input amount to currency0 or currency1\n    function getNextSqrtPriceFromInput(uint160 sqrtPX96, uint128 liquidity, uint256 amountIn, bool zeroForOne)\n        internal\n        pure\n        returns (uint160)\n    {\n        // equivalent: if (sqrtPX96 == 0 || liquidity == 0) revert InvalidPriceOrLiquidity();\n        assembly (\"memory-safe\") {\n            if or(\n                iszero(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                iszero(and(liquidity, 0xffffffffffffffffffffffffffffffff))\n            ) {\n                mstore(0, 0x4f2461b8) // selector for InvalidPriceOrLiquidity()\n                revert(0x1c, 0x04)\n            }\n        }\n\n        // round to make sure that we don't pass the target price\n        return zeroForOne\n            ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true)\n            : getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountIn, true);\n    }\n\n    /// @notice Gets the next sqrt price given an output amount of currency0 or currency1\n    /// @dev Throws if price or liquidity are 0 or the next price is out of bounds\n    /// @param sqrtPX96 The starting price before accounting for the output amount\n    /// @param liquidity The amount of usable liquidity\n    /// @param amountOut How much of currency0, or currency1, is being swapped out\n    /// @param zeroForOne Whether the amount out is currency1 or currency0\n    /// @return uint160 The price after removing the output amount of currency0 or currency1\n    function getNextSqrtPriceFromOutput(uint160 sqrtPX96, uint128 liquidity, uint256 amountOut, bool zeroForOne)\n        internal\n        pure\n        returns (uint160)\n    {\n        // equivalent: if (sqrtPX96 == 0 || liquidity == 0) revert InvalidPriceOrLiquidity();\n        assembly (\"memory-safe\") {\n            if or(\n                iszero(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                iszero(and(liquidity, 0xffffffffffffffffffffffffffffffff))\n            ) {\n                mstore(0, 0x4f2461b8) // selector for InvalidPriceOrLiquidity()\n                revert(0x1c, 0x04)\n            }\n        }\n\n        // round to make sure that we pass the target price\n        return zeroForOne\n            ? getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountOut, false)\n            : getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountOut, false);\n    }\n\n    /// @notice Gets the amount0 delta between two prices\n    /// @dev Calculates liquidity / sqrt(lower) - liquidity / sqrt(upper),\n    /// i.e. liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The amount of usable liquidity\n    /// @param roundUp Whether to round the amount up or down\n    /// @return uint256 Amount of currency0 required to cover a position of size liquidity between the two passed prices\n    function getAmount0Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity, bool roundUp)\n        internal\n        pure\n        returns (uint256)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n            // equivalent: if (sqrtPriceAX96 == 0) revert InvalidPrice();\n            assembly (\"memory-safe\") {\n                if iszero(and(sqrtPriceAX96, 0xffffffffffffffffffffffffffffffffffffffff)) {\n                    mstore(0, 0x00bfc921) // selector for InvalidPrice()\n                    revert(0x1c, 0x04)\n                }\n            }\n\n            uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n            uint256 numerator2 = sqrtPriceBX96 - sqrtPriceAX96;\n\n            return roundUp\n                ? UnsafeMath.divRoundingUp(FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtPriceBX96), sqrtPriceAX96)\n                : FullMath.mulDiv(numerator1, numerator2, sqrtPriceBX96) / sqrtPriceAX96;\n        }\n    }\n\n    /// @notice Equivalent to: `a >= b ? a - b : b - a`\n    function absDiff(uint160 a, uint160 b) internal pure returns (uint256 res) {\n        assembly (\"memory-safe\") {\n            let diff :=\n                sub(and(a, 0xffffffffffffffffffffffffffffffffffffffff), and(b, 0xffffffffffffffffffffffffffffffffffffffff))\n            // mask = 0 if a >= b else -1 (all 1s)\n            let mask := sar(255, diff)\n            // if a >= b, res = a - b = 0 ^ (a - b)\n            // if a < b, res = b - a = ~~(b - a) = ~(-(b - a) - 1) = ~(a - b - 1) = (-1) ^ (a - b - 1)\n            // either way, res = mask ^ (a - b + mask)\n            res := xor(mask, add(mask, diff))\n        }\n    }\n\n    /// @notice Gets the amount1 delta between two prices\n    /// @dev Calculates liquidity * (sqrt(upper) - sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The amount of usable liquidity\n    /// @param roundUp Whether to round the amount up, or down\n    /// @return amount1 Amount of currency1 required to cover a position of size liquidity between the two passed prices\n    function getAmount1Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity, bool roundUp)\n        internal\n        pure\n        returns (uint256 amount1)\n    {\n        uint256 numerator = absDiff(sqrtPriceAX96, sqrtPriceBX96);\n        uint256 denominator = FixedPoint96.Q96;\n        uint256 _liquidity = uint256(liquidity);\n\n        /**\n         * Equivalent to:\n         *   amount1 = roundUp\n         *       ? FullMath.mulDivRoundingUp(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96)\n         *       : FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96);\n         * Cannot overflow because `type(uint128).max * type(uint160).max >> 96 < (1 << 192)`.\n         */\n        amount1 = FullMath.mulDiv(_liquidity, numerator, denominator);\n        assembly (\"memory-safe\") {\n            amount1 := add(amount1, and(gt(mulmod(_liquidity, numerator, denominator), 0), roundUp))\n        }\n    }\n\n    /// @notice Helper that gets signed currency0 delta\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The change in liquidity for which to compute the amount0 delta\n    /// @return int256 Amount of currency0 corresponding to the passed liquidityDelta between the two prices\n    function getAmount0Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, int128 liquidity)\n        internal\n        pure\n        returns (int256)\n    {\n        unchecked {\n            return liquidity < 0\n                ? getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(-liquidity), false).toInt256()\n                : -getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(liquidity), true).toInt256();\n        }\n    }\n\n    /// @notice Helper that gets signed currency1 delta\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The change in liquidity for which to compute the amount1 delta\n    /// @return int256 Amount of currency1 corresponding to the passed liquidityDelta between the two prices\n    function getAmount1Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, int128 liquidity)\n        internal\n        pure\n        returns (int256)\n    {\n        unchecked {\n            return liquidity < 0\n                ? getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(-liquidity), false).toInt256()\n                : -getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(liquidity), true).toInt256();\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC-721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC-721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n     *   {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IProtocolFees.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\n\n/// @notice Interface for all protocol-fee related functions in the pool manager\ninterface IProtocolFees {\n    /// @notice Thrown when protocol fee is set too high\n    error ProtocolFeeTooLarge(uint24 fee);\n\n    /// @notice Thrown when collectProtocolFees or setProtocolFee is not called by the controller.\n    error InvalidCaller();\n\n    /// @notice Thrown when collectProtocolFees is attempted on a token that is synced.\n    error ProtocolFeeCurrencySynced();\n\n    /// @notice Emitted when the protocol fee controller address is updated in setProtocolFeeController.\n    event ProtocolFeeControllerUpdated(address indexed protocolFeeController);\n\n    /// @notice Emitted when the protocol fee is updated for a pool.\n    event ProtocolFeeUpdated(PoolId indexed id, uint24 protocolFee);\n\n    /// @notice Given a currency address, returns the protocol fees accrued in that currency\n    /// @param currency The currency to check\n    /// @return amount The amount of protocol fees accrued in the currency\n    function protocolFeesAccrued(Currency currency) external view returns (uint256 amount);\n\n    /// @notice Sets the protocol fee for the given pool\n    /// @param key The key of the pool to set a protocol fee for\n    /// @param newProtocolFee The fee to set\n    function setProtocolFee(PoolKey memory key, uint24 newProtocolFee) external;\n\n    /// @notice Sets the protocol fee controller\n    /// @param controller The new protocol fee controller\n    function setProtocolFeeController(address controller) external;\n\n    /// @notice Collects the protocol fees for a given recipient and currency, returning the amount collected\n    /// @dev This will revert if the contract is unlocked\n    /// @param recipient The address to receive the protocol fees\n    /// @param currency The currency to withdraw\n    /// @param amount The amount of currency to withdraw\n    /// @return amountCollected The amount of currency successfully withdrawn\n    function collectProtocolFees(address recipient, Currency currency, uint256 amount)\n        external\n        returns (uint256 amountCollected);\n\n    /// @notice Returns the current protocol fee controller address\n    /// @return address The current protocol fee controller address\n    function protocolFeeController() external view returns (address);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\nimport {StorageSlot} from \"./StorageSlot.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n *\n * IMPORTANT: Deprecated. This storage-based reentrancy guard will be removed and replaced\n * by the {ReentrancyGuardTransient} variant in v6.0.\n *\n * @custom:stateless\n */\nabstract contract ReentrancyGuard {\n    using StorageSlot for bytes32;\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant REENTRANCY_GUARD_STORAGE =\n        0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _reentrancyGuardStorageSlot().getUint256Slot().value = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    /**\n     * @dev A `view` only version of {nonReentrant}. Use to block view functions\n     * from being called, preventing reading from inconsistent contract state.\n     *\n     * CAUTION: This is a \"view\" modifier and does not change the reentrancy\n     * status. Use it only on view functions. For payable or non-payable functions,\n     * use the standard {nonReentrant} modifier instead.\n     */\n    modifier nonReentrantView() {\n        _nonReentrantBeforeView();\n        _;\n    }\n\n    function _nonReentrantBeforeView() private view {\n        if (_reentrancyGuardEntered()) {\n            revert ReentrancyGuardReentrantCall();\n        }\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        _nonReentrantBeforeView();\n\n        // Any calls to nonReentrant after this point will fail\n        _reentrancyGuardStorageSlot().getUint256Slot().value = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _reentrancyGuardStorageSlot().getUint256Slot().value = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _reentrancyGuardStorageSlot().getUint256Slot().value == ENTERED;\n    }\n\n    function _reentrancyGuardStorageSlot() internal pure virtual returns (bytes32) {\n        return REENTRANCY_GUARD_STORAGE;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n            // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n            int256 mask = n >> 255;\n\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n            return uint256((n + mask) ^ mask);\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CurrencyReserves.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\nlibrary CurrencyReserves {\n    using CustomRevert for bytes4;\n\n    /// bytes32(uint256(keccak256(\"ReservesOf\")) - 1)\n    bytes32 constant RESERVES_OF_SLOT = 0x1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd95;\n    /// bytes32(uint256(keccak256(\"Currency\")) - 1)\n    bytes32 constant CURRENCY_SLOT = 0x27e098c505d44ec3574004bca052aabf76bd35004c182099d8c575fb238593b9;\n\n    function getSyncedCurrency() internal view returns (Currency currency) {\n        assembly (\"memory-safe\") {\n            currency := tload(CURRENCY_SLOT)\n        }\n    }\n\n    function resetCurrency() internal {\n        assembly (\"memory-safe\") {\n            tstore(CURRENCY_SLOT, 0)\n        }\n    }\n\n    function syncCurrencyAndReserves(Currency currency, uint256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(CURRENCY_SLOT, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            tstore(RESERVES_OF_SLOT, value)\n        }\n    }\n\n    function getSyncedReserves() internal view returns (uint256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(RESERVES_OF_SLOT)\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/NonzeroDeltaCount.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\n/// @notice This is a temporary library that allows us to use transient storage (tstore/tload)\n/// for the nonzero delta count.\n/// TODO: This library can be deleted when we have the transient keyword support in solidity.\nlibrary NonzeroDeltaCount {\n    // The slot holding the number of nonzero deltas. bytes32(uint256(keccak256(\"NonzeroDeltaCount\")) - 1)\n    bytes32 internal constant NONZERO_DELTA_COUNT_SLOT =\n        0x7d4b3164c6e45b97e7d87b7125a44c5828d005af88f9d751cfd78729c5d99a0b;\n\n    function read() internal view returns (uint256 count) {\n        assembly (\"memory-safe\") {\n            count := tload(NONZERO_DELTA_COUNT_SLOT)\n        }\n    }\n\n    function increment() internal {\n        assembly (\"memory-safe\") {\n            let count := tload(NONZERO_DELTA_COUNT_SLOT)\n            count := add(count, 1)\n            tstore(NONZERO_DELTA_COUNT_SLOT, count)\n        }\n    }\n\n    /// @notice Potential to underflow. Ensure checks are performed by integrating contracts to ensure this does not happen.\n    /// Current usage ensures this will not happen because we call decrement with known boundaries (only up to the number of times we call increment).\n    function decrement() internal {\n        assembly (\"memory-safe\") {\n            let count := tload(NONZERO_DELTA_COUNT_SLOT)\n            count := sub(count, 1)\n            tstore(NONZERO_DELTA_COUNT_SLOT, count)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n    enum RecoverError {\n        NoError,\n        InvalidSignature,\n        InvalidSignatureLength,\n        InvalidSignatureS\n    }\n\n    /**\n     * @dev The signature is invalid.\n     */\n    error ECDSAInvalidSignature();\n\n    /**\n     * @dev The signature has an invalid length.\n     */\n    error ECDSAInvalidSignatureLength(uint256 length);\n\n    /**\n     * @dev The signature has an S value that is in the upper half order.\n     */\n    error ECDSAInvalidSignatureS(bytes32 s);\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n     * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n     * and a bytes32 providing additional information about the error.\n     *\n     * If no error is returned, then the address can be used for verification purposes.\n     *\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * NOTE: This function only supports 65-byte signatures. ERC-2098 short signatures are rejected. This restriction\n     * is DEPRECATED and will be removed in v6.0. Developers SHOULD NOT use signatures as unique identifiers; use hash\n     * invalidation or nonces for replay protection.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n     *\n     * Documentation for signature generation:\n     *\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes memory signature\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly (\"memory-safe\") {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n        }\n    }\n\n    /**\n     * @dev Variant of {tryRecover} that takes a signature in calldata\n     */\n    function tryRecoverCalldata(\n        bytes32 hash,\n        bytes calldata signature\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, calldata slices would work here, but are\n            // significantly more expensive (length check) than using calldataload in assembly.\n            assembly (\"memory-safe\") {\n                r := calldataload(signature.offset)\n                s := calldataload(add(signature.offset, 0x20))\n                v := byte(0, calldataload(add(signature.offset, 0x40)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * NOTE: This function only supports 65-byte signatures. ERC-2098 short signatures are rejected. This restriction\n     * is DEPRECATED and will be removed in v6.0. Developers SHOULD NOT use signatures as unique identifiers; use hash\n     * invalidation or nonces for replay protection.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Variant of {recover} that takes a signature in calldata\n     */\n    function recoverCalldata(bytes32 hash, bytes calldata signature) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecoverCalldata(hash, signature);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n     *\n     * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        unchecked {\n            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n            // We do not check for an overflow here since the shift operation results in 0 or 1.\n            uint8 v = uint8((uint256(vs) >> 255) + 27);\n            return tryRecover(hash, v, r, s);\n        }\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately.\n     */\n    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function tryRecover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n            return (address(0), RecoverError.InvalidSignatureS, s);\n        }\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        if (signer == address(0)) {\n            return (address(0), RecoverError.InvalidSignature, bytes32(0));\n        }\n\n        return (signer, RecoverError.NoError, bytes32(0));\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Parse a signature into its `v`, `r` and `s` components. Supports 65-byte and 64-byte (ERC-2098)\n     * formats. Returns (0,0,0) for invalid signatures.\n     *\n     * For 64-byte signatures, `v` is automatically normalized to 27 or 28.\n     * For 65-byte signatures, `v` is returned as-is and MUST already be 27 or 28 for use with ecrecover.\n     *\n     * Consider validating the result before use, or use {tryRecover}/{recover} which perform full validation.\n     */\n    function parse(bytes memory signature) internal pure returns (uint8 v, bytes32 r, bytes32 s) {\n        assembly (\"memory-safe\") {\n            // Check the signature length\n            switch mload(signature)\n            // - case 65: r,s,v signature (standard)\n            case 65 {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098)\n            case 64 {\n                let vs := mload(add(signature, 0x40))\n                r := mload(add(signature, 0x20))\n                s := and(vs, shr(1, not(0)))\n                v := add(shr(255, vs), 27)\n            }\n            default {\n                r := 0\n                s := 0\n                v := 0\n            }\n        }\n    }\n\n    /**\n     * @dev Variant of {parse} that takes a signature in calldata\n     */\n    function parseCalldata(bytes calldata signature) internal pure returns (uint8 v, bytes32 r, bytes32 s) {\n        assembly (\"memory-safe\") {\n            // Check the signature length\n            switch signature.length\n            // - case 65: r,s,v signature (standard)\n            case 65 {\n                r := calldataload(signature.offset)\n                s := calldataload(add(signature.offset, 0x20))\n                v := byte(0, calldataload(add(signature.offset, 0x40)))\n            }\n            // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098)\n            case 64 {\n                let vs := calldataload(add(signature.offset, 0x20))\n                r := calldataload(signature.offset)\n                s := and(vs, shr(1, not(0)))\n                v := add(shr(255, vs), 27)\n            }\n            default {\n                r := 0\n                s := 0\n                v := 0\n            }\n        }\n    }\n\n    /**\n     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n     */\n    function _throwError(RecoverError error, bytes32 errorArg) private pure {\n        if (error == RecoverError.NoError) {\n            return; // no error: do nothing\n        } else if (error == RecoverError.InvalidSignature) {\n            revert ECDSAInvalidSignature();\n        } else if (error == RecoverError.InvalidSignatureLength) {\n            revert ECDSAInvalidSignatureLength(uint256(errorArg));\n        } else if (error == RecoverError.InvalidSignatureS) {\n            revert ECDSAInvalidSignatureS(errorArg);\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-721.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IEIP712} from \"./IEIP712.sol\";\n\n/// @title AllowanceTransfer\n/// @notice Handles ERC20 token permissions through signature based allowance setting and ERC20 token transfers by checking allowed amounts\n/// @dev Requires user's token approval on the Permit2 contract\ninterface IAllowanceTransfer is IEIP712 {\n    /// @notice Thrown when an allowance on a token has expired.\n    /// @param deadline The timestamp at which the allowed amount is no longer valid\n    error AllowanceExpired(uint256 deadline);\n\n    /// @notice Thrown when an allowance on a token has been depleted.\n    /// @param amount The maximum amount allowed\n    error InsufficientAllowance(uint256 amount);\n\n    /// @notice Thrown when too many nonces are invalidated.\n    error ExcessiveInvalidation();\n\n    /// @notice Emits an event when the owner successfully invalidates an ordered nonce.\n    event NonceInvalidation(\n        address indexed owner, address indexed token, address indexed spender, uint48 newNonce, uint48 oldNonce\n    );\n\n    /// @notice Emits an event when the owner successfully sets permissions on a token for the spender.\n    event Approval(\n        address indexed owner, address indexed token, address indexed spender, uint160 amount, uint48 expiration\n    );\n\n    /// @notice Emits an event when the owner successfully sets permissions using a permit signature on a token for the spender.\n    event Permit(\n        address indexed owner,\n        address indexed token,\n        address indexed spender,\n        uint160 amount,\n        uint48 expiration,\n        uint48 nonce\n    );\n\n    /// @notice Emits an event when the owner sets the allowance back to 0 with the lockdown function.\n    event Lockdown(address indexed owner, address token, address spender);\n\n    /// @notice The permit data for a token\n    struct PermitDetails {\n        // ERC20 token address\n        address token;\n        // the maximum amount allowed to spend\n        uint160 amount;\n        // timestamp at which a spender's token allowances become invalid\n        uint48 expiration;\n        // an incrementing value indexed per owner,token,and spender for each signature\n        uint48 nonce;\n    }\n\n    /// @notice The permit message signed for a single token allowance\n    struct PermitSingle {\n        // the permit data for a single token alownce\n        PermitDetails details;\n        // address permissioned on the allowed tokens\n        address spender;\n        // deadline on the permit signature\n        uint256 sigDeadline;\n    }\n\n    /// @notice The permit message signed for multiple token allowances\n    struct PermitBatch {\n        // the permit data for multiple token allowances\n        PermitDetails[] details;\n        // address permissioned on the allowed tokens\n        address spender;\n        // deadline on the permit signature\n        uint256 sigDeadline;\n    }\n\n    /// @notice The saved permissions\n    /// @dev This info is saved per owner, per token, per spender and all signed over in the permit message\n    /// @dev Setting amount to type(uint160).max sets an unlimited approval\n    struct PackedAllowance {\n        // amount allowed\n        uint160 amount;\n        // permission expiry\n        uint48 expiration;\n        // an incrementing value indexed per owner,token,and spender for each signature\n        uint48 nonce;\n    }\n\n    /// @notice A token spender pair.\n    struct TokenSpenderPair {\n        // the token the spender is approved\n        address token;\n        // the spender address\n        address spender;\n    }\n\n    /// @notice Details for a token transfer.\n    struct AllowanceTransferDetails {\n        // the owner of the token\n        address from;\n        // the recipient of the token\n        address to;\n        // the amount of the token\n        uint160 amount;\n        // the token to be transferred\n        address token;\n    }\n\n    /// @notice A mapping from owner address to token address to spender address to PackedAllowance struct, which contains details and conditions of the approval.\n    /// @notice The mapping is indexed in the above order see: allowance[ownerAddress][tokenAddress][spenderAddress]\n    /// @dev The packed slot holds the allowed amount, expiration at which the allowed amount is no longer valid, and current nonce thats updated on any signature based approvals.\n    function allowance(address user, address token, address spender)\n        external\n        view\n        returns (uint160 amount, uint48 expiration, uint48 nonce);\n\n    /// @notice Approves the spender to use up to amount of the specified token up until the expiration\n    /// @param token The token to approve\n    /// @param spender The spender address to approve\n    /// @param amount The approved amount of the token\n    /// @param expiration The timestamp at which the approval is no longer valid\n    /// @dev The packed allowance also holds a nonce, which will stay unchanged in approve\n    /// @dev Setting amount to type(uint160).max sets an unlimited approval\n    function approve(address token, address spender, uint160 amount, uint48 expiration) external;\n\n    /// @notice Permit a spender to a given amount of the owners token via the owner's EIP-712 signature\n    /// @dev May fail if the owner's nonce was invalidated in-flight by invalidateNonce\n    /// @param owner The owner of the tokens being approved\n    /// @param permitSingle Data signed over by the owner specifying the terms of approval\n    /// @param signature The owner's signature over the permit data\n    function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external;\n\n    /// @notice Permit a spender to the signed amounts of the owners tokens via the owner's EIP-712 signature\n    /// @dev May fail if the owner's nonce was invalidated in-flight by invalidateNonce\n    /// @param owner The owner of the tokens being approved\n    /// @param permitBatch Data signed over by the owner specifying the terms of approval\n    /// @param signature The owner's signature over the permit data\n    function permit(address owner, PermitBatch memory permitBatch, bytes calldata signature) external;\n\n    /// @notice Transfer approved tokens from one address to another\n    /// @param from The address to transfer from\n    /// @param to The address of the recipient\n    /// @param amount The amount of the token to transfer\n    /// @param token The token address to transfer\n    /// @dev Requires the from address to have approved at least the desired amount\n    /// of tokens to msg.sender.\n    function transferFrom(address from, address to, uint160 amount, address token) external;\n\n    /// @notice Transfer approved tokens in a batch\n    /// @param transferDetails Array of owners, recipients, amounts, and tokens for the transfers\n    /// @dev Requires the from addresses to have approved at least the desired amount\n    /// of tokens to msg.sender.\n    function transferFrom(AllowanceTransferDetails[] calldata transferDetails) external;\n\n    /// @notice Enables performing a \"lockdown\" of the sender's Permit2 identity\n    /// by batch revoking approvals\n    /// @param approvals Array of approvals to revoke.\n    function lockdown(TokenSpenderPair[] calldata approvals) external;\n\n    /// @notice Invalidate nonces for a given (token, spender) pair\n    /// @param token The token to invalidate nonces for\n    /// @param spender The spender to invalidate nonces for\n    /// @param newNonce The new nonce to set. Invalidates all nonces less than it.\n    /// @dev Can't invalidate more than 2**16 nonces per transaction.\n    function invalidateNonces(address token, address spender, uint48 newNonce) external;\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TransientStateLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {CurrencyReserves} from \"./CurrencyReserves.sol\";\nimport {NonzeroDeltaCount} from \"./NonzeroDeltaCount.sol\";\nimport {Lock} from \"./Lock.sol\";\n\n/// @notice A helper library to provide state getters that use exttload\nlibrary TransientStateLibrary {\n    /// @notice returns the reserves for the synced currency\n    /// @param manager The pool manager contract.\n\n    /// @return uint256 The reserves of the currency.\n    /// @dev returns 0 if the reserves are not synced or value is 0.\n    /// Checks the synced currency to only return valid reserve values (after a sync and before a settle).\n    function getSyncedReserves(IPoolManager manager) internal view returns (uint256) {\n        if (getSyncedCurrency(manager).isAddressZero()) return 0;\n        return uint256(manager.exttload(CurrencyReserves.RESERVES_OF_SLOT));\n    }\n\n    function getSyncedCurrency(IPoolManager manager) internal view returns (Currency) {\n        return Currency.wrap(address(uint160(uint256(manager.exttload(CurrencyReserves.CURRENCY_SLOT)))));\n    }\n\n    /// @notice Returns the number of nonzero deltas open on the PoolManager that must be zeroed out before the contract is locked\n    function getNonzeroDeltaCount(IPoolManager manager) internal view returns (uint256) {\n        return uint256(manager.exttload(NonzeroDeltaCount.NONZERO_DELTA_COUNT_SLOT));\n    }\n\n    /// @notice Get the current delta for a caller in the given currency\n    /// @param target The credited account address\n    /// @param currency The currency for which to lookup the delta\n    function currencyDelta(IPoolManager manager, address target, Currency currency) internal view returns (int256) {\n        bytes32 key;\n        assembly (\"memory-safe\") {\n            mstore(0, and(target, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(32, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            key := keccak256(0, 64)\n        }\n        return int256(uint256(manager.exttload(key)));\n    }\n\n    /// @notice Returns whether the contract is unlocked or not\n    function isUnlocked(IPoolManager manager) internal view returns (bool) {\n        return manager.exttload(Lock.IS_UNLOCKED_SLOT) != 0x0;\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity >=0.5.0;\n\n/**\n * @title ERC-721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC-721 asset contracts.\n */\ninterface IERC721Receiver {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n     * reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Minimal ERC20 interface for Uniswap\n/// @notice Contains a subset of the full ERC20 interface that is used in Uniswap V3\ninterface IERC20Minimal {\n    /// @notice Returns an account's balance in the token\n    /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n    /// @return The number of tokens held by the account\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n    /// @param recipient The account that will receive the amount transferred\n    /// @param amount The number of tokens to send from the sender to the recipient\n    /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Returns the current allowance given to a spender by an owner\n    /// @param owner The account of the token owner\n    /// @param spender The account of the token spender\n    /// @return The current allowance granted by `owner` to `spender`\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n    /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n    /// @param amount The amount of tokens allowed to be used by `spender`\n    /// @return Returns true for a successful approval, false for unsuccessful\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n    /// @param sender The account from which the transfer will be initiated\n    /// @param recipient The recipient of the transfer\n    /// @param amount The amount of the transfer\n    /// @return Returns true for a successful transfer, false for unsuccessful\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n    /// @param from The account from which the tokens were sent, i.e. the balance decreased\n    /// @param to The account to which the tokens were sent, i.e. the balance increased\n    /// @param value The amount of tokens that were transferred\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n    /// @param owner The account that approved spending of its tokens\n    /// @param spender The account for which the spending allowance was modified\n    /// @param value The new allowance from the owner to the spender\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC721/utils/ERC721Utils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721Receiver} from \"../IERC721Receiver.sol\";\nimport {IERC721Errors} from \"../../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Library that provides common ERC-721 utility functions.\n *\n * See https://eips.ethereum.org/EIPS/eip-721[ERC-721].\n *\n * _Available since v5.1._\n */\nlibrary ERC721Utils {\n    /**\n     * @dev Performs an acceptance check for the provided `operator` by calling {IERC721Receiver-onERC721Received}\n     * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`).\n     *\n     * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA).\n     * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept\n     * the transfer.\n     */\n    function checkOnERC721Received(\n        address operator,\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) internal {\n        if (to.code.length > 0) {\n            try IERC721Receiver(to).onERC721Received(operator, from, tokenId, data) returns (bytes4 retval) {\n                if (retval != IERC721Receiver.onERC721Received.selector) {\n                    // Token rejected\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                }\n            } catch (bytes memory reason) {\n                if (reason.length == 0) {\n                    // non-IERC721Receiver implementer\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                } else {\n                    assembly (\"memory-safe\") {\n                        revert(add(reason, 0x20), mload(reason))\n                    }\n                }\n            }\n        }\n    }\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for claims over a contract balance, wrapped as a ERC6909\ninterface IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event OperatorSet(address indexed owner, address indexed operator, bool approved);\n\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);\n\n    event Transfer(address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount);\n\n    /*//////////////////////////////////////////////////////////////\n                                 FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice Owner balance of an id.\n    /// @param owner The address of the owner.\n    /// @param id The id of the token.\n    /// @return amount The balance of the token.\n    function balanceOf(address owner, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Spender allowance of an id.\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @return amount The allowance of the token.\n    function allowance(address owner, address spender, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Checks if a spender is approved by an owner as an operator\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @return approved The approval status.\n    function isOperator(address owner, address spender) external view returns (bool approved);\n\n    /// @notice Transfers an amount of an id from the caller to a receiver.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Transfers an amount of an id from a sender to a receiver.\n    /// @param sender The address of the sender.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Approves an amount of an id to a spender.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always\n    function approve(address spender, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Sets or removes an operator for the caller.\n    /// @param operator The address of the operator.\n    /// @param approved The approval status.\n    /// @return bool True, always\n    function setOperator(address operator, bool approved) external returns (bool);\n}\n"},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for the callback executed when an address unlocks the pool manager\ninterface IUnlockCallback {\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    /// @param data The data that was passed to the call to unlock\n    /// @return Any data that you want to be returned from the unlock call\n    function unlockCallback(bytes calldata data) external returns (bytes memory);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.24;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n    error ERC5267ExtensionsNotSupported();\n\n    /**\n     * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n     * `0x45` (`personal_sign` messages).\n     *\n     * The digest is calculated by prefixing a bytes32 `messageHash` with\n     * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n     * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n     *\n     * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n     * keccak256, although any bytes32 value can be safely used because the final digest will\n     * be re-hashed.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n        assembly (\"memory-safe\") {\n            mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n        }\n    }\n\n    /**\n     * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n     * `0x45` (`personal_sign` messages).\n     *\n     * The digest is calculated by prefixing an arbitrary `message` with\n     * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n     * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n        return\n            keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n    }\n\n    /**\n     * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n     * `0x00` (data with intended validator).\n     *\n     * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n     * `validator` address. Then hashing the result.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n    }\n\n    /**\n     * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n     */\n    function toDataWithIntendedValidatorHash(\n        address validator,\n        bytes32 messageHash\n    ) internal pure returns (bytes32 digest) {\n        assembly (\"memory-safe\") {\n            mstore(0x00, hex\"19_00\")\n            mstore(0x02, shl(96, validator))\n            mstore(0x16, messageHash)\n            digest := keccak256(0x00, 0x36)\n        }\n    }\n\n    /**\n     * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n     *\n     * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n     * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n     *\n     * See {ECDSA-recover}.\n     */\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            mstore(ptr, hex\"19_01\")\n            mstore(add(ptr, 0x02), domainSeparator)\n            mstore(add(ptr, 0x22), structHash)\n            digest := keccak256(ptr, 0x42)\n        }\n    }\n\n    /**\n     * @dev Returns the EIP-712 domain separator constructed from an `eip712Domain`. See {IERC5267-eip712Domain}\n     *\n     * This function dynamically constructs the domain separator based on which fields are present in the\n     * `fields` parameter. It contains flags that indicate which domain fields are present:\n     *\n     * * Bit 0 (0x01): name\n     * * Bit 1 (0x02): version\n     * * Bit 2 (0x04): chainId\n     * * Bit 3 (0x08): verifyingContract\n     * * Bit 4 (0x10): salt\n     *\n     * Arguments that correspond to fields which are not present in `fields` are ignored. For example, if `fields` is\n     * `0x0f` (`0b01111`), then the `salt` parameter is ignored.\n     */\n    function toDomainSeparator(\n        bytes1 fields,\n        string memory name,\n        string memory version,\n        uint256 chainId,\n        address verifyingContract,\n        bytes32 salt\n    ) internal pure returns (bytes32 hash) {\n        return\n            toDomainSeparator(\n                fields,\n                keccak256(bytes(name)),\n                keccak256(bytes(version)),\n                chainId,\n                verifyingContract,\n                salt\n            );\n    }\n\n    /// @dev Variant of {toDomainSeparator-bytes1-string-string-uint256-address-bytes32} that uses hashed name and version.\n    function toDomainSeparator(\n        bytes1 fields,\n        bytes32 nameHash,\n        bytes32 versionHash,\n        uint256 chainId,\n        address verifyingContract,\n        bytes32 salt\n    ) internal pure returns (bytes32 hash) {\n        bytes32 domainTypeHash = toDomainTypeHash(fields);\n\n        assembly (\"memory-safe\") {\n            // align fields to the right for easy processing\n            fields := shr(248, fields)\n\n            // FMP used as scratch space\n            let fmp := mload(0x40)\n            mstore(fmp, domainTypeHash)\n\n            let ptr := add(fmp, 0x20)\n            if and(fields, 0x01) {\n                mstore(ptr, nameHash)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x02) {\n                mstore(ptr, versionHash)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x04) {\n                mstore(ptr, chainId)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x08) {\n                mstore(ptr, verifyingContract)\n                ptr := add(ptr, 0x20)\n            }\n            if and(fields, 0x10) {\n                mstore(ptr, salt)\n                ptr := add(ptr, 0x20)\n            }\n\n            hash := keccak256(fmp, sub(ptr, fmp))\n        }\n    }\n\n    /// @dev Builds an EIP-712 domain type hash depending on the `fields` provided, following https://eips.ethereum.org/EIPS/eip-5267[ERC-5267]\n    function toDomainTypeHash(bytes1 fields) internal pure returns (bytes32 hash) {\n        if (fields & 0x20 == 0x20) revert ERC5267ExtensionsNotSupported();\n\n        assembly (\"memory-safe\") {\n            // align fields to the right for easy processing\n            fields := shr(248, fields)\n\n            // FMP used as scratch space\n            let fmp := mload(0x40)\n            mstore(fmp, \"EIP712Domain(\")\n\n            let ptr := add(fmp, 0x0d)\n            // name field\n            if and(fields, 0x01) {\n                mstore(ptr, \"string name,\")\n                ptr := add(ptr, 0x0c)\n            }\n            // version field\n            if and(fields, 0x02) {\n                mstore(ptr, \"string version,\")\n                ptr := add(ptr, 0x0f)\n            }\n            // chainId field\n            if and(fields, 0x04) {\n                mstore(ptr, \"uint256 chainId,\")\n                ptr := add(ptr, 0x10)\n            }\n            // verifyingContract field\n            if and(fields, 0x08) {\n                mstore(ptr, \"address verifyingContract,\")\n                ptr := add(ptr, 0x1a)\n            }\n            // salt field\n            if and(fields, 0x10) {\n                mstore(ptr, \"bytes32 salt,\")\n                ptr := add(ptr, 0x0d)\n            }\n            // if any field is enabled, remove the trailing comma\n            ptr := sub(ptr, iszero(iszero(and(fields, 0x1f))))\n            // add the closing brace\n            mstore8(ptr, 0x29) // add closing brace\n            ptr := add(ptr, 1)\n\n            hash := keccak256(fmp, sub(ptr, fmp))\n        }\n    }\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"}},"language":"Solidity","settings":{"viaIR":true,"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"runs":200,"enabled":true},"evmVersion":"cancun","remappings":["@openzeppelin/contracts-upgradeable/=../../../lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=../../../lib/openzeppelin-contracts/contracts/","@uniswap/v4-core/=../../../lib/v4-periphery/lib/v4-core/","@uniswap/v4-periphery/=../../../lib/v4-periphery/","forge-std/=../../../lib/forge-std/src/","permit2/=../../../lib/v4-periphery/lib/permit2/","solmate/=../../../lib/v4-periphery/lib/v4-core/lib/solmate/"]}},"stdJsonOutput":{"sources":{"src/ProtectedHook.sol":{"id":73},"src/ClausFeeBudget.sol":{"id":72},"src/legacy/FeeMath.sol":{"id":81},"src/legacy/ClausArt.sol":{"id":76},"src/legacy/ClausNFT.sol":{"id":77},"src/legacy/FeeCalls.sol":{"id":79},"src/legacy/HookBase.sol":{"id":86},"src/legacy/ArenaTide.sol":{"id":75},"src/legacy/FeeNftHook.sol":{"id":82},"src/legacy/IMDWeather.sol":{"id":87},"src/legacy/NftRewards.sol":{"id":91},"src/TradeExtensionHost.sol":{"id":74},"src/legacy/FomoReserve.sol":{"id":85},"src/legacy/FeeProcessor.sol":{"id":84},"src/legacy/PoolCapSource.sol":{"id":93},"src/legacy/ProjectRevenue.sol":{"id":94},"src/legacy/ClausNftStaking.sol":{"id":78},"src/legacy/MarketCapOracle.sol":{"id":90},"src/legacy/PlatformRevenue.sol":{"id":92},"src/legacy/FeeEfficientHook.sol":{"id":80},"src/legacy/LiquidityReserve.sol":{"id":88},"src/legacy/FeePredictionHook.sol":{"id":83},"src/legacy/LpRemainderProcessor.sol":{"id":89},"src/legacy/privacy/IPrivacyPool.sol":{"id":100},"src/legacy/privacy/FeePrivacyHook.sol":{"id":99},"src/legacy/privacy/ClausPrivacyBuy.sol":{"id":95},"src/legacy/privacy/FeeLpRewardsHook.sol":{"id":97},"src/legacy/privacy/FeeNftStakingHook.sol":{"id":98},"src/legacy/privacy/FeeBatchedPrivacyHook.sol":{"id":96},"../../../lib/v4-periphery/src/libraries/Actions.sol":{"id":69},"../../../lib/v4-periphery/src/interfaces/INotifier.sol":{"id":63},"../../../lib/v4-periphery/src/interfaces/IEIP712_v4.sol":{"id":59},"../../../lib/v4-periphery/src/interfaces/ISubscriber.sol":{"id":67},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolId.sol":{"id":56},"../../../lib/v4-periphery/src/interfaces/IMulticall_v4.sol":{"id":62},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolKey.sol":{"id":57},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Lock.sol":{"id":44},"../../../lib/v4-periphery/lib/v4-core/src/types/Currency.sol":{"id":55},"../../../lib/v4-periphery/src/interfaces/IImmutableState.sol":{"id":61},"../../../lib/v4-periphery/src/interfaces/IUnorderedNonce.sol":{"id":68},"../../../lib/v4-periphery/src/libraries/LiquidityAmounts.sol":{"id":70},"../../../lib/openzeppelin-contracts/contracts/utils/Bytes.sol":{"id":13},"../../../lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"id":15},"../../../lib/v4-periphery/src/interfaces/IERC721Permit_v4.sol":{"id":60},"../../../lib/v4-periphery/src/interfaces/IPositionManager.sol":{"id":66},"../../../lib/openzeppelin-contracts/contracts/utils/Base64.sol":{"id":12},"../../../lib/v4-periphery/src/interfaces/IPermit2Forwarder.sol":{"id":64},"../../../lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":14},"../../../lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"id":18},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IHooks.sol":{"id":30},"../../../lib/v4-periphery/lib/v4-core/src/libraries/BitMath.sol":{"id":36},"../../../lib/v4-periphery/src/libraries/PositionInfoLibrary.sol":{"id":71},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sol":{"id":27},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FullMath.sol":{"id":41},"../../../lib/v4-periphery/lib/v4-core/src/libraries/Position.sol":{"id":46},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SafeCast.sol":{"id":47},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TickMath.sol":{"id":50},"../../../lib/v4-periphery/lib/v4-core/src/types/BalanceDelta.sol":{"id":53},"../../../lib/v4-periphery/src/interfaces/IPoolInitializer_v4.sol":{"id":65},"../../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"id":23},"../../../lib/v4-periphery/lib/v4-core/src/types/PoolOperation.sol":{"id":58},"src/legacy/vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol":{"id":104},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExtsload.sol":{"id":28},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExttload.sol":{"id":29},"../../../lib/v4-periphery/lib/v4-core/src/libraries/UnsafeMath.sol":{"id":52},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":2},"../../../lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"id":17},"../../../lib/v4-periphery/lib/v4-core/src/types/BeforeSwapDelta.sol":{"id":54},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":1},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":4},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CustomRevert.sol":{"id":38},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint96.sol":{"id":40},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LPFeeLibrary.sol":{"id":42},"../../../lib/v4-periphery/lib/v4-core/src/libraries/StateLibrary.sol":{"id":49},"src/legacy/vendor/chainlink/shared/interfaces/LinkTokenInterface.sol":{"id":101},"src/legacy/vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol":{"id":102},"src/legacy/vendor/chainlink/vrf/dev/interfaces/IVRFV2PlusWrapper.sol":{"id":103},"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":0},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol":{"id":7},"../../../lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"id":24},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IPoolManager.sol":{"id":31},"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint128.sol":{"id":39},"../../../lib/v4-periphery/lib/v4-core/src/libraries/LiquidityMath.sol":{"id":43},"../../../lib/v4-periphery/lib/v4-core/src/libraries/SqrtPriceMath.sol":{"id":48},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"id":8},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IProtocolFees.sol":{"id":32},"../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"id":16},"../../../lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"id":25},"../../../lib/v4-periphery/lib/v4-core/src/libraries/CurrencyReserves.sol":{"id":37},"../../../lib/v4-periphery/lib/v4-core/src/libraries/NonzeroDeltaCount.sol":{"id":45},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"id":19},"../../../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"id":3},"../../../lib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sol":{"id":26},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"id":21},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":6},"../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":22},"../../../lib/v4-periphery/lib/v4-core/src/libraries/TransientStateLibrary.sol":{"id":51},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol":{"id":9},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"id":34},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol":{"id":11},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"id":35},"../../../lib/v4-periphery/lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"id":33},"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"id":20},"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":5},"../../../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"id":10}},"contracts":{"src/ProtectedHook.sol":{"ProtectedHook":{"abi":[{"type":"constructor","inputs":[{"name":"base","type":"tuple","components":[{"name":"manager","type":"address","internalType":"contract IPoolManager"},{"name":"project","type":"address","internalType":"contract ProjectRevenue"},{"name":"platform","type":"address","internalType":"contract PlatformRevenue"},{"name":"reserve","type":"address","internalType":"contract LiquidityReserve"},{"name":"feed","type":"address","internalType":"contract IEthUsdFeed"},{"name":"fomo","type":"address","internalType":"contract FomoReserve"},{"name":"attester","type":"address","internalType":"address"},{"name":"questionHash","type":"bytes32","internalType":"bytes32"},{"name":"processor","type":"address","internalType":"contract FeeProcessor"},{"name":"nft","type":"address","internalType":"contract ClausNFT"},{"name":"oracle","type":"address","internalType":"contract MarketCapOracle"},{"name":"spacing","type":"int24","internalType":"int24"}],"internalType":"struct FeePrivacyHook.BaseConfig"},{"name":"privacyBuy_","type":"address","internalType":"contract ClausPrivacyBuy"},{"name":"lpRewards_","type":"address","internalType":"contract IClausLpRewards"},{"name":"remainder_","type":"address","internalType":"contract LpRemainderProcessor"},{"name":"staking_","type":"address","internalType":"contract ClausNftStaking"},{"name":"extensions_","type":"address","internalType":"contract TradeExtensionHost"}],"stateMutability":"nonpayable"},{"name":"BatchOutputTooLow","type":"error","inputs":[]},{"name":"ECDSAInvalidSignature","type":"error","inputs":[]},{"name":"ECDSAInvalidSignatureLength","type":"error","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"name":"ECDSAInvalidSignatureS","type":"error","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"InsufficientBuybackGas","type":"error","inputs":[]},{"name":"InsufficientObservationGas","type":"error","inputs":[]},{"name":"InvalidActivation","type":"error","inputs":[]},{"name":"InvalidBatch","type":"error","inputs":[]},{"name":"InvalidBoostActivation","type":"error","inputs":[]},{"name":"InvalidContext","type":"error","inputs":[]},{"name":"InvalidFeeClaim","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"InvalidLpRewards","type":"error","inputs":[]},{"name":"InvalidNftStaking","type":"error","inputs":[]},{"name":"InvalidPool","type":"error","inputs":[]},{"name":"InvalidPoolManager","type":"error","inputs":[]},{"name":"InvalidProcessing","type":"error","inputs":[]},{"name":"InvalidRemainderProcessor","type":"error","inputs":[]},{"name":"InvalidWeather","type":"error","inputs":[]},{"name":"InvalidWeatherSigner","type":"error","inputs":[]},{"name":"NotFeeRecipient","type":"error","inputs":[]},{"name":"NotPoolManager","type":"error","inputs":[]},{"name":"OldWeather","type":"error","inputs":[]},{"name":"OnlySelf","type":"error","inputs":[]},{"name":"PartialNativeFill","type":"error","inputs":[]},{"name":"PartialTokenOutput","type":"error","inputs":[]},{"name":"PrivacyBuyRetired","type":"error","inputs":[]},{"name":"TotalTaxExceeded","type":"error","inputs":[]},{"name":"ArenaPulse","type":"event","inputs":[{"name":"sequence","type":"uint64","indexed":true,"internalType":"uint64"},{"name":"timestamp","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"BuybackBatchProcessed","type":"event","inputs":[{"name":"spentEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"receivedTokens","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BuybackBurn","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"spentEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burnedTokens","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pendingEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BuybackDeferred","type":"event","inputs":[],"anonymous":false},{"name":"FeeAllocation","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"projectEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"platformEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FomoBuyback","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"spentEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"sentTokens","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pendingEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FomoFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"fomoEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LiquidityAdded","type":"event","inputs":[{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"ethAdded","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"tokensAdded","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"buyEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LiquidityFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"liquidityEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LpRewardFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"rewardEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"epoch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NftFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"nftEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"epoch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NftStakingFeeAccrued","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"rewardEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"epoch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PlatformFeeAllocation","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"canonicalEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"additionalEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ProjectFeeAccrued","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"exactInput","type":"bool","indexed":false,"internalType":"bool"},{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ProjectFeeSplit","type":"event","inputs":[{"name":"grossEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"walletEth","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burnEth","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ProjectFeesClaimed","type":"event","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RewardBoostActivated","type":"event","inputs":[{"name":"startsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"endsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"multiplier","type":"uint24","indexed":false,"internalType":"uint24"}],"anonymous":false},{"name":"TimedBuybackActivated","type":"event","inputs":[{"name":"startsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"endsAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"windowSeconds","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"WeatherAccepted","type":"event","inputs":[{"name":"requestId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"wet","type":"bool","indexed":false,"internalType":"bool"},{"name":"observedAt","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"validUntil","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"ARENA_PULSE_INTERVAL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"BATCH_USD","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"BURN_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"pure"},{"name":"BUYBACK_GAS_LIMIT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FOMO_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"pure"},{"name":"LIQUIDITY_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"LP_REWARDS_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"NFT_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"OBSERVATION_GAS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REWARD_BOOST_DURATION","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"WALLET_FEE_PIPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"WEATHER_MAX_AGE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"WINDOW","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activateRewardBoost","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"activateTimedBuyback","type":"function","inputs":[],"outputs":[],"stateMutability":"pure"},{"name":"afterAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"uint160","internalType":"uint160"},{"name":"","type":"int24","internalType":"int24"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"int256","internalType":"BalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct SwapParams"},{"name":"delta","type":"int256","internalType":"BalanceDelta"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int128","internalType":"int128"}],"stateMutability":"nonpayable"},{"name":"arenaState","type":"function","inputs":[],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"},{"name":"lastPulseAt","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"batchBuybacksEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"batchThresholdWei","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"beforeAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeInitialize","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"price","type":"uint160","internalType":"uint160"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct ModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","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"}],"internalType":"struct PoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct SwapParams"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BeforeSwapDelta"},{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"nonpayable"},{"name":"collectProjectFees","type":"function","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"ethUsdFeed","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEthUsdFeed"}],"stateMutability":"view"},{"name":"extensions","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract TradeExtensionHost"}],"stateMutability":"view"},{"name":"feeRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"fomoRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"fomoReserve","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract FomoReserve"}],"stateMutability":"view"},{"name":"implementationSelf","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"initializer","type":"address","internalType":"address"},{"name":"token","type":"address","internalType":"address"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"openingPrice","type":"uint160","internalType":"uint160"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"liquidityBatchReady","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"liquidityReserve","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract LiquidityReserve"}],"stateMutability":"view"},{"name":"lpRemainderProcessor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract LpRemainderProcessor"}],"stateMutability":"view"},{"name":"lpRewards","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IClausLpRewards"}],"stateMutability":"view"},{"name":"maximumTotalTaxPips","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"pure"},{"name":"nft","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ClausNFT"}],"stateMutability":"view"},{"name":"nftStaking","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ClausNftStaking"}],"stateMutability":"view"},{"name":"nftStakingStartsAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingBurnEth","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingFomoEth","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingLiquidityEth","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingLiquidityTokens","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"platformRevenue","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract PlatformRevenue"}],"stateMutability":"view"},{"name":"poolManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPoolManager"}],"stateMutability":"view"},{"name":"predictionOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract MarketCapOracle"}],"stateMutability":"view"},{"name":"privacyBuy","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ClausPrivacyBuy"}],"stateMutability":"view"},{"name":"processBuybacks","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"processBuybacksDuringSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"processBuybacksGuarded","type":"function","inputs":[{"name":"minimumTokensPerEth","type":"uint256","internalType":"uint256"},{"name":"maximumPendingEth","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"spentEth","type":"uint256","internalType":"uint256"},{"name":"receivedTokens","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"processLiquidity","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"processLiquidityDuringSwap","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"processLiquidityRemainder","type":"function","inputs":[{"name":"minLiquidity","type":"uint128","internalType":"uint128"},{"name":"maximumEth","type":"uint256","internalType":"uint256"},{"name":"maximumTokens","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"liquidity","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"processor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract FeeProcessor"}],"stateMutability":"view"},{"name":"projectFeeBalance","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"projectRevenue","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ProjectRevenue"}],"stateMutability":"view"},{"name":"protectionKind","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"name":"protectionVersion","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"quoteTradeFee","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"buy","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"module","type":"address","internalType":"address"},{"name":"totalPips","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"rewardBoostState","type":"function","inputs":[],"outputs":[{"name":"startsAt","type":"uint64","internalType":"uint64"},{"name":"endsAt","type":"uint64","internalType":"uint64"},{"name":"active","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"rewardMultiplier","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"submitWeather","type":"function","inputs":[{"name":"a","type":"tuple","components":[{"name":"requestId","type":"bytes32","internalType":"bytes32"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"questionHash","type":"bytes32","internalType":"bytes32"},{"name":"answerType","type":"uint8","internalType":"uint8"},{"name":"answer","type":"bytes","internalType":"bytes"},{"name":"figure","type":"uint256","internalType":"uint256"},{"name":"fromBlock","type":"uint64","internalType":"uint64"},{"name":"toBlock","type":"uint64","internalType":"uint64"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"panelJobId","type":"bytes32","internalType":"bytes32"},{"name":"panelSize","type":"uint16","internalType":"uint16"},{"name":"quorum","type":"uint16","internalType":"uint16"},{"name":"agreed","type":"uint16","internalType":"uint16"},{"name":"issuedAt","type":"uint64","internalType":"uint64"},{"name":"expiresAt","type":"uint64","internalType":"uint64"}],"internalType":"struct IMDWeather.Attestation"},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"timedBuybackState","type":"function","inputs":[],"outputs":[{"name":"startsAt","type":"uint64","internalType":"uint64"},{"name":"endsAt","type":"uint64","internalType":"uint64"},{"name":"active","type":"bool","internalType":"bool"},{"name":"availableEth","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalHookFeePips","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"unlockCallback","type":"function","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"weatherAllocationEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"weatherAttester","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"weatherBurnFeePips","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"weatherDigest","type":"function","inputs":[{"name":"a","type":"tuple","components":[{"name":"requestId","type":"bytes32","internalType":"bytes32"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"questionHash","type":"bytes32","internalType":"bytes32"},{"name":"answerType","type":"uint8","internalType":"uint8"},{"name":"answer","type":"bytes","internalType":"bytes"},{"name":"figure","type":"uint256","internalType":"uint256"},{"name":"fromBlock","type":"uint64","internalType":"uint64"},{"name":"toBlock","type":"uint64","internalType":"uint64"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"panelJobId","type":"bytes32","internalType":"bytes32"},{"name":"panelSize","type":"uint16","internalType":"uint16"},{"name":"quorum","type":"uint16","internalType":"uint16"},{"name":"agreed","type":"uint16","internalType":"uint16"},{"name":"issuedAt","type":"uint64","internalType":"uint64"},{"name":"expiresAt","type":"uint64","internalType":"uint64"}],"internalType":"struct IMDWeather.Attestation"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"weatherQuestionHash","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"weatherState","type":"function","inputs":[],"outputs":[{"name":"mode","type":"uint8","internalType":"uint8"},{"name":"observedAt","type":"uint64","internalType":"uint64"},{"name":"validUntil","type":"uint64","internalType":"uint64"},{"name":"requestId","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"contract ProjectRevenue\",\"name\":\"project\",\"type\":\"address\"},{\"internalType\":\"contract PlatformRevenue\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"contract LiquidityReserve\",\"name\":\"reserve\",\"type\":\"address\"},{\"internalType\":\"contract IEthUsdFeed\",\"name\":\"feed\",\"type\":\"address\"},{\"internalType\":\"contract FomoReserve\",\"name\":\"fomo\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"questionHash\",\"type\":\"bytes32\"},{\"internalType\":\"contract FeeProcessor\",\"name\":\"processor\",\"type\":\"address\"},{\"internalType\":\"contract ClausNFT\",\"name\":\"nft\",\"type\":\"address\"},{\"internalType\":\"contract MarketCapOracle\",\"name\":\"oracle\",\"type\":\"address\"},{\"internalType\":\"int24\",\"name\":\"spacing\",\"type\":\"int24\"}],\"internalType\":\"struct FeePrivacyHook.BaseConfig\",\"name\":\"base\",\"type\":\"tuple\"},{\"internalType\":\"contract ClausPrivacyBuy\",\"name\":\"privacyBuy_\",\"type\":\"address\"},{\"internalType\":\"contract IClausLpRewards\",\"name\":\"lpRewards_\",\"type\":\"address\"},{\"internalType\":\"contract LpRemainderProcessor\",\"name\":\"remainder_\",\"type\":\"address\"},{\"internalType\":\"contract ClausNftStaking\",\"name\":\"staking_\",\"type\":\"address\"},{\"internalType\":\"contract TradeExtensionHost\",\"name\":\"extensions_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BatchOutputTooLow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBuybackGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientObservationGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidActivation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBoostActivation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidContext\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidFeeClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLpRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNftStaking\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPoolManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProcessing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRemainderProcessor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWeather\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWeatherSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFeeRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPoolManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldWeather\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PartialNativeFill\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PartialTokenOutput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrivacyBuyRetired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TotalTaxExceeded\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"ArenaPulse\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spentEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"receivedTokens\",\"type\":\"uint256\"}],\"name\":\"BuybackBatchProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spentEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"burnedTokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pendingEth\",\"type\":\"uint256\"}],\"name\":\"BuybackBurn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BuybackDeferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"projectEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"platformEth\",\"type\":\"uint256\"}],\"name\":\"FeeAllocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spentEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sentTokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pendingEth\",\"type\":\"uint256\"}],\"name\":\"FomoBuyback\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fomoEth\",\"type\":\"uint256\"}],\"name\":\"FomoFeeAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ethAdded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensAdded\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"buyEth\",\"type\":\"uint256\"}],\"name\":\"LiquidityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityEth\",\"type\":\"uint256\"}],\"name\":\"LiquidityFeeAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"LpRewardFeeAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nftEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"NftFeeAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"NftStakingFeeAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"canonicalEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"additionalEth\",\"type\":\"uint256\"}],\"name\":\"PlatformFeeAllocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"exactInput\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeEth\",\"type\":\"uint256\"}],\"name\":\"ProjectFeeAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"grossEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"walletEth\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"burnEth\",\"type\":\"uint256\"}],\"name\":\"ProjectFeeSplit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProjectFeesClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startsAt\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endsAt\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"multiplier\",\"type\":\"uint24\"}],\"name\":\"RewardBoostActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startsAt\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endsAt\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"windowSeconds\",\"type\":\"uint256\"}],\"name\":\"TimedBuybackActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"wet\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"observedAt\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validUntil\",\"type\":\"uint64\"}],\"name\":\"WeatherAccepted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ARENA_PULSE_INTERVAL\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BATCH_USD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURN_FEE_PIPS\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BUYBACK_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DURATION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FOMO_FEE_PIPS\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LIQUIDITY_FEE_PIPS\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LP_REWARDS_FEE_PIPS\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NFT_FEE_PIPS\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OBSERVATION_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_BOOST_DURATION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WALLET_FEE_PIPS\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WEATHER_MAX_AGE\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateRewardBoost\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateTimedBuyback\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct ModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"BalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"BalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"afterAddLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BalanceDelta\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"afterDonate\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"},{\"internalType\":\"int24\",\"name\":\"\",\"type\":\"int24\"}],\"name\":\"afterInitialize\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct ModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"BalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"BalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"afterRemoveLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BalanceDelta\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"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\":\"key\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"}],\"internalType\":\"struct SwapParams\",\"name\":\"params\",\"type\":\"tuple\"},{\"internalType\":\"BalanceDelta\",\"name\":\"delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"hookData\",\"type\":\"bytes\"}],\"name\":\"afterSwap\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"int128\",\"name\":\"\",\"type\":\"int128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"arenaState\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastPulseAt\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchBuybacksEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchThresholdWei\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct ModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeAddLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeDonate\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"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\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint160\",\"name\":\"price\",\"type\":\"uint160\"}],\"name\":\"beforeInitialize\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"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\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct ModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeRemoveLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"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\":\"key\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"}],\"internalType\":\"struct SwapParams\",\"name\":\"params\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"hookData\",\"type\":\"bytes\"}],\"name\":\"beforeSwap\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BeforeSwapDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"collectProjectFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ethUsdFeed\",\"outputs\":[{\"internalType\":\"contract IEthUsdFeed\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extensions\",\"outputs\":[{\"internalType\":\"contract TradeExtensionHost\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fomoRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fomoReserve\",\"outputs\":[{\"internalType\":\"contract FomoReserve\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementationSelf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initializer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"uint160\",\"name\":\"openingPrice\",\"type\":\"uint160\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityBatchReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityReserve\",\"outputs\":[{\"internalType\":\"contract LiquidityReserve\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lpRemainderProcessor\",\"outputs\":[{\"internalType\":\"contract LpRemainderProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lpRewards\",\"outputs\":[{\"internalType\":\"contract IClausLpRewards\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maximumTotalTaxPips\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nft\",\"outputs\":[{\"internalType\":\"contract ClausNFT\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nftStaking\",\"outputs\":[{\"internalType\":\"contract ClausNftStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nftStakingStartsAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingBurnEth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingFomoEth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingLiquidityEth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingLiquidityTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"platformRevenue\",\"outputs\":[{\"internalType\":\"contract PlatformRevenue\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolManager\",\"outputs\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"predictionOracle\",\"outputs\":[{\"internalType\":\"contract MarketCapOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"privacyBuy\",\"outputs\":[{\"internalType\":\"contract ClausPrivacyBuy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processBuybacks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"processBuybacksDuringSwap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minimumTokensPerEth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumPendingEth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"processBuybacksGuarded\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"spentEth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"receivedTokens\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processLiquidityDuringSwap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"minLiquidity\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"maximumEth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"processLiquidityRemainder\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processor\",\"outputs\":[{\"internalType\":\"contract FeeProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectFeeBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectRevenue\",\"outputs\":[{\"internalType\":\"contract ProjectRevenue\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"protectionKind\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"protectionVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"buy\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"quoteTradeFee\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"totalPips\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardBoostState\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"startsAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endsAt\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardMultiplier\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"questionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"answerType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"answer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"figure\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"fromBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"toBlock\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"panelJobId\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"panelSize\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"quorum\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"agreed\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expiresAt\",\"type\":\"uint64\"}],\"internalType\":\"struct IMDWeather.Attestation\",\"name\":\"a\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"submitWeather\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timedBuybackState\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"startsAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endsAt\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"availableEth\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalHookFeePips\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"unlockCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weatherAllocationEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weatherAttester\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weatherBurnFeePips\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"questionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"answerType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"answer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"figure\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"fromBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"toBlock\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"panelJobId\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"panelSize\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"quorum\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"agreed\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expiresAt\",\"type\":\"uint64\"}],\"internalType\":\"struct IMDWeather.Attestation\",\"name\":\"a\",\"type\":\"tuple\"}],\"name\":\"weatherDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weatherQuestionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weatherState\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"observedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"validUntil\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"requestId\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"Final inherited accounting kernel. No arbitrary or replaceable delegate target.\",\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature is invalid.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}]},\"kind\":\"dev\",\"methods\":{\"activateRewardBoost()\":{\"details\":\"Retains the historical ABI and one-shot namespace; history no longer sets any allocation.\"},\"processBuybacksGuarded(uint256,uint256,uint256)\":{\"details\":\"Minimum tokens per ETH spent protects partial batches and newly accrued fees proportionally.\"},\"processLiquidityRemainder(uint128,uint256,uint256,uint256)\":{\"details\":\"Only the original position owner may choose the short-lived minimum and reserve caps.\"},\"weatherState()\":{\"returns\":{\"mode\":\"0 = fallback, 1 = dry, 2 = rain.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"processBuybacksGuarded(uint256,uint256,uint256)\":{\"notice\":\"Anyone may pay gas, but cannot select recipients, change allocations or withdraw funds.\"},\"processLiquidity()\":{\"notice\":\"Fixed-destination processing; callers cannot withdraw or redirect reserves.\"},\"processLiquidityRemainder(uint128,uint256,uint256,uint256)\":{\"notice\":\"Finish old auto-LP reserves into their original position, even below its old batch threshold.\"},\"quoteTradeFee(address,bool,int256,bytes)\":{\"notice\":\"Quote depends on the current program and trade data; default rate alone is not a quote.\"},\"submitWeather((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\":{\"notice\":\"Anyone may relay a valid answer for this exact consumer and question.\"},\"timedBuybackState()\":{\"notice\":\"Linear release of the reserve over eight hours from the latest fee top-up. New fees extend the unvested stream; skipped batches keep their vested allowance. After twelve hours the previous ordinary processor resumes automatically.\"}},\"notice\":\"Protected settlement core with replaceable fee and product programs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ProtectedHook.sol\":\"ProtectedHook\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=../../../lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=../../../lib/openzeppelin-contracts/contracts/\",\":@uniswap/v4-core/=../../../lib/v4-periphery/lib/v4-core/\",\":@uniswap/v4-periphery/=../../../lib/v4-periphery/\",\":forge-std/=../../../lib/forge-std/src/\",\":permit2/=../../../lib/v4-periphery/lib/permit2/\",\":solmate/=../../../lib/v4-periphery/lib/v4-core/lib/solmate/\"],\"viaIR\":true},\"sources\":{\"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"../../../lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"../../../lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c\",\"dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e\",\"dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0\",\"dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0xf6bb0dc431a9c50e25756412ec14cfcd4dc61dd40b8dc0e1b58ec09fce6d5564\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eb87fef7e8ed754b8600cd5d42e4f23128059006368ffd19e4d50cc166471ee5\",\"dweb:/ipfs/Qmc1vy1cevKreGUsG7S79gyhNvDtPnNz9qG47eYVHmMKLs\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0xf78f05f3b8c9f75570e85300d7b4600d7f6f6a198449273f31d44c1641adb46f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e28b872613b45e0e801d4995aa4380be2531147bfe2d85c1d6275f1de514fba3\",\"dweb:/ipfs/QmeeFcfShHYaS3BdgVj78nxR28ZaVUwbvr66ud8bT6kzw9\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0x88cd5e3bee2e8c36b8d9058fbcaa81ad5704281b25634122234b55ea853d8055\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8dc7e7ab5b8ea36c15027ab04221b05d1c970f47a53e9fd47ead8ca665d49c7e\",\"dweb:/ipfs/Qmeeph7fsDyfRr8vb2L8KcDEmKPb224TAayMvgqgGAnqpL\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"keccak256\":\"0xf46268c37522320bb2119a5a394bc5c739a95c0c574c8d08e8c643f4d06e5c76\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://517e4b295f35b9947c72ad7379a6089439ece7bb6f4a2ea0a159da13046c039e\",\"dweb:/ipfs/QmZXzkSfLUbvujig3zVbpDHykpHhqLpvQtdiN3B5j4TA3u\"]},\"../../../lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol\":{\"keccak256\":\"0xc7efbc23214ad7dced8bf2249460f4bda114d57f6a0079f84040654280f455bd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1f5bd44efca8c8c0d74439e7b808d1f9c4af1df78f91fef8e8bbca8104645435\",\"dweb:/ipfs/Qmb42XSd8MKsEitp42sZkSFGqDRigk6QgGXtiJyJqUZJJ6\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/Base64.sol\":{\"keccak256\":\"0xe802369c4d2d254590d371eca16c8d247d7e0782ad2faaaa0180159ea8e736af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3afb5bedd76d842847c730499c3acc9c28e91ac981bb95467671118ec0c7cdc8\",\"dweb:/ipfs/QmWzjmjvZPJEvNTiN22V3E9hQ2JnGeZgYfhFjqGMPMcSNH\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/Bytes.sol\":{\"keccak256\":\"0xf80e4b96b6849936ea0fabd76cf81b13d7276295fddb1e1c07afb3ddf650b0ac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6430007255ac11c6e9c4331a418f3af52ff66fbbae959f645301d025b20aeb08\",\"dweb:/ipfs/QmQE5fjmBBRw9ndnzJuC2uskYss1gbaR7JdazoCf1FGoBj\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0xa516cbf1c7d15d3517c2d668601ce016c54395bf5171918a14e2686977465f53\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1e1d079e8edfb58efd23a311e315a4807b01b5d1cf153f8fa2d0608b9dec3e99\",\"dweb:/ipfs/QmTBExeX2SDTkn5xbk5ssbYSx7VqRp9H4Ux1CY4uQM4b9N\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0x1fdc2de9585ab0f1c417f02a873a2b6343cd64bb7ffec6b00ffa11a4a158d9e8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ab223a3d969c6cd7610049431dd42740960c477e45878f5d8b54411f7a32bdc\",\"dweb:/ipfs/QmWumhjvhpKcwx3vDPQninsNVTc3BGvqaihkQakFkQYpaS\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x6d8579873b9650426bfbd2a754092d1725049ca05e4e3c8c2c82dd9f3453129d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fa3127a8968d55096d37124a9e212013af112affa5e30b84a1d22263c31576c\",\"dweb:/ipfs/QmetxaVcn5Q6nkpF9yXzaxPQ7d3rgrhV13sTH9BgiuzGJL\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5\",\"dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9\",\"dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif\"]},\"../../../lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"../../../lib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"]},\"../../../lib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExtsload.sol\":{\"keccak256\":\"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1\",\"dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IExttload.sol\":{\"keccak256\":\"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8\",\"dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IHooks.sol\":{\"keccak256\":\"0xc131ffa2d04c10a012fe715fe2c115811526b7ea34285cf0a04ce7ce8320da8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3b212358897db5d99c21244d88f97b2e788527552cb430629b472a8cc6289aec\",\"dweb:/ipfs/QmQtwV4dDe2RYk2ErLpaAX7U82jWh1L6Lw2HRuKDvBi84G\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IPoolManager.sol\":{\"keccak256\":\"0xbdab3544da3d32dfdf7457baa94e17d5a3012952428559e013ffac45d067038e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce95ff864468e37c76adf71df061d4f3d6f3a5ec1f9bc3aea090463bc72798f4\",\"dweb:/ipfs/QmSbWh1pLbz51yQF4HEu5NRhr8XVv9JYGEw1hq1HudAnCi\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/IProtocolFees.sol\":{\"keccak256\":\"0x32a666e588a2f66334430357bb1e2424fe7eebeb98a3364b1dd16eb6ccca9848\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://85751d302125881f72e5f8af051c2d5d9b1f606ebaea8ca7d04fccdd27cc252d\",\"dweb:/ipfs/QmeRwomeh9NWm6A6fgNA4KZPQZHPpdKsPQyYsHSFmvud7J\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":{\"keccak256\":\"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b\",\"dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":{\"keccak256\":\"0xeccadf1bf69ba2eb51f2fe4fa511bc7bb05bbd6b9f9a3cb8e5d83d9582613e0f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://118757369892687b99ef46ce28d6861f62c098285bd7687a4f17f7e44e5f81de\",\"dweb:/ipfs/QmUxqbYqQtcEwwFbb9e6BBMePEaSgN8C45v6RKubD4ib8d\"]},\"../../../lib/v4-periphery/lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":{\"keccak256\":\"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f\",\"dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/BitMath.sol\":{\"keccak256\":\"0x51b9be4f5c4fd3e80cbc9631a65244a2eb2be250b6b7f128a2035080e18aee8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fe98bbd5498e912146b9319827fc63621eb66ff55d5baae0fa02a7a972ab8d1e\",\"dweb:/ipfs/QmY5hCuyrtgsJtk4AavrxcvBkRrChfr4N6ZnhdC8roPpNi\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/CurrencyReserves.sol\":{\"keccak256\":\"0x1576616129933fcdf3b684cea33cffd9c95e18fafbd2832a8c48ac3d8526d4c3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://33b050efb9b81803b18f562271e7cca2ec5362c4d505860d6419b4a345636725\",\"dweb:/ipfs/QmQtFtTwKZ5pFVGD2ENDUXvp7ECFvzqeCuJ1miJcUHdmiX\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/CustomRevert.sol\":{\"keccak256\":\"0x111ed3031b6990c80a93ae35dde6b6ac0b7e6af471388fdd7461e91edda9b7de\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c9ea883c98d6ae1829160d0977bb5195761cfd5bc81692d0a941f45717f594cd\",\"dweb:/ipfs/QmZPwxzaeMNv536wzrAMrMswu7vMHuqPVpjcqL3YvCMoxt\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint128.sol\":{\"keccak256\":\"0xad236e10853f4b4b20a35a9bb52b857c4fc79874846b7e444e06ead7f2630542\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0de1f9a06520b1a689660943faa14fc0b8344ab41fab9e6012ea34bff4b9b3eb\",\"dweb:/ipfs/QmRNMPTyko7W6d6KxuTsnDBa9oZgDK4xiwRRq3H9ASTbwy\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/FixedPoint96.sol\":{\"keccak256\":\"0xef5c3fd41aee26bb12aa1c32873cfee88e67eddfe7c2b32283786265ac669741\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4de298d02f662a1c36c7be0a150f18c2a161408a5d3e48432e707efd01fac9a4\",\"dweb:/ipfs/QmSiM4oeMmLVKmAtJXz2feYkv4R9ZcyBpkTRW5Nhw5KDyJ\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/FullMath.sol\":{\"keccak256\":\"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52\",\"dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/LPFeeLibrary.sol\":{\"keccak256\":\"0xbf6914e01014e7c1044111feb7df7a3d96bb503b3da827ad8464b1955580d13b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33823c20a91882c9aacdcbb02f0558c05209f4d5954aa6dd4fa17c95664db475\",\"dweb:/ipfs/QmR7owkFgpfztpp1QUg3ut3nw9iPVQqLGP4hzgmZtRUQ2J\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/LiquidityMath.sol\":{\"keccak256\":\"0x000ef2eadcc1eb7b2c18a77655f94e76e0e860f605783484657ef65fd6eda353\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a766b620a7a22798b43c6c1f23b5c6cff0ebf588deb89842bad05208d448cd99\",\"dweb:/ipfs/QmVKjaFJdzkqA3ey2Byum8iTCMssWVD8MmVC8rw62Tj5WD\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/Lock.sol\":{\"keccak256\":\"0x9338be4b5695f1da5f3d3f7a3eeaf7a356c1045458289586ac0cbe9cef77c6d5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://485ec42ed6155469d612a9a0c18068ebfbad74448792a338a435503de3ef1b2c\",\"dweb:/ipfs/QmVnnv5u74MYatfRmBgrcfFYQcsMAJMG9jQ6ju8UiydKNF\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/NonzeroDeltaCount.sol\":{\"keccak256\":\"0x0666ebd5d3528d7d52c48538296367a4cff97a578cf13365c51983fae3219b87\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://d27f1be3bd09d85c53d3e6a539dd6529ddd8b2b764ccb47fd7765fc81f9add59\",\"dweb:/ipfs/QmQdZujNXhKEXQBkKtF5jbdvo1yXMqPDUoBBaF9S5u3Kpm\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/Position.sol\":{\"keccak256\":\"0xddab2a831f1befb6abf5567e77c4582169ca8156cf69eb4f22d8e87f7226a3f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c79fe61b50f3b70cff503abfa6f5643fcbefb9b794855bee1019b1e6d9c083b2\",\"dweb:/ipfs/QmbKmYNQesaMz8bo1b7TMHQcAwaDd3eDPrE5pAdPPZTtk5\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/SafeCast.sol\":{\"keccak256\":\"0x42c4a24f996a14d358be397b71f7ec9d7daf666aaec78002c63315a6ee67aa86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3db86e2ba3679105fc32edec656c70282e1fede6cab11217702443f6c26fa59\",\"dweb:/ipfs/QmX4yaaSPdKQzYNRsezjTvZKsubzS8JRTEGFD3fPpTTCcj\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/SqrtPriceMath.sol\":{\"keccak256\":\"0xf8079fe6e3460db495451d06b1705e18f1c4075c1af96a31ad313545f7082982\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://582fc51546723a0a8acccf782f69b530bacf9b3ef929458e82569b7121f0b138\",\"dweb:/ipfs/QmSBXcmqZdFsM7M4sRaiyQAxykCeMNFKyKgBcwSMTw1bcF\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/StateLibrary.sol\":{\"keccak256\":\"0x96db333ee126a841dd959e38e452cc59d73583cb0437a1d48b2052e33a74f952\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8672bba1eb69608299b0904f4ff305238eb18479d371c26518f278c9ee184cd0\",\"dweb:/ipfs/QmTLu3s6ECvsEDHStQv8HTVHYtvkviBbdjPrFJd4SpVRFY\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/TickMath.sol\":{\"keccak256\":\"0x4e1a11e154eb06106cb1c4598f06cca5f5ca16eaa33494ba2f0e74981123eca8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a79a57f7b240783b045168d1c4f774ac1812caf8f9a83cb6959a86b0b07b6c70\",\"dweb:/ipfs/QmTb5kvxwDNW8jDuQaqdJ445cCFejNkUqEB17Bjo8UBiva\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/TransientStateLibrary.sol\":{\"keccak256\":\"0x7d1e0875747bd89b32c25f1a48da2766e5f4aff1f671ad5f3c0c07ebbbcb946a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d76cfeb1cb60595b41ecc51c8a12fb4bf63a7fc733d0b1a2e3adb55abeb1f9d5\",\"dweb:/ipfs/Qmb8oX7DtsRpw3tTtdWZwGhauj1evq43d3PLwe4nSDAKkV\"]},\"../../../lib/v4-periphery/lib/v4-core/src/libraries/UnsafeMath.sol\":{\"keccak256\":\"0xa6e55e0a43a15df2df471d9972cd48f613d07c663ecb8bbeaf7623f6f99bcce4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://02ea6e13879fc5a5f35149a2f1cd8af3a1f0877ff69101dad53841d16f515572\",\"dweb:/ipfs/QmcpL4gdG6hL2w1wqs2Vw4J1EFCwBs9T1Qd4p16CtECQkn\"]},\"../../../lib/v4-periphery/lib/v4-core/src/types/BalanceDelta.sol\":{\"keccak256\":\"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9\",\"dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H\"]},\"../../../lib/v4-periphery/lib/v4-core/src/types/BeforeSwapDelta.sol\":{\"keccak256\":\"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782\",\"dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K\"]},\"../../../lib/v4-periphery/lib/v4-core/src/types/Currency.sol\":{\"keccak256\":\"0x4a0b84b282577ff6f8acf13ec9f4d32dbb9348748b49611d00e68bee96609c93\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://45f9d62ab3d51b52957279e353853ba1547c3182c9a1e3d1846ada4a90263b01\",\"dweb:/ipfs/QmS8NG84ccQS1yXVD8cv3eKX7J1UKxuJhbUfHTQR2opKF5\"]},\"../../../lib/v4-periphery/lib/v4-core/src/types/PoolId.sol\":{\"keccak256\":\"0x308311916ea0f5c2fd878b6a2751eb223d170a69e33f601fae56dfe3c5d392af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://669c2cd7ac17690b5d8831e0bda72822376c3a04b36afed6d31df4d75fe60918\",\"dweb:/ipfs/QmT6EpkxqU8VF3WsgrZ66F3s1cCQRffR95z1HDYZz7ph6y\"]},\"../../../lib/v4-periphery/lib/v4-core/src/types/PoolKey.sol\":{\"keccak256\":\"0xf89856e0580d7a4856d3187a76858377ccee9d59702d230c338d84388221b786\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f3118fa189025695c37fdf0bdd1190f085ad097484d3c88cf4c56d1db65f639\",\"dweb:/ipfs/QmamXpgtB8GV1CaFLvqefPWSoikLDhMk1yU4heBnVzU8gi\"]},\"../../../lib/v4-periphery/lib/v4-core/src/types/PoolOperation.sol\":{\"keccak256\":\"0x7a1a107fc1f2208abb2c9364c8c54e56e98dca27673e9441bed2b949b6382162\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ad2470383bc5595d5af17840c64971f457adac68895a4db41ba5c71a4478e07\",\"dweb:/ipfs/QmdwKhBHDZFuqXrR2BfDBD9r7rB2ULGQBznsajRTkTmL4c\"]},\"../../../lib/v4-periphery/src/interfaces/IEIP712_v4.sol\":{\"keccak256\":\"0xd7f7115476e307a0bfc32a0f0a0f5434e9e5ca62a6c5af1e18b75e48161bb408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1600b953556da38a7adc5ad2a2925ec5fb138fecf8eec48743646543195b736\",\"dweb:/ipfs/QmarZi2aiLVAfHXgnDWV1cCFiZk2DdPW7KJnWHqzuRChJR\"]},\"../../../lib/v4-periphery/src/interfaces/IERC721Permit_v4.sol\":{\"keccak256\":\"0x103adbba724ef536abc536fe8a4d7dc12880724c562109b69f2adce4a91fa017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://06f51b5a5a218e0bc866a83e7821be53c9db9de0ca921f16abd3d13ea0eab69d\",\"dweb:/ipfs/QmbnhLy992hpQZyphTkj7fpr6jKKVva2AzfmLiDZEuqHAk\"]},\"../../../lib/v4-periphery/src/interfaces/IImmutableState.sol\":{\"keccak256\":\"0x36ab3100e87457ecf04887f4f540e34fd7f21d8e3b83880cb679239e60b7b06b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7f290c7ce8e4832608d637a51b13dff95abecf6549485448e647a11c8ed01341\",\"dweb:/ipfs/QmfD1R6mTp8j4EjQXmQZW3vCh11EYFjnvoaw8rXRP27mMq\"]},\"../../../lib/v4-periphery/src/interfaces/IMulticall_v4.sol\":{\"keccak256\":\"0x336bec303f7ff86497d2679464c5adad5040f412b3d0769ce5e1d2a42f7e2c08\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7734f047d98d331c8abc51ad9f358ceee0a6dcae8d89ac49084b84de0d2d42e7\",\"dweb:/ipfs/QmWij2h7mU36LsXhb9P6pkYXrSCua4ixeWaVFSrsEcEmPQ\"]},\"../../../lib/v4-periphery/src/interfaces/INotifier.sol\":{\"keccak256\":\"0xfdc5187a98240a1691aae98b7dd2444d4c2bfb4746f3c34de9f3d18399c17c5e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://683af56401ec4f8817e8dfe150e7b3febaf0baaf40efe8d0d0475f735275f746\",\"dweb:/ipfs/QmRQ6S3nFnSc2jjDcQTvUJdTf4xKPojmvCkpvgyr6qTuVV\"]},\"../../../lib/v4-periphery/src/interfaces/IPermit2Forwarder.sol\":{\"keccak256\":\"0xfad472937280e861125ff12aa6f9c2cf7440fbb20a2cc29485c24662ad4279c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://31bfbc331f5972fc373d9469fd1ca1d14818db3275f21b7b590f20820cb4439d\",\"dweb:/ipfs/QmX3Bv9wfYpAFZKBcxKsQSXUrSC8mqNBdzh6XVMS72aNx9\"]},\"../../../lib/v4-periphery/src/interfaces/IPoolInitializer_v4.sol\":{\"keccak256\":\"0x2e4feda94650a2642039e0309ffdec480ee050bc40864bf5e1dba42bb4dc9e98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://964c178b4da8bab9ef898b94bb26d7c17cc44c5cf20485f55dcf5e9c7e1b1d92\",\"dweb:/ipfs/QmVd2c3SYteyr5xZgUS4sDAiZF43dLwVAEKdCfvQbkZpRJ\"]},\"../../../lib/v4-periphery/src/interfaces/IPositionManager.sol\":{\"keccak256\":\"0x4ee45da4de6eada7f85c3e167ed3b3957a8591b2ebc195da5c9fbd9669223de3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a604665c0c9e4a8b7b09a0b93c9c00e2f98322f9b5b5288553837dfba2c80648\",\"dweb:/ipfs/QmYZ2DLw98PMobepsjUzT8y9sFXL7a8nXzCGgpeu3FYBgx\"]},\"../../../lib/v4-periphery/src/interfaces/ISubscriber.sol\":{\"keccak256\":\"0x34ceadec4a63019680e543fe73197f198a55c825d86e18f327840354760b57e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://31734feafe1fe162a0702ddf862fcc3bd97505931afb3c685033c0185d898051\",\"dweb:/ipfs/QmQEANYVyaXTNzXKcjUVfPhLU71Bix5vxQH75BpPWMkWgw\"]},\"../../../lib/v4-periphery/src/interfaces/IUnorderedNonce.sol\":{\"keccak256\":\"0xd7f32fee74dc7d1a3b078ca1263961baccaa6bf434c79e8fe0e092e30c3e0ec3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e7d1e92d89d5f49c84aa82f3b259678c2c97a4473b22d753ca4411a6b0cec36d\",\"dweb:/ipfs/QmNZoQyminStaAdaLqoDLoWaBU5QWrWjXFjmBm4aFhzL8i\"]},\"../../../lib/v4-periphery/src/libraries/Actions.sol\":{\"keccak256\":\"0x603e8587a13213dab422d14efdbce3a5cbefbca6aff62820c1959645147073fe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9c651fcb6764d0437c9685f323e5372dc50ca5a3e92429fd25221e94bfc243f4\",\"dweb:/ipfs/QmXoNCDGghiW3tQMzGNGGSi2aaAE63aTjup92P6FRviYTh\"]},\"../../../lib/v4-periphery/src/libraries/LiquidityAmounts.sol\":{\"keccak256\":\"0xc1ed6daa98eee0330327cf8b98ded5172f904a0db107258f9ce571144803773d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://32285a7dd49dbc48e89157e6d064fbbe292de673baf7b00776f2d86fb8484e00\",\"dweb:/ipfs/QmQLmrc9KrTofxYzgmpqKfXEY351RzQAVKs1t3HTVWQdP5\"]},\"../../../lib/v4-periphery/src/libraries/PositionInfoLibrary.sol\":{\"keccak256\":\"0xcc0b58aad30f51783d24f73a74064c1e488030fdb5e359bf435813034517c784\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b7c493f68c12cc41c5e51be2833f997b09c2f011e2c1566cc8808ce4613714c\",\"dweb:/ipfs/QmbVJ7YNzTkAHkp9Ds4t5xboHk916zQx9uysWYvphLSSBp\"]},\"src/ClausFeeBudget.sol\":{\"keccak256\":\"0xc70f0572daceb8aeba812f2020ff4853b3026b89a291bb49cf426c8560ec2627\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://09f1922cacd0b162fda870594c589c0484085569a4cd8da585899b448bf50637\",\"dweb:/ipfs/QmUvLHZ5xMcpgomdyreH1DPpH4U6VQWzRDHjNCrjGfz2mp\"]},\"src/ProtectedHook.sol\":{\"keccak256\":\"0x3ee7f6eeef1c531869e9a26bc5864f691c3b76292dca7f24cdd81ee4cac5c953\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7cc0105ce0dac0d34d18348f43b047a52f033d2e76e0b90bf0599d1282ce8837\",\"dweb:/ipfs/QmZ3Z1kpQTLQQZEbUuZ9gckBSfP4CNPusDPk2fqfNRV6Lk\"]},\"src/TradeExtensionHost.sol\":{\"keccak256\":\"0xd86041554ad6e00a6d4a92fe869a0e3c86940e8b1a31922cb0aacb53d6230299\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35d0b791b05d1b6d716f0bc9fce42f41e264876bb9add360cb1f7be6b78d61f7\",\"dweb:/ipfs/QmRk9qCzaui2AACfJxc4LPAuXgiY5FktQcASBoaBcEHu2F\"]},\"src/legacy/ArenaTide.sol\":{\"keccak256\":\"0xcfceaa052aaccb310edfa5db8255773cfcc12d6cbf2727f4c773cd2b199ff170\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f26c09112e410c6f1afb6f303e46ee5ac5a65b34d766c30dad61bdfc14e4c25d\",\"dweb:/ipfs/QmR5cLkASJ3f23J5qNR6KTbLVXnzn1qbcLgaxe4rpMeopy\"]},\"src/legacy/ClausArt.sol\":{\"keccak256\":\"0x403c313e26169a325279b7dcc4cec66711c08c0b609ffa942bdd42a0aa410c47\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9a6ca36cb91ed6d2403fb8838f074545251093e74a54f81bed954d1269aaa613\",\"dweb:/ipfs/QmZoP4FKPhtT3KdGHeZqVSQsiTSVmNFfPg1r225zCvhXT1\"]},\"src/legacy/ClausNFT.sol\":{\"keccak256\":\"0xec981e6c79bf9b662c132711ae70f1e7dc7daf15ddcbda2202cf172c4a8fedaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://214fd9ebf766ff4d42de143972ef285483346b9b32dc1e8b22de3e402d448537\",\"dweb:/ipfs/QmQi9eZuNNMhEG2ABZyjPwKSQcE9L4wJUVWGgQmEoiznYc\"]},\"src/legacy/ClausNftStaking.sol\":{\"keccak256\":\"0x4357a4ccdfaf0d703c286605f4580efa51998d277b0a9335abdf90c2927140d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72e736fd549354c0c6b28f411b2912ff476dfaea338799a81af59f8e42e44a07\",\"dweb:/ipfs/QmansqkizyjV2Y3jTPuD7hq6owg8nzuVmt2uirSDB7YCqq\"]},\"src/legacy/FeeCalls.sol\":{\"keccak256\":\"0xa0e1cfcb3f07ac5f7c544166bca1f075d2040e478178049663ebd8ef2a2a348b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed95ee22fd6a3cd5d28ca2b385afe681da6b5a2bc0c939a7ccd5b0433874e7a0\",\"dweb:/ipfs/QmVmiFGLD2NjZocRArBcFZweFfwQotbnpC7tbwvmQDWPoE\"]},\"src/legacy/FeeEfficientHook.sol\":{\"keccak256\":\"0x83e8278e27361ff8c7bf8813c7e9e986a96c6ba23b137da18f15398bf1f8d51d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f414539e80dbfa223dd338c5409b9919007cf5f1cf5b1619743e6fc7fd4067d7\",\"dweb:/ipfs/QmWcyaQmoRGQrrLtbMBmhUKj8KQckRmoueBRYF9WUxmfkF\"]},\"src/legacy/FeeMath.sol\":{\"keccak256\":\"0x4f53cf323be5a05dc41eb70e7c3e3ad6afa5b5b0e689b7c40beb615a3ee0f243\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bdde35900316d4b4d292a95375bb62ac44e2b0bc8cdd509cc4b80d203be02d5\",\"dweb:/ipfs/Qmd2YbBQikW4CVvagrad3B7wfGvY1r8FKmEQyt6aq3JbKy\"]},\"src/legacy/FeeNftHook.sol\":{\"keccak256\":\"0x4b6a5e0ffc39f3a9d6d8c54a37e5fec11beb60f485f4b66da98e794c4d173141\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://feda53ed2917f429df6372c421cf383b0a8e8fa3a5b925f661c455f4cbeacbe0\",\"dweb:/ipfs/QmNpUaURFr8VsPb8Kwn7CtG5atTwLq3WdCDg8rLVURJJiN\"]},\"src/legacy/FeePredictionHook.sol\":{\"keccak256\":\"0xfc5927b85c620f9ab1082f3fae5094f3ce8ea4fb03fcc72e076de2a9ed7ab5ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d668bf8109a0bb27840cdc3aa989d83d834b3b5ba0c9538314fcb88b7234220a\",\"dweb:/ipfs/QmVC5QcPz8ShPKCypgR4dNTAMFfsf69SerDXbrpSVokV5Y\"]},\"src/legacy/FeeProcessor.sol\":{\"keccak256\":\"0x311ed4c7d9b59c8ee2763ac6caddc1c3799415d81625bd4d73f5fb004455f4c9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4d0575882f68e2f0b87471a444f6abee19e00fb51ab0e1c279cd604741866b5\",\"dweb:/ipfs/QmbcYfJ1cBWeaBoD4KyGgyZ8PphyzFnPemkUAHayR5V8bV\"]},\"src/legacy/FomoReserve.sol\":{\"keccak256\":\"0x786d12d96acd386b5575d397b71a4bf8edb5ba8b98e761b0e1a5bd2861a6a8ac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://63480ccdf3342d1f1b1828a9c164dd3cad63ac2251111bb7bb4f49115de6f396\",\"dweb:/ipfs/Qmdwz2LGF7eF5kcucrQS6ztWLRcA3KHDzvprWS5vnvi77Y\"]},\"src/legacy/HookBase.sol\":{\"keccak256\":\"0xf0d35f294c24a6dceca7a2c9bab3bcbc29af608b8e382af39bb4295013243fa1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da0421b525a52bb5a63a8c63560435db9fb9a0ae899c4cd7d234aef6b02a2412\",\"dweb:/ipfs/QmUyLjUFMeNddwagFbGJDGvUZuc2SQ6D4ZEgG7rBmkMqRQ\"]},\"src/legacy/IMDWeather.sol\":{\"keccak256\":\"0x324eb69a66a925a07cd308ccb90f06033f0f0042cc2ce4dfb2ece86105a7fc72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b924f601b66a64b4c4416729038d95f3f3be7b64c686580055932d4ba5479a6e\",\"dweb:/ipfs/QmPD6YwYmRtqEP1MjnbyqojdZiNLFe3TLhLFSAoUy2mBjE\"]},\"src/legacy/LiquidityReserve.sol\":{\"keccak256\":\"0xea76e34d7e9efe2da87a30f49014138ef7859e3bf771263b0fa67c24f617d822\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82b66c8a76cc22733bf4e50aa04dfdde1cc31bc10c3a4e52d2640abfe5205252\",\"dweb:/ipfs/QmPpqjua2Uf6xfZZfSmtGdvmPtRhF6Ktdut3EyDSg6YFx4\"]},\"src/legacy/LpRemainderProcessor.sol\":{\"keccak256\":\"0x81b4a27c77eeae75de7e44e8220b8fd821d17cbb14a4dd168caac2c2648b38c9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d7e0234d2c5e8a03389bd150e0d9758efd5973ef19126c1432ef6444567e459\",\"dweb:/ipfs/QmPKJ2DCPJ78A7Ac1mGV7WsDW3HSP619Yj9WsNuCdnjwUG\"]},\"src/legacy/MarketCapOracle.sol\":{\"keccak256\":\"0x57e448efa8277b2a35031303ac79f49c8f80e101524cacf300309c0dfebe11a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://01fa8896f1041915e4f0927aa334a3006aae6d6718a1ecc2952e4ab21326d8ae\",\"dweb:/ipfs/QmX3StqC3ytVYnpQnsEb9N7TjkQJhb4LrVShfDGYRnxu2G\"]},\"src/legacy/NftRewards.sol\":{\"keccak256\":\"0x351663c2c9180347891ac22842240ff4264f0a1dcae8fe8968cd54079f4b0eab\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5acd6e22c5c4cd621355b66bdb2c90f76ae4932dc8bc770d7aadc47482fa1e7d\",\"dweb:/ipfs/QmWV9vUBqt9zyQTE64mhoNTh1FMaKwh19eJVnKCzNXet2N\"]},\"src/legacy/PlatformRevenue.sol\":{\"keccak256\":\"0x2aaa84fb314b61b0c7fbe8474dc874170ed0f92314bdb6bbef3b5f81469e312b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4947ff13d6d906a3443f60dedd8687fbb5fbd758bb17905f0bb26b892f7be7ed\",\"dweb:/ipfs/QmY4ak6Q7aS1huDnZLMY974J8WSQJMV6oqsiYhiudcpcew\"]},\"src/legacy/PoolCapSource.sol\":{\"keccak256\":\"0x8d1c00140577d94ec903ef30682b73cad9179c1519590eccda15c3cbade78456\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://90b165830b9840a23ba871e0b757be4398aa00f2ec3a94521e801ea224c82af8\",\"dweb:/ipfs/QmVzDDuPJx47STYvkesGjxfssfZjRrSWRLHgE8MJrvwFbA\"]},\"src/legacy/ProjectRevenue.sol\":{\"keccak256\":\"0x5f4d6fab31d0d212e4546fcde1fb0c8e7f22dc85c6cf69333db83eb7e788741a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a2e8f4589f244af48f16e8ed2ed77dcf649b2cabe706ecde4e48be695dcf6cd\",\"dweb:/ipfs/QmXDnHRmGNbY9H8nszoNWrpRjDWyJyGvbidRBBFvBi7jJB\"]},\"src/legacy/privacy/ClausPrivacyBuy.sol\":{\"keccak256\":\"0x79cf86cd0b6510d72343ec86d378f997e3d2e88b29c81a06e5679f96e83087ac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ffc62c6b65f29189fdf1a6c3eb1ff2427e1b1ca098c9ed252e40ed6cd8cee131\",\"dweb:/ipfs/QmdTwZTycAt5hmp6TZ8Epvp6QUUGoQan3gYtiNG9xfqbF7\"]},\"src/legacy/privacy/FeeBatchedPrivacyHook.sol\":{\"keccak256\":\"0xf98f4e86a2dd640081418323d89c1cf1cf3564a2bd9d15eb73c250d85eb287fb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://733f12fae778943ee223fb864c53a90fa52295062374f79f4b26882750b6975f\",\"dweb:/ipfs/Qme5G4FJeGS1TgmCcoWzmKFbkA7Vn3AFKn2Bz5n6w646Vt\"]},\"src/legacy/privacy/FeeLpRewardsHook.sol\":{\"keccak256\":\"0x6ce3128863bd4b05db02fee1f4e1d315548e5d8de76fa29ded443ff60e5facb2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://493feafb1e378ac44efb0deea52a56a153533d69c920a32385a4b1b6dbcd01ba\",\"dweb:/ipfs/QmX9nRhcnZUcbzKCpfXukXZucRCzGG1fKp6EUVpspieEvn\"]},\"src/legacy/privacy/FeeNftStakingHook.sol\":{\"keccak256\":\"0xba4c1fc43d4a97c10414144da44168a98766f6e8223bd6d9503bb722a07dc23d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87a07daa2fb8b33810f0f57395ae40ee3d761f9b5d4da92a8d84a29cdd126347\",\"dweb:/ipfs/QmTLSd1zSACvmKNHxi8SvJHNQebgTzzWQyfHJh6jSJvZJU\"]},\"src/legacy/privacy/FeePrivacyHook.sol\":{\"keccak256\":\"0x2e38e0d9b72b75a253174dd71174f44e47654f13d86cb132424a62d489113be0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7beaacbb1612f350a513d7415ef278e980f34e2621e4f623be5bd01d823f5d1d\",\"dweb:/ipfs/QmZQ2soAj1vR5kn9LXDBCjUV1bFLEWjE31va7cnWmh7gfC\"]},\"src/legacy/privacy/IPrivacyPool.sol\":{\"keccak256\":\"0x6b138b31a85ddf8872578f8cb2c73ae72812d95d9c1d00706f40d803938ec96c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8cb7b891bc9276b5574573ab5949924f479daad0cae161400b2040a6bab746aa\",\"dweb:/ipfs/QmT2rViViy2Nu1G6M6Vp8dpxLgVbSa9tVFMJ7RtG28mvMW\"]},\"src/legacy/vendor/chainlink/shared/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0xcee9303d524c29fefc346775ec0be31d134a5f14c990fe04961a9f516eb23ad5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f8b8e522c3aa8d22f0c6c6e2ed0b0aee2a224a961099205e4d847129abecd496\",\"dweb:/ipfs/QmRsTaN1CFJADHtBNsE9kJT8F4P8qVSggGHh3iXL5dDcmc\"]},\"src/legacy/vendor/chainlink/vrf/dev/VRFV2PlusWrapperConsumerBase.sol\":{\"keccak256\":\"0x49eef0f77dd5b06a6aeead7945d9a4d0948137dc228fe045e07f62e80a4c5aa2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b8aa31c59918c1b3f6d1f3aec72c53118ef1eb6d58007daaf067165946ef2486\",\"dweb:/ipfs/QmPpp5ykgufVzcHxfu3orkiJKwczUfs3VXcjN1AvApAbSA\"]},\"src/legacy/vendor/chainlink/vrf/dev/interfaces/IVRFV2PlusWrapper.sol\":{\"keccak256\":\"0x23a19b6fa394e21359d39d78a081ddaa68160cca4b8850afbec5843bd16a844f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f545db93aff28a897f8df61834b05be9c2f96ae953263d8c1f6d5c6648c4f3a5\",\"dweb:/ipfs/QmbwriSRDKrEYW2HqWN2YJjco5wMgr7NBc9yUaHwr2bifu\"]},\"src/legacy/vendor/chainlink/vrf/dev/libraries/VRFV2PlusClient.sol\":{\"keccak256\":\"0xb0b1a6f3f0d59aca5c805994d8f64c24f570c280422f976dbae20f8b5b24b47c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f50a9db38564469f443866bb1e8067f4f934616195afe282c00733d1c1cc7419\",\"dweb:/ipfs/QmfKLv5z7KzxNKCZfH9wC9b4ukkXqz8w8HEqmJcYAvdREH\"]}},\"version\":1}","userdoc":{"kind":"user","notice":"Protected settlement core with replaceable fee and product programs.","methods":{"processLiquidity()":{"notice":"Fixed-destination processing; callers cannot withdraw or redirect reserves."},"timedBuybackState()":{"notice":"Linear release of the reserve over eight hours from the latest fee top-up. New fees extend the unvested stream; skipped batches keep their vested allowance. After twelve hours the previous ordinary processor resumes automatically."},"quoteTradeFee(address,bool,int256,bytes)":{"notice":"Quote depends on the current program and trade data; default rate alone is not a quote."},"processBuybacksGuarded(uint256,uint256,uint256)":{"notice":"Anyone may pay gas, but cannot select recipients, change allocations or withdraw funds."},"processLiquidityRemainder(uint128,uint256,uint256,uint256)":{"notice":"Finish old auto-LP reserves into their original position, even below its old batch threshold."},"submitWeather((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)":{"notice":"Anyone may relay a valid answer for this exact consumer and question."}},"version":1},"devdoc":{"kind":"dev","errors":{"ECDSAInvalidSignature()":[{"details":"The signature is invalid."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}]},"details":"Final inherited accounting kernel. No arbitrary or replaceable delegate target.","methods":{"weatherState()":{"returns":{"mode":"0 = fallback, 1 = dry, 2 = rain."}},"activateRewardBoost()":{"details":"Retains the historical ABI and one-shot namespace; history no longer sets any allocation."},"processBuybacksGuarded(uint256,uint256,uint256)":{"details":"Minimum tokens per ETH spent protects partial batches and newly accrued fees proportionally."},"processLiquidityRemainder(uint128,uint256,uint256,uint256)":{"details":"Only the original position owner may choose the short-lived minimum and reserve caps."}},"version":1},"storageLayout":{"types":null,"storage":[]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"6103e06040523461100857619b4c803803809161001e826103e0612dda565b6103e039610220811261100857610180136110085760405161018081016001600160401b03811182821017612dab5760405261005b6103e0612dfd565b808252610069610400612dfd565b602083018190526104205190916001600160a01b03821682036110085760408401829052610098610440612dfd565b606085018190526100aa610460612dfd565b60808601819052906100bd610480612dfd565b60a087018190526100cf6104a0612dfd565b60c088018190526104c05160e089018190526104e051979096919491906001600160a01b0389168903611008576101008a0189905261050051936001600160a01b0385168503611008576101208b0185905261052051946001600160a01b0386168603611008576101408c01869052610160938c61014e610540612e11565b950185905261056051976001600160a01b03891689036110085761058051996001600160a01b038b168b03611008576105a0519d6001600160a01b038f168f9003611008576105c0519d6001600160a01b038f168f9003611008576105e0519d6001600160a01b038f168f9003611008576001600160a01b039485169a9085169890851697908516949081169316883b15612d9c578860805280158015612d94575b612d855760a05260c052306101605260405163dc4c90d360e01b8152602081600481875afa80156110145788915f91612d49575b506001600160a01b031614801590612ccd575b611fe15760405163dc4c90d360e01b81526020816004818d5afa80156110145788915f91612c91575b506001600160a01b031614801590612c22575b611fe15760405163dc4c90d360e01b8152602081600481865afa80156110145788915f91612be6575b506001600160a01b031614801590612b13575b8015612a40575b611fe157604051637f5a7c7b60e01b81526020816004816001600160a01b0386165afa908115611014575f91612a06575b50604051637f5a7c7b60e01b81526020816004818e5afa908115611014575f916129cc575b506001600160a01b03918216911614801590612950575b80156128d4575b8015612858575b80156127d3575b611fe157604051637e062a3560e11b81526020816004818d5afa908115611014575f91612799575b506101805260018060a01b031660e05261014052866101005283610120526101a05260018060a01b03166101c052604051637f5a7c7b60e01b815260208160048160018060a01b0386165afa908115611014575f9161275f575b50604051637f5a7c7b60e01b81526020816004818a5afa908115611014575f91612725575b506001600160a01b03918216911614801590612664575b80156125e8575b611fe1576001600160a01b0381166101e08190526040516315e5a1e560e01b815290602090829060049082905afa918215611014576004926020925f916125cb575b506102005260405163141b84eb60e31b815292839182906001600160a01b03165afa908115611014575f91612599575b50610220526040516367e828bf60e01b81526020816004816001600160a01b038a165afa908115611014575f91612557575b50604051637e062a3560e11b8152936001600160a01b03919091169290602085600481895afa948515611014575f9561251b575b50604051637f5a7c7b60e01b8152906020826004818a5afa918215611014575f926124df575b506040519561050987612dbf565b5f875260018060a01b0316602087015262800000604087015260020b606086015260018060a01b0316608085015260405163481c6a7560e01b8152602081600481875afa908115611014575f916124a5575b506001600160a01b031614801594906123c1575b50831561234c575b5082156122e0575b50508015612268575b611fe1576001600160a01b039081166102405260405163481c6a7560e01b8152906020908290600490829086165afa908115611014575f9161222e575b5086516001600160a01b0391821691161480159061215b575b801561206d575b8015611ff0575b611fe15761026081905260a0860151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f91611fa7575b506001600160a01b039081166102805260a08701516040516319b400eb60e21b81529160209183916004918391165afa908115611014575f91611f6d575b506102a0526060860151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa8015611014575f90611f33575b6004915061016088015160020b602060018060a01b0360608b01511660405194858092637f5a7c7b60e01b82525afa908115611014575f91611ef7575b60049350604051926106f284612dbf565b5f845260018060a01b03166020840152628000006040840152606083015260018060a01b03166080820152602060018060a01b036101208a015116604051938480926315e5a1e560e01b82525afa908115611014576004925f92611ed6575b5061012089015160405163141b84eb60e31b81529360209185919082906001600160a01b03165afa928315611014575f93611ea2575b506001600160a01b0385163b15908115611e20575b8115611d55575b8115611c64575b8115611bf3575b508015611b81575b8015611b6f575b8015611b62575b8015611af6575b8015611a74575b611a65576102c08490526001600160a01b0387163b1580156119e6575b8015611964575b8015611876575b8015611788575b611779576102e087905261030052610320526001600160a01b0384163b1580156116ee575b801561166f575b80156115ed575b80156114ff575b8015611427575b80156113b8575b6113a9576103408490526040516357a3434160e11b81526020816004816001600160a01b0389165afa908115611014575f91611377575b50610360526040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f91611345575b5061038052306103a05260018060a01b038651166e04444c5dc75cb358380d2e3de08a90811490811591611319575b50610ed75760018060a01b036020870151167349a91293a8dff24d5c54b798c45376301d29b9f38114908115916112ed575b50610ed75760018060a01b0360408701511673f1749e78e76cfe1119206833ae93bed2dede53538114908115916112c1575b50610ed75760018060a01b0360608701511673136589be852ab8d9541f923b04064e362c2f357a811490811591611295575b50610ed75760018060a01b03608087015116735f4ec3df9cbd43714fe2740f5e3616155c5b8419811490811591611269575b50610ed75760018060a01b0360a0870151167372d94600a7a57afb6a2090e9739fd8ab21e02eb281149081159161123d575b50610ed75760018060a01b036101008701511673271f808cb55c7cbbb3d4df0da075def9ae5f7340811490811591611224575b50610ed75760018060a01b03610120870151167380396c7131159eb92e7e84839e51c9887a7a95d98114908115916111f8575b50610ed75760018060a01b036101408701511673c594bdfba256c79f6069df9e89ea78d6312fadd78114908115916111cc575b50610ed7576001600160a01b03811673c0aeabdef1760d0dcba28a20c15701f74216e77a1480159190611197575b50610ed7576001600160a01b03811673b2304d3de407398de441b147e2c64c7c48daf44e1480159190611162575b50610ed7576001600160a01b0383167351629bca14098a4f1ad77cd7e85212d67349823d14801592908390611141575b610ed7576001600160a01b038116734e5916428452891e1deb59d162c20266ed08cad4148015919061110c575b50610ed75760c08401516001600160a01b0316735598aa9146215bc13eb26f2c692ad1461fd32982148015906110de575b80156110cb575b610ed7576040516001600160a01b0382163f90610de990610b8f6020830182612dda565b8181526020810191618d23833951902003610ed7576103c05282516001600160a01b03166e04444c5dc75cb358380d2e3de08a90148015939061101f575b8315610f64575b8315610f37575b8315610f10575b508215610f08575b508115610ee6575b50610ed757604051615ec59081612e5e8239608051818181601c015281816104fc0152818161058d0152818161099001528181610bad015281816113630152818161140401528181611b9701528181611c7001528181611f99015281816120c10152818161221c01528181612336015281816128a50152818161291701528181612b0a01528181612e6c01528181612f4b01528181613f3f015281816140b70152818161422a015281816151cb015281816151fe0152818161535d015281816154170152818161547b015281816154ab015281816158170152818161587c015281816159f201528181615ae50152615b49015260a051818181610c3b0152610e46015260c0518181816111770152611c19015260e051818181610ccf01528181612697015281816127b901526148190152610100518181816104c00152818161132001528181611eee015261286d01526101205181611d68015261014051818181611dd201528181612db60152613f070152610160518161062d0152610180518181816108cb0152614aff01526101a05181818161040f015281816107b601528181611e3401528181612731015281816154570152615b2501526101c051818181612f0901528181615122015281816151a7015281816157b801526157f301526101e0518181816126430152818161432f0152615850015261020051815050610220518150506102405181818161227b01526147be015261026051816103c701526102805181612a1801526102a05181612a6701526102c051818181613153015281816135ba01528181614ea501526159c601526102e051818181612983015261407201526103005181818161593d0152615a7c015261032051816159650152610340518181816111b8015281816142a10152614f040152610360518181816119c8015281816142670152614e460152610380518161501d01526103a051816112db01526103c0518181816116cf015281816123a301528181612ec501526130000152f35b6339cbe26160e21b5f5260045ffd5b6001600160a01b03163f5f80516020619b2c833981519152141590505f610bf2565b91505f610bea565b61010001516001600160a01b03163f5f80516020619b0c833981519152141592505f610be2565b6101008101516001600160a01b031673271f808cb55c7cbbb3d4df0da075def9ae5f734014159350610bdb565b6060810151604051637f5a7c7b60e01b8152919450602090829060049082906001600160a01b03165afa8015611014575f90610fc3575b6001600160a01b03167337bfb8ac7c960e558657871d41ca70e07e7dbfff1415939050610bd4565b506020813d60201161100c575b81610fdd60209383612dda565b81010312611008576110037337bfb8ac7c960e558657871d41ca70e07e7dbfff91612dfd565b610f9b565b5f80fd5b3d9150610fd0565b6040513d5f823e3d90fd5b6060810151604051637e062a3560e11b8152919450602090829060049082906001600160a01b03165afa8015611014575f9061107e575b6001600160a01b0316731b54e762aa34cf6e28e9c082f2848e28e45da6b81415939050610bcd565b506020813d6020116110c3575b8161109860209383612dda565b81010312611008576110be731b54e762aa34cf6e28e9c082f2848e28e45da6b891612dfd565b611056565b3d915061108b565b50600161016085015160020b1415610b6b565b507f39eecf277118e4219d50e4352a2fcf943cf802239c546d54dd4baba53c72d78760e08501511415610b64565b6001600160a01b03163f7fe9609b506e4fb7529489bead6fb1212a3751c585ca01e7ea8162eaf717284ee2141590505f610b33565b506001600160a01b0384163f5f80516020619b2c8339815191521415610b06565b6001600160a01b03163f7f6e6bc3de6394814b173f45ad91823a00d221177e3f55ac950aa51b0527aaeee5141590505f610ad6565b6001600160a01b03163f7f895d8d18e1ddae18be624a5d6eb91ecbef32463239286ea0f089cbaf4d73cb14141590505f610aa8565b7f0c382e71978ff7c7a8ae6ccbb5ae72ff7e3c7348b633fa568e61bc227c0e600f91503f14155f610a7a565b7f162a8f628e26a75e99b59459595aa3dab79d928bab90263195364a48d91a821291503f14155f610a47565b5f80516020619b0c83398151915291503f14155f610a14565b7f38e9854f45420e983b7e429772e6c0fd3b6ce0327d22f09593d9be5de7c78b4e91503f14155f6109e1565b7f4b79b5c8aee6da0f7b393e8b53e6265ef7320a1d16184c65bd3841b5aa3d700d91503f14155f6109af565b7f1ba19c78683fcdca321006b491961704038a75d8bae969d4ac7eb363987a4bc991503f14155f61097d565b7f0c809a6af46fb81e31c079263cf6889f1002eb4a3d71508d1cfa0f1fdccd709c91503f14155f61094b565b7f4b7d19bb5a7437581d6359ce496b9b25ef6971ca8776bfc56fb515d8e92edc5191503f14155f610919565b7f785f1014552b7ce7d5fb7d0c970ca60edee94fd00425d7ca21609acac7ce129391503f14155f6108e7565b90506020813d60201161136f575b8161136060209383612dda565b8101031261100857515f6108b8565b3d9150611353565b90506020813d6020116113a1575b8161139260209383612dda565b8101031261100857515f610886565b3d9150611385565b63e3cd239f60e01b5f5260045ffd5b5060405163141b84eb60e31b81526020816004816001600160a01b0389165afa8015611014575f906113f2575b620151809150141561084f565b506020813d60201161141f575b8161140c60209383612dda565b81010312611008576201518090516113e5565b3d91506113ff565b506040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f916114cd575b506101208701516040516315e5a1e560e01b815290602090829060049082906001600160a01b03165afa908115611014575f9161149e575b506001600160401b03161415610848565b6114c0915060203d6020116114c6575b6114b88183612dda565b810190612e1f565b5f61148d565b503d6114ae565b90506020813d6020116114f7575b816114e860209383612dda565b8101031261100857515f611455565b3d91506114db565b50604051637f5a7c7b60e01b81526020816004816001600160a01b0389165afa908115611014575f916115b3575b506060870151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f91611579575b506001600160a01b0391821691161415610841565b90506020813d6020116115ab575b8161159460209383612dda565b81010312611008576115a590612dfd565b5f611564565b3d9150611587565b90506020813d6020116115e5575b816115ce60209383612dda565b81010312611008576115df90612dfd565b5f61152d565b3d91506115c1565b5060405163fb73056b60e01b81526020816004816001600160a01b0389165afa908115611014575f91611635575b5060208701516001600160a01b039182169116141561083a565b90506020813d602011611667575b8161165060209383612dda565b810103126110085761166190612dfd565b5f61161b565b3d9150611643565b5060405163dc4c90d360e01b81526020816004816001600160a01b0389165afa908115611014575f916116b4575b5086516001600160a01b0391821691161415610833565b90506020813d6020116116e6575b816116cf60209383612dda565b81010312611008576116e090612dfd565b5f61169d565b3d91506116c2565b50604051633ef0f29b60e11b81526020816004816001600160a01b0389165afa908115611014575f91611737575b506101208701516001600160a01b039182169116141561082c565b90506020813d602011611771575b8161175260209383612dda565b8101031261100857516001600160a01b0381168103611008575f61171c565b3d9150611745565b63def9077360e01b5f5260045ffd5b50604051637e062a3560e11b81526020816004816001600160a01b038c165afa908115611014575f9161183c575b506060890151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f91611802575b506001600160a01b0391821691161415610807565b90506020813d602011611834575b8161181d60209383612dda565b810103126110085761182e90612dfd565b5f6117ed565b3d9150611810565b90506020813d60201161186e575b8161185760209383612dda565b810103126110085761186890612dfd565b5f6117b6565b3d915061184a565b50604051637f5a7c7b60e01b81526020816004816001600160a01b038c165afa908115611014575f9161192a575b506060890151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f916118f0575b506001600160a01b0391821691161415610800565b90506020813d602011611922575b8161190b60209383612dda565b810103126110085761191c90612dfd565b5f6118db565b3d91506118fe565b90506020813d60201161195c575b8161194560209383612dda565b810103126110085761195690612dfd565b5f6118a4565b3d9150611938565b5060405163b753bfe960e01b81526020816004816001600160a01b038c165afa908115611014575f916119ac575b5060608901516001600160a01b03918216911614156107f9565b90506020813d6020116119de575b816119c760209383612dda565b81010312611008576119d890612dfd565b5f611992565b3d91506119ba565b5060405163dc4c90d360e01b81526020816004816001600160a01b038c165afa908115611014575f91611a2b575b5088516001600160a01b03918216911614156107f2565b90506020813d602011611a5d575b81611a4660209383612dda565b8101031261100857611a5790612dfd565b5f611a14565b3d9150611a39565b63c68f824960e01b5f5260045ffd5b5060405163fb73056b60e01b81526020816004816001600160a01b0389165afa908115611014575f91611abc575b5060208901516001600160a01b03918216911614156107d5565b90506020813d602011611aee575b81611ad760209383612dda565b8101031261100857611ae890612dfd565b5f611aa2565b3d9150611aca565b5060405163141b84eb60e31b81526020816004816001600160a01b0389165afa80156110145783915f91611b2d575b5014156107ce565b9150506020813d602011611b5a575b81611b4960209383612dda565b81010312611008578290515f611b25565b3d9150611b3c565b50620151808214156107c7565b50426001600160401b038216116107c0565b506040516315e5a1e560e01b81526020816004816001600160a01b0389165afa908115611014575f91611bc1575b506001600160401b03821614156107b9565b90506020813d602011611beb575b81611bdc60209383612dda565b8101031261100857515f611baf565b3d9150611bcf565b604051631f06e1a760e11b815291506020826004816001600160a01b038a165afa918215611014575f92611c2f575b5060a0902014155f6107b1565b9091506020813d602011611c5c575b81611c4b60209383612dda565b8101031261100857519060a0611c22565b3d9150611c3e565b604051637f5a7c7b60e01b81529091506020816004816001600160a01b038a165afa908115611014575f91611d1b575b5060608a0151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f91611ce1575b506001600160a01b0391821691161415906107aa565b90506020813d602011611d13575b81611cfc60209383612dda565b8101031261100857611d0d90612dfd565b5f611ccb565b3d9150611cef565b90506020813d602011611d4d575b81611d3660209383612dda565b8101031261100857611d4790612dfd565b5f611c94565b3d9150611d29565b604051631e46e62f60e21b81529091506020816004816001600160a01b038a165afa908115611014575f91611e01575b5060608a0151604051631e46e62f60e21b815290602090829060049082906001600160a01b03165afa908115611014575f91611dd2575b506001600160a01b0391821691161415906107a3565b611df4915060203d602011611dfa575b611dec8183612dda565b810190612e3e565b5f611dbc565b503d611de2565b611e1a915060203d602011611dfa57611dec8183612dda565b5f611d85565b60405163dc4c90d360e01b81529091506020816004816001600160a01b038a165afa908115611014575f91611e68575b5089516001600160a01b03918216911614159061079c565b90506020813d602011611e9a575b81611e8360209383612dda565b8101031261100857611e9490612dfd565b5f611e50565b3d9150611e76565b9092506020813d602011611ece575b81611ebe60209383612dda565b810103126110085751915f610787565b3d9150611eb1565b611ef091925060203d6020116114c6576114b88183612dda565b905f610751565b90506020833d602011611f2b575b81611f1260209383612dda565b8101031261100857611f25600493612dfd565b906106e1565b3d9150611f05565b506020813d602011611f65575b81611f4d60209383612dda565b8101031261100857611f60600491612dfd565b6106a4565b3d9150611f40565b90506020813d602011611f9f575b81611f8860209383612dda565b8101031261100857611f9990612dfd565b5f61066a565b3d9150611f7b565b90506020813d602011611fd9575b81611fc260209383612dda565b8101031261100857611fd390612dfd565b5f61062c565b3d9150611fb5565b63f92ee8a960e01b5f5260045ffd5b506040516334324e9f60e21b81526020816004816001600160a01b0386165afa908115611014575f91612033575b5061016087015160020b9060020b14156105ec565b90506020813d602011612065575b8161204e60209383612dda565b810103126110085761205f90612e11565b5f61201e565b3d9150612041565b50604051637f5a7c7b60e01b81526020816004816001600160a01b0386165afa908115611014575f91612121575b506060870151604051637f5a7c7b60e01b815290602090829060049082906001600160a01b03165afa908115611014575f916120e7575b506001600160a01b03918216911614156105e5565b90506020813d602011612119575b8161210260209383612dda565b810103126110085761211390612dfd565b5f6120d2565b3d91506120f5565b90506020813d602011612153575b8161213c60209383612dda565b810103126110085761214d90612dfd565b5f61209b565b3d915061212f565b50604051637e062a3560e11b81526020816004816001600160a01b0386165afa908115611014575f9161220f575b506060870151604051637e062a3560e11b815290602090829060049082906001600160a01b03165afa908115611014575f916121d5575b506001600160a01b03918216911614156105de565b90506020813d602011612207575b816121f060209383612dda565b810103126110085761220190612dfd565b5f6121c0565b3d91506121e3565b612228915060203d602011611dfa57611dec8183612dda565b5f612189565b90506020813d602011612260575b8161224960209383612dda565b810103126110085761225a90612dfd565b5f6105c5565b3d915061223c565b5060405163d1ad17bf60e01b81526020816004816001600160a01b0386165afa908115611014575f916122a6575b506001600160a01b031615610588565b90506020813d6020116122d8575b816122c160209383612dda565b81010312611008576122d290612dfd565b5f612296565b3d91506122b4565b604051631f06e1a760e11b81529250602090839060049082905afa918215611014575f92612317575b5060a0902014155f8061057f565b9091506020813d602011612344575b8161233360209383612dda565b8101031261100857519060a0612309565b3d9150612326565b6040516306f4f6fb60e31b815291935090602081600481875afa908115611014575f91612387575b506001600160a01b03161415915f610577565b90506020813d6020116123b9575b816123a260209383612dda565b81010312611008576123b390612dfd565b5f612374565b3d9150612395565b604051637e062a3560e11b8152919450602082600481865afa918215611014575f92612460575b50602060049160405192838092637e062a3560e11b82525afa908115611014575f91612426575b506001600160a01b0391821691161415925f61056f565b90506020813d602011612458575b8161244160209383612dda565b810103126110085761245290612dfd565b5f61240f565b3d9150612434565b9091506020813d60201161249d575b8161247c60209383612dda565b8101031261100857516001600160a01b0381168103611008579060206123e8565b3d915061246f565b90506020813d6020116124d7575b816124c060209383612dda565b81010312611008576124d190612dfd565b5f61055b565b3d91506124b3565b9091506020813d602011612513575b816124fb60209383612dda565b810103126110085761250c90612dfd565b905f6104fb565b3d91506124ee565b9094506020813d60201161254f575b8161253760209383612dda565b810103126110085761254890612dfd565b935f6104d5565b3d915061252a565b90506020813d602011612591575b8161257260209383612dda565b8101031261100857516001600160a01b0381168103611008575f6104a1565b3d9150612565565b90506020813d6020116125c3575b816125b460209383612dda565b8101031261100857515f61046f565b3d91506125a7565b6125e29150833d85116114c6576114b88183612dda565b5f61043f565b5060405163dc4c90d360e01b81526020816004816001600160a01b0386165afa80156110145784915f91612628575b506001600160a01b031614156103fd565b9150506020813d60201161265c575b8161264460209383612dda565b81010312611008576126568491612dfd565b5f612617565b3d9150612637565b50604051637e062a3560e11b81526020816004816001600160a01b0386165afa908115611014575f91612706575b50604051637e062a3560e11b81526020816004818a5afa908115611014575f916126cc575b506001600160a01b03918216911614156103f6565b90506020813d6020116126fe575b816126e760209383612dda565b81010312611008576126f890612dfd565b5f6126b7565b3d91506126da565b61271f915060203d602011611dfa57611dec8183612dda565b5f612692565b90506020813d602011612757575b8161274060209383612dda565b810103126110085761275190612dfd565b5f6103df565b3d9150612733565b90506020813d602011612791575b8161277a60209383612dda565b810103126110085761278b90612dfd565b5f6103ba565b3d915061276d565b90506020813d6020116127cb575b816127b460209383612dda565b81010312611008576127c590612dfd565b5f610360565b3d91506127a7565b50604051638009b7bd60e01b81526020816004816001600160a01b0386165afa80156110145787915f91612813575b506001600160a01b03161415610338565b9150506020813d602011612850575b8161282f60209383612dda565b8101031261100857516001600160a01b03811681036110085786905f612802565b3d9150612822565b50604051637ce73d6760e01b81526020816004816001600160a01b0386165afa80156110145783915f91612898575b506001600160a01b03161415610331565b9150506020813d6020116128cc575b816128b460209383612dda565b81010312611008576128c68391612dfd565b5f612887565b3d91506128a7565b5060405163b753bfe960e01b81526020816004816001600160a01b0386165afa8015611014578a915f91612914575b506001600160a01b0316141561032a565b9150506020813d602011612948575b8161293060209383612dda565b81010312611008576129428a91612dfd565b5f612903565b3d9150612923565b5060405163dc4c90d360e01b81526020816004816001600160a01b0386165afa80156110145788915f91612990575b506001600160a01b03161415610323565b9150506020813d6020116129c4575b816129ac60209383612dda565b81010312611008576129be8891612dfd565b5f61297f565b3d915061299f565b90506020813d6020116129fe575b816129e760209383612dda565b81010312611008576129f890612dfd565b5f61030c565b3d91506129da565b90506020813d602011612a38575b81612a2160209383612dda565b8101031261100857612a3290612dfd565b5f6102e7565b3d9150612a14565b50604051637e062a3560e11b8152602081600481865afa908115611014575f91612ad9575b50604051637e062a3560e11b81526020816004818e5afa908115611014575f91612a9f575b506001600160a01b03918216911614156102b6565b90506020813d602011612ad1575b81612aba60209383612dda565b8101031261100857612acb90612dfd565b5f612a8a565b3d9150612aad565b90506020813d602011612b0b575b81612af460209383612dda565b8101031261100857612b0590612dfd565b5f612a65565b3d9150612ae7565b50604051637f5a7c7b60e01b8152602081600481865afa908115611014575f91612bac575b50604051637f5a7c7b60e01b81526020816004818e5afa908115611014575f91612b72575b506001600160a01b03918216911614156102af565b90506020813d602011612ba4575b81612b8d60209383612dda565b8101031261100857612b9e90612dfd565b5f612b5d565b3d9150612b80565b90506020813d602011612bde575b81612bc760209383612dda565b8101031261100857612bd890612dfd565b5f612b38565b3d9150612bba565b9150506020813d602011612c1a575b81612c0260209383612dda565b8101031261100857612c148891612dfd565b5f61029c565b3d9150612bf5565b5060405163313ce56760e01b81526020816004818a5afa908115611014575f91612c54575b5060ff1660081415610273565b90506020813d602011612c89575b81612c6f60209383612dda565b81010312611008575160ff811681036110085760ff612c47565b3d9150612c62565b9150506020813d602011612cc5575b81612cad60209383612dda565b8101031261100857612cbf8891612dfd565b5f610260565b3d9150612ca0565b5060405163dc4c90d360e01b81526020816004816001600160a01b0389165afa80156110145788915f91612d0d575b506001600160a01b03161415610237565b9150506020813d602011612d41575b81612d2960209383612dda565b8101031261100857612d3b8891612dfd565b5f612cfc565b3d9150612d1c565b9150506020813d602011612d7d575b81612d6560209383612dda565b8101031261100857612d778891612dfd565b5f610224565b3d9150612d58565b6383efa26f60e01b5f5260045ffd5b5081156101f0565b63bc12814760e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b03821117612dab57604052565b601f909101601f19168101906001600160401b03821190821017612dab57604052565b51906001600160a01b038216820361100857565b51908160020b820361100857565b9081602091031261100857516001600160401b03811681036110085790565b9081602091031261100857516001600160a01b0381168103611008579056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b63029a949d60e31b5f5260045ffd5b5f905f3560e01c90816303195cd01461322457508063034e7c47146131d257806305ca342f146131b857806306b7cb9c146122aa578063070fd029146131825780630c7621411461313e5780630e635186146130ff57806310e3c7a7146130e5578063154e1e3f146130ab5780631be052891461308f57806321bdc0d914612f8f57806321d0ee7014612f3857806324048ba114612ef457806324f159c214612eb0578063259982e514612e59578063263cef3c14612e3c57806328accf0914612d91578063293b1c6a146129b2578063375880651461296e5780633923411c146128de5780633bd1325114612847578063402573711461282b578063428a63411461279457806346158ffc1461270c57806346904840146126d8578063470d5fe61461267257806347ccca021461262e57806348e732771461261257806352bf8c27146125f557806354b4bf3914612558578063575e24b4146122e1578063638b12a0146122c7578063690422b2146122aa5780636b9cdad6146122665780636c2bbe7e146122095780636e5dbe86146121ea5780636f2c590a146121d05780636fe7e6eb1461208657806377e70a4b1461206a578063780d3cfe14611eb35780637cc4353b14611e015780637ce73d6714611dbc5780637d73714d14611d975780638009b7bd14611d525780638c2d6cf414611d37578063906f349114611cc357806391dd734614611c3c57806399b5598314611c015780639b75f7c814611be45780639f063efc14611b83578063a53e541214611b66578063a64e13a1146119eb578063af102658146119b0578063b47b2fb1146113a8578063b6a8b0fa1461134f578063b753bfe91461130a578063b827bbe0146112c5578063bb8b353c146112aa578063bbc2520d1461128f578063c269a3e214611267578063c314876d146111e7578063c4408c8a146111a2578063c79d2dfc14610cfe578063ce1b1d4314610cb9578063cffe289e14610c6a578063d16f715814610c25578063d25eae2514610bdc578063dc4c90d314610b97578063dc98354e14610960578063dd6b5e8e14610944578063df4fe917146105e1578063e1b4af6914610579578063e3b3904014610477578063eaf334761461045a578063fb26015f1461043e578063fb73056b146103f95763ffa800820361000f57346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f657602090604051908152f35b50346103f657806003193601126103f65760206040516105dc8152f35b50346103f657806003193601126103f6577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26654604051627eeac760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291821660248201529190602090839060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa90811561056d5790610536575b602090604051908152f35b506020813d602011610565575b8161055060209383613403565b81010312610561576020905161052b565b5f80fd5b3d9150610543565b604051903d90823e3d90fd5b50346103f657610588366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d29150505760405163e1b4af6960e01b8152602090f35b63570c108560e11b8152600490fd5b50346103f65760803660031901126103f6576105fb61323d565b610603613253565b90604435918260020b91828403610940576064356001600160a01b038116939084900361093c57307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316149086908215610908575b82156108f6575b82156108be575b82156108b4575b82156108a9575b505080156108a1575b610892577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26580546001600160a01b039283166001600160a01b0319918216179091557f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2668054939092169216821790555f80516020615d50833981519152805460a09490941b62ffffff60a01b166001600160b81b03199094169390931791909117909155604051638da5cb5b60e01b815290602090829060049082905afa908115610887578291610849575b505f80516020615d7083398151915280546001600160a01b0319166001600160a01b03929092169182179055801590811561079e575b5061078f5780f35b63f92ee8a960e01b8152600490fd5b60405163017d862f60e11b81529091506020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391610800575b506001600160a01b031614155f610787565b90506020813d602011610836575b8161081b60209383613403565b810103126108325761082c906134b5565b5f6107ee565b8280fd5b3d915061080e565b6040513d85823e3d90fd5b90506020813d60201161087f575b8161086460209383613403565b8101031261087b57610875906134b5565b5f610751565b5080fd5b3d9150610857565b6040513d84823e3d90fd5b63f92ee8a960e01b8552600485fd5b508215610685565b13159050855f61067c565b843b159250610675565b6001600160a01b038581167f00000000000000000000000000000000000000000000000000000000000000009091161415925061066e565b6001600160a01b038416159250610667565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b031615159250610660565b8580fd5b8480fd5b50346103f657806003193601126103f657602060405160018152f35b50346103f65760e03660031901126103f65761097a61323d565b60a036602319011261087b5761098e613362565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610b88577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b03168015928315610b6c575b8315610b58575b50508115610b3d575b8115610af6575b8115610ac7575b8115610aa7575b8115610a82575b8115610a5c575b5061078f575f80516020615d50833981519152805460ff60b81b1916600160b81b179055604051636e4c1aa760e11b8152602090f35b5f80516020615d50833981519152546001600160a01b039182169116141590505f610a26565b905060a4356001600160a01b03811690818103610aa3575030141590610a1f565b8380fd5b905060643562ffffff8116808203610aa357628000009150141590610a18565b90506084358060020b90818103610aa357505f80516020615d508339815191525460a01c60020b141590610a11565b90506001600160a01b03610b08613579565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e266546001600160a01b03169116141590610a0a565b90506001600160a01b03610b4f61358f565b16151590610a03565b6001600160a01b0316141591505f806109fa565b5f80516020615d508339815191525460b81c60ff1693506109f3565b63570c108560e11b8352600483fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657600435906001600160401b0382116103f6576101e060031983360301126103f6576020610c1d83600401614474565b604051908152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65760407f2f9e2e20558dbba26f6943f9568ee8724ef17057d8dd3fe037dadf2bb9691382546001600160401b038251918181168352831c166020820152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760403660031901126103f6576004356001600160401b03811161087b57806004016101e06003198336030112610832576024356001600160401b038111610aa357610d53903690600401613269565b929046602483013514801590611174575b801561115b575b8015611142575b8015611127575b801561110c575b80156110f2575b80156110d8575b80156110cf575b80156110c2575b80156110a3575b8015611083575b8015611055575b801561101f575b611010576020610dcb60848401856143c9565b908092918101031261093c5735938460011c9182158015610ff2575b8015610fe0575b610fd1576001600160401b035f80516020615d108339815191525416831115610fc257610e3c91610e2d610e3392610e2588614474565b92369161443e565b90615b73565b90929192615bad565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603610fb357916001600160401b03606092846101c483610ea97f83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b898613529565b1692018284610eb78361440a565b1610610f9f575b50821682195f80516020615d108339815191525416175f80516020615d10833981519152555f80516020615d108339815191525467ffffffffffffffff60401b8260401b169067ffffffffffffffff60401b1916175f80516020615d1083398151915255815f80516020615d10833981519152549660018060ff60801b92161460801b1660ff60801b1988161793845f80516020615d10833981519152553596877ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e5560ff6040519560801c1615158552166020840152166040820152a280f35b83919250610fac9061440a565b9190610ebe565b63027737d360e31b8552600485fd5b6319b5ff4d60e31b8752600487fd5b6383efa26f60e01b8752600487fd5b50610fea83613529565b421015610dee565b506001600160401b036110086101a4860161440a565b168311610de7565b6383efa26f60e01b8552600485fd5b506154606001600160401b0361104e61103b6101c4860161440a565b6110486101a4870161440a565b9061441e565b1611610db8565b506110636101c4830161440a565b6001600160401b03806110796101a4860161440a565b1691161115610db1565b506110916101c4830161440a565b6001600160401b034291161115610daa565b506110b16101a4830161440a565b6001600160401b0342911611610da3565b5061012482013515610d9c565b50823515610d95565b50600561ffff6110eb61018485016143fb565b1611610d8e565b50600461ffff61110561018485016143fb565b1610610d87565b50600461ffff61111f61016485016143fb565b161415610d80565b50600561ffff61113a61014485016143fb565b161415610d79565b50602061115260848401856143c9565b90501415610d72565b50600360ff61116c606485016143bb565b161415610d6b565b507f000000000000000000000000000000000000000000000000000000000000000060448301351415610d64565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65762ffffff6112046135a5565b166148440362ffffff81116112535762ffffff80611220614265565b169116039062ffffff821161123f5760208262ffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b50346103f657806003193601126103f6576020611282614265565b62ffffff60405191168152f35b50346103f657806003193601126103f6576020610c1d61420a565b50346103f657806003193601126103f65760206112826141c9565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65761135e366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d291505057604051635b54587d60e11b8152602090f35b50346103f6576101603660031901126103f6576113c361323d565b60a036602319011261087b5760603660c319011261087b576101243591610144356001600160401b03811161087b57611400903690600401613269565b90937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036119a15761143d614a2f565b839460e435928584129384159081611991575b81611983575b50611974578260801d600f0b918683125f1461196d57611475836136bf565b945b61147f614b6f565b156119145761148c614b87565b811561190557620f42406114a76114a1614854565b836136ac565b04965b8783156118f4576114bb9083613545565b80915b036118e55782156118de57505b925b7f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395c6114f761356a565b156118cf57602061150661358f565b604051634bf466a760e11b81526001600160a01b03909116600482015292839060249082905afa80156118c4578a90611890575b6115449250613545565b61154c61356a565b156117a85761155b9087613538565b620249f08402848104620249f0148515171561179457620f42409004106117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956915b6115ab8886614e42565b60a06040518160248237209360018060a01b031697889560405192835260208301526040820152a36115db61479e565b5f80516020615d908339815191525c6001600160a01b0316908161167a575b60408787805f80516020615db08339815191525d805f80516020615d908339815191525d807f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d81519063b47b2fb160e01b8252600f0b6020820152f35b85977f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef9695965c7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05c61170060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016936116f861356a565b9a369161443e565b6020815191012091833b15611781576101049689956040519b8c9a8b996321b0221b60e11b8b5260048b015260248a0152151560448901526064880152600f0b608487015260a486015260c485015260e48401525af1801561083e5761176c575b8080808086946115fa565b611777838092613403565b61087b575f611761565b8880fd5b637478d45560e11b8852600488fd5b634e487b7160e01b8a52601160045260248afd5b6117b486600f0b6136bf565b90620249f08202828104620249f0148315171561187c57620f4240810482118015611873575b61186457620f4240820290828204620f4240148315171561185057926118146118209361180e61181a94620f424097613545565b92613545565b9061368e565b856136ac565b0486116117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956916115a1565b634e487b7160e01b8c52601160045260248cfd5b637478d45560e11b8b5260048bfd5b508282146117da565b634e487b7160e01b8b52601160045260248bfd5b506020823d6020116118bc575b816118aa60209383613403565b8101031261056157611544915161153a565b3d915061189d565b6040513d8c823e3d90fd5b60206118d9613579565b611506565b90506114cb565b6337e83fd360e21b8a5260048afd5b6118fe9083613538565b80916114be565b61190e81614dee565b966114aa565b919750811561195e57620f424061193261192c614854565b876136ac565b04915b61194a839684835f1461195057505b93614bc5565b986114cd565b61195991613538565b611944565b61196785614dee565b91611935565b8294611477565b63153f6ec760e21b8652600486fd5b905083600f0b14155f611456565b905061199b61356a565b90611450565b63570c108560e11b8452600484fd5b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f657806003193601126103f6577337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590611b48575b8015611b25575b8015611b14575b611b05576001600160401b0342166001600160401b03195f80516020615d308339815191525416175f80516020615d30833981519152556201518042018042116112535767ffffffffffffffff60401b805f80516020615d30833981519152549260401b16169067ffffffffffffffff60401b1916175f80516020615d30833981519152557fe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc60605f80516020615d30833981519152546001600160401b0360405191818116835260401c16602082015260026040820152a180f35b635c06dcc560e01b8152600490fd5b5067fffffffffffeae7f4211611a29565b506001600160401b035f80516020615d308339815191525460401c161515611a22565b50731f22e4b065b2f15fed5be556dc0fa636048d29bc331415611a1b565b50346103f657806003193601126103f65760206040516170808152f35b50346103f657611b92366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506105d29250505057604080516327c18fbf60e21b8152602081019290925290f35b50346103f657806003193601126103f65760206040516107d08152f35b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f65760203660031901126103f6576004356001600160401b03811161087b57611c6d903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105d257611cbf611cab8484613fde565b604051918291602083526020830190613388565b0390f35b50346103f657806003193601126103f657608090611cdf614be6565b908115611d325750611cf7611cf2614c31565b614cce565b50505b5f80516020615e3083398151915254916001600160401b0360405193818116855260401c166020840152151560408301526060820152f35b611cfa565b50346103f657806003193601126103f6576020610c1d613ef1565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657611db9611db461323d565b6136cf565b80f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f6575f80516020615d70833981519152546001600160a01b03163303611ea457807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15611ea15781809160246040518094819363728b658960e01b835260043560048401525af1801561088757611e905750f35b81611e9a91613403565b6103f65780f35b50fd5b631d713add60e21b8152600490fd5b50346103f65760803660031901126103f6576004356001600160801b03811680910361087b5760405163cb2af14b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391612030575b506001600160a01b031633036120215781611f9491604051906002602083015260408201526024356060820152604435608082015260643560a082015260a08152611f7260c082613403565b604051809381926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610887578291611fff575b5060208180518101031261087b57602001516001600160801b03811680910361087b57602090610c1d61479e565b61201b91503d8084833e6120138183613403565b810190613453565b5f611fd1565b631d713add60e21b8252600482fd5b90506020813d602011612062575b8161204b60209383613403565b810103126108325761205c906134b5565b5f611f26565b3d915061203e565b50346103f657806003193601126103f6576020604051600c8152f35b3461056157610100366003190112610561576120a061323d565b5060a0366023190112610561576120b5613362565b506120be613378565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338190036121c157803b1561056157604051635275965160e01b8152906001600160a01b03612116613253565b1660048301526044356001600160a01b0381169081900361056157602483015260643562ffffff81168091036105615760448301526084358060020b80910361056157606483015260a4356001600160a01b03811691908290036105615760c4835f8193819560848401528160a48401525af180156121b6576121a6575b604051636fe7e6eb60e01b8152602090f35b5f6121b091613403565b5f612194565b6040513d5f823e3d90fd5b63570c108560e11b5f5260045ffd5b34610561575f366003190112610561576020611282613633565b34610561575f366003190112610561576339cbe26160e21b5f5260045ffd5b3461056157612217366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506121c1925050505760408051633615df3f60e11b81525f6020820152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576020604051620249f08152f35b34610561575f3660031901126105615760206112826135a5565b3461056157610140366003190112610561576122fb61323d565b60a03660231901126105615760603660c319011261056157610124356001600160401b03811161056157612333903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190338390036121c157604090612373614a2f565b61237b61356a565b9061239f60e43596879585519687958695638e88a1f160e01b8752600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f91612527575b505f80516020615db08339815191525d5f80516020615d908339815191525d61240361356a565b1561251857602061241261358f565b604051634bf466a760e11b81526001600160a01b03909116600482015291829060249082905afa9081156121b6575f916124e5575b50606091612486917f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395d5f9061247b614b6f565b6124a7575b50614bc5565b60801b604051906315d7892d60e21b82526020820152624000006040820152f35b90505f6124b2614b87565b9112156124d7576124cf620f4240916124c9614854565b906136ac565b045b83612480565b6124e090614dee565b6124d1565b90506020813d602011612510575b8161250060209383613403565b8101031261056157516060612447565b3d91506124f3565b6020612522613579565b612412565b905061254b915060403d604011612551575b6125438183613403565b8101906134c9565b846123dc565b503d612539565b34610561575f3660031901126105615760805f80516020615d10833981519152546001600160401b038160401c1690814210155f146125da575f915b6001600160401b037ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e549260ff6040519516855216602084015260408301526060820152f35b80831c60ff16156125ee5760025b91612594565b60016125e8565b34610561575f366003190112610561576020604051620151808152f35b34610561575f3660031901126105615760206040516101f48152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f36600319011261056157604051632386aff360e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061053657602090604051908152f35b34610561575f366003190112610561575f80516020615d70833981519152546040516001600160a01b039091168152602090f35b34610561575f3660031901126105615760408051630f77314d60e31b815290816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061277257602090604051908152f35b506040813d60401161278c575b8161055060409383613403565b3d915061277f565b34610561575f3660031901126105615760405163428a634160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6576020915f916127fe575b506040519015158152f35b61281e9150823d8411612824575b6128168183613403565b810190613552565b826127f3565b503d61280c565b34610561575f3660031901126105615760206040516154608152f35b34610561575f36600319011261056157604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa80156121b6575f9061053657602090604051908152f35b34610561575f36600319011261056157604080515f6020820181905233828401529181526129129190611f72606082613403565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156121b657612956575b61295461479e565b005b612969903d805f833e6120138183613403565b61294c565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561576060366003190112610561576004356044356129e26129d461420a565b6129dc613ef1565b90613538565b90804211908115612d67575b508015612d5f575b8015612d57575b8015612d4c575b612d3d576040516318160ddd60e01b8152907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083600481845afa9283156121b6575f93612d09575b506040516370a0823160e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004820181905292909190602083602481855afa9283156121b6575f93612cd3575b5060408051600160208201523391810191909152612b0591905f90612ae381606081015b03601f198101835282613403565b604051809481926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156121b657612b6792612b5f92612cbb575b50612b5161479e565b612b5961420a565b90613545565b612b59613ef1565b936040516318160ddd60e01b8152602081600481865afa9081156121b6575f91612c88575b50612b9990602092613545565b936024604051809481936370a0823160e01b835260048301525afa9081156121b6575f91612c54575b50612bd090612bd593613538565b613545565b918115908115612c4b575b8115612c38575b50612c29576040917f0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3838051848152836020820152a182519182526020820152f35b63873d73a960e01b5f5260045ffd5b9050612c448284614895565b1083612be7565b83159150612be0565b90506020813d602011612c80575b81612c6f60209383613403565b810103126105615751612bd5612bc2565b3d9150612c62565b90506020813d602011612cb3575b81612ca360209383613403565b8101031261056157516020612b8c565b3d9150612c96565b612cce903d805f833e6120138183613403565b612b48565b9092506020813d602011612d01575b81612cef60209383613403565b81010312610561575191612b05612ab1565b3d9150612ce2565b9092506020813d602011612d35575b81612d2560209383613403565b8101031261056157519184612a57565b3d9150612d18565b6333b094a160e01b5f5260045ffd5b506024358111612a04565b5080156129fd565b5081156129f6565b905061012c420190814211612d7d5711836129ee565b634e487b7160e01b5f52601160045260245ffd5b34610561575f366003190112610561576040516319b400eb60e21b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90612e02575b6040516001600160a01b039091168152602090f35b506020813d602011612e34575b81612e1c60209383613403565b8101031261056157612e2f6020916134b5565b612ded565b3d9150612e0f565b34610561575f366003190112610561576020604051620493e08152f35b3461056157612e6736613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163259982e560e01b8152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461056157612f4636613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163021d0ee760e41b8152602090f35b3461056157608036600319011261056157612fa861323d565b60243590811515820361056157606435906001600160401b03821161056157612ffc92612fdb6040933690600401613269565b8451638e88a1f160e01b8152958694859491939160443591600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f9161306e575b5062ffffff5f199116019062ffffff8211612d7d57604080516001600160a01b03909216825262ffffff929092166020820152f35b9050613089915060403d604011612551576125438183613403565b82613039565b34610561575f36600319011261056157602060405161a8c08152f35b34610561575f3660031901126105615760206040517f43c032f18f863bf5301f80e8812396bc62519b9c402f07184c2255d30d84788f8152f35b34610561575f366003190112610561576020610c1d614854565b34610561575f3660031901126105615730330361004c57604051630321f11f60e21b60208201526004815261295490613139602482613403565b61480d565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f3660031901126105615760408051600160208201523391810191909152612912905f90611f728160608101612ad5565b34610561575f3660031901126105615760206040515f8152f35b34610561575f3660031901126105615760605f80516020615d3083398151915254600262ffffff613201613633565b16146001600160401b0360405192818116845260401c1660208301526040820152f35b34610561575f3660031901126105615780600160209252f35b600435906001600160a01b038216820361056157565b602435906001600160a01b038216820361056157565b9181601f84011215610561578235916001600160401b038311610561576020838186019501011161056157565b90610160600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c49161014435906001600160401b038211610561576132f591600401613269565b9091565b906101a0600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c4916101443591610164359161018435906001600160401b038211610561576132f591600401613269565b60c435906001600160a01b038216820361056157565b60e435908160020b820361056157565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b610120600319820112610561576004356001600160a01b0381168103610561579160a06023198301126105615760249160c4359160e4359161010435906001600160401b038211610561576132f591600401613269565b90601f801991011681019081106001600160401b0382111761342457604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161342457601f01601f191660200190565b602081830312610561578051906001600160401b038211610561570181601f820112156105615780519061348682613438565b926134946040519485613403565b8284526020838301011161056157815f9260208093018386015e8301015290565b51906001600160a01b038216820361056157565b91908260409103126105615760206134e0836134b5565b92015190565b93909285939260a09693600180891b0316865215156020860152604085015260806060850152816080850152848401375f828201840152601f01601f1916010190565b906154608201809211612d7d57565b91908201809211612d7d57565b91908203918211612d7d57565b90816020910312610561575180151581036105615790565b60c43580151581036105615790565b6044356001600160a01b03811681036105615790565b6024356001600160a01b03811681036105615790565b604051630abb87c960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613601575b506135fb575f90565b6107d090565b90506020813d60201161362b575b8161361c60209383613403565b8101031261056157515f6135f2565b3d915061360f565b5f80516020615d30833981519152546001600160401b038160401c16801515918261367a575b5081613670575b501561366b57600290565b600190565b905042105f613660565b6001600160401b031642101591505f613659565b8115613698570490565b634e487b7160e01b5f52601260045260245ffd5b81810292918115918404141715612d7d57565b600160ff1b8114612d7d575f0390565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590613ed3575b613ec4575f6136fb614be6565b15613e855761370b611cf2614c31565b82939291845f80516020615e70833981519152557ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b2555f80516020615e3083398151915254906001600160401b0360c01b9060c01b16906001600160801b036001600160401b0360801b4260801b16911617175f80516020615e30833981519152556040519360a085018581106001600160401b03821117613424576040525f85526020850194731b54e762aa34cf6e28e9c082f2848e28e45da6b88652604081019562800000875260608201966001885260808301977337bfb8ac7c960e558657871d41ca70e07e7dbfff895261380560a08520614e1c565b60038101809111612d7d5760405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa80156121b6575f90613e4c575b6001600160801b039150169780158015613e44575b613de15761386d60a08620614e1c565b60405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91613e12575b506401000276a4996001600160a01b039190911691908a831115613e04576138d08360649261492c565b04809111613dfc575b5060016001607f1b038711613ded575b8615613de1576103e38102908082046103e31490151715612d7d576103e890046001600160a01b0316976401000276a3891115613dd9575b506e04444c5dc75cb358380d2e3de08a903b1561056157604051637a94c56560e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201528660448201525f81606481836e04444c5dc75cb358380d2e3de08a905af180156121b657613dc4575b50613998866136bf565b91604051606081018181106001600160401b03821117613db05760409081526001825260208083019586526001600160a01b03909b1682820190815290518b9590926139e48785613403565b8b8452604051633cf3645360e21b815289516001600160a01b039081166004830152895181166024830152955162ffffff166044820152955160020b60648701529c51841660848601529b51151560a48501529a5160c484015299511660e48201526101206101048201529788908190613a6390610124830190613388565b0381885a6e04444c5dc75cb358380d2e3de08a9090f1968715613cc2578597613d81575b506001600160801b03613a9f8860801d600f0b6136bf565b97169387818110613ce2575b613ac491505f80516020615e7083398151915254613545565b5f80516020615e708339815191525583613bd2575b5060a09020604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff600482015260248101859052909480826044816e04444c5dc75cb358380d2e3de08a905afa94851561056d5794613b80575b5050604080519586526020860192909252908401919091526001600160a01b0316917f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e9080606081015b0390a3565b90809450813d8311613bcb575b613b978183613403565b8101031261056157613b7b7f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e935193613b31565b503d613b8d565b516001600160a01b03166e04444c5dc75cb358380d2e3de08a903b156109405760405190630b0d9c0960e01b825260048201527337bfb8ac7c960e558657871d41ca70e07e7dbfff60248201528360448201528481606481836e04444c5dc75cb358380d2e3de08a905af18015613cc257908591613ccd575b5050731b54e762aa34cf6e28e9c082f2848e28e45da6b83b15610aa357604051630852cd8d60e31b815260048101849052848160248183731b54e762aa34cf6e28e9c082f2848e28e45da6b85af18015613cc257908591613cad575b50613ad9565b81613cb791613403565b610aa357835f613ca7565b6040513d87823e3d90fd5b81613cd791613403565b610aa357835f613c4b565b613ceb91613545565b6e04444c5dc75cb358380d2e3de08a903b1561093c5760405190630ab714fb60e11b82527337bfb8ac7c960e558657871d41ca70e07e7dbfff600483015286602483015260448201528581606481836e04444c5dc75cb358380d2e3de08a905af18015613d7657908691613d61575b5087613aab565b81613d6b91613403565b61094057845f613d5a565b6040513d88823e3d90fd5b9096508581813d8311613da9575b613d998183613403565b810103126109405751955f613a87565b503d613d8f565b634e487b7160e01b8a52604160045260248afd5b613dd19197505f90613403565b5f955f61398e565b97505f613921565b50505050505050505050565b60016001607f1b0396506138e9565b96505f6138d9565b505050505050505050505050565b90506020813d602011613e3c575b81613e2d60209383613403565b8101031261056157515f6138a6565b3d9150613e20565b50881561385d565b506020813d602011613e7d575b81613e6660209383613403565b81010312610561576001600160801b039051613848565b3d9150613e59565b5030330361004c57604051631652585760e01b60208201526001600160a01b039091166024808301919091528152613ec290613139604482613403565b565b63271a26f160e01b5f5260045ffd5b507337bfb8ac7c960e558657871d41ca70e07e7dbfff3314156136ee565b604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa9081156121b6575f91613f72575090565b90506020813d602011613f99575b81613f8d60209383613403565b81010312610561575190565b3d9150613f80565b359060ff8216820361056157565b3d15613fd9573d90613fc082613438565b91613fce6040519384613403565b82523d5f602084013e565b606090565b805f928101036020811261056157600260ff613ff984613fa1565b16036140b55760a01361087b5761400f81613fa1565b506020810135906001600160801b038216809203610832579082916080604051916020830193630fe1ea1160e01b855260248401526040810135604484015260608101356064840152013560848201526084815261406e60a482613403565b51907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af46140a4613faf565b90156140ad5790565b602081519101fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036121c1576040136105615760206140f782613fa1565b9101359060018060a01b0382168092036105615760ff168061416c575050303b156103f657604051630731a8c360e11b8152818160048183305af1801561088757908291614157575b50505b60405190614152602083613403565b815290565b8161416191613403565b6103f657805f614140565b6001036141ba57303b156105615760405190637d73714d60e01b825260048201525f8160248183305af180156121b6576141a7575b50614143565b6141b391505f90613403565b5f806141a1565b63091c731b60e31b5f5260045ffd5b5f80516020615d10833981519152546001600160401b038160401c164210156142035760801c60ff16156141fd57610dac90565b6105dc90565b506109c490565b604051627eeac760e11b81523060048201525f60248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613f72575090565b7f0000000000000000000000000000000000000000000000000000000000000000421061431a576040516340bd8e6960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f916142e8575b506142e2575f90565b610dac90565b90506020813d602011614312575b8161430360209383613403565b8101031261056157515f6142d9565b3d91506142f6565b6040516318160ddd60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90614378575b63ffffffff16151590506142e2575f90565b506020813d6020116143b3575b8161439260209383613403565b81010312610561575163ffffffff811681036105615763ffffffff90614366565b3d9150614385565b3560ff811681036105615790565b903590601e198136030182121561056157018035906001600160401b0382116105615760200191813603831361056157565b3561ffff811681036105615790565b356001600160401b03811681036105615790565b906001600160401b03809116911603906001600160401b038211612d7d57565b92919261444a82613438565b916144586040519384613403565b829481845281830111610561578281602093845f960137010152565b6040516101e081018181106001600160401b03821117613424576145e76101c06042946001600160401b03936040525f60608601525f60808601525f60a08601525f60c08601525f60e08601525f6101008601525f6101208601525f6101408601525f6101608601525f6101808601525f6101a08601525f8286015280358552602081013560208601526040810135604086015260ff614516606083016143bb565b16606086015261453361452c60808301836143c9565b369161443e565b60208151910120608086015260a081013560a08601528361455660c0830161440a565b1660c08601528361456960e0830161440a565b1660e086015261010081013561010086015261012081013561012086015261ffff61459761014083016143fb565b1661014086015261ffff6145ae61016083016143fb565b1661016086015261ffff6145c561018083016143fb565b16610180860152836145da6101a0830161440a565b166101a08601520161440a565b166101c082015260405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fee3b0f8c46969f9c96cbdb258d9bc22f87f49dba9cd39b7a7f091505ea4b9ccd60408201527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260a0815261468060c082613403565b519020906001600160401b036101c0604051927f9c61a909d173aec816b2730e20b6caa3a25ca10c8a084dbf023e026e53874db4602085015280516040850152602081015160608501526040810151608085015260ff60608201511660a0850152608081015160c085015260a081015160e08501528260c0820151166101008501528260e08201511661012085015261010081015161014085015261012081015161016085015261ffff6101408201511661018085015261ffff610160820151166101a085015261ffff6101808201511682850152826101a0820151166101e0850152015116610200820152610200815261477d61022082613403565b602081519101206040519161190160f01b8352600283015260228201522090565b62028dd45a10613ec257604051637de4c18d60e01b81526020816004815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620249f0f16147f25750565b61480a9060203d602011612824576128168183613403565b50565b80515f918291906020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af461484b613faf565b90156140ad5750565b5f80516020615db08339815191525c801561487d575b62ffffff165f198101908111612d7d5790565b50700dac0007d00005dc000bb80032c80059d961486a565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610561571461492557670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90606082901b905f19600160601b8409928280851094039380850394858411156105615714614925578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f19818509938380861095039480860395868511156105615714614a27579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b5f80516020615d508339815191525460ff8160b81c1615908115614b4f575b8115614b2f575b8115614ae5575b8115614ac4575b8115614aa4575b508015614a86575b614a7857565b62820f3560e61b5f5260045ffd5b5060643562ffffff8116808203610561576280000091501415614a72565b608435600281900b9250828103610561575060a01c60020b14155f614a6a565b905060a4356001600160a01b03811690818103610561575030141590614a63565b90506044356001600160a01b0381169081810361056157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141590614a5c565b90506024356001600160a01b038116908181036105615750151590614a55565b5f80516020615d70833981519152546001600160a01b0316159150614a4e565b60c4358015159081810361056157505f60e435121490565b60e4355f811290815f14614bc05760010190600182128015821691151617612d7d57614bb2906136bf565b60018101809111612d7d5790565b905090565b6001607f1b811015614bd757600f0b90565b6393dafdf160e01b5f5260045ffd5b5f80516020615e30833981519152546001600160401b038160401c168015159182614c1d575b5081614c16575090565b9050421090565b6001600160401b031642101591505f614c0c565b604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201526020816044816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91614c9c575b5080614c8e57505f90565b5f198101908111612d7d5790565b90506020813d602011614cc6575b81614cb760209383613403565b8101031261056157515f614c83565b3d9150614caa565b905f80516020615e7083398151915254917ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b254915f80516020615e30833981519152548060c01c92614d208587613538565b8110613ec45784612bd087614d3493613545565b9084151580614dd9575b614d71575b5080614d4c5750565b9092614d589250613538565b906170804201804211612d7d576001600160401b031690565b94614d94919495844210155f14614d9b5750614d8e868092613538565b95613545565b925f614d43565b614dd26001600160401b03614d8e9260801c166001600160401b03614dca614dc38342613545565b928961441e565b1690896149af565b8092613538565b506001600160401b038160801c164211614d3e565b614e00614df9614854565b80926136ac565b90620f424003620f42408111612d7d57614e199161368e565b90565b604051602081019182526006604082015260408152614e3c606082613403565b51902090565b91907f00000000000000000000000000000000000000000000000000000000000000004210615666575f80516020615db08339815191525c801561564e575b62ffffff614e939160481c16846136ac565b604051630abb87c960e11b81525f94917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691620f424090910490602081600481865afa9081156121b6575f9161561c575b506155d1575f905b6040516340bd8e6960e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081600481855afa9081156121b6575f9161559f575b50615555575f5b5f80516020615db08339815191525c801561553d575b614f7762ffffff620f42409260301c16886136ac565b04945f80516020615d908339815191525c9284838a8a8a8a6001600160a01b038a166154df57612bd09250614fb994612bd0612bd092612bd05f998a98613545565b9481806154a5575b5050897f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d83615449575b84615410575b620151806150427f000000000000000000000000000000000000000000000000000000000000000042613545565b049186615356575b50826151f5575b505050965f80516020615dd083398151915260405f80516020615df0833981519152945f80516020615e5083398151915282955f80516020615e108339815191529b9c6150b485519283928d846040919493926060820195825260208201520152565b0390a18151908882526020820152a18151908582526020820152a180615199575b6103e882049281841161518f575b83827f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf068161514f8161516d96612bd061511f8861518a9b613545565b887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b604080518981526020810192909252810191909152606090a1613545565b604051938493846040919493926060820195825260208201520152565b0390a1565b90925082906150e3565b6151f0816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6150d5565b8a9061522b84827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b1561087b578190602460405180948193632cd49aed60e01b83528860048401525af1801561534b57615332575b505f80516020615df0833981519152945f80516020615e508339815191526040955f80516020615e108339815191529b9c957ff548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea5f80516020615dd0833981519152968c6153228b987f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c0582408a5180615303848888846040919493926060820195825260208201520152565b0390a18951938493846040919493926060820195825260208201520152565b0390a1959c9b5095505094615051565b61533d8b8092613403565b615347575f61525a565b8980fd5b6040513d8d823e3d90fd5b61538a87827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528c60048401525af180156121b6576153fb575b5060408051898152602081018890529081018390527f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f86190606090a15f61504a565b615408919b505f90613403565b5f995f6153ba565b61544485307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b615014565b6154a0846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61500e565b6154d8917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b5f81614fc1565b614fb994612bd0612bd092612bd0620f424061551c612bd0985f80516020615db08339815191525c8015615525575b60901c62ffffff16906136ac565b04998a98613545565b50700dac0007d00005dc000bb80032c80059d961550e565b50700dac0007d00005dc000bb80032c80059d9614f61565b5f80516020615db08339815191525c8015615587575b61558162ffffff620f42409260781c16876136ac565b04614f4b565b50700dac0007d00005dc000bb80032c80059d961556b565b90506020813d6020116155c9575b816155ba60209383613403565b8101031261056157515f614f44565b3d91506155ad565b5f80516020615db08339815191525c8015615604575b6155fd62ffffff620f42409260601c16856136ac565b0490614ef5565b50700dac0007d00005dc000bb80032c80059d96155e7565b90506020813d602011615646575b8161563760209383613403565b8101031261056157515f614eed565b3d915061562a565b50700dac0007d00005dc000bb80032c80059d9614e81565b5f9260328104936105dc82028281046105dc1483151715612d7d57620f4240900492620f42406156a262ffffff61569b6135a5565b16856136ac565b0490620f42406156be62ffffff6156b7614265565b16866136ac565b04946156dc886156d688612bd087612bd08786613545565b93613545565b9582615b17575b81615ade575b836159bc575b80615841575b50604061518a945f80516020615dd08339815191528261516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152998651938493846040919493926060820195825260208201520152565b0390a18151908a82526020820152a18151908782526020820152a1846157e5575b847f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf066103e8860496879361514f6157b58684613545565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b61583c856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61577e565b84808060246001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906158a190879083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b604051632cd49aed60e01b8152600481018790529485915af1156159b4575061518a945f80516020615dd0833981519152604061516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152997f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240879a61598a6159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b7f00000000000000000000000000000000000000000000000000000000000000009061368e565b895186815260208101929092526040820152606090a199505050979d9c50509650505094506156f5565b3d86823e3d90fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690615a1790869083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528a60048401525af180156121b657615ac9575b507f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861615ac1615aa26159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b604051918291888b846040919493926060820195825260208201520152565b0390a16156ef565b615ad69195505f90613403565b5f935f615a47565b615b1282307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b6156e9565b615b6e836001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6156e3565b8151919060418303615ba357615b9c9250602082015190606060408401519301515f1a90615c8d565b9192909190565b50505f9160029190565b6004811015615c0d5780615bbf575050565b60018103615bd65763f645eedf60e01b5f5260045ffd5b60028103615bf1575063fce698f760e01b5f5260045260245ffd5b600314615bfb5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60645f92838093604051968793630ab714fb60e11b855260018060a01b0316600485015282602485015260448401525af115615c5a5750565b3d5f823e3d90fd5b60445f92838093604051968793636a770b0f60e01b8552600485015260248401525af115615c5a5750565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615d04579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156121b6575f516001600160a01b03811615615cfa57905f905f90565b505f906001905f90565b5050505f916003919056fefabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8dd5ccc9a085f7022bb20616af7bbc7e01242e18f7a415e423214526aa90e6532c03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26703f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2680e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ee0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ed03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df492127adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b453d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b1954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b3a26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a00336080806040526004361015610012575f80fd5b5f3560e01c9081631b2df8501461089d57508063231a80eb14610880578063436044361461072057806347f543bc1461057c5780635890dea41461055f57806382bfefc8146105315780638a603e77146101af5780638e88a1f114610140578063a54eb24214610112578063ab8a2731146100eb578063af6e6238146100c15763c24dbebd146100a0575f80fd5b346100bd575f3660031901126100bd576020604051620246088152f35b5f80fd5b346100bd5760203660031901126100bd576004355f526002602052602060405f2054604051908152f35b346100bd575f3660031901126100bd575f546040516001600160a01b039091168152602090f35b346100bd575f3660031901126100bd5760206040517337bfb8ac7c960e558657871d41ca70e07e7dbfff8152f35b346100bd5760803660031901126100bd576101596108c4565b6024359081151582036100bd576064359067ffffffffffffffff82116100bd5760409261018d6101999336906004016108da565b92909160443591610a9c565b82516001600160a01b0390921682526020820152f35b346100bd5736600319016101a081126100bd57610160136100bd576101643567ffffffffffffffff81116100bd576101eb9036906004016108da565b610184357fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5c15801590610492575b610483576001600160a01b0361022e6109b8565b16158015610478575b8015610412575b80156103d6575b6103c757612710811080156103bb575b8015610385575b610364576102d26020916102e060043595865f52600285525f604081205560017fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5d6040519384918683019763676bab0160e01b89526102be602485016109ce565b6101806101848501526101a4840191610a7c565b03601f198101845283610908565b6102e86109b8565b935f6040519586945193f160203d141690519015908115610373575b50610364575f7fcb428c74217a6826047e1557f5831e36ee0bac3406edfa5ae193b80aaefdbabc5d6001600160a01b0361033c6109b8565b16907f2f999a7ea97ae4d5b2ee9cc0c93865dc0eeff8748b89107bda512070e182276b5f80a3005b636670a33360e11b5f5260045ffd5b63676bab0160e01b1415905082610304565b505a610394603f830483610a6f565b9061753082018092116103a7571061025c565b634e487b7160e01b5f52601160045260245ffd5b50624c4b408111610255565b63300262ab60e21b5f5260045ffd5b506004355f52600260205260405f205460405160208101906103f7826109ce565b610160815261040861018082610908565b5190201415610245565b5067ffffffffffffffff821161046457604051610439601f8401601f191660200182610908565b828152602081019036848601116100bd57838583375f6020858301015251902061014435141561023e565b634e487b7160e01b5f52604160045260245ffd5b506110008211610237565b63665671f160e11b5f5260045ffd5b5060405163789add5560e11b81527fc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab2360048201526020816024816e04444c5dc75cb358380d2e3de08a905afa908115610526575f916104f4575b50151561021a565b90506020813d60201161051e575b8161050f60209383610908565b810103126100bd5751846104ec565b3d9150610502565b6040513d5f823e3d90fd5b346100bd575f3660031901126100bd576020604051731b54e762aa34cf6e28e9c082f2848e28e45da6b88152f35b346100bd575f3660031901126100bd576020600154604051908152f35b346100bd5760203660031901126100bd576105956108c4565b604051638da5cb5b60e01b8152602081600481731b54e762aa34cf6e28e9c082f2848e28e45da6b85afa908115610526575f916106de575b506001600160a01b031633036106cf576001600160a01b038116903082149081156106b1575b8115610693575b811561067a575b811561065e575b5061064f575f80546001600160a01b03198116831782556001600160a01b0316907f6af262ca96275dc40852dc5ae38406689d6f49c801c16c17cb6c84f103052fc39080a3005b631bb2296560e31b5f5260045ffd5b821515915081610670575b5082610608565b90503b1582610669565b6e04444c5dc75cb358380d2e3de08a9083149150610601565b731b54e762aa34cf6e28e9c082f2848e28e45da6b8831491506105fa565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff831491506105f3565b63ea8e4eb560e01b5f5260045ffd5b90506020813d602011610718575b816106f960209383610908565b810103126100bd57516001600160a01b03811681036100bd57826105cd565b3d91506106ec565b346100bd576101003660031901126100bd5761073a6108c4565b6024356001600160a01b03811691908290036100bd576044358015158091036100bd5760643580600f0b8091036100bd576084359182600f0b8093036100bd577337bfb8ac7c960e558657871d41ca70e07e7dbfff33036106cf576001545f1981146103a757600101938460015560405194610160860186811067ffffffffffffffff82111761046457604052855260018060a01b03169485602086015260408501526060840152608083015260a082015260a43560c082015260c43560e0820152436101008201524261012082015260e435610140820152604051602081019061083781610829858561092a565b03601f198101835282610908565b51902081515f52600260205260405f20557f23ef78eb4b2ee5bd54d6c81877dd7e33c243f72a1039c0e7b302b6caccd8c1df61087b8251926040519182918261092a565b0390a3005b346100bd575f3660031901126100bd576020604051620138808152f35b346100bd575f3660031901126100bd57806e04444c5dc75cb358380d2e3de08a9060209252f35b600435906001600160a01b03821682036100bd57565b9181601f840112156100bd5782359167ffffffffffffffff83116100bd57602083818601950101116100bd57565b90601f8019910116810190811067ffffffffffffffff82111761046457604052565b919091610140806101608301948051845260018060a01b03602082015116602085015260018060a01b0360408201511660408501526060810151151560608501526080810151600f0b608085015260a0810151600f0b60a085015260c081015160c085015260e081015160e08501526101008101516101008501526101208101516101208501520151910152565b6024356001600160a01b03811681036100bd5790565b60043581526024356001600160a01b038116908190036100bd5760208201526044356001600160a01b038116908190036100bd5760408201526064358015158091036100bd57606082015260843580600f0b8091036100bd57608082015260a43580600f0b8091036100bd5760a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b919082018092116103a757565b908060209392818452848401375f828201840152601f01601f1916010190565b93919094926110008311610d7e575f546001600160a01b031695700dac0007d00005dc000bb80032c80059d9938715610d755762019a285a10610d665760405160a0810181811067ffffffffffffffff821117610464576040525f8152731b54e762aa34cf6e28e9c082f2848e28e45da6b86020820152628000006040820152600160608201527337bfb8ac7c960e558657871d41ca70e07e7dbfff6080820152610b4960a08220610d8d565b9060405191631e2eaeaf60e01b835260048301526020826024816e04444c5dc75cb358380d2e3de08a905afa918215610526575f92610d31575b5060a0610b909120610d8d565b90600382018092116103a75760405191631e2eaeaf60e01b835260048301526020826024816e04444c5dc75cb358380d2e3de08a905afa918215610526575f92610cf2575b5060405163dc88d0cf60e01b602082019081526001600160a01b039a8b1660248301529415156044820152606481019690965290971660848501526001600160801b0390961660a484015260c060c484015294610c3d9183916108299160e484019190610a7c565b60c08091604051958691610c518484610908565b8336843751908862013880fa903d141615610cee575f91829190825b6006851015610cca578460051b86015190620246088211610cc05781610c9291610a6f565b9360018601918287116103a7576018830292808404601814901517156103a7576001921b1794019392610c6d565b5091945092505050565b93509350620246088311610ce85750600182018092116103a7571790565b92915050565b9150565b949150916020853d602011610d29575b81610d0f60209383610908565b810103126100bd5793519093916001600160801b03610bd5565b3d9150610d02565b9091506020813d602011610d5e575b81610d4d60209383610908565b810103126100bd57519060a0610b83565b3d9150610d40565b638e0b841160e01b5f5260045ffd5b50929450505050565b63b5cef68360e01b5f5260045ffd5b604051602081019182526006604082015260408152610dad606082610908565b5190209056fea2646970667358221220189bf1649881170d63b9bd59e156a5dea6ce48fd5fb34573452e6e59c5139c6264736f6c634300081a00335edefdcfd727df0398f04ec40b22722bc48db21d7c3de6323de65551b7bed2c563ff1264a45c31a1089254ee5c05a7d9cf70d2ed5881d015a3a5037cb6ac03a2","sourceMap":"1530:10197:73:-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;1052:28:86;;:33;1048:66;;1124:21;1530:10197:73;1124:21:86;2491:23:87;;:54;;;;-1:-1:-1;2487:83:87;;1530:10197:73;2580:27:87;1530:10197:73;2617:35:87;3407:4:80;1530:10197:73;3399:13:80;1530:10197:73;;-1:-1:-1;;;4729:22:80;;1530:10197:73;;4729:22:80;1530:10197:73;4729:22:80;;;;;;;;;-1:-1:-1;4729:22:80;;;-1:-1:-1;;;;;;;1530:10197:73;4721:51:80;;;;:107;;-1:-1:-1;4717:176:80;;1530:10197:73;;-1:-1:-1;;;4914:22:80;;1530:10197:73;;4729:22:80;1530:10197:73;4914:22:80;;;;;;;;;-1:-1:-1;4914:22:80;;;-1:-1:-1;;;;;;;1530:10197:73;4906:51:80;;;;:76;;-1:-1:-1;4902:137:80;;1530:10197:73;;-1:-1:-1;;;5073:19:80;;1530:10197:73;;4729:22:80;1530:10197:73;5073:19:80;;;;;;;;;-1:-1:-1;5073:19:80;;;-1:-1:-1;;;;;;;1530:10197:73;5065:48:80;;;;:83;;-1:-1:-1;5065:136:80;;;;-1:-1:-1;5048:194:80;;1530:10197:73;;-1:-1:-1;;;5269:17:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5269:17:80;;;;;;;-1:-1:-1;5269:17:80;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;5290:15:80;;1530:10197:73;;4729:22:80;1530:10197:73;;5290:15:80;;;;;;;-1:-1:-1;5290:15:80;;;-1:-1:-1;;;;;;;1530:10197:73;;;;;5269:36:80;;;;:93;;-1:-1:-1;5269:172:80;;;;-1:-1:-1;5269:243:80;;;;-1:-1:-1;5269:313:80;;;;-1:-1:-1;5252:371:80;;1530:10197:73;;-1:-1:-1;;;5646:16:80;;1530:10197:73;;4729:22:80;1530:10197:73;5646:16:80;;;;;;;;-1:-1:-1;5646:16:80;;;-1:-1:-1;5633:29:80;1530:10197:73;5633:29:80;1530:10197:73;;;;;;;5672:22:80;1530:10197:73;5704:19:80;5733:27;1530:10197:73;5733:27:80;5770:18;1530:10197:73;5770:18:80;1530:10197:73;5798:25:80;1530:10197:73;;;;;;;5833:27:80;1530:10197:73;;1903:56;;;1333:11:82;;1530:10197:73;;4729:22:80;1530:10197:73;;;;;;;;1333:11:82;;;;;;;-1:-1:-1;1333:11:82;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;1348:15:82;;1530:10197:73;;4729:22:80;1530:10197:73;1348:15:82;;;;;;;;-1:-1:-1;1348:15:82;;;-1:-1:-1;;;;;;;1530:10197:73;;;;;1333:30:82;;;;:75;;-1:-1:-1;1333:139:82;;;;-1:-1:-1;1329:175:82;;-1:-1:-1;;;;;1530:10197:73;;;1514:10:82;;;1530:10197:73;;-1:-1:-1;;;1623:17:82;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;1623:17:82;;;;;;;4729:22:80;1623:17:82;1530:10197:73;1623:17:82;-1:-1:-1;1623:17:82;;;-1:-1:-1;;1530:10197:73;1605:35:82;1530:10197:73;;-1:-1:-1;;;1669:12:82;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;1669:12:82;;;;;;;-1:-1:-1;1669:12:82;;;-1:-1:-1;;1530:10197:73;1650:31:82;1530:10197:73;;-1:-1:-1;;;1755:16:83;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1755:16:83;;;;;;;-1:-1:-1;1755:16:83;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;1853:16:83;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;4729:22:80;1530:10197:73;1853:16:83;;;;;;;;-1:-1:-1;1853:16:83;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;1920:15:83;;1530:10197:73;;;4729:22:80;1530:10197:73;1920:15:83;;;;;;;;-1:-1:-1;1920:15:83;;;-1:-1:-1;1530:10197:73;;;;;;;:::i;:::-;-1:-1:-1;552:8:42;;1530:10197:73;;;;;;;1804:133:83;;552:8:42;;1530:10197:73;1804:133:83;;552:8:42;1530:10197:73;;;1804:133:83;;552:8:42;1530:10197:73;;;;;;;1804:133:83;;552:8:42;1530:10197:73;;1903:56;;;1959:16:83;;1530:10197:73;1959:16:83;4729:22:80;1959:16:83;;;;;;;;;-1:-1:-1;1959:16:83;;;-1:-1:-1;;;;;;;1530:10197:73;1951:46:83;;;;;:93;;-1:-1:-1;1951:149:83;;;;;-1:-1:-1;1951:212:83;;;;;-1:-1:-1;1951:261:83;;;;;;-1:-1:-1;1947:297:83;;-1:-1:-1;;;;;1530:10197:73;;;2254:26:83;;1530:10197:73;;-1:-1:-1;;;1841:21:99;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;;;1841:21:99;;;;;;;-1:-1:-1;1841:21:99;;;-1:-1:-1;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;1833:55:99;;;;:111;;-1:-1:-1;1833:168:99;;;;-1:-1:-1;1833:213:99;;;;-1:-1:-1;1829:249:99;;2088:24;;;;1530:10197:73;;;;;;-1:-1:-1;;;925:17:96;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;925:17:96;;;;;;;-1:-1:-1;925:17:96;;;-1:-1:-1;;;;;;;1530:10197:73;;;902:41:96;;1530:10197:73;;;;;;-1:-1:-1;;;973:21:96;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;;973:21:96;;;;;;;-1:-1:-1;973:21:96;;;-1:-1:-1;;953:41:96;;1530:10197:73;;;;;;-1:-1:-1;;;3025:20:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;3025:20:97;;;;;;-1:-1:-1;3025:20:97;;;-1:-1:-1;4729:22:80;1530:10197:73;;;;;;;;;;;;;;;;;;;;;1903:56;;;;;;;3136:19:97;;;;;;;;;-1:-1:-1;3136:19:97;;;-1:-1:-1;4729:22:80;1530:10197:73;;;;;;;;:::i;:::-;-1:-1:-1;552:8:42;;1530:10197:73;;;;;;;2951:215:97;;552:8:42;;1530:10197:73;2951:215:97;;552:8:42;1530:10197:73;2951:215:97;;552:8:42;1530:10197:73;;;;;;;2951:215:97;;552:8:42;1530:10197:73;;;;;;;;;;;;;1903:56;;;;;;;3197:21:97;;;;;;;;;4729:22:80;3197:21:97;-1:-1:-1;3197:21:97;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;3251:16:97;;1530:10197:73;;;;;1903:56;1530:10197;;-1:-1:-1;;;;;1530:10197:73;3251:16:97;;;;;;;-1:-1:-1;3251:16:97;;;-1:-1:-1;;;;;;;1530:10197:73;;3294:31:97;:36;;:98;;;;-1:-1:-1;3294:198:97;;;;-1:-1:-1;3294:258:97;;;;-1:-1:-1;3294:341:97;;;;-1:-1:-1;3294:399:97;;;;;-1:-1:-1;3294:432:97;;;;-1:-1:-1;3294:458:97;;;;-1:-1:-1;3294:512:97;;;;-1:-1:-1;3294:568:97;;;;-1:-1:-1;3277:621:97;;3908:22;;;;-1:-1:-1;;;;;1530:10197:73;;3944:31:97;:36;:98;;;;-1:-1:-1;3944:177:97;;;;-1:-1:-1;3944:233:97;;;;-1:-1:-1;3944:279:97;;;;-1:-1:-1;3940:344:97;;4293:33;;;;4336:28;;4374:30;;-1:-1:-1;;;;;1530:10197:73;;1193:29:98;:34;:89;;;;-1:-1:-1;1193:161:98;;;;-1:-1:-1;1193:236:98;;;;-1:-1:-1;1193:290:98;;;;-1:-1:-1;1193:340:98;;;;-1:-1:-1;1193:382:98;;;;-1:-1:-1;1189:426:98;;1625:21;;;;1530:10197:73;;-1:-1:-1;;;1677:19:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1677:19:98;;;;;;;-1:-1:-1;1677:19:98;;;-1:-1:-1;;1656:40:98;;1530:10197:73;;-1:-1:-1;;;1728:21:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1728:21:98;;;;;;;-1:-1:-1;1728:21:98;;;-1:-1:-1;1706:43:98;;;3407:4:80;2481:13:73;;1530:10197;;;;;;;;2939:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3088:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3238:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3387:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3533:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3679:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3830:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;3975:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;1530:10197;;;;;;;;;;4123:42;6140:18;;;;;:52;;;-1:-1:-1;6136:84:73;;;-1:-1:-1;;;;;1530:10197:73;;4271:42;6140:18;;;;1530:10197;6140:52;;-1:-1:-1;6136:84:73;;;-1:-1:-1;;;;;1530:10197:73;;4418:42;6140:18;;;;1530:10197;6140:52;;-1:-1:-1;6136:84:73;;;-1:-1:-1;;;;;1530:10197:73;;4565:42;6140:18;;;;;;;:52;;-1:-1:-1;6136:84:73;;-1:-1:-1;;;;;1530:10197:73;;4710:42;6140:18;;;;1530:10197;6140:52;;-1:-1:-1;6136:84:73;;;1530:10197;;;;-1:-1:-1;;;;;1530:10197:73;4852:42;4835:59;;;;:162;;-1:-1:-1;4835:195:73;;;;-1:-1:-1;4831:227:73;;1530:10197;;-1:-1:-1;;;;;1530:10197:73;;5163:29;;5206:36;;1530:10197;;5206:36;;1530:10197;;:::i;:::-;5206:36;;;1530:10197;5206:36;;;;;;1530:10197;5196:47;;5163:80;5160:111;;5281:22;;1530:10197;;-1:-1:-1;;;;;1530:10197:73;2939:42;5489:41;;;;1530:10197;5489:74;;-1:-1:-1;5489:105:73;;;;-1:-1:-1;5489:190:73;;;;-1:-1:-1;5489:308:73;;;;-1:-1:-1;5489:389:73;;;;;-1:-1:-1;5489:503:73;;;;;-1:-1:-1;5485:547:73;;;1530:10197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2254:26:83;1530:10197:73;;;;;;;;;;2088:24:99;1530:10197:73;;;;;902:41:96;1530:10197:73;;;;;953:41:96;1530:10197:73;;;;;3908:22:97;1530:10197:73;;;;;;;;;;;;;;;;;;;;4293:33:97;1530:10197:73;;;;;;;;;;4336:28:97;1530:10197:73;;;;;;;;;;4374:30:97;1530:10197:73;;;;;1625:21:98;1530:10197:73;;;;;;;;;;;;;;;1656:40:98;1530:10197:73;;;;;;;;;;;;;;;1706:43:98;1530:10197:73;;;;;2481:13;1530:10197;;;;;5281:22;1530:10197;;;;;;;;;;;;;;;;;;;;;5485:547;6201:19;;;-1:-1:-1;6013:19:73;4729:22:80;-1:-1:-1;6013:19:73;5489:503;-1:-1:-1;;;;;1530:10197:73;5894:28;-1:-1:-1;;;;;;;;;;;5894:98:73;;;-1:-1:-1;5489:503:73;;;:389;;-1:-1:-1;5489:389:73;;;:308;1530:10197;;;-1:-1:-1;;;;;1530:10197:73;5695:32;-1:-1:-1;;;;;;;;;;;5695:102:73;;;-1:-1:-1;5489:308:73;;;:190;1530:10197;;;;-1:-1:-1;;;;;1530:10197:73;3830:42;5610:69;;;-1:-1:-1;5489:190:73;;:105;1530:10197;;;;;;-1:-1:-1;;;5567:19:73;;1530:10197;;-1:-1:-1;1530:10197:73;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;5567:19;;;;;;-1:-1:-1;5567:19:73;;;5489:105;-1:-1:-1;;;;;1530:10197:73;1653:42;5567:27;;;5489:105;-1:-1:-1;5489:105:73;;5567:19;;1530:10197;5567:19;;1530:10197;5567:19;;;;;;1530:10197;5567:19;;;:::i;:::-;;;1903:56;;;;1530:10197;1653:42;1530:10197;;:::i;:::-;5567:19;;1903:56;-1:-1:-1;1530:10197:73;;5567:19;;;-1:-1:-1;5567:19:73;;;1530:10197;;1903:56;-1:-1:-1;1903:56:73;;;;;5489:74;1530:10197;;;;;;-1:-1:-1;;;5534:20:73;;1530:10197;;-1:-1:-1;1530:10197:73;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;5534:20;;;;;;-1:-1:-1;5534:20:73;;;5489:74;-1:-1:-1;;;;;1530:10197:73;1815:42;5534:29;;;5489:74;-1:-1:-1;5489:74:73;;5534:20;;1530:10197;5534:20;;1530:10197;5534:20;;;;;;1530:10197;5534:20;;;:::i;:::-;;;1903:56;;;;1530:10197;1815:42;1530:10197;;:::i;:::-;5534:20;;;;;-1:-1:-1;5534:20:73;;4835:195;1530:10197;;;;;;;;5013:17;;4835:195;;:162;1530:10197;4931:66;1530:10197;;;;4910:87;;4835:162;;6140:52;-1:-1:-1;;;;;1530:10197:73;6162:15;4754:66;6162:30;;;-1:-1:-1;6140:52:73;;;;-1:-1:-1;;;;;;1530:10197:73;;6162:15;-1:-1:-1;;;;;;;;;;;6162:30:73;;6140:52;;;-1:-1:-1;;;;;1530:10197:73;6162:15;4462:66;6162:30;;;-1:-1:-1;6140:52:73;;;;-1:-1:-1;;;;;1530:10197:73;6162:15;4315:66;6162:30;;;-1:-1:-1;6140:52:73;;;;4167:66;6162:15;;;:30;;6140:52;;;;4019:66;6162:15;;;:30;;6140:52;;;;-1:-1:-1;;;;;;;;;;;6162:15:73;;;:30;;6140:52;;;;3723:66;6162:15;;;:30;;6140:52;;;;3577:66;6162:15;;;:30;;6140:52;;;;3431:66;6162:15;;;:30;;6140:52;;;;3282:66;6162:15;;;:30;;6140:52;;;;3132:66;6162:15;;;:30;;6140:52;;;;2983:66;6162:15;;;:30;;6140:52;;;1728:21:98;;;1530:10197:73;1728:21:98;;1530:10197:73;1728:21:98;;;;;;1530:10197:73;1728:21:98;;;:::i;:::-;;;1530:10197:73;;;;;1728:21:98;;;;;;-1:-1:-1;1728:21:98;;1677:19;;;1530:10197:73;1677:19:98;;1530:10197:73;1677:19:98;;;;;;1530:10197:73;1677:19:98;;;:::i;:::-;;;1530:10197:73;;;;;1677:19:98;;;;;;-1:-1:-1;1677:19:98;;1189:426;1596:19;;;-1:-1:-1;1596:19:98;4729:22:80;-1:-1:-1;1596:19:98;1193:382;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1549:16:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1549:16:98;;;;;;-1:-1:-1;1549:16:98;;;1193:382;1569:6;1549:26;;;;1193:382;;1549:16;;1530:10197:73;1549:16:98;;1530:10197:73;1549:16:98;;;;;;1530:10197:73;1549:16:98;;;:::i;:::-;;;1530:10197:73;;;;1569:6:98;1530:10197:73;;1549:16:98;;;;;-1:-1:-1;1549:16:98;;1193:340;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1487:21:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1487:21:98;;;;;;;-1:-1:-1;1487:21:98;;;1193:340;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1512:21:98;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1512:21:98;;;;;;;-1:-1:-1;1512:21:98;;;1193:340;-1:-1:-1;;;;;;1530:10197:73;1487:46:98;;1193:340;;1512:21;;;;1530:10197:73;1512:21:98;1530:10197:73;1512:21:98;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1487;;;1530:10197:73;1487:21:98;;1530:10197:73;1487:21:98;;;;;;1530:10197:73;1487:21:98;;;:::i;:::-;;;1530:10197:73;;;;;1487:21:98;;;;;;-1:-1:-1;1487:21:98;;1193:290;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1445:15:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1445:15:98;;;;;;;-1:-1:-1;1445:15:98;;;1193:290;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1464:19:98;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1464:19:98;;;;;;;-1:-1:-1;1464:19:98;;;1193:290;-1:-1:-1;;;;;;1530:10197:73;;;;;1445:38:98;;1193:290;;1464:19;;;1530:10197:73;1464:19:98;;1530:10197:73;1464:19:98;;;;;;1530:10197:73;1464:19:98;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1464:19:98;;;;;;-1:-1:-1;1464:19:98;;1445:15;;;1530:10197:73;1445:15:98;;1530:10197:73;1445:15:98;;;;;;1530:10197:73;1445:15:98;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1445:15:98;;;;;;-1:-1:-1;1445:15:98;;1193:236;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1378:25:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1378:25:98;;;;;;;-1:-1:-1;1378:25:98;;;1193:236;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;1370:59:98;;1193:236;;1378:25;;;1530:10197:73;1378:25:98;;1530:10197:73;1378:25:98;;;;;;1530:10197:73;1378:25:98;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1378:25:98;;;;;;-1:-1:-1;1378:25:98;;1193:161;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1306:22:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1306:22:98;;;;;;;-1:-1:-1;1306:22:98;;;1193:161;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;1298:56:98;;1193:161;;1306:22;;;1530:10197:73;1306:22:98;;1530:10197:73;1306:22:98;;;;;;1530:10197:73;1306:22:98;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1306:22:98;;;;;;-1:-1:-1;1306:22:98;;1193:89;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1239:21:98;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1239:21:98;;;;;;;-1:-1:-1;1239:21:98;;;1193:89;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;1231:51:98;;1193:89;;1239:21;;;1530:10197:73;1239:21:98;;1530:10197:73;1239:21:98;;;;;;1530:10197:73;1239:21:98;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;1239:21:98;;;;;;-1:-1:-1;1239:21:98;;3940:344:97;4246:27;;;-1:-1:-1;4246:27:97;4729:22:80;-1:-1:-1;4246:27:97;3944:279;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4181:18:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4181:18:97;;;;;;;-1:-1:-1;4181:18:97;;;3944:279;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;4203:20:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;4203:20:97;;;;;;;-1:-1:-1;4203:20:97;;;3944:279;-1:-1:-1;;;;;;1530:10197:73;;;;;4181:42:97;;3944:279;;4203:20;;;1530:10197:73;4203:20:97;;1530:10197:73;4203:20:97;;;;;;1530:10197:73;4203:20:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4203:20:97;;;;;;-1:-1:-1;4203:20:97;;4181:18;;;1530:10197:73;4181:18:97;;1530:10197:73;4181:18:97;;;;;;1530:10197:73;4181:18:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4181:18:97;;;;;;-1:-1:-1;4181:18:97;;3944:233;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4137:17:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4137:17:97;;;;;;;-1:-1:-1;4137:17:97;;;3944:233;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;4158:19:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;4158:19:97;;;;;;;-1:-1:-1;4158:19:97;;;3944:233;-1:-1:-1;;;;;;1530:10197:73;;;;;4137:40:97;;3944:233;;4158:19;;;1530:10197:73;4158:19:97;;1530:10197:73;4158:19:97;;;;;;1530:10197:73;4158:19:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4158:19:97;;;;;;-1:-1:-1;4158:19:97;;4137:17;;;1530:10197:73;4137:17:97;;1530:10197:73;4137:17:97;;;;;;1530:10197:73;4137:17:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;4137:17:97;;;;;;-1:-1:-1;4137:17:97;;3944:177;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4066:29:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4066:29:97;;;;;;;-1:-1:-1;4066:29:97;;;3944:177;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;4058:63:97;;3944:177;;4066:29;;;1530:10197:73;4066:29:97;;1530:10197:73;4066:29:97;;;;;;1530:10197:73;4066:29:97;;;:::i;:::-;;;552:8:42;;;;1530:10197:73;;;:::i;:::-;4066:29:97;;;;;;-1:-1:-1;4066:29:97;;3944:98;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3992:24:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3992:24:97;;;;;;;-1:-1:-1;3992:24:97;;;3944:98;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;3984:58:97;;3944:98;;3992:24;;;1530:10197:73;3992:24:97;;1530:10197:73;3992:24:97;;;;;;1530:10197:73;3992:24:97;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;3992:24:97;;;;;;-1:-1:-1;3992:24:97;;3277:621;3880:18;;;-1:-1:-1;3880:18:97;4729:22:80;-1:-1:-1;3880:18:97;3294:568;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3810:27:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3810:27:97;;;;;;;-1:-1:-1;3810:27:97;;;3294:568;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;3810:52:97;;3294:568;;3810:27;;;1530:10197:73;3810:27:97;;1530:10197:73;3810:27:97;;;;;;1530:10197:73;3810:27:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;3810:27:97;;;;;;-1:-1:-1;3810:27:97;;3294:512;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3772:18:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3772:18:97;;;;;;;;-1:-1:-1;3772:18:97;;;3294:512;3772:34;;;3294:512;;3772:18;;;;1530:10197:73;3772:18:97;;1530:10197:73;3772:18:97;;;;;;1530:10197:73;3772:18:97;;;:::i;:::-;;;1530:10197:73;;;;;;;3772:18:97;;;;;;-1:-1:-1;3772:18:97;;3294:458;3730:22;3746:6;3730:22;;;3294:458;;:432;-1:-1:-1;3711:15:97;-1:-1:-1;;;;;1530:10197:73;;3697:29:97;3294:432;;:399;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;3655:23:97;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3655:23:97;;;;;;;-1:-1:-1;3655:23:97;;;3294:399;-1:-1:-1;;;;;;1530:10197:73;;3655:38:97;;3294:399;;3655:23;;;1530:10197:73;3655:23:97;;1530:10197:73;3655:23:97;;;;;;1530:10197:73;3655:23:97;;;:::i;:::-;;;1530:10197:73;;;;;3655:23:97;;;;;;-1:-1:-1;3655:23:97;;3294:341;1530:10197:73;;-1:-1:-1;;;3586:19:97;;1530:10197:73;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3586:19:97;;;;;;;-1:-1:-1;3586:19:97;;;3294:341;357:173:56;1530:10197:73;357:173:56;;3572:63:97;;3294:341;;;3586:19;;;;1530:10197:73;3586:19:97;;1530:10197:73;3586:19:97;;;;;;1530:10197:73;3586:19:97;;;:::i;:::-;;;1530:10197:73;;;;;;;3586:19:97;;;;;-1:-1:-1;3586:19:97;;3294:258;1530:10197:73;;-1:-1:-1;;;3512:17:97;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3512:17:97;;;;;;;-1:-1:-1;3512:17:97;;;3294:258;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;3533:19:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;3533:19:97;;;;;;;-1:-1:-1;3533:19:97;;;3294:258;-1:-1:-1;;;;;;1530:10197:73;;;;;3512:40:97;;;3294:258;;3533:19;;;1530:10197:73;3533:19:97;;1530:10197:73;3533:19:97;;;;;;1530:10197:73;3533:19:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;3533:19:97;;;;;;-1:-1:-1;3533:19:97;;3512:17;;;1530:10197:73;3512:17:97;;1530:10197:73;3512:17:97;;;;;;1530:10197:73;3512:17:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;3512:17:97;;;;;;-1:-1:-1;3512:17:97;;3294:198;1530:10197:73;;-1:-1:-1;;;3420:28:97;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3420:28:97;;;;;;;-1:-1:-1;3420:28:97;;;3294:198;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;3461:30:97;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;3461:30:97;;;;;;;-1:-1:-1;3461:30:97;;;3294:198;-1:-1:-1;;;;;;1530:10197:73;;;;;3412:80:97;;;3294:198;;3461:30;;;;1530:10197:73;3461:30:97;1530:10197:73;3461:30:97;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3420:28;;;;1530:10197:73;3420:28:97;1530:10197:73;3420:28:97;;;;;;;:::i;:::-;;;;3294:98;1530:10197:73;;-1:-1:-1;;;3342:24:97;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;3342:24:97;;;;;;;-1:-1:-1;3342:24:97;;;3294:98;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;3334:58:97;;;3294:98;;3342:24;;;1530:10197:73;3342:24:97;;1530:10197:73;3342:24:97;;;;;;1530:10197:73;3342:24:97;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;3342:24:97;;;;;;-1:-1:-1;3342:24:97;;3251:16;;;;1530:10197:73;3251:16:97;;1530:10197:73;3251:16:97;;;;;;1530:10197:73;3251:16:97;;;:::i;:::-;;;1530:10197:73;;;;;3251:16:97;;;;;;;-1:-1:-1;3251:16:97;;3197:21;;;;;1530:10197:73;3197:21:97;1530:10197:73;3197:21:97;;;;;;;:::i;:::-;;;;;3136:19;;;1530:10197:73;3136:19:97;;1530:10197:73;3136:19:97;;;;;;1530:10197:73;3136:19:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;4729:22:80;1530:10197:73;;:::i;:::-;3136:19:97;;;;;;-1:-1:-1;3136:19:97;;3025:20;;1530:10197:73;3025:20:97;;1530:10197:73;3025:20:97;;;;;;1530:10197:73;3025:20:97;;;:::i;:::-;;;1903:56:73;;;;1530:10197;4729:22:80;1530:10197:73;;:::i;:::-;3025:20:97;;;;;-1:-1:-1;3025:20:97;;973:21:96;;;1530:10197:73;973:21:96;;1530:10197:73;973:21:96;;;;;;1530:10197:73;973:21:96;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;973:21:96;;;;;;-1:-1:-1;973:21:96;;925:17;;;1530:10197:73;925:17:96;;1530:10197:73;925:17:96;;;;;;1530:10197:73;925:17:96;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;925:17:96;;;;;;-1:-1:-1;925:17:96;;1829:249:99;4859:23:80;;;-1:-1:-1;2055:23:99;4729:22:80;-1:-1:-1;2055:23:99;1833:213;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;2005:25:99;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;2005:25:99;;;;;;;-1:-1:-1;2005:25:99;;;1833:213;1530:10197:73;;;;;;;;;;2005:41:99;;1833:213;;2005:25;;;1530:10197:73;2005:25:99;;1530:10197:73;2005:25:99;;;;;;1530:10197:73;2005:25:99;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;2005:25:99;;;;;;-1:-1:-1;2005:25:99;;1833:168;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1960:18:99;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1960:18:99;;;;;;;-1:-1:-1;1960:18:99;;;1833:168;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1982:19:99;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1982:19:99;;;;;;;-1:-1:-1;1982:19:99;;;1833:168;-1:-1:-1;;;;;;1530:10197:73;;;;;1960:41:99;;1833:168;;1982:19;;;1530:10197:73;1982:19:99;;1530:10197:73;1982:19:99;;;;;;1530:10197:73;1982:19:99;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1982:19:99;;;;;;-1:-1:-1;1982:19:99;;1960:18;;;1530:10197:73;1960:18:99;;1530:10197:73;1960:18:99;;;;;;1530:10197:73;1960:18:99;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1960:18:99;;;;;;-1:-1:-1;1960:18:99;;1833:111;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1900:19:99;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1900:19:99;;;;;;;-1:-1:-1;1900:19:99;;;1833:111;-1:-1:-1;1530:10197:73;;;;;;-1:-1:-1;;;1924:20:99;;1530:10197:73;;;;;4729:22:80;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;1924:20:99;;;;;;;-1:-1:-1;1924:20:99;;;1833:111;-1:-1:-1;;;;;;1530:10197:73;;;;;1892:52:99;;1833:111;;1924:20;;;1530:10197:73;1924:20:99;;1530:10197:73;1924:20:99;;;;;;1530:10197:73;1924:20:99;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1924:20:99;;;;;;-1:-1:-1;1924:20:99;;1900:19;;;;1530:10197:73;1900:19:99;1530:10197:73;1900:19:99;;;;;;;:::i;:::-;;;;1841:21;;;1530:10197:73;1841:21:99;;1530:10197:73;1841:21:99;;;;;;1530:10197:73;1841:21:99;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1841:21:99;;;;;;-1:-1:-1;1841:21:99;;1951:261:83;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;2179:19:83;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;2179:19:83;;;;;;;-1:-1:-1;2179:19:83;;;1951:261;-1:-1:-1;;;;;;1530:10197:73;2179:33:83;1951:261;;2179:19;;;1530:10197:73;2179:19:83;;1530:10197:73;2179:19:83;;;;;;1530:10197:73;2179:19:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;2179:19:83;;;;;;-1:-1:-1;2179:19:83;;1951:212;1530:10197:73;;-1:-1:-1;;;2118:15:83;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;4729:22:80;;1530:10197:73;;2118:15:83;;;;;;;-1:-1:-1;2118:15:83;;;1951:212;357:173:56;1530:10197:73;357:173:56;;2104:59:83;;1951:212;;;;2118:15;;;;1530:10197:73;2118:15:83;;1530:10197:73;2118:15:83;;;;;;1530:10197:73;2118:15:83;;;:::i;:::-;;;1530:10197:73;;;;;;;2118:15:83;;;;;-1:-1:-1;2118:15:83;;1951:149;1530:10197:73;;-1:-1:-1;;;2068:13:83;;1530:10197:73;;-1:-1:-1;1530:10197:73;;;4729:22:80;1530:10197:73;;2068:13:83;;;;;;;-1:-1:-1;2068:13:83;;;1951:149;-1:-1:-1;;;;;;1530:10197:73;2060:40:83;;;1951:149;;;2068:13;;;1530:10197:73;2068:13:83;;1530:10197:73;2068:13:83;;;;;;1530:10197:73;2068:13:83;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;2068:13:83;;;;;;-1:-1:-1;2068:13:83;;1951:93;1530:10197:73;;-1:-1:-1;;;2009:14:83;;1530:10197:73;;-1:-1:-1;1530:10197:73;;4729:22:80;1530:10197:73;2009:14:83;;;;;;;;-1:-1:-1;2009:14:83;;;1951:93;1530:10197:73;;4729:22:80;1530:10197:73;;;1903:56;;;;;;;2028:16:83;;;;;;;;;-1:-1:-1;2028:16:83;;;1951:93;-1:-1:-1;;;;;;1530:10197:73;;;;;2001:43:83;;;1951:93;;;2028:16;;;1530:10197:73;2028:16:83;;1530:10197:73;2028:16:83;;;;;;1530:10197:73;2028:16:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;2028:16:83;;;;;;-1:-1:-1;2028:16:83;;2009:14;;;;1530:10197:73;2009:14:83;;1530:10197:73;2009:14:83;;;;;;1530:10197:73;2009:14:83;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;2009:14:83;1530:10197:73;2009:14:83;;;;;-1:-1:-1;2009:14:83;;1959:16;;;1530:10197:73;1959:16:83;;1530:10197:73;1959:16:83;;;;;;1530:10197:73;1959:16:83;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;1959:16:83;;;;;;-1:-1:-1;1959:16:83;;1920:15;;;;1530:10197:73;1920:15:83;;1530:10197:73;1920:15:83;;;;;;1530:10197:73;1920:15:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1920:15:83;;;;;;;-1:-1:-1;1920:15:83;;1853:16;;;;1530:10197:73;1853:16:83;;1530:10197:73;1853:16:83;;;;;;1530:10197:73;1853:16:83;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1853:16:83;;;;;;;-1:-1:-1;1853:16:83;;1755;;;1530:10197:73;1755:16:83;;1530:10197:73;1755:16:83;;;;;;1530:10197:73;1755:16:83;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;1755:16:83;;;;;;-1:-1:-1;1755:16:83;;1669:12:82;;;1530:10197:73;1669:12:82;;1530:10197:73;1669:12:82;;;;;;1530:10197:73;1669:12:82;;;:::i;:::-;;;1530:10197:73;;;;;1669:12:82;;;;;;-1:-1:-1;1669:12:82;;1623:17;;;;;;;;;;;;;;:::i;:::-;;;;1333:139;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1432:18:82;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1432:18:82;;;;;;;;-1:-1:-1;1432:18:82;;;1333:139;-1:-1:-1;;;;;;1530:10197:73;1424:48:82;;1333:139;;1432:18;;;;1530:10197:73;1432:18:82;;1530:10197:73;1432:18:82;;;;;;1530:10197:73;1432:18:82;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;1432:18:82;;;;;;-1:-1:-1;1432:18:82;;1333:75;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1375:12:82;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;1375:12:82;;;;;;;-1:-1:-1;1375:12:82;;;1333:75;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1392:16:82;;1530:10197:73;;4729:22:80;1530:10197:73;1392:16:82;;;;;;;;-1:-1:-1;1392:16:82;;;1333:75;-1:-1:-1;;;;;;1530:10197:73;;;;;1367:41:82;;1333:75;;1392:16;;;1530:10197:73;1392:16:82;;1530:10197:73;1392:16:82;;;;;;1530:10197:73;1392:16:82;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1392:16:82;;;;;;-1:-1:-1;1392:16:82;;1375:12;;;;1530:10197:73;1375:12:82;1530:10197:73;1375:12:82;;;;;;;:::i;:::-;;;;1348:15;;;1530:10197:73;1348:15:82;;1530:10197:73;1348:15:82;;;;;;1530:10197:73;1348:15:82;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1348:15:82;;;;;;-1:-1:-1;1348:15:82;;1333:11;;;1530:10197:73;1333:11:82;;1530:10197:73;1333:11:82;;;;;;1530:10197:73;1333:11:82;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;1333:11:82;;;;;;-1:-1:-1;1333:11:82;;5646:16:80;;;1530:10197:73;5646:16:80;;1530:10197:73;5646:16:80;;;;;;1530:10197:73;5646:16:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5646:16:80;;;;;;-1:-1:-1;5646:16:80;;5269:313;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5540:23:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5540:23:80;;;;;;;;-1:-1:-1;5540:23:80;;;5269:313;-1:-1:-1;;;;;;1530:10197:73;5532:50:80;;5269:313;;5540:23;;;;1530:10197:73;5540:23:80;;1530:10197:73;5540:23:80;;;;;;1530:10197:73;5540:23:80;;;:::i;:::-;;;1530:10197:73;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;5540:23:80;;;;;;;;-1:-1:-1;5540:23:80;;5269:243;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5469:24:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5469:24:80;;;;;;;;-1:-1:-1;5469:24:80;;;5269:243;-1:-1:-1;;;;;;1530:10197:73;5461:51:80;;5269:243;;5469:24;;;;1530:10197:73;5469:24:80;;1530:10197:73;5469:24:80;;;;;;1530:10197:73;5469:24:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;5469:24:80;;;;;;-1:-1:-1;5469:24:80;;5269:172;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5390:29:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5390:29:80;;;;;;;;-1:-1:-1;5390:29:80;;;5269:172;-1:-1:-1;;;;;;1530:10197:73;5382:59:80;;5269:172;;5390:29;;;;1530:10197:73;5390:29:80;;1530:10197:73;5390:29:80;;;;;;1530:10197:73;5390:29:80;;;:::i;:::-;;;552:8:42;;;;1530:10197:73;;;;:::i;:::-;5390:29:80;;;;;;-1:-1:-1;5390:29:80;;5269:93;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5317:24:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;5317:24:80;;;;;;;;-1:-1:-1;5317:24:80;;;5269:93;-1:-1:-1;;;;;;1530:10197:73;5309:53:80;;5269:93;;5317:24;;;;1530:10197:73;5317:24:80;;1530:10197:73;5317:24:80;;;;;;1530:10197:73;5317:24:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;5317:24:80;;;;;;-1:-1:-1;5317:24:80;;5290:15;;;1530:10197:73;5290:15:80;;1530:10197:73;5290:15:80;;;;;;1530:10197:73;5290:15:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5290:15:80;;;;;;-1:-1:-1;5290:15:80;;5269:17;;;1530:10197:73;5269:17:80;;1530:10197:73;5269:17:80;;;;;;1530:10197:73;5269:17:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5269:17:80;;;;;;-1:-1:-1;5269:17:80;;5065:136;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5168:13:80;;1530:10197:73;;4729:22:80;1530:10197:73;5168:13:80;;;;;;;;-1:-1:-1;5168:13:80;;;5065:136;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5185:16:80;;1530:10197:73;;4729:22:80;1530:10197:73;;5185:16:80;;;;;;;-1:-1:-1;5185:16:80;;;5065:136;-1:-1:-1;;;;;;1530:10197:73;;;;;5168:33:80;;5065:136;;5185:16;;;1530:10197:73;5185:16:80;;1530:10197:73;5185:16:80;;;;;;1530:10197:73;5185:16:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5185:16:80;;;;;;-1:-1:-1;5185:16:80;;5168:13;;;1530:10197:73;5168:13:80;;1530:10197:73;5168:13:80;;;;;;1530:10197:73;5168:13:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5168:13:80;;;;;;-1:-1:-1;5168:13:80;;5065:83;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5117:12:80;;1530:10197:73;;4729:22:80;1530:10197:73;5117:12:80;;;;;;;;-1:-1:-1;5117:12:80;;;5065:83;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;5133:15:80;;1530:10197:73;;4729:22:80;1530:10197:73;;5133:15:80;;;;;;;-1:-1:-1;5133:15:80;;;5065:83;-1:-1:-1;;;;;;1530:10197:73;;;;;5117:31:80;;5065:83;;5133:15;;;1530:10197:73;5133:15:80;;1530:10197:73;5133:15:80;;;;;;1530:10197:73;5133:15:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5133:15:80;;;;;;-1:-1:-1;5133:15:80;;5117:12;;;1530:10197:73;5117:12:80;;1530:10197:73;5117:12:80;;;;;;1530:10197:73;5117:12:80;;;:::i;:::-;;;1903:56:73;;;;1530:10197;;;:::i;:::-;5117:12:80;;;;;;-1:-1:-1;5117:12:80;;5073:19;;;;1530:10197:73;5073:19:80;;1530:10197:73;5073:19:80;;;;;;1530:10197:73;5073:19:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;5073:19:80;;;;;;-1:-1:-1;5073:19:80;;4906:76;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4961:16:80;;1530:10197:73;;4729:22:80;1530:10197:73;4961:16:80;;;;;;;;-1:-1:-1;4961:16:80;;;4906:76;-1:-1:-1;1530:10197:73;;4981:1:80;4961:21;;4906:76;;4961:16;;;1530:10197:73;4961:16:80;;1530:10197:73;4961:16:80;;;;;;1530:10197:73;4961:16:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;;;;;;4961:16:80;;;;;-1:-1:-1;4961:16:80;;4914:22;;;;1530:10197:73;4914:22:80;;1530:10197:73;4914:22:80;;;;;;1530:10197:73;4914:22:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;4914:22:80;;;;;;-1:-1:-1;4914:22:80;;4721:107;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;4784:23:80;;1530:10197:73;;4729:22:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;4784:23:80;;;;;;;;-1:-1:-1;4784:23:80;;;4721:107;-1:-1:-1;;;;;;1530:10197:73;4776:52:80;;4721:107;;4784:23;;;;1530:10197:73;4784:23:80;;1530:10197:73;4784:23:80;;;;;;1530:10197:73;4784:23:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;4784:23:80;;;;;;-1:-1:-1;4784:23:80;;4729:22;;;;1530:10197:73;4729:22:80;;1530:10197:73;4729:22:80;;;;;;1530:10197:73;4729:22:80;;;:::i;:::-;;;1530:10197:73;;;;;;;;:::i;:::-;4729:22:80;;;;;;-1:-1:-1;4729:22:80;;2487:83:87;2554:16;;;-1:-1:-1;2554:16:87;;-1:-1:-1;2554:16:87;2491:54;2518:27;;;2491:54;;1048:66:86;1094:20;;;-1:-1:-1;1094:20:86;;-1:-1:-1;1094:20:86;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;;-1:-1:-1;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;;;;-1:-1:-1;;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;552:8:42:-;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;552:8:42;:::o","linkReferences":{}},"deployedBytecode":{"object":"608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b63029a949d60e31b5f5260045ffd5b5f905f3560e01c90816303195cd01461322457508063034e7c47146131d257806305ca342f146131b857806306b7cb9c146122aa578063070fd029146131825780630c7621411461313e5780630e635186146130ff57806310e3c7a7146130e5578063154e1e3f146130ab5780631be052891461308f57806321bdc0d914612f8f57806321d0ee7014612f3857806324048ba114612ef457806324f159c214612eb0578063259982e514612e59578063263cef3c14612e3c57806328accf0914612d91578063293b1c6a146129b2578063375880651461296e5780633923411c146128de5780633bd1325114612847578063402573711461282b578063428a63411461279457806346158ffc1461270c57806346904840146126d8578063470d5fe61461267257806347ccca021461262e57806348e732771461261257806352bf8c27146125f557806354b4bf3914612558578063575e24b4146122e1578063638b12a0146122c7578063690422b2146122aa5780636b9cdad6146122665780636c2bbe7e146122095780636e5dbe86146121ea5780636f2c590a146121d05780636fe7e6eb1461208657806377e70a4b1461206a578063780d3cfe14611eb35780637cc4353b14611e015780637ce73d6714611dbc5780637d73714d14611d975780638009b7bd14611d525780638c2d6cf414611d37578063906f349114611cc357806391dd734614611c3c57806399b5598314611c015780639b75f7c814611be45780639f063efc14611b83578063a53e541214611b66578063a64e13a1146119eb578063af102658146119b0578063b47b2fb1146113a8578063b6a8b0fa1461134f578063b753bfe91461130a578063b827bbe0146112c5578063bb8b353c146112aa578063bbc2520d1461128f578063c269a3e214611267578063c314876d146111e7578063c4408c8a146111a2578063c79d2dfc14610cfe578063ce1b1d4314610cb9578063cffe289e14610c6a578063d16f715814610c25578063d25eae2514610bdc578063dc4c90d314610b97578063dc98354e14610960578063dd6b5e8e14610944578063df4fe917146105e1578063e1b4af6914610579578063e3b3904014610477578063eaf334761461045a578063fb26015f1461043e578063fb73056b146103f95763ffa800820361000f57346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f657602090604051908152f35b50346103f657806003193601126103f65760206040516105dc8152f35b50346103f657806003193601126103f6577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26654604051627eeac760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291821660248201529190602090839060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa90811561056d5790610536575b602090604051908152f35b506020813d602011610565575b8161055060209383613403565b81010312610561576020905161052b565b5f80fd5b3d9150610543565b604051903d90823e3d90fd5b50346103f657610588366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d29150505760405163e1b4af6960e01b8152602090f35b63570c108560e11b8152600490fd5b50346103f65760803660031901126103f6576105fb61323d565b610603613253565b90604435918260020b91828403610940576064356001600160a01b038116939084900361093c57307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316149086908215610908575b82156108f6575b82156108be575b82156108b4575b82156108a9575b505080156108a1575b610892577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26580546001600160a01b039283166001600160a01b0319918216179091557f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2668054939092169216821790555f80516020615d50833981519152805460a09490941b62ffffff60a01b166001600160b81b03199094169390931791909117909155604051638da5cb5b60e01b815290602090829060049082905afa908115610887578291610849575b505f80516020615d7083398151915280546001600160a01b0319166001600160a01b03929092169182179055801590811561079e575b5061078f5780f35b63f92ee8a960e01b8152600490fd5b60405163017d862f60e11b81529091506020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391610800575b506001600160a01b031614155f610787565b90506020813d602011610836575b8161081b60209383613403565b810103126108325761082c906134b5565b5f6107ee565b8280fd5b3d915061080e565b6040513d85823e3d90fd5b90506020813d60201161087f575b8161086460209383613403565b8101031261087b57610875906134b5565b5f610751565b5080fd5b3d9150610857565b6040513d84823e3d90fd5b63f92ee8a960e01b8552600485fd5b508215610685565b13159050855f61067c565b843b159250610675565b6001600160a01b038581167f00000000000000000000000000000000000000000000000000000000000000009091161415925061066e565b6001600160a01b038416159250610667565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b031615159250610660565b8580fd5b8480fd5b50346103f657806003193601126103f657602060405160018152f35b50346103f65760e03660031901126103f65761097a61323d565b60a036602319011261087b5761098e613362565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610b88577f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e265546001600160a01b03168015928315610b6c575b8315610b58575b50508115610b3d575b8115610af6575b8115610ac7575b8115610aa7575b8115610a82575b8115610a5c575b5061078f575f80516020615d50833981519152805460ff60b81b1916600160b81b179055604051636e4c1aa760e11b8152602090f35b5f80516020615d50833981519152546001600160a01b039182169116141590505f610a26565b905060a4356001600160a01b03811690818103610aa3575030141590610a1f565b8380fd5b905060643562ffffff8116808203610aa357628000009150141590610a18565b90506084358060020b90818103610aa357505f80516020615d508339815191525460a01c60020b141590610a11565b90506001600160a01b03610b08613579565b7f03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e266546001600160a01b03169116141590610a0a565b90506001600160a01b03610b4f61358f565b16151590610a03565b6001600160a01b0316141591505f806109fa565b5f80516020615d508339815191525460b81c60ff1693506109f3565b63570c108560e11b8352600483fd5b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657600435906001600160401b0382116103f6576101e060031983360301126103f6576020610c1d83600401614474565b604051908152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65760407f2f9e2e20558dbba26f6943f9568ee8724ef17057d8dd3fe037dadf2bb9691382546001600160401b038251918181168352831c166020820152f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760403660031901126103f6576004356001600160401b03811161087b57806004016101e06003198336030112610832576024356001600160401b038111610aa357610d53903690600401613269565b929046602483013514801590611174575b801561115b575b8015611142575b8015611127575b801561110c575b80156110f2575b80156110d8575b80156110cf575b80156110c2575b80156110a3575b8015611083575b8015611055575b801561101f575b611010576020610dcb60848401856143c9565b908092918101031261093c5735938460011c9182158015610ff2575b8015610fe0575b610fd1576001600160401b035f80516020615d108339815191525416831115610fc257610e3c91610e2d610e3392610e2588614474565b92369161443e565b90615b73565b90929192615bad565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603610fb357916001600160401b03606092846101c483610ea97f83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b898613529565b1692018284610eb78361440a565b1610610f9f575b50821682195f80516020615d108339815191525416175f80516020615d10833981519152555f80516020615d108339815191525467ffffffffffffffff60401b8260401b169067ffffffffffffffff60401b1916175f80516020615d1083398151915255815f80516020615d10833981519152549660018060ff60801b92161460801b1660ff60801b1988161793845f80516020615d10833981519152553596877ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e5560ff6040519560801c1615158552166020840152166040820152a280f35b83919250610fac9061440a565b9190610ebe565b63027737d360e31b8552600485fd5b6319b5ff4d60e31b8752600487fd5b6383efa26f60e01b8752600487fd5b50610fea83613529565b421015610dee565b506001600160401b036110086101a4860161440a565b168311610de7565b6383efa26f60e01b8552600485fd5b506154606001600160401b0361104e61103b6101c4860161440a565b6110486101a4870161440a565b9061441e565b1611610db8565b506110636101c4830161440a565b6001600160401b03806110796101a4860161440a565b1691161115610db1565b506110916101c4830161440a565b6001600160401b034291161115610daa565b506110b16101a4830161440a565b6001600160401b0342911611610da3565b5061012482013515610d9c565b50823515610d95565b50600561ffff6110eb61018485016143fb565b1611610d8e565b50600461ffff61110561018485016143fb565b1610610d87565b50600461ffff61111f61016485016143fb565b161415610d80565b50600561ffff61113a61014485016143fb565b161415610d79565b50602061115260848401856143c9565b90501415610d72565b50600360ff61116c606485016143bb565b161415610d6b565b507f000000000000000000000000000000000000000000000000000000000000000060448301351415610d64565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f65762ffffff6112046135a5565b166148440362ffffff81116112535762ffffff80611220614265565b169116039062ffffff821161123f5760208262ffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b50346103f657806003193601126103f6576020611282614265565b62ffffff60405191168152f35b50346103f657806003193601126103f6576020610c1d61420a565b50346103f657806003193601126103f65760206112826141c9565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65761135e366133ac565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506105d291505057604051635b54587d60e11b8152602090f35b50346103f6576101603660031901126103f6576113c361323d565b60a036602319011261087b5760603660c319011261087b576101243591610144356001600160401b03811161087b57611400903690600401613269565b90937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036119a15761143d614a2f565b839460e435928584129384159081611991575b81611983575b50611974578260801d600f0b918683125f1461196d57611475836136bf565b945b61147f614b6f565b156119145761148c614b87565b811561190557620f42406114a76114a1614854565b836136ac565b04965b8783156118f4576114bb9083613545565b80915b036118e55782156118de57505b925b7f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395c6114f761356a565b156118cf57602061150661358f565b604051634bf466a760e11b81526001600160a01b03909116600482015292839060249082905afa80156118c4578a90611890575b6115449250613545565b61154c61356a565b156117a85761155b9087613538565b620249f08402848104620249f0148515171561179457620f42409004106117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956915b6115ab8886614e42565b60a06040518160248237209360018060a01b031697889560405192835260208301526040820152a36115db61479e565b5f80516020615d908339815191525c6001600160a01b0316908161167a575b60408787805f80516020615db08339815191525d805f80516020615d908339815191525d807f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d81519063b47b2fb160e01b8252600f0b6020820152f35b85977f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef9695965c7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05c61170060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016936116f861356a565b9a369161443e565b6020815191012091833b15611781576101049689956040519b8c9a8b996321b0221b60e11b8b5260048b015260248a0152151560448901526064880152600f0b608487015260a486015260c485015260e48401525af1801561083e5761176c575b8080808086946115fa565b611777838092613403565b61087b575f611761565b8880fd5b637478d45560e11b8852600488fd5b634e487b7160e01b8a52601160045260248afd5b6117b486600f0b6136bf565b90620249f08202828104620249f0148315171561187c57620f4240810482118015611873575b61186457620f4240820290828204620f4240148315171561185057926118146118209361180e61181a94620f424097613545565b92613545565b9061368e565b856136ac565b0486116117855760607f8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956916115a1565b634e487b7160e01b8c52601160045260248cfd5b637478d45560e11b8b5260048bfd5b508282146117da565b634e487b7160e01b8b52601160045260248bfd5b506020823d6020116118bc575b816118aa60209383613403565b8101031261056157611544915161153a565b3d915061189d565b6040513d8c823e3d90fd5b60206118d9613579565b611506565b90506114cb565b6337e83fd360e21b8a5260048afd5b6118fe9083613538565b80916114be565b61190e81614dee565b966114aa565b919750811561195e57620f424061193261192c614854565b876136ac565b04915b61194a839684835f1461195057505b93614bc5565b986114cd565b61195991613538565b611944565b61196785614dee565b91611935565b8294611477565b63153f6ec760e21b8652600486fd5b905083600f0b14155f611456565b905061199b61356a565b90611450565b63570c108560e11b8452600484fd5b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f657806003193601126103f6577337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590611b48575b8015611b25575b8015611b14575b611b05576001600160401b0342166001600160401b03195f80516020615d308339815191525416175f80516020615d30833981519152556201518042018042116112535767ffffffffffffffff60401b805f80516020615d30833981519152549260401b16169067ffffffffffffffff60401b1916175f80516020615d30833981519152557fe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc60605f80516020615d30833981519152546001600160401b0360405191818116835260401c16602082015260026040820152a180f35b635c06dcc560e01b8152600490fd5b5067fffffffffffeae7f4211611a29565b506001600160401b035f80516020615d308339815191525460401c161515611a22565b50731f22e4b065b2f15fed5be556dc0fa636048d29bc331415611a1b565b50346103f657806003193601126103f65760206040516170808152f35b50346103f657611b92366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506105d29250505057604080516327c18fbf60e21b8152602081019290925290f35b50346103f657806003193601126103f65760206040516107d08152f35b50346103f657806003193601126103f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103f65760203660031901126103f6576004356001600160401b03811161087b57611c6d903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105d257611cbf611cab8484613fde565b604051918291602083526020830190613388565b0390f35b50346103f657806003193601126103f657608090611cdf614be6565b908115611d325750611cf7611cf2614c31565b614cce565b50505b5f80516020615e3083398151915254916001600160401b0360405193818116855260401c166020840152151560408301526060820152f35b611cfa565b50346103f657806003193601126103f6576020610c1d613ef1565b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f657611db9611db461323d565b6136cf565b80f35b50346103f657806003193601126103f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103f65760203660031901126103f6575f80516020615d70833981519152546001600160a01b03163303611ea457807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15611ea15781809160246040518094819363728b658960e01b835260043560048401525af1801561088757611e905750f35b81611e9a91613403565b6103f65780f35b50fd5b631d713add60e21b8152600490fd5b50346103f65760803660031901126103f6576004356001600160801b03811680910361087b5760405163cb2af14b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561083e578391612030575b506001600160a01b031633036120215781611f9491604051906002602083015260408201526024356060820152604435608082015260643560a082015260a08152611f7260c082613403565b604051809381926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610887578291611fff575b5060208180518101031261087b57602001516001600160801b03811680910361087b57602090610c1d61479e565b61201b91503d8084833e6120138183613403565b810190613453565b5f611fd1565b631d713add60e21b8252600482fd5b90506020813d602011612062575b8161204b60209383613403565b810103126108325761205c906134b5565b5f611f26565b3d915061203e565b50346103f657806003193601126103f6576020604051600c8152f35b3461056157610100366003190112610561576120a061323d565b5060a0366023190112610561576120b5613362565b506120be613378565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338190036121c157803b1561056157604051635275965160e01b8152906001600160a01b03612116613253565b1660048301526044356001600160a01b0381169081900361056157602483015260643562ffffff81168091036105615760448301526084358060020b80910361056157606483015260a4356001600160a01b03811691908290036105615760c4835f8193819560848401528160a48401525af180156121b6576121a6575b604051636fe7e6eb60e01b8152602090f35b5f6121b091613403565b5f612194565b6040513d5f823e3d90fd5b63570c108560e11b5f5260045ffd5b34610561575f366003190112610561576020611282613633565b34610561575f366003190112610561576339cbe26160e21b5f5260045ffd5b3461056157612217366132f9565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506121c1925050505760408051633615df3f60e11b81525f6020820152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576020604051620249f08152f35b34610561575f3660031901126105615760206112826135a5565b3461056157610140366003190112610561576122fb61323d565b60a03660231901126105615760603660c319011261056157610124356001600160401b03811161056157612333903690600401613269565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190338390036121c157604090612373614a2f565b61237b61356a565b9061239f60e43596879585519687958695638e88a1f160e01b8752600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f91612527575b505f80516020615db08339815191525d5f80516020615d908339815191525d61240361356a565b1561251857602061241261358f565b604051634bf466a760e11b81526001600160a01b03909116600482015291829060249082905afa9081156121b6575f916124e5575b50606091612486917f83a239371065e189089e503f28579cfa57df346fb8d652ab6f32bd7984cb02395d5f9061247b614b6f565b6124a7575b50614bc5565b60801b604051906315d7892d60e21b82526020820152624000006040820152f35b90505f6124b2614b87565b9112156124d7576124cf620f4240916124c9614854565b906136ac565b045b83612480565b6124e090614dee565b6124d1565b90506020813d602011612510575b8161250060209383613403565b8101031261056157516060612447565b3d91506124f3565b6020612522613579565b612412565b905061254b915060403d604011612551575b6125438183613403565b8101906134c9565b846123dc565b503d612539565b34610561575f3660031901126105615760805f80516020615d10833981519152546001600160401b038160401c1690814210155f146125da575f915b6001600160401b037ffabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8e549260ff6040519516855216602084015260408301526060820152f35b80831c60ff16156125ee5760025b91612594565b60016125e8565b34610561575f366003190112610561576020604051620151808152f35b34610561575f3660031901126105615760206040516101f48152f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f36600319011261056157604051632386aff360e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061053657602090604051908152f35b34610561575f366003190112610561575f80516020615d70833981519152546040516001600160a01b039091168152602090f35b34610561575f3660031901126105615760408051630f77314d60e31b815290816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f9061277257602090604051908152f35b506040813d60401161278c575b8161055060409383613403565b3d915061277f565b34610561575f3660031901126105615760405163428a634160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6576020915f916127fe575b506040519015158152f35b61281e9150823d8411612824575b6128168183613403565b810190613552565b826127f3565b503d61280c565b34610561575f3660031901126105615760206040516154608152f35b34610561575f36600319011261056157604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa80156121b6575f9061053657602090604051908152f35b34610561575f36600319011261056157604080515f6020820181905233828401529181526129129190611f72606082613403565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156121b657612956575b61295461479e565b005b612969903d805f833e6120138183613403565b61294c565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561576060366003190112610561576004356044356129e26129d461420a565b6129dc613ef1565b90613538565b90804211908115612d67575b508015612d5f575b8015612d57575b8015612d4c575b612d3d576040516318160ddd60e01b8152907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083600481845afa9283156121b6575f93612d09575b506040516370a0823160e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004820181905292909190602083602481855afa9283156121b6575f93612cd3575b5060408051600160208201523391810191909152612b0591905f90612ae381606081015b03601f198101835282613403565b604051809481926348c8949160e01b8352602060048401526024830190613388565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156121b657612b6792612b5f92612cbb575b50612b5161479e565b612b5961420a565b90613545565b612b59613ef1565b936040516318160ddd60e01b8152602081600481865afa9081156121b6575f91612c88575b50612b9990602092613545565b936024604051809481936370a0823160e01b835260048301525afa9081156121b6575f91612c54575b50612bd090612bd593613538565b613545565b918115908115612c4b575b8115612c38575b50612c29576040917f0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3838051848152836020820152a182519182526020820152f35b63873d73a960e01b5f5260045ffd5b9050612c448284614895565b1083612be7565b83159150612be0565b90506020813d602011612c80575b81612c6f60209383613403565b810103126105615751612bd5612bc2565b3d9150612c62565b90506020813d602011612cb3575b81612ca360209383613403565b8101031261056157516020612b8c565b3d9150612c96565b612cce903d805f833e6120138183613403565b612b48565b9092506020813d602011612d01575b81612cef60209383613403565b81010312610561575191612b05612ab1565b3d9150612ce2565b9092506020813d602011612d35575b81612d2560209383613403565b8101031261056157519184612a57565b3d9150612d18565b6333b094a160e01b5f5260045ffd5b506024358111612a04565b5080156129fd565b5081156129f6565b905061012c420190814211612d7d5711836129ee565b634e487b7160e01b5f52601160045260245ffd5b34610561575f366003190112610561576040516319b400eb60e21b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90612e02575b6040516001600160a01b039091168152602090f35b506020813d602011612e34575b81612e1c60209383613403565b8101031261056157612e2f6020916134b5565b612ded565b3d9150612e0f565b34610561575f366003190112610561576020604051620493e08152f35b3461056157612e6736613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163259982e560e01b8152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461056157612f4636613296565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506121c190505760405163021d0ee760e41b8152602090f35b3461056157608036600319011261056157612fa861323d565b60243590811515820361056157606435906001600160401b03821161056157612ffc92612fdb6040933690600401613269565b8451638e88a1f160e01b8152958694859491939160443591600487016134e6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f915f9161306e575b5062ffffff5f199116019062ffffff8211612d7d57604080516001600160a01b03909216825262ffffff929092166020820152f35b9050613089915060403d604011612551576125438183613403565b82613039565b34610561575f36600319011261056157602060405161a8c08152f35b34610561575f3660031901126105615760206040517f43c032f18f863bf5301f80e8812396bc62519b9c402f07184c2255d30d84788f8152f35b34610561575f366003190112610561576020610c1d614854565b34610561575f3660031901126105615730330361004c57604051630321f11f60e21b60208201526004815261295490613139602482613403565b61480d565b34610561575f366003190112610561576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610561575f3660031901126105615760408051600160208201523391810191909152612912905f90611f728160608101612ad5565b34610561575f3660031901126105615760206040515f8152f35b34610561575f3660031901126105615760605f80516020615d3083398151915254600262ffffff613201613633565b16146001600160401b0360405192818116845260401c1660208301526040820152f35b34610561575f3660031901126105615780600160209252f35b600435906001600160a01b038216820361056157565b602435906001600160a01b038216820361056157565b9181601f84011215610561578235916001600160401b038311610561576020838186019501011161056157565b90610160600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c49161014435906001600160401b038211610561576132f591600401613269565b9091565b906101a0600319830112610561576004356001600160a01b0381168103610561579160a060231982011261056157602491608060c3198301126105615760c4916101443591610164359161018435906001600160401b038211610561576132f591600401613269565b60c435906001600160a01b038216820361056157565b60e435908160020b820361056157565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b610120600319820112610561576004356001600160a01b0381168103610561579160a06023198301126105615760249160c4359160e4359161010435906001600160401b038211610561576132f591600401613269565b90601f801991011681019081106001600160401b0382111761342457604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161342457601f01601f191660200190565b602081830312610561578051906001600160401b038211610561570181601f820112156105615780519061348682613438565b926134946040519485613403565b8284526020838301011161056157815f9260208093018386015e8301015290565b51906001600160a01b038216820361056157565b91908260409103126105615760206134e0836134b5565b92015190565b93909285939260a09693600180891b0316865215156020860152604085015260806060850152816080850152848401375f828201840152601f01601f1916010190565b906154608201809211612d7d57565b91908201809211612d7d57565b91908203918211612d7d57565b90816020910312610561575180151581036105615790565b60c43580151581036105615790565b6044356001600160a01b03811681036105615790565b6024356001600160a01b03811681036105615790565b604051630abb87c960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613601575b506135fb575f90565b6107d090565b90506020813d60201161362b575b8161361c60209383613403565b8101031261056157515f6135f2565b3d915061360f565b5f80516020615d30833981519152546001600160401b038160401c16801515918261367a575b5081613670575b501561366b57600290565b600190565b905042105f613660565b6001600160401b031642101591505f613659565b8115613698570490565b634e487b7160e01b5f52601260045260245ffd5b81810292918115918404141715612d7d57565b600160ff1b8114612d7d575f0390565b7337bfb8ac7c960e558657871d41ca70e07e7dbfff3014801590613ed3575b613ec4575f6136fb614be6565b15613e855761370b611cf2614c31565b82939291845f80516020615e70833981519152557ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b2555f80516020615e3083398151915254906001600160401b0360c01b9060c01b16906001600160801b036001600160401b0360801b4260801b16911617175f80516020615e30833981519152556040519360a085018581106001600160401b03821117613424576040525f85526020850194731b54e762aa34cf6e28e9c082f2848e28e45da6b88652604081019562800000875260608201966001885260808301977337bfb8ac7c960e558657871d41ca70e07e7dbfff895261380560a08520614e1c565b60038101809111612d7d5760405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa80156121b6575f90613e4c575b6001600160801b039150169780158015613e44575b613de15761386d60a08620614e1c565b60405190631e2eaeaf60e01b825260048201526020816024816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91613e12575b506401000276a4996001600160a01b039190911691908a831115613e04576138d08360649261492c565b04809111613dfc575b5060016001607f1b038711613ded575b8615613de1576103e38102908082046103e31490151715612d7d576103e890046001600160a01b0316976401000276a3891115613dd9575b506e04444c5dc75cb358380d2e3de08a903b1561056157604051637a94c56560e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201528660448201525f81606481836e04444c5dc75cb358380d2e3de08a905af180156121b657613dc4575b50613998866136bf565b91604051606081018181106001600160401b03821117613db05760409081526001825260208083019586526001600160a01b03909b1682820190815290518b9590926139e48785613403565b8b8452604051633cf3645360e21b815289516001600160a01b039081166004830152895181166024830152955162ffffff166044820152955160020b60648701529c51841660848601529b51151560a48501529a5160c484015299511660e48201526101206101048201529788908190613a6390610124830190613388565b0381885a6e04444c5dc75cb358380d2e3de08a9090f1968715613cc2578597613d81575b506001600160801b03613a9f8860801d600f0b6136bf565b97169387818110613ce2575b613ac491505f80516020615e7083398151915254613545565b5f80516020615e708339815191525583613bd2575b5060a09020604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff600482015260248101859052909480826044816e04444c5dc75cb358380d2e3de08a905afa94851561056d5794613b80575b5050604080519586526020860192909252908401919091526001600160a01b0316917f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e9080606081015b0390a3565b90809450813d8311613bcb575b613b978183613403565b8101031261056157613b7b7f817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e935193613b31565b503d613b8d565b516001600160a01b03166e04444c5dc75cb358380d2e3de08a903b156109405760405190630b0d9c0960e01b825260048201527337bfb8ac7c960e558657871d41ca70e07e7dbfff60248201528360448201528481606481836e04444c5dc75cb358380d2e3de08a905af18015613cc257908591613ccd575b5050731b54e762aa34cf6e28e9c082f2848e28e45da6b83b15610aa357604051630852cd8d60e31b815260048101849052848160248183731b54e762aa34cf6e28e9c082f2848e28e45da6b85af18015613cc257908591613cad575b50613ad9565b81613cb791613403565b610aa357835f613ca7565b6040513d87823e3d90fd5b81613cd791613403565b610aa357835f613c4b565b613ceb91613545565b6e04444c5dc75cb358380d2e3de08a903b1561093c5760405190630ab714fb60e11b82527337bfb8ac7c960e558657871d41ca70e07e7dbfff600483015286602483015260448201528581606481836e04444c5dc75cb358380d2e3de08a905af18015613d7657908691613d61575b5087613aab565b81613d6b91613403565b61094057845f613d5a565b6040513d88823e3d90fd5b9096508581813d8311613da9575b613d998183613403565b810103126109405751955f613a87565b503d613d8f565b634e487b7160e01b8a52604160045260248afd5b613dd19197505f90613403565b5f955f61398e565b97505f613921565b50505050505050505050565b60016001607f1b0396506138e9565b96505f6138d9565b505050505050505050505050565b90506020813d602011613e3c575b81613e2d60209383613403565b8101031261056157515f6138a6565b3d9150613e20565b50881561385d565b506020813d602011613e7d575b81613e6660209383613403565b81010312610561576001600160801b039051613848565b3d9150613e59565b5030330361004c57604051631652585760e01b60208201526001600160a01b039091166024808301919091528152613ec290613139604482613403565b565b63271a26f160e01b5f5260045ffd5b507337bfb8ac7c960e558657871d41ca70e07e7dbfff3314156136ee565b604051627eeac760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000000000000000000000000000000000000000000000165afa9081156121b6575f91613f72575090565b90506020813d602011613f99575b81613f8d60209383613403565b81010312610561575190565b3d9150613f80565b359060ff8216820361056157565b3d15613fd9573d90613fc082613438565b91613fce6040519384613403565b82523d5f602084013e565b606090565b805f928101036020811261056157600260ff613ff984613fa1565b16036140b55760a01361087b5761400f81613fa1565b506020810135906001600160801b038216809203610832579082916080604051916020830193630fe1ea1160e01b855260248401526040810135604484015260608101356064840152013560848201526084815261406e60a482613403565b51907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af46140a4613faf565b90156140ad5790565b602081519101fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036121c1576040136105615760206140f782613fa1565b9101359060018060a01b0382168092036105615760ff168061416c575050303b156103f657604051630731a8c360e11b8152818160048183305af1801561088757908291614157575b50505b60405190614152602083613403565b815290565b8161416191613403565b6103f657805f614140565b6001036141ba57303b156105615760405190637d73714d60e01b825260048201525f8160248183305af180156121b6576141a7575b50614143565b6141b391505f90613403565b5f806141a1565b63091c731b60e31b5f5260045ffd5b5f80516020615d10833981519152546001600160401b038160401c164210156142035760801c60ff16156141fd57610dac90565b6105dc90565b506109c490565b604051627eeac760e11b81523060048201525f60248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f91613f72575090565b7f0000000000000000000000000000000000000000000000000000000000000000421061431a576040516340bd8e6960e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121b6575f916142e8575b506142e2575f90565b610dac90565b90506020813d602011614312575b8161430360209383613403565b8101031261056157515f6142d9565b3d91506142f6565b6040516318160ddd60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156121b6575f90614378575b63ffffffff16151590506142e2575f90565b506020813d6020116143b3575b8161439260209383613403565b81010312610561575163ffffffff811681036105615763ffffffff90614366565b3d9150614385565b3560ff811681036105615790565b903590601e198136030182121561056157018035906001600160401b0382116105615760200191813603831361056157565b3561ffff811681036105615790565b356001600160401b03811681036105615790565b906001600160401b03809116911603906001600160401b038211612d7d57565b92919261444a82613438565b916144586040519384613403565b829481845281830111610561578281602093845f960137010152565b6040516101e081018181106001600160401b03821117613424576145e76101c06042946001600160401b03936040525f60608601525f60808601525f60a08601525f60c08601525f60e08601525f6101008601525f6101208601525f6101408601525f6101608601525f6101808601525f6101a08601525f8286015280358552602081013560208601526040810135604086015260ff614516606083016143bb565b16606086015261453361452c60808301836143c9565b369161443e565b60208151910120608086015260a081013560a08601528361455660c0830161440a565b1660c08601528361456960e0830161440a565b1660e086015261010081013561010086015261012081013561012086015261ffff61459761014083016143fb565b1661014086015261ffff6145ae61016083016143fb565b1661016086015261ffff6145c561018083016143fb565b16610180860152836145da6101a0830161440a565b166101a08601520161440a565b166101c082015260405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fee3b0f8c46969f9c96cbdb258d9bc22f87f49dba9cd39b7a7f091505ea4b9ccd60408201527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260a0815261468060c082613403565b519020906001600160401b036101c0604051927f9c61a909d173aec816b2730e20b6caa3a25ca10c8a084dbf023e026e53874db4602085015280516040850152602081015160608501526040810151608085015260ff60608201511660a0850152608081015160c085015260a081015160e08501528260c0820151166101008501528260e08201511661012085015261010081015161014085015261012081015161016085015261ffff6101408201511661018085015261ffff610160820151166101a085015261ffff6101808201511682850152826101a0820151166101e0850152015116610200820152610200815261477d61022082613403565b602081519101206040519161190160f01b8352600283015260228201522090565b62028dd45a10613ec257604051637de4c18d60e01b81526020816004815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316620249f0f16147f25750565b61480a9060203d602011612824576128168183613403565b50565b80515f918291906020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af461484b613faf565b90156140ad5750565b5f80516020615db08339815191525c801561487d575b62ffffff165f198101908111612d7d5790565b50700dac0007d00005dc000bb80032c80059d961486a565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610561571461492557670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90606082901b905f19600160601b8409928280851094039380850394858411156105615714614925578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f19818509938380861095039480860395868511156105615714614a27579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b5f80516020615d508339815191525460ff8160b81c1615908115614b4f575b8115614b2f575b8115614ae5575b8115614ac4575b8115614aa4575b508015614a86575b614a7857565b62820f3560e61b5f5260045ffd5b5060643562ffffff8116808203610561576280000091501415614a72565b608435600281900b9250828103610561575060a01c60020b14155f614a6a565b905060a4356001600160a01b03811690818103610561575030141590614a63565b90506044356001600160a01b0381169081810361056157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141590614a5c565b90506024356001600160a01b038116908181036105615750151590614a55565b5f80516020615d70833981519152546001600160a01b0316159150614a4e565b60c4358015159081810361056157505f60e435121490565b60e4355f811290815f14614bc05760010190600182128015821691151617612d7d57614bb2906136bf565b60018101809111612d7d5790565b905090565b6001607f1b811015614bd757600f0b90565b6393dafdf160e01b5f5260045ffd5b5f80516020615e30833981519152546001600160401b038160401c168015159182614c1d575b5081614c16575090565b9050421090565b6001600160401b031642101591505f614c0c565b604051627eeac760e11b81527337bfb8ac7c960e558657871d41ca70e07e7dbfff60048201525f60248201526020816044816e04444c5dc75cb358380d2e3de08a905afa9081156121b6575f91614c9c575b5080614c8e57505f90565b5f198101908111612d7d5790565b90506020813d602011614cc6575b81614cb760209383613403565b8101031261056157515f614c83565b3d9150614caa565b905f80516020615e7083398151915254917ff808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b254915f80516020615e30833981519152548060c01c92614d208587613538565b8110613ec45784612bd087614d3493613545565b9084151580614dd9575b614d71575b5080614d4c5750565b9092614d589250613538565b906170804201804211612d7d576001600160401b031690565b94614d94919495844210155f14614d9b5750614d8e868092613538565b95613545565b925f614d43565b614dd26001600160401b03614d8e9260801c166001600160401b03614dca614dc38342613545565b928961441e565b1690896149af565b8092613538565b506001600160401b038160801c164211614d3e565b614e00614df9614854565b80926136ac565b90620f424003620f42408111612d7d57614e199161368e565b90565b604051602081019182526006604082015260408152614e3c606082613403565b51902090565b91907f00000000000000000000000000000000000000000000000000000000000000004210615666575f80516020615db08339815191525c801561564e575b62ffffff614e939160481c16846136ac565b604051630abb87c960e11b81525f94917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691620f424090910490602081600481865afa9081156121b6575f9161561c575b506155d1575f905b6040516340bd8e6960e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081600481855afa9081156121b6575f9161559f575b50615555575f5b5f80516020615db08339815191525c801561553d575b614f7762ffffff620f42409260301c16886136ac565b04945f80516020615d908339815191525c9284838a8a8a8a6001600160a01b038a166154df57612bd09250614fb994612bd0612bd092612bd05f998a98613545565b9481806154a5575b5050897f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ef5d7f0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514f05d83615449575b84615410575b620151806150427f000000000000000000000000000000000000000000000000000000000000000042613545565b049186615356575b50826151f5575b505050965f80516020615dd083398151915260405f80516020615df0833981519152945f80516020615e5083398151915282955f80516020615e108339815191529b9c6150b485519283928d846040919493926060820195825260208201520152565b0390a18151908882526020820152a18151908582526020820152a180615199575b6103e882049281841161518f575b83827f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf068161514f8161516d96612bd061511f8861518a9b613545565b887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b604080518981526020810192909252810191909152606090a1613545565b604051938493846040919493926060820195825260208201520152565b0390a1565b90925082906150e3565b6151f0816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6150d5565b8a9061522b84827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b1561087b578190602460405180948193632cd49aed60e01b83528860048401525af1801561534b57615332575b505f80516020615df0833981519152945f80516020615e508339815191526040955f80516020615e108339815191529b9c957ff548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea5f80516020615dd0833981519152968c6153228b987f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c0582408a5180615303848888846040919493926060820195825260208201520152565b0390a18951938493846040919493926060820195825260208201520152565b0390a1959c9b5095505094615051565b61533d8b8092613403565b615347575f61525a565b8980fd5b6040513d8d823e3d90fd5b61538a87827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528c60048401525af180156121b6576153fb575b5060408051898152602081018890529081018390527f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f86190606090a15f61504a565b615408919b505f90613403565b5f995f6153ba565b61544485307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b615014565b6154a0846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61500e565b6154d8917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b5f81614fc1565b614fb994612bd0612bd092612bd0620f424061551c612bd0985f80516020615db08339815191525c8015615525575b60901c62ffffff16906136ac565b04998a98613545565b50700dac0007d00005dc000bb80032c80059d961550e565b50700dac0007d00005dc000bb80032c80059d9614f61565b5f80516020615db08339815191525c8015615587575b61558162ffffff620f42409260781c16876136ac565b04614f4b565b50700dac0007d00005dc000bb80032c80059d961556b565b90506020813d6020116155c9575b816155ba60209383613403565b8101031261056157515f614f44565b3d91506155ad565b5f80516020615db08339815191525c8015615604575b6155fd62ffffff620f42409260601c16856136ac565b0490614ef5565b50700dac0007d00005dc000bb80032c80059d96155e7565b90506020813d602011615646575b8161563760209383613403565b8101031261056157515f614eed565b3d915061562a565b50700dac0007d00005dc000bb80032c80059d9614e81565b5f9260328104936105dc82028281046105dc1483151715612d7d57620f4240900492620f42406156a262ffffff61569b6135a5565b16856136ac565b0490620f42406156be62ffffff6156b7614265565b16866136ac565b04946156dc886156d688612bd087612bd08786613545565b93613545565b9582615b17575b81615ade575b836159bc575b80615841575b50604061518a945f80516020615dd08339815191528261516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152998651938493846040919493926060820195825260208201520152565b0390a18151908a82526020820152a18151908782526020820152a1846157e5575b847f30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf066103e8860496879361514f6157b58684613545565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c62565b61583c856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b61577e565b84808060246001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906158a190879083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b604051632cd49aed60e01b8152600481018790529485915af1156159b4575061518a945f80516020615dd0833981519152604061516d965f80516020615e508339815191525f80516020615e108339815191529c9d978b61575d5f80516020615df0833981519152997f29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240879a61598a6159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b7f00000000000000000000000000000000000000000000000000000000000000009061368e565b895186815260208101929092526040820152606090a199505050979d9c50509650505094506156f5565b3d86823e3d90fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690615a1790869083907f000000000000000000000000000000000000000000000000000000000000000016615c21565b803b15610561575f8091602460405180948193632cd49aed60e01b83528a60048401525af180156121b657615ac9575b507f6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861615ac1615aa26159636001600160401b037f00000000000000000000000000000000000000000000000000000000000000001642613545565b604051918291888b846040919493926060820195825260208201520152565b0390a16156ef565b615ad69195505f90613403565b5f935f615a47565b615b1282307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615c21565b6156e9565b615b6e836001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116907f000000000000000000000000000000000000000000000000000000000000000016615c21565b6156e3565b8151919060418303615ba357615b9c9250602082015190606060408401519301515f1a90615c8d565b9192909190565b50505f9160029190565b6004811015615c0d5780615bbf575050565b60018103615bd65763f645eedf60e01b5f5260045ffd5b60028103615bf1575063fce698f760e01b5f5260045260245ffd5b600314615bfb5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60645f92838093604051968793630ab714fb60e11b855260018060a01b0316600485015282602485015260448401525af115615c5a5750565b3d5f823e3d90fd5b60445f92838093604051968793636a770b0f60e01b8552600485015260248401525af115615c5a5750565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615d04579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156121b6575f516001600160a01b03811615615cfa57905f905f90565b505f906001905f90565b5050505f916003919056fefabd5ff66a0012e8cfd3120a82be7ed2b70ee7f379aae23ae9c34d9a27715d8dd5ccc9a085f7022bb20616af7bbc7e01242e18f7a415e423214526aa90e6532c03f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e26703f74db091e77cbe6523457e7debf0eaddfe0430c742870a0b3f8f4d2ee3e2680e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ee0e1a9fda79f7a3e970af67c920ce076dbb2252d8246701d38df22f0fc5e514ed03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df492127adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b453d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b1954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7f808ba03ded58bf379e2a2289d3b2a65afce6c4681c8b0f2de9d4dc5e92850b3a26469706673582212202613d0f54f9446fd7542bb37b9e3f78e228d101c7882da24a78241dee47739c464736f6c634300081a0033","sourceMap":"1530:10197:73:-:0;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;;16543:11:80;-1:-1:-1;;;;;1530:10197:73;16521:10:80;:34;16517:57;;1530:10197:73;16517:57:80;18064:10;;;16564;;1530:10197:73;16564:10:80;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12037:23:80;1530:10197:73;12037:23:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;18351:31:80;1530:10197:73;18351:31:80;;;1530:10197:73;;;;;;;;;;18232:29:80;1530:10197:73;18232:29:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1118:43:99;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;4249:46:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5962:5:97;1530:10197:73;;;;;;;;;;;;;;;;16875:15:80;1530:10197:73;;;-1:-1:-1;;;16810:83:80;;-1:-1:-1;;;;;16840:16:80;1530:10197:73;;;16810:83:80;;1530:10197:73;;;;;;;;;;;;;;16810:83:80;;1530:10197:73;;16810:11:80;1530:10197:73;16810:83:80;;;;;;;;;;1530:10197:73;;;;;;;;;16810:83:80;;1530:10197:73;16810:83:80;;1530:10197:73;16810:83:80;;;;;;1530:10197:73;16810:83:80;;;:::i;:::-;;;1530:10197:73;;;;;;;16810:83:80;;1530:10197:73;-1:-1:-1;1530:10197:73;;16810:83:80;;;-1:-1:-1;16810:83:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;1195:63:86;-1:-1:-1;;;1242:16:86;;1530:10197:73;;1242:16:86;1530:10197:73;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;6061:4:80;6070;-1:-1:-1;;;;;1530:10197:73;6053:21:80;;1530:10197:73;;6053:56:80;;;;1530:10197:73;6053:85:80;;;;1530:10197:73;6053:124:80;;;;1530:10197:73;6053:150:80;;;;1530:10197:73;6053:170:80;;;;1530:10197:73;6053:191:80;;;;;;1530:10197:73;6036:249:80;;3604:40;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;-1:-1:-1;;;;;;1530:10197:73;;;;;;;6336:11:80;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;;-1:-1:-1;;;1530:10197:73;-1:-1:-1;;;;;;1530:10197:73;;;;;;;;;;;;;;;;-1:-1:-1;;;6470:32:80;;1530:10197:73;;;;;;;;;6470:32:80;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;6516:32:80;;;:81;;;;1530:10197:73;6512:142:80;;;1530:10197:73;;6512:142:80;-1:-1:-1;;;6620:23:80;;1530:10197:73;;6620:23:80;6516:81;1530:10197:73;;-1:-1:-1;;;6574:23:80;;1530:10197:73;;-1:-1:-1;1530:10197:73;;;;6574:14:80;-1:-1:-1;;;;;1530:10197:73;6574:23:80;;;;;;;;;;;6516:81;-1:-1:-1;;;;;;1530:10197:73;6552:45:80;;6516:81;;;6574:23;;;1530:10197:73;6574:23:80;;1530:10197:73;6574:23:80;;;;;;1530:10197:73;6574:23:80;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;6574:23:80;;;1530:10197:73;;;;6574:23:80;;;-1:-1:-1;6574:23:80;;;1530:10197:73;;;;;;;;;6470:32:80;;;1530:10197:73;6470:32:80;;1530:10197:73;6470:32:80;;;;;;1530:10197:73;6470:32:80;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;6470:32:80;;;1530:10197:73;;;;6470:32:80;;;-1:-1:-1;6470:32:80;;;1530:10197:73;;;;;;;;;6036:249:80;-1:-1:-1;;;6262:23:80;;1530:10197:73;7310:23:80;6262;6053:191;6227:17;;;6053:191;;:170;6207:16;;;-1:-1:-1;6053:170:80;;;;:150;6181:17;;:22;;-1:-1:-1;6053:150:80;;:124;-1:-1:-1;;;;;1530:10197:73;;;6167:10:80;1530:10197:73;;;6158:19:80;;;-1:-1:-1;6053:124:80;;:85;-1:-1:-1;;;;;1530:10197:73;;6113:25:80;;-1:-1:-1;6053:85:80;;:56;3604:40;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;6078:31:80;;;-1:-1:-1;6053:56:80;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;6301:1;1530:10197;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;1195:63;;3604:40:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;6906:31:80;;;:56;;;;1530:10197:73;6906:87:80;;;;1530:10197:73;6906:151:80;;;;;;1530:10197:73;6906:200:80;;;;1530:10197:73;6906:256:80;;;;1530:10197:73;6906:300:80;;;;1530:10197:73;6906:355:80;;;;1530:10197:73;6906:386:80;;;;1530:10197:73;6889:444:80;;;-1:-1:-1;;;;;;;;;;;552:8:42;;-1:-1:-1;;;;552:8:42;-1:-1:-1;;;552:8:42;;;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;6906:386:80;-1:-1:-1;;;;;;;;;;;552:8:42;-1:-1:-1;;;;;1530:10197:73;;;;;7265:27:80;;;-1:-1:-1;6906:386:80;;;:355;7234:9;-1:-1:-1;7234:9:80;552:8:42;-1:-1:-1;;;;;1530:10197:73;;;;;;;;7256:4:80;;7226:35;;6906:355;;;1530:10197:73;;;;6906:300:80;7166:7;;;1530:10197:73;;;;;;;;;552:8:42;1530:10197:73;7166:40:80;;;6906:300;;;:256;7126:15;;;1530:10197:73;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;7126:36:80;;6906:256;;;:200;1530:10197:73;-1:-1:-1;;;;;;7077:13:80;;:::i;:::-;7095:11;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;7061:45:80;;;6906:200;;:151;1530:10197:73;-1:-1:-1;;;;;;7029:13:80;;:::i;:::-;1530:10197:73;7013:44:80;;6906:151;;;:87;-1:-1:-1;;;;;1530:10197:73;6966:27:80;;;-1:-1:-1;6906:87:80;;;;:56;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;-1:-1:-1;6906:56:80;;1195:63:86;-1:-1:-1;;;1242:16:86;;1530:10197:73;1242:16:86;;1530:10197:73;;;;;;;;;;;;;;;895:41:86;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;433:40:87;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;302:32:75;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2042:39:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;2873:13:87;;;1530:10197:73;2860:9:87;;1530:10197:73;2860:26:87;;;:67;;;1530:10197:73;2860:88:87;;;;1530:10197:73;2860:129:87;;;;1530:10197:73;2860:149:87;;;;1530:10197:73;2860:166:87;;;;1530:10197:73;2860:182:87;;;;1530:10197:73;2860:198:87;;;;1530:10197:73;2860:243:87;;;;1530:10197:73;2860:273:87;;;;1530:10197:73;2860:321:87;;;;1530:10197:73;2860:355:87;;;;1530:10197:73;2860:400:87;;;;1530:10197:73;2860:446:87;;;;1530:10197:73;2843:497:87;;1530:10197:73;3380:8:87;;;;;;:::i;:::-;3369:31;;;;;;1530:10197:73;;;;;1862:10:50;;1530:10197:73;1862:10:50;3457:16:87;;;:44;;;;1530:10197:73;3457:96:87;;;;1530:10197:73;3453:150:87;;-1:-1:-1;;;;;;;;;;;;;;;;1530:10197:73;;3661:27:87;;;3657:52;;5489:8:19;3737:16:87;1530:10197:73;5433:27:19;3737:16:87;;;;:::i;:::-;1530:10197:73;;;;:::i;:::-;5433:27:19;;:::i;:::-;5489:8;;;;;:::i;:::-;-1:-1:-1;;;;;3769:15:87;1530:10197:73;;;;3723:61:87;3719:96;;3940:29;-1:-1:-1;;;;;1530:10197:73;3940:29:87;;3984:11;3940:29;;4182:56;3940:29;;:::i;:::-;1530:10197:73;3984:11:87;;;;;;;:::i;:::-;1530:10197:73;3984:19:87;3980:44;;1530:10197:73;;;;2137:42:97;;-1:-1:-1;;;;;;;;;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;-1:-1:-1;;;;;;;;;;;2137:42:97;-1:-1:-1;;;2137:42:97;1530:10197:73;2137:42:97;;;-1:-1:-1;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;;;;4116:16:87;3380:8;1653:42:73;1530:10197;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;1653:42;;4142:11:87;1653:42:73;1530:10197;;;;3380:8:87;1530:10197:73;;;;;;;;;;;;;;;;4182:56:87;1530:10197:73;;3980:44:87;4013:11;;;;;;;:::i;:::-;3980:44;;;;3719:96;-1:-1:-1;;;3793:22:87;;1530:10197:73;3793:22:87;;3657:52;-1:-1:-1;;;3697:12:87;;1530:10197:73;3697:12:87;;3453:150;-1:-1:-1;;;3576:16:87;;1530:10197:73;3324:16:87;3576;3457:96;3505:29;;;;:::i;:::-;3538:15;-1:-1:-1;3505:48:87;3457:96;;:44;3491:10;-1:-1:-1;;;;;3491:10:87;;;;;:::i;:::-;1530:10197:73;3477:24:87;;3457:44;;2843:497;-1:-1:-1;;;3324:16:87;;1530:10197:73;3324:16:87;;2860:446;3264:11;570:7;-1:-1:-1;;;;;3264:24:87;:11;;;;;:::i;:::-;3278:10;;;;;:::i;:::-;3264:24;;:::i;:::-;1530:10197:73;3264:42:87;2860:446;;:400;3235:11;;;;;;:::i;:::-;-1:-1:-1;;;;;3250:10:87;;;;;;:::i;:::-;1530:10197:73;;;3235:25:87;;2860:400;;:355;3185:11;;;;;;:::i;:::-;-1:-1:-1;;;;;3200:15:87;1530:10197:73;;3185:30:87;;2860:355;;:321;3153:10;;;;;;:::i;:::-;-1:-1:-1;;;;;3166:15:87;1530:10197:73;;3153:28:87;2860:321;;:273;3107:12;;;;1530:10197:73;3107:26:87;2860:273;;:243;1530:10197:73;;;3078:25:87;2860:243;;:198;3046:8;3057:1;623:33;3046:8;;;;;:::i;:::-;623:33;3046:12;2860:198;;:182;3030:8;1530:10197:73;623:33:87;3030:8;;;;;:::i;:::-;623:33;3030:12;2860:182;;:166;3013:8;1530:10197:73;623:33:87;3013:8;;;;;:::i;:::-;623:33;3013:13;;2860:166;;:149;2993:11;3008:1;623:33;2993:11;;;;;:::i;:::-;623:33;2993:16;;2860:149;;:129;2968:8;1530:10197:73;2968:8:87;;;;;;:::i;:::-;:21;;;;2860:129;;:88;2931:12;2947:1;1530:10197:73;2931:12:87;;;;;:::i;:::-;1530:10197:73;2931:17:87;;2860:88;;:67;2908:19;;2890:14;;;1530:10197:73;2890:37:87;;2860:67;;1530:10197:73;;;;;;;;;;;;;;;681:43:98;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;6454:20:97;;:::i;:::-;1530:10197:73;;;;;;;;;6477:14:97;;;:::i;:::-;1530:10197:73;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;2435:59;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;2240:50:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;;1199:10:86;:34;;;1195:63;;8799:3:80;;:::i;:::-;10468:18;1530:10197:73;10520:22:80;1530:10197:73;10520:26:80;;;;10560:11;;;:32;;;;1530:10197:73;10560:85:80;;;1530:10197:73;10556:143:80;;;2052:83:53;;;1530:10197:73;;10771:69:80;:12;;;:69;1530:10197:73;;;10794:17:80;;;:::i;:::-;10771:69;;10898:24;;:::i;:::-;;;;10958;;:::i;:::-;11002:70;;;;1880:9:72;1867:12;1873:6;;:::i;:::-;1867:12;;:::i;:::-;1862:10:50;11002:70:80;;10996:76;11105:46;;;;11118:15;;;;:::i;:::-;11105:46;;;11169:21;11165:53;;11240:33;;;;;;10894:601;;14109:49;14586:34;14678:17;;:::i;:::-;:45;;;1530:10197:73;14696:13:80;;:::i;:::-;1530:10197:73;;-1:-1:-1;;;14646:78:80;;-1:-1:-1;;;;;1530:10197:73;;;;14646:78:80;;1530:10197:73;;;;;;;;14646:78:80;;;;;;;;;;14678:45;14646:89;;;;:::i;:::-;14748:17;;:::i;:::-;;;;14783:12;;;;:::i;:::-;14802:7;1862:10:50;;;;;14802:7:80;1862:10:50;;;;;;;14810:9:80;1862:10:50;;-1:-1:-1;14780:66:80;;1530:10197:73;11594:71:80;14745:613;;11575:3;;;;:::i;:::-;1530:10197:73;;15460:143:80;;1530:10197:73;15460:143:80;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;11594:71:80;9428:6;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1314:35:72;-1:-1:-1;;;;;1530:10197:73;;;7487:225;;14745:613:80;1530:10197:73;1699:90:72;;;-1:-1:-1;;;;;;;;;;;1699:90:72;;-1:-1:-1;;;;;;;;;;;1699:90:72;;;;;;1530:10197:73;;9554:25:80;;;;1530:10197:73;;;;;;;;;7487:225;1587:59:72;;;;;;;;;1530:10197:73;;;;;;7593:10;1530:10197;7625:17;;;:::i;:::-;1530:10197;;;;:::i;:::-;;;;;;7685:15;7593:108;;;;;;;1530:10197;;;;;;;;;;;;;7593:108;;1530:10197;7593:108;;1530:10197;;;;;;;;;;;;;;;;2241:89:53;1530:10197:73;;;;;;;;;;;;10520:22:80;1530:10197:73;;;7593:108;;;;;;;;7487:225;;;;;;;;;7593:108;;;;;;:::i;:::-;1530:10197;;7593:108;;;;1530:10197;;;14780:66:80;-1:-1:-1;;;14828:18:80;;1530:10197:73;15169:18:80;14828;1862:10:50;-1:-1:-1;;;1530:10197:73;;;;;;;;14745:613:80;14897:24;2241:89:53;1530:10197:73;2241:89:53;14897:24:80;:::i;:::-;1862:10:50;15124:7:80;1862:10:50;;;;;15124:7:80;1862:10:50;;;;;;;15132:9:80;1862:10:50;;15109:32:80;;:51;;;;14745:613;15106:81;;15132:9;1862:10:50;;;;;;15132:9:80;1862:10:50;;;;;;;15222:32:80;15257:14;15293:17;15222:32;;15221:51;15222:32;15132:9;15222:32;;:::i;:::-;15257:14;;:::i;:::-;15221:51;;:::i;:::-;15293:17;;:::i;:::-;1862:10:50;15289:31:80;;15286:61;;1530:10197:73;11594:71:80;14745:613;;;1862:10:50;-1:-1:-1;;;1530:10197:73;;;;;;;;15106:81:80;-1:-1:-1;;;15169:18:80;;1530:10197:73;15169:18:80;;15109:51;15145:15;;;;15109:51;;1862:10:50;-1:-1:-1;;;1530:10197:73;;;;;;;;14646:78:80;;1530:10197:73;14646:78:80;;1530:10197:73;14646:78:80;;;;;;1530:10197:73;14646:78:80;;;:::i;:::-;;;1530:10197:73;;;;14646:89:80;1530:10197:73;;14646:78:80;;;;;-1:-1:-1;14646:78:80;;;1530:10197:73;;;;;;;;;14678:45:80;1530:10197:73;14710:13:80;;:::i;:::-;14678:45;;11240:33;;;;;11165:53;-1:-1:-1;;;11199:19:80;;1530:10197:73;11199:19:80;;11105:46;11136:15;;;;:::i;:::-;11105:46;;;;11002:70;795:26:81;;;:::i;:::-;11002:70:80;;;10894:601;11310:70;;-1:-1:-1;11310:70:80;;;;1880:9:72;1867:12;1873:6;;:::i;:::-;1867:12;;:::i;:::-;1862:10:50;11310:70:80;;11470:14;11304:76;11402:40;;;;;;;;;11470:14;;:::i;:::-;10894:601;;;11402:40;11427:15;;;:::i;:::-;11402:40;;11310:70;795:26:81;;;:::i;:::-;11310:70:80;;;10771:69;;;;;10556:143;-1:-1:-1;;;10668:20:80;;1530:10197:73;10668:20:80;;10560:85;2241:89:53;;;;;10596:49:80;;10560:85;;;:32;10575:17;;;;:::i;:::-;10560:32;;;1195:63:86;-1:-1:-1;;;1242:16:86;;1530:10197:73;1242:16:86;;1530:10197:73;;;;;;;;;;;;;;;;730:43:98;1530:10197:73;;;;;;;;;;;;;;;;1653:42;6724:4:97;6716:21;;;:52;;;1530:10197:73;6716:69:97;;;;1530:10197:73;6716:147:97;;;;1530:10197:73;6699:206:97;;-1:-1:-1;;;;;6935:15:97;1530:10197:73;-1:-1:-1;;;;;2137:42:97;-1:-1:-1;;;;;;;;;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;2320:8;6935:15;1530:10197:73;6935:15:97;;1530:10197:73;;;-1:-1:-1;;;2137:42:97;-1:-1:-1;;;;;;;;;;;2137:42:97;;1530:10197:73;2137:42:97;;;;-1:-1:-1;;;2137:42:97;;;-1:-1:-1;;;;;;;;;;;2137:42:97;7034:45;2137:42;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;2137:42:97;;;1530:10197:73;7077:1:97;1530:10197:73;2137:42:97;;1530:10197:73;7034:45:97;1530:10197:73;;6699:206:97;-1:-1:-1;;;6881:24:97;;1530:10197:73;;6881:24:97;6716:147;6805:15;1530:10197:73;6805:15:97;:58;6716:147;;:69;1530:10197:73;-1:-1:-1;;;;;;;;;;;;;;;;1530:10197:73;;;;6772:13:97;;6716:69;;:52;6741:10;2137:42;6741:10;:27;;6716:52;;1530:10197:73;;;;;;;;;;;;;;;;1998:7;1530:10197;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;;1195:63:86;1530:10197:73;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;2379:5:97;1530:10197:73;;;;;;;;;;;;;;;;;;;479:44:87;1530:10197:73;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;1195:63;;1530:10197:73;5200:676:97;;;;:::i;:::-;1530:10197:73;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;8282:10;;;:::i;:::-;8326:71;;;;;8348:10;8335:24;8348:10;;:::i;:::-;8335:24;:::i;:::-;8326:71;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;8326:71;;;1530:10197;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;2296:39:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;2856:40:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;12410:10:80;:36;12406:66;;1530:10197:73;12482:14:80;-1:-1:-1;;;;;1530:10197:73;12482:34:80;;;;;1530:10197:73;;;12482:34:80;1530:10197:73;;;;;;;;;12482:34:80;;1530:10197:73;;;12482:34:80;;1530:10197:73;12482:34:80;;;;;;;;1530:10197:73;;12482:34:80;;;;;:::i;:::-;1530:10197:73;;12482:34:80;1530:10197:73;12482:34:80;1530:10197:73;;12406:66:80;-1:-1:-1;;;12455:17:80;;1530:10197:73;;12455:17:80;1530:10197:73;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;-1:-1:-1;;;4921:32:97;;1530:10197:73;;;;4921:16:97;-1:-1:-1;;;;;1530:10197:73;4921:32:97;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;1530:10197:73;4907:10:97;:46;4903:76;;1530:10197:73;;;;;5030:71:97;5047:1;1530:10197:73;5030:71:97;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;5030:71:97;;;;;;:::i;:::-;1530:10197:73;;;;;;;;;5011:91:97;;1530:10197:73;;5011:91:97;;1530:10197:73;;;;;;:::i;:::-;5011:91:97;1530:10197:73;;5011:11:97;-1:-1:-1;;;;;1530:10197:73;5011:91:97;;;;;;;;;;;1530:10197:73;;;;;;5124:29:97;;1530:10197:73;;;;;5124:29:97;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;5112:41:97;;;:::i;5011:91::-;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;4903:76;-1:-1:-1;;;4962:17:97;;1530:10197:73;4962:17:97;;4921:32;;;1530:10197:73;4921:32:97;;1530:10197:73;4921:32:97;;;;;;1530:10197:73;4921:32:97;;;:::i;:::-;;;1530:10197:73;;;;;;;:::i;:::-;4921:32:97;;;;;;-1:-1:-1;4921:32:97;;1530:10197:73;;;;;;;;;;;;;;;;386:10:75;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;-1:-1:-1;1530:10197:73;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;;1195:63;;7602:38:80;;;;;1530:10197:73;;-1:-1:-1;;;7602:38:80;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;:::i;:::-;;;7602:38:80;;1530:10197:73;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;7602:38:80;;;;;;;;1530:10197:73;;;-1:-1:-1;;;1530:10197:73;;;;;7602:38:80;1530:10197:73;7602:38:80;;;:::i;:::-;1530:10197:73;7602:38:80;;;1530:10197:73;;;;;;;;;1195:63:86;1242:16;;;1530:10197:73;1242:16:86;1530:10197:73;;1242:16:86;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1530:10197:73;;;;7811:19;;;1530:10197;7811:19;1530:10197;;7811:19;1530:10197;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;;;1195:63:86;1530:10197:73;;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;1137:49:83;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;1234:7:83;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;:::i;:::-;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;;;1199:10:86;:34;;;1195:63;;1530:10197:73;7947:3:80;;;:::i;:::-;7180:17:73;;:::i;:::-;1530:10197;7156:70;7198:22;1530:10197;;;;;;;;;;;;;;7156:70;;1530:10197;7156:70;;;:::i;:::-;;1530:10197;7156:10;-1:-1:-1;;;;;1530:10197:73;7156:70;;;;;;1530:10197;;;7156:70;;;1530:10197;831:64:72;-1:-1:-1;;;;;;;;;;;831:64:72;-1:-1:-1;;;;;;;;;;;831:64:72;8040:17:80;;:::i;:::-;:49;;;1530:10197:73;8060:13:80;;:::i;:::-;1530:10197:73;;-1:-1:-1;;;14269:38:80;;-1:-1:-1;;;;;1530:10197:73;;;;14269:38:80;;1530:10197:73;;;;;;;;14269:38:80;;;;;;;1530:10197:73;14269:38:80;;;8040:49;14349:29;1530:10197:73;14349:29:80;8477:14;14349:29;14109:49;14349:29;1530:10197:73;8125:24:80;;;:::i;:::-;8121:293;;8040:49;8477:14;;:::i;:::-;453:132:54;;1530:10197:73;;8431:26:80;;;;1530:10197:73;;;;;;819:8:42;1530:10197:73;;;;;8121:293:80;8185:24;;1530:10197:73;8185:24:80;;:::i;:::-;8229:86;:26;1530:10197:73;;;1867:12:72;1880:9;673:30:81;1873:6:72;;:::i;:::-;1867:12;;:::i;:::-;1862:10:50;8229:86:80;8121:293;;;8229:86;795:26:81;;;:::i;:::-;8229:86:80;;14269:38;;;1530:10197:73;14269:38:80;;1530:10197:73;14269:38:80;;;;;;1530:10197:73;14269:38:80;;;:::i;:::-;;;1530:10197:73;;;;;;14269:38:80;;;;;-1:-1:-1;14269:38:80;;8040:49;1530:10197:73;8076:13:80;;:::i;:::-;8040:49;;7156:70:73;;;;;;1530:10197;7156:70;1530:10197;7156:70;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1530:10197;;;;;;-1:-1:-1;;1530:10197:73;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;4793:51:87;:15;;:31;;:51;:31;;;1530:10197:73;4793:51:87;;-1:-1:-1;;;;;4874:11:87;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;4793:51:87;1530:10197:73;;;;;;;;4839:1:87;4831:13;4793:51;;;4831:13;4843:1;4831:13;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2320:8:97;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2033:3:80;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;743:29:82;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;18232:29:80;;;1530:10197:73;;;18232:9:80;-1:-1:-1;;;;;1530:10197:73;18232:29:80;;;;;;1530:10197:73;18232:29:80;;;;1530:10197:73;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;12276:25:80;;1530:10197:73;;;;12276:14:80;-1:-1:-1;;;;;1530:10197:73;12276:25:80;;;;;;1530:10197:73;12276:25:80;;;1530:10197:73;;;;;;;;12276:25:80;;1530:10197:73;12276:25:80;;1530:10197:73;12276:25:80;;;;;;1530:10197:73;12276:25:80;;;:::i;:::-;;;-1:-1:-1;12276:25:80;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;18351:31:80;;;1530:10197:73;;;18351:9:80;-1:-1:-1;;;;;1530:10197:73;18351:31:80;;;;;;;;1530:10197:73;18351:31:80;;;1530:10197:73;;;;;;;;;;18351:31:80;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;570:7:87;1530:10197:73;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;16665:51:80;;-1:-1:-1;;;;;16695:16:80;1530:10197:73;;;16665:51:80;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;;;16665:51:80;;1530:10197:73;;16665:11:80;1530:10197:73;16665:51:80;;;;;;1530:10197:73;16665:51:80;;;1530:10197:73;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;17064:32:80;;;1530:10197:73;;;17085:10:80;1530:10197:73;;;;17064:32:80;;;1530:10197:73;;;17064:32:80;1530:10197:73;;17064:32:80;:::i;1530:10197:73:-;17045:52:80;1530:10197:73;;17045:11:80;-1:-1:-1;;;;;1530:10197:73;17045:52:80;;;;;;;;1530:10197:73;17045:52:80;;:::i;:::-;1530:10197:73;17045:52:80;;;;;1530:10197:73;17045:52:80;;;;;;:::i;:::-;;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;1860:58:97;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;1600:35:96;:16;;:::i;:::-;1619;;:::i;:::-;1600:35;;:::i;:::-;1649:15;;;:26;:68;;;;;1530:10197:73;1649:108:96;;;;;1530:10197:73;1649:124:96;;;;1530:10197:73;1649:155:96;;;;1530:10197:73;1645:182:96;;1530:10197:73;;-1:-1:-1;;;1945:19:96;;1530:10197:73;1852:13:96;-1:-1:-1;;;;;1530:10197:73;;;;;;1945:19:96;;;;;;;1530:10197:73;1945:19:96;;;1530:10197:73;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;1998:26:96;;1895:17;-1:-1:-1;;;;;1530:10197:73;;1998:26:96;;1530:10197:73;;;;;;;;;;;;1998:26:96;;;;;;;1530:10197:73;1998:26:96;;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;2053:32:96;;1530:10197:73;2074:10:96;1530:10197:73;;;;;;;;;;;;2053:32:96;1530:10197:73;;;;2053:32:96;;17294::80;;2053::96;;;;;;:::i;:::-;1530:10197:73;;;;;;;;;2034:52:96;;1530:10197:73;;2034:52:96;;1530:10197:73;;;;;;:::i;:::-;2034:52:96;1530:10197:73;;2034:11:96;-1:-1:-1;;;;;1530:10197:73;2034:52:96;;;;;;;2141:45;2034:52;2141:26;2034:52;;;1530:10197:73;2034:52:96;;;:::i;:::-;2151:16;;:::i;:::-;2141:26;;:::i;:::-;2170:16;;:::i;2141:45::-;1530:10197:73;;;;;;2228:19:96;;1530:10197:73;2228:19:96;1530:10197:73;2228:19:96;;;;;;;;;1530:10197:73;2228:19:96;;;1530:10197:73;2213:34:96;;;1530:10197:73;2213:34:96;;:::i;:::-;1530:10197:73;;;;;;;;;;;2250:26:96;;1530:10197:73;2250:26:96;;1530:10197:73;2250:26:96;;;;;;;1530:10197:73;2250:26:96;;;1530:10197:73;2213:63:96;;;:79;:63;;:::i;:::-;:79;:::i;:::-;2306:13;;;:36;;;;;1530:10197:73;2306:124:96;;;;1530:10197:73;2302:156:96;;;1530:10197:73;;2473:47:96;1530:10197:73;;;;;;;;;;;2473:47:96;1530:10197:73;;;;;;;;;;2302:156:96;2439:19;;;1530:10197:73;2439:19:96;1530:10197:73;;2439:19:96;2306:124;2358:50;;;;;;:::i;:::-;:72;2306:124;;;:36;2323:19;;;-1:-1:-1;2306:36:96;;2250:26;;;1530:10197:73;2250:26:96;;1530:10197:73;2250:26:96;;;;;;1530:10197:73;2250:26:96;;;:::i;:::-;;;1530:10197:73;;;;;2213:79:96;2250:26;;;;;-1:-1:-1;2250:26:96;;2228:19;;;1530:10197:73;2228:19:96;;1530:10197:73;2228:19:96;;;;;;1530:10197:73;2228:19:96;;;:::i;:::-;;;1530:10197:73;;;;;;2228:19:96;;;;;-1:-1:-1;2228:19:96;;2034:52;;;;;1530:10197:73;2034:52:96;;;;;;:::i;:::-;;;1998:26;;;;1530:10197:73;1998:26:96;;1530:10197:73;1998:26:96;;;;;;1530:10197:73;1998:26:96;;;:::i;:::-;;;1530:10197:73;;;;;;;1998:26:96;;;;;-1:-1:-1;1998:26:96;;1945:19;;;;1530:10197:73;1945:19:96;;1530:10197:73;1945:19:96;;;;;;1530:10197:73;1945:19:96;;;:::i;:::-;;;1530:10197:73;;;;;1945:19:96;;;;;;;-1:-1:-1;1945:19:96;;1645:182;1813:14;;;1530:10197:73;1813:14:96;1530:10197:73;;1813:14:96;1649:155;1530:10197:73;;;1777:27:96;;1649:155;;:124;1761:12;;;1649:124;;:108;1733:24;;;1649:108;;:68;:15;;1708:9;1649:15;1530:10197:73;1649:15:96;;;1530:10197:73;;;1679:38:96;1649:68;;;1530:10197:73;;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;-1:-1:-1;;;12037:23:80;;;1530:10197:73;;;12037:11:80;-1:-1:-1;;;;;1530:10197:73;12037:23:80;;;;;;1530:10197:73;12037:23:80;;;1530:10197:73;;;-1:-1:-1;;;;;1530:10197:73;;;;;12037:23:80;;1530:10197:73;12037:23:80;;;;;;;;;;;;;;;;:::i;:::-;;;1530:10197:73;;;;;12037:23:80;1530:10197:73;;:::i;:::-;12037:23:80;;;;;-1:-1:-1;12037:23:80;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2131:7:80;1530:10197:73;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;2500:46;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;4301:48:80;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;;-1:-1:-1;1195:63:86;;-1:-1:-1;1195:63:86;1530:10197:73;;-1:-1:-1;;;1530:10197:73;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;6878:49;1530:10197;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;6878:49:73;;1530:10197;;;;;;;;;;;;6878:49;;;:::i;:::-;;1530:10197;6878:10;-1:-1:-1;;;;;1530:10197:73;6878:49;;;;;;1530:10197;;;6878:49;;;1530:10197;6947:27;1530:10197;;;6954:17;;1530:10197;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;6878:49;;;;;;1530:10197;6878:49;1530:10197;6878:49;;;;;;;:::i;:::-;;;;1530:10197;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;2046:8;1530:10197;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;6376:23;1530:10197;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;6560:21;;:::i;1530:10197::-;;;;;;-1:-1:-1;;1530:10197:73;;;;18050:4:80;18028:10;:27;18024:50;;1530:10197:73;;-1:-1:-1;;;18093:49:80;;;;1530:10197:73;18093:49:80;;;;;;1530:10197:73;18093:49:80;:::i;:::-;;:::i;1530:10197:73:-;;;;;;-1:-1:-1;;1530:10197:73;;;;;;1812:42:97;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;17294:32:80;;;1530:10197:73;17315:10:80;1530:10197:73;;;;;;;;;;;17294:32:80;1530:10197:73;;;;17294:32:80;1530:10197:73;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;7292:1:97;1530:10197:73;7270:18:97;;:::i;:::-;1530:10197:73;7270:23:97;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;1171:4:96;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;:::i;:::-;;;:::o;:::-;;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;:::o;:::-;;-1:-1:-1;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;;1530:10197:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;:::i;:::-;;;17294:32:80;;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;;;-1:-1:-1;1530:10197:73;;;;;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;;-1:-1:-1;;1530:10197:73;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1530:10197:73;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1530:10197:73;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;8076:13:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;5980:149:97:-;1530:10197:73;;-1:-1:-1;;;6065:26:97;;;1530:10197:73;6065:26:97;1530:10197:73;6065:9:97;-1:-1:-1;;;;;1530:10197:73;6065:26:97;;;;;;;-1:-1:-1;6065:26:97;;;5980:149;-1:-1:-1;6065:31:97;;-1:-1:-1;5980:149:97;:::o;6065:57::-;2379:5;5980:149;:::o;6065:26::-;;;;;;;;;;;;;1530:10197:73;6065:26:97;;;:::i;:::-;;;1530:10197:73;;;;;6065:26:97;;;;;;-1:-1:-1;6065:26:97;;7307:207;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;7423:13:97;;;:46;;;;7307:207;7423:76;;;;7307:207;-1:-1:-1;7423:84:97;;;7502:1;;7307:207::o;7423:84::-;7506:1;;7307:207::o;7423:76::-;7473:15;;;:26;7423:76;;;:46;-1:-1:-1;;;;;1530:10197:73;7440:15:97;:29;;;-1:-1:-1;7423:46:97;;;1862:10:50;;;;;;;:::o;:::-;1530:10197:73;;;1862:10:50;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;1862:10:50;;;;;;;:::o;8468:1956:73:-;1653:42;8557:4;8549:21;;;:43;;;8468:1956;8545:72;;-1:-1:-1;8674:10:73;;:::i;:::-;8673:11;8669:69;;8800:24;8813:10;;:::i;8800:24::-;8747:77;;;1653:42;;-1:-1:-1;;;;;;;;;;;1653:42:73;8867:11;1653:42;-1:-1:-1;;;;;;;;;;;1653:42:73;;-1:-1:-1;;;;;1653:42:73;;;;;;;-1:-1:-1;;;;;;;;;;1653:42:73;;8919:15;1653:42;;;;;;;-1:-1:-1;;;;;;;;;;;1653:42:73;1530:10197;;;1815:42;1530:10197;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;-1:-1:-1;1815:42:73;;9002:83;;;1815:42;;;;1530:10197;9002:83;;1815:42;9059:8;1815:42;;9002:83;;;1815:42;8867:11;1815:42;;1653;9002:83;;1815:42;1653;1815;;8371:25:49;1815:42:73;357:173:56;;8371:25:49;:::i;:::-;690:1;1530:10197:73;;;;;;;;;;;;;8550:22:49;;;;;1530:10197:73;9002:83;8550:22:49;;;1916:42:73;8550:22:49;;;;;;-1:-1:-1;8550:22:49;;;8468:1956:73;-1:-1:-1;;;;;1530:10197:73;;;9161:11;;;:29;;;;8468:1956;9157:42;;1841:25:49;1815:42:73;357:173:56;;1841:25:49;:::i;:::-;1530:10197:73;;;;;;1892:27:49;;8550:22;1892:27;;1530:10197:73;9002:83;1892:27:49;8550:22;1892:27;1916:42:73;1892:27:49;;;;;;;-1:-1:-1;1892:27:49;;;8468:1956:73;-1:-1:-1;1862:10:50;;-1:-1:-1;;;;;2147:423:49;;;;;9280:27:73;9271:36;;;;9267:49;;9434:60;;9497:3;9434:60;;:::i;:::-;1862:10:50;9514:17:73;;;9510:40;;8468:1956;9564:43;-1:-1:-1;;;;;9564:43:73;;9560:92;;8468:1956;9666:11;;9662:24;;9736:3;1862:10:50;;;;;;9736:3:73;1862:10:50;;;;;;;9742:4:73;1862:10:50;;-1:-1:-1;;;;;1530:10197:73;;1862:10:50;9761:32:73;;;9757:73;;8468:1956;9840:29;1916:42;9840:29;;;;1530:10197;;;;;9840:29;;1653:42;8550:22:49;9840:29:73;;1530:10197;-1:-1:-1;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;;;1530:10197:73;-1:-1:-1;9840:29:73;9497:3;9840:29;;1916:42;9840:29;;;;;;;;8468:1956;9936:15;;;;:::i;:::-;1530:10197;;;9002:83;1530:10197;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;8867:11;1862:10:50;;9002:83:73;9919:40;;;1862:10:50;;;-1:-1:-1;;;;;1530:10197:73;;;9919:40;;;1815:42;;;1530:10197;;9002:83;;1530:10197;;;9002:83;1530:10197;;:::i;:::-;1862:10:50;;;1530:10197:73;;-1:-1:-1;;;9901:70:73;;1862:10:50;;-1:-1:-1;;;;;1530:10197:73;;;8550:22:49;9901:70:73;;1530:10197;1862:10:50;;1530:10197:73;;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;1530:10197:73;;1862:10:50;;;1530:10197:73;1862:10:50;;8834:14:73;1530:10197;9497:3;1862:10:50;;1530:10197:73;1862:10:50;;1530:10197:73;;1862:10:50;;;1530:10197:73;1862:10:50;;1530:10197:73;;1862:10:50;;;1530:10197:73;1862:10:50;;;;;1530:10197:73;1862:10:50;;1530:10197:73;1862:10:50;;;1530:10197:73;1862:10:50;;;;;1530:10197:73;;;;;1862:10:50;;;;;;;:::i;:::-;9901:70:73;;;;1916:42;9901:70;;;;;;;;;;;8468:1956;2052:83:53;-1:-1:-1;;;;;10005:25:73;2052:83:53;1653:42:73;2052:83:53;1530:10197:73;;10005:25;:::i;:::-;1530:10197;;10106:14;;;;;10102:57;;8468:1956;10169:23;1862:10:50;;-1:-1:-1;;;;;;;;;;;1862:10:50;10169:23:73;:::i;:::-;-1:-1:-1;;;;;;;;;;;1653:42:73;10206:11;10202:127;;8468:1956;-1:-1:-1;1815:42:73;357:173:56;;1530:10197:73;;-1:-1:-1;;;10390:26:73;;1653:42;8550:22:49;10390:26:73;;1530:10197;8550:22:49;1530:10197:73;;;;;357:173:56;;1530:10197:73;;1862:10:50;1530:10197:73;1916:42;10390:26;;;;;;;;;;8468:1956;-1:-1:-1;;1530:10197:73;;;;;;1862:10:50;;;1530:10197:73;;;;1862:10:50;;;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;10343:74;;1530:10197;1862:10:50;;;10343:74:73;;;;8468:1956::o;10390:26::-;;;;;;;;;;;;;;;;:::i;:::-;;;1530:10197;;;;10343:74;;1530:10197;;10390:26;;;;;;;;10202:127;1862:10:50;-1:-1:-1;;;;;1530:10197:73;1916:42;10233:41;;;;1530:10197;;;;;;10233:41;;8550:22:49;10233:41:73;;1530:10197;1653:42;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;;;1530:10197:73;10233:41;;9497:3;10233:41;;1916:42;10233:41;;;;;;;;;;;10202:127;10288:30;;1815:42;10288:30;;;;1530:10197;;-1:-1:-1;;;10288:30:73;;8550:22:49;10288:30:73;;1530:10197;;;10288:30;1530:10197;8550:22:49;1530:10197:73;10288:30;1815:42;10288:30;;;;;;;;;;;10202:127;;;;10288:30;;;;;:::i;:::-;1530:10197;;10288:30;;;;;1530:10197;;;;;;;;;10233:41;;;;;:::i;:::-;1530:10197;;10233:41;;;;10102:57;10144:14;;;:::i;:::-;1916:42;10122:37;;;;1530:10197;;;;;;10122:37;;1653:42;8550:22:49;10122:37:73;;1530:10197;1862:10:50;8550:22:49;1862:10:50;;1530:10197:73;1862:10:50;;;1530:10197:73;10122:37;;9497:3;10122:37;;1916:42;10122:37;;;;;;;;;;;10102:57;;;;;10122:37;;;;;:::i;:::-;1530:10197;;10122:37;;;;;1530:10197;;;;;;;;;9901:70;;;;;;;;;;;;;;;;;:::i;:::-;;;1862:10:50;;;;;9901:70:73;;;;;;;;;1530:10197;-1:-1:-1;;;1530:10197:73;;;8550:22:49;1530:10197:73;8550:22:49;1530:10197:73;;9840:29;;;;;-1:-1:-1;9840:29:73;;:::i;:::-;-1:-1:-1;9840:29:73;;;;9757:73;9795:35;-1:-1:-1;9757:73:73;;;9662:24;9679:7;;;;;;;;;;:::o;9560:92::-;-1:-1:-1;;;;;9589:16:73;-1:-1:-1;9560:92:73;;9510:40;9533:17;-1:-1:-1;9510:40:73;;;9267:49;9309:7;;;;;;;;;;;;:::o;1892:27:49:-;;;9002:83:73;1892:27:49;;9002:83:73;1892:27:49;;;;;;1530:10197:73;1892:27:49;;;:::i;:::-;;;1530:10197:73;;;;;1892:27:49;;;;;;-1:-1:-1;1892:27:49;;9161:29:73;9176:14;;;9161:29;;8550:22:49;;9002:83:73;8550:22:49;;9002:83:73;8550:22:49;;;;;;1530:10197:73;8550:22:49;;;:::i;:::-;;;1530:10197:73;;;;-1:-1:-1;;;;;1530:10197:73;;8550:22:49;;;;;-1:-1:-1;8550:22:49;;8669:69:73;8557:4;;17834:10:80;:27;17830:50;;1530:10197:73;;-1:-1:-1;;;17899:54:80;;;;-1:-1:-1;;;;;1530:10197:73;;;17899:54:80;;;;1530:10197:73;;;;17899:54:80;;;;;;1530:10197:73;17899:54:80;:::i;:::-;8729:7:73:o;8545:72::-;8601:16;;;;;;;;8549:43;8574:10;1653:42;8574:10;:18;;8549:43;;11831:126:80;1530:10197:73;;-1:-1:-1;;;11904:46:80;;-1:-1:-1;;;;;11934:11:80;1530:10197:73;;11904:46:80;;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;;;11904:46:80;;1530:10197:73;;11904:11:80;1530:10197:73;11904:46:80;;;;;;;11948:1;11904:46;;;11897:53;11831:126;:::o;11904:46::-;;;1530:10197:73;11904:46:80;;1530:10197:73;11904:46:80;;;;;;1530:10197:73;11904:46:80;;;:::i;:::-;;;1530:10197:73;;;;;11831:126:80;:::o;11904:46::-;;;-1:-1:-1;11904:46:80;;1530:10197:73;;;;;;;;;;:::o;:::-;;;;;;1862:10:50;;;;:::i;:::-;1530:10197:73;;;;;;;:::i;:::-;1862:10:50;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;:::o;:::-;;;:::o;5200:676:97:-;5323:25;-1:-1:-1;5323:25:97;;;1530:10197:73;;;;;;5370:1:97;1530:10197:73;;;;:::i;:::-;;5362:9:97;5358:48;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;5663:84:97;1530:10197:73;5663:84:97;;;;;;;;;;;1530:10197:73;;;;;;;;;;;;;;;;;;;;;;;;5663:84:97;;;;;;:::i;:::-;5607:150;;5615:20;-1:-1:-1;;;;;1530:10197:73;5607:150:97;;;;:::i;:::-;5771:3;;5767:80;;5200:676;:::o;5767:80::-;1530:10197:73;5778:67:97;;;;;5358:48;1221:11:86;-1:-1:-1;;;;;1530:10197:73;1199:10:86;:34;1195:63;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17562:9:80;;;17573:4;;;:33;;;;1530:10197:73;;-1:-1:-1;;;17573:33:80;;:4;1530:10197:73;17573:33:80;1530:10197:73;17573:4:80;;:33;;;;;;;;;;;17558:157;;;;1530:10197:73;;;;;;;:::i;:::-;1862:10:50;;5373:33:97;:::o;17573::80:-;;;;;:::i;:::-;1530:10197:73;;17573:33:80;;;;17558:157;17633:1;17625:9;17633:1;;17636:4;:38;;;;1530:10197:73;;;;;;17636:38:80;;;;;1530:10197:73;-1:-1:-1;17636:4:80;:38;:4;;;:38;;;;;;;;17621:94;;17558:157;;17636:38;;;;-1:-1:-1;17636:38:80;;:::i;:::-;-1:-1:-1;17636:38:80;;;17621:94;17696:19;;;-1:-1:-1;17696:19:80;;-1:-1:-1;17696:19:80;4251:303:87;-1:-1:-1;;;;;;;;;;;4379:48:87;-1:-1:-1;;;;;623:33:87;4474:2;623:33;1530:10197:73;4440:15:87;:37;;4436:55;;4522:3;623:33;1530:10197:73;;4508:23:87;1530:10197:73;;4534:5:87;;4251:303::o;4508:39::-;4542:5;;4251:303::o;4436:55::-;4479:12;4486:5;4479:12;:::o;11706:119:80:-;1530:10197:73;;-1:-1:-1;;;11779:39:80;;11809:4;11779:39;;;1530:10197:73;-1:-1:-1;1530:10197:73;;;;;;11779:39:80;1530:10197:73;11779:11:80;-1:-1:-1;;;;;1530:10197:73;11779:39:80;;;;;;;11816:1;11779:39;;;11772:46;11706:119;:::o;1762:206:98:-;1856:18;1838:15;:36;1834:69;;1530:10197:73;;-1:-1:-1;;;1920:24:98;;;1530:10197:73;1920:24:98;1530:10197:73;1920:10:98;-1:-1:-1;;;;;1530:10197:73;1920:24:98;;;;;;;1530:10197:73;1920:24:98;;;1762:206;-1:-1:-1;1920:29:98;;1530:10197:73;;1762:206:98:o;1920:41::-;1956:5;;1762:206::o;1920:24::-;;;;;;;;;;;;;1530:10197:73;1920:24:98;;;:::i;:::-;;;1530:10197:73;;;;;1920:24:98;;;;;;-1:-1:-1;1920:24:98;;1834:69;1530:10197:73;;-1:-1:-1;;;6316:17:97;;;1530:10197:73;6316:17:97;1530:10197:73;6316:3:97;-1:-1:-1;;;;;1530:10197:73;6316:17:97;;;;;;1530:10197:73;6316:17:97;;;1834:69:98;1530:10197:73;;6316:22:97;1530:10197:73;;-1:-1:-1;1530:10197:73;;;;1876:27:98:o;6316:17:97:-;;;;;;;;;;;;;;;;:::i;:::-;;;1530:10197:73;;;;;;;;;;;;;6316:17:97;;;;;;-1:-1:-1;6316:17:97;;1530:10197:73;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;;;;;;;:::o;:::-;;623:33:87;;;1530:10197:73;;;;;:::o;:::-;;-1:-1:-1;;;;;1530:10197:73;;;;;;;:::o;:::-;;-1:-1:-1;;;;;1530:10197:73;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1530:10197:73;;;;;;:::o;4899:906:87:-;1530:10197:73;;;;;;;;-1:-1:-1;;;;;1530:10197:73;;;;;5517:11:87;1530:10197:73;4037:249:20;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;;;1862:10:50;;1530:10197:73;5069:9:87;;1530:10197:73;;;;1862:10:50;1530:10197:73;5105:14:87;;1530:10197:73;;;;1862:10:50;1530:10197:73;5144:12:87;1530:10197:73;5144:12:87;;;:::i;:::-;1530:10197:73;;;;;;5191:8:87;1530:10197:73;5191:8:87;;;;:::i;:::-;1530:10197:73;;;:::i;:::-;;;;;;5181:19:87;1530:10197:73;;;1862:10:50;1530:10197:73;5221:8:87;;1530:10197:73;;;;1862:10:50;5253:11:87;;1530:10197:73;5253:11:87;;;:::i;:::-;1530:10197:73;;;;;5286:9:87;;1530:10197:73;5286:9:87;;;:::i;:::-;1530:10197:73;;;;;;5319:11:87;;1530:10197:73;;;;1862:10:50;1530:10197:73;5355:12:87;;1530:10197:73;;;;1862:10:50;623:33:87;5391:11;1530:10197:73;5391:11:87;;;:::i;:::-;623:33;1530:10197:73;;;;623:33:87;5423:8;1530:10197:73;5423:8:87;;;:::i;:::-;623:33;1530:10197:73;;;;623:33:87;5452:8;1530:10197:73;5452:8:87;;;:::i;:::-;623:33;1530:10197:73;;;;5483:10:87;;1530:10197:73;5483:10:87;;;:::i;:::-;1530:10197:73;;;;;5517:11:87;;:::i;:::-;1530:10197:73;;;;;;;;5565:127:87;;1530:10197:73;705:109:87;1530:10197:73;;5606:30:87;1530:10197:73;705:109:87;;1530:10197:73;5638:14:87;1530:10197:73;705:109:87;;1530:10197:73;5654:13:87;1530:10197:73;705:109:87;;1530:10197:73;5677:4:87;1530:10197:73;705:109:87;;1530:10197:73;;5565:127:87;;;1530:10197:73;5565:127:87;;:::i;:::-;1530:10197:73;5555:138:87;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;5761:35:87;868:292;1530:10197:73;5761:35:87;;1530:10197:73;868:292:87;;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;;;;868:292:87;1530:10197:73;868:292:87;;1530:10197:73;623:33:87;1530:10197:73;;;868:292:87;623:33;1530:10197:73;868:292:87;;;623:33;1530:10197:73;;;868:292:87;623:33;1530:10197:73;868:292:87;;;623:33;1530:10197:73;;;868:292:87;623:33;868:292;;;;1530:10197:73;;;;868:292:87;1530:10197:73;;868:292:87;;1530:10197:73;;868:292:87;1530:10197:73;868:292:87;;;1530:10197:73;868:292:87;5761:35;;;;;;:::i;:::-;1530:10197:73;;;5761:35:87;;5751:46;1530:10197:73;4037:249:20;;-1:-1:-1;;;4037:249:20;;;;;;;;;;;4899:906:87;:::o;2292:310:83:-;1530:10197:73;2444:9:83;:59;2440:72;;1530:10197:73;;-1:-1:-1;;;2525:59:83;;;1530:10197:73;2525:59:83;1530:10197:73;-1:-1:-1;2525:16:83;-1:-1:-1;;;;;1530:10197:73;1234:7:83;2525:59;;;2292:310;:::o;2525:59::-;;;;;;;;;;;;;:::i;:::-;2292:310;:::o;18395:331:80:-;18573:37;;;;;;;;;18581:9;-1:-1:-1;;;;;1530:10197:73;18573:37:80;;;;:::i;:::-;18624:3;;18620:100;;18395:331;:::o;1044:78:72:-;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;1044:78;1109:8;1100:17;1530:10197:73;;;;;;;;;1044:78:72;:::o;1007:30::-;-1:-1:-1;515:134:72;1007:30;;741:4141:41;;2390:7:96;1530:10197:73;;;;;2390:7:96;1347:147:41;;;;;;;;;;;;;1619:19;;;;1530:10197:73;;;1720:10:41;1716:177;;2390:7:96;2224:95:41;;;1530:10197:73;;;;2716:31:41;2811:94;;;3776:1;1530:10197:73;3757:1:41;1530:10197:73;3756:21:41;1530:10197:73;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;3254:96:41;;;;1530:10197:73;3254:96:41;;;2391:145;;;;;;1530:10197:73;2391:145:41;;2977:82;3363:21;1530:10197:73;741:4141:41;:::o;1716:177::-;1750:98;;;;1865:13;:::o;741:4141::-;;1530:10197:73;;;;;-1:-1:-1;;;;;741:4141:41;1347:147;;;;;;;;;;;;1619:19;;;;1530:10197:73;;;1720:10:41;1716:177;;9470:7:73;;-1:-1:-1;;;9470:7:73;2224:95:41;1530:10197:73;;;;2716:31:41;2811:94;;;3776:1;1530:10197:73;3757:1:41;1530:10197:73;3756:21:41;1530:10197:73;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;3254:96:41;;;;1530:10197:73;3254:96:41;;;2391:145;;;;;;1530:10197:73;2391:145:41;;2977:82;3363:21;1530:10197:73;741:4141:41;:::o;:::-;;1530:10197:73;;;;-1:-1:-1;;1530:10197:73;741:4141:41;1347:147;;;;;;;;;;;;1619:19;;;;1530:10197:73;;;1720:10:41;1716:177;;2224:95;;;;1530:10197:73;;;;2716:31:41;2811:94;;;3776:1;1530:10197:73;3757:1:41;1530:10197:73;3756:21:41;1530:10197:73;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;;;;3776:1:41;1530:10197:73;;3254:96:41;;;;1530:10197:73;3254:96:41;;;2391:145;;;;;;1530:10197:73;2391:145:41;;2977:82;3363:21;1530:10197:73;741:4141:41;:::o;1716:177::-;1750:98;;;;;1865:13;:::o;15996:478:80:-;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;;;16127:22:80;1530:10197:73;;;16127:58:80;;15996:478;16127:106;;;;15996:478;16127:170;;;;15996:478;16127:209;;;;15996:478;16127:265;;;;15996:478;16127:309;;;;;15996:478;16110:357;;15996:478::o;16110:357::-;16454:13;;;-1:-1:-1;16454:13:80;;-1:-1:-1;16454:13:80;16127:309;16396:7;;1530:10197:73;;;;;;;;;552:8:42;1530:10197:73;16396:40:80;;;16127:309;;:265;16356:15;1530:10197:73;16128:21:80;1530:10197:73;;;;-1:-1:-1;1530:10197:73;;;;;;;;16128:21:80;1530:10197:73;16356:36:80;;16127:265;;;:209;16309:9;-1:-1:-1;16309:9:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;16331:4:80;;16301:35;;16127:209;;;:170;16269:13;-1:-1:-1;16269:13:80;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;;;;;-1:-1:-1;16287:10:80;-1:-1:-1;;;;;1530:10197:73;16253:44:80;;;16127:170;;:106;16205:13;-1:-1:-1;1530:10197:73;;-1:-1:-1;;;;;1530:10197:73;;;;;;;;16189:44:80;;;16127:106;;;:58;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;16153:32:80;;-1:-1:-1;16127:58:80;;15615:155;1530:10197:73;;;;;;;;;;;;-1:-1:-1;15715:22:80;1530:10197:73;15715:26:80;15714:49;15615:155;:::o;15776:214::-;15878:22;1530:10197:73;-1:-1:-1;15878:26:80;;:105;;;;;;1530:10197:73;;;;;;;;;;;;;;;;15915:29:80;;;:::i;:::-;1530:10197:73;;;;;;;;15776:214:80;:::o;15878:105::-;;;15776:214;:::o;2098:168:47:-;-1:-1:-1;;;2172:13:47;;;2168:57;;1530:10197:73;;2098:168:47;:::o;2168:57::-;2187:25;;;814:96:38;;;;;11420:165:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;11502:13;;;:46;;;;11420:165;11502:76;;;;11495:83;11420:165;:::o;11502:76::-;11552:15;;;:26;11420:165;:::o;11502:46::-;-1:-1:-1;;;;;1530:10197:73;11519:15;:29;;;-1:-1:-1;11502:46:73;;;10430:188;1530:10197;;-1:-1:-1;;;10503:26:73;;1653:42;10503:26;;;1530:10197;-1:-1:-1;1530:10197:73;;;;;;10503:26;1530:10197;1916:42;10503:26;;;;;;;10527:1;10503:26;;;10430:188;-1:-1:-1;10546:6:73;;;:18;10527:1;10430:188;:::o;10546:18::-;-1:-1:-1;;1530:10197:73;;;;;;;10430:188;:::o;10503:26::-;;;1530:10197;10503:26;;1530:10197;10503:26;;;;;;1530:10197;10503:26;;;:::i;:::-;;;1530:10197;;;;;10503:26;;;;;;-1:-1:-1;10503:26:73;;10623:792;;-1:-1:-1;;;;;;;;;;;1862:10:50;;10809:11:73;1862:10:50;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;;10880:18;;;;;:::i;:::-;10870:28;;10866:57;;10949:19;;;:28;:19;;:::i;:28::-;10991:11;;;;:45;;;10623:792;10987:299;;10623:792;11299:10;;11295:114;;10623:792;:::o;11295:114::-;11325:15;;;;;;:::i;:::-;11373;1998:7;11373:15;1530:10197;11373:15;;1530:10197;;;-1:-1:-1;;;;;1530:10197:73;11295:114;10623:792::o;10987:299::-;11071:137;11257:18;11071:137;;;:15;;:28;;:137;1530:10197;;;11071:137;11222:21;11071:137;;;11222:21;:::i;:::-;11257:18;;:::i;:::-;10987:299;;;;11071:137;11127:81;-1:-1:-1;;;;;11222:21:73;1530:10197;;;;-1:-1:-1;;;;;11183:24:73;11151:30;11071:15;;11151:30;:::i;:::-;11183:24;;;:::i;:::-;1530:10197;11127:81;;;:::i;:::-;11071:137;;11222:21;:::i;10991:45::-;1530:10197;-1:-1:-1;;;;;1530:10197:73;;;;11006:15;:30;10991:45;;1896:106:72;1981:5;1967:6;;:::i;:::-;1981:5;;;:::i;:::-;1530:10197:73;1988:9:72;1530:10197:73;1988:9:72;1530:10197:73;;;;1981:19:72;;;:::i;:::-;1896:106;:::o;14852:160:49:-;1530:10197:73;;14953:51:49;;;1530:10197:73;;;414:1:49;1530:10197:73;398:19:49;;1530:10197:73;;14953:51:49;;;;;;:::i;:::-;1530:10197:73;14943:62:49;;14852:160;:::o;1974:2333:98:-;;;2074:18;2056:15;:36;2052:117;;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;1974:2333:98;1224:8:72;2196:30:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2196:30:98;;:::i;:::-;1530:10197:73;;-1:-1:-1;;;2268:26:98;;-1:-1:-1;;2196:42:98;2268:9;-1:-1:-1;;;;;1530:10197:73;;2229:9:98;1862:10:50;;;;2268:26:98;1530:10197:73;2268:26:98;1530:10197:73;;2268:26:98;;;;;;;-1:-1:-1;2268:26:98;;;1974:2333;-1:-1:-1;2268:29:98;;-1:-1:-1;2268:74:98;;1530:10197:73;;-1:-1:-1;;;2369:24:98;;:10;-1:-1:-1;;;;;1530:10197:73;;2268:26:98;1530:10197:73;2268:26:98;1530:10197:73;;2369:24:98;;;;;;;-1:-1:-1;2369:24:98;;;2268:74;-1:-1:-1;2369:27:98;;-1:-1:-1;2369:72:98;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2369:72:98;2470:30;1224:8:72;2229:9:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2470:30:98;;:::i;:::-;1862:10:50;;-1:-1:-1;;;;;;;;;;;1314:35:72;;1530:10197:73;;;;1862:10:50;1530:10197:73;-1:-1:-1;;;;;1530:10197:73;;;;2772:50:98;2590:63;;2772:62;2590:63;2772:30;:39;2590:63;2772:18;-1:-1:-1;2590:63:98;;;2772:18;:::i;:62::-;2847:12;;;2844:68;;2590:63;1430:59:72;;;;;;;2980:14:98;2976:91;;2590:63;3081:12;3077:77;;2590:63;3222:6;3181:37;3199:19;2056:15;3181:37;:::i;:::-;1862:10:50;3242:14:98;;3238:220;;2590:63;3471:11;;3467:266;;2590:63;1530:10197:73;;;;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;3747:42:98;1530:10197:73;;3747:42:98;;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;3747:42:98;;;;1530:10197:73;;;;;;2268:26:98;1530:10197:73;;;3804:37:98;1530:10197:73;;;;;;2268:26:98;1530:10197:73;;;3856:24:98;3894:13;3890:90;;2590:63;4018:4;1862:10:50;;4035:18:98;;;;4032:40;;2590:63;4139:20;;4175:49;4139:20;4196:17;4139:20;4279;4139;;;;4239:61;4139:20;;:::i;:::-;1530:10197:73;4110:15:98;-1:-1:-1;;;;;1530:10197:73;4139:20:98;:::i;4196:17::-;1530:10197:73;;;;;;1862:10:50;;;1530:10197:73;;;;1862:10:50;;1530:10197:73;;;;1862:10:50;;4175:49:98;4279:20;:::i;:::-;1530:10197:73;;4239:61:98;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;4239:61:98;;;;1974:2333::o;4032:40::-;4054:18;;-1:-1:-1;4054:18:98;;4032:40;;3890:90;3971:8;1530:10197:73;-1:-1:-1;;;;;3953:15:98;1530:10197:73;;;3931:11:98;1530:10197:73;3971:8:98;:::i;:::-;3890:90;;3467:266;1530:10197:73;;3555:6:98;1530:10197:73;;3520:11:98;-1:-1:-1;;;;;1530:10197:73;3555:6:98;:::i;:::-;3576:31;;;;;1530:10197:73;;3576:31:98;1530:10197:73;;;;;;;;;3576:31:98;;;2268:26;3576:31;;1530:10197:73;3576:31:98;;;;;;;;3467:266;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;3680:42:98;-1:-1:-1;;;;;;;;;;;1530:10197:73;;3680:42:98;1530:10197:73;;3626:35:98;1530:10197:73;;3626:35:98;;;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;3626:35:98;;;;1530:10197:73;;3680:42:98;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;3680:42:98;;;;3467:266;;;;;;;;;;3576:31;;;;;;:::i;:::-;1530:10197:73;;3576:31:98;;;1530:10197:73;;;;3576:31:98;1530:10197:73;;;;;;;;;3238:220:98;3328:9;1530:10197:73;;3294:11:98;-1:-1:-1;;;;;1530:10197:73;3328:9:98;:::i;:::-;3352:33;;;;;-1:-1:-1;1530:10197:73;;3352:33:98;1530:10197:73;;;;;;;;;3352:33:98;;;2268:26;3352:33;;1530:10197:73;3352:33:98;;;;;;;;3238:220;-1:-1:-1;1530:10197:73;;;;;;1862:10:50;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;;;3404:43:98;;1862:10:50;;3404:43:98;3238:220;;;3352:33;;;;;-1:-1:-1;3352:33:98;;:::i;:::-;-1:-1:-1;3352:33:98;;;;3077:77;3146:7;3139:4;;3117:11;-1:-1:-1;;;;;1530:10197:73;3146:7:98;:::i;:::-;3077:77;;2976:91;3057:9;1530:10197:73;-1:-1:-1;;;;;3040:14:98;1530:10197:73;;;3018:11:98;1530:10197:73;3057:9:98;:::i;:::-;2976:91;;2844:68;2902:9;;2882:11;-1:-1:-1;;;;;1530:10197:73;2902:9:98;:::i;:::-;2844:68;;;;2590:63;2772:62;2619:22;2772:30;:39;2619:22;2772:18;2229:9;2611:30;2772:50;2619:22;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2590:63:98;1862:10:50;623:33:87;1224:8:72;1195:37;;2611:30:98;:::i;:::-;1862:10:50;2590:63:98;;;2772:18;:::i;1007:30:72:-;-1:-1:-1;515:134:72;1007:30;;;-1:-1:-1;515:134:72;1007:30;;2369:72:98;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2369:72:98;2399:30;1224:8:72;2229:9:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2399:30:98;;:::i;:::-;1862:10:50;2369:72:98;;1007:30:72;-1:-1:-1;515:134:72;1007:30;;2369:24:98;;;2268:26;2369:24;;2268:26;2369:24;;;;;;1530:10197:73;2369:24:98;;;:::i;:::-;;;1530:10197:73;;;;;2369:24:98;;;;;;-1:-1:-1;2369:24:98;;2268:74;-1:-1:-1;;;;;;;;;;;979:28:72;1010:8;;1007:30;;2268:74:98;2300:30;1224:8:72;2229:9:98;1208:7:72;1862:10:50;623:33:87;1195:37:72;2300:30:98;;:::i;:::-;1862:10:50;2268:74:98;;;1007:30:72;-1:-1:-1;515:134:72;1007:30;;2268:26:98;;;;;;;;;;;;;1530:10197:73;2268:26:98;;;:::i;:::-;;;1530:10197:73;;;;;2268:26:98;;;;;;-1:-1:-1;2268:26:98;;1007:30:72;-1:-1:-1;515:134:72;1007:30;;2052:117:98;-1:-1:-1;924:10:81;932:2;1862:10:50;;7791:23:97;1530:10197:73;1862:10:50;;;;;1530:10197:73;1862:10:50;;;;;;;7817:9:97;1862:10:50;;7864:20:97;7817:9;7856:28;1530:10197:73;7864:20:97;;:::i;:::-;1530:10197:73;7856:28:97;;:::i;:::-;1862:10:50;7931:14:97;7817:9;7923:22;1530:10197:73;7931:14:97;;:::i;:::-;1530:10197:73;7923:22:97;;:::i;:::-;1862:10:50;7987:17:97;8054:18;7987:17;:38;:17;:29;:17;;;;;:::i;:38::-;8054:18;;:::i;:::-;8086:14;;8082:91;;2052:117:98;8187:12:97;8183:77;;2052:117:98;8274:14:97;8270:267;;2052:117:98;8550:11:97;8546:251;;2052:117:98;1530:10197:73;;9340:61:97;1530:10197:73;-1:-1:-1;;;;;;;;;;;1530:10197:73;9380:20:97;1530:10197:73;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1530:10197:73;;;;8811:42:97;-1:-1:-1;;;;;;;;;;;1530:10197:73;;;8811:42:97;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;8811:42:97;;;;1530:10197:73;;;;;;;;;;8965:37:97;1530:10197:73;;;;;;;;;;9017:24:97;9055:13;9051:90;;2052:117:98;1862:10:50;9286:39:97;9179:4;1862:10:50;;9250:20:97;;;;;;;;:::i;:::-;1530:10197:73;9221:15:97;-1:-1:-1;;;;;1530:10197:73;9250:20:97;:::i;9051:90::-;9132:8;1530:10197:73;-1:-1:-1;;;;;9114:15:97;1530:10197:73;;;9092:11:97;1530:10197:73;9132:8:97;:::i;:::-;9051:90;;8546:251;1530:10197:73;;;775:318:79;-1:-1:-1;;;;;8621:3:97;1530:10197:73;;;8627:6:97;;1530:10197:73;;;;8599:11:97;1530:10197:73;8627:6:97;:::i;:::-;775:318:79;;-1:-1:-1;;;775:318:79;;;;;;;;;;;;;;;;8752:14:97;9340:61;8752:14;-1:-1:-1;;;;;;;;;;;1530:10197:73;9380:20:97;8752:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;8752:14:97;;;;8811:42;-1:-1:-1;;;;;;;;;;;8752:14:97;8704:82;8752:14;;8733:52;8734:32;-1:-1:-1;;;;;8752:14:97;1530:10197:73;2056:15:98;8734:32:97;:::i;:::-;8770:15;8733:52;;:::i;:::-;1530:10197:73;;;;;1862:10:50;;;1530:10197:73;;;;1862:10:50;;;1530:10197:73;1862:10:50;;8704:82:97;8546:251;;;;;;;;;;;;;;;;;775:318:79;;;;;;;;8270:267:97;-1:-1:-1;;;;;8348:9:97;1530:10197:73;;;8360:9:97;;1530:10197:73;;;;8326:11:97;1530:10197:73;8360:9:97;:::i;:::-;8384:33;;;;;-1:-1:-1;1530:10197:73;;8384:33:97;1530:10197:73;;;;;;;;;8384:33:97;;;;;;1530:10197:73;8384:33:97;;;;;;;;8270:267;8492:14;8436:90;;8473:52;8474:32;-1:-1:-1;;;;;8492:14:97;1530:10197:73;2056:15:98;8474:32:97;:::i;8473:52::-;1530:10197:73;;8436:90:97;;;;;;1862:10:50;;;;;;;;1530:10197:73;;;1862:10:50;;;1530:10197:73;1862:10:50;1530:10197:73;1862:10:50;8436:90:97;;;;8270:267;;8384:33;;;;;-1:-1:-1;8384:33:97;;:::i;:::-;-1:-1:-1;8384:33:97;;;;8183:77;8252:7;8245:4;;8223:11;-1:-1:-1;;;;;1530:10197:73;8252:7:97;:::i;:::-;8183:77;;8082:91;8163:9;1530:10197:73;-1:-1:-1;;;;;8146:14:97;1530:10197:73;;;8124:11:97;1530:10197:73;8163:9:97;:::i;:::-;8082:91;;2419:778:19;1530:10197:73;;;2419:778:19;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:19;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;11617:532::-;1530:10197:73;;;;;;11703:29:19;;;11748:7;;:::o;11699:444::-;1530:10197:73;11799:38:19;;1530:10197:73;;11860:23:19;;;11712:20;11860:23;1530:10197:73;11712:20:19;11860:23;11795:348;11913:35;11904:44;;11913:35;;11971:46;;;;11712:20;11971:46;1530:10197:73;;;11712:20:19;11971:46;11900:243;12047:30;12038:39;12034:109;;11900:243;11617:532::o;12034:109::-;12100:32;;;11712:20;12100:32;1530:10197:73;;;11712:20:19;12100:32;1530:10197:73;;;;11712:20:19;1530:10197:73;;;;;11712:20:19;1530:10197:73;169:537:79;254:446;;169:537;;;;254:446;;1530:10197:73;;;;;;254:446:79;;1530:10197:73;;;;;254:446:79;;;;;;;;;;;;;;;;;;;169:537;:::o;254:446::-;;;;;;;;1104:470;1200:368;;1104:470;;;;1200:368;;;;;;;;;;;;;;;;;;;;;;;1104:470;:::o;7129:1551:19:-;;;8209:66;8196:79;;8192:164;;1530:10197:73;;;;;;-1:-1:-1;1530:10197:73;;;;;;;;;;;;;;;;;;;8467:24:19;;;;;;;;;-1:-1:-1;8467:24:19;-1:-1:-1;;;;;1530:10197:73;;8505:20:19;8501:113;;8624:49;-1:-1:-1;8624:49:19;-1:-1:-1;7129:1551:19;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:19;8467:24;8541:62;-1:-1:-1;8541:62:19;:::o;8192:164::-;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{},"immutableReferences":{"14598":[{"start":4827,"length":32}],"14601":[{"start":5839,"length":32},{"start":9123,"length":32},{"start":11973,"length":32},{"start":12288,"length":32}],"19858":[{"start":3279,"length":32},{"start":9879,"length":32},{"start":10169,"length":32},{"start":18457,"length":32}],"19870":[{"start":1216,"length":32},{"start":4896,"length":32},{"start":7918,"length":32},{"start":10349,"length":32}],"19873":[{"start":7528,"length":32}],"19921":[{"start":7634,"length":32},{"start":11702,"length":32},{"start":16135,"length":32}],"19970":[{"start":1581,"length":32}],"19972":[{"start":2251,"length":32},{"start":19199,"length":32}],"20024":[{"start":1039,"length":32},{"start":1974,"length":32},{"start":7732,"length":32},{"start":10033,"length":32},{"start":21591,"length":32},{"start":23333,"length":32}],"20027":[{"start":12041,"length":32},{"start":20770,"length":32},{"start":20903,"length":32},{"start":22456,"length":32},{"start":22515,"length":32}],"21785":[{"start":9795,"length":32},{"start":17199,"length":32},{"start":22608,"length":32}],"22184":[{"start":8827,"length":32},{"start":18366,"length":32}],"23986":[{"start":28,"length":32},{"start":1276,"length":32},{"start":1421,"length":32},{"start":2448,"length":32},{"start":2989,"length":32},{"start":4963,"length":32},{"start":5124,"length":32},{"start":7063,"length":32},{"start":7280,"length":32},{"start":8089,"length":32},{"start":8385,"length":32},{"start":8732,"length":32},{"start":9014,"length":32},{"start":10405,"length":32},{"start":10519,"length":32},{"start":11018,"length":32},{"start":11884,"length":32},{"start":12107,"length":32},{"start":16191,"length":32},{"start":16567,"length":32},{"start":16938,"length":32},{"start":20939,"length":32},{"start":20990,"length":32},{"start":21341,"length":32},{"start":21527,"length":32},{"start":21627,"length":32},{"start":21675,"length":32},{"start":22551,"length":32},{"start":22652,"length":32},{"start":23026,"length":32},{"start":23269,"length":32},{"start":23369,"length":32}],"24296":[{"start":3131,"length":32},{"start":3654,"length":32}],"24298":[{"start":4471,"length":32},{"start":7193,"length":32}],"29949":[{"start":10776,"length":32}],"29951":[{"start":10855,"length":32}],"30232":[{"start":12627,"length":32},{"start":13754,"length":32},{"start":20133,"length":32},{"start":22982,"length":32}],"30235":[{"start":10627,"length":32},{"start":16498,"length":32}],"30237":[{"start":22845,"length":32},{"start":23164,"length":32}],"30239":[{"start":22885,"length":32}],"31131":[{"start":4536,"length":32},{"start":17057,"length":32},{"start":20228,"length":32}],"31133":[{"start":6600,"length":32},{"start":16999,"length":32},{"start":20038,"length":32}],"31135":[{"start":20509,"length":32}],"31663":[{"start":967,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"activateRewardBoost()","signatureHash4":"0xa64e13a1","signatureHash32":"0xa64e13a1d2fb0f4c8d78bda8004f35d0faa787249fc3f752362f8715383f72dd"},{"signature":"activateTimedBuyback()","signatureHash4":"0x6e5dbe86","signatureHash32":"0x6e5dbe8639ce4e637a8e63efae6bf6c783a274eddfa0b2ed92f9fd45b8aaf2ac"},{"signature":"afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)","signatureHash4":"0x9f063efc","signatureHash32":"0x9f063efc0e7905d302491c9da772361c0faa77174cc43ec9e94aa9141b6a6b67"},{"signature":"afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)","signatureHash4":"0xe1b4af69","signatureHash32":"0xe1b4af69b30a88bed49d94820f012d5d3a111a00764242f510270492aeb7fb1e"},{"signature":"afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)","signatureHash4":"0x6fe7e6eb","signatureHash32":"0x6fe7e6ebae9b6648ee9582d3769da9a44fdb4ec83c36a0ffb490e9461143ec16"},{"signature":"afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)","signatureHash4":"0x6c2bbe7e","signatureHash32":"0x6c2bbe7e4f0f51f6ee10b6409b7088135645d7ae479b8f0be3d7250f85988483"},{"signature":"afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)","signatureHash4":"0xb47b2fb1","signatureHash32":"0xb47b2fb18a5a173c64a43e7f7fe55e43e298f5436a0e265b15e662727cb0695f"},{"signature":"ARENA_PULSE_INTERVAL()","signatureHash4":"0x77e70a4b","signatureHash32":"0x77e70a4bde64f204fedc45bfc9beb58b6e6a7df439e7aa2d24f7312ce4a148c7"},{"signature":"arenaState()","signatureHash4":"0xcffe289e","signatureHash32":"0xcffe289ecbdb969d152cd2d13220c4f16c06193c0f4be67327c5c803011ddccc"},{"signature":"batchBuybacksEnabled()","signatureHash4":"0x03195cd0","signatureHash32":"0x03195cd062a29482b1d204bb39ae07050003140860e5251193d45c5a0745b3e6"},{"signature":"batchThresholdWei()","signatureHash4":"0x470d5fe6","signatureHash32":"0x470d5fe6ba90fcaa3e96e14af0a27794426fb3cb61d4ea48f14604a414fb43c7"},{"signature":"BATCH_USD()","signatureHash4":"0x48e73277","signatureHash32":"0x48e732770886f0d6fe3e4c4daf2e4976a348566d087a954f22c2090182134a5d"},{"signature":"beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)","signatureHash4":"0x259982e5","signatureHash32":"0x259982e524ca348fcfeda0fb247c362c89fadb178685b3f748fe9b5beeeff045"},{"signature":"beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)","signatureHash4":"0xb6a8b0fa","signatureHash32":"0xb6a8b0faa8fd517d727f03c7c72b0a7828d05348cbc4253b7cbd9609aad5559c"},{"signature":"beforeInitialize(address,(address,address,uint24,int24,address),uint160)","signatureHash4":"0xdc98354e","signatureHash32":"0xdc98354e711e2be5d28eff54c09e2e61c5b15fb066d17daaa5b71151b4ae5c5a"},{"signature":"beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)","signatureHash4":"0x21d0ee70","signatureHash32":"0x21d0ee70669b208d8af4dc382eaa03dea2d745370926da496c872bb9c9b98692"},{"signature":"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)","signatureHash4":"0x575e24b4","signatureHash32":"0x575e24b486f1b1168e84028b6b7338846844275788c5ca5249def3be2dfc2c03"},{"signature":"BURN_FEE_PIPS()","signatureHash4":"0xeaf33476","signatureHash32":"0xeaf334769daa94ba840c04dc87cd8e17f6d933083a7ece179039419d7431f533"},{"signature":"BUYBACK_GAS_LIMIT()","signatureHash4":"0x263cef3c","signatureHash32":"0x263cef3c7b7f01a9a332580cd0f465163b1dcb2ecd02edaea751b528f9e66e45"},{"signature":"collectProjectFees(uint256)","signatureHash4":"0x7cc4353b","signatureHash32":"0x7cc4353b87ad16bca56dacb0ce1b5378df4b332191bd440a0f03be2418c8af36"},{"signature":"DURATION()","signatureHash4":"0x1be05289","signatureHash32":"0x1be0528996b56eb8ec775d985052ca53affedc60a0d4b6db0cd173ce7075b9dc"},{"signature":"ethUsdFeed()","signatureHash4":"0x8009b7bd","signatureHash32":"0x8009b7bdf33e7cf0e8faf4498247300ec1979781bb4d42074ec548ff9c73ce60"},{"signature":"extensions()","signatureHash4":"0x24f159c2","signatureHash32":"0x24f159c2e14ea7270da6cdbb89da5cafc929cfe82d812a8daf03a37358cab773"},{"signature":"feeRecipient()","signatureHash4":"0x46904840","signatureHash32":"0x46904840b6b05d7bd13973931bbfab50fdf290a35cb7abbfdd5a1d4a81b1e8e8"},{"signature":"FOMO_FEE_PIPS()","signatureHash4":"0xfb26015f","signatureHash32":"0xfb26015fc5b006956b060040afbfb8ef57d45b4493c5bc64841021c51c2a309d"},{"signature":"fomoRecipient()","signatureHash4":"0x28accf09","signatureHash32":"0x28accf09356997bb2ae273291f564bbefa44ae0249cbcb814eed278880ddaecf"},{"signature":"fomoReserve()","signatureHash4":"0x7ce73d67","signatureHash32":"0x7ce73d677d53ff8ecdcab05842f60c287a0127cdc3c48b0508f106e548f1bed7"},{"signature":"implementationSelf()","signatureHash4":"0xb827bbe0","signatureHash32":"0xb827bbe0dd4c8af9e36f690beec87531fb916e3ca1a1ce941a084bb9232a3f90"},{"signature":"initialize(address,address,int24,uint160)","signatureHash4":"0xdf4fe917","signatureHash32":"0xdf4fe91784bc39cbd7ec4dbe42393815550d11c70c9137d22553dbd01e139651"},{"signature":"liquidityBatchReady()","signatureHash4":"0x428a6341","signatureHash32":"0x428a63412de444d1b9c31152dbd7e0af69b3c2e7fe851091d31418926ebea937"},{"signature":"LIQUIDITY_FEE_PIPS()","signatureHash4":"0x638b12a0","signatureHash32":"0x638b12a037b54aaebe921b95e53b79c505a55e4d15eb1e52c37d8bf134b493c3"},{"signature":"liquidityReserve()","signatureHash4":"0xb753bfe9","signatureHash32":"0xb753bfe9fad06cf6b412726bcccac706d20719e5cd4e736b204073ff4648b9df"},{"signature":"lpRemainderProcessor()","signatureHash4":"0x37588065","signatureHash32":"0x37588065a2e954fd884318fa0dfceaa488502af7c9d06aefc69bbeec6f2145fe"},{"signature":"lpRewards()","signatureHash4":"0x0c762141","signatureHash32":"0x0c7621412c121387cd7ac1b7739d28aebd5e34d69448723e7e747fe97ffa6b28"},{"signature":"LP_REWARDS_FEE_PIPS()","signatureHash4":"0x9b75f7c8","signatureHash32":"0x9b75f7c8dcccb0a05855b51b9e69b65e1c45d778f95e099c2f7e3f47df3b671f"},{"signature":"maximumTotalTaxPips()","signatureHash4":"0x06b7cb9c","signatureHash32":"0x06b7cb9cc07be4f533bc59ce3f4a070402446e8f1eebf96a18662ef8c173c2f4"},{"signature":"nft()","signatureHash4":"0x47ccca02","signatureHash32":"0x47ccca0201ed22f779508456c61f73397d88b6577f89f05d9bdd674c21209b55"},{"signature":"NFT_FEE_PIPS()","signatureHash4":"0xc269a3e2","signatureHash32":"0xc269a3e2f8697082e16f00390944181d09103e48789df95c811674865503246e"},{"signature":"nftStaking()","signatureHash4":"0xc4408c8a","signatureHash32":"0xc4408c8aa072965c04f7b072c088adf75e130c18658551c13cd18c2f6e02d765"},{"signature":"nftStakingStartsAt()","signatureHash4":"0xaf102658","signatureHash32":"0xaf102658643fa04c32a77e581375478b3c441af4858ac2eabfc5d35f405dcce9"},{"signature":"OBSERVATION_GAS()","signatureHash4":"0x690422b2","signatureHash32":"0x690422b2eb83d0e2cdf496a4e22125ca89b8aca179dac3fa6b312aae616068a5"},{"signature":"pendingBurnEth()","signatureHash4":"0xbbc2520d","signatureHash32":"0xbbc2520d6a12664c3904758ad7fbb632a494c318b023a5e0f656fea34fe343d0"},{"signature":"pendingFomoEth()","signatureHash4":"0x8c2d6cf4","signatureHash32":"0x8c2d6cf46af1b006684c337800b101ad2e839b7c68a2c73ef0b8a393edfdd88a"},{"signature":"pendingLiquidityEth()","signatureHash4":"0x3bd13251","signatureHash32":"0x3bd13251dd1890ac26a243ccc2d4a23d8def454509ada9827de1dbdc10935204"},{"signature":"pendingLiquidityTokens()","signatureHash4":"0xe3b39040","signatureHash32":"0xe3b390407405c71ebf50cd7dc1507c1df6a21237b76e7f497af9b700336dba3d"},{"signature":"platformRevenue()","signatureHash4":"0x24048ba1","signatureHash32":"0x24048ba165d1f32581f5314ffc3938877a6cb61ff738bd88b7e59b75d2a6a12e"},{"signature":"poolManager()","signatureHash4":"0xdc4c90d3","signatureHash32":"0xdc4c90d3c2342c5afe26871a21a4ecf482fcb45ae1ac8294d1dcff7a134352c0"},{"signature":"predictionOracle()","signatureHash4":"0x6b9cdad6","signatureHash32":"0x6b9cdad6120c4fa4825e79bf17a03e2462bd9bdd0525cb62b31f83998723a463"},{"signature":"privacyBuy()","signatureHash4":"0xffa80082","signatureHash32":"0xffa80082845bfc56b9772b4acfb637325e837381b30b169b8d52aa723cd18c5c"},{"signature":"processBuybacks()","signatureHash4":"0x070fd029","signatureHash32":"0x070fd02906ad4b8bf21d86b68befc0a97d6b3ab53334125298c1159d44463f78"},{"signature":"processBuybacksDuringSwap(address)","signatureHash4":"0x7d73714d","signatureHash32":"0x7d73714df0819db1a91959cb989dd63e54c8e6a8f44b0dbac9b98e9d3c413936"},{"signature":"processBuybacksGuarded(uint256,uint256,uint256)","signatureHash4":"0x293b1c6a","signatureHash32":"0x293b1c6a9d70b68d309f867bc8a2a49040fa180e787f0d7cb8ced751fff2076d"},{"signature":"processLiquidity()","signatureHash4":"0x3923411c","signatureHash32":"0x3923411c17b846e5302dc585fb5ecca3db8aab3daf021464e2f7c90d791c1b24"},{"signature":"processLiquidityDuringSwap()","signatureHash4":"0x0e635186","signatureHash32":"0x0e6351861c18ce41d0ef9d4a0efa405d0e18e647abce45c0110de151f4a3ffde"},{"signature":"processLiquidityRemainder(uint128,uint256,uint256,uint256)","signatureHash4":"0x780d3cfe","signatureHash32":"0x780d3cfe85bdbae7e327968214205e807ce33e43631e0a8d82e5ed8e926fa958"},{"signature":"processor()","signatureHash4":"0xce1b1d43","signatureHash32":"0xce1b1d43bb0b9fa5fa13230c1fed75d00ed87d0d7aadbd7f3a444390bb93cee4"},{"signature":"projectFeeBalance()","signatureHash4":"0x46158ffc","signatureHash32":"0x46158ffcf461c6599f8348ce9d71a38ba7c3044523b612635c66c284dba02f12"},{"signature":"projectRevenue()","signatureHash4":"0xfb73056b","signatureHash32":"0xfb73056b499ccb1d573475ac1a9d7f68204206847a988d444b193a657a106c38"},{"signature":"protectionKind()","signatureHash4":"0x154e1e3f","signatureHash32":"0x154e1e3ffc2ab41573983f7cf76b2d37b70f520f55c9d3d6c4938a0af5917346"},{"signature":"protectionVersion()","signatureHash4":"0xdd6b5e8e","signatureHash32":"0xdd6b5e8ec739d694a371f08fd021acb528832837daf7e433ca78bf66e88be8c9"},{"signature":"quoteTradeFee(address,bool,int256,bytes)","signatureHash4":"0x21bdc0d9","signatureHash32":"0x21bdc0d99dee0255fb06b24902ed5cd5e47b32e2436c1bf8cf759f3506a098f2"},{"signature":"REWARD_BOOST_DURATION()","signatureHash4":"0x52bf8c27","signatureHash32":"0x52bf8c27563722238ab6d1c5e6366732c68ef4f2a6409cd8e34c0e2e6a0b604f"},{"signature":"rewardBoostState()","signatureHash4":"0x034e7c47","signatureHash32":"0x034e7c47ccd2a59eb99f0c3d4b3cc6919c9b8831b58697527db8f76ba7337c64"},{"signature":"rewardMultiplier()","signatureHash4":"0x6f2c590a","signatureHash32":"0x6f2c590a746c87e02a0de4b9ebf50a014140b1a26e5a9831614110bac0d17956"},{"signature":"submitWeather((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)","signatureHash4":"0xc79d2dfc","signatureHash32":"0xc79d2dfc25012e0c5e3be1c24decc6232a9a6f13e2c23dad2c938f4593e0aa6b"},{"signature":"timedBuybackState()","signatureHash4":"0x906f3491","signatureHash32":"0x906f3491c4ce1d5f95625ee54e0cafe6c9b0a8ff7295b038e2c79f6102ba04b5"},{"signature":"totalHookFeePips()","signatureHash4":"0x10e3c7a7","signatureHash32":"0x10e3c7a7a8cd8fbfc7ac673fa1e11c647450ec89317e7ab4624f729e5337e4dc"},{"signature":"unlockCallback(bytes)","signatureHash4":"0x91dd7346","signatureHash32":"0x91dd7346410d7d3e1561ab65859d8ebbee84f666c7eb10ddc6d9424bc35ec2ee"},{"signature":"WALLET_FEE_PIPS()","signatureHash4":"0xc314876d","signatureHash32":"0xc314876d81fd53e277877d5343674fb01c8388f9e223b456f3b8d6ef2df0950e"},{"signature":"weatherAllocationEnabled()","signatureHash4":"0x05ca342f","signatureHash32":"0x05ca342f90e81a3cc47751425b644192282688c671ceb21cb1e193b738cbbb62"},{"signature":"weatherAttester()","signatureHash4":"0xd16f7158","signatureHash32":"0xd16f71586043d285f3463128c2e684679118bf0a63df554e5dc4ece879da82e4"},{"signature":"weatherBurnFeePips()","signatureHash4":"0xbb8b353c","signatureHash32":"0xbb8b353c0b8f4070b166ec89fcee8356a9a5b760b7f2f9e9bbf51c03ae69f493"},{"signature":"weatherDigest((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64))","signatureHash4":"0xd25eae25","signatureHash32":"0xd25eae25dd64b0223ab9eadfcee5b89581391ab65988f5dc677570e08b8df545"},{"signature":"WEATHER_MAX_AGE()","signatureHash4":"0x40257371","signatureHash32":"0x4025737118f1aae68371fdb33a7f3aa53233a9992324b633edcaae3c89444bdf"},{"signature":"weatherQuestionHash()","signatureHash4":"0x99b55983","signatureHash32":"0x99b559831aecf4cc0170d71db9bc6c34cc63f1cbab53927c8c7ac74dd83196de"},{"signature":"weatherState()","signatureHash4":"0x54b4bf39","signatureHash32":"0x54b4bf39ed9bd9a3befa1edc61c41a98cbea4c15242352038571a8c2c8707565"},{"signature":"WINDOW()","signatureHash4":"0xa53e5412","signatureHash32":"0xa53e5412f69da8e653a04acdfb2d9080b28fd44f41db6b29e74d14d5508ea962"}],"event":[{"signature":"ArenaPulse(uint64,uint64)","signatureHash4":"0x66e13a47","signatureHash32":"0x66e13a4728a238d2612f0259e67de209fb5b0fa56a9c55ad876c7e1f9c48c8ba"},{"signature":"BuybackBatchProcessed(uint256,uint256)","signatureHash4":"0x0fb8423c","signatureHash32":"0x0fb8423c66edd4663e68683af397ecb35138ea8f0d07a115e0b0c654913c0be3"},{"signature":"BuybackBurn(bytes32,address,uint256,uint256,uint256)","signatureHash4":"0x817bb2e8","signatureHash32":"0x817bb2e86151cf2f497afcde26537ab77f844c8eebdb29c1fbc720ed4bbdcf2e"},{"signature":"BuybackDeferred()","signatureHash4":"0xb683750a","signatureHash32":"0xb683750acf37a97a8115d148f4c3e99b983003ee077e4e59a05280828bf68307"},{"signature":"FeeAllocation(uint256,uint256,uint256)","signatureHash4":"0x30860b03","signatureHash32":"0x30860b03e8a75f18269f1d68389c3d8cafe3abd5aed5ac9887e7ca538f39bf06"},{"signature":"FomoBuyback(bytes32,address,uint256,uint256,uint256)","signatureHash4":"0xe1e7d292","signatureHash32":"0xe1e7d2926cb6821231b4e1d0d5d2433fbcf404a40a50bc3f26c93f55f5306fc9"},{"signature":"FomoFeeAccrued(uint256,uint256)","signatureHash4":"0x27adf6d3","signatureHash32":"0x27adf6d3aa2a7bf305ee6c5a313eb2209d7a1282024c594ab8c7fe3c872637b4"},{"signature":"LiquidityAdded(uint256,uint128,uint256,uint256,uint256)","signatureHash4":"0x5784b587","signatureHash32":"0x5784b587c773079de171c8f871fe70e3a555944e563fc671692e551c9bcaa023"},{"signature":"LiquidityFeeAccrued(uint256,uint256)","signatureHash4":"0x03a6b698","signatureHash32":"0x03a6b698c331098c3334c794c10c0b8f0ad445196769e69d56e4ffad85df4921"},{"signature":"LpRewardFeeAccrued(uint256,uint256,uint256)","signatureHash4":"0x6ea2db61","signatureHash32":"0x6ea2db61059993bf26ef525a0c29725b832f84b31a3e64e78bc3fd944983f861"},{"signature":"NftFeeAccrued(uint256,uint256,uint256)","signatureHash4":"0x29f0079a","signatureHash32":"0x29f0079abe49c4c29ec2718b6d8bff13c03c0185f94804878ae1aed57c058240"},{"signature":"NftStakingFeeAccrued(uint256,uint256,uint256)","signatureHash4":"0xf5481289","signatureHash32":"0xf548128910c4a97aca9cdccb1a9a12ebcf69251d41d0114a1f957217a7f17dea"},{"signature":"PlatformFeeAllocation(uint256,uint256,uint256)","signatureHash4":"0x53d977c5","signatureHash32":"0x53d977c5060e3113b06a380ff87a8ee198f28d5254132ee651e00b87cd7c0122"},{"signature":"ProjectFeeAccrued(bytes32,address,bool,uint256,uint256)","signatureHash4":"0x8a16a886","signatureHash32":"0x8a16a886daeed8721143e653d371511dc8d04c6e40ed9dbde857ccf86004f956"},{"signature":"ProjectFeesClaimed(address,uint256)","signatureHash4":"0x983dff2a","signatureHash32":"0x983dff2a6e174a04f33ae7fb8a8e775260ec968eabaf877a6bd0264e8b358055"},{"signature":"ProjectFeeSplit(uint256,uint256,uint256)","signatureHash4":"0x954aafcf","signatureHash32":"0x954aafcf3afad64aacbf39234673e6babcbd5dc35f31af3bdbca7cad7d03f5f7"},{"signature":"RewardBoostActivated(uint64,uint64,uint24)","signatureHash4":"0xe4688b36","signatureHash32":"0xe4688b368ba50f37acf237e8622e557aeb455202b360f4d0df15624d941d6ddc"},{"signature":"TimedBuybackActivated(uint64,uint64,uint256)","signatureHash4":"0x9aca821f","signatureHash32":"0x9aca821f1e96c012d7cbb4287ff0b54e072250ee8744ab0dc30ed9c7e0d9c386"},{"signature":"WeatherAccepted(bytes32,bool,uint64,uint64)","signatureHash4":"0x83431d06","signatureHash32":"0x83431d06fd944ea04829e587022035635820ebbceae10e2599f10854785cb0b8"}],"error":[{"signature":"BatchOutputTooLow()","signatureHash4":"0x873d73a9","signatureHash32":"0x873d73a991155b972a5f2acdbc594e3b161a020ad6e565f9797d4a660f5c537a"},{"signature":"ECDSAInvalidSignature()","signatureHash4":"0xf645eedf","signatureHash32":"0xf645eedf0193584640b6b90cb9477e4c95b98636c148a891d4c0a146dc46e75a"},{"signature":"ECDSAInvalidSignatureLength(uint256)","signatureHash4":"0xfce698f7","signatureHash32":"0xfce698f7e8e5342cd615f641317bc45fe7e1e4a8b0a14dd1383ff8dc9c41917f"},{"signature":"ECDSAInvalidSignatureS(bytes32)","signatureHash4":"0xd78bce0c","signatureHash32":"0xd78bce0cccb935155ed6428d1c13e50b7f3550fd2b66b9fe266006fea4a5e1eb"},{"signature":"InsufficientBuybackGas()","signatureHash4":"0x13f2264f","signatureHash32":"0x13f2264f5273983db00c3d92e5a9c9a92d8f405ae4d1d0ea53dd7ead48ef06fd"},{"signature":"InsufficientObservationGas()","signatureHash4":"0xced2a31c","signatureHash32":"0xced2a31c56ce44bb72f984cde380595d9e152b23ca840dd563b236e4e7ebd9d7"},{"signature":"InvalidActivation()","signatureHash4":"0xe72f8984","signatureHash32":"0xe72f8984b932f5edba5c41acd88c04a4f7aab1e6f717e95e30b7688164f1e776"},{"signature":"InvalidBatch()","signatureHash4":"0x33b094a1","signatureHash32":"0x33b094a12ef49fe7664c74efef77e25d0192c42a70d75d3420a026b7bee7b765"},{"signature":"InvalidBoostActivation()","signatureHash4":"0x5c06dcc5","signatureHash32":"0x5c06dcc59bd585ffa0cb059db92474c6465c8799c3845af2bcdc91fe0d454519"},{"signature":"InvalidContext()","signatureHash4":"0x271a26f1","signatureHash32":"0x271a26f1cb99e8f8d5c179e3da270b7d5b348ae897f4ed0797721b4c3d6ca4d2"},{"signature":"InvalidFeeClaim()","signatureHash4":"0x67e1f8bd","signatureHash32":"0x67e1f8bd9b51936b24990f0962fb461af500c01805bc7c5ac16645ee935ea908"},{"signature":"InvalidInitialization()","signatureHash4":"0xf92ee8a9","signatureHash32":"0xf92ee8a957075833165f68c320933b1a1294aafc84ee6e0dd3fb178008f9aaf5"},{"signature":"InvalidLpRewards()","signatureHash4":"0xc68f8249","signatureHash32":"0xc68f82492000f0cca17ceeb4d1f70d362932c72c4c0236fb35d6cc7e25ed5c61"},{"signature":"InvalidNftStaking()","signatureHash4":"0xe3cd239f","signatureHash32":"0xe3cd239f7b8c08850c3a29a4823841ab614412de716ed2bb4e19829103fb5b3a"},{"signature":"InvalidPool()","signatureHash4":"0x2083cd40","signatureHash32":"0x2083cd4046029c86451c2e139a91b950c0f6ebc0dea58aa338e3029a5f151d99"},{"signature":"InvalidPoolManager()","signatureHash4":"0xbc128147","signatureHash32":"0xbc1281476dd8ae0cc0ef8b101d7775d6541afc7a74fd37b740fe66c3ea310067"},{"signature":"InvalidProcessing()","signatureHash4":"0x48e398d8","signatureHash32":"0x48e398d821c09bf837037d9087bfcc509c85f9827d38e69892fde527fc6e95ed"},{"signature":"InvalidRemainderProcessor()","signatureHash4":"0xdef90773","signatureHash32":"0xdef90773c4c351538d6f22261f56521c56beced7285254c4a5ed1cb8b5a7207e"},{"signature":"InvalidWeather()","signatureHash4":"0x83efa26f","signatureHash32":"0x83efa26f3708f8446bf8aa976031114deb5ee1209b94a95cbdf41ebdfa444db0"},{"signature":"InvalidWeatherSigner()","signatureHash4":"0x13b9be98","signatureHash32":"0x13b9be98448107c1eda9ba73f33b6ad20dda873313d0bd59ac4f5e0e4acc335e"},{"signature":"NotFeeRecipient()","signatureHash4":"0x75c4eb74","signatureHash32":"0x75c4eb74d084b9bea61bffa2fdde443ce9f9ea901b7e53c67a99fa916c75cbf6"},{"signature":"NotPoolManager()","signatureHash4":"0xae18210a","signatureHash32":"0xae18210ab62e9620e84799499bafdb3202a30943ba8cb533c4bac9cdc8ced60b"},{"signature":"OldWeather()","signatureHash4":"0xcdaffa68","signatureHash32":"0xcdaffa680b8730e2e7c90febf63b2286a31409021653db20544aea7f15d955d5"},{"signature":"OnlySelf()","signatureHash4":"0x14d4a4e8","signatureHash32":"0x14d4a4e8a5140da60b7a280478fb427da973ca582a83cf5dbad8c5f2abee9ba4"},{"signature":"PartialNativeFill()","signatureHash4":"0xdfa0ff4c","signatureHash32":"0xdfa0ff4ce913595d6d18ff72d73cb3a016702851047b27e28d7f9a016289e730"},{"signature":"PartialTokenOutput()","signatureHash4":"0x54fdbb1c","signatureHash32":"0x54fdbb1c1929d823de22102b184c0005491c49b5e50716dd088479224c41d4ab"},{"signature":"PrivacyBuyRetired()","signatureHash4":"0x7d6060b2","signatureHash32":"0x7d6060b2033037a8f688f7d6a349650cac707179dbf7260e69a0e2725d221591"},{"signature":"TotalTaxExceeded()","signatureHash4":"0xe8f1a8aa","signatureHash32":"0xe8f1a8aa8385666595dfa9216fb8e2b3db80a6889d67b5a5314af601f3caf804"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"1","address":"0xa62f9b597225779b430024398B70374E8468Ce14"}