ETH Price: $1,949.98 (-4.93%)

Transaction Decoder

Block:
17999819 at Aug-26-2023 03:45:23 PM +UTC
Transaction Fee:
0.031821949315584912 ETH $62.05
Gas Used:
1,839,948 Gas / 17.295026444 Gwei

Emitted Events:

291 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x00000000000000000000000000000000000000000000000000000000000ffa68, 0x1cc0661d441c3f3fffe388ce20a3d2d8b2f0d16eff4cf0f71032d00614aa90e6, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, 8f6cb55df7e53eadca617b9edeaf807b00ef13d7e5294d5261f13a18037b8edf, 0000000000000000000000000000000000000000000000000000000403e2388c, 0000000000000000000000000000000000000000000000000000000064ea1e13 )
292 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x00000000000000000000000000000000000000000000000000000000000ffa68, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 0000000000000000000000000000000000000000000000000000000064ea1e13, c1b634853cb333d3ad8663715b08f41a3aec47ccbe65b2befd90487ca754a0b5, b80684ec985162e28b38f1f3a27e286763c32758000000000000000000000000, 000000000000000000000000000000000004f6f2000000000000000000000000, 0000000000000000000000000000000403e2388c000000000000000000000000 )
293 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x000000000000000000000000000000000000000000000000000000000004f6f2, 0x28e3aa21ac35173fe01d43b815cf67381a7917e34ae860a3b423b3a81244954a, 0xda53788786132d83dc67ee4a7b496cb1ccf11d0cba3d9f623772f0a9e1152563, 6b7101b4d521c543434801c69224aade07dee6bef077ead563ae4561633f1c6f, 00000000000000000000000000000000000000000000000000000000000ffa62, 0000000000000000000000000000000000000000000000000000000064e8cc93, 0000000000000000000000000000000000000000000000000000000064ea2c23, 000000000000000000000000000000000000000000000000000000000112914b, 000000000000000000000000000000000000000000000000000000000112a7d7, 0000000000000000000000000000000000000000000000000000000000000000 )
294 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1876592, gasPrice=17295026444, amountPaid=31885870542550801 )

Account State Difference:

  Address   Before After State Difference Code
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
(beaverbuild)
12.010331608126499165 Eth12.010423605526499165 Eth0.0000919974
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
5.000725959925758035 Eth
Nonce: 274148
5.000789881152723924 Eth
Nonce: 274149
0.000063921226965889
0xe64a54E2...80E2E4eb5 586.732982473103985054 Eth586.701096602561434253 Eth0.031885870542550801

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=325362, data=0x005BDAA3248A12D17B914454D5FACC781436655FE107427A392FE36C7AB8340CDB111AFB24F7787ECEFE67CE3957939000112440A054C4B6416A0A15A76D9AB658AA9292B07C2A4A596C21BFAF265449AA59A3224EDD02B501BAE6AB3EC08B58D216574BC4FAC4A5D5D2BAE06DC1CB5CD6CA0B5CAD01BAE6276001C492972E2F980B5EE60257FFFF67AEFC55B52881266D885A9C704838E1F8AB6629D5B2AB9EB4CDEEE11C69F7A4D0CD2CC79A40358D760512BB02310936009B98D9386C9A70CE685EDFBE0D9A52CD1A0961AB059ED1626D2038101CD0E0182466032370C86C4BBDA1959CF26C486D55A936F5B08933D5051A695A0E493E2A069F532D393438014E1ACBE9131C271CFF7CF9F3C7FEDB4F70485FFEB4ECFCF3317F4EC1EFBB25B82CBBDD80E1CFF6791CFA71DA6493858BF3A240E4E450D7382A46E2662F29840624821F1F05D1E7FFE7EC7FEF43724B3DB7BDD2789DB726853164248628131B969A0828F608961E4DF97B3E3C53B5F7BEEC36D9DC9ADC26A3AD122B31491547DEF21E08AD0542660A09D06A7B9B1CBF4323AC2E88B2A3601160BC8A818E7A1083F8768415D72A8744A0A0BFED0EC734C64DFF58973D012DC8199E61746AD41D90ECD8B202B709E990B1FCE47107C9144740DB1629BF0554BBAC2CF9202F02539189D805611C18AB427630BC99F23801E782604EA4AB6A6FD5A0414F405B096028987F2B9ECDFB84697F34F58370D1D4E9393273DD237A136FA2D8B89CB97BB3136A04A23A7C120690E095A81D565ACB62C886023ED7737A17DDDD6544FBD80575C2437471FE2D45C2A290483484394354D4134CCB1E1AE62C1D48CCE0A634645A20DBF538EEA76DCEAD1B9018E187C70FEDFC0231512E90E548E6B9513D00B20E49CF8D6D4B00F1D1EAC7C5B9F729779444E4259D0F04D1B7256B7E4088105F52FB6FEBAFA8BD9CEEFE817ED4FD063ECC12BE8A528660D0234E8B85BA0A8F95B2CB4AD58DE825A60670B2FE042424F9DABC13F6B08D3B02EAF601C88192E090FE1FD6717CD6408668262FF2E4C8A768A02D7FAC13D122036754D10C52C439A12B5CC4D0417133E6B3FD1043CCE4835629362608B5A7C6866E38986214403FCDB12D81D6D14BD5E093B7F8347DBDA61DA8EF18A7F8C43F7ACEEB8AAA1A0CFC90718CC467AB783CFD3E1565C04899FA253865C8942CDEB59BAE0BF6A8A023BC4B0CC2D4DBE3C33CC06332F26ACA8C89EB9B6E171BF32BF74EC0AEBB6836960E812A442CAB67CF6DF4CFC0F50A49C36CEF3F2DF3BC4A64822155762C5AB7BE0E33566920C504332831084A3951BA6E32BDD0651C6439CC4FF75EAA01F914C1F5CEF2721C00030EEF642BA97AA8FC0C821ACB883F1FAF9A62DD25FD6DADBA8A9ADD1B02736745018D128FC3156F770F9EFFC7C9AD97F46802AB8F9297668B853906A3DB0671FC9A1D1FCE81FA92153A73FA3AC285779B9E2EFDB974CCF35B099D6EECFBB0DB0367FA9868321AC2D1F116876DDE1131ACF3F4869CDE88410259A95AD43FE741900904D432D8BAC18047EA2B943D19A317BC525B98F51335B200EE8522C30FD2C9ACA70FC233DE0F3C4083EA0867D37A71B2F617AFA7E84DD928BAFE90AC462CFCDDB51AA506506373A6EC91A62D37231590CE8C2617F03EBE8AF3B8014195E34742435D9F716C7148E00BB980E88BAAADA6FA322B1078ED80E9AEC55F35899F513A916042026895D0FD9FA40E57A9414DAB092E83C60602720176D6B8E1AECD0EB89ACCAE848F74BB60B96DC45BF06E857AD84A05995EB70D4B1804D8035E03257F6A219D34166F2CB1726BA5CBB590EDA835A33182CBD043625E5A733FABB76C8D862E7192336F94B782AD460CAF68301C31E9EE8A22E85F63A32C7839C057A99B40AF56DC135F0D9AD61F42E9233C0588DAAF2C3473409EB04886A354D8F0485DA8F7AFC1042C4FDAAFD27EF981E623905F11A4E45AB2AEA2E4F9F4761BFD761C0F7209D430DE7ECC7163E4A70B5218DB53A39DF241C176A7EC137F479EDE95A2717F57C653DA5E34E07F2ED712BBFF88C77DBF07358FA8A8097803B048E597C13B71479B8FB32071A122B60F82D95C2101E078E7DF1D7AF14B5C5FAD90DC5B1D4B3268EE6289C878D2F3DC519FD1A5D5094E5FD88FF3790F61DE8333A010D7A20075A3272FB60A69EF650C79AC0CDF0AAAB47A907CE215D19DFEAA45F1FB14BC143E3414A8FB4AF1A50949205E5AF3823481CC0F4DA9B524903B3E58408DA79A7DB7E3E01724443F7636C73D7C739EFFA841C5AE95C38B12804F660969254CAB6A4DFD3E281DD8AA81CED7FB3F5E39F32B4A38370E0A3ADEB9139A0C4479DA993070DFD4B0D25ADF14FB3507E964363DAC5A5122F027CC6EC7970E4C9D07355135E1AEC668DC615FEEBD109073FA10A9A13B0408FD687DF02EA92E9E7368447F25694BA6863079DFCF3D28307F246489BA1C9D09B82C8A725E7B4B086DDB677573787FD43B52A17D7604EB4BBC1CF29D7D74C10E7151279B86BDB1F130CB8A08F4F329917041A381F46FB94C60D3A3CD122E778733C35492FFAB031E96435A6156FD8DB98884742CA99DCB581E94918C9802F35EF34B708A462C3F4AD63ADE9451988D3AB9742209453244F19B9C813F2231BB9A681B33896D1978F13BD05F2F004F5694092CE167929414D10AB8380AEFABDABC70B3ED863D42537CB47830B0C792EE6552C9155DE706A2A5EA60B45C493A838E34833F350770F6148156B2F3755AA226B74060A938CB31C9FEA2E55566D7436FC2825A4AFA18FE34F44EB40641CB60F6EE6A1752E23FB3036D95CC82211E36C46EA9A6CFC8FC635A09D97453F22C661635B6FA054EB6D2C1BA2DA8B088857F24D803BFC8D553F530FFC20AF72A411725E855E35E74E35013E08CB64F967A3286A510946B12DC0F4D9F3EB9CBE8F2FDD99F8BE8737CC4A5E6620F7406DF06D205D743499C6E893397C889F1E4AFECC4648D32040E5E8864996A61FA72976F489EBA63F29224CDEAC9C409CF541B4281FE99C32B918E71DD51647F63BB1311E136AB4864A6E3466A5D886A6EF1F04D5F807A6E290767C8B9AD82EA0A193B760F8F843F8E5A76798E0BA572E3557B6A1D1DD3DC30886FEFA3CD4DC22A8A85E708A557B0480F67929A9F7A6782E1EB3B38151C8796B7606EAAABC4155A50FC60B4027AE66871227F278583DDE1631D9A25035C1B878D6D22BE78B89E832A91677740CB865CDA05FB377FBCB590E6E550D8B795B0B7ACBBAFA9739CE709314C15057C9D10F320F648A7C36DD42C22609890410EBF7096749C40AEBF0734F88A7FE9D65914C3CC123B69D79211AD502B2A667FB0EA9D3837E708F3AC3ADC1B12512CB4799EDB8B68ECAC5F07C90D21C6CBB3414CD02E89AB9D7B82C04F8C50AF3609CB46112848C9B938F9BBC7B16185844915740D011C8C789DA79E9EB5ED6CC3DB5CB156D7F3774D041160057E070804CA130828398F00DB769C1F42FC4BBE4E0FCCA23A7393AA5302946E3C59E819054BB0C405B76E3BE7DD731982404F0293C83122F3D1D256D748AE77A891CA0CED00FF74A155EE045B619BF99B4180696BD5DFAD5F2059E31C60C548C0FC0F045C398A27E3E6F246B65594D6CF7E406B8F8AB6C8A2406980C3BA6A3209F0641BCDE24E7FDB9BC3A007CF4B4E0F5B4B9FC5F1FDD26F3CB1719C2609D8F50F8300BB6B40EC619B6CBE64167A6CCC509550B96DA25C3EBFE07F47A9837C4AE3B53BA1E7132810EA598A297245498CABA85AD8F3CA2F4370753B9EF77DEF232A45B6C0CC67A144F9A6F9080BEAD19BF71CB50368D88B1316C82EB415D3FE100D651E3A2E50582257FCF36855716D6DD4F925A2D509FEBF51453D4C0A03FFFE72B509BE6FD22527F1F9FEBBF11A2C670E4AAF948FE72BD107D746F78988911F175B599C11FC695A0A15473EAE8293D76F52E8585248E2CA12D2A569D0883DCE31F32341F04C2B6564A100EF13E3B498294022C7BA0F44620552B43CEBE13B3578158FD7229FD14D2205B92273D6C217CDEB3E95788784737AC6251F26571FCF82CC28E934087EF91094CF293A1838C754840710F508A34357B281541B1C9EA7726EF2341284D88911B221E89B83A4915794D7C61EB6A41B7E518D6F748481E14EA48737221148D49F52E1FCFC1CE9847B8BDE6CED6173D280CDE84D7ABCD099FE186F48275826146FC012A489F78FA1F73F5350376B4F7EC332C0B7AAD1A51688C1BFD9E6A62917274882C190AB36518C2BD3F08481E433B892FD3845068F101DF24056F72B4C13382AB09601E1991A69E42C7F057F26361569999A8C212507EF9A40F9C134BE827CCBEE833030A451F9438E4A33F164644F8FD6CEEFD0FAAD8C4A1C986E7E7B1F93DF7B970B2DC04C94961F3835A4498E20FFC29F39CDDC3F698B9D047B1AA807C84F99C0B871725DB748C525118830069BC4F051EA15610E97BE6397A8D3F328494C8321A5F3CD8D8488403FE9053928D16B0321A51F03C950F586AA10023A35B2C9925DEA575ADE0851E318C89B78C25F397A277F4BBEC2728CD2834C9308D77A0C65B45BC66B0D443F8EDEB7E5BFECD35C43107D14902C3DEC0FC296FE9C627F2F4C1ABFFBB70E3A2A5BD20A2845C0B8A467D85253DC63E3BE0F634D2431CD97ED11BE6811D5CF63E73CAC5860B20706F165960D8D372111704F5D91705873D9F4813DBA3243D4C318ED7D7E8BDFFB3C7E9036F8A02C2433DBB8F538B90E89630BD35A909C215BB4EC02CA3DD15893F8D820EA1BFF3F32705E71E15F1D07C0005FAC2A316E8D4EC90CD5B4349A7E9C501453C852DCE02451F167D759CE58FF68805E0D502DA3AE3725CE1D4070C137A14D70A0D29BDBBDBC474722F8C4ABFB9DD40AE602D10E9D3168A9A5C1A14F99A5D7C74C5B9E06C40F51A4D18C5E3717F35227EAB0D2C69798A8397708147FC79DF3E71691F1B8A25769AB68D48028280778281AFEAC6B9D9D74C5789C39821DC24CBD1C2491E601D2E767EE0366806EFAECFE87525FD5ADA8A30AE30652905221E869372A65A5CE9874E3152EE27F209E980E7B4D816940AC212A567CFAADC580A091A79FB1E328ADB2A059B00095315C3522A2D4556CA0AAE0791F68A53910D92CB4A81FFDC97C5CF998451E8DF1BC0CF72BB909CF6E009D2401D07BCE37C814F8AE08393094094130096FD0DFC21234C74BB1E69F4111FE7368DFAAFE8490C56BF8CD2C1F019DE41B128EA2401F0423557444799F8B2C6190D79F341F981003AFFCF6292A4C5B0BF4456A0624EF0FFB07D2301A560FEE72B952947149FCF229982174D7160EECB084D9E8F8294B05D8BB13CBE4086089227ADB4C7857CB5D8BC2189BAD36FB8F303C45160B88C9F6D1904365A4137EBFA142683795BEA46F8463C772BD90626C4DFB7EB2A865DB86141F8D74E14317BAADD109467FACA36505234194171B8D1E0604175140D9E4F1058F925AF1B2B51A22E9C0E3DCCECBBC8CD092D8284952F5F2A6C9A87D9A314CD4A8DDBE2BD76C7E79CC50AA679217F74EEB9AF7093E06AF74D083BAE1B458E8FF045DDF4F731E28BEE3AE9D071DFE39AB8EEDF80548CA48EA532B60FC91EDAB6AF7E7A3789A95EF6265FAFBCF3C282CEA0709014F21BF98A7C05E2786957547C0BB8A11E1CAF222E9723A6C74BFBB59A2E448EFAE25EF88C82D2691B5A2C155E92FF101903DA9540BE243F5FB2A111DC76B27E46C0CC563C5CC91C24F0122DE38F9ADC8E1561BFA5C00F3571B13F2E7BB029D95AAA3552839C60D5BBCE93B2791AD9F6101F19295EFB69D609BC1226AD915D59B5038ABF17DC068E944F553EB518D449F0C87705E0A23A7837FFA253A009B79EC91736FAD2B867BECC73A26EDAF515E1073221C5A1A001E3CF913929C7B8BB1158DD224A9664A4FC1D58E94E9754C1146565985CCAFDFD21EAA8EEB52542BA690A8178A3F5F829CC3A20B663EB7AE05847AC982422014DA4DB8D0641CF3B44D6A3C250178B74BF7D33F3D051EF4CDF4B32ECDAFE5365088FF04C39C4A25FD035CFAA28C3AC1DA9DD847FE0506F17D082BAE954FF440473D809EDE69DCDA68BB66E408491EF0FD6E0A9DA6B0E8FA14D21221A0448176BB1C9577023D66370254BB74E83179FA30B49D220360405DC0144E9FB26B0D626FC65BCEA09F5330B6357475860D74396E633DC4A842A1805BC5ACDF34D9D2C30EB6A4ABEA0AA18EDBAB27AA26CC7D337B223F24BE0011074EDB0B83F84A2BB959681067F8A582625595CE502DF45FE3441A3A74122260456ACBC4CD566629A44566E70F9D0C18082C839EE907FAA175AD6BA0BD0FB640F040708A1FE0ABF460335D32F48C60135FB800A854E7EB7777C9BB29D430EC46006D9A7E05C60A79A52F938D061EAB8A8E18CA3F435EC01B28A0EACC47711F1C2701032ED21AB009D1CDD7C0A3A05B46C68D37C420899A50B5FC649198C58F6D988A963A107BD811D6D09C7065E67BFD934EF2F5E516E2DFA4C17DA676A52B94A0B19E6ED34CB72143CAB4774D609E02FEF114CD7DA702BE7FDC5364319EE7CEAC21BE7E15514434389AF7B8AD40E3CDB6B4F2F8F3FCF2C71422A5099E10041010BB4F32CBE46B99CF55CC6D2CFEE517C36A593F7DF2394A7BE671C6FCEABE2C3EAF011639ED4A18C4B734ACB8169C00C5C25D6DD26BEE1F7A48A9115EA50148A9B55DEAFEB38C2C180D15D15DC423611725D4BB665E0C84007D3B72F3CA2CE4970809AB4BA4337D0D527F6E65BEC50E724337332E0753E4C78000D5B2EC66B6C334F66994F2FAD955C118791713EC685AAEFEB02F5F7D94052930ED0F18C4B7FAEE1807CDA959D8EB17AF61B642D2ED130460E175C0D1BCD623D673A99C7C5C4B6FAB21C5DED2E325207992F41DA6AA69E320FEF342D4BFFE4A8FFFBE549623E1BA3C6454DA54598F64CD0F60E03BCCE644B9B5C761000EA7896467B9E211C1E9BF9ABA4A7735A7FF3C970C3F0D622E6E02A310EE7B5F87C144F94F7D442FA814F04622EE734B3A5A7E98325485AAB69FBADD4F445BD6F0DF1EBB8FD1600285683125954E30D80EEEE79E159604EAA9B994A86695A8E5FA92F09EEC7E26495B5FE8A09EBBA8AE708A6F0E3F312C63E4316482A78A284DB90FB694EC0B647278B45F5B2F99E933CB2A0B8A9B65B9CEC304CB1BAFB72BABCBBD7EE0AF1700935FCDAEA7C88E98C29D818D1069CBE43385F4129FFE52709BA776D984C9C24F2DCF033FA8AF93C2C01E5FBE918A2554981ED97628B34FE976497003DDF7099D7FE788C1573C1A0C6783D56900E48E609473A2C30263CBD05BCAA0A7122DC23C09F0CDD6976E04108D196CC5F11C7C27BA6E8A9E5B12E42A15E28E3A9E5DDE39A97F7C8C29179F02B0BE975DAEFB3F5867669648FF05885BA40E20527ECDDEAE2022FB4FD13FFF5BEE8400F731B59BDA112333EB4D19D71EF6B0AF5AA3631B5619080118BBE0A6653D98C7F0FAB1C3D302AE86F41B325EC82875ECC3CE1F51722BE2F301D17EE71EC301FFF058596B9C9FA3B16B6EB3F14D7FB6BF2014E6E474A00A154BBF30ACA52D0E5CA2E3CB4CF03A9F4E34CBD3D8AAE2D7CF12D0641BC498467626BE52E582933E867764BAA8156C75B32470DB4F6290BC1F8ECE3CF60BF78342DE9D2B47D127BAC4E1AB9FAD8B3CAC4AB0F1D31A2B0049531024A4F6EC7CA23EAC6814D35CBBA9FC504B5578D44E682CB643C3690CB4FB732AB8234FD5B4941E7E6C5C379ADC23157067DE8AEBC7B33F4FF8A29E72958C4B218E3E2AB2FD72E0840B6DAD9B419C1B5ED6F4EEA2A6521369C46A224981A7D3CAE862C1CEFE742FA3111D85BDDE6D89224F648C8621FBAF98A076D8BB4300DE4DEC3D30B0B2DEA95EF85D4D3A25FAF8E2A56B51DA2A47C69BA187F7CE642C0099CE18551CB5B77C16A1BC25989876CC67E37503B780A5609FD931933B183B905FA3E7C0C07D33C24A6BC34913F122BC39D3414EF9A878900349B0209DF265FB373B6DCE9FB09EA8452312B93BCD9EE3F068C8BED85BF01DC8DE0D062C1C877D2C22A196EA1BCECBC0FDA8ACE272394F2682B9E0F3526338B570E3FF0170A87D16FC92EF8350C3F8167FA35D852D031A1768B15DF53C7E7541BDA9ABFFF3EB7BC3FE17B57B06D4CEC084D91475A53947F5C04FAAFAE183AD5F06F314DDB02B517DB8568434559D78F6730C2684D9D1370447153EC5DBB27118A7413955D9D3745EE8B94397AB6800D875C59DCB7A03E995F578D519FBC8F3E5D5E4230D114CC550998D07E5DDBDB53A2111899949B25DF1862F5F40DE4D11FA36CC20A7B5FA3DC8517E04CA695FCD85A11DC55D316D42F43B0CE5FEFD7D09B508B9EE10FA9A4CB5751D9B86442C9718C18C3BA875B65C0B7F949565A7CEA871DBEC2C4FF48575F5422C271963E793BD959E0B603926CA03C9EF44181CCAF6269DCD0E82DFBAC8C696CF2DC3485932314A97DF3B7448037B480ED9940E14607873A034FFA8472CC6A1EEA4CE676833DBD73C689DED67D9BA06979AF1095B4A4CB5AF67468160821194C9CBEEADEF40970071F532EF0B6F6348E79D84CD72A8726DFEADF76FE02C87F0137FA59DD1F2828BE140BD5205C02BAC775823E57111581690C52F4ED80DB9AC2DB56BA2AE6E53E9A5B9E75A1A6FE93DE76EAEEDBA97A539128D338CC146C592141A6B93B63B61DF16F0E46DFD232ED97371B08BDDD9062C97722E72718F81DACF085CCCB120027832E5EFBE01791EF2D974293593E5C03555443118CC7B9A7E06B14421812BC2DD972139429CE592669780AF0C60022A14635279F2515D6EDAA4ABB3A4A027CBC098E9DFF681D28D5FA58E238A2A7898C8EF3A4789884E3F20DCDEFBBFDCF381C84364D276592DCA0A115DA6FD555A5C2B0DF464D76486294BBE79582CB77F9BBCC2283DBA5D3900B1596F5B50BB2F8BC37E6C58B83AACF8D8A1E6FD2D15CBA33F0685053060E47B3B21F95D8054962B34272D9CBDF6BA47E5B21035A852A8D5867EA29B3488F23C2B53C8FE34C2F157A1BCA2A1B4891AD91E314624D92F5B36A05BEB179D8E00C0FC707ADEE983D6AA4742FC64418DA386696FE10D6A55FAFFFE210DB9DE6B8B263D43811BE01113581CBFFC030391DD1A09B632A108F417ACD4DDB856DD9B139A2287799B13589FD008F261EC0F25992BF09C5BD7FD3DFC1F1145D7F87090E81AE89B8954F17A837E0F1708C2FD5B2FF8CCAC5AB012C3F785B46891F5DE5E1061332BDB191EE53E456F8CD82419881694948A74028EA64287C459B10803B0A93C349E77014AF918D11E8D94C9E39920C2655FF9E74E087926A308D331AEE0750487CC349D3CABAE43883BBAC86C1BA9D05D2554C62B4DEC30EAEA2A8D4380B113AC987D17214348520869E95D8B2A2C740DE584856172C914CFB1B837BD82F0341549FA5EA40A4A0148BAE067003E03D2A179743A191E03CEDD111A9189E1EC6BE59DBA2F62666E5F9CA61166FACC7759E2C5CD3B81335EFDDC7004E48BB70ED8B070E560F9CE18E5442CFB859D9C3E4A11E9D39E3FB54856425A4A5BC19F40B42EEB8A550D947C9401F5F48B84FFFBB1719FE0755FD482614CA1D7F614C8BC265A387A3D1E7910FF49399BF3E5A17E03AE10FECF8E946B7350A137CCFEAAF3BFD2EE5F5E1CCFFC7E205DD5F0EF26CD05B4CDB2BE0AADE51B7A77352BB153A86B030FF523B8375EB08A31FB45F1340A1362320651964C215E8B008D1521B67691BA884465B41037EF6AC2F4AB04AA60C76E8341D0CE4AF7014ED66823EA359CFA5D4A04DF9433E14BCEE68CB0963FEF6CA4D5E10B4D6442CE58F344233B16309FDDF6BD19602CAE8B5F20840FFCF445ACB420BAE4C3F818B3B59CACD0DD44AD5CC6E24B9FF0D5A5FA4863E16CCBCADF0B21E1D859CFED5CA25C10BED559D5E62656C9E52143A1623EAEE1C54983E3C4E228FFAEFA3D6EFBC978FE107BD6AC624A9E4E0C053ED2E8575091E52AA1D537587BA0448900345407D77DD69A4B9ACDC7681A33D09A2D2A2173741675170C4D8C0390CDCF798F8134986B8455480D7C72B83784C554E6AA74AE56220317590075261ACA8C4B146BF4133E019BE575797910A082D82283B661E37CC3ECAB8D6CAC3879E8FC5AB523A760600D4845FC9B79A689B3EECFB8E92CDAF2DD339B98C4E3B72E203BCFF8C56FCA914CDF0921E1E462A95014D2061D1AED1722DCEABC3B3D6FC5E961036FB22726725E0B2EA7C80A92F5EC241A3CD8A5612E02F240064DB5357F0C824691F60FC4ACE44D0E7475B29C87E0A15A9C5296969B4770DA39CDAE2D90424C6E7886CE43A5D861056730A390AC7CB11763DDA2B3E3638246395C97ECA6D3771132E983DF62DCB4270BCE646C41EAFD2C2CCE8A5214BD5822D488796B262261EACA56094BFE0358E5FBBC2AC5942F548FBCEE106099B9B305F927AE2151716BCB630E196FA0AD8A385676D5345FB269411B0AAF278027D14B344143FD8FE7FD78E8F7D0C7AF52C760276E746A06DDE671361AFF25F0E07AEFBB8FFC2A03F75D0C2BAEE52A0E0A47CDABAA8F1FD51D6235B293563268AA8FB4AB31FC9936EB3348D6DA27DC3AE6CB57222B93F6240319BC526BEDE0E883811020AE4EE554B15A46BF5BEA412DE26DD7B8E10805538643C7F6FDF2400D71A3EE1150C923F4EB5BABBB67942CF1C810ECA67701A72B0FA99398E5A01BD4B17885F08DFB344DAF24A592CED2732450A19274A4DB354BE9B07F7854204FDC446E1D8DF746597F4A8674EC411E19D4A717B436D2A100C022CA0D6A35870AAA2BFEAC6D4241953CDF9725E3BEB0E189D7EE6C90A916F537434513DDFB1608A30A71A95B321DC2620C5EA0967F2593D7E01658280F70C58E4E4EF00A2C003E9FAA1833ED976391375188C6843307DF12B6946CF50DF1772A2F7DB1301C2265DA1E18C4B7B3C597CE6974C0CB14D3ADD23950BA69464F3AADAD23048B77C19A2689DB06B43872F1BED64EE089913F7FDEEA75000CC8279A0A43FFD21BDDA799DB6CC413FDB9A3BBFB8BE6A26FC4F893F4E80EDAB00B9030098A2AB07EF566EFA97DCBFF8E80A3E64DB868349375EFCC9D1E8257F7D4B504D4EDA9693383D51ED60855688C150E417544C927E3D7A1F85DDC56AC57100325088F94763F6AC1AC1727E00E990C8ABFDF9ACD8C4DF4846F6DAA24EFF1A186582F5B2D542E7A2517D40091FE1F38D86F397D0C5B0F640E018EB5A4E593191E76FC470336736FD16102879D6886FEB77BFD869DE327CC3C1B65C6BBFA9F3E37C8D6C167B2CB7EEB904FF3564319E2768EF464B98458FD1C2A2DE99121E4FD874E06660582400E7D2E337C7A13674E423FD0244B66FF2ED8FBBAB62931F43C0A90DF92A9B240FD53A0CB4A40270AB27B2341C8DF273303FA3F0FA9434CE2CAA3BFBE13388694A960F9C0E6D74561F269FE02658FC731ECA199DD3BED940934A3805CFA463185EF99A455F809B5A8F56FB98685F3321CCA8FCCC7BD35B5F1AAFF8A655EA7D804C3D0ABBECFCF55BE937308A9D45435DBBBE9E6F3DCDA99D81B5E17CE7B950988D508FD09E8C7714F157852F419F55BA01CA66F8D26BE8596AE353AC35C7821F55AEB3569E73754F08304AF143CC34A6BD1BC3BC572FE4C49777BDFE59056386C2EB89A2C8C301010FB67EF3689D36C66E097A950C205AA62287FF389882C1C3E3119AEAB243D30A805A7FFB1E360CE86D5996A1B0CC0AC35B775EF3BD813D32ACEA867907DD73A8E1E3552909C99D75E501A4B609A2A3F41AF12CD92F36339269733A59E41B9859034A34054991053C0CCC4DFC825494D14F0216D4E9CCE90F3D5804D7494442248E2685B020D1A0764C48294D2B514133393702357A34C49F11C23F14E2E6B0FF69C7820DDD9421ACDA261A8A8A5B243FB23080909F0EC331D308786D70760DC686257CCECEE15628C3B4C917BFC23F2B107F0C89FD7C284B862D98C9FDE808BA296FDBF8966A9B6C62229BC4881067DC6939BA417845800E50279B550706CE5B03996488F30A00D7BA23E907C2F884FC8477E9414DB3ACE660CACA05F42BE1B71C2AB784DB97D416E9095F1EA2011AE9E94347B35C710A378654E29A6330260EFA535DD5CCDDF8E6431997743FAE54F329D04EDEF9668D37E5E9DB816F8BC9D505F4174F4FDFED2327BBA0348D3257F765F2F782B2684DC541F6562A28694DCA0876357932FE4DA2E52BF8E3F94D135E767534BDAB1AF49D92E62FFC3E50581E8F92664ED04CE642FC8441E012B0936AED381DCFDBF26DE03185693C435B28EF2A52C047EFCEF696447222E3CCFC574B0FA5D7F2DC336E7F293712C35792CDE470C6FA56ABC81AA4B0E68E2A7D2B1104377DB055F79E986F7C867D21098A59A5CA58367B11DF33503D27BF1C8D252553BD1127A4A0B3369FA6A1EC1DF8E8313EEF2313E3352118FC218852FFDEE6633A1E3E37E38EF79AA04E9F609343E345E45A2C975E84372AB9782E8DDF30E1B3460D235AC9D026AEB9B024ACDFDA5ECF86FAF17096F0523286D8A9C15656F62935A10B9147964DF83DBA49F48D8A9C047600AD208A19011C8740AD3F89462E3FD1371144585DC4388857010CDD9609026A7B558F4BF93DF0670EF5DF8A5AF6B30B02F4BF1EF02071F8C5F51F81812F587DFA01EC2EA04350BB4E7FF1308279CCF004782D71654E014D7B9283B1A0CC91763E79C6F629FE694C8B857C5E902B31097FB4536B7F2474AF23A9AEB4A48FB627DA0B72163691D4D05233BB9D51C5344F0B05487F80240A2135352108BD63D589650BC2D0A56E67BA112A68DCE7A7B872C919AE4E2C6DCFA16539049883BE928BC2F9470F0E81E5804A1271D44384EF457FAAE51B6D8E7C554A62E82BB48F86359D2E72063BA906B28998E3E3BBF04F0ECB4DD7A143CCFD98A177B162D9DCA382BD5C12FED49316A1EF24C5552F81ED03FFD057FA920A22A81A8DDD4808A3A8C61B631AE064D4D3FD3162741AA823E37FDD2FE95ABDC4154319DF1A0C99643037B8B4D13FB255F9B75A6F000524B2992BA4EB3B9C8E7554203CFEA27941E584DFF0BDE1B4119CC7D5DD034C30EFECF6F3FF0FC6C7CB2D188BF5B152B00BDB5C1D7C445DADD47E5E65F97BFC651E7C8C17F185296DE67DBBA5938E02BB122F79C2D9CBAE7ED8E5F13EDB8F32321C548C81ACB30AF1B6ADE3C258D0EA768C88F7EDB822DFDDB5A04272D4C41ABF894A4EDF43FAFD7F912A3A53D15591A14CC76EE10D55F1EE1C7D301CE0313B5DD86AF6B454D89E77F82BA7D872737AD7572E814E52A584E8BADDA4F3B9A41192DA13345792A1FB7C0C207E74336E3A3474FB0332A7290E0106A245BED741B080128FE6990AE6375F4C195DEB28549B51B7FE4E16EAD090755E65F57200E9A165F0048E072FCE7367FA64C24E36598B92F79B2E6622232E96C355A7F84A8E9CC097A3A618420F6C870C2217D2C8369018B29493A5D6AC7EA1EE27D6BEEF7BEC0B7E6BB80F99941B292905668F14888376FE98CD8383A9682F06106F0BE1E7FDE2735FB80C3DEFB747C5A7A14025A76DA0D42BA2448B0C08B409028933AB4CFB4CCF9E08A1988544DD0C04DFCB2F91094E08644F09B709820E962823E0F2F4F3B68FB62096CDE1FC66767056E193BB2AE8FA376CBB2A229BF1FAE89170CCE0E149EF617FF46934B604BA6576E99B889574A95BA41DDEEA4CE25AF4DB3C174B287BB10DB61456904DC15FCDFF0A26599340A02FFBF4C4FA81997BDAADC54CFD31563CD95143F32C41DC650ACBA3A9EF7E17D0E94D62F0B3D98A2F7D1016B863A5B4276C42DBA7EB5E7C0AEECA44E480B34422F8356570BE9F9E7A7E0E023BD4EE4A6E023A0FEA73391A4865FE4E6AAC82DE4668EBA9374DAB75F9A4B68A26F06D4D15A6CF0E14FBA48B0F697CCB9C6E830D1AE39F4F9CB044250E087989F737A6A3D9455F4D6DD3F54F8FF79F40BC2345DAAA414E286274C78D398AAE95FAE3FA674E1EB68210C5FF2DEC9CA6F489E582AFDD05F4A654BEFBD70F58434580932DD61FD48E6CD71A74CEBC7750774807049C4539ADDC9B3C439B54671B51351976FE5B5891AD535119303CBA1EC7ECB13DA404FD7A7BF09589C5FEC23D2F49FDA46CA43D1D62846F145BE3F39B725CED216AAA23804315F37293ABB6AB21657004E12989137BA51BD51F7C9C84228542DDEFE6AAA9280A40985203EF7ABD8B844EC00C817688D87168FCA7BF040413D6BC6E76E8FA4AE9CD9A42FF516FE8D959DB295E74126E1C598298C0F68BA476AF61E7B3121DB8819A479AD73713942EB741E059A54ECD6FFA9DE5D719E0694262837AAE675FADFC0EBFCDE54426FD9B6FFD489DCBB4E25E15F5A6D906AF960C4C84B0E7A904CBBAAAAAE80B1CD8C271A76551B7271D69CFC20D032C7FB6F420CFD117CA2BAD4B35421A3EAF0C8D4481CF9EBD23EA8FDEFEBA7CE5025F0B70780D9AD3F2C406FE3BCD072E98A0DDD3D9C26A3623A1FD3D5DA3EF5625B382762D7D0D3A62CDB09B9F8432CFB3D350CA61AE20D5F65D374FD74E37BEEE5869759D9AD128CA0A720ED9FE0CE34B10DF2E490D4A6271899F7C83473779415B46D2459616413FB437C33A1A38799D22096141DA690ED8A7A73BAF9C86F6CA14BFFA6F6C3A84E08D9AC4D09403E7EFF95D9707D4492C1289C9F6449EA5A657EA00FF97CF58049B7EDE360F1C960FB29699E298A3E93725F22126A23F4FE24C303AFA170010AA5BFC0AF222CB0C563276E8E0B8147DA312029C081AE745C9EB769AA1B703F1FB7A74537658AD692522E79632D6BB786E38F062200E6F8FAE3C54F6D8AB1C967E709CF751E166AED57C336B993861016D142070DF6F97C944C3557F5F30676F0C5B33831EB3A9F0B0AC4CF4C66E6C98BAB65321BF0D58D430D75CA0874FD4EC098CD85A7DF9F4F1F4E2B7B44911E4E88592B538E74E922929D74D5CACEDC19C6E04BDE4064D66C1C2787F236F72EF6390ACEFCFFDAA4627F8C4F6CD4590A75600A23C8E5EA058F37E79DE38203495BC4370F9E54DB6AD073596A1ABBAF237D642B820062020BE0B57EDEDF9A861FEC97F2F08E7E9851530525334F13FFFCE383605562D8B723D509BEDDA03518523AE9E4B9F44515781FBCE951FCC6E068B97F8712174AE7F7A6D8022ADC51BEA3C1E979DB7528D1ADE0BD484219D961F8E461FCA246ADFE328BA4E72B9A723F7C4D344CDBA7FFEFFF55C25A4A28BC4D1E73CE6EA56A7139F7C631A7685A82E24B98A188D47BD27833F53B9C4C9643BC9BC1F68FC7B36C2797BB1639FE67E07251A765447E8641F0D99FFF8064C668B90C55367AF4BBD0657AD668A8E79A68FC27F414E4C26289EAFF2757DFBE86AE9071661572D816021710771313AD9BEBADFE9998D550EC85190DE638237A0E02563E216A31383C1ACE5FCE8FD78CF155FAC24631B0BE9F57BFEBCFCBA0900FD78A1800D9D4FDF6422AEA6AC7CE40E46AC9F5068B1EC42AFE5B875A651EF9B79E9B34DC6F9326F6632C114857D46375C920FDD25B788CA2057BDE9CFFC34F24154BDAE4C7D37C7047C39707DEA8876405707F8DCD458029DDDE19D945F9F1506135C3C00CBC3383A7174EB9EFCE4C6D5C2E24C7724CD1A5D7A44125708F0FA6262624D748BB0F71587CCD1A0003BE4F4B76180AB82EB5971FBC661A78827A48416CE8FA3D1C913A3E5C145D896F03FA772F79F30CC84F2F38B694251075BF04533E6C605C337A283BA83FE8E4712D3AC16940EC91903B5602CB6C6632935E6A7F0ACC35EFBDCBD4339ED92FCFBA52F72961F81883EBC23B04DF4018E621472C283D0B055607EA0A384822E9663902DC0AC24F42214299662937BF4ABFB9D61611CDC248311982001087323E9453F209C28BBEFB855D8C3C9A2EE01F36942BC309077A30082194A801A16CD28278E0655B87017704F2C8D10E0DC27BED647550561B82230FF9AD30A82F082627B3CE818E32E11C90957BFACF26A2EA1EDF8D14D1678C71BCE1030650D6A64E16A60E561E3696F3BEB4C2AD7D1C7D9C6C41217384EB06342E20F83308E2556F30227796DC0F19AEFFD8F6131FC9CE49CE4B7545FD5C039E85EB3E48A936A54A2391F779724952E021C53C7046C453DB4DCA4DC68074773ABA5692E01B0D13CA0FF91193BEF1B2A03FEF91F73EA97D431F705A3035D1BD45FCF4C9C3666A1492AC8D7B7823D5DFA64A5CF7BFD57538AA1253C913AF565E6C638EEC72A570D680D8D7BB2AB8D476368174DF50CE5E358CA2258D07815B7A858C6F8F83FB7CBABC15C51DC41E45A7307DFE609D394A7C2207350A6C90EE1F2EDC568E1CE8F79676232A4981F525DAE155B87F64988FDE5F74820C70B4EFFD81333B33FE9489BDE8169B60DFB09B24AEF943C99ACC623AB597AD0AD061FC66CBCFA481076EEB64266D2C6E1560AB29689C4D8F31075371AC690BAE546CA8EB48BB677ED74AC1F541F6BF16F6B4FA6AD16979B0ACE7848EC7B163A9F984B639A3BCAA7995737F61FE0BFBD603EF478ED3498095930355EA9B04D3875500819FAB65DEAAA492EA237D4BC3B3D7776A17335A8FE371D4DDAB4D83F9137C8AC23690DED91F3A3832B862DA761C93185C12792C41BFDD4F841D6F606F1AF68A922ABCE8387A0F42960A5D3BE1A8B13FCA2E60C33FC98213CAC3B5F1CF9D489F1313F09BA12DD4A923EA9A42F4A71F02648DA6FF14999FE0180154B0181D26D7E67A780F8069BB94063A99B9A9DC1F8504E6D68CE8A5101E0C6A7ED5B1AC33CBE8510DFD902415ECBFE7CB8F7F2955349A41F6F481BA219EF5492B7B873B9E4DEABDD2D181D7185AB82DC0631FA92BFA22F4CD8485F7EF2BC9B37FB0190FB17DAB191EC93C7ED975E50B6DE371273480261C641CB7081F645A3FA133FAAC7BCF91BD5EF1FB2239C7EB1C17E1C2A0083B6AC911B0713E4B893C52AD925F7EF000796E9EA11B713EA0F57FC87690699049F0F2D738C1C1ACD5A414BED3B35D2E821C28E7C7A3F1CCC0FBE8B13E8ECBEAFB403DC8A84CD644293A7786C96C37921668EBB3AD5C5DACDE449BC3823AF11D7BC206ABE9E86AFF895681F4E3E8F5D1C9C7E9E47B1C02B3FFFB2CEA145F7F429F93F23E9C342EFF14B1FAB560330358B3EB4B294BE60839F4955B2D8ACB0E59854BFA33CAA99699A580C93EED1833226D57C8B62C785F08F403E5C242947BB7DC8E8DE80052B723CDCEB7BB616F3809FFD2210E837D449E1B220186ABF01CB4270EFB88CC962B82D43816D07A9923FB66C5E0F312F525368DC302706C8B18A1AF216F80BDAE5EE3448B4643A2408FD44657BDD006FAB78753EFE1FC57EFF9E92FB0D7B36168E43129B370BD54BA5797D0E8536D1785CE2471940A391B6BD085DB8E7E564E79691424397CD01CAE8DE8980483247DC88FF6D2AF6D85DF495B69BDBB4D4AB92A334DCB66F3F2FE7E216E85B996D49E9B8D2E2ABD418907A4FD711F2EAA369AEA345E2E96874605A05EE3961BC9D3BE6C779C9F30F90877FA1027FBC0CA85DAA136165F5EF1AFA542B968EB03ECE16D3894852C02F9A00E11AEC80E9D8E9ABF83D11A2F45D4E13A4207A6C952DCA6F0721AD21201BDB9B655DBE79AA102147B193E015A0F0AE60561A27B8B857D028FB567089E6A32AB5D6308AF1D5590DEE2D0F11043979733DD377472A9B57D0EE0CF7D834B9E60F722831B668BB24FEC7747627DEB86FBF86042D3E6B17F7710D809EEDD1270A25BB87C0BC2589F72ABB8EAA403E3ECDBCE3278CBEEE466DABE745F6F90FB06832D142C55F217ED221410F2B09B283F6E606420655170BA89631F531078923144C79CCEFB3E2AC0540C4C9CFC27E9F3820566DA08F4AB73C5A8585101A71C859F521392BC3A6846D568464C2CABEE29B809A5346A624A013E837C7EFDD48C25C557A2DEE1BE38B3F37D1AE5D9F4C16913D1D96FC1CA5E97BFB10D39E786E90D9EBEBF6015B5BEFB28A67E2590EC2096A1AEA76A6051571CE4B1F37CDC7D2E16ACBA80FE6AFE1A94142CCB8BE4169005ECA4192CC1050693F04EDFE0B916966654D84AF0DA95EEF3EA108CC509BE9D66D7D8AFE46B02758ACEFA8CD560CC1364C750B3177436D1584EB8C9B4BC7540A2D924C12EB0E54D0C15E5ADD357D45EAD78F6282942321D66EE2666D76B7E6A04BDDE9EEC6B0088490A3C9F33E51271FE348D1620E4AB2E49BE67528B0EAB1410C273B55621A39B78422F00302B4898E404F6E8A30663673593FF30793397956FA94C4D564EF8441D43A8116DC19D8014FE631A2D7C0D74521894F4CB62A97C30D343739C634827E4703C922C3DF05836D780F44697CDCE61B355A9BA4A842F531C4E0BEBDA286B72E20BBE8C2FFFF693B9D37CD1F1D4B73EB5104F5751CF9161ABB5E30C67A38DBCF5CC2C75CFD4C6E75A73D19AC5E432532A3987BF3F4644E9962A3A66483CB25BF20DB8E0FBDD8B4BE824C01808205E7DD1E171F11C52F3FBC672F038C495E72CC2430FCD212FB89F34D1F72B86B958D7F8E6BDBA7AE03E155A10630C18127F2C124F92C3C0735AD14026872318341E50FDC181BFE9B4D030A5BA3A45C47CFFB0617CEC02DCAAADA6777815A9DD6000B267A2B7DFEFFBD31A18AB84F287FCCB6F2D83AFA406080343DD1BE5EF98367780A5BA624E4FBBED8EBD147D9E640E9D3DB7398AB765BA82C9D97E238EED69487F30EB0F0BEEA39ED881F87DDA3ABB0F4D8D8D8146F5DFBF565DEC596C3822644D6EE41A3FD14C63FED7039C67BF399A78A3B9033A2ED95BAD978C35117117E410190CF24B79E6B65AFD6B3A91293A8BD3BDEA44E18F08BD832370A5E524F022EACFFC495FF19AA77D8F4527B0F344A0EAB303BBCB05D160898DBB0F971848139AB81AE82BD9ECA84E59A6CF24C0B69B5A737EB6FB178E00A2F7A74099E2DE79A8620F9D6D665073941932D23235C551C1BF7C626216BDE966BF597D27AAD9E3A497A85509A593EE4C5B602905CB32631C7DD2537AA61D24EAA114FE2596DBE83E1496BE9146DD81D66ED7F1C08535F13A54160BC5D4EF795EE73CC45D3E8122DE33703A81206C86A85F48D25E85FDDCAF39DFCF6921171B063A7278D08DD972B8B20DC3DEC2E2E54BA280C8A0BDD5D8FDF3636E361D23C175F7B1C734693DBD7B444EFD8674DB9FA59693D92DE2D39B8589B5A7C4A29BA83EEB346723A32935ACB5070790D91CB5E0084BCB723EEEFEC15EFFF3D7C861000CD05ECE3A7A56093D63FE59C897E30259B30C99FEA2ABF2495BD7F9B5143BE68B2000FDAC88461FC68F08C0374E58E77B2510F85AEF620E6404CF218118671FC4F801433AF5399DABAA5366925FD7E9BEF77A0EA7AC9A3173C30A507E9576C489DDC3C8EE02985EAD6660C22FF59E16B8C42C4EADE5ACC3FB9CDCDEB2E72ED00B20292A4E546FB9EE15F9FE0FC29111E5937297B085CC6F0357D0D44D006CE567252D4374852025DA9A512682F190DD98E006803590517FCC9AD62B01EA29D3F4742747A55A15C1EF3D5C289EEB88C3FBD3A2D6AFE1CD1F7E101FD874614329828CFE97F2964D285B9ACBA1F953843CBFD21563A04B4C20F31446A94D80129E278710DE0748075E1875F34237DF0E35BC153226BAB2AE2720B33EE9317393E3C34ADDED03FC4B3EFFB46622CDD5CA360905FE9F5BC6B5CEE3271779D36DB15B9B958816D758C940411167851E9CBEAEA2A3FC95BEBC26F7832560EC33EE86F2460CE7BE24FADFC4560C18AB2C04E1A088BDA394C58D132D6B9393831E6C968EBA980AB76F6667EFAFA9D6393D0F9351370023A14878C51079113D70F78FAD32D7C8224F8830C29FC77C13529AE9987D985C2F9792A276B41A8BFD567335F8C95497E26D731E36D5955010FA0DE95CE5EC8FF34DDFF33E1EA032717597FCEFD88AD22509B5AD677AFD06E6FFEC65C997C69E3AC407A8143DEF4EF01C50E8D9D408D76E10D1844EFDB81B98A06EEE09FE032322CA57F764669F9CF50C94F9088684E5275E4EBBF44121C9645238A15B4B460B8501303F9CCAD32D67ADA5C379DB226F6B2ED92171BF45ECA899B1B4A51D74CC3C26D81A6C760670601842998D5926672C0C8814BC1AF0FF2CFE4B659CCC95C689908469E02C154CAADCB4C83F8CD28C412B7D2B140F655AB726CF3DF476358526B61FC7B8DFF204773EE6FA62CB0066A9B87B17FD253DCA1C8C9502DDCAF895099720B824981041B9C697875367811A19C3A17E52B028EB3116A0E750781E97DF85BF6525B9950AAA4FC2163B250B7F0D188DDEF4E2309DD14A9A23C3AC07C8E9B31F24D5AC6182F6629DEB49EF24FE28ACBA81234EEF739A65C2384D38C3F6778C8365F63337A46441A4B3D3C2C97FAE2F9A39627AA75F2E9349F7AD83A281123FD485105B1F44EEC7EE9746C87BE3C93288816084A40F4E11F8D4BF4E4CF0417C04837473D2CE7049B438C0520549E93DBCEFBB01C67CE421DF53C1C8D199069BF2C0FF718D1EB2A1E222B3A8E4E8B2F67EBE4D4888640331556FA4E228B01DD2D74ABE7C9229D56C96B0CA2B8EE4BED691669F074949E00572FA72AADF828D369426CB05D1C4CAA85F2D1DBD453F0A494D2485749D6FCE75ED67762A5ADC3CF8EB1D219BA2B5D80D06D4CE642019D5B322456BFAC7274CFE201B9A40E7B446A38A15112253C333A22706F866567D54EE4EBF8943BC82AD87F77A9FDA7E83C79A407CD4CCEFA7A2423C31EC841E9A1F22354428B1727BB2E88F6E9FB06425C2543F6EF2473CB9DCD9CB461BEADE18D2A5C31BB8A42D4D4C5F68B7656656A75C7A5F409A628424C2E469BB905FD3932B58FAA18C6C7D1840570DC5CB964CD14A66C25B3E255D6C0C4EB9B10B28D227060B45781B99EE7D97163750C84CF08F776F4D1A8AE655E44D943BDE956C7FFEA51C3E8673A78CA64B3278346194411C40987CF0E7514E75878E8E8C7DB8BA2DF5340828653076E38D77A5F234F6F6B7721C6B7B01A66DC79D26EAA034222FE8C898A8AEF79FB137AB439884BAAAAA15C7744764FBD377EC2710BC030ADC3FC35AE90B4869AB0141A0A11D9BB5DD325CEA1F7A944CFAFBB17BF2D09DCD1A3BB41234FDCCD5AC6B75AB59DF03964900C187194669C3A63CE5D0754DBCF46C49B8DBADE4ACA83504BF9BAA53E15B3FEE90EA90F8BE37D7A3EFD695FF7BCBF3EA69E2D7945220E8ACBC8ED19FAA07C7DB7F7C0E144AA94BF144E1E2E4FF74C9EB376ACD39F314E4076418F432B3442C937509DC551AD768532AB365CC8F48DDFFBB96383B869652CFDFEA829863D31914E50FAB23B49EA75E4A7FD7B3788BD4302B818D8648658ACC863E0CEB05067A7CA279252E63BB1FD798B4708AB501D32839B78CC97FC733212E4E1CB355C07DF3BE8EDB3C92CDEC5C71ABB49DF65772EB5F9C361554A4BF307BAB2A8B12AE159C5BAC515328DBA430F04B28D9AF01D0DFD7D309C4453E4E7BEFCC54F54C5BC86C59491814E65A10112AAE1B8C032180FDE24A17B255A953775835C13FD18C12DB904037CEE576E6242307A229048C7A40A055035F6952109F2BFD0BE2ABAC13277A89169E7E79BD9C13B4B12463C50B395EE4480CF988F82111C828ADD7C2D131FAB4267D0CA259A06329643D084F64EDA3D74DBE474413BF6A7C8AEE641F4B2E2A40870E11B061AB3284E8DF1B0619E8193CD7C0C57CBA84CE027EBB0227ED22F922F3214A3F224E2A3F2AEB78EDFD35B59F14BEC0B348FD033044C98D20D055CF8E118E5B2AB231E00270A4FC92FEB84EB11D1AAA1A49F32F0DDF05FCEC88FEE1D3431A377DA82531D93ED422FC91A07BC82E8680E557298F9E6EFE6757B05CC52EE66C8C9AFD3391998D47EAF0A5AE19C5E121BB00204D686CFBAA23DD793738E33A1058EBF549D6822E45F247FECC51A5DA8B7A967BB2A97E92539F4F93DC51BE58AD766983F59DE200C7F730DD0CB997834F07A5A7E6B5FAED129CDC3CB4D92F510F9E7141B4B76B4149A571CA908EAE60A2378BEC88A0DAE6C05A172685DA30ED67968CDAAA5026912330E9E08016D33B617EE41B47D9EF1F1A82533CBF56FF91821B558D798B982F0E5DD07631621802B12EEFA2DA19D267DE670154278049ABE088FF116FF8EC6EFB52D7E3D4B67704ED6864870A1BD554B9BA5ACB8CBE576294C7C48774946CE1730BF99C945E8C392D5216A7ADA85288BCE2EC7CDD02582DBF45C3DE5B8C7683E60BAE1325119F778B0D75D974C8BB6F8A4376FE5F4212FB59EE80FD6F341C0BCF5516A7043C0B75911ADD59B614F2C8CE873F1D4ECE43BF3F21A49ECCD057312728B00C10760480963B3B34B8255199B2CF141AF9628B7F19AE945A08D1FA56461D4EFB7A9BC5AFE13320CF97ABD57529CDE7118293AEDEFC35A0BD0AF83F043EE7896D085B380E644591EA036A25C1ED60454C1CE2418C3786E8A8529CE1E16F61EDEBC5CE76DC059995371997C49C19DDF5C8D9C291569F978D28EF51473A7BD1AE36E2148C6C5679D93702A7B8D9C9FD4CD213E084DF268951C582000741E07F0C02832B2858001F2C31EB630BD13DCBA7787501BE6D77E1A5F86334DBE2342413721D6904D0C69E960E8165D21923EA15A1C2D7DFDF514E1DF64BD84865733783DB3C5E13733E0C97E652EA88FB56B1C3359649BD086F21D8122DA21A11E88FBE2BBF9D7D3717027E76DEFE89C8F81488B701827CE66DE5F749A6A436C29B774E85C81738DA9CBD1CCAE8DA3CCD60C9F0140DED5C8B952300CFB942493C3373B83C1F1512CBFA5A56FB72FBAD6EAB5F845A3AE7032AA56123B358446F512BAE189175DDA00FEA5E539475C07AAB46A5B3CBC321B1095E6333811792CA3178E69835F1D5E62A7DDF530B1BF3ACA483D1A2A2C355C99C773D949E780800ABA4F69FCDE675CE81CABFF7945193CA49666AC6F3D50459966A7C59779E2A6C8A720B9FF2B8E6484D746F1DCFCB62B4F4F166D491FBFDDCF5F0DBD502C9FAC9D0E98E488F016466CD8EA3E3D2437883970367753449984A3E381B3412A733A6C2A2848EA6CF3DB46974B750167EAFC2526207DDB57A8DA8FB53D2B9FB799E89A4C97CCBD1A64A1E1213DD38037BEF3E1333144BEF8147B4D1FC422906E708F07469CDC5628689C27E19E05B54406B4D7B5EA262231B56567C8B26D30886B902513ED33D4C0E07B7155B95FF8B01BE054D6F79C1B5834FA53D19C2BDD6BF0B0B5D1CAB689288C1D26DE5816318440BC9937DE2FFEB2E64F71FAB71158283EA838E115673422B0999440485F4B587FC6C3C796B4039B3E457C3BDEA84B77115890FD6669A662D796EBFCE6D9FDB903989584B155A2BD8639EDEFD9CFD2EB461BBBCA4EFA7BEF383BF3A623CBCBE21C1DDC30A808A22B408E904C362E41F62430F48C2BDC0A5F1A77EA671DF3C7AD53073CC33315E1F2F0C56134712E4351AE873FEDBE6079EAC1FA5A4A92539F683C2795DDEC9E8F395223EBD4328D072B04EB888BF7FF9B50E213CCD0FE64F2999427E899FB353F3258576B2715BA7A426CA01041CF60D4A75F0104DA6B61F3262ABDB307E02089C02569F73C1896DC71F2D7F3A5A41EBDEB949C87AB9D1B30CD32FE6857610233D23C03D560CAB1B763C65F35144BD4E3033DF1B8FFF4BB8E2D63B54EACF2294E0CE21BB29FAE3B67711CC8BFEF8E99B9E79614A05E5FABB5A79D9E5D9DED66DD08699F7D7F74AA7DADF509EE75932238CC7620D9966F0996B7182CD1DEAD79BA54FAE12FCCF691C6FDFE12C0460BAFBE94E1A5E67BD626E10A264A645A1AD2BE7217CE0B0F12EA33A9C5CE2B84EB569EE3131A41E5F5F81284DBF3FE0682607E53C49CA95E669D47C05E568F8FA4FFCB7FDCDEA611C123A3F10026C3A14A125D8BB93F966054747AC2B4AC427CC0DA874FB61F3DE6EF5D6D689FF0108DE497AFF21C01FDA71E866CF4D484090464F13A77210046DC872D60A47D96875C24ACCB599C1B609843C6C80BA3E878149219A353D18DDB8779123EA5C536467323966756C0505BB2CC6EF21699D6F41B8FDE8C100BBB5F0F0D03000E68753FD86263AC10E782319F81648E9B4C43E3654D49657CD6F43A3FFE81A6B2ADB109D024291AD90F2C8B12870D8AA4C15DB21DE56BDD827818E94B91DF14AE60F22D556FF6986DF1342B35E15DB2818A9A6246A43FCE3B0D31851CE75A8FF3E63F741D4FF5AC7A3C0C8B58671B1A8FA77FFE58D96AEBA7E28ADAC896BC71EBFE9209BB48D407D65C9584ABED9093119009C78869CB4D201FA7961022633C23BAF1D9838383656E9697FDD12EEF5F1DA4791C996DAC60CB353DAFF84444E925F0DC747BAC5F48A571AAA039C2DC2BCC397CBBBD5BBCC08F67566887B39B406871B3B2FEF652C40461358E14502530CA4E6C58C2250E3F5EEEF090B58B5A5E66E0011AFDB27637141540682BD78A88178014A9B4B71D33C4F45DD13F23B7E1008BF3464A5126FB713B5D228F4AB66F2ECBBAB7BD64701716E986C6C5C1D324AD7AE72E767A5E2198F5C3FD2E18708AA08044949EBDE77CC5B55561B1776371BB3F6AB661B638CDDDB944053CD2CFA1723C07CF43F6119FB5074623BEA99E533C78D78F0DE8D557A90CECCB9C9C527BFC412CA14F0DD7C8B9F35BE00512A3FA6A52571819B56CB82CBEC6F6B5AD57EF6357F7339966FBBA875CFEF34A356D48985B8396384F45BB9CCA4D7E7408D047D2780F9D19E94B8E5949CAD23B1D2F50AA95927116E79AF5FCC0AF1475DC655636FFD67D7FB7B71DAB731817F952B65CDD28C4CF9E0AB4A398DC14BA0F156B8B1A2794B20E4B8CFBA398219F886140C4637755839BB5D84258C8DA01467DA59C528C770C07119454FB23217FF3A33C02990B4A25A4B26FC9167B3C47FE142AB7CE4C70F059DD92770D74CE4F12BDA9FD9BCC9FD6B0815EC0EAB3D5E3BD05F806400495E43A349C31812EA8038319BCC5EDCA80DE19CD954BC2C0410DC02E4F7358D53F68F7AE1D1756E3EB4AF756F4BC2889D1C25F3861D4D3A13D954283BC1DE83284E380483F8DCF38D9FAE09EE06FCE18F6886DFF0025717B76C905B466410050F0469F89D791F5BAE5ABCD4E7A9101F250F74FD52F02B3D08699DD76FE3F53B55E97597BF1188DCBFE5AA15A4C06288BBDC98931F3902F144960E78A404E064D37773A5FDB121FED3C6789370112317ABEEADD3C2987AA5F480C343993B0CD4346A52063438586185ABF479BCC391729717A58E0B16EB258968FB312C5F8518F014A9480CB710D0698B6830B9298384D695BAAB46DDAECF2617552E2E4C8A18F64801271C12A881B7100B7058EBCE63CBF7B9C9CA142BEF0C74FF477C7845EB9AF7837E7ACE16C299683ABA159AD746F968AF93C291376A1F5CD676D6393D93DF650B9975AE4A892894B425730A786B1DD818FDAE7010C51715EBE4D94F1054BE60E2A95CA4BA6A34F3E37C1C5C2796BDA6DDD9C3D3AFCCB164698C7E03B089FAE1A5CF4C9AE0EA1E023F7B5DA334101A6C44E29D261233D3EF62EFA415FE49700F4D13A15A16DC389C4B7CEDD071E359676C0E2E5976163B71AC65D72E5EC5B762902015B14E160320A1BE78D1E0A291380EDA4A093C1A820DEF7C8D28FFBF118FFDC14FD1E934D578CC1D041463E5B29C6A63E88DB7884360743CF5B67638F697D6835C201294D0F38893CFEBA2B4E7CE8408AB1DA29C30349FEE428C1185030B39D91C8858B7EC52808E24230F23A85B8BDC3B7B00991FDA12E2F9B3A12E12FC053B34FB7AF4F3F37331DB78CA8121DD3655059AF9AD526947FD5040F50BDCE6E13F29451266B4851CBCD9EE85F0B8C2C0AFFDAE3CDCF2B11DEC4CB3865AEA8F349668C107BCD3DF8D56EC4839ACA67BE8594A05AC3AD7DD38694FE75A7E71B969D2F26E4B6A31D9F8F1229209158601472AE375FEEE28B05F6C15745C7ED17A1A76BBF51871156CA330C6C617D0562DE4D70EF1B8CE231775B867017A43B7A9D5DB205563ACE17FA1E4CBB245E11B7679B86998BC803454DB628F69274CD0831E6D630611E9EB30703634C6CB12A89BE481ADA27CF411AA50CB9AFA42D97E9823E5B07E69E0DA5F01490E145744EBD606D2D7D401607E785A539F4237775EA6FF7D67D6AAB306CFC65AD26C93E00B355A4790C47954BA3F1A835001A52C4FB9BF3E5BEF775395393ACA37647E9A81F0C3B5AE9371DA70284F70517D7B99D0305BE1F9CD5A2C7FB3775A96CC6FA7E721742955AA0F3076DB083E1920F6141DDA329A9CABD6095EA9A15F5538035EEA91D15A980D7EB07E2F77DEB1640E8A23AEE8BC92B310DA93FD8A276CF6829817D0527637D8FD54D835D63D99E9E9ACF8F0047F790CBE60C4E262D1F88333BB4159C3579E516FC0B77931BF78D1BFFBA2E2A5171F6A810A607C711C12564C42043CC9E13BD35B201FF31EAB7C75F15204A223BB72716B425A66EB0FD4599A7FFB432DC55EB8F82E251B2C0A53C41085F2B1DC184085A6CD789928D24A509681C9D74DD4C80018F09800EEA8B4846429E2B117F22E7B8F1C21E536FDC7DF0BAD82FD4DC09860D208F0FE98572BF4D20DC419D88B7244EBC8D79524FF1176E98673DFC6696F951040D40926D69BD2156906D435515C552A82829AC569348D832779691DCEFE8646448B600B42E3EF61E3C380D660FA1FAA4F13B6C9F6650CB1C494C4F20F552E2DE501515082FAABCC2D17A07A71E8E8E75037A297F4CADFC25C1AA6795E016E6AAB4697B7B16BDFE0693F5C6C27A1B3443545ED3D0677E1AD01B360BCDBD84BBC7367E6BD06FD90250B22D9F3449B62657C28DCA673CDD9EFC8AD0F0EA3E3E6D3DD3D713856390C0DC385912F5D480DB2D8702C97DF3DEDF503DE19190C7DA125BE3DBF8CC27782B33793AB2B7FE20054BE2C3AB7D64DF6AD584D033DE10952D580E8F6F09882D26061AA20A89D5D9E0CEE288DC804458149CFEEA069EAD2DC899B2B659D90A1B4AC91DEC93C0B76D2F82A436C57E4BF554904DF53C19B3372495B523FB561E6B65FE059B2B7826D01EA9D5FFA73DF6E8B5E4811803FD457B7C4F503CDA6F259F502C5E6C06E75B710296B06C4FE1CC9FC857C0902D7CA1CB07536EDD06B479F969F123DF3938B02FB44BA26AD5F49BAC4A129063C6185D1F0BE07DB2B27F8FFDADDE4F5337E0D9D90E3764EF3E01BE2FEFA28F77398E94C487F862287329307F82C84AD878C9947E450859040FBF122931D40E57B30372D8AEBA09F291CBF392BD6FB0BBE8563C73C8B87D5E4A05FC86BDBF15B36FB6C73E2672241186882C18AC6459373703F4EBEE3CE5F334CB1BD99DBFCC1FF5533FF313452ECAA85539D1EC1B7685068B31E3190E2E83E57EE8529D2B6345F10764FA58985659B830C4D207663A5D4B0CE014F9729B854334F797F04AF285F8A07879D4F783CBB533EBABB8517D80F647D80A0E615A50134A801669D4A504E39A889CB8E098563804642A451D46FA785E01936A81BAEB07E1E5F4418A2FFD233F7565A12DA7EC76D3692F850B179C618BD4B8E4583DFF788B06E2E7458C91FCE56B2BD8EF34AB3CE5C1322A7EC61ACE9ECE9830DA1F53BFA7FD1B35F9223A84D8B17CE8816D1C3FCD2C30708B8C9441F7933D976E223CBE8966256A422A04A48F83D0604F2EC30681A5ED0C320211EA4DBD949C21F197A8743A0B3517343F8D47F7FCF67C001C7A3E3A9FDD7E18F804616B85F2CC57A8618A71BE56AFD4DAB2851541DEC6C4A9CF647BB4DDDFB36CB09B549B44A2F21CF4402E7AD2B2FAB976DDF96D5CE9E9D887A825AD738E3FF888CFB1F09738679F8D56C20CED4465013CFD5CC70C5F89C3D9C189F6604F275EA5D72126C528CDF8108EDE0BF5BCC92B6E6D8841E4A0A4FF2628C69F9D71D6375F08DAA3E1D236488AAB72B037B74712750B025C465BF83B0C5459CE36383388DD1C63814017E5B39C12124B0EF7FD3E87BA32241FD5846E594E725C7079A4CCF6DB5A59CC332A0281D4256ABBEDB66B448E2B1D89B01D49EB7B859A4C2A7D3011645DDAE61880AA082FDDEC09F16192D7F93B041313D76D8494241C05275C2D375B02BD67D37A976E7D0C04906274C806C5AB1F8ACEBF3D645E8D6FD05902634B67D0F5F42C90C38ABD2A8CA98195E16D5C3C9694FA676E463E51A6583DFC457AE78CDAF612E84C8ABCCEC855B148C4C8864B7F21CD6A274BB4DFF79B71A340A307310EEF5776BFCE8CE811791817111CD84CC2D21823BC84F3A93EB9D06C504C2FF522309262836070ECF4141D016B6A761D104476D6F24638F04FE07E01D6304575CCF10A87E5CA1FD1F1A86F3635C0F3DE5CE4D6A9330EB3976B834D3882218CD89E0F0A5700052CA09A145F3451B26986244572E2F01F53D2FD5F117DB0494A6F368F42FB15DEF822BEAE4CC35E93DB3B808A78ED194CEED2979235AFCD4620A311A7DD3A37825A942EFE7197B38F586CB6C586535C8253F2CABEEE72048288101BCBA37C36153FBB76F80E574B7BBC875B6CE8AAF4638298FB890B260C18078B9CD847ABCC041BDECD70CA819862973626CA40DC5FB5C84BB3BEAAE3171C6A554A42A44377F13B8DBF1CD088996008F1858F376A56F79984B80ABE04BF28BFBBA2C2E6647831521EDEF8D96603E83FC7F1F8D6603F6D7988CA77277C2D3F959149A43039BF17547A3ACFDA3ECFA2C428FB3706EC78BBA44E7519959A1C9A7DB3BE119CD9AFD130C45F960CF012533C6261193E509BE5192A36935EEF33392DCAEFC60AF5BDBCE50F00400F3C3F9DD621294FF387156852E79460EFCF55BE85BF6CDFFDD794121D7A6A094A59E9354730204535DF03EA768803D469328AA706F34F82FA0BFFBDB26BAFC1F23C5668BA408EE48056DD4B25C3F3F77B766E0793015B5394478BFA77D27AEF725117C4227FE0DFE775461A9F1F4941143833D39DD1C2C3F14B8C60621CDC4E7FEDFE502A66769B3484B07764FFD57EDBDACD455DF4586733A9BA2B1118C43FA9847D04044940C8236CE0821AA03FEFD23CAB93C527186823A85E333B601DC1808F890DE18FA48B29CE764DAAD95B31B9A01303F9C21B1320D364795E24AA14C61BFADA96111A94CC604049C16F640E987664DAA88B134605474FDCBE1E125B0FBE0BFABBF02B6CFDB4F70588F516FFECD89BF54927C29712758D04E296370236D626910C180632FABFB1E1F224E45D51FDB69D87EEAA9D3A0074CA65F79C8DA83A0A54ED35891BA66AB269361756B4914B00FEE387D6AD480C19D96236277C78D7CC72456FDF3F9FF42A6E830D9FBAB8F6B1DF94695852608A46F648244494D4C6069A8173BD970C637AF1F304669B3CAC029EC5E56BE4DE3B001F59B5204D8A0BD4BAD9A6A52C0D2E27418CBF48E5B286248929DB406604B99A1F192483B3453B9D61BEDDA1F892D7096AAA0ADC5B87ADDAEECB19199CB0EC01AA069A441AA5A10E102459812581CEECBC65FBA43E2BC2EA2E369247EC8DFEDDA850B0459974669BB64863D3A50CD718B4B4DF3FF897C9D051A95AFCBC0DF8C2B96F939E62E9D5E55199C3D4B5918F597203954D2A1628B9A293708F051D7ED1F905ED3910413F9EF42D9FFBB1681AC40BC7910F2C7BD2D30A34C66A2DE3CD660F10A4316957ED6D05647B5CA3888BCE9052E2F2F06EB092A7F1572A826E5BDF2F491CC42234ECE0793625FD227349802B728FB71938151320043CEFC604FAD696B6FD3E80296385F8A79D29C33A1B2C91B41AB836321F34D2620340D43FF972F2878A18D4F77B5B31AFF126F5BB96A9D0EAEA0890F4C5DDFE872AEEE039213261481F6F3C66FB5D9194BC1782B8FEEB14B043F41F3D733DC469F8DC99D7AC166191DA74D623B40EF4D1566CCF286BDF0DF232D2042BF410187BDEA8C75FF96F060A59DCCB239A325057C35AFE3A01E32B6D5D31361A1AF747235A8417556CB9B0DF0AE0AB140E413A3EF56FB825BC08EA3410EDD8CA4751A3C4CB0D29970C9A1B33D4C84DEBFC527B866CF38490A818E5A290604F089333E25F1115DEAD600B9EBACCAF342E2DEBA801373F419EDBAA8C71F9DF6CB620065E7BBBD44796304B501B1E25339ADA93DEEED5DEDFCBA6B9D5CEC6A58F100C8830EAA60C6CA4FAE5EA9AB58C9D0F9F4AD4DBC2C8CC6510C6D6BFF8AD48A1671861385570DE2472677AC371AB8C5BF1E894019C207A8769350748311ECFD1DFEAACF021BCF322E2570C1D0F84D2206113B7413F5E205F6ACFFA4A5AB91120EFDE0EE817A0B23782F1882D1BDC3910CADDA6ED3C4A38071871D130024D3D4CFF735C1D2ED15BAB62BB7332F532D11AC8A6F69F2665E800530FA0EE940FA60D91BBE2819CE5C16F4A5E630D6EBB43406FE252215B0CD56DC94D03B5CC472441C4D519C8D9491E1699181542309B45ABCAFA3E2AF6CDB64C5F186773C9BCB037EF30C28380EE428E13B2C849B4AFB195D5A9E3F9D2BD9D82AFB2A1FD2F5AC9BBBFA6B1D36500B24716C0D5FDC05CA8C5E25502F89BE020D77AA6EB3D57936E43A1E1A9995E4CB391A63E1BBF5829F49D6D47F5AE960B408EF5BFEFF8B85E1D832B3F8377782B9AC3316A1350F576D29242BCF1999216C98EED51CC340E804426E55D270C46F902F9E08DD74088BE17263B2850F3EAA1F165964EB4AD67A3613CE2F0795FFE6750834102C4CD77571EC25A478F6C0194192EAA589070384606FAEC9CE3A2CBC186202D032301296CFB7D43360D631E0182E1CE3C40F546C15C971546677B8AC0995BD0874B6351614BC813CEE9CC221AA5D19CFF4F8AC9F2286FF4A779559FE6B1DD8910288B64E1BAD93B3B851EAC82B143BC8DD67467A922AC3DDCCFA5098D515E2EBBFB5225B6FBF7106A6A50A2253230C873043452DD71CD0E2F9AA5FDF48B465F13A31FCEFA82F65D2AEAA7A4E6E72EA7E1DAE393B34F2C3775DEF380F86ACA296E37F5862AFA32CCB7FB17900C702E349591FF6FFC5DD9308FF5BD91269F84DB370281B5831EB50FCE8A19C12C4A9C90AEC8D2C842149D5F62F8A7E631C9C3E6C21D652AAC1148D9133EBEAD7BB2E5D8DF615139DFBB5787AFF1CAE1362B5B16826848999CF1617CA2A86D5426BA179C45D4EB8AD68799545F87EF6A9EAD6252E88F67877DC519AC74E1462D9DC8D83AC89F4A9DB00065D702E29EB24F769A9AF541284CA89E40839EF42ECA24CD887F6505328CAC2313C32E4B8A0BEF7837EA3B444668D4B4FB04E84264937B3F60531354C8EFB4C1B753586BF4CD3130290170E1D97D134F83D07AF31D1FFB9CB67E89FD7931F2FE95AFB1E526DC6D9729091B30FB874D91967DD212239E330608D13F9B9BCCF64221334D249521B317EB3E03E9712728F641DF4663BB597F0A7F4EDC03BCC6EAD0EA70A1200F3C3A93C62BAAF3B36F67425BE95278B5F1E230CABFA573C77B8031D19243ADABDD6B92580CFE88080550A382B54543811BEC23523CD8D67AA460875E5EBBF72AB481148D5A72BD39176963B57E0BB69E13DC4788415C9E5DB6AE040F906FBD0720A5C31C82CCAF087BCF77AB71FA9F223030AB6E90BB5D2D11D980867331FEF91AC8268A1578F65796FCF55C694A1DE5C9291CA17103D85CABDB0FBBE5264FB5270F3A7E3D0757F0C08CB84E2195FF6DF7C913191FB10D0E87FED25F1DF6D2011D534A7B70488DBA77D9F2F1A18BCFBD77CBF59B03464DB450DFFCC00DC401E70C4559D2073A50F9AA39393EAB0FDB10E80618F11F9369D83F917977C63F57D18C254D3F4ADA02F736C4A53AF5CAFA0578935324E7E8DA6F8FB3983242FDC56D825427708709EF7C40D2F0FDECF78D7DC233EC9ABC071B4CD750E191E5E51D2989821ACD00220A3EF75D795B0FB29AC29EC3FC68D952ADFBAA59B8AEAFB9971EEEFA00A46057D3C93F16ADC9D4E9F5B873F03E9E9A8933C4B81888D7DF1BE17824C4433387EEB42D150F71F03794113E89537B1BAEFB9D3C11DD9507EC2F7B5EE0BF6FF66679EB9940FDC40D8F58C611A18316087B8DB5270E4BFF3FC3718C392764221830613E615C70DA70A27225CCCD15DE1D895E93827AB4F718497DE6D548AC0E5F7D0F86AD8BE773EE3F3DA5F4E3C17033FFF610CC9B6CBDF509081E75751FA54ABE0B8A608E362A25622C8BA3650F502ADBF8F51FFA1D3E8CB15E392F33E17C53EA96ED5FCCC683D5D318075DC1B0801DE4C93AED6613D5CCA228E79CAAE54B5F4C9A8DCBEC16CEA2E9DC1BE2C9EF9AA02907D5A8AF2F5543D7EA9E52058ABA905A6FEDF61CFD4073559043FFC8611F57BB013E239D52AE512FEA8D03DD280B580B55988FAC3A2D2A06C2D0D294BFBD7630A3BFD1D6F1674EF54D076B07C22F10F158034A1B1EDD37990F8C64EA46B89E8E511349ED35AC8153C6CFC35F741E3B4F7B3E671B3A625FD9E9723DE445FDE63E9F70098CA6FDCF4133F8743DBE2DA773EB3DF5035332393B7D94F696D23BD9FBEA110AE3BCB91FB0EDBD748313DC199E67F6C95C34DC458F1AF114C3D423690A5E2B0C9DB14F0578894C13BF511428A092D193BF52210B755823FAAE0B7F773091F51A9E6C81BD539CABDD30BE3AD6144B069EEF6C9419FE00E1B1084F7C04283DB6F43053A7F08381A48A31A0E0E1C32B74CE26330A671637C7B8705188BB2503D0314F0DA72C9EC07822FF3842FAC514F6C938C6C522757BA35D599F7A37FD293AF95913604375A78DEE2D285FE03E0EE1724A9FD8C1890CAEE27D50FCE401DC7613AA5E39387FE287C3E3E9A0B5E4716D356FDE05A5B62B9815C105DF69EF9E2A6EA3B8AEABC5193326909EC8074BDE21938AFEF0256A15F3F01A8668047CC76DF8544994AA2D87F7CBB87567BC0E57FA9822E2C8F020703539711A5E7945CD0679F7B456EF8CF9F1E2ECE8291E61BDE1D83DDDC9C629624088AC052B19F490DB268E9478A71B533B0F8D66B154B4AD239314890B7A059022D1142F94207C1FD64B1A167C8709A10B5FC350E5E0917972E588F42B9D9D069A5B64F112030E3DDD2DDF8CB709C7FCFFCF46BD8ECCDD9FDEFA203F6730F4B7302B9804DC06001F66D584D03454206A96AE149BC4EA11992C3A38460325837E9F572344D5D9A47433565D5C60AFB3E35922FB6292E941034FBF879A477CE265A095180CCDC5ED56F0DE1615CDB1711BCE490BAB1158306D24A340E30C6740C219E471C0063F8DB0CACE3DA022A89BBF69EB130366431906C1AD6B506244DD40248CCC13BC1A2BB579F0021CFB967CBC1D2EEF845797E003229C95282C866A58660F9201CE08E3B698738FFED1250F00DBCBEA6D4DB50488C6702E87AB9FB0ECE3A1ADF7E171E9848BA929FF4151B78007138C399EF6F67CF205D928D223A115A944461664904A5C6C77FB4124AAD740713090F86BC51B776C8DFDF99A73789A40DD154C7987E9D8AA86F9F6DC420FBE978F85A7B90C0F3629562C5F5E8AD7EAAF5E421F011FB1A491F828DE6190EC43512D98621FED78F807B44FB0A83C1C506849F7B3015598232F6BC4D2151B43C7521334E3975C9F16C63E7D438EC20F6A8610A8D2D312EB4A90F77A66FDCBB7EC9FC01C36A5C4788594BACD2C771BED10EE9C4EEAF50F1B9758F898A3206DBD6F4BE3E31BBA2DF2A5B3E64B3B37CE4AC5B3665ABFFFCB1A5F691F1AF5C606EE16ED85A35091BFE37AB04825BD7C5592CEAFD4D7AB8E337C5A3E01B66DB3C47387FC40D86A250FC98EE634835732F90EB2602F95AAF54989842096D50F995DD32CA21FEF22782DA5710A58E930C31E624E1C257C4AF65890A95C2081F3765A13C6CB7F406A951908A1645C77643671B01DA9788DBC40230425548871C846FD15B38D3FA2B7666D7DA6FBBCE0A070BE08ED8D973BF19719210BAE7E02792EC80B7410453FFD3FE56278D3A898A111C826E6B268117D3147412B6CFCA4F3DF7FA47C558D00CCF3848F8048D6224BF9BF9FCE90F2909534DC67934E7C6290B8C1F27B743C72D5B16B32A50A0A17A8E4C336BC42686CC0785BAD7802D69D351E55837F3825668C4EFE1A5FDB2BC00E95646D88699A6690A228C0449C8C52ADA1DFF607567DB488E16E754C25DB3D04C8649D2472D9B4A40303482011CCD8F6BC2FAE0C0F14573E526DFC0AC6BC7F2529BC7B26AAFF2DB0FFCF2FB7004EAA4469C0FD51379EE61FDDC66303249FA150F538689368CBA37355F75F0CF4FF45775D0AD711AC1478718F6C8C7E276E461F50A23D9FFEFCAEE47200EF651574E2812A493EC7F320A80D5F5E4B1872A7B0ED7405E47A036DC785EA4FA508239074758F7FFD771BCACDA73FDC4C00E4CAA0B496A193A189082CF4E37D74010463D3ECB29BEFBEC073C4D4532FAA3AA8204822EDA273C06DCAE13EB83D270CE24E1A60DF70CF292CCA8CF5E541A96F3F7F6F17624493BCB1AF1E93EF051D5C62206AC2C8277CCEE4357620B182BFA4E60829C82FE4E315B14564DE0BC13C947BCD1540C7B280C873C974688FE9A0239BE6620D24F2E56B7691F5D079178C932FFAFE1D794EA4B9885B488506FF1700AF1841A2E48002148B6FA0285834004038264EB48300A60EDB795BD58CDEDF747B1B0EC6877150687C36E8F8DF5D288560C2223153FAF1EA09BA25F3F4829E9F75D4DED4A686C022F6F60734BB2CD523E604FF729A75F331A1123FCD1A07764049E89209A900B02A13A4F54CFC33A40975EE215FC6EB10C0FCFAD25D850F5597E04D6DFB81D03DF2FF878E63B7403470732AFBA1A20AE2592F25FEFA05C106D08C2648339DA3EF37BC5B840FBA00CEAF8BE7D7E6CEBCF334AC98A32F945CA8876B95A04FFCBB92518F208494F6ADD6C6D1706EEF31D212A35F2C8C32485227E18B25A43599AD0128870AB283BECC06174B7EDB56E2027933C937D1664701B835135C8D2942D48A3E3E1ABB68C6F62873FAF2A95D8158D98FDC05736A869EC0ADF782738BD4C02A95117A280ED2B83EABA73231CDB2B19F9D0AAE1E2A12610F5926C889F70AD39FCCBA4830698AC8C77B4C774B6FB5B9F98AF074F7CF312527C91D45BFEC3A457D5DE7CFF6FF86F572EECC11E361C1B41396B0972A0CDADA507C28EF592670DD4AF285C08EEA0219372B956698464E170E0847B758AF675F98120986F4CCD5CB646052CD2EBB2BCEF7FD422482F7479BBA194201DEF2B14A9237B73B1AC27FF9F0C7920484F366A069098855F35F929172001953B301FE648854991055277F31D13E3E1E6184EC25420CAF9660BC38E6ECDC010CE7BE6B241992448BB77706A336C202DEC3A6FD387367DA09CA97AFEFCA6FDE7708BADA319FDECF8A992A945F24D9275ADF7D76BE83CB9A78BC517C03B6409B881ED2A0B403F4F45A36542488E019D5D5FC934D96CD59FA03DD9CDC037F2900FF211B9C248CF23613032282E9CC4AB3D5D781BA6869690FD34F3603DEFE39B0C3182D9D557484B3F809459C2BE3F7B5079DE649D7D675E60B2AB852DF9445FB1990B91951E022390945B3B9AFFEE1E02952FBEF173D3FAE4A7B02F99ECCB4B8E9E8BC79038CE3427FE24F846B787748E873A0382EB299FE3CABBB7BC508BFD7EC0F8F13D0CC02C293524F2BBE36667637AE141C609AD20A9A162AA7C7460C05AC7785C15A5E8040F9EB9D5952FD44A85E2455BAFB557C661D1E41F89CBE1BE5018FC0C4A88260CD5D207FB4D1A70F57EE8D412BEBBEAD8508B81BC3DA1BF7F1F6A15B870028ED86D0E7544385AE76F2B40D68AEE058C79A4BE6C750B65223D49CA8345DD1D3CB5B7EB49626A4BB3D34A9127BE65AFAFF4831A818AF49A307D75014D71B34E55EDB9827210769E354817E34F40484704D2CB902A13E6FC2D07FC9993358C4C4FFF0C225AF85BD136DECD86BC1C2C5FD716D82C107CFB5712601111FF833B68FF7FEDC9FFED82B85F295583D73A22B89A159AB71C100448CE044DC042DEA5143442D69D4A263F6B8ECA5C6172F389A487EB066C52F866D292A973B4038069D4CA78B3AE86BCBB7DF9F7C1C9A0E0FB3863E86D90A4F140DD9E30038D4A70B671CB6BF4FF8F8CEA3D1CCAB72719627E001CA6D7FF56A79AD3F78B09AF40CB68BE8F03690402B6E1FF4C7B579B1E2E1FD632230783ADB35DAB4E5707DB00176A113B3EFF91B73F74DDF35D8B1BD11F957ECDA9808C5D4BEB16BE29560F4B10BD6C8F0AE91F7E31282A31F3427F36137786AFF97FFCCD960A0F70778877C73F75CF05ECE405EB4ED11D857B87918F394F04D4432B7A8C2B725F2A345A80E27E403838FDE3C1A35FD3718CCDA57BE03C39820610237236E4C4B23A68DD49EC059A8774F4CF31997D87C3B04C74772EFF8B54C85D93F63CA51677E34274B1A1A675C87061AE53B03E2419DBFB59C1C91F0D4AC0ABCE5318F414F27A8C1C39543ABBDE72F38D319BF415FAEF4E58154CEC1B1B924F1AD70C70FA7722BEA169230A79B1E04C2CA6CEA6EE84BC1EF7FC097B42BEA16B1818AA93841D2DA402E5D0CA92F3794B822CFBA3C2BDC3F0E0882478AD4A456F7541E02B11C26D9AF3994F71777CAC4A22887F2C596C92D1F5F074AAD72C0BB5F798CA499B193A95D5978869332D7BFC222DE2E64ABAFA60BB933E5C06D77747BABCCE4B108239AC8311A0EFFC1B6C1EC412208F19026ED3879184F987E0CB5111C4B24D1D720328088FB64848C3CDC0672A18A6A1BA7D39EC8225696DF261536D96199D0EB41B327C24D65FFCABAA6080434C9269351A731598C002D18FA3F70714B8134CC94B0A6F081F8EB3D87FA9D2E26D1A0777823B0F3AF859E461FF2B00E4BD55B22C4B53F9FB4EF02E5D9482DBAA1EB14CF47385C7A02517777F633014206AF2445BE840A59B73506B85BC357BBFE14BDA86661E5D8908FD35C386E68019CD47F0E9E8C00FD997D2FBBB71B52F0CBA100E3718B01C5A97753885592FAE5D66DBEF7CD46AB369F7E63700F7F65CA1E6776AF91B2EC61A21397E40874AE916F979BD916DE56D4A6C3AF33F2B1B08299CA285A9C089C552AC38EC0053C22F81C88021A99AE3045C72ECE25B1F987FF857E70AF6F7F0DE389AE9C0206DF54BA30FB906AF1DC8FFD1D857F95719FAB0581A9E9946565673F907AE10BBE2712C40688B14F743938E35C734CCB6C6EB4694D9AD48BACD192D73EE245E55EE3B9566612C57AC99DE2B66A88DD94B66CDA3C4FB0FA6EE61182CD37DF8081E834A6F6D6B8D939ECEAAC7BA8087901675FACD6EDEFB9DAF8D981073F62CE9909482914DA2352E29B092004162B60841F1C702A7A1DBD14FF883363C5AAFD50F9D3012094A3A350678CADF2F0980969C75A5C4F4EE78D3E6D839FED4D1AEEA0576AC4F481095050BDAA073D70C675F88E04FB2512CF07BB9779FE515B4E39302E042B37BA9445C91BBCB36A14FADB7AD3378E66C80052DDF897545B27C5CB253D40A01396C8AFF0D0A4F3894E49F48CEE4EB7990138CF73B241D77951666E5101DB8D746179742788BA37A146D0F69E9D7561AEC132F21FE2720303883827936C112C268AB8C67BE814590B9A6FD70A6082CF1C2962EDBA7A97E68ED93977260C39442B9AE787DFFF046D40143AFA1D7A8351AFD147F36CA434F805BB62F79E0BC9CBF2FFF86D5CD51CFDB94B8A33C16A55B4FDC2587DFC9C378FAE8EC19C83D77F2F04D95D6C6965B1A89E9060D1689B44AC6BA823412F78B4E0B7E85AD772D3C30CEC787BF3B01AD748EB081348C3488FB86839FC7A6EAA20F82B2DA0F06982CFA8FE2742ECDD9552024BD926ABB528955286B91D24DE947D427A6730BB00A83FA2B7F1EF1547F506E9D7F63A992041538D5378CB22377295CCA51A5E8CE8879A923F605A13553844B8263493060424BFF08817E6158C62B474CE829EE06F920857B37258EF108B0228367BC568805E4FD96A8D63F01E29B1A5DA3EFC34AD53F2D7D57EECC3A1508CDD582007B450B6321007728B267EC8CE5CC8BFBFCD261C44F11E2F38DF0E1938BD2F2C256189C8ABDC79743CD4E9D0A43E77128E5C657114B3F840A3B592EF783D633CD322CC2E865F23B8CF27F2F4E2B974C28F6EE1CBD02FE682ECD0FD2FCB94CF8CDF79E8E3C13248826C94659D9A4FF240E0DBA5444760DCCC9A1611195FE1D0FBD3BE336A227C365B8C53C8801FCAD842A7B69429D40589DC9AF213BB0977CA95D1F62ACC9CBCC28F16C11BC908BD97B666AA55B08969E5E1DC06F08C97608EFB306DF16266337E922A1267B0430EC349A63E81E53EE22FEF507A494AF46B871B66E17D4BF100A4501AF2B6665A95E83A5B8EAC82ADC0D3B7A3E230891EF8679533D04A7BE2AB72F72012331AB3A358C90A0A28678E522A875FF65026CA63FA2BCA95A6AE54790ADA38FABA0B8527FD3E050123FA5CB1417783B0C0E640925F133F36B232FBA89F10B169AC4357F0306ABB59EB408074200A5F9267D8AFCEFDA986FDBC77D430AB42684FF0AB25B095CE8054EC81A8BEB4600899C4B7CA0B28A61FEC7DA3B5A6E0763FE5A9C5843832151DA321497B507996B2758402FCDDEF4CC73ED7C49C0BD0BD0F909A744F6806843916BD0E73154CC2C551C0003EA997FA572C9436E203AE3D86B0A69B808A48E3F2D54C9258615C31BEE8909C600EDE29CAB2ABDB38C24292C4E11DD39D6F7B52568C28DE4600B2695E12F15E75323B2A0E5632CE70A3C5F651E1A51FF225E930EDA9853FDA7CF0A40370F0C2B20FB2EB3C2B114EB3CAF3AD14D8DC3542874B40A095350901C344C87C7501BB92662FF192C794BED89618D0FA0FAE6CDD15E56B8EDBC26C44BDE750CC6A9ECE5BEFB98A0777D1D5CD74052F4EB84EC45266B599ADA507FC0C084596A5389ACCBB20832858206D98C73C5A070388CC9F61B20EF992E9791E7834F9733D8824BCB605A289B7EAC5F3AB60E557B7DF040E79B30D32428BA2AEC81DDA3FEC0EE90D64382F92538F9DF9FDE8A517D966CB87811A8CBCF53AC7E9590A4DF74C7C28698F917352F1F79DB157CE427487FDC10664AA0A9F4DA4AF4DE782645CD4136C1E5FD3450580E88072F6659B19A7114B9BAD1E4292E65E49347182993821B98E2EA25FA187D8E3AA1C34C689CFEDDC4C93FFF6460C166E8F85ED6DDF3E25F84F3D7ACFA9521868BAD7DC7AEED4F016FAF2607DB5FE4D2ECA5AB1B28845808419BE8CEDADCDD13D84A594B3F4C3C8EC7F3EDDF9539457CF8F85A5AA32960D24AE50785CD10C245F87C9EE81653DF2C2EC576DC225E8ABEB4CCC5DCC15E91FA8261DDBD93F9C1D7D99AFC008480C70A7EAE38B03FBA2B9F239DCEF7F9DDF51208EB68F0AAABCF6A0E5246E17582FB99483CB1F2E0C269B9B39F97F2656494BE9EFC4CC851270436E4086C2B1A889ECD0381989865DBFB253CAB6894F5F7D6FC1153528E043BF8B39607DBE3F3BF54AD3C45316C96669F2212FCCD566D20EF79BB2186FA51571F46C6BB235CA9B0B960AC5776AB6394217E788516321208E8C241E1BFFB576720CBB1185FA2415EE8A2C5E2CB945DC3A0992B655C7F6E02709AAD07F6BE79BFC2B277C7BE239552C0142A2BC19F625E40AAADC33293602D0B8382B7F713FEE8D03DDAF689035615EE5A204B274CDD52FFCF653B4BB0284FB41548446F96EF74C547FDCCC0E82F8034A1B1EDDB4CC44AEAAFE99E59A3D9CF897C398468177E04276A06EDDB715B30FAD22DB031E1B1CA1E99D10F396F2AC154C7DF8B1B5873018E33B3E1B63385EDE2E317A7A1E4A4D7FDBFC53AE96A722A9B26AADAFF6E1EC274092314899C40A31C66E359DEEBC61F3E693DEE24E6CE21574C2EEF41945ACE9E6760868C2A4E7E4BAE34955B53A254874A3A21C3BCB5F38E43CA5261F30AD9BF56CBC550D4EE590649B8FC6C26D63CF0002AF934B87BA6842AF44588FC8FAD6EB01CD6E8B5599CA5A108D7B7F1F42D8C642744578A814E08CDDB5467599799D3AB2AB54714FC15A3AD9827BE49781033CEB4E7482C63907EC51686829A1B714677941120166DAA0F6F19F1EF2E095EF0C36766D8B25CBD2FE72FF918DC72E7327CCA942FC84F92E09BFD6E47DA45E3D22F4FC5AA6F31FE219E889072324327585F4089323F2469E7115C63C959F2AC73C1BE2CCA74A48EE40072B3A9310251F8922B4835CC21A8F10CF20DBF6E30405AA16970B6A8A1B82CB2F4713BAD33C466FECFB6036562BE28702B6D9D0A9D0DA0CFD78F1778999C35D8322541FBEF42BB9C9FFC36CC53E5405746FE094DB36ADD7967620A66A25815CFA4B07E396F7F99F53B08D2B1F176ECED49AFC9FC74E651B83B9703BCCCBFA66EAB60F44F2C3419631E8FDC0401618A4CD3E0A7A161E2D9782E1425335B2F1A6907F264CF41CC1BC02007FC95598660A6B48B83E860C1EF37BCED1003E7A18D05E36E9C04E72365BB4045B5B04E77038FD815DEE90DBCD43453562E3072764B67A1B65BE5ABBC15BCE4320A7384AA9052C71D62206502EDE6C33431614C388A03B8AE9A5CA8FE87916803FE9D3F53BFB3CD2651FF38BCC31B0B38373A675643EB50393A7F6430FCF3803813639B4EAA75F73F35BB28987FFB105EDE047D655C5E65AD06CA08902ECD9FF1184DDE98D36D5F3054BBCFF8A4BE0BBE2CB687D04F2CD4CDD56C6A60884BFF406896C09649D8E8C15777EE5A47CBF7DBA75ABEED339F3408AC5341869AE9C4408866570FD869D4BFB1017A8F91A482D22AAA7F68D87B98133169BA901CBC940FCD648AFC8F768AD5497590D64D570EFC81BD1B5CE2CA0EF7ABC045BB2ED2E34BC90E3434BB16500D9EDB9A18272E643845A134941BACE6367EB1754EEC79EFC8B41D68E5452B89AACF7CBC0079BB6688E54B64F45DFB5A7D158ED6275B215D9734CA2B9B7C84E6CFDF19E6A84F6AB2F83AE5C6C24C20ED2F5803C3F8151A876F955E0D275DB12346F5CD3F8DE73C3B1F0AD907F0D23C9B2FCF9764FF2C2E6D56E60F436A62611549E46876E5E110FB701C1F8C78AAB279779F52BE4BDD3394337F0175CAFBC7C9FDA98FB28384E43ABCD324219F89AC65D63EA0DE79D2A3E30B933C38AFE7A982881F876845B3EBEBC4A9FDD053DE77CD6FCE3FC6C978C1B3139A07C8DB17A8045BAEFD95340833CEE17346A3736E06133A3A8C9D04C7EA349919D821C1AE2FB904BF5F7B5E9C71D1FC49BDD2BA0BFA63DDD27ED54E86BF99D3FC5C2916839D033CC8A713DB4AAE21AF48E3391297A9B183FF6FEE9B8EEA09EE25BDC1F1EEE66C5A676D91B5A5E3BD5FB68468FEE416D911480C106ED05E2ECFA805957E869D1BC623FCBD38292C7CBF86B6C598A40DF35361E1EE363360C6CF8EC7650FDBDE261DAF2E81E883F1EA59C3EA3FE522019A1FEA98C9E0050E1537AEF93361E594DA3B71D9849736C3F31B04A267259345D0C698F11AE9E779AD75CF8D8BA09E3BA74AFC20E8B8B67D350C1090FF260C6B44D62004792A34BF4493A142F0DDBC337D0A154C70957F9BE60F8E49C02F35B939F751502D726E6B7623570177CED399442DC52FFD6F8ABA0635FF685EB31953F014ED9C297B2AFE835F068ED8812A5FFD19A60DDE2CEE8B523AD3683B26E0972C8C873B867989B55282FF5DECA4D51F5771CA78E0D7356017AEDA962D2C1CCEB9A51CD6E03225EC5E58557F7CD8F290C1E66859F419D18DE4577218F43B5B845FF28E1663BC7878CFED42A04A1B29BC11FA7D6306E0D7021B0B9108D49F04437C79B32AABAB42EA70094DF067C2D31F55E1E695C3427DB50993C46C43C1B15BF863802619E3FA6B5CC1E087D76738D9BC9A07F81EFC52340F4A27FFF633AED5B1BD5DC76710D330C8CF855F368AB2E709D7D1F4ED06B433E6831428DFB33350E197A38577718FB5665B021F14B790EEC8ED4F549894F0CBB16E531DDD25524F91D3B0D31A44168B9AA2AEBFE1977301DB1C6BBA81D0DFD90F86F4E9E1CB2B2F1B6AF0CB0565B8A438D43E129F458F7BBC2644E84D286C147EF944487CF94E9017BD9E3A4CC987DBD875114F8201BF7CFE11C21D76561EF85D9C69A744F3A770DC87601F92F4E548A829C63AE1F8E03CEC319F8D3B8E3C239FD056C95C210D67650131BB44C4A851DF1290AF4B52899D03F3E9871D565027C5028E5431289BE9CE574CBFD6BBE7F285840C2991327D5FA30741E75FAC68A54CA84BB746CEF6F97B7CCAD4335F9282D8F211D64889FBD7451BBD0EB3D886BED991E64FD8A1F0B5E92FE8C101AE98DE4AD54E22763F08266AC22BA235599A0FA05887BBCF6F2188BAC4F23FB6E6F58627564C82C8F097C8DFB93D0EE55BC0F173D0B46976E1FB30D558312B9D55F1360BA6A0CE9832ED7193BE429621FD7457CC5C6D1923820464F4D74C99B85A9512E6DE17DAAD9469929C5F9E1A1E469F7ECA689B3E346C09F9BB96E140D5C3265C1E75181970E462AC1CBAB1E811D35253F779337764B0341CC9D067596504A8186FD855070CDDA8E45F7D6074E6DF9AE6E3C6A3AA557C6197F8503A4544993A217F83E614DF5FEF24EA4C7B9BF3F8CDDFE924AA0190DF20FC4C84C17A1F1DDA0E9A7E03A57CA1A29D22E19E07F2CB502DA1A6E90A70D34289079268A7FA8460F14DE4728CB1887D9E18EAE89D5C2745E0D7F71B808710DA268F439EBFD82C1B30F3491050F98C17897AC303BF4FF1650855AFF2094F356E34D332BDC6380DA6E04E450D622B01920EF7D4EE0B522AEC11620DB1A814FC539F1A2F4CFBC16DD95BAD3FFE365C3A2F4CE2008853439BB04BD7D3A637EE1E618F6EBD48D81971FB290A7B4B5F0E5179DA20ACCD636DE9009A2D00C6EC3CC4B47F7A2A152D4B0C167FAD5A72458BCB00189045F06A36DFE7DEEF86124BBC03558634A9E2EDB4DCC3EBDD5FC709E5F53FC70E10B18C7FE40BB17B9C57BFBF40BAF1884E416BD1612F42A194FD75163E0296A91F318F37E258F8FDC3FECF273D419E50FE3BB46CDDA1F612B636613AB4F5D13B9FC6121CC75FEE364D0A573DFB3CF99376002E96D0E2269622C086F14667EA3A700014CFD3AE74154FB9065793CA178A18B581843F06F48E8EC0E3F69046F5F145746B3F68FFE7D1229036798821CF6FC86CA30BF2DC57D2D417948297AC098D6DDF94078BD175E9181BEE11D759237E48DB70632E896867C840F0A5DE9AC47E9532919D58733685B81A695CD2AD3F56121CBE5BC501398F4E13F3110E03ECD8513F08B7868D7F1D7D46AA3A5F2C55420D944D9DE109DACF9ACA28E1C3E3BA0FBC18E7DDEAE59C61AC9E9EEBB0B5B1AF68C9D5DB19CB38F78AAD101B87865F8E22A3B4E1F9E362099FF6D31C8B0FF0975E515E9399AE5286CF7F0ECCBE3697A190E95EE24C40D022FD64E50FCADA32E22A0579E74A4C6933A59485243263A56177A39F3D86C5B49B067FFBF3E61ABD3F7D94A4DFF729E43F97E0F79251223FF80FEDBE2F27462F05C451F9D6D251158CFF63CB8E4AB7623BB63CE91685676650F4C9FCFF2573803C1F3A00C0FEE4BB18C7607258E8C69430A3F1668F482A630C2EAB4D5895F24C5B29BB53619648F66D594D0605D440AA1A103F2E3A81BD83B024F782C4DA64080C5F1F23D70F0766237AE32E2D30E12442D60D57DE6BE8691E8AF01F46AFE0A136D39DF5B83A41F970699BD9E74E3C58B641AA7CD5BF340B1E9B099F532489325C4E9816045EAE8601477605AA2FF1894C54F35DC99C5B373FD3E6B8D7DE426E7F9103AC9F910125B7199C7D3B566DA04D048054DBBFD8F317C54907B2B9E167B8F881277F8F4FAE772F48DC6FC2E1820D87002AE232A5EAA7B2A190BF7267ACA42052FF9C34DEDFEAB0E006B5AE4D524AABADFBCD1B2A4E89A1E9721A69FD7A123AC3E929EB769FB2E34087147F73AB23FC7C10617AF0B86E1F9EFD75DD6FC5F4DC7FC99A79A0F39A2DC02395A5BF8F7CBCF304D3A51C21D36FB622E6290730554EE78D1436EAECBC897E7622E912FFBFE651F73AEA3F82F83141AD3DBE75A0B738358B9AC69BBADEDC3F12C40B65C0B853DDCF79260CB2EF4E9B0D329029E810636497DEE68507248F904E34C3EAC508842E0069A22F0E5B2621824FA7392FA7D07375BCE3FE674DC04150752EA66397B17397EF6383FA393328470A171E17289308E3791E18245FD0EE5013D7B7C9B14D612B510169E0A5247CD2F873B9ED36F708BD2F40CDF37EAB230ADC8D97A0239B25B9694CCA4A73BAA8DBEE1022EEEC981390D93BCDF781FEDB87DE6661B81A319174C8D6F7F4A9FD7D41B258CD7E7D1C9B9AFFAB93CC6D5681C6F0F2E4BA52E63FCF9E03A100AD2C3B03A3004DBE0725837A9AFD5E3E25D2CD0D8531A00CF19F2149C8CACD4C764A08BB04D1F7DBD821AE5F88D5D7426DD3BA30E18C8824FC4C201BB6ECB20EA91BA88C5C8EAD671AF272298229B454C788AD58FD1E5BB133165B71A6244CEA735B2D05105DFA0642805475335EB4FEEE82EEFB959E985C2274F1D03FD191693A5C138E145F39CA9DB800D5D5406A1EF36713A66650C32EFC25488F21CFB6D2F211364C661A36EC7933AF15A31DC41E95CDE1366AF695A4A7EE049B32359DBE148B2A7077B4A634EA44948182CDA1AA2B49CA8C20BC70397CE6677E3EE2BC8F00DF82B57411B485CF78116C100673033046F725E1D037F979C6F4B2C90316D59CFF494F52C603DF373F16A042CA054EC978D98DA074FFA598F5822F99840755204FE5E53BAB0EF096473DF71D13801AB86583FE81AFB172AA063D727D4BD9C61A22BF1480C58B1C336CC129EEB67775CF63C2DE79F41E71EB402FD92141691D39F42132AA102414E8DF54FDF1E11201E0120FDB67A59242B47488E74BB43D1A2C6980EDE290A4FB321A314023D96089817F8FF3A429BA6332BAD4A25BC09F27FB6DB81C7F663A2B16572216536255BE4800C4070A27225070BF1C601930162F2614FEBAA10F54C765AEC1A98110F6D119057859CD048A4F2F2AAAE74D45CA9B16493344AE0BCD941046225158B82B339EEB003D2F33451D87747D1C075EF3472BBEDF31AFB4AA4D48DE372322C387056449FE00E379EFC97B8565764A3809AB10D17AAD822D3A5AFB996BFC1F2C4DBB53C3D01F40C11166E2262DEAA16CD51619ABDB68D786CCCBAE98D6F2542222D9C84D6C4C23C4542F5791F40D8588B413160FFC51C4420711F8512BB8A01EF5DF1AE26966AC99850627FBEB6DEE25C66940084917FF5A3ABB8BA2320ECE40E23D4D7F8DFAEB33DAD311552B3EC699413264A6ECD2A2A18F06922582F59FA9A67670700DC8EEA2F95FC668FED547B0120EF515A5BF92B4D789D70860FD9F5A2DC1C144AEFD5083DD277742D517B68A7BF3912222DA2703C5278AE65B00123BF464CB214B30630C4650A1B266978D39435C2402008571A005826872A12276C81B18797A1E1E4A6A287782EB04CFEBD3AAE86FFACF90EFDB0731A065B6E4C128F27F2F25EF9BF0FAB8BAE615FBADB827B938F37E454B1D7AC3530BF0D2D504ED987A3270D9F90912307C0A14136870CCB174A9F0346D74424B08D2B711E2485B6E23B9BB1DAF171310E88B4DC757BDF4D03FA9FB95A0763D13FDDAB600CADB3643CF069C7D60936C04AB3D71469361320B4FF6900E4AA4E704D60F7EEFDFC37D6223B11C475A227D3312A4A7421089890F6FE90FC31789EE0335836C4FA6C404FC0C82618FC447AEF62D032828C32366EB7B4475083A3CFD943B068E418239DB9F99B84530B2EC061474B3F62DFBF73784F60115D11B8C3D81953D098BE856FAFFFD3FEF6AAE1C60146BFEEEB6357AB530844A75D8BE90E9F12090B63AB16226F0B47595832A21BF6EF1458147BD67C694A5D889CAFC8F2AA0DA0939A2E4DC76B5F17AE3DB95EE3F35A62FC25A2188CFCE7822C4E2838C40B6ABC831FDAFCC07F67DA79B072962AAC2DFBD9CBC71D4AB0A0461948CC379BB105E90320FB123AA4883A4358E257EB4363C818444372E2C4706A982BEC3EB0F0E9C66E7CC7FDDC8EBCF34ABD7619F5EFA198B706EA09FE0A1717CAE0C9428A1517FBD32C33E80ADABDB824B05B3F6EC8DEA8AED9CBD36C58E6E768CA154E5D1E6553B47C6D30E84F6CAB6EAE6DB625A9ECCBCBEDE9364B2DA1CF5263D835F370E72FDD0E972F503625D5348A8CB8E461FEFBA576B79E931A254A85A1EE0463C76D5B2956C7495478C791F927B6671C06743650ED095FCD94050A1E820AA8A28A132691C342E291079E04B5BDC42686FE1C7461097EA0B4A8D60E30ADECDF11A2548369E345FC6D290E73425C67BCB3B3E2B0F53C6A0DD1DE29310A7FA81AAFE29DD809522EC650829AB4A1AED29C45DC77DBA1281AA5A828B05AE5AB39DBD0A08F060E93F7E091CC196210B1BA1AEFF66ABD3BDF75D615EDFC5B06472DE8085C7F4B8047BC339AC2715DDA0F2863B088175181CB8CE096E7B87C37498C645BE8BCAF668E623CD16E1ED2BD1755962FC0E4C4948438066E7BC4F554B47C7CECDD92579270721CF0618A561BC2ABBD2C770CA7D9A34C2D73A77E3A62FB26F6D9092BF13042DF7BE5513CF108E6E8A7664B5D17BD061ED39D8FF42ED2B00B6A694D3E2DCB266049A835C1F46D14D19A2B2AAFE0B493D98CEF2D03405B9FDE876DB27C6E8120ED1258F5AAEC89BCF9BB2E8ED4AE38E5948A4D78B4B4AC346AE822F7DFB771E0E8F0663A2AA7DDEE0CDEE84A15C4AA9A5CCF3A650D5EF500ACF5A5CC005EE85347EDE5B2AE54697A3CD5186E2F93E7E198672EA3831DEA588B89C357A9E87F8083348EF00EBE087AC7A4FEA280E87B3430FD023244492A56A650F09AE4383418CFF741656627470593FA28E5333685BEF8E8B219A9B170B12283CDC20539432A63CFFBF2F20F0292503D9B708AB00A1CB424E7E766632235A5DFC1792B765845EF6801E5C4704C0031B62817CF528FC32B272E3F6E4ADA812C02252EACA0176C66086F7D5ACFAE2ED3D471418D057C1988116E22E0F64223CDCE129B6326D1BFF901A8D9525E6517FCA06052661C717FA722E9C776648FEDB59584E7AF9C4E52403B29E7459078C120704D2AF5678ED00F9F1C94281D0371A04D6E225CAFA4BE7D40BCDAD811C2EC11287012DBD14B900CE8A54C9675B128DE1DBB431CA2658C7DD8D843DA0DC2A51101D3F81C2D8052ABE0DC694DE7DC3C071FB2BBEF153E7EA1868C3D4ED8320FCB70D2C4BAE1C402BE37F7260DA779E85EE608434EDA6E28687E57883C9C25FA5DDD6E3352A345F5D68210AC7AA57A62E908ECF22141557A5B8C7EE67F740273CABE0EED231BE89484CDA00F46380804C4F7507A04386C8511901AE515928E94095FD26CDF830C32FE6C0A6F54430D2D81BFD31B00CECD7985BA8387BFAB4705310AD3094AD66386BBFAAC4355B8184D3CE2449FE5372832CBA77FA281883E8F499323AD2F978D4EBC476485C09530FA955FE25CB59412288CD5B110510E13D1387FB657D0FD80FC21810BA4415F7EE4D16936D4BEBA26C986047CBEFDB1B3D254BBCFC3729C6A34E29769D8A343717F25F5FFB7833BE6182DA346EDB66C0A727682F7C7C78838EA6367428CB944BB354255DCD843CB7C6C2C50B4B4B8FB23DEE4AA0D4D48321B343E006DFA74FD5B4D0DBE537997496D2607FC509DBDC58C6C075F5EE6835CAFCFDA82F3E4C5551089D9D1B755109471F287203A6612043A6B568D9E9DD21008E6C475FEBA31DA0AF1264AB19BFCFC63D018145678159A53C756B87627CF00F1024D651CA7CC2F9F8D2C7B16F7CF1AB73BC07CCEB1DB9C738A120406FB5203DDFF64BF3158E9E13F796A148D34289C2D3ACCCC219A2BE4EA35855532A8810FDB30F6D237C1CFC60AB3EA5A58E2D2948B5703AEAE4959DD5F753B3D069FD1322A04087CBDBA76EAEAEC99B73A5BED5393C0BF08ABA1A2248B1E6E4D6F3FEEC88FB3B982171B8DDE021B963DEF6A3345273CDB813BA0ED9DF73E113F8926EE1BFAC8DD1E9B99784C7F3908BD68467124F7E84DE3051DB51B4CDC7998DC2587671EF97F4AA3E37EBD340DB54FAA766B8569581AC1D3FB2322DD0CE9FAE6AE1AF08561BC1636C00C9B86BA897AB567EF3AF761B3D219973EC18336C04D828B1AB12E206DA1664576692DBC545A8BF59A1F7A7EE102C06EE2930D221116032CF8B9C6838B28C80A88B798F2A5076D52662E51D732DE83DEB91B3D5AD1C6F6837C588D4CF507FDD90922FAF485FC91803CE24E459BD4FD8F04431AFA910CFC59FEE94721A20451EDD0E642B61F1526C137730E67FB0A787B32EE38B0A2902E7ECA970F2202F4612FE98D03D56E89980550774BC0942DFB6C03CB7FC9B25BFFEDDCBAF97415B212699B6921DF5B1E3B402204D886CEBE6A1D475485040A01A7A20D8ABC3C6D8BA719116B5C3A6B7DEA656DBA2F611F4BFD2EC46594707CB4DCF0B99E09A31177F7BFC358CD6FE677FEACB2F02B504C2032B1F467C867988C7C7FF4FFD47A198E6530FF4313925DB73F6A2719116A97503227BEC0B2AD3BE45B39568973DD5965DADAA92987385447DD36A5848CB3A8153BC4F0E45DD53C39F1FC5C048686D550C051DE6AAEB99E33959EF9153FDA7F521DF18500375C6B304CE4DFE7DEE48D8901E73E6338EAF98A5F9F963884D5F11FA9708206AC5D4A56168142E8100C5C3DF957E32612831F7819EE6E28FF602EF10BBE26859790F29F6652BE47CAE779B8ECA17DD0A81D706AEEC4D539F481ACC0DEFAAE2D584F529230446738B8BBA50BE390362D5531FF92EB5E6179D5DFC6BB94654142FCACAEF8E3624B4138AE74785211B13123A47581923F0D838BCD896175853598D6B452BBEA8BC8AB663B8AAF8D993D31A4BBF91FEDFD5F3052FAD2634B67D87B02FA76D83ABE4B3BCE754F9ECFD8FF9203F823C9FB209CBC21CFE742F3C7D4DF7851F5E16D83023A6CBFC41382F09A3DD8F712F4E947451EC0F462207DD2747B81B8164BF3C6BD83947CD61A504B360BA8023F72B7A58FFC3975BF1DACE3F8ADC8582BABC88AB0C2B59E4A39724C1A26C98A3E638088CB3BB3DDAB382D2475D129E47111AABEB8EFA765892BB72F973ACC5E6253C4EC1533DF4AD560CEFC8CF1A9C0EC06D66FD539D93E11D074FE725D640BC72FAFC535F9D35294DB6540B1C69E72EBC12553BF5617BE8EF1FE60A8A33E815CE894A41D5D7AAD64A490B029AC2262F29437ACAFF271978F4DA52DF84185F65863C87C659729430BFB5A17818C5FE2ADA14FA7B6C61324AB90434BF51B315AE9D7D187B01E230BF1343893B3C589992CF61CDE7B27F10D036DBE4A21A073954193ACBC155B7828D40AD3D89A1E3BAA34B99C7ACB9C992B5503EA23FEF011AD6CD7949CAFEE87A2CFC09EFB0A04CEB4FB603673D9920DC0FF2D71648BF3AE3452040A2CE0E6057E4146CE5F2C8B882D7F43EC765414E3528BEE8BA265D0143B504647C7AAD0A052221C4D15C978B074D9080CC2C0F3819F77F88D84385458A2C273A61FE201F440CDEB6B19E1992F41E296B5ECACAF3B7B1196430FE7F6957468D11A20D663AC4ABE834DB103E279F7C5AE82A334A969DD0FD98D18A708F2B899A2D4A847FE5C389B8BBFEE843EA57DCCF95778A7869A2D741E547FDEEAD28537B20E0BB35FF023BC4D10CA09E3E42FBE5CD3667E1B4FE8FFF9703604A6F5598AB1DC8D86D2B865262D531DC7412037A284AEEBD762D68DE3136163DCDD2013800B4C11890AA1644A78F1E29084DFF51DCD097635B301CAF2751A9C94A616389E83DFF7134EDAA9B698D8D2D788E50D6E1CB918C32605C6A6F9A4265A8FDAA164A11F9BF81CA4742512F2B16B0F3F5DB1EC7297E2664E3BEEF98BF0EDB04FB9B9EAEF373704508801A5FCAC41E1C3EA876186ED5A8AC3AF26C8544AAE7B8B463BD1918261630737780E628DEA98F8C032162A13B6F96BABC5E910EED07A385AD170DC0A49B97D95B4DC03C1AB39EF3C06A69F3A3A189248A5315DBF719EFCD34FE89F182FB15945CB85BCE6BBD27356189A9D4AE4D86ACD3381BB36AFBA35BC9DDF39F5729357CA4936107738643C8FC58DB6E4B42E0BD6351B73A47C5F3F2393EF7D2140526C4981639C6DA8F435EC759E2CDE321D4813CFB39300AFF29A1620BE244824BE2BB237D9B4F4CE69BD4C3F632E41574E7076F82033C4C07DFBC9DCC34AB0572AB695C68FAC91A7288D98502663DF5663D6A0C73936F83B6179A39E47C8156C35382B47B46B350CAEAF0490EDB112C48F1C51581EFD74F493A3E90BF4978389FAA303FA593AE468618DA235B53B5FD5379EA737B6C4EBF7FBC9342000156757CD2C7B78CE761E88CA1492AEA4139C7B400A04BBA26297FC95021C860F5AF1F0537004A759D5394E1432059ADEDFB15A1A47E6D5031A8919B8C8310190CB05C74FBB63E14A0762B71C27F2464B1FD5B80CBF6BF559E3D9D962E9C94866D0DD0BA41AADFA943A5C3C0762809CC83EA32D2C1F88DF66FC6ABB8230FEF4829A1AE15496771D8F8E4156A0E2B0A34C62E738B74DD391B62B08A19250790A36935A499BAB221503F2546045FEE0854F7B07F1D54E59C9360BAD324B251829B5390858F09C8A5BA4E00D95AA6306DADF449B6AE9A281BAB8CE264CB3F8EAB0851DA795D03D03D75208CA73BFCB1A1771C041EABC2FC0B3CF4C7323A3109A6BA4D628C87DA0286A7251D2B79C3198E72D2751C0FF0D26A4263DBF7CE5A95A749D0B969608AAA0A55CCDBF1A88B009F29BC5947EFB08E9FF744111791EBE69C1C92A8A4E064BA85A14748423D60D3C1B1289D9619DEFAC92D517496C02004D34891D66DAA6B228EA82CB07C7CEC24A57D17EBACE4227582D3F0C18B9750BCF057DBF5F45EF954CE54FDA4C1654881F3165631CB6125A9F028AE4CD7D21423DEC77E1F61BC322BAACEC341848A7E3FCFFB3DD4B44E502DF08D32D5029719521D0510D0A0FCA461C9E9D729051FC81658C67EC49111FE2CCE82615674960957CB8BDA21A535452D2C58DB798E5CAD2FA0DC0DB324C3E8221AFCCC3F8625E62F9C91EE0F3C0A6905EF5D91131E767E06AEC5DBF221CD29B376EC87F1C1EED43BFC16755691E5E7B47D1A1D2A2D6E37E8F865D596BF7683303E4CB15E1F487E91AFA556AB082D8F54306730585B1587122524587C8529819D629928B1C75C9D77D056B7E2385D68CA2FA5C62CD94BAC5151D5207EFB791716A351B6C598B3FB98EFE1EF4BACAA26BAA654F1808892CC4268A298D3F9C40DB12D595DA8343237A142D79B2BB8078E855A3DF5ACD2F74DE031B91E0F6FB3776728BB1C22F7EB732A7D99A0E20724194495508D6044844EBB6E3223F4FFCADA693C6D9D3CD838B9187E6F0E7DC31F76E6F92AAC65BA2057B31BFAED37A1BFB3655CF2B96445CD16F55F1F6313E48C21A04B2EAD62850981975886C9B5AF01476DAC388438FDA70C4AAF483147A675F063B86375FE9CD03640F460017384419D56D224EF37FDE43150F378D6B622A800AB9E8BCEBA6765D882C7C7B7DEA10B61E3DD8E915B02E4FB92E4D0B3A852E8EC9A39A0E3EDA6441F46475053D6B31C9F3FA7E4622AB2AED32CE7F0D67C4EFFAA8B9BC64F42D6867C93D5C3ADD41C9FEC74875234C665602AEA1EAF890767749C454265D8B50680D6128028849436DC508022C2D7A9FD519B9F67542A0A2BBFB51F54FC63FC0DC9ACDAFCB17CC735B9E9229E26DD0D7D300A65EA58EFE9E7187ED8B8FEFB5DA0C2152BF9192C75AA92AE4F9FC0339F64954425A35154827F23B9C236856EE692936656B03F8D9D33DBE53F1247654E1B3F547894EDE6C653160B005DA458D123E1E6097E9F81C4430FFED979A2AC7B04C72EF56AFC5FC3ECF24949A059B5E900A6013B8D78ADF467133DEE1605D32844ED312EDF49B9794769DC011F102247E8574E2725D380C3C21D6F5E066D6B4573E052FC44F0FCFD8164D7A40C066086E6912388EC74F90A3D5B5AAF54CA13E217F21B208C4FADB8FCBE0CFEEA31044C1E592BE7CAF6A72F450898A497735AB2DA9C9A29FA02D943362413EF8EE65981FF7CB447DF62F62DD22F7FA42A5252740158691D912DD44F0ECA02A797C3776ABC15B7F208B5F860A8D947A8E9F37AC8D9F606736AF39896CAC94C63D0C080582D4A47666A10FFEA747421FF71349B09A331EC4740C41469632A018C810CD3C55F28AC840D3CE4A67339C3CC4E71C6A42B3D8ED08D2BFF937F72F24C7E35A7241BBAFB684E373D7585046219C35435FE4F9010AA812C4F3606CDA5EB69699174928EAC52BB29EB4FFE173B04A028B17D5545AADCDE05848D4ABC0089DAB1D97CE40CC67B5D869E0114290A84D93E919BBD5187461C31093AC40B1215EEACBAA3C37BEB2398080E4230683FD85BFC286FD0C4ABE0955E7A93ED06F2798030476D1A74D446881FE3A8D67B6D94A87D0376D0A4B63F3B4B661F774C710AF3709B6C2373DA500FA26EC470E8A1E7A42BD6C0A83BA6B46E44018C37F0043989B953713D1049714ABFD17C7A06C4FCBA765206366A5DCF8EB7E701E5E80265FDCCF5E670B846485A94DD8E21348B6FE7274438C06B98833668111D06DB1FDD8877541181FC8E41A4A16D8FA76F4541E89225E46769F2C9476DA9668C36797272200A73DA3C0EBABE2CACD40602BF1A0C4DD09F1DAA1AF03E741CE043DB72CF21C1C78A7563A8AE5625E32E86A42C32971582CF938C3B33FA70FC2F1D5D2A178BCC04C0715ADEE63C5C416A0B3CF2BCC92253A0E1B10817B81A97D83FB72A4F112491B21B24C6EB27FC05456D0D3DAAEF10A46F70A964B189D67D9128A5720F8125CE6E9D7F707F2121D261795EFE102E5207D49EA973BFF2EE6C9BA2F3A31BCD7045BEB4B730C34750FC443FED1D8567714C3BE1D62B686D5778DFA50578F64A6F3EB6FABE31CD94CD448D1FEC78BA7F0F2A902107247D1CAB3EA92FA9714B5705B54B840CBD38359179A07023EB63CEBD5596D42B61EA84DD0580DCB290BB79FC2BCFAF945040ED239425F7CAE89FA852187E5A79EAB978954704C7896EEE0DDB8F7765C753337FC41182E7898E86757309E1071FF38FB49B236411DDEB562165E9FEF41D0CBBABB5C5ACD24FCE5D10B78CEE7F219B338EFB7C5347FE2D746B377409867C5759C057E46EBBDAEF6CC75E82821EB1C955968E9FBD8FF47605483ACFA0E0D7345F12717FF5083B614582D61D54BD52EBE3E1E3D49E49B8B3ED4CC0E77A5FD03B7677B1854F8FAF3F963E83E98D4601A9F137DEC7CE135C1EC5A8E91020AC486F309FDA18C5BE62FE1CD5EDD927D89CBEF0F3CF62CBA338008EA7C939914442EAF7C56123CE653B14D37EFE49F8B7C5327580E4843B2AAF3AE90DB29C6A018BBB13356439AE52C5F5542BCF89487925C71FD710ED6D68A859D5E3BAC87C95B09F0A064CC7E026046129CA810BABB2615A4FBA2D7CD0262DB33FBE7AC1341BF06828AED8A2C746EBFAFA542785C7F2D47969C63F2F2B09371E6D47580D42012B9A93100D12B0BFBF566880E3AB22C787845BE505B236F38808027D253F282A00F605D43661459DAAA2EC195521D20CEF8A9041489FE35631150AFE0BA8D9F7AEF56838BDF5E094CF3EC43DCB3AAD6BD232131531A56BAC47A9C46856B4B91CD1273155A170427758E1B30A04F696E84C9245F3EB00788B5676EC831786FEF176BE38912F5119C01EFE6C3EB2E17D04D29E457FDD6F6240D4577A0E7B264AA1733DFC95842D7EFAADFE376B5E47946067C43D4812F4A0A2C90F9D2DCDFD5AFA4253F8828DF80279842C30454C7B131228A37E20FDEE22732095C42DAD391E095A909B85A38D23B8A064B17F7732065CBE2E80812B82E038C25691DB6737E6FB42DAC375F616066B3426403D67EA273D78B64F1A404D18471F7BC7B21EB78584D4C5C13FDE8BC2216B36263FD0310A2F6A3DBC7EB38602EFFF55E0844E3547AD653AD11526387636F506BC3FA58498ADA388FB3405DEC5D701D1BC98F5C4839BBC7DDA419B38415424A353A93DC3ED3EB162B5D4B2A4B19BD715D1B062983FCE4B21A2DE21DB6F151FFE43F2F309672949497A272D2C3489F5C3C6B0E6AD1C71FE4A7D619B619F95BCDD84A1F66BC685EC1F3EB36B6F2C03FDD015769A3F12F9E4AA7D0298996A3289353D4821A7F89AAA3F5F7E4A6C29B9AF99493E4349428C9B6CC7B084292383DEA79A89386CDE0568489095D65083510960A7BDB967886C07F6F26CDD24637085EDA47DB9606BD5BC21AFBE4D1FF5ABD4A09A639190C24FF5019FBEFF11FA7EE26AFCECB37E2270276A77A5EBFDFFDDFDEDF84EA95917B82F53EA84A2B093977D27569341E54C41B25AE88AA5538884642485151D46EEE13598ED47ACD7A59352BC8921EB70F6BDFC8D4CC4E0897E56381947FF75AEDCEF8E46F0112BD30F293E447A4BCF6E9CAF2C4EA3B0BA6A2DF6B1B28E6430189E4F61E56301A8FD1C320D053C1EFEC66370BFCEE8B682142BAB2445FAEFC2F613D75B7AED9D52C7C3FF64300732CD6933FFE725470531229A19A37023D0BC59E9684DE2EF99956D59346BD16DA74AFF09D4EFC8E6D949505C20A79BA12FD601264ABC197C2CD7EC5A67C95B47AD31BDE6FD32004D672D74DB5FA795A07B4DF162A24298BDA9A6E2763E4231A1B744DE2E0C4B3538AA37EA20BCB73AC43381F2987430C82ED7110F43EBCC3439C9B030B40D6342B4616D77DE5F7C0143164768FB345F34FDC6F5842F8CFB3B6DAD25F2526DAF6C34A479AEF4D7403480F699AB24A493EDEAE21C7EE0361485C85FE24A9ABB0DDD776E9C7374A75BA7BCE351F794FA346718AA7CC31DC5A2BF32A7FBDCD31A212D1162637FDD0BD4F0F1EE31C83BA32D42371870AFC61DCF378AA4637F4B2E39DE33D0530C4EF1C32E6482F35E47993FACE84A03C43DE235F0A936712BCC9F45EC232A2D63BDEF6F09CF6E5D09FE87B41F59352C14BAA5217305FDDF174FDA89F20D370EDC5207FEB668690BFBC618015CAB63A22FAA4DE8F9B8D2400820BE4284D36D0B538251376E2CDA0FAF65716686609A2B4B469E348117C278E30AE08D51EE377814C2D16498F354BFFBB4B7E0B64C2147921EEB05C029CCF73E5659C117ED3BDABDFB41DAB9581A559EF49605B99EDC5D860F9FCAD1842FA02041B572189989DD2C425A50AC2ECE032140CD7837C58C3539775360A5CF06B5440C9C9AAEE8118356795D5B3E9D84804528605F2C2D524688D1C1D502CDBBD52DFB897CDB62827FF7D7095405BAED5A85917527A4091DD18CCEDD612951CD2AD77416D640D608C4A49E8BC16A55CFC3420C68F393E3CE8CC7E6392639B647AC789C8AE123218B3988DA2243A6AF7144BB7E2EA6BF6B2C0C8AEF9C0AFC6F49E98BD1EF6B59ADCC037135A0422C2065170990EAA57287FFA32E1D8D53DE2EC8B9272F8A16124BE3C04E48AA0598B7BB4903C2E9F8C8D691A77800857F91CBD95277E14F8EB7BBA74284BD493380FC21DD9FC5D460AA4AF853E322B4AA333EC917D733C5A6A0A7A7C28CD1C675A113064576477A320C0A10E421D88DC30214F30A030AFF139B562322CAB3DEEB0596ADE2364BFDB8989B65486CD9A394124092215B4BE41727F8BF623F1C668336BC421D4340EA43540417DE47C8835ECC9AE58E548EF5CF2247692ECC1673A4A37CD2F7F6FEE4EA192FD49207AC42798EFD9FA04F3602DBCBF788B5D117096DE8EFDF1C326D5BBAB27FF4C1E9A97DC34707F20D35C0229051CEB48663BFD44FAFD23B75E3B9DB2BB3E6E08BADC8F9B0BD26B12A1B4552FEBF4C8CBDE3485563A00539CCE7E6A1E7C2AF8A7D09496E543A40B618C071ED5E3D3B8B3061A1731A639036F0E9B33F4D8A2738BA3ED3B94758804DEDD2EF9732321D0FABB4BF1383233658D689727A330003388BA201F4FAC748A20C84A2BDE4EDE7B061DD1E3E01A63615FE3F9E9B88929E7D8C7948B48E49C0BBADFFCB8C5BF7A906256BA3A10F15B0DF7243EC2FF3F6FB32F65E76B52AAE391BBE0006F22064EBABB2F808BF2B39782504CB877C0CA52665D0628A05648FE3D629E97700AF5470110EE96640FC0CCA4740A10E541F8DDF79E58D6093CC5C25584AD6D9F6F0F36888C8CB7BD5C3CE29D561A98A7A5B0E1B10BA386506E413740F218D5C9272BE0118E9FEB470E80B6B3530F69B801591B4C8FB406950CE5634252ADFCEF15ADFB15F982F1E36BF734754AEA09FF821FFE711F3C6572F57DCCFAF5A729EE874E1F7843BF54BA87E7B012DCFA7926DF84509E7D04B15576D9C791D7E15DF54DE050ACEE68087882F6096021B1779CFA52A5E1145ED5F1E1D3FE5E9CF23CB64E9F71828EAADDCBAB559A77D7C4A723592FE51E4E37F827E9584C4102EF0A3521A98B69CA7477691B04E930932FFB57447D05229BCA096A420DF0FC0D52D3946BEF8382FF870EECA3A7E4CE3C4F21CAC25462C0D257FF33FA895A36427648E3DE2E18F03BD1320705929BE49FF81FAA1C1BD3EE7E59ABA961DFFA5671E547F329C6B81063A5660D7AE80F5B6AC97A65F7AEEC3903B2BDF9944BEBD91F2A9EE5446192645C8021826D55BBB5668FB5E088A77F9D8BB9E7F404F52CBE2685E5FC9622E68906D4D40F30A0A384C2DE31381DD0017619CC96C7004FF2440ED8AEF7E63B2E10CE7C96E0267BFA628737712DCFFF15C56B3CD56B1F2F1C45E96F98FC2BCDE19358580E511D7DF6782A4FAACEEA1E317BC99FBBCCE1DC66DD6EF05442D8E19E5F4370ED0B934E0FB0C39174BDB84BDE957E845BB074D13F5AE16DC07A9A85AED90D0A2C595B6E14029B8839FBD283B870FC0FF6FC820F5B7463B9D846741FD5631656FF3CE6C1C8BD364E0E8898EEDE5B2A1AEF2C4B0950DD39C004A7EAAAAAC795681271CA456A7270AFE5F5A686ED7CB9D3CD3D389B320765979297388D520573B9297EE20E9E3C4A60F2FEE839C256E509302EA42AD87CCDBFBEEC6F1D8D0DD9772575FB55E9C541225C07564D5471568A193E9051561951D7C9BDD66E11DB0AFA3BE15EFBC10492DEDDB47E1B9829EC1796D4594AF7E9B02BCF1693D8D6FB748AE9C912929EFC53DD16256EB5BC01800039802AB8D6F0A135A69957A838819CF44CECDDBC8C8FC4A2E2C25710520773EA702A44958E2E1607DD2098F55946F5FA21AD1D18295624C132EA272865EAD7042719B030C7F5CE89EA079CC40F75D2847D99B5E90F0DF826AC6A47D837A08A23044EF68F00475874EA0B3C815D6DB3CECF33C3FC599BA853729860F04824244609A976465C976D7D4B66229C2DF7EA3ED5B03B1C25E5ADE1F81D61133249138DBFF15B6CD39C3A04D83F9DF613F05B8AA104D05B49219636F49FD625AC78FB3BF1F213F548A99A98C8E2B074DA89A65BB180948FEA4984750156FE041A6E10F6E91581B185D6CD5EEFE7C98A466FD473F10CB629E22D1B043269E49710E45891AC8C20359A55D772F8E733379CEF59370B39DB10471F0CBC835D0057A6A6526C7CCD85FB4068ED51B3FC40C5B2AB4B807FC4035C36CFB09C015BB288275B3A93023AE35B9E9FE689F602EC4B4831E161523BEFE022586038380B53F24F07C136F5BA7876D754CACC33FADC690511B8BF84318852673F5339AA7E71AFC2F08744DB143FEEF7685EC6F8869A6E705AEC2C9D6CA56D4C2D4C5C3D2ED414E2429FD011F77FF886D28760D09DF1AC1E7ACFBB18A5F569B379496A7C61FC34577D641EBF393DBEC073E699F48CA80516B032EF619EC5E1BD983169EE5B31D238A7EBCF2E389088EC57AC3F308261CFF069424B2D62D8878A29D1961601876D3A10AF441CFA9E3DD4B92B6A449965C4BA7E66F9800461FF9AB23954FBBCE52E62A78C96FF04B75813B9F420E8CC4C934A54849497C4A548BF764520F80140A94503B9E76FBB02CBF43EFAB725966A63AA5031F7BDD476836591041E974149D039DC6FA84D0B13DF5CD06CD2AF568388536715C14731AD964497CA7FBF26F5E733C1897942B5FB0C09529B8EB2EA44378671CA2F540C03DFAC03781A48F5BEEEA17419B2A1EF4DA00C3D2A3ADA55D88640B923DBBD774E6DCDB74D2719623352001DC1E95B4C6D42F9A7D76ADD7A668E31279A7D7A6D4554179C5DFC4542B74958A76D5B4588383D70AA7A718681EDA81D1EA61DE199F9C116FCCC5FA322736314274D1149F6FA96678118000416653F9B22D8C4CA54F1FD5A5A3C71BD086370523044BC731C3337B638F07401AAF295BA8B08154010D71AEEBC411495F5D2F1EDB17182537FB4722ACCB4F4118FBCDD79F315E07A11CF5ED092167C39F5621E6E97BA23E7CC999B84F548DCC18D22065744BEB25B2DCC608D6F001E10E6CC9E054C14228CC18B715938061835F0F7D5A764211DAF6DD0E5D2470F4D841E865F324A9B2503027A8347AD209213858998A9D01CD30B87CEEE01CFDF59CBB5FB66FB8D09E5E915B7B1FEF94CD0B5B680F118FAF42D6CC9EE1302A64A3304C93EAF27D59A1DDE9B17FF232296FF969F731425D6AA456D6264C58579B4894B19863724D2AC65F6BD4BA6BA66464433F88CDD9A167F77582EF96C07C03C6A256C6ED7A3C9CED3598F20C0EA2903191CB706B2FA2746443041027C796748164B4832C827B9D8231447F1E9D392B5F755862FBFB2BF23465F4778251F3D13E30779C6FA6CFC406F37D595329F0740567EEB8097AD9A6E7DAAF711E415A8F5FAFF36231E034D3BDD02FDD8BEAEB5BC31697057F684DE8992EC1E37CA9C633D3300B465C9FCEBCA393DC9C46BF0B60A613605E6EDA2339CAC1064672D742100D1508A0D3BC7EB680C56BB3018D46094DCFA1C12D89CB54DAB5966E6FF5F6740E33D917D2674314855AC5EF6DFE5576E42294AF7029ACF99C186DC7303B87A48DF1ECB286A40B32094AB11E4AA85442A8D89A01CE6EEA6CB9E77A7194E544C9B5CC93BA95E5A9E90B9C0D8A7AE2D2B67F3114FDAFB1D13D73053E3165EDB5A89BD4F9CB4BDD03ACF7C552D80926F3676A8E40AD78ADF08810CF6F6CA238C01ABE612D488DD0FCB6CAF7964DC5346BE241AD7CDC4F6C66CADBB60070863F398DF1856272716666F08161B3477086FF32D72F72D65809A6C57BBF367100FE6BEA969A86CF154CCCD396E08A6A270E0FF7F5464F0EAA903024EE45519759CB1030D41C4477EF2B0F80012ED17B1063D5C865DEF29E4A43A6BD9FBC81C4F8E2A2ACD9A6A02F7E0FE98EB400E4CF1B489D69E0373F3861B70522677EE78C084DA209E86860D88CDE7742FC242710327B3D623E980A8A47F3FD3447444505D64D5996130869D13CE1EF8163D5B33865748A10624D7DE6A39A7D462C0E43BA08BA335C71BC2E4F56AEE77CFCE70DD08A8F2BBB055AFFF64157B116256F6A495F65CD5EE3E88777F8CBDA7324F4BEC3B3A8047ACE48CBEFB40D8AB11035A54CA7FDEF4735551B215C7C9D82971A1916DE922598108FBC1DE12702A357DEA648224B45CBF3CD6AF3443E87FF1419FB2307AE10FD6539A2EBC65DDB00DF6AE19618546424290D92B1A588CDAE5EF4EEB5FB29B67DF9EAC63401305A03F7E6B61585986577C8AF93848E21566846E2E6D444477F3CF10E4064FD0B86B39BBEDAB0408E7E9382960B7F64901F229A5D23A07F880121066EA570AEE8C3699C38993F8DFC7EC9FCF109287C3256B7EEBFA561A007234C558ECBA6DAAB9881D08B42317CA7DC3597F572EA4FE3F92F64A484E6CFA1A52CFDB9B8F748C60B57FDA2B53F58740570F84C25E738A2198842EED77E637377766F7255643B4F54188CA167A3F66DC61554AA4133E226AA4EAB0CF5901510A0D9F5106C979ED15EE57F8D9D07CAB68C91E6687BD7EC7D7C1ED74FC991B7D8DF4C17BAFD53559DF59ECE98D7C8BF77D291A5F717C44AE8F06CF5BE4908773254B453D1FCB9D7FCD7EBB1E2F3AE68B9AEB066E60F1F9973D061DF0274C9D63B92301325FA7D218FDFB6AD2E23E706F87FF7C6E89719493457FE7F14F9A176D267CED50E21F453A0D9358B9DBDA663891D3AE67F2E3518D7DECE7181407B885CB8420C0687247D8C93AB02EF89EFB665927330E3B4C6415FCFBDD09273251A0C7A6FF28C5FFD3595069468FE2431C34B023CEBFE6D0CEAEE341CF8877C43D6BC3B48F6104589BEBBBA4F977C089CB39D019575EBF7ED3726CF5ED4F532833F4E0E32B2FFDD66E2729EE2AB2C4B8866D7B2B80F811EB78C16D92F67B835D43D68D0182FBD3C996AE55CDEEFDFB1A9EBDAC8CA4A2644305FCEB4AF676A0E9421BD3C7DD21D4DBA0C05B4E2A15545B64389D1ECBA89F29D9E464E7828F1DAECB7D313710FADE046B842171EE3929102CF9EA363087818E8BBD33CBCF6E489F34764AD8975CC0ED0DE3FB49A420894CB22D72BA2C23F7847CECEB17B27E4769F90F07EE9EB81DA7D90CD06A514175343314DD86BEB10BB614104E4F7FE5AB930FEEB4E93458ECF48E546BD51FE62ECE0868683AAA5853258503F6396C89B55D6BE71C9BA8ADCF22BE88AB3638179A12E6298106FBB1529BAE828C05719EC516B3470264FD7767A532A43965BBBC0482462493E4E7418B1F865F1A70C13FBCEACBA4116C98164DB8D789A5A6DB8A22BFB49F881ADFA4B96116F9D7FCBE2A9F28F7CF8720D72576BF5E93B5D51AEF67FBF9C39BA780E297F9396DD49C78A34903C35E3EF0511DC088B4A7823FA2FB8BF5619BDE7D5196E4FB4067A40BB688944C90D0041D6050EFC20D711441D3F34E6DCF7FCAB951655D7768756422F053DAFA35328D7F892F3B0B206F5605EDB44C93DC427D4DCF727E19720ED314088E46BB7D33A354D09FECD371902862644C496CD09E078C3F5CEB7077FAC8B754288816800A28CB29DA14721AAD323C13F69C8C7FF8139C6B10CA243CE2AA9F150403F7246E10552BFDEF216BC7474137DB9E765F6DFDBDE3C3C5E63870CB9817F3B5182C13306587C80407DCC5B3FB73E242DEC77A3857DA8998C16287BE56EC3A6B41B1DCF3FACD2CBE25DE18F07DD1321606DAB494EDBA6B655B52D5EFE81DFE44FAD72E6400B6103A3D4BD857F6F4D006B02902234B67DCF79772EC381FE8BDF938E921680C9AE598D501CF3FE299292BC84C77A9BAFAC6ABB396ED8AE3405F132FD8563FFBBC7356682728FEB17CE5B0F7279F8FAFD0A05011E3DAE16C264A4D2E2DC3D5919E5756157D415993B4FD56C9F5C7267F7EA6F77E4EC7B284AD86C0CD4AB4D2A3211C5A27EE4EF641F105CA71BB23B69AF4CB01684C4DB6E4D6056817DA9B18C2E292F0A49E0A148DD25E6B5F115C7CB0F231B921D1E8018BC59DCCB9D123CEDEA06D4F1A32E5846BB97854ABBDA17C9714881F12D0AD00ACBD230EC24E17F19031620ACAB0ECCFFF217DD1EA28EFC970BFD80A25B9EFF705C81D4647AEAF6C24A0E500A8D57033D54BC3778B4D663F59097E1F408E26F52220A7C1B97B492CDCDCBB7F3CBD918D171831A32429458DFFB07D647D37F0508D4C4B6432591533A48497605DE54F209D284D714FB71941FDD3CD45BCFA4E59FB72B29B9B0693D70CC7B31958F6B031E7DEF7AEE51FE1AF63C49B2FE1EA1090ADECAD17C7EEC4532B57D785340704E612044D54F181B533F2B1882F6F99DDF1D7B1C32CFE6FC59C98013CF387BF75B263D3E9D0246C70D31FA3BA04B99F697730CDC49C3AADFA1775B5F42E4C9A335281C7EFC9CA9F104FF2E2D9D79E07883FCD2E6CDDB7B5C4CD8E37E4A34BB97767FC4F4B1AC12C8B29E81B64D56D8F1DBA77B7F0F609D42B685FA256A836D5032342D1A240B17F980EC414D499C558A3502750874887D40913EBFC96A1209B4ACE1A05B31C065185F54676ED3A46D5AC08D0CE48B7284132D43753CB9B82101A4415E1C7F604688A6DFDB8B9935FAA4C32297CC13C77B20E62D65EECE25E5419D9084650629ECF4E005B3C864F6F45E0C9D1E60F3DF05979EDBC06A5FB3E7D8FDB6BB504087ABCAF0F6B94DEA7D8E20BBEA947A0BC5C61B6242D2DCFA968FF737971893ACB3707FA492C4E689D96C6E9B9AA5FC75B5DD97222D810C27E46FB006E28C0B745C767B661B781137BEEEEC01CB26B55E78ED80110507D830F5BEB3AE14E9D6A874AC138BB4B3E4AA17982A139EEC00D2A6D51B40FB4219684A55A8BCCFCF36DFD264872E42DF767B0E9B7A7245B59F4177A964EC53D3D184D5686CC524D62213BBAF673FFADB9CCA53E29B3BA2FCB604F9539A6869A4A3CD30E11B9180E84CBBB5834D17FC1CFEF15AB7CF6BFEA6EC44B83665B579BF1E2FDCCB31DE4B408B6FC28CB4A56795A6CCE902AE0587A8A6082341BD8D2A3D4EFC065AE10E2DBFC30B636C2E496294FE5DE6C2C957690642806F9CE704E8D2BD399330A740372182A84F43F413733F79344598F3B05CA90D1DC092C4FD38DADCAB5074A1645302EFDABF873E5673DD7A5527353E3A50C219CDD176F4300EF7D8BFE4E54E96FCFB14D94E9740D1F0188E313362E447C8531A4B2A2C28AD380B7C455B4F9A988EE14F2385A48FA3FAE42424D77D49D907CCE130A7C7D9C5B21ACD8CAF93485935501E5E3146E1F351036C04A15642D1754FAD9084650FFB12A7A1B4699347DF327494DF89F2C9629F38A19ADB1F3C3457D0B7AD344844F56217C55F79DE89CE9199B6E588386B0BD50BA89BE80721B3177BEBBE4D6EC0037AA2E7CFDA88AFB82F59BE9CC5CEBCDF169FD0E9D7E2F4FF5432AF518044A144C72770BB36E89A30C2BE20ADA7D2BA6FA2C846FECB2979D1112C98B9ADE836AA712CDDAE92474908F4D896493014F599D64BD4053F433BDE204E3C606F3829808FBCB16411D05D57B673EB2A00EAC795B80D30242ECAB42902BF7DA7FC0FBAC6E51BFBFBB6439287C1C13CF78B39D5DF232C22A32E0025F8EE3F3E8E40996D5539DA972FD54DA3917F3CC892DEFAB7F71DE2A1D416A73B9170EB9662DF85551BC8420390AC163A4FEEF43120C51477374777E042B82DC75F1C3889FC47B216BFDA41CE16368CA2E8244AF40CC6B07AD17E85AC43ABF2064B3656DE6B95A0E288BA960B81D91520BE46BBE975CA3AFB8AAE69D65ACB8956F2EBDDB932D90532A33EC2CA75195F885F98108D1DE0C321F9AEAC359489CAA2BFB3163657049FACD262C329F613368CCAF5228046F3B5533E06228A96C24FF2C98C0B5EC9C2F37EFDDFA1073650B6E80021399B835A608845FEC47D5EA2EB11CA8FAA9F0EC7D0E6006EF82F31055CF626117005D761B8C173C2DEDFDD6F90D45081AF1A957142BFF979C224D86B3AF8D6C9A60DFCB9A12F37638BD9739A355A9CB07FED6BC4217BA27E8986ACD6A5F7D7046C37F82E011559B2AF728817FFCA59AB271AAB1D62DBE34AE5EF2C7A31078516BDE73880C99A515925E4BB83D8F6EC37F1313FF6A6C398AD79A2FB1B55AA41DF0A92E974BB1834FBA1128E936E8177FBAAFAE091D752FF700C0831BCAAB7CA40DDC774380D77A5691DD8FAABDC78485F206E0E4818537D064C0458CDEFC5808D150F335ECA0A473EAD78FB956F595D78FF6BFE0AA9C4D8464B7A13644F94A76A8CEA2C1BFFFC8C0F5F396110FEA9BF9FE7FE8CB81902F542F502414D54DCCAE05691D0FD834D7D9573B37063947D881AD7B3727CC3B425978D025090F9F63B62A7E6A35B90DC6BDFA7E8609128C6EAE37112AFD2F474C70E1E2B6F459EB8DA4D3D4DBDCB80BC14A37583F638B0CCE0AF7112DA64135FD8DEF0D20D132C5BD4E69E50FC771CA89D2FB0A8A1D20E73F973DF798787C394E1CAE39160E24EDF82D2C190E7556275FB8F96C5562C4DFE862F841B7848342DB19BC38FD4CA1447C28E7575BCBB9C255C8DE5B9A567100929EAE9E8DF3957BD7F4DAFF4596C4AA4A3654B7D866DD0ED93AE3D9A7D32A8B6DCB020ADBFCE0E2EA0032531044E3E4C45697EC7E22ABD6CA88CA7BCD1F18779D4FEC00F7A29B9A40B9968746181D29D109AB29808CDD9651A7CB8A5A221BFB420D92F6928B420198CFBDB4D603DD2FBE286AD1802491F47F5E9C4E47E5F29204D5C5DBDD931D2EEBBA3DD43B52FA1088A8C9C06C5C5EF7B8D025C644361A3C12F2E77D6FFC20683FFF58DCF33EF1C3E9B89173CCCAFD10E3DAD070C355EFD5A6D89CCD06424B883A3B1BBCCBEB0019DA354B55CD1AC3158F15F2A7778B6DF36C6E77FFD6A0251528E96CED87780493E4A2E65249493B85B766ABD71179806BC11CD91D5296877FBEF5F691C4A2668D1EDC86CEF2A3E0C1D8694A17D3E86595783619B5A9B330C8C6D38A019AC3982771886F50693C070F818165BA17FC71BB2FAC6759372327595E8E32DC576CF5A372E9661054FC0DB0F2173C7ECD69F07EBF6BEC226F96C01055FAEB13795E2AF25FE4B5E6EBC04067CA2373481ACCC416C5998A8778E2DACC03D60DD9F1CCAF4B998424E8CB2796E2525F728E34C0504A355D3B0F32C322FA8D8F4ED3D1D7B181B8B40D864E1E2983BA438F0744194053387A5975686E7BCB42C5AD4EF65D864DC2F6E101A545394973AD3C4DB12AC42153953675935C8877EB3BCC02A239D36643CE08C70E2540171E4326BCFE4856B0217510175C127CA9A6B8226C8656D343AC7756D7D753C8BBF5616E2F8A04E5F44CB9E300EE069148099FCB69292B8DC8A25421265899ABEF5152378213A2ED966FB221FC1DB096F8E5373D7EC91BB0883C1B607EB8D2C9AF2E97D35392770E726CE9777AB378DD3CB8EA8183302219D4811703586C12B58F96120593E88BB6C46287B856549B99E13BFE2F0362BAB30960A5EC4E0CFC2BFE128CC0FA1110C8082A03419250B72A87DE024FFBDC51A07AD987D20EA9AA099B410AF46688164E9B25BBB96F782452BF3AB28B7D2E4419AAE2552905C469FC341AFC7B076971369BCFA1D173D4D5967350EC51D3F6494B24B04B36AD32B1E73EDEDE40ECB30A6F7FA80F5B3F9A1F8EA8EC5A0219E89005A76F68697994DFE87882F7D4388C149B78CAE9C9604C8DF021C7DB5D1FC1F654D613FD3EDC269AE3100FFA4AC521122B0806645C9CA4B8751625CB6EDC1314C5B656119FCB6B8C4702AAEEE56C194F46EB6182C9FF1DCADD0E774F50EBD40F8DD4EE65846E0D4F4397499B5A629DAA0D9A90B3E234D95810CAF4E6CB3A1A139930C7CEAE123E057ABBDA284432C318825DA73863DEF0C92F12A63F24DA7C34A76FF9035C0A24F7E9F9D3217972DB30D5BCE32ACA1CBF263B19FB68ACF11B3D55C3E1164525FB8D669311F518ACD47DABD5BA2EE3122F1A912E6D3B09DE3C26C9C462BC2EBEB4E3FE53CD2C0290D9FDBAF6B3AE5BB9090C3A34430C44731008E115B2308E04DA8C7038C85A1A242C8618D4EE381BD5BEDC50C69C0E0507BD7E78730A7014F189EA8DB39C3C0B44DDFBFD2087130D3992A482FEC15D7E958BD1C8B5BC241DEFF51CB2786B482232CC57DB520492DC7AD25C3207374335C0FBED7938B97D3B49FBB1691B7184FA7A259AAEA4037B5A1EC6DDF5EB55BEF8A61A45D4B76215E79DCE23804A1C3E7FEAA2441FAA1B6F63EF6AB41C05D0BC34DA700AD9A849D68E90664E5AFC712452A16220AA25DB10ED7E1C6AC9E33A8880B474DDF988CDE2CFF6DA4DD832D5573D94B364DE55819DACE63B13517E8A2443B16BC7A055BFF9C60912F8D975896EB02C95A3D7496D317397C696BC404B0BBCDA71B256620E13C6FEF3EB8AC7B2AC202CD7B9D0595805265BC691B75E0FF5B6A638939F9DFCC0D0B0097DBD1E177CBC8FD0F7A9A8808D6535713FD551A1927843A80B7E321D0ED9ABEFE856B80F5A98BD4D90CF18046E5C505089CFF9DC4EADA0F53798969C45437C1BB2E8D9D6C31B5C81BD5A4F6C049BDFA1094923C4E80B6E363A190B1643BA032D7EA538ECE16978A1F46DAB184FAE68801DC4781A25FB52B952057E7768C3644EE5DE66BDC62FE1AA9BA47311CC8CADA58EB67F6212AAED8069D1338EBED35EBFF1AD58B8317D1B3D4491FDE18489B7F99A8334E20FA448BE8D65A7A7B97E21F1D1FD613FC2CC6AA60042C260ADB75C4F85A1122FB0758000FE9584B09D466D9E33DEB2A0E67AD47C62DD648BAC8B52C11E5EF36CC098DC14E70FBC9DE3ED8C4D5133B72186C0AC799D8D3907C8162601D408FCF7A8C08748249A1455DB15396E81A309F2E8DE06EFF5DA5C8929B735EBA8E22C09CF28D7A43A426669642D70AEA4614D93941BE084A5777544D459F3FAFFA7ABD53DB7951664156E2123A10455FB67BA3D0E4A290DDB7EA3B100278E15797EE4E2D547FBDB647EE1764891E7827CBA3B5C369C88586D77D0C150B0088D5AF6BDFFECD634D5E550FF19E3FABB8B2DE49FF1085C7B2B2421434A8A5B5E22C7B7BF75DFEDB00E465206AD2AB8FA240B8B0F126C6100B3F6F071DEC27220E566164F26E5A3537FE9E4F3105804B63E6E839F0417EFA3A6ED98146B3620C5EF7B61E7FBBF49A943574C071D1A5A319C41E768643482E2E5FCD15F4D8ECEA13A2FAF690E65EFD5AA155EE60B53DA5E9AEF629BC160A4E80C9F91D05EFA0F2056C33F83BF771EEE089A6FC3FB8FF70EF96BC229914BE58F48B21E8059835EE00BA8FFFBBA6CDCE98A087BF49C8A8B51ABEF09852DC1638752F9D223D5D77EF15DD241D4D090A9B474C686270F17613CB428D3D8414089850CD51DB777FDAE12014DDE4D2C5017459CC45F93B707FD8D7C4AFA231D0ECE43CBB5E54D92F536ACED34D4D550FFCBB670C11DA57C2B9ABD583E1E97B179B5139681B043E11B561FC4FD7A6506C5AFBA5F7B7B987902DA0120BD689DCA708DD445B186EAC1535A58938031FC5992EB8F09A1263722E1DE48A3D10F253B4925F6636B2F1F55C41ADD8740FE9E8FF1BBC0C9B5A4EF3FF456AC3CE1F5A37794143875FC847994931A02C8EDAF059864269195763430C9E2BFA7C38E6F26D7C590A16D967ADCF3B189517681B268D71D95C3ECACD17A45FB7B19CDE98B5B26EF679EA9742A78DF9604A57E064FA72664031C0BAFFB7F3EA67F41F4AEEBD03B8F84DA320800312255C922E1D2620E47D3EFB03AC85AF31A70FB962B9D2D5D0CF2215748C80A22AECBBB26A05191D04926DFFE2A92AEB1341D6F6252E55B82ED1C2A48E320455311942363D5FE4FADDC16CDCEDEED2422ED11D641DFBA5FFE417C964D383CB7B7F0BA8555F2A7ACF22D6815AFC0EFD8F9E1E88FA9A437065F124CAB3039F648E1AD956B3544665FE778B2AA011298FCCC8326CA875CCDBA92AF7A4A3B34F3CDB96C871C1CF9EE25C7DFC6B0399E4DF39B3EB9D79F26E105C27278FC0EEC06F6AE1C01004E89C6DC0BECC5189F156578C9C2F9B63AC54F6953BC95B4F3243413B2065F6369952D7D4A5779A5A41F7C482CBF3744BC76A1F15AAF3239196E340640850B3C29BBE850B6384007F02CFEE08126728F5E3FC20AB70C9C99107E9239177386E631E22B228DC62B238189A84B2E975926C0879F4E5BF7B0DA859FBC8A9BE5FDC3B95577C86B2C54150E7A496F0B301A0060716C6B4B34B7C18DA46F00A55C587E8E97577DE672D92F2316A1837C2632F68D6D0DAFFA663DEDEDBD0B5F214061B43FC711C42AED4A38897023128630E7100C585A73BB2EC28502FBEE5358D12A8038F009EF116F2EEA101DABB5A92E01E9095036E93B4AAE2150388267023357F2AF3FF4F4927AD3784E4C9781EA064AA1734B2C63BA8F4469F62E944BE77FADE904E7DCE400BC9C9568B19804ED301882B3B26F5DC0E56FB7BBC2896AAD53DE5FB50EFB188C87B3EDBFF37007C28518D4625715A100D4939B4F99528FE188610362B627AE47CC43848DBA183C73E4DE16BFFCA76B1612EA22D7D00B9B7750EF1721A31422148A9CD3140CC3D5A37763A551523AA7AE6F9C56A2A927FDBDDC61D74BEC4AD27C5EE278FAD2EBB449D2E0853E727346F004D4D625D8C85CE278A29718D6CC2BBD22487A88C331BA03F107EB1706630DA893E52CB44A9017C71EFA24231CBD7F4510BB5E43DCF8C4ABE84BCAE97EAD960022CA984682877E7253829C8832A937AF20AB3A60B257C56F8378B06CDCFBEC4EB8D97A78A0A95AC69E40DCE4C94D4120D8B2325E06CBD694D3BAE2D3C617846D3FA5E055E2E7999D39A2A7A65B946E3DC97A45C4D952A61AE7B6F9EEC0DBB3570B6F6B2907A5C417BCE2E26DC601C42DE69120EB7D9B1E4317D925C8F3C72B3A2B26FBF04419240E8124EB81752F20E83BA3B1922BCE364CEB92CF2AAB67CBE8189ECD3E2A076EE4C37F4A45C12DE5C8778FDB7B92A19A30E1DBE0DC5ADBB6390120F911C39981F6C9514242D35723D738C69441696D3B52916A5D61151CA43ECCD5CEB08FAEBDD2EA811A835A8260108AACA48415C74B51670E3CF284995AA48457F8B57F02118D131F432D6728DA93F0776E73DFF266A67FD2863AACF9648948354CE1BCC9BC80DF16593A6873958FAD97A65BA3C4E59F8675A0504D4EBC60AD8FFC5E016D355A5F258F2B2C4587C8F18BB6BFE140609FC7D2923047133968F9882A01CDB6DB84EDBDF8E8CE3824DAE88647919AA833DD703F35FFFF57305E44BD46F63413F57FF26F8981E5E5336012AF7FC141077C39E2D1AE40049FA2125AE1A8C6B9BD5A6F27D113C2FB5809F91F15B7060F8CE944B71E31B2E16F17C982EBD1399E22E172DCACE4755F9FBE7A8C36174D9D250FB753FAEC57F758FFC144132EE7A75F012BF4CAFC2BCEE0060AEA5A65C65BAC655E79507B91E1A3A05D9DF436F1869D42F6E65B05EBEA38FDCBCC95C06F5C9A717AE191419CAD621FD1329CD70173A1C1A61AF8C9AE0BDBC47B30887E2BD9C26B17FFF57876884D49336E92FEB4058DAC03DAAB1BEC2921C58A739986036515C60E4A5D083F966931B131E54248B38453C8C0DB37D5EEACB3AE4556C9317579FF3659D4B6A9B195B928E0D95822E3CC582A13684C15A3ABAD91126EE549F2170E140E031E87D7EF2C39EAC15C44794E00F6F0EDFCDDF5A8DD3F0CAE9BFB38E0A4B499C93DE5FE7C756588A89DFFC9DF4B460C4B217809F89686BB3A243BB4593F366BFC5587DCDBC7AEFC6D55A06FEEDF4DB81B90805D4B132F5E0D1121C8FB558B07E0CCCC99AE869143102A7A7C0759E46EF67923611EDB3E7A925E8711E1D3E4242F80EF543A4141322320BD6A14F30942BB793A48F9BAFD44E6C6DC9A5B1CD58F72E72B83AC8A4ECB34B6622BEE13FDCA14401E1875FC6D7BF2A33AB883A580607FF75827B5D8973109B08451D991239C1E608936526108DABFEA89779070345BD5EFB947C5D85088B05879C5F3FD4CBBEF8F3E86353F31B8F9F00BA1B415FC56CB8D1718FA21025585989FC8B3D6762C8EA7E11AC998042A2F0C4368E6E9AEF6B99301525583361BD7CC534AA337F315517F6ABB1F8EA775E673FC3122287008D3DD7573EEDD1E39DF3075B754835EF315FF73CA8432D5E864E8C10BFCF4E370185114655685A1A3368AC2D73A6172AFA4CC17255301249657601CB92F8B3AE9B4ED89DDE1A0D368B32D2AE2B12F6E835A2FF063A46D7E2D112555F671B63CDECF8CACC3159F1E33E2ACDF66BE0305C2CC3AC7A9FFF699849716607507FDC9E520C8882E0D5E1D6D28C77D24274C8604CCAED93CC58824298A3654483346C49C88069CC85C7ECDE38CF43A4860D043C5A5C77CB09F38B4726E76961A334E323CED392BC3748B2AB7F6E78CB6D50DAC782124E2F12DD879E2E140A01F4885CFEE571A094A61EF075CCFE12BABF9F742A8BD0F1E3A6F53DFFF7A7F2311880B6FA74C4EA7297886417D19E987C21BB4C526BE40EF8682B8D904863FBFF4DB6A1CBF02780EE293AAA0D587104E6542CC988915723ACFFFF68A0B7C4AF23129F88732C988F8D87F37BF30A01A4088D6D9F708455DE4794A87452C87331B64D33FF231112FA04FBBA14741EAC14AF3FD85D9E14ED1745550BC1D5FD093637246432E7A503CF8D19CFB2E650A49E9F428D3604D5F261C0E9188ACA542A4E36F4EBF23954DA77A1790E5A603575D0F8F06B7E4934A699E9EA4BA3EA111BF276D60CFFB6729A72A4EE61DC58D09D4B319C4D6C0D42A128802387EC38D1293B0C067EBF42278AD051F44BE4A05141CAB7939AD6D0251F3B09908F93FB95B0690C3E256CF54A0CA791D11A8DD5B8ECB8A12A4795F4AD3FE75D63D5753AFA5AEA90E9C1278B26E7EAEA7A3A945AA87CAD9EAD4AEAA4F5DE76F5DA6FC34F1E9521EE24DCB81951551C475C49B82903BD803F0B278A228BECA8F5F8E7DEDB39FC5F263E302F4FFA48A9F9930C5911132DAF932FC3BFA9771984BADFAE36B684717A51FE7CB553C29F77BA1FC63E65DD1F46C5AB9E0EA3F5168C70CC42400269847C149429E640231162E8A892A234A774B3791C57F60B9F03049C4E8DFD7F748497D37E0F01CBA0E83C90B4ADF602A68CC5AD46DA11D70B2FFA3FB2BB2C0B6425FC084713C175E007FBE7AC76BAD253E29435C7FB33FACE00428A47A171954D23D88571F49B54A64CB27B64E040B77FA829BEC3062AAA697727D8783748E5536BD2C9AE0DAC2E9A6D46FAFF401C6E68F42708AB2167D9BB66A9DB3C3149E418F0E52831C244675F772DF2FEE9D7DA8E0AE9137305929C08E43FE74EE10AF4976FD6FE0D800107A9F1A5B38976C94841092B5F7D0DFB8EB27F95DFE4DCE898ACD16FA80FBFE0013FE5164BBDF508018E1529E600BC9686B5BA21883C549C4C7DC184AB7726A534A4EDD6479D88F693D10B6973656F7FA008AD28AF74E12CEE3892DEB08BDF698B8AB2372FFAEFFB1F7DCB64422DAA7E99FA3C7EE6AA848CEAEEBB2B4C4CE36D8D6A87126865862EE683D41C73D5E33F00C97436563DD7FFAD65582F5A8EE5D73073CC82DBCB36B543604E1F99E98FFD8E3A09BF945022D07E7D013950216DD34F120F8BD84D49E6C53FA0164CB064B630C2FF75463B44620EE00642F9415E588FE8B14ABB669F7E97FB5F495A96E5BBACF1EB9C2C349F1AE2CB6AF15A80939FD11CB2BBD195BE351461C9B6FBEA1F81E5FDD6BFD4B45CD5F8FAFFE95EEBBB5C0F7F42E89EB2C9E68075C180A19C65FB3CA6F4AE60E195B38EF3FE01AE8DFC934AD40A1D7DB55CC6D30AEB6D6C600EC9879146930F3A5289FF2EA7D64192731A057A8F68EB80E6C35DEEBF28B47D13BF8C9811F65AD876218FB0D8BFB14A62A9DD403A37D95722646207938A367018DB98CC64C31A8DAB0B9CFE682B044D8988E661C3481451185DC07D88218EF604E6A0F2E71625A14360FB82673B7FE135DC196626EC8D3DA04C39705DCED8446D391AABE6DF9318C172AB9C5B5F4B0BDDE0D4A1A4E496C8D3162CE8AE4B4B04DB766AAD827588F989CE29E2DBC9555E55E5F758913397619A21A5BE71532D5EAB92AB3609006E6BB35E710F4941EB8A3F26B26D7BE661D56A1C2C4B500349617DB57D8538B913BEE02EA209E0FF9E826D6871F8E99F2288E0ABF4DDAFD85E199DDA39AC1B7956DFFE415482E5CAB6F33BEC21440409B9E301342915C9D7270C5807D1F0290275CE5259FDF0D5F0B5362C79AB16CA23B2E31FDDD0CF3767755884DCFB172D500A1A3C7C4E007CF6C4C4A25A1AF3A56943D04EF5962890992BE61B5A878ADC7D1C8DF5814BE19030FC89A07BAA552960218C6C23E874B68EFDA8227F5721E1113F718BFB16F2DAA00DC43B8830F9FBF602A4088D6DDF819F60A024EC6E8D3C1B4BCDED0D6576CDB6A8B8B39DA73DAEA54379BD5C5159F18ECBFE8D007B991842E4730E4ED9D03784980033B11CC924E6FD06D628AF0A02391B5C322BF5F3A671B0FCD689FC753602C8DB47AE32C4BBA08B3941C55EBFC5E9673B34E06E5F0537A20DC24167CB5FDF6C03C484C3312A021FC047E087F7B975EEAB6FDCBB970B46B1CB1816FEC5B4457B0D3107823E226A8D36C2D9D8DFBAB263971C000D54A94FE5AE1B0BD7B49AA6BF64FEB358EEBF88255254FE35D2902E3CC210CEA25F512857A870AFDDBD7022EB7EFC789E72087AEE02AB433D6ECB874B5DF3E4394B972B4E1760FEF2807FF37FF3C985750E6CAFA789EFFCA017C361F8C31226246965EE78F78FA79F76FBB0B3531954B654FFF6E0BF3895116F7B2489203642AE128341A96B32633DD44855C5882A7F0F4CD3A72F218FBCF809216B860874E426BBA8A1C48FDCACBB514655FBEA020DB0DA95C2FB0E23E855C377C5A22431990F04B5DC24710A02E4CEA85A8BE37F679C327EA026101D7AD32C988C9BDE0B271B04CE1C472CE97A0DB9B1F384D50A5C2D2F25EDB742116DA91090229B50BF8AFE108D5EA7463EE946C9A156CB52C62A563D65C78E6AA847E4A21A6A7EFF13E0BE4432F27E9B6583F4F9B3457298600ADE6084CA4F54B743675412F5E9516954B3782C7B73D009A221CAB589F2B2D07E1BBD5B187987B3CF7FB4AC97FD8D411C848732D609A9ACCD975F89994E5B6B09EEA351BA6C3BB4CB8999CF3EDB0C150753D6393612806017995A6056FEA1B094EF4154EAEEEF7C30FF6D513E2B9CECD885BB77F3E677271C9DB1D83E0E9B4DE2A0390BC72E5A777CF0656454D1E836045B74275886098B223E643B83E22A2D427BA516AC9E2FDF26303779A2A2E5F1C5E82D4FAF1B7154CC28A9E4CD07BD6E0D71AB03DF8476B2A18D554E119003D19A141B79713C70CB26CEBA63C7D2B040D9E580437AFB00031F070D18498E93B3E55AE8D18FE646CC23DC4178E20DA3689FBBD38FF7DF0D2BA7A2B47C544E1C1252C90965E7FEF83585D3B9A3C5C0C11F54A26B0BDB394741E081F547C201FC7E75A3CCCC8DA75A2F1CD2D1E3A15011A48946B434F8B788A226877F3591734AA863B3EE5BFEB7419D64033D07826D9938F6A2740CAA2251BFAB6858D90A1D9B7090521AD4ACC054157F26E059492603C7839474232BC20F782BFCE2A594350AB9FA64C684E5FAD56745389F25D8EEA3D5167866704E207317BD2BFED5AED4C57F4BAEBA4826E0E2E4891BBF9C3309ACB8DB2A4AD78C797537CB7A1D6299F9A5279ED2E90D2153802989CFB1CF51D88ED3FEC2065811EB60A5C1262BAADB21F6F6B059A73A87E3136B6BEE31361B11EE84FD6835EEF00485909038A4758F1CAD5423D0DA6E591D0901F0FCAD929898608E36B0F718209CA827B06E1127458A29B63F676FCD9EDB4EC100F007819F711EA31BE471586BFB6F218AC41096FBFBD9CB73F54B4A9D692559ED2D3EA00623468347F8CDC68A718DE19CB397D16050061C68B33CDBEB9236F7FD8F81A4905A3B7FCC86A0F2D57EE5B135CF0F1E57BC61E39461BA426EA1CD40F9FCA1C95DF872A5DB5D56D61C903E94361491F8A3F88737C0654004BECE82063DCF6E8E7A284BF512C6A4DED7B18F5206ED13D5C2ADD4DC0EDEDC1A111D28A9CC748FBDE422199C706F1F816431456EDCF4CAB46344C676CB7D124132206CEF2472A10D8A00CC24AD117D1444A23E227AB0438783E9C7AECF2E5E14B2A6B7B2990163725E8562170A47B1C3FD4F0F0F37CA60EE7EF8E95836839058CB855F9F807A35E36DA3DD5F2AE6BB2BE73AB2952CAF0CB0CCFCE26A33CF9BAF4310D5770378C226C1FCD8D599E85ACB12EE91B06FFE9BF2835D18A523AB142D76EB23C9557662E8789F8152A7DDF3A48966AF0C637456ADA09EA0817A7A8628D85484B38C02C4EE1FE4DFD88C6FDFC03C00FC5AF13A7BB9FC7D206B46F540C2FE97A255D3F8E33396AA4531E6CF0C76F814008DD7A9C0C404E3FCFB5E5908E99DD1A0FCE3FED1C8802D37AD3403E542397D0FA0047A69B79B743A53A6E1F809B292FCE33EFF3F4863E165C16C981C7692FC3316202B5C099E36D544D8BE257A0EF92F63F57779FAD0C68AEEBA4C406E22FC91A21978EB583AFFDFBB6CA3DCAE1AF169CA1EFB1C76DDBEAA1E253FD300FF5D9D858D1F10053CBAC2F15E437849DF0A9AD49055AD3E93BDA79954FEA3F2ECC04754C6B900B8C2346D12BB594D4A33CFBF109BBC6F8AA75B6499B4AD9E6E7D7799095A74D28095356CF64FB494B15744FA31B3515621AF8850C6A8382198BC4742CA10177537A00C871CA2F5CFDC75C7E7081C090E03585015CB54025197F5A722DC4CE559B4BBB331FF4F2D84E00D820B548AD155C4AB316CD93A6AC57E3425DE76AC181AB96F74C885BFAA24410E3FF50037946B4BD6CEB29039FE82C5D1366ACD02F05F6101DD8217199C28A1C0B5C23460E0B776F5522C8213629653D514B6BA43CD19DEB39081D417121932E8A5D48B0CD0A07A7C4C2B258DF513736F657A9A3EE52D7CFD29A4B0E142A6D9D589FBC41800223D7116916B2DA980C5705F57B22DB9336A9E7FD89CDB658E44395CFEE227E580FDCF76F6D026126C94E2A974343661131ED3265D859A0AA60C7AA91AF1F66218F0D35E4C2AEDBBF687555C38D79F3E3A4095D6EA8A71021B97FC5EECA7815026157045BD86C0FF54B9939C93835A9EF05BEEB5CC6B9DEBC525FA87AB1F33127E3A38105168509B59B48259B25143019FA36E5ED3C5CF208E075769C3D9780A865A400FFCB6B05E889F0DFC658A8826D0D4C6C53A68FD37E31BBB59369F8BB4D6EA8E601D2056F976C5143E53914B278A5B6E6F5E73149C2BA76ECB97C1D814A7B8E730ED09882A93FED8C23D56996F7F08459ECD38EEF3C49FF9F0ED99913BA092D7770B520698100C4187EFD31F03E6F477403D1272655CD7F2464FA37AEA76859D40A3DEEF01D238251B456F83EF433A2379D03B1309FA202B7AE8BF992F864A03D839CB59C201AD9A981D19012CDE9C1033DA9ED0D905D0BBEC2D3A0A0A72BC56ADF433A97745E0BCA9E6E15C4EA88140D52F3F116C66FFA559B39775FDB650C6FDE79723D64B3EC25E9D6B45604513F689042690F9C945900964DF76704CE5E938504818B8B1D04BB3BF09618CD9225888C84669CD3CF8B9D0B5B1E2BF93D0FF4EA285FF327956E9216B6ED7C04DFF8722D5BEF0EB7B8465A6BA7EDBDAEF4E0CC8FC5EA529B1F5DCCEE558710043B1E262FCB672EB5384926E2409C4DA25AE820131EAB8864D95027BD50D34BED438CED0A41CD5AD22CCC2D90432C4519B60A425AE800EF10A1C283545629BDB0E9E2A72FD0359970297E4D50144E23AE82889EF4203D4C012E39109638ED5C238012102ABBA4AB3921B71E802696C4FE6599633CE8DAEB1FF6D0E0F97E6302A10D456E75BA3AE75D29601B3CADA6B7BCB23DBEEAFB814757EA56BB2A0560970754290B8B565640898B366BE18B45466AA1FEAE984FBE0E62865AC36EDD8253A7CF4A3BBA1510DE9964B48B1421A3F8BB9FBFFF2BB197A3CA08DAD12E8446D1D07558890C6114EFC5AE4C0DF707F557E20A519DC376124AAFFF15B38A91733F561FF7EA0D9D5895E373ABF3744B2BBA586E84849411E4723DE0F780A2F027C6729B532CC438556947469B2F8C2EA8B542953D83703A05C953B4621CB2931BA655864661D04F60B6728C7B790D939A62FDDDC68C5E728B77052CA4A7964E892C4D4DB824A5D66271FE1884FB666BC29C77B3CB4C574700BC87D3E51C78CFAA3F8DA7B5978EE99367D84B7137CE3BCC6F6D8B64EDECAC0A02D2FB1F654CE19AA73532D095CF74ADD27050429F1BB4AFF7010C93F6A37C16AAECBACAA9B48DB8757FF8BC9F64C0D759F4492E6AD3A1FA7CE4F449395133D3BD4D5A78917EA8D11B2F3864672E35CA4827CD532590178A1667C60C9A633B60D51AE8AE80C20C314C40BB5A89ABD8FF6AA7EC7B17D1DA2573BE7375EA85613BDCCDF97AD9E057B7C6B64A388E278A1867C8CC909AACEF45B7723FE45A3197B8417AA1C704169AC3DFB2F189CDE0249DF65002FD48453AEFC64421565D9CCAAE174948E02BC2455C4FC562F366EDA82475F84A7C3F26DFF94892E4D5D60DDD3FA83F8AB7536CA1E5EF899E0D362F6A68CE1496FDBFC3F871B52141D700C8E003C06C94CE57277D4181CCEF8945320035D318CB6F2132DB7288F8DDA2149DC93F9D96A81658C7AB7D97B97B0E4E01CC89A80D9543AECB08E1D053E700E75B527AADC818870D8DF1089BF2EEB10DAC41AE382E779EA3526A0784A0974EA5A277ACFF3C357BBEAFC330308C4F8E2D4FA9E15799301B083536DEF5B3E8D12CABBE9A7A83B903EED61614FDA665F079C4BF0F6E74CF7D84849758E3EE671AB8D3342E7ED0E891C9AF41B67CAC5CBC69AFFC5FA2476558CA84E8475B2EE27785B9960FF976B22FA50CFED37C0FBE1EB32CF74D2809A823BCA1C01C825728909AA1E4C9F61842E430D62721A0C33352AB7F73F22E4CAC9665F46EB7722AD3C4A537808205A413F9759B2AD36DD9CB5F57DBFA0F871C3E26240245102B6CD92BB9555D0237648E6CF8D4CD2B4C1BA5271CF6EAABB9FC529AB8CF24E2C6A8A7B0E24E17DDE26F034112C498D8192D901DE51538477712229DD8F96AB32D09075E4832B787584143A6FBE039D77693B72DB314AC20460B495544B113F592624D7EEE764496C92282E11F3486AA978ACBEABFA73042F84E6163F2760B5E1D50524CE2C90A47D551207E11CA42A9444593ADC509D8A99EDA1EB18738C949454C27899A32A79B9F8CC89F161504CB8564FAE17D4D869F6AB4B4326F59781A4FCB10C556175B174AB947410908C8A4A54D20D3FC82BDB711762A6E0162F505E8DB621DF1A25C99C5FBC0885C47D7538635E956BF7B382784C839691E4584E9CA99B1EC6750249BDE640C79B52217E22C800CC6ED32ABD06C1DECCA5FF72DF09111AA0AEB63F6DAA8A1E1F5A65759FF87A25712ECBC708D4EC779452E588BC7237AD6DCCC5C3F06A0EB9BA9ECE276AEF6B66E9E6EE6DEA42CE401E23BC0F9175D25497F8F4B1B072723171F3B2B171B0FC4C7D3987B2A7C7E2FDB8D87859BEB9F15A776F4EB6CFB6E4C33CD6CDD461237E710975790FF7AB8CEC0CE4B24E1E96D66EB61EBEB24E56CEE47CFEE4F2966CCA46FC3351DDD67A5E2CFCD7C67CE4DAEEAE9C36ACAA9EA2121EEA662A7A2E0A5AF4ACDED68EEA5A965E1272D2B62E72CABAF41A3CDC9AEC2EAA1612CEEE7E662AEC8E5C5EEC8AF65ADE922A4EE68A62960EDAD6EA96A2DE165EE6F42E9EDC3C3CBAE6F43C4EE6A29A3E5E2E6CB65A3E0AF20EA2D67E7EACB66CDEF6EA3E0EE2DEEEE6BAD22AAE9E0AA6D2EE367E925ADABE365A666A125EA62EEA1A7A7A5A362C3C72BA9E5E5A123CBCAE369CE6AE4E4ED256AC166EB2E2DCD2DA9C12D28A1A8ADA167AF666DE3ECA6E6636A65E5ED296AECC0E1CEE5E9A0E2A2CEA1A2AF6BA122C9A1E1EAEAC7ABC76A2CCD296BA1AAC969276665ACEB6BC129C2ACAE6961E663EEA166A7AB2661E767AE6AE4A6C3CAED2EC4E6A622C4ADC0A7A9EDC964AB68ADE66E61CDAAA1262CEB666AE8AE69EF6AA7EAC2CCC1CBA96CE36669ABABACEA69E7E2E1EA2B69CF2D69E920E1ADE5ED25AF6921C6EF2A24A3E320A3A6C5C166AAE2A8EAA8282E48181ED26049FF66E0A4D66866017934E4734F2485A512623DB3E7AE2360BE55F5436DD547A70C0F0765198BB20275FECB15447DA5144E4898009D2922854BE310B13A5FBBDF67E320DEC8F4E3C5BCAE53AFD17D5BDBE497AB7975250D7198769D26EAECB65266C3738819BA1EC02517D31F109B4CA256294ACE5A6A4FFA31DE0DA1DFAF54449D5FD327D0017C51E9D5D0350853A2E12E1DCF6D621F2B5FA35AB434A93F8E25E9D548ABB0C54F1975922AB7529C4673CD01D311634AF6CB983E70C7F255DCA1CA3D2809884C96C7CBABC7D458C76EE4E94FA47C1FE6C6325362C2AB3C1D217D2768373D860A4DF51B31BB85C2982EA23969989B0A20C8A97A085272D3E358D003446723D43DC4566768639779493A5BCF6EFEE2F1421CAF3A0B74D7F9F8BC421B4B4EBBA5165450A030BD9E8320C6010C8B008841859AAEB7E6F8B7B488937820ED4DD70A2C7AD077C450B85013020CE1927468C2866316B173D87303D9D94C50834D09DF1D75BCB378525DDC6C96C8042F547F1130BAF1AF6C544C1E085218E19D9A3F26CA1B59CA90F09C8A46538549486DB19DFBD9B8081CFF63B3D58BF8CAB9A52AE8AB894AE2382392298EAF0C42BA423C24E58681324741C7BCB2CB3E14B4C3D299E94238512EF57DAE67C6DE140280563B7ED9CB18EC17765AED14641DB63D33700F7A1B95FF2174AB3F1FCB011749BEC6DADED69205309E6915656334B644F56583141F63D58B5820CA702C9220B782B26E19C0474E2331990FFB72182919389AFF17EA75C404286E1D08BD547CFA8C24FB2464B3B42929B3A13222E4861D961D1587F3BE12982BB2E3051BA00CCCDB4258C04FA935C95B36C3A9E12FD50C59ED9F2A7F3F02D76BFE6B60A99A1C91B582F33C100BE7E7E4F557617F9F36D7274AE15E3B64CB95D9D2A6D280E737418A8394DDC76B013D8F764D50A32090E24AB85D6913A8ACFD029818599CED6696F7732DA774E2746EE2C3F982D419F77E9F6C332B79075EA025AC1300D734F75A4A82531FACD337CE75EDB299FA807A3AC37092307B2B678670453FE2A93C55AF63BAFBFFCB55FE33D89FEE3690B78DE675BE223971EBA61ACFF54F9E7724D46AABED7B56DCC98A883C9111F7CA5DC09A6DF68D0782D826FDCA068AD331162D986C01A8D31E4A8E7191F59D2C475A422C3E1F7B7EF1E713342F8B3F230B7E5242C4731F3E67F6580AC47514B2D8F354588E923B84FB01E50FAC5FECE0C735F43B908081A4A049DBEF13BA3A26C0FAA9D418188B28B5E1A50A6BDCB9BFA3CCD0DD87A33EC8453354F21D491457BBAE1A79FFD95E2AC7210D28AE50FA7692A6DC837959635ED65CE9C2403630C5EC9B1E901EA8D37C89E054C7B15787829A452CB9A91229C2527D0994A7D9E05F3308A783BDDD8C91ACB2876DFC623212CBF117F553E817DA7311339BF46A047C0B52EBCDDDD2011FD531021601632C522C988A77892D3D3DF8DF34161FCCD28DC0CB296F7BFA13704888FB4D9866FD5ACDB7042A06959DDADEE9A6DFB9DC3676E3FB4AB59DFA441CE0BFC21C826FCA910CE2F93CDAD81F66A138126072BB89C6E4E988E2E0866C9DC480508F14FC7FBAD855EE521F5906804B6E95ED94C35E0C028AF07FB3D0A882B947201423FC9F633C40A883A0677075706C1059344BF6AD965CDB885B733BD7E6F47FB01601C38F4F289BE4CEFF33E813D30229E7D10125AEB3F0C216640E2667AFDE316F05787F02153F56688EA1F863D74C86F8CA4EA05379377AF35D3FD51A8DD9F1A02800F4EB95049E7FF9FE80D5A2B7A70B384A908FEEF7BB6347A431B4334BCCC613AC0952116A3B7DC6C84006C4B94CEC4996A31E973BFAE832701AFE40324BB51ED14E02A7DD5535B98E3B6352142DDD5454EA87D5D10E39D2D3C60AF383F6A8CFC5A0E5112131F61E3683A61A3208F6218389CE0F7DF4EF00A438BEF4483033283CCB11A3C57CDAE9FB28F31F53D7D0E11642FA49B4DD621DE783B8D06A4094D2834C2E965A7ED67B0FB4B674F4FD208A4C109816486FFE57C8339F5F72E8456C27D5F73D309E9F351D6A40632BD83B5E1558FD23B94D285540AE9FAB54981379589146FE2E56060B405068B377BD58F3010230B0572F93E8F7E2FDFE99F7BC71BEE1F5F5E05EA2F28BB8A0512473C6C43600EBC34B110EB93C20F0F0D7732A078005F5BBCA46C88BD8A0159ED6B446BD5611769CC70E15782BCF85FC596F3ECC2DB0BA5E65E699DE35F176F32A37BD3475C1E428224FC8F19FA2112778AB0AF0056EED4E2770A27366194597AE9B34C5CE4CBE1435B91A66EC717EF5B2BDE353E2D7AED579A9166EB28A2CD7E0CDC51D66699C2288F2F578EB898933BA961A2D7E52705D9022C440F7FEA744E1194FC2E78A52F19790B3E6A951C51A1BEF6F4FF6D43EC3502582299ECD060E5B836E571B906CF3777996E17292F6FE721F865411DFB917FFBEB3304AEB6A034C3B628E1054ED033E737BD37A7B5D0A2A4A11D2871F60E7FA64F665E73AADE267F5EE26AD554A4B1D257FB0FB85CA1EF58B0E0188947FA75554F6C90050B92458F58B15B4FFAA554A9998C6426EF43646638E010FB69DDD574C3C135621DFB85CA32833CED7C9848B2FECAE1F24008F055BD5583BC43DEF3C9B6D2BB7D54D5E183CBF6E7AA1A9EC06BD4486822567C30006B9F23F2562AF1183ACD48479E28AB76E35EC5EE628295F9ABDEEFC298636CB9102D1ED61D72F46291FDE0C309F523A032CD66DCBE8632417997412DBCB7B6453B15D820BBF8CEBAEDCDED8ED7BB01A3DE868D6E6677FC9EEC127B7A126BD3ECF6344B7EC8CC64ACB86FCA2F8E952A087F62E8FD070297EDC7775AC0B7D359524FFC0AAC273DBC031054F3238437EC6FAE76966427964823408AD0D8F67DC5ECDA247C5419FF2BE5C5682B31EAB56AC7A9B969F65C98EA6BC3722B5438119E8E9C784412F7D5A8B644661490B54451E2DED491C6FD8DEF4609DD192B9C4C08DF30CE4C3CE8DB974621BE46751B420ABE508862560B2F003EBDB1E64AF4F7430BDB1C2D8C6034EF8740F4D26FF91D4B366809AEE793095A0CF829E8CB969C5628BFEE83742F9FE575E0DD9905AC90DF2DEB8A53C1C7867A9BBC1B5B8CDD8793A32860A855CE4AB0A342C26714804E6D3AA0FA97BF7BE749EA19FCDC2941FC6837EDA001DDCE11490E0C3C6547FF4D2F6FBB47554DAA21815D9CE2B245526E21319DCD1E55DB4BB33CFF6F64F09253686CFB4EF5789ABDDE380E1D265F1A0D7CCFEC871BE5AF8E8CD592C165D124708BE15EC1405546CFFB636DACFE03FF5325EE77BA3AFCFB525B6BB3949FBF64CAF5A2C68A2858C68EEFFAAA8DC484FAC05E89D8F91CA80A141846C82D523BF08309E681DB6E465EF5B1077DE806A8CA3F1C3995488ADB9DA68F45E8F6C2CF9FEE2DB5649B7D52CA73B7BBF59BFEA11BF463F0619FEB5FABF5C5EB089D915E925A3D8FD05105C78F17006B6BE31D9CAF9843E3B58558B74CA5069CC93BE311F21B5AE83DD4F5B432C34F2749631466FDAC359F8E44499ABBAF7D226CD71137CBC6915E797A3E31F8A7ACD63C8C1129BF412E1ABB8DED30E49D50CC938897D8728E5DEF76A15A9862C29858B6394C6011A0A3FFD191009BD5AA45F366F6C4C260DCD9A94128CF40B8E666F6DB2DA4C306068FFFD04813F12B645C51ADC17CDB379D8BE277A4844BB55B6F97FB150D65FD59ED1402FA5EAAFCE305E6BFA3FA4720B0CAEC27C2DFAE6966FFDA25E13AA786DAFD82098A21E34A018E7C721DF7772494762EE4EE624A915BCA44567066971C7C41A456849EB1EC218A9839C47F9C8CC1EF14420BD6C71480DA1A0003189BA6E2AC375DC946E5C45C00BEE08F3633413DBF1F1EB272169F8B77F8577C802309AD88E0B5110E3FEA5A8FEDF12A567344130672598785C2C28D3ED1D727B1610865FCA5D76CF009C15D3CBE2D440FD5D83AFEB72AEC1BAFF9B6F9A95D012DF5F7102E84B3D4420A7062E09213153523F61CD22E24BD3F5DC47F5CE46137F7BF6C2F85DD9604198FC720100D3FBF38C410E9EBFD1DC6C35DD8271963AAFC3639564D388E0A7051278F1235B3F7CEF0E16024E9C6F4B3CDF74F14E1450D4F7BDC8C9CA55AB22900188A4AAB7A0E5440414300086441022923F8E43E4BE55DA36D09A9D8131AD8B4112797F472A219848A6147DCBF90D8D8E04679EB0C9102884B3779119E9D0F1CB06BDAF498D90C76B8D2D6A7B15447492F21561D14952C838D4CE315CEB08A130EB0119544880A126918C0B896EA17D64D55B28439CC5FAD82BCB00139A92FCCB0CC0DCDACB4CF94239ED588A2D98D0C6B95D5DFF35DDA04F58060BC21A75AC4F7C8B2E94AE7B4EF53E9E6F33E33A79ED2DA027946C61571DF401E64F000666770F45AF227FC77C97154552F7702996370B4987606C122AA5A1C8CCAF1AEAAC00D914276FFDE661C8D728101D0B5D2F4B1853FA19AC3A7F95139241B6F2124876CBAAC65CAFC54101355807B8C3E547B125517B1842F2F03B8DEA032197208D528876BCC83852475811354C843419DFB9AD4C2542B089D76C178C93470128ECBEEC46C12C3442250E735040A81100DE09D3A2939D68F28E891691A499A464EBC2B95E18ACBC1DB404A952C037437C9678724590119BB4A3F8072C1156829F221E353059C94A668FE16C0FB51532A5272BC4FAB2AFF46F04093B92AA96D33AE010B258E23BD10625590312021FB65F862EF8643B30C58A647EC285C5A65B971EE36C51B68752BAB884681FFCCEC7626C060C486336D3C521BB8286358FFA82C8BE75AD822DE0F1CE160C1E68269EDFFFB736E1B83DC028D5A369360061E0F1A57347EF8A65301608AA977D2088C94AF144A8DA6A58BBE9C2DF05A5EE781A5F8BFD3E6E40E464082B452F777246CA5A4F27A8E4ED654DE4A63B51E829EDD75E29D037E81F0912860C774A67378124FED509082E27E5365A1B32754EE8878A83DD7ED5D8B495FDB17701198BDD4E93AAC6724902A7FCA307AD69FB596DB51FB21809B55D6E7EAF4FDAF13DC8458ACC90AED5D2C96C0D921BD3F5D9C23A82517941E7317CD9EF9098F38359D6D5439A7B6929011AD8D33D4D2A1A978D4D4BD48F06D2AD564580E61C02FA7878B889F78732AB9533188E1D328F936ABC197AF464CEE0EA990222633A899FE19F6CE6A55047DE57AC99D7C23BA334AC9494D994B04DEAE45C2E5FA36AF293C8FDD7AEF10487EFE2134BFC52F7E9E701CB813FF5591D4E20D32F2D2A56108C0D66C1B6011D20FB39E72B2C78FF4A89B5C7C48B69F8E0193C73C828B81E0A94F1472B2C8A27B8C3D4EDD64AFFA8ABF2B77B38F382E524F312F18A05D4624ECFC07889449EF2E377F0F0D8B87564ED127A74C446C30394FB23CB74D50603DEBD664B5A246E69C7DA410FAE444F233977490B45EB8BD5B41AB9FA5265F0CBE9A602B1ACA1B97AE2C02D6898A91454320AAC96002BF951F01242B0F002C9FF2AD5F0FB0E85D4689B594321516F4F3AD2C6A96D540EF20365B3D5FF8435DD6D9D9BD2B77E97C4BE63B687CC46791B0B7430798BFE30A5112865D2F2069A52C7D837286F1B2753BA7E98688BF95C97005461502AE427D80636774F4C34F6571758A5443014E2FDE42E9E1553C1E167FF8C5B17F4906B7FBF3FA6F9BFC233FD2B0081B961A659430CC3A9305E5748D8A45A794E76AD1117BA495BE30B54E39E45319CE1CA8CF4F316F258CB124889A933033D2F4313F7BE79C49E3B82DFEF2C67C4AD2B6707E37EE364E54E736EB1D48368DCB74F9BD3A6BE245A8A1E45062BDE61BD768A0C99B1BCFDC359663A5A86BABC1D27BF58CD1FE1362EB818CB2120CBF8D90D25C03F2006ABBC74EDACF889E21AD2727948AA5715696150F3628547AFEAEBDFFEFD88AA2D36C5D5AE2F24952B2BEC8CCCF548356F41499E7143A84804DDF679B883DD6029E21188BAE3AFB3A56E21A235830684091A42ECB03CA978293A0DE7DA99D5B7F50C4F4162F89CEF89E341A7227892EF9EE49D56F876507A4173F852F5223B5D182D38F35C5D2ECBBE1886307D55612621F179403D87D77304BB3F0C6353691FA34658CF79F2727363F2E6E43692FB6644947697B9186B6011AF0847008EAA8905BDFB67E6597090BAB3D83C10F32D39C742F4A5FAD5B0D86EAD7ED6EA35F10FDB79E28474CA85DC18B2EE9E0C099F607A92754FE1F24B4C31BE5A89CF73D14F639462CA8DFC7EACB61566966C3A0FAE7A706EE08DC65C1AE7F714952E3A529B30516DAF9C0F76D6425A7331D9ABC85176CE6313EB6D48F339004738286AEB0FEB92BCD5743E4677F2C0ED50FC6F20E51800F6798016D69991FFB04C2C90D13F40EA84FB3F2B397C1965E6C518988F376061A907D6F56ADA0F6F640B25A28CFD2394A86D924B6B4C968E187C716B9294C305BB87EDFA55B207CE420EB52874A9BB8F04866B055C32B220D91C63D51E3A87AF7A6FCF38AD4864B6A23EAF71A682EDA23CB2C30B97CF0F28DFBC7C10696C14520B60B98565FD3D20EFF7A39D3FA0F2FF98AFA91BFFED36367DEF30E0746AFF588274BBE0EFB8EC007A02E6C415DD45EEA17FF6E16ABA0E762B9DD7E3B3FFF231D5796F44FA356F079DB4D2614577B482687C14403A09787335864E7C46CF0C5BB4254080ABBD1185DDD68B65D5EDC3B163B782A7A3D2067376825F52ACA55A18EE4EFAAD3A9374CCCF9521995F543C00114830D94CC2890D2D948C585AAD165960B50BEE5BE92C4F1EF08063CAB37C18EF25089D5C46301FC68A6E63DEE13665E9E5114141CBE1EF78254C9EC1C5D9787391BB01610C1984064E96F0A7EB32D16BE39508C094D7C21EE9F4615338FD8A0B38B85990AC6C7634095F8A2CB35A2C6B478B071D0142F0F4A68CA2C97FE6FCF27BF56CE4DE21A9F180062B87089016154A76C42318D1C181BBFE74EC7966369EA976C2934E6A37B7D0A0C44EB6E92857BF36C23E5443E369982357FB58E6C09D520EB624F43DC1EED1BC2FF355B4F896CAFC955041EAC6958E6FF83506AE601C1ED51D193034270ACED7FC991EE5D6A7A51FBA2725A1EBA251976339EBDCE9A5F3F6EF59ED0CAC616EAFDD094AA9F80E9EAA98A78346317893C65CCB921EC2DAB001F2C7D5106B71D79ACB3C3B8848FC09196FB0D6A1727A573E3CC946F645FD1C9F41F26E3EF22F7515957C77C3F612C60C01C0EDBCB85DDF71E7A05D8A68B06C72BAA4A88F81FF8DC96DA0E753245940014ACF815E32F9ACE2743A7E8B13988D8DE0C109AD6DE8783732C6A872ADC8E0381BA5E5A6E44B4D7BF21987F22DF2AA1553EF811EE27590755B819CEAA915F811070E5F1182B81ADF12EC24C3744F92E394E920EF778F738FF5D163E92E52C530A0670F443D83BFFEC459FE266A8D7B768802B6F05D1516B27CCA740974F32A4DF880F20A801333269B5D57B1573DAFF3B09644BFC2345FCF77ABEF56CC306E725C54117B857940E7FFBFB1B3AFD61358B208927119D29B198D83435D36B07EB9DCCE3A81C48F7FAA8C3DF5E11B1920BB50C35F768837FB52452EFC25A2FBD08E9DA83DD7A0038D625054C2E478F790ECCF23BBBEB0F7B023321C325449DDF1EED5DA769F9C980CCCA4A73511576F7DAFD5FE17538821767C8FF2BC0196FE4FECB095A943445825C452E09F0569D919D2EA6DAEC475BF6469E4EBAA62426AD4F2FDF6F15C7CB8E4280DF553CD3D37C180D3A00CC86B6C3A317B415B2C1E6C7C77CDC47ACD4FCC8D71F885AA596A2E63EA2BFC111608BC28F4576CD340C14D827CCEDE1059035FF2B123B9D4F91145E67D8D7BB9986E77753A289C2EF7612A1E7BF7D3324140282DE1F90BA3A80485C073737D4C012233E61C231A52D612450CD98921B664B9AB3DB123A3D65CE0915CCC155F6597C4614FB03364F790BFAC125712D2859F19A5D8555A4FB0DD73846013E289F8CA68283F76F8CE4C550D9CCA72671F89342F78C63472560C11548BA69389CC5AD02F5FDAB182677874DB611954F230BD32682EAE08A5C11005284C6AB819A246FF7E0F6993D96774549948FDFAA129B52E52F13FBE56599FF9517497B84651BA5B9277D24FB7DD8CB9084A3E3545C7B3177DAC8C1F2EED35CD1A564880F49819B1AC902E3C67DC9EA38BEAED0052E09064A7E29130C08F2016DF334DD24FC414E31973B07BB17F1904FBA9912F6557BA6D306433678A6AEEB48CF943EAFE49200954F04D9BC91C6286269ABF4417F595B9F922F78E84D18DB759D11AEF6185799840B88AF9E46DCDB0D95A7F43C460E48D471D06BEAACB9E24F38AF32FE298BC82A93F61E05557646837F3E18F4E76C895D6B708D38323FD06291EAFB6C9A006AD3E67878B0E61619575E593A2EC91014E0D145D4C04934322F7D8802F887B8CF423005B99A1D7E0E437AC32AA58F2446BD9412E3364DCBF46ECD09188DDA580C7A22B82E1639BD3DE33E556313B2A696C53BF82A27BF6A4D71D799ADCDDC0F6693F25EDABD1DE3A0EC7C3A1A1E14A440E96B1578ED007BB0166B0D18786C42DC02EBE0E78F787297797F8CDF5671058C89AAF7FB6946803C3F87B97A17F98ADE718E64432C5E446B96F5A87451F0320CF76D87649423C5F5E981591203EE928DDE7F17D5558F1A557EDBC974088BE17ECF5B4D956F554A220CBB8E632D93C7DC5002B8BED00CD1F16ABAE814B63F0967C5FFFE8F198A1AA334138803DB99B8D1448D16DB270783ADB35BBB3107F5CF80EF275EB4D0E74ECA0D6D136EA2F98918D49FBC3081E87B2CA817704D27AD4903D9EF06368D25ED74BB67ADD65A76CE4A0701B316F81336F3DF3C80ECBE39CF8DDF3FCE98F7360D9FCB67CCECD9181CE4B1A03EFFC1F24E0D953F89ADD0F6E2A9F77A64E7F85BEC5EA470D2F1EA5AF83362FA17A281DAF83B651766DDDA97392E31DEEA8AB17B438766B4E865EF1D45913B6C86422BB15C8ADC80D2DA52B0133955AD0AD86B04DFEA870C315AAE0711F2C77A2BE33E293D54A11D8DB1E41831C8C38E654CC39C18003FBAA1B89738E8EBDF0D295F05A2052BB50129F161A977326B02A3EACDEF58C9DA38F7036BCF3314D3AC24CDE2F32DD90AC6F90426726C53F4076B3A095FCAE112C24888A2138ECDA9EEA920C41367AFE8C1247D407491F64A90AE1BD95453C37A338516FBBD485FF2773CAFC7831D89A476556E762B3407B1F4CB9C61670161A75DEFB10741CEA25111D271323FDE41C5A87D91CDE65D9B76FC6F442B943E55E0D7F8A78C5F0C464862A846C400D7C43BB11C286A13DE48C7E916252631C3D4A005AFE14E6DFDFA4AEE97B08DCA0EC1ED0DEC02D2ED65C4668C99903382C9349329A37E0C9BDD2AFF6BE89BAD1232EB65B9849AA286DAA6A6506FC6AED9EBAB69BD39EBF4648D496D80A8BCB12B7895B46AA2F05591E88D3E67FD0EAB74EFA80D3FDBE2B5301361DE560A995E4D1D02D9788D6B475876B8703EBAFB9FAC712370E3A1163B9FE5F43506065929F4369C0C86FA650471051D8DB3E61E17E0C1591868DD214E4FF8242086B1CE9520DB5008ECF800BC8DCD4324D8A1ACA5676A6B31E7B3EB57F8247EABA4B79DA1615717464D80A4A51634D2F68C2A5F11CD5DEA4BAD0834799AE54B1A976FD56508F7A1E3D7FA18BD90DC47350FA452DBED69F801CE2E119C0E36D94A3BDD01F9CDDA104CD3C874569249595D042D2B30BA54D2A595667E448177228D28AFEA6EE1AAD34D8A061D5EDBB2EC194D6DD8CE9FF16A3A9134079C566E6D8E2802405D8DCFD1C29246152FD7BCD00B21605C805FA1C4398B8EE4ECFF63CDBD7647FE28062922FF94450B6A9CB231DEC237D2EF74127AC82D9949CF8E841C886C46DD274C2B48A42FD719EDD85B6203C185005F0FDA4F286D446737F3E6203EF3716639A6F33C8379F0B5835D4B734E79214D27D43D98CD61B8DC1FD366954538C1D23D83EA31A1A94F9260AF0AE5A47A7FD423353F271CDDB90CE3DE08DC7749538004E49939531CAC3A4D2A368AAFBDA1E77EC572851C2198101E1DB935A72A6415EA6997903DC804F49C97D3180CDD9A6B26904DA2E7783071B20ADC48B85F12FE082F26455E164FBD4EE148A0ABB7330D4DE157BF634D6952331264541FC40070CBF317CCA9551FCED86C09B4EFD4C7853C4B85ABEA49DE9D537FC21F9E0DFC0C83826D72659A41D1061F50F64384E973454FA4F32DB9CA7D2E97C693CBA04E61B9F3BC961DDA142E5B01A0413C62E4E5F5B5EF6B1CBA314CDBAFE2D0BBC3FE3D5CFE55E15E2520FA461E6B4C46D348C512F9DDA49FF13F5E3498BF1862D014A9A16C8D9EFB25696960D0CB9D91CA96C6FF4F9E7F8C7E3D7F50B09B8B2361282A35DC1394FD8E4FDEBAF98B92562D440E9E89C45779588A0950D0014B243F3C69AD99E028265FDE061C25F551AF0ABFC9C85C35F7ED00A298D57AC94E1DD93B702FEBEB24980A36F9576D0D83F24ECD789F69CE909D1E63D8300D6C899EBDE18BC2E103C4A3716D3F2AC219C5D8471655C61B4B5575F238B5B1BB28F916AAF423DA50DC5DD0239FB53DFD30211E68FE68E3BFA1BC3D862A4044BCD1D199F02D443494564455A2FD28DB2EEF64B800E28C16F1CBBBA60E96503DF60A6A7340B52C8E1398CFCDCABFEFE33A7CE2A8710DD678E936B239CE4060249A7DB898823E6441798DB79B8C31A6DD16600BE2435737E40D626D3D741E6C0C0DB018338BF588BC3B00FBC374FBA1BCD8B757D7B36A6CE77BA33FAA2BC3BE5560D709FDE4B0EE812744EC018B2BE683D294C92B76416496539B2E8CBDC0DC897EACDD5E9B48A193988775ED3C025CF7BBC4DF35FA7898A372AF84B7E4B7450BC7976D9AC8ACD58D955AFD72B37FBE100186A540B3D7FD2E992F29C4ABE17AC5E29882D346A99FBDC7133C1F16492EA16A66CE9FA0B634FA5C472E481B40EDDA244CD7FDA22BC21A000332E4E02B741AC69FCE4D872DBA193040BFCE255132AA89C4594824C5936EE11F5D762B511838A910454FBDF0AB5E1454F2D2A7D6E1786C2B05F5AFC104CCA55D2EA45651CB26843E7D9F077AC5E64960C835AA9FC8D06E5783C4942B8BB3FC2B30E4C09F4AA513BD4487B9E6FCF2BADF92B39AD4136196F6803586AA6341ED4F4F05A21B74F6B74DD00F1C1B672B58277A34FCC0FD4D4EF3C74EB0DB6CA2717F28F9EB431CAE82F41B6AE965B7B6C51F054DE128C498139641966E19D1102913296A94825670843BDE24E5D66A19F8F77DC1E596E82611D7BBBF46DE087F8581910DC082921CD3822F006F8F9C7CB3A6DCBBEA891DD8F667E50DB048EBA917599067C9810D94A4185A89C505D61B10F91A1B39BFBE03A6C5BB4A6E0A228DF6A1F74ADD62DFEAFF6C6948DB5C5B15658E0A1505DCA6DB5B91910DC732D850E6AE34B715DD60A6B18E38BDF11DD70BC4D12C3C2AE275C8174B0894444258AC1322985F5B9C21E09F8D9E964BD57CDCBD415C2C0BD69FBC836C037F3754A389C03B4718210C8C9F3F20704008857E766119D2FC6C668EE476A4FA19B3CD823B5120F271DEB4DFAFC4EF9C788E4B5C12FBF257BF3A0FE06E59AE5AD7765A6A9A43B857C5D1B2FB5464A3CDE87ADD21B5E78B7B28A09BA2CD233FE97A0FA677C72CC91CEAC2D1F4C8732455C97D5F9F3FBD5DAB497A198BD62C1C3ED1D66C1F629F5807E4440D1BFE65BE277450BF568D76FB7C0797A2C2EF93C8DE2CED4DA2E55E9DD2474B329755C57F7EE00514006C3A60760D38E7AC323A82EDFE9E7F6CCE2BFBB7A081B78608F9D357AA60772176D0B0EFCB6A19A8693290AC06FCA7F08746A3FE80CA64EF2B0D148579B8D4840DC2AD057C831515A9F991225C0BD69C164CF19B94E275F20EC6F5F5AD8E539070E6F1CA4B0C671F860A2532AED2ED6E5F3F4D2C9A9EDBAF73BEED58CDAE9B7005E3C8BD4242565DAFC74805D9E01AA7ACE380DFD48562E77C4CA4802F440150E327191AFF2134FCD933E334FAD5089465F5A81DFFC4B8B1B818F73495A51840960CF18CBDD1303652C266816F905090492775D30DBD40E1D34635AAB2635EF1F831EB17C8EB7231884494960D03D043F7569101A356E5FA536A62FECAFBDBAACCDA5B367D389CFBF9AF7F81FA30653BEF3076B5901824A73792FCCDC23E6BF986C91CE16F10E610F7F54F6CFD5F8009B2D3E6CA72A9FB4894EE8F78B8E79BEA2121AEE54C9FB619E8C514DD2976629DD0063A677234570429F2B38636EDD43684E926C3D24561D0364404CE7F68DDD6D6AB3FE6B6F9E0FD1D8A86C4299E4334803CB0E2D821D0703B12A620E2C9E28379ABEE296A8D2FC24BB8FF6F37271D1521D28AF8D6BBDBA556605F2E58D242590E56ED266E3882D20AEA0F2E12974352FC81974F34BB6F3A026F22621A8388E97BD5AB793538EF2B48BA00624AECC55DC911F250FE5989CF6D050161CFCAD543A1FD713B76BD671893AEB93FA328719CFE7D82202B2529A4FCD6E4F96B61CEB53EF3DDBA56D04EE848BD519417ED66AEFA7D9429E328365904E2552135408CF079F55D3EDB363AA3DEF014BC29BD8CFA00703E97D1A15CB126DB9A0272396597F2A68D5C4E57200DF0B8ABB7DDD3D5F381C351DAC37D549CC0489DC592EE6F54BD1AA8E7A3D7B28F84F61C8A779A33D4C29B72FAD5C6E65CE98356925FFF2BE60F9913E166001AA601FD4396296FC4718A6146AB6BECA71ED6E32D03AFFF3905FDF1EE3F28F32272ED10BB6E7BADD95F17FE5D3625BE3E1B0B2A28A45A531F415DBCCD032140DA3A28403A98A18B00D5EB788312B1DDA80AA7F2B47D530FEEA627C10C7C9D198060252293388B61A691B6A92DF05DE039D94A55B8E4F6AA16659E465376EF37E90427F361466EE7244E8DA886CBFFC8AB53A8FD478DDE52DF4C7D23A02BA5E6867E003D5448ABDED8B83EC6B0858B07792366DD9D6742E1F7B8039FB8E215F33C3BFDCB81F43932C08249AEAC8F7FAAB9F84A3B35388571BA6E39F30F9937128776AC19353263628B7D50E301A812063632F17F318E4F3F995E817CDD6A9A2CD4A0477EC26FAEC06E22E875FD3EA4658FA57DDBD2AE7BF5363238121EBF5C64CD671E0D8DED5E246F4E17AF00456856E0ABAF9B4E12F7154265BF9401A459DABC3AB9D146D62CE8B423FF839A025B986A49681201F06CF9A810C9F2DA83B56C09B599D0BF44751032E77E9AA2BF3E0E980E9562854DFA03259122FA21AE80CE63BD481ACAFBD94CF94DF6A1F4C3EB0789FC6AFD74B90E3BD4D66F20AFE042BFBD040520D8A27679E31EBB9D826AAB386DD9160D780C3B0DD1CF6FE01C09AF36FA1E23ED0423FC9253AB472FEF8297E6931CD44C8B747D6BAFD93C75AFA449ACA9B58AC3A791723E34D62B62B5891E67525BD28F0D80013E2E6C25C372EF5772CFBFC7AB0A4D427E61F5E64F91E842B4B42B9F05960ECD019C60FB899FD216B5A3F97D170B1FB231E8BDA36C46561A876214B6F3436611D1F8253811F69A461B018D5A6A1D0E4523942E41DFFFBBB37F95552A5B1BEE75A7C694D6D5515ED448D05E4C09E395D3CA3F71BF75597F85D43971F003092BDAE95D21AD26830718D931814576929A4619C0C7E5BCA3BE1D3A98C47BE87F5A8745FAEAC649B7D38AD29C2A0655554B03A91FB1794408F6D2C048CA4449EBED0A1B34A2FD77B0A8DF9B1F6CB4B209CAAD5F6447CF94496B2004E8638F5A92D5D2FEB128D71023CFF3E3AF532D391AACD8C95D02BADBD31F557B0D80A7ADA1D7ACD519F95F2BCDFF644F28C41C91C1C65212257C53DD5931FFC68989F29F84CE25C61096C32B5A9CECB0D9C0BA97588362F48FAC37546121884AD72A057F65828A51C65FEB8E70D7E04D345C2102FEBF1D5B02052815CC12C3B30A3B7FB4223BB77842DD881BD04F013334F41CCD5C0DACBA9FF67A2EAC66F3913D608DE7E506621A82D33819B0133010C77F373BF1C6DB9FC83BF3526871E2B81F1689AC2347D5D9EBCCC9A04E353C5F93455FE9A56BC9E72CF0DDFFD2192EBCE6E94BB5C73B214900BA29AE6C3F99B924A26CAB4BCDF866BA9543AF682D5D559016A5473EFF3F2D7FF284E93070DFE40DC875FD2AFBD34779987375F8E71C594B66DB80A22EE9A6608C59243AD9DAB9AF49AB489FAD141445E938E902EDFCE48E80D441F3E3039A6D0E3346D18288C7842EDE0B50953043CC0C70054EBBB9EB0A0743125244D9AF645D220709DFDE4F81B69C2E748283468395A692DDA8DE5FE957F73A7A3C605E0C62B44E0CD63852481F0547B3470FF62B6F1B9FEA22C7C4B407421F8DB66B16D134838AEC74E4619741CAE499074B57D5F62473C0F6A548AC73F173CCA373CFBD179D4DE7F147C882D72587B763B4C5FE034EF5582E4FE83C6204203BCA7EF0513C0BF0FCAAA49766BD5FBB6B4E846B0E475277A8E2AB01F03D7AE561CB001ADABE69FA0BD0ACB660ACFAF11519831B084E9D195BA2279C9E6B015A2DBCA53FCD03A71B9BB00B185707D2E6A5A70E94F251314FE5AB68CA8D07734063B751917AB8D11B49923F979CC2331D5BE45EE5F186BE38393688BE5C635DEF760FAFE3B0E47CCA92AAF7B4BA6E3284E8F4D5B0005E72D3D877DA6BC3D6E096461E50E8188A74FD56398F4C0EB2FBA1B05FF3BCAF85897219CDD97F51FEAE66578521D2B2B3FB3FA69329EE062A5663D503F71770EF53F2BC57B68B73ED7A016D01F6E6C7CB7F6B2270C7A7EC468FAF2FEB7B2E04DA083C3E40B27408D99DC2CC50BCA12C011E871CDE8A39ABB54F5AAC2446F7822C95AFB3ACF6824905D9CBD2629B7896CA16002F52F79DC9325E8E10A3D892AEEFDD60809F10A24C238537D17370A8632C6C31819ECB11D8F9D2DCB770A3BF09C373FF0980C65E2C47804954231E2EFDEC1CF0D6254E3F55FD703CA415597EFC9329D9D5A19E1AF6FD58B581DA2101C96AC1350A9D3E46A4187CB29C7A612FF9B61C2C439945A9A8B3162C91AEEFF352C651B4ABFE82A6FBA3934399B24E6E77AC7497676C38834AF2D7AD7DDCDACFC6745784C4A6666B9CD2EEDC8431D748D3D96FEEC92A77BB19840F71F9151EE6CA45E4742D0187B2D9CE1B2A7CD1ECC895DC7246B65F74EE014668AA8E63FBFA10B52FD5AF8F9DB04E1FBFC78756687779C8558FF8E51583E3F0E0A7CF42DC57EFD9ACE8A2034523B22773547D76B4AB0D097AA922AB94C015031FBAB7A055DE58A1BB39D26377DD1A8EF04031406A735BD7D48EFE793FAC16D3E1FE5EE51E6FA72FA7DF43792447DA5461767F0A994CC8187157BEEE098AE5109F4CBFDB74D4BE0D830E8300E3B83EDF91571990341751D2CA480CE7C30F2E2E5A9106C1746D6EFC2F5947A53B20B86D171614B62E273193169C6F966C4F0A1ACCFBE40CB4050867AA05F3A25CA888F324F4A8DC809790064312DE022FE419DA8CF7C049CFF2CA545E208CFB87C80718A72449F0141481C43DCCAE7CD762712A8C45CC7FB39CBFFB82664E8FE788805D7BFF16D10F385E71B898F71FC0A76C5856CCA89A157B6527365629CC4C617C558F2F8B0C01D8739EE8B8DB969BE1748E91CD245DA51B66F62B21532A485E3F907E8B41A88BA78CB641F93391609851DF994252EC399ABB0663C121918AEF1099BDE0F57821BD36BF334120C4870186CEAA5FEA16C143E41CF622BCF4B9C59F828825D96C76ECD8A31CF2D6FBCEE66DAEBA9C30802AD33B7792220115F3F2BC6022936C3926624A96E5E82D1EC79798271826F255BF9CA7513FCF5CA390D4BBE7C5626679B620184A94ECD23E62644536B697E2CCEB2BECBD6EC02725DD9526CC3EFA970DB44B019FB2E5956F4126115E4BD91856AA5DEDE98568BB84E14F06DD732260F94A18EEDE8FC9D6FFE064B8F795BC50614E1C83FAE1E29B1AF88FEB1C83FFE52BD6DBD41160FAA6201D5DB6361C93FD284ABAFA70CF5096AA6009C2A06EAB78EF16DF8CB6EF4C83069484EF3AACD6E1760D7B9DE1E50354D48B736947F403F6E355D94F0797DC78FBB578CB62922679E08153C85F21C51D37EFBDC1FBAD15342D7E4B2F644984B2E2F97D8F54836B187E5E7DCBB628228C02309FD96AF8708EF0C1229356AE90AD30C5B5963AA6FA630D2B5A3C29AA54E1032FC09516F7E7E7D279131B5E79A4A1BC0FE54C56AED33FC5BA230458CC97CD1E569CCEE02D72B658BA835EA9A3D7C6790081D45455806ECE1D3DD5F41FAC0A937631225A53FE083A516AF4A077DEEB891993A55DA92EF45488A0A7BFBAB6F794E222613EED20DF2830735E012B9A6FB7B5156F1802EB9E24599E4A9DDEF2DD4FBFFD5731B82D9ABADE7EEA97BCF95081970E2B76BFA72100C6FFE26A82A1346222A7E9BC028B829DE0A5C6EB6EE924ED4DA381728F042DE3344197EDF783F0BA6591793D77E8286BD3AB586D0AA2A60622D4EA7383AC3A269206A70EA23A1AB8ECCD845CE95DED00ECC10D15E7579B64FD89FDA55FD243B4F5730A81FE989D151B9215F5FAB2E4779C0EE5659A6C1EFCF811059C895A167C31DE9C2A2D64C939782BABB0EC7C9B30E03F126A2EB11314AEC8620806B99AFC01AEB32D59290CF47630F7C5A7E6AE5E9C92E8B72BDA74D4224AE2055D6D9F06985D5D4313150B77AA4D1FD7EF888EDE0EC8F0CEDDFC3F99328D43E527EFD116EFF3B948F3A6288D78CC3A70ECCB33A75E5876C3DAF121FDD58489A500A3F84E83D2A26918835F118142D40958B97C92D67EEC3F321ADE9137BF38C2BB3018D883A47BBB344DE8C153ECF6A7941B65C422BDD64F79B472075B19ABB965ABE0F15C45C2EA3DD982FA9ED84B81A4DBBF6DF69414284432900D840089E452D93E64C49F735AA061274D8FCD59BFE22D6682D60A4FE8848B88BC8E05015FAEC47ACE4CAFADBB248398C6B9E6FD51FCDF0EF82578CC9C78BDB1AC7745461A95ECFBB39A066AA20924AB85B8D6E8149923C96CE448FDC9888E80354D7CE78521E2BE11A229EAD2D19FE34D29EBB0B4FC478FBAE346694F7E4E84F21699FD1C816983FA7AF32C6A4249B6B699DA1A860E18B512EE84FB97D40AA77A55A36A159A4B911E01D604D8B5DE74DD4B48634CEC36BEDECEEB327AB28F2DB09D3A0E597E22BBBF367D69CEE81B7AF0021B9C1B2079A86B209577643AA69803E678E7F167672228B2BD2AB1914F1E07A3F602DEAEFF90F7FC1900A8F4B25238E86C440B164860660DF69A5563B90EE27B0DCF90F93F04469915A26FDFF426D0997A04047D1C97FE46BA21E27DCB05817A210360102A395DE6CCFA4FC8B99291EC28DD85A61EAF4F54CD3C71DE2C95FAB1025C97818F6E91D81519DE3DE1B8F7EC21D8404C52DA6F16591BC7C59DC48AC4779D1006572232B360475EE3C13A1FFFCE84045FE499288F54083664B11A33FB196A401512CF236D057DCD8D2437A9780DE9D636B127BE03E839FCA2BFF2F1FE370A2B6B04915349FCAAFA5AB44DFA836FD7431F2C7088E726B8705E909102F07C19BB5C10A25784F99FDBBDA123A9D625A16B5E867A3CE13AB779C3FE7A7217673D1990A00AE40ABA8506A2F2A55A347C5A3B9003A3167B09C8FF6F68EA7F4E85E9386FF5E21821511F220177CBF3201687D50A2CA3811242D34451AD3E2827EB9CBB59C31568300F34A20F90E71612745A0799BD2E0CCAF203829FFB8FDE1556F3B8F463B20CC33332D6A892BFBF9758B95132B2D3973DFE9AA775F07A8C6FEADA1B6588AA7082AE4D3114114DEF9428DFDAB055E28CC7F459AF49511E562CC0C882222F8CBEE2F667A91031CA685D05DCF34F042E57919A85919932F3F1B84EFDB30942F2B3C752F5F3CD0320896772D68DFF5D4C857580A8427F9B9AC2992D44E52666F5E993F3CB4EC3BAA513EC07A2DBE48CC7820B91AB4C53534C28080668F3B95045C145E0F0036552A0E69C299705E01616026299A9455C0E197BA05F5C4EB4C93817321DD6E589CC688D8BA16AB12216E06B63FDA24828F7E85B70BD9097229701573A8BF295918D4A1A2FB78AB854B54D4410C50FFF5F76371127EA464BB70A427604C40E4D89A4FA4833B96749ECC0B7169FAC9EADF620BC18194C3764138C00A405C1349E917417023D2301CFC6C13CFC96E8A8B32B81D6B86926AEB9DB2FF34E70840332134247166EF6E9D4B9201A42865E7D215944166CBF8FA65929024938E8ED2120ECD5A15990C344F39A666C39FC4D42A1C290454892258850080114C88AF4469D017F0A5548CC0ACF04CDCA344396822F14D4DBAF753EC4D3297780688A416A609B1628A7E4A2258921A6F401DAF812C57DA28A28E007D97DB54C87AE7006F7D7F140B95013E5C2E343DED3024FD31C4FD425AD94613EFCEA8D19C4C1B39703DECF54FE69CFDAC376BF648B5D217B3BE8F223BAABE2E7E4D1E2AF790AA7BDCB6F628030DA03EBFD5DC05C709ADB7EE0AF6D171CDE71E60E2E9E4EBA672C15F4F8AD39BD99FDD0498AC5AFBE4D37297144F385F9E551752F0B6E78A2F7598445B83BA447054F34E249E43DBBEFD094FE49A15C22433D7C6F96BC8FA5FC00E0E08CBF55D0A7AD183A35103378CFD48560D0E079C3BED0819A845CF97828A26455B1393C97B04CA21CEA3170E3273C73D1F82E82F025782738344B421F7DB58BDF80F2E1F45810FF3B37BCC3C81E945413EF6552BAFC6103BCABA67438B95B235CEF57016511465285CEC786AFAAA581A8A871E4554C02BB0509468E3A10A75AFA76DD5D03859FFAB5A131E60ABC7A2D71B3893311C3113E3E864D5ABF3A57FF861CEAB7BD1246269AAB7C2FB0B41BBEB8C8A4960A15388301F37449FCDA0D3F1BEA3404D0A7F54ACD7D3AC758E2B7A6CC369D1FF250893CE82675F148C2A9E48610BE53B8A03013B47A52A13F0AB80925E4805FB50421C08A9652F095438952D0AC6706FBDBEDB83FB7E985D8CD8E25A182FD1CAD05C619200A7595925B3E6EB646A3AD76BB499F97FCF4C0191C594914C4799CD77F06D17AE81E83982DA76C4717A212722F715CB03CB29CA668E2818F1F3555359FCA8293E2C2A898B88A5E1E53E97FA7CF7D0C17D984A78F51B3BAF9D9123735AB7EB40AC2157CB82A1A8FA4D3E2074C29376D3871C2651F1866E0D0FE42657071F734B4BA9DB0362F7917DEA4178F5EE83EB0FC5896E54AEF8F92C229A0B0E2D7644C54A5F785F3C0E8350EFB1DEF3CC77824E9675929502FC745FF1AF7ED438CA8BD7759A0035DF97B87B8C2882CCB9AA712FA83ECF2A940188A2AC1306620AC903421F36600A0168A873C2912D0AD3E04BE4C73F3DAAE27BE11DB8B45B3FB03451E6BFC834ACA5ECA8D084FA4FAB0DB11CCD803FCF17C137ED39E6F17EAD1CA2236DBDC04C92DB0F4C26BF3C46FC95126F4DC6B5B575D11D3319D80FD9F14E6D7F6A7FFBF89AC2EF0CF0D993C1212D5CC5D5DA87C513498FD120FF53DFFC0BCDFA44DA157F6F492923515F2812CC9548254313D70802B461EE6204CBA7DCB8514AFE37342038BBAD3EE4C4D5C91962C5DF8CD41DDB3BA05310ED0C9C74188B4B13A555FDE5D1A000358BDBB8332225290C4C81CAFD2A59C244E4F63B66FBDCB4318A8E3A4437EAA580224EC4CF3566FB1FD8B7C3E5EDFB2D860FF8227DAD6BE7B2B60B83C519821AA199D48814DE119BCCFFA4EBB9CD45F3BF688F449573D40DD0A4FF14824C569BA824236373DEAC021DB5B91600F589C31CA938545BAEA5DE060CF51E64D37BFCA4FEE8C5DC6C93DF6D1AF5A921A28DC235A4F15A188B864011F8874211103952E24681B2D2462A0D3730D9115B2ACEEB8A3C3DFDEEE5238954C377F662E723D1F223C2B4B52F0B1FEA588AD5C4E1345A8257214CE9FF39292F5A6A5A306C09336417185249EBD3099B4E001EF537A1633AC36132E6D51047F51FFEC4FBA5ECDDBD2F7C89714B53DC07E7EF88B4036BFF12CB05E5651BAFEE468F953AA9E55C1B1FB3E0EB8192157DC6D3907C000E985458F3F3D079B992ADEF10DF7559836CC0D11BA7E74F790433D9D297B687600FEE3EE1ABA61449F4AB4D6389E4EDAD8AD6504A446957CA127F16644698EAD4227782788BA0C8C8FB87DB7D353CB5EFAC5A649D2FB0C23FD69FCBD7B445A130D57565EA5FA2389C3517D6734405BD5FE56FAA88F3DC01E50AFEC1ED6F7F19B746E25A7FE75AADE0C567E6C0FFBBFB62FD3A97D94EEDA562B43749C117FF070B0D9B9465EE16F7A751A74B8A77D2589B9B31E51833AA27101E6F96FD42C73E33D29AF2C438E51FC32B7A6446ECBA713FC0433C780098FF2A32B472418B2A620DB5E86AD58826F40B88E579925D4D3FBD5A7E518C872BA10DAFC9D5C0CEBA84B324615070B9FF5C45A2E3A34BFE966D5795F3F96F3C8A096AC6F35FBF41B8D9D6CA72E7EFCF21AF2768E9B09DEEE27C4AFA10BE04B032ED598CBE5E3E96F51A1F02DFD1F2B77B0DFF8023E74E0F02E18BBD65A4BF80498FDE50C7D405789AA996A4FC5941CBBF211D80C40D45F5F15B62DB5E11674C30886DDCAD3A74D2D1BB748E5E05CB56D808EFE9CA3630DD4C519194B58EB73230E71B587A65C093ABAF392399B2750BBBCA0F669CBB55D6AE38FBC1FFC588F469768858DF0F9EF83268AE10B1FC0A079A5C87C76FDC95DB1067BA50ED02A530E3A2E5D1E70E4967E8C8A8F9FBF6B45EC77D19019EA0A139B2AC3D6DF05F79EE0155EE7565112E5BBEF077636FA86EE8B6C61F1C2D944EE689A8CBE71FFC0654691D47F6826C6593E913F587687936401C2192A2EA245A914C5FD792893E771353A721B40E512E965D4B3D74CD7474F43E2DA9ABFF668E91E620BF0F9ED77D052619A297A8B31B5AE96593EA4274C1066E5AA01F45DB1513E5703A08B5FFDB24578162B7CCCE30C97694957A82A2071C8393566B0D7F86B77B96B5696EF00267C229B4E0DB2176C16D80AFCD4E42FDC053F3A3BA590742843A442470FF0C20745BB3F8BD0F6B61585E01B61E7E560A3D9C15ECB354AF2AE3DFBF72B70593B6D850BCA9D1572AD9AF9B307703EBBE4E673DF932AD8DE96A717F2219586F873473FD8BD70A98342F34BF7042CD218E3F7170E2FFB69BA1D7A143E1C8BA8AB177C9B46151CD0C1746A592B5FA06E5796FF7B8E4FB296E025369B296015C8C3A019001E1257347D67E6E5355384D992D0CAE9054ED9B2EFF76F917B997B31EC8559346D1D9A6E7B468DB1746DFAB31EAD52FC3AA308EBC260582F9743CC15ECCFDEA966576E7603C02A65663014D20A88BD1ADE4821F9F8A4EAB6945EBF119E794173E8EEAC4C4897510657FBA78C3E3B9D56A32B51A5960AA5212B26CAB5325F8E1B0BB849FBC98E5E52139A444B72B18D78F7B94379FACC5EA6C6EB53B49079C5754246285A2DEEE0E188B1C39A8FC1721E4636451180B8CF5EED42751ADA9BA291C7F60937D63F0CFE3819D4A8383BDC5D502ED6ED51D7C674CE30BB09E2C8DA0C798B501C578DABDAD345CC3CA5F07A9A1DEC9191248AA1A3EF35546B283C63D896D203B84697AA91A145BDBAA20C1A9272D9924898F3E9C3C304C57CBE0CEA32E3AADC7404813A691A9815B13FCBA7632B2104E09BA8E17C2C3E448F25677C0E48376B2FAAB271E8E81AC9E7620AE05DCF7BBF01B0B5BC1DD3A386445199CF5857E6BC33CF868F83FE727118A34D102FF7B01A17E884B82CE5BB3F7E6DB1F038AA74FB0149CB5214B63005B4A728056962A63B563274EEB0339CA0DE22B4145CB9E7542C8409744707C0803F579D685743B6FBCE9EECC7AB1C8721948C20A6F66340B5167926DE89999205007486E9A4F00436786720DA42A1BA6B38FAAA9DD239950846338C7ECDE336284459E14F0EBDF3E3357FEADFE1F817F0FB198E34CE1B28D16D21B4F1E2B1B4E96AF48D322DD1AA2EE2898328925040A3088D57035DEECD5A47AB7E56FEBC3180E0D170AB45ABEB7F57D06BB42865420EEBA9FE1861EAF2B46B8EBCB4CFC363CC1EFA507CF2E47EB4CB18354B339768841B98715D427E734AFF7DD0F922DAAB4F6D4AD9DDE978D88ACE5DB6756FA3E3170FBC6A48ABD196AB3D2D8A48631D12AAF188FDD3C814BBCDA848A8797513430222E53D39E0C8A1FC33738FC36F5D8D010A40E48CA3A3649DC4A272EBAFCEE6BB0639890E05A8E232401B61E32FFE470C93BE9E23DF4386E071BC5F3639ACB954F9873C5EC7C08074D0DDFDD1E017ED36EF99FA9B62A6CAAD72D5511A89DAE5103235836B78D24FE20CA4259DAEC66ED130D27538AD66CFC2B10424B76737C36E3790E46B7E0AAE56DB1F6834043D99D5060F6EE9DF143D9BF1918E8F86F0A780EE051E7C3960159EF46E8B3DA6AE8BEAB9CB781B2D210164FC7A4AD9CF6C75478DBC61AFC59D00294263DBB73FF8BDA13A17F7EF4035F6DA891D14A36AAEE1E89ECC51B1FB5A927B33AF3B0339925D0118D3F59B881DBB512EF4F94BF53E31E3B77A6FAEB9BCA4789E56913D01E68826DB5849F9E79DE0DF97F91FB88E0662E8B3FC8943DA4CBEA98F7F9FB50AABA0B539DA20F94596E958C1F27C08DF2F95C9F91740BD77C9BDBC1C5C7667DDB47E4F79EFBECC24D51C619A2C6AB0C2F9E0572C0575E238AA127691E7FEA786D2BAFF88012CBA7FD08516EC726F3042AFD4D5479E6DB61234DC3A9B09577963F7F3547375221DE6E8537BED5E24AEEDD9036A48FCF16F00C3D08CE96EC3F9133ABD1A52AB8148D38429E68368DA4C81D7F9D4672FA0C3F0B6335F98DBCA2A0145C8E9C0F2B013C4137176E1EDD05ED2F8249CDD56DD0AC9ADAC4B637163B6B3F58344A8BD3A71453084D0EE267A363628F0A3E6282DFA5DC43D1157F84A48371820DB1DDFC8B678E041EBEF38E84CEF49DD240689EFC3591809AEBD747668D33A0138B9B83EDFE1A6AE19373122B04335DD2C9BD4BE8B1F26566429469377EF7D32D56491D0F9A25CDE54147E148EABCBFF5E786CE5B05048850F9F83E3BE2F4EBC97AA4773DDCF942B2A4D3BA07F444BD5DD1713E3D261F28C1A8FC6FFFD4BB6039FFC0A50D509023F318C6852AA796352AF75610B3C2A65500F7FCC6502329B15787D5490897AE664D3848970B6DF4D43AE89993BF3C1826CD5934ADA7C57C0E645A32BE0006AC46DEF3E1909B69E8ED8CF605C8BBFE6F94B4FBD678810CD18FB1AEEB386F8002C809774B38841B289EBC2A1C9F58B9E11EF496A768D12920D728D5DDFF68F3812A407A900D907E1333D36BE485719375823DDFBBACEC1989D1ACA033A66E87F85BC85D7D9AB3093832AD48460646A94EDDDBDB912BF1C50A65D226100A7C43A7F7246D6D0A5F08BDF5A5E58557C40B188E18D92A3F8A208CBC98AEC3351C118433B6F046F7A93E5F6B8B2149D2FC1A5F65B5823D5314D3FAE57AACBC80CA58FD37941CAF6560FE46D53F443FB0C9B0DE1A756D0AEC687B7980B528469AF0EF40E0C3C2BF0B35A528F4FF99A5ED2782A73013DD57422DF98889A24126EDD3DE72903536EED1DFE5665981F44E0E760BC37BF2FE9DF5EF7516BED5C9F6534C33A036C83426C1084E8EA70A0742198D8BCD1BFD9C702EA902293FE822358BF65663DBA55E30600220B3C5DA2ADD044DBF44670DE948E061B5C224CA9E97582D3339A7DE20FFF03A8DE1DC765E72595DB8A2976BAD92ACA2B8FC60F55B7D4F62DCC4905D1526BBB3C549C3E506B80247C4D6151FDBA05DD86C88A284EDE9DF85DB46356E7B4607F0EB82242F8F13C3E5F4DE5A528DD021D62A45961F57926CC69ADA637B80BB606A115C2FBDABE0248241DA205120D438EB5CD4EBC8BA249F20F506BEB43324626F23BAB57B8631CAF8F18AEA937344AA0A2CAF64B8F13B370BC1B89D6EB357854A60D65CAF52511FC11D21111438C1567C11BE24A9ADF5AEFAA9B29AFC95796D79DAA0AD84594EF9A5D7D340D7CEFF4B275FCF0B89E9AA2EB5D534506E43559FA54ECC47ACFDD86C1EC0AFD0BE86B0D34668E0751E633AD132A6B4F6C47853FDB50057317862AA4C2E0F99CE9AE19810F596009F42DF6F4A00610464B2D74A23F6725A2662CDA6A084B56B67CEEBB39FF14D2ABEB12C609EF6F2801533876D8CF7C2C774F00262075EC575E2F98D41057BD9A2CEB98B212EA14E25AB994BCD4D3624D677D844E700368441D3ABC0F481C0982A54B185CE87E6AD85CD6B997B6C4680D440227847C5263B544EB7DCFDC229B46ADCC59529CB5661CB83AFB14AD154BB173C200A98719EAC58A8023A4598C102B22EDF9D6D83168EBFEDCDD5D929E817CCA00FF3AB3B3A2E68004D732A8F21FE1080292F1F2DCC071BA7F201AD71C6742DDE2A24C5D50840933835C1DFE4B023876F13CBF6E742F6923833DA2DBFE6DCF201F86DCDDC65D22EADED2A398E03305C2251DD259F96C6D886D4D4A9286CEDC8E87FAAC5A4CC7EEAA59FAFD8349F0CF350086A252EB4158A89401631442ACB46A9FB65D41757072DDAFBC2C9BC551099B9439C68DF4546C53442570A83836E074F67951423B041839C44D537B24A32827162E28E102F838094DD5B1C2817E0608935F43DC86479DB0D8C688665968134FDDE1421E69A1D20468BFE6E3576C5BD6A8AC054A26C064829020F49C67D2148306DB721CCC2A26A3D9C4081E0F925A862EDD2140A4387A90464817BB49E0E3D15C8BDDD0612A3EBAAF4C86E68FD7C7488FC3987380002572269EA0F444E2AEABE0F10EFC47B090102A96D1D96268F8547531F1A7E84D359AD1B162258F4AC9F1D85277CDCB7A6174D69A867C4A21ACB899B962D5D6961D39E618E7023F99D7410151B57CA9440D88B2AAA73576BE9C4A2EE70C9EA51EB3869CFF5A64B955F3AA00E66C163A50C93B5142FAA84189528274405E9C8A479AFE1D153228F07EB6EBBE1FA09A6B906AA6C1172C766FCB1452608AF83CE3775F68FFFEB6971281D2C8EA7C6B50479AF75FE08310CD7C68AE6BA738E5CB3B5C683FB77D162D425995C5DCC042D7C87AC76BEE1FB0035D195E8E9C92252FB7FCA065C746945794FBEFA1A8A24959F16721DB25F55EF775B50D84DD5F25132DDAFF74F67564E494A4DBFC09BC17407037300C22044B450B6B4BDA698D10F8AA179C7469220945C342A63BDD05EE9CD004C014D7BD902E4A44CDBBBBA1DC60E4542288F1E249858CCB41AD28572E1A130D28160017C5ACD7ACC1DF91DDE53FBA6E06E10261067B2364ACA7B1B10130D3372828F8B7D2575B216AB867823DFABCD9FB9717BA5C93C6357DB8F94C7625E0446626EBEC3553A11DA68B8C3DBF904666885BF0604FFD1084ADC12DCEC4FF0B3097020FAC945B2D5134FDE5984B83D3A4EA27A92A894B2813A9F73CFBB8639809B80F520598B2BBA8CF2B3299CBEEE9A714DE33A10F0ABA475630DC8252BA3F940138C34DC2F2BF7ACE976F4294635D7B1A0D9D3FB7B6E0C75C396BE98D846AC5B10145255A7DB0C8D48AD780F4C65ECF056BF63922A93DAA4B53F4EDDE8F98D06EF58071D1CAE491FCFCEBF1C683C9386B6BD3953A7F9D0D52437599AC00EDF58910C7A78533D2F587C44881851520BEDA20819899E9D2D41F064E8EFA2194A5B338BAEA3C97D4741CF606A3C7E36B8B92F0FEF9615BFE4113A00F0B9111F74113BF21827C14877DC402238F1DB6DC504FC6E8A022B05B391EB2A9A3D60AF22607240B623B4E4578EB27FEC200315589C337E7B6B4707689233BC534C7C306B50E7431DD5425E5D06375EF7A8239F3BEB5E3EA1B86050F478EA8F1CFAC6D5B94E5D7711E5C4712CBBAF3056EEA9F1A4300F7ECFAB2B75D2A0BA70FACD263EE34ED33CACB50891B22990EBE7F967BAD012BEBDEF4BC908F8433B445EB6695699540396268CF8C863B43CC8A90F91B32D058EEC692D8523AF9C981650A7FE41AB3F245542A43145F54712AE2C9F490BA433FBC51EAA817B630A5284EC1495A0D6DF0EF95727A7EC80FC4E781BF1D9CA51D6F7A19253D2BC52C12DA46A233BC7792CF64FC5AFE3544D12FE340EA325DF1E9C81B0E7B6B95D74EDD62CF1D3739175FB81A56C93DA68517E930C9BB0183704989EB8A78E5AB47E877B54736DFB1114C464C08B069F25F87CB240F4050E99CE076547F2C4C052C978327C71D50C4BF72BE6FC3AFBFDCB4A25EFE102E654514457DE51F234C35A963B937E5BD326167561ACF4DCE6D09A94E3CA84AD29EA46D1148782DD766FB15A90EDC535B5B3C34F46960E530BBB5107DBA02A7AA9FFC9555BFC799C090EEF1F98BDD6EEC3D0BD0D92A5DC7CBC63E6412CA83AADDDD2F5BBD4100C7EB9C5A6B4D05F5351FB467B9F3DB9130E45ED01EB341518CEA0E7987C42FD482B8E14F09BD0B23F0B87F6DFF6D2EE1C8C7F24DFDACD5C271EAC8AC832F1E99A1F326F0C01137371FAE2A6224A3B1EDD376BAF1A9DCE2525ABE3459F6BBAEF9107D1EC912E5CDC631043FF0305B4F0DAFF8E7FE2FF1E8E854BCE05BB4895786F834C380CBA5897E40BD98E13AA6F4F622A12B23AF9618D8BCEEB2D92B14DE2CD642C71D84E9AAC747994F1C4A46ECA2C6AA56793BF313D6A9EAEE0979FD923C6A38C29E0545D3576313C91184F462DD9D38EA481480E638BAF4D0DBFC93230BEADB05B1094ECDD0CB6549D731D9CC13D72477B0F9016081067A5E36465E9996D3D29D7553B9123AAE0E1A17B2C517F27724DC11DB73A5137A9E574E07E7D8EB69A805B7D13FDD44EE29561E781B88656C3F3F4FE33F983389943E1B3399FEB4E5358C432C6489F7DBC0D42F38DB65CFA89CB8E3E3AA051F46EB6DED39582698BC09EB9B7370A38E89AA5500306F92ED5D2059B56911CB2314EDDF73334A90CA927526827DE3255C514037788ACE1115024F3251D4C47D2DC945AE9E1457CD3F0786837CF4492AE5B5C8CEA99D09AD3B75F05FE0A55484C6B67F5D263263F8FFBD67B1E1D2BCCF648DDF97759AC1338C46541AEDDE8983DFDEF9F9E1E66B30AB60323E9F90336E3178C5D6C356ACD7FBEE6C6381BA4B17B67F8E080F633252E9FF5AA6844409267B1A94A81EB1B18BB2FCF8A63FA5548F851AC87EC2633CA6C5625C3D30170E8896B495D9E30B54EB86E8D26E583DCB7EB381630991CC1FAAC786450B3A541A1CBD49F416B0AECEE4AA0AC66DEF855E15B75DAE5D6629130E503C55BCC37C4E693AE3D3EF8A6740F7B5BF9E9845BE3E2C9BD58B17C7B7AA8C37A6220A6A1365C6A2FD4A7779B53C84CC8A2DD65F677BCDBBB9DD8260C2B86EBE9A1A4DA9260C588BE8B503D7EEC4E44A268547885FC111985D8F62EFAEF074AE60F74EF8742DAD2DF9950C400AA6BA270FDFA6F59AD1F42B86B2894EE62714D76E70B2FB47C6061BA4C4B152A73999F4C14830EA3A5DEBA95B6CB6791DD78C8EF182789172DEAE8FA2311A85FAF0B06D505BE60DDA6792129045D7F74DC686FC7F9EFB5C0773DDF0D55FE79F42C8330DE9F28E79700954758008245C9D64FE22C6619B0C523CA0E829AFAB51A5CE6FF7C875F7E5E0F7E51AE4E1CCCB807EE8CFA12C6BB6BC0C897FEFBC313F0C3F5DC8FF7C6D9462995C0911A01A5F1DEDB486DB24A8BFB1495C5AA33473B9AFC23825F9AC0DCEAF8907BE0C68E7F2C9B81C49E2CC426240B175CDF1A3E3F547DB2206B4B296FACA4D971399BDD05EF376B45D4CA707901ED947191549791DA9AD91A094AA4530EF2052AADB5FADE3E903D13F75768EFA0372331931758FECA1AB12DF3EC911807A2F7F1E4D4DBDA2DEC1A7F63CA7B99C6C709A3EAFB65CB8AA735858DAF35B4A8B17684218C5EB218E304D3686429140CAD8FF3B595335188DDFEA855DA0466C549A9E73695F3B28710525703F3F9CBD0310493BB2C2EB427E7BA16C593D6C99887BC1229960E2D369A20EF6FF9D9B67B3AD12FC88022E288F5DEBF71F13A5D5C8E8DABF6ED93BA5B2EBFFE8E56273F1BF6B36FA20EB22A45A80115D08CB4944B7A70D51F6A7E841F455DFEC68CECB59984FD9EF7AC2CC76C7D31242633F0D70952E29E618D5FD0365E48EA63C628632FD63470BFD316B3BF06D500901BAF4B1B8E6A5EB9E7D1DA57DB5762A1E60B1797C5F5308EDE0C058E2525DA6C926FDF88B89F6B716D6299A23DEEB9AEA6605DE8F3D4C543F42222E171109BBF8A6A5C2481D1CE93FD146B9D25449FC2D8B88F4CB326A4342964ABCA309ED9FA83940EC85F75FEEC5CD9B925213C7D8186C2F8B0D8DD3F87B898CF933ACFB8EFEDB4E1D261000C6893C8DFBAEDACB6BC360EFE373206B5E0723B706A6848E4DE436FC5D8C0406A7A1C4198EA387F8186B14441E354FEDE42A74C6C14F19C158DB976AF98819035E2BFCBAE10882F7BB6FF50B032DA293A0BF529488CCFF354F957C0977ADC68BCACE638EA664FE9700D87921E6CF2512CE98773E61D58B11C93642C9FB5F5E5D7CFD105C916DDA392642DADB3A5F0D5CE95B5D3194190F3C36BD3EF71C8374B5E6C2933CE1D516F74B9AABEDB787DBE8374B158DF14B2E128A8662540B15F1F42755C0C1070F4AF78315644578B3F4D49CE945B3CDE44F1253FF203224E8C2A4B3B9A538A0DDF3609555F0150A7F86C42EC547F5527F8F9F6E7E336E61307BA3A47C28F919746A4B9AB32BA5F921568D01B030AA9BBC70995ACBEA53FBDB6C8E3F8AC48D1122FC8A82407E8F1ED092C9C96A850A0DB444F85343F7A2975202565BB56A3B6A4C97A22ABF3AAB73E47FDD36F36F40648E10E3C70D50464C78E6059022345E0D7433A79EDF359C910F73CE92D007CEAE6B37D230AADB277080D5CA61048599F28DC4CD918E8FD2EE6C56C9EB5F194782A2A098978AAFB1F83F39DDE44C32B1CA3EF231D40FB20882069A8D3929E76D368B13A97FBF53CC317F9D48F5675ED7F6C4DFE86E4A1E5C10118867BB350B4C4AFAC1164A47F07BB1317D01A7AAAA6BDEF65E84503FECAF5F67FCFE27382D1FBF1D3ADCFDB71587757CFB2B2DB1E8418DE2EA8ED4B20C1887314BDF79B1A40E4DAB3A46BB21BDE957B3DB368A83608937974DFE5D4B41D78A92CB58BDBD93A43F449F2C44BCAD4E83630C08177E236325408CCB0EF3E2885A053DFEADCF8252E79F530FD884AC1EF5895D663FC49BECE845EA2D9D39628651250059BE6E8C3FD123680C0143F5EC3F99B4FEB073DAE70880DA6FEF7A2529FAB8F3744252355E7000B82E1FD5210DA380E6BC07998F8F21D7B6919347EF4787FA9904758D0BFE832FD4100A4898684B761662D964248C93D30B3A450C5D5863C503523629439519897EB262634057943BA13FA509D9BE73B70EB79617F9D9959567C5CE1988E31131328936CCB7BDD6CD17A8EA3BE1089658ED902E44A7708BA291A928E5508F9436B1BB357683A2DA55BF33FA07E071845127CC4B74964A8AEAE127CD3827942F3C118F9EFD4B8075FABD795E5C68C4228DBC3321FCC81ECFA59294696A80EAB19491BB43EB40D5980E6967BFE188B546D061766B952572EB00A81F4EE57F33A712B3D4DE087F6BBE4A440EF17F467A7BC3F7420FBAAFF8C55DE3F8C9144920A0AB2E0999CF408B0222366F080294C68464E5B63CBEB5BEBFDA799D731C59D884CEFEA8E072636C7BA673B3E19C6DDE584B2C4B23D3C76A3EBEBAB85C3D78A2FC77C2AE4429A9C695D7417854D7742B1706C5E7F8FED42844F1FB37F9F0860B3D0730B04695950BA8D8D7740B0E10A3670CD55980544A9F4A6D985F16273737CD904126FDE886ECBF12EE8187887622E1E14D9BD47617C6C08E09E60AFA8E46B3CEA2A22702E604471E8BC5E7E5A2C443B035E8339E8C704AFEFA9C5F6DCDC40048F8446A2FCDF3C8FD1A7E4EF5A228CCC718BC22A6021074118E664CE2840BC2AD120668C6404F83CC8A055C7BF813A2DDA217A771523B264CBCABB6D50D6054AE07763BA1B74FCE4A2F66D25BE114DA3FE373B2A411ADD008437B98303DDB4D7D65002C055887A138D3A7EB9B48CBFF166BD075D486CF6B4926780D4FB48B064F7833B4B8BF5F54CE67671FCB8CC2A581FD82C9227101E31545E403547D1744231BF690AA88899786F6A328C14DBAD66E43720ACA989D568ECA2B07ADB33F12479E4CDDE648F9FDA6D15AF5E481696321905C5F46CD8D85F79F3FF0C333DA20ABE25FDA1D51B4D575262AE80C7F903F26922A2E927A5BBA9E0C8E186B07B95BE56897A44FAB265A2432C3E48E638AE50FD586EC9D05735482F2D72896E6ED49D23D8ACB6112B7F102F5AAC62D9904C53CD915C84376F66306E880AE20FA496BC19D809FA2D6687DE2A742BD19D3F432A3DDDFFFD1FFD4F0951924348013FE34D0BB3802974DCAA9A80C6D348D8FD79546E19CA39075CAD18CA59C3FF73EC08100B17AF41211204568BC1A68CDCDDC0519788864B9FA833300FE9A9EC1E570FF283B9FEEEB4C1D81769BBAEF15A23CD5239D4DB8720AEA5A10B85D218038A065F88F7B7F5C6B64C6BF95A8944059DB2E7862F827E5DAE0EF43CF4B512CE0ABFE70FACD199961A98D4BA7301F1D7690C8E1EF3518932C7F57087562DDE69E4F1C84EB81D6C766C372F05108A92A0194D76473FD77F87BEFEB8135046FDD6562C36A24415C9D96DDC945CE8FFE5167B61C407CB84F97E38A796FB58396D85101950B7F0DD1D9DB8483F71F81C22D443EAEA2755DBDC183506F1FEBE3609AB6C9A12500032E86EF6979CFE0D695E6DC28B10E15AE3570E566F9BF3AE6E72C17A317E839D3008746290DFD9384BCAED5FBB0D2677ED5C34570A9B83D2230A30273D5218C3E16032BEF1306A1BED674FE4ED9D3C789E5DC0C509B135639FB7ED6FF5E0BBE8E45950C8910FBB38A50E57B3F75DAABCE7C9233A1F80AC38E8CE7201614B4BE4D52A67D7C20F7C469ACB3002FCEC78E1E9978352A9A84C94A29BBC860B9DAABA5FDC91D9A50B4F22DD911F10BD83B620988F6E5F610856E22E50A595634C228CA4D2F188B14DEC93F7602835E68A8EA278A31B5F005F9431C24FFD2DF342A6C0F0EF4CE9DC9948C214C69F04DDEC23DB9A41A5095F5C2DBA3B7983CD1A3C3ACD34F0A497EA7149BE3B89FF36A3BFC77566526765C4EA35AEE1306B56A35692BCDB4C1E53728CA5ADDF6D39F41D8ABB4A10123AF11CCA65F50644FC3B743ED9A5A1BF30FCAB3D5C066C9BFB98B5A14C423B4684085464E404A9FDFB150FDBF61F36363B27412704C0DBE6F397774C084E690A5EF621BB8EE89B09119B80EE071D1ABDFB2060BAB6F741C5D6458866CBFE3BC66E124D528EC3BD4AD8AEC38EDB9F98F6EDE83F065FEDE64A881EA459E067876AE61CE6623FE8145FC20E61AFC7B79A21CC5D89CEC8E3DA927BCDF0920C24E45C9CCF45D0E3AA9EAE79DCD98A8D80F7E172D4C169EC2CC0E970E8977E984FA6F399B8188C29D1A06530B79E496D296F2FC3209FB628092C61B423641B8ADDAB38BC0A93B328263FFC3140A6202F87F1061172FB7D141B58E508CFB042FC2C1D5C11338AF717FE7D4FABA4780AA007138DF8B45571F378D76707D8598C3E31224653C9ABF2608EDAAE0F336E28555D2541B0456E4DE47FF7F70134513F99A104AA4549F0E11C70542E38F63120969AC7BA53A3A79C49B9F2686E39B492A78B1DB6B73B5E7C0A2E6D84DEF68986EE6E83CB25CFD502386FA5FEFCEBCABF456E44F1CBCA4DA4E3417A8E666E4E07DBFFF75C7DA720D1223BDF97C9F9E2E417F90C38826EF304DE9DE3A3B266F18FA64D76AEE7CDD306FB8A290C0E613C91124F4DC369315CAD1920B4DF53D63B0C05FEE118DE95E1F3CE4870769E78C1201F0D6892B5DD350BF0FFF3A4CD47CF10EEE7C0827AC73A4A17AA3FE2DF664352C15021A24606ADCB4801FFE5F1F4F56BF9E97DDEEACB1F947B6A49FCB09BAE73A1CB784B1B6B4A30C09072333624F6824D6F24133DA291BCB7508F4B3A6B415AFF8AFD66736F4A8E44BB2458B9B90D8B5FF68076D4530261439F471B34F8A8AD93FC808FA120B8DDC8D93D6C87F1A02E0C99FFE36CAB21FC73AD314453D817CFC1A717807C941C3E2707D492687B31FD20AA57D80D7D449C6E61EE1C18FE18339D6E40F689AA224153383FB514452006726506DF1B02ED4F698D8BEFA201D66B7A60D6DC31140EAC355045C25834F867BC225FC31A8552CD9085E93AB044EBDB5940AACED40FC17C4D194ADB2CE23C064830066A9C62A9C27D63FE6CD5B7CAA76F824212CB1DBED3929A5F853A1B06D6DFCC1C06DC5D72E8D73B89C4FB3E7BC49DCBD77F5BE5AB40EF283540CF8EB08DB996F03392AFFD3F3EDF10979A28559291999C2B0D29268004EC4BBB385C3B61CDA219EE01E2680F4691AFDFF47A19A90FE177418FC492B0B6502F0614D53D8CBA36942FE36BB85B392B3AC8206E3D9483172DD5FB1C5B8049E23BC84E85AF9D15C1187344F285A13869A627880243833BBBCE99981A57AB39D7FDC120730DEACC4DAC4DD2F0B27410FC922D1B77CA4140B22A50FD42BCE6EC19D80ABDF7582F380E80343EC0775DD6EB1704BDA4DB631F8169BE3A65BFE8BA74511715E4528584EC106A1A1A5516BA33FBE1E82F3474665018FDF8BE670D5DD5A9EB41D643FD86815C031BC2A3E1B3DB9674803313CBF234283453A0752CB92D1CBCEA028CF354B19F88BF9EE9CE6D5B6F557DE64D47C9A981571D2926F5628180998A18EB1913C3CD49AFF379989F92729890EE1531A3D4E204B9794D4EEFFD3BC1F60BE82FDCDDAFB26BF8FCE91C6FA6C1A03099AFEF3594ABA3B90EAC0E937BBADC9FDECA3B1ABC6285CAE04EA428972DC627AD235CF49E0099C1BBFBDB636E5FBF08507EE0FE38E92D722349B5A5AB69A2003070D179E3C2F248C25589F1795D65186E744CE97D8F0F703003D914D8C7570A862937387FE7F23ADBBADBBC96021FA791C4D21EA39E2530E92304888C9CFAEEC3A48154BE6F2A6591ED3EBDF520A35A6A9802E3CA495AC898125D993267ABF82212410ADBB0940D6B4D2457A28DC4E3BB62AF645DBBE52F2D45F1D943A5D114A770907C8DBD561E03AE2EC720A231625C58FFFC5A0FE41CAFE4064EB91B45284C786C6D30949FAD51D17F23D6603D39CF10D1F9D5E230F6645315B7BC340D4625E547823390C69791FB6B89E689A5E462AB3C86DB724E75CFB4E2571A2DA2E9F091656B52569F7B144D74F8268B01D2F9DB325C73F0C5613BFFABFF28BE260005FBDCA3973CC83F5ACE3B6505FAD56586DB3DF5D4F0BFF1E338FE06A45B38947199F6FACB929C5FA51575BD77F01743E15E8C2EBE156DF37AF0FF134B2603EFFFE7995A51BC414FE4349430B33F139F0FA11053E0E20A87FC70DD80A92A117EB9D484677845B89920BBFF67F8947F38C15681AD6FB302A56E047D1A5A4C518AAE10FA9087B23BC9D8B5094350648EE9F9A309B9FAC52BEFDD0F46CC2E14D3734D5010184E6340238BE0F527F03BF69562ABCF0469772AB27FB1A10EBCBC6AE9FDC170E00CF6E983298F0622EC8A726D2CF1FDAA45E287FE925C9F6FAC93A5F0C5DFAF1A302ED4C54B6155B090204E5332DF90C17729C7CDA20198F1DD23D1ED4E9593F10451304B7FC41D747CB7C9B03FCC6B2FDA2B3E7962E6EFF07F01AA18D47694FA03CAA8F0DBC55BB9BCCC6373A3B97E885983D1C631D828BB2E9756B3A30388081AC58925B3D4E61077A12F6137D07473523D48F251B9573405B2E6BD92C0C6D286E87FCB6F8B70049D2DDE7CB53E72CF9AF451520604F27BDB630EDDD25B8B511FBB1182766BD40233F1C2D15A87CA323421B7656CF56D80F64D50AEABA0124AB05272A3B852948864E4AB83F726B4FC26C4AA6DAA575EFC37720EB5252D1860CB2688291E2F5E40C35F348F78ED87E619D07403211DD7F193983F97D8ED3765D4B5CAE5040E9E22C78ABFDEB48DBD43CC51350A531A3978A48BCA47B77B47D13E95F4A8A360B96DDCBFCA8CBBB342B2C3AE51CC1B340D43546C787419EBEB1ED26466E67CB54F5E37F0E6793E6CA20567EDE047ED5B39BAEA2B35F33C5C6F5AF1A3D6B266EB3B391B8F5CE46E2A69C0B2AB3D71DAE0E3F5DAC1474290D64A13ED33599FAC9F644640E79EA10F0258CDBF57780A06621E70F03C72BEA9356326A14CBA86F9EC6B40277E7CB737B70DD3D9F593431FD7BD8C39B3048713E5E66DC4E8B74938E41490A3DD6FBF4EC7012089FB88740BFF62ABBE088269B3D3690C41F7B3EE3FDB6FBFFF97F1BFAFE530EBEB1AB1E5A05736022CEE7BCCBA21BD2DF47E8D9EF70015CF376720BFC6A4D082763F6F9117664246359DBB450A4ACFB156607FDCA3952902B53DD6DD99FF2181367F6B04FF4A84545BA7F5FF4D9EE21477E9A73508B9FEE38932F3A3A1084BBD829B28CEF050813283FC985B02398E3DFD75D775E9F3D48E0636C21ACA17E38161AE62460C4B74244B53BDE5620DC4A2DC88D240181862A0F67550FAC911090076C942AEAA1DF8748D5D1D5C53D271642286816C3DD2C1DBE5124FDAE49375B2059A709297A5A9FB9CE4A25B8745D196203DB383DEEEDA9824EED9A6FD1AA1564A9F76E434ACBDED53A31713C2F5DB1D611066FB5585CFA7714AAA0948C379454D304947A457F7DC00D04A113686DE0CB12B7F76C2E3C25FB53571E870BBD59010438EFA07455015BBB87BF1B770363C056E290F8D3D258C038A49C54A476BC4495A790159B7A27263F71A0B11E9371B7ACADA80E20F53C45A077A13007A1EEF6E527DBFF7339B6488337258962789AF0AF42F174762B38D0A2A83080F706E24638D217B2C937D1B36E2E76BCCAFFAF7D5D25F43A27F8CADC5FB716B17555A5DFC79229671FB0C5E11F871AAD1CAF9842219D64A472249D80DCD3CD62C63FA634C9CFB78D1E6A23343227FA06EAF45AB3F140C1EF9100D267F652D74C874B88A92814B6AD884F2DCC836E67ABFCDAB7146544680798882862F20FE41AC30B673C983E7FF8E3F4996DE6CDD40F99136960D996A7C2633496C6741BF387D3BCF4045987E130E392A3C44342E22B91A6007354EA35D2677C5E99B59E4A4E330498A1D356779A22FE6B41EEB1FB802171319521E3E0D88F806CDE2A2257BE42B3394DAAD8B52843419A5057B42BCD4E30C9154800F4A93A27EA6334CA1CAAB69489A9661D3CB350CAEC4A58942C706CB5B75AA9AF5EEF54C9F9D0DBCE4318FE2A618D185E781BE72F5684CB26937A4566284132FD0079D1E41CC10977DC3FA255AF029D4EF3186FCD88051C7CA772869F1527315441498F7156D8D8E59C8A9DBBB3F1A2971E7AD37B5C2316E9EB61D1235F65C4C0C7DEF2FA6E5170A1EA8583BD4E94439FFD7BFEB1A217AA52E532EC25F23E50FC57D2E6DBA0063B750280908B618FE4BBDAEE308465DFB7E9BA32549DA4CDA7592EF94D5D51788058C3B4CEF3A82ABC8D0D0BB7747248C9ED0775963865A6C0E2635A2545580FD9FDCA0F70BBC49417A514E66AFEAFA44D2599D048E622E3771B5D6D80ECBE596CCD17734EC3B5160A00699EFB36C1E79397E096AAD1FC2DE0C83F89FA2AF7A89DECCD28582B53DFA2C332847040CE2B8EE5610455F9FECD92BCA01DE1A0D164B0A58D8B5206DE37D16487B0FB23EED3AF686A222FF9802D3BCBA975A85C005A160D56CD1A16BFEF76CC711566C7AE69E11959AF74FD462209CDDC30E7D21FEC279BEDD9329EAAB7F00FD764434CC3A6F120149CD7425A6E32686CC659FCA1D7373ADDA3601D5C03C8BBAF604ADB2D175B541AE270D5A8B560724650C5C99EECE41EF789E2DAD7282293B45D40A39A68B4A71B0B0572FAC044DBB41FC9CCD4B674EB9902FEE647A76E374C3A4CCEC2C8E494CA7763F1324D6A419C9046D97F205CDBD41025D4B870D5B37DA8753A3439235CC9D9A0B7A30EFDF6A3A16773FCE71BE8A58B9A727582EAC48C69B2722552286055FD03401E6F0AD55B0C0CB38E0F235CA53263497085C3F0BE7B3AFAC52B8CA0E2C97712EDE9FB2940EE80822D99F88DFAC2597C2897B1A169B4C5C5A44357124FBA68C4EE3B02F547820BBD12A2C57E06C2FCDE4D1348308159D5F4F93E96EC03FDE758ECF6BC9938CD91C7E8908A633CE9738C03D4EBEBA662DE8078DA71531FE2BBD2377804235B9E03F8B1C2AA16EE95AB9CE40873AFFF29C17FBA11B2C9D59C7C9CBECB61AF3011CC5C108D4FC616DA7498393A98017629248DF8806938D5E1A9D4540B94704892B3332CE11C52BF8F56F1907C9D4C5A94CBBA865383D5428D09054AB9C6084C0AFFC84429E499E0383E93F1BDE2ADC918F4A610CDB3DCC9D7F00E033439B4800E45AF8D6F6C6075CEF6AFD8F588ADB6B3FEFFE4CF556331DC2866659DA46320CAE9F40B90E095FA190A45AB9B63C61A49116DDEF549758C64D26DC267FE0886098089964DDDC003F7085F288D69E4436688EE44F8E5DEE58DB16BE223D2E277E201000458959AD72E80A49FC609004010108D3F6C779581A3CF7316E5C56DF6F6CC1588027655B6FB1E9CE096DEEE805ECAF47ABF88D9E53F844D3FAD7DB890EF6DF59F72385B55829E6AA7ECF7B9FC64A2FF7F07E2DAB3341A5A6555CDB1C955A206AB8513936016BFB9391C2BDE64779A12AA58B376830EF66AC7591B9F348BC8A069134DDDE5334993AC01D3F3E5869C1ADF4031C8F77835A1DEE54783372AB808C7F27AC169C548929F4F6FEF54C4D59BEB12C075E8C6F7BE16809274A70ECB855D0B6860EAEA808E96C59DC2E86F17AA4F630508FB147E0A8D32C56A36045122C7CFC1B0317AD95226BAAE583ADEB9742398AE1CC7405650FFEDA6DD788D4470A2F54F882B73DE6BE208F37F4275BBFF133AC6B028B7F0085339EAC7E2005720220F56743148911DFF292B212E3E55CF40C748F8B43D624990448BE8458064011C7A2684F570F7FF879CD762E88986F6F04D64DBE9FA871669AEDFEF197D806227061089F921F23EFFC3D218FA12C3A076230EFA41C5548A0C87CCFA03A7A5BF39EC07B3EA0675960492D54248A4757C037CC2F9C44E25FF51FD260BD17866265FE0824B5390BC22970B2499AD0F066DD70594A4295945D230A2E518DF2516A8A5442A6675A00BDD8DF11BAD8328C0F62FE1E3E9736B83952A982A8692C25B789EB2DDFF5B3D8AE87DE338D47DAF0DE0D32259A7AF91F11F7702B2030C2D7CA8453F5417081B06F1DFB136A3686FE5B05630C200A1D116A7385631549FB240D787AE0C7B1B3EF0DFAD79C1C1361D9DD1049A418A1A8A906A4DC817650780F6EF430F2FCA75F5171FA8A49FD6FC14BEA9F9FC444F8062933BC4D4CFC7AC9551B48CD7B456E0BED212E08E1B7E2C0D59BA148EB8DB0AE65C2ED18DDE62E5D15B48E59C823F111CEC9D9BBD15E78D126D3EF91466DCCC48ECA3FC778393C95B06CA22563112A0A0C97161CD3D3619D0A2EBCBBA117C3FD417E8428BA5690A7869DE1A4013142CB04A7BCE2B94890E67F99861881C02CCFEBE5515E81A410B361B187DCF3CC4FCFE2D26FE3004A1957F47277B8EF109000E2FA8DA7565919EC68358B2B88B95957A41C1A5A437E65A734D1B97D7875F7A9D609EA60F8603B239DC2D2102603BB12F1214B9DBAE3315F48E5EEB38FFD8169CDD4B35D26652799ED5E2213F05543540B1A082EC3FB0F40ADB57AEE6CE6046150F0C8FAA11147CA624F114899B55E2BE0D418DC07C6A0884E35338166E26CE61637891D116F18EE3AB3E66FD09BA9F5125649E574A23156C0316E163F888F4E1109C7EFE1B00847F7B88B2EB2CA08E7A5425D4D9F0235E9BACFBFC53AA7B1793BB8A3E14A23DB5820F56BD490F7BA8BAA7CB83B357DD7FC33424A8CC5D7BE03C25B01C4469EFB869E2DB41864FA8BCAF9E81BD9E5D1AEF974C686858C5B0D35AA7FDB93588BA37E461602FEDEB6454B4E5E4F32FCA271A053E61FFE59785796F89A8C948C3AC377ECDF20FC39EAD00DBEB29ABBB9EEC287BE9134DA32AF74391BA7AEB8D3EC3786EDCE9A304094044AD415591D8DD07A38F3F9058D859B04EA72D0577715A1B9F710F3612CD04377FD0905EF0D018730222D7152F0225CE39E12136BABA0E65C6B16782D84719D33ABA3DDD5AB6B382447884063F4900431F362BB229E8004552A6A4EED1A577C9E051DCF6B6F8BB6922D92C7F75FDEF4E0CA94F3D53FAEA8FA999A54DA89962994237D375BD8713D2894A9F2C8ACF264BE3A42963BFD2A4947F99DCF75BCB5153D955485AFA4AA6DDCC8E44BF2CEE9DCDAF8A80F0009BADCDF21DE528464AA5BA90A42E74C3749A23B3C92E1DAD2F6162C52F145EA0C33AED0E1E042EC143340CB9D77DD965EC5CFF20D41CE10B232BFBD30EEFAE982FC797AA60505082CBB83CC84652D7C2AA67A8B15A48A067B8D49666253E763ECC323A6272F30F8A6DEB0C2192DB40B919B6316955C2CC098BD2AA304A8BFCEC3B07FC0BBCECD235BB808599561ED18E726FBE6F8232B12F324B9C1D71647E2E11CDC54810863EB7F54A364F0ABD0412CDE87B2F024CA8F9AD0605FE8644170354D58E19AEF184E7A664FDB642C941D8E7236F889C87CE826E7CC62DE9C4EDF0C3DE2EF54B22C78E534EE2FC3080D93475BD0368E2EBFD020CDE4A641E647153DA4B654EE09A2E9B94D012DDD2E62F32905A58D660DC3CFE47FA5E2F6C33685BC2AC432DB4E2690C753F1C313FCE9BF3C9C56A8F666E62789D3C872B75CEE6C805036CDD2735759B0A583ADCC851AFB6ACEA3209D7AAD1A0D4A5AB5DBB27525D5CEA29E879A884F89CECBFCABEDC2A741CFC05F6D9E85934C521DFA899D576A1012321D3DD1F50136FD0323D04FD18B4EF032F2DBD85944B445730E30F96B643D06E717E2F17BDC4516D381558918110A0E8566BB3B376FAA140B5C153F7A2FA27F8F0F2A04CDDB9947DB5560657C00B11B0FA63D01881C263DE7A7E4685CAFD7696F0776CF92C6BFE365B345B89AF3CFD7B777E03DF9C517CCE649C2FCC7486778FD3A78461FA1C2816499477873F51FBFA414884F8E5CC7BC127180F9FF6F05B4721ADB0D7683AC6D3C659BED4A8234B7EA78B868F753761DD15E0E2B786073B4462DAF8DC5E9FDC5A1435360909569B7AD78A9EE7FB74574EB1DD50479A282F63F8BE9EDD4DAF9A5E1EBFFC820557327E74D288EC02E6CB962C365FA13C74F1C81FB8E2D457993681ADB364C2A47F320879578BACD0B7F8C845F9A3914200749CBA177375E3276FD5A4AD6B95C8287F16B1F28C9FB518D5AFA2ABAC2F5DBDD791C203D91691E7BCD44575830A15561707B14987DCA983145C1FFDE77829E6CB2D7935A3404D72574019093AA1E5A5DBA97CBE7F29FC48FD827F0DB5FA72A03545D14CFB6431A3E178E4BEB2188AAAAC6D857DEB585E8BC5CCD628FFBD9B394E5B3639A22EE57CDECC3D53E576DBDDA47461B33DE073112F1BDA4E35393F1CF474BC57B752FF05957F65D1F44E0D844466E03C7D4DD44C859113D57258B7CF154F075FF8EB73EA9466CA5A66F496EC2A27346E616CF4654D598BF7052640484C953FBB91BB60E1BC8A545F61A4CAB680517E351CFBEBF1BF986B68826019F114C01C9EC23754BE2A53EDFFB3F3945CBF104F01CF0FCCEF402CC1FEF39A821BFCB415173DC4E0EC87B0EA06B56C0A92D5C23DCF8EFC1670724C727BCEA7D0A41F38D39DDF7ED1B50766877E78ECD207D1084220EBF215425249AB8AEBD2405349D38D99356C9231CCE07D28A781446147D97CB39205B8D68A563E326543CFB472F4E8DEBEA66F4D802A0100CD14F1C82BA90E9E4B54FB21F514B2B4C3745410F58F3BF679E2ECE6EDA88FE6EEE3A37B40BE295C42AFE756704D310B4E24E690D1611ECB52D022A6FD6140BDFA49ED0744B02FB1BFC4423F13249DB27FF7D0642451BF0CF94DBF51C5423FADD388A8235F65CDE79EFF4B023D9E886DDE4FF831D17822AD7DF50E42CCB952F71C1E7E47D84D892FF037E1E81B2EE0896C17076E170C7570C57683B37CBDEDD7421BBE8B5A57023E8BA0DC349D8A2AE1B4365FE9652D08176C47EB338369DAE3747815EA89A2D25056B5C842B86260D3DBAEDECCA96C4F5DD2005A3D0D3DE6891A567595F9BB133516E9EF7516F9BD553448EF2C971285042D4949C597FC7ECAE2FF996B4F552D49BD85EC9DF4D4F3C62A6A88CB668FD512E77757D6925DD04FE6C3DA1CA7AAA8C2B24F1945E525D7F496D7CA28595CF9CB903D41418DDF5B5E2927CD8953552B0E015B92425648D20785AF0E2355B5AE942CB42059A0760AF87B9E109894988A1F132D0EF623DD09B82C38228A27F952BA85538D9DD39A7B98E0C03FE838C95D04D787B311C214C2440A249A0C8E239F7C081B21A6F18813EA0F136318A71CB35154FA9F2085EE1D9628D1AB2C7F8DBB8E4F725CEBCD08C44085F99D586315803C74DEEEBD80B1CDD9D2826E59C4C2BCE31B50564ACB54A9FEE0036AD2C194A6C70E62D91E94C0419DDBD92F26146D2130B1EB23C7EEC92598990F8636C78D0F61CEA8848B0E9D756AD0F49CB75E65ECB92C6A79127343EA9FF1331D5432937E4684D06E269BDE246843F9B3D056F23BD1B79EA6E8E2FD24FC64EB2B1F81CD87BCEF85AECA153F0CD44E9B66E656424CA137052E537F638BFEF31E89D034ED87A734096A86B99B4078455EFD5F4DA3D1A6200F42D4C3C3E232DE3045B746E7496A0661EA3921CED27B60BA7303DC7A8C4DF4C634BB825BAAA33FDC3843336A6BCA88672FD98B6E0BEB82367B1AE3494517DEB83DB1FCBA85CB2A5003B8468A608A3D7F6C34EAB5AE99AC400F3E1D156557A4A09AF2C1E789BCBF08B8EBFEB4A8F2203705C065FDD1859E0E41EB24456AB5CDBF38B70F7AEBDE08F1D08036C4A3556454FD6DC0BD6F84FE8249F0BF4DC769FC3A25A08B581D6133546F69544BE467D0005DB7D474B15051D2A005010AB1B619C7D256E99501DBE4F2188C7128254561FE16922445240D52A0B75DD53D8B103EC8F5A006DF655FB2B4636E086FB2635171D008D8F09BA4EF777C8C385A9754DC54B090927D806DD520B6272573817DAB6D8B4A28C8F3C5C4D75A2865199F6E16DBA03112DFD5BA991F51C03D3CFA3503E16FD1054F38F6536B02FAE576EFF083F8046EAE4C31F5775B04A71E79B45F0EC007460C0B7F38A9BB8D6C1E3A04E6B7A2BC252CFF178526702494D5398D4CD4BE135C1B14B9703AD047E05A12D9BE73FC1B2CF9499EBB9D9719E135422713F812126F95F44FB102B1C5EC6E097FE334D1A565E52B87C332A2ED2E8B1DBAA2763F1DEEDBF805F89CD4E27DDE1F48A831903E492144E3FF03C66ED6945A532DD1BCCCC464926AC83C32AAF4FF54C8A27CE20EDBFD1EE5EEE57AF7179FB5B74E7396AEDDA91E64E5165062C73192454B24531F1E82C1EF475C642AD48528E0F9AB35141588D9DFEA9C135348B33E4393546329600FE69DD07AAA8F1C06C3000C6525FE247D8D66A333EADB35B7E6D2F0032708DE2DECE6F8C3738A2E413BDFAEE39D6A5766EA841D21771C8DC54F0C80287CDBB6DEF10CAB40FD265EA787942BF575801D6227EA3A253C1C44FF2A2F4CDE4D6691ABA3325EA47B97A858302183826556EA726CFFFB1718F934AE2E832B422ED2DD76FBD93DB5528B82E9346BB1F01AB6F4699B49D0F2267BC1DAA1D400C335900FBEDAB3802A5FC76395B8AA31083162B2AB01844AB4F3660262437F5BBF9797FF9523A46D72019CFEC505F1228DFFC4EE2C0CE35868CDD53582E7E83E0BACECBB38F8560E68A2490AAD18BE2CA6359002EC87B29A0CEAFD1A48560B832CD539846348D47BA23A8E40E289C64E597DF01DA52C7DA3C83CFA4082F7FD0A4EB2AA3E6067C3532AF5F33028D7BDC62693B52815D61F0D365B1CEC0CD2143B1458C1E99B8EFE53623C0AD8FA16E334DAB5B61D42B9F4159B1F8FDB39FD236BD2785CF7519121E03FF9DAD06C0A0328E244614489E0A3CAFB7BC7F07DB87B2C6EF41935AEFDD35F3A84EC9FF647FDDB93AA80AFCF5F920016B5FB8F7A610944496343B0C5345E5448CDAC4CD094194FEF26F8CA03FC9AC8F65AE78454148C17AA6F17A6E4ACFB5BFABC96313DEF7036BA6A2511EE13771271A2E723E698799350D60C6A5EA823A58C422DFB59C7B3063724851A872DBF9DFFC385032067BBD18849FC36F3C1CB8C1D00BDF550B0195FD1418E29AE8842987070A2041E189443DCAFA109D9372AB0CF938D1F0E80D948ABA739BBE9B24ED2490C8001155A0E2DBE60C4500B0638DCB137A11C516FE86D0DB560E685CA43A7EE2CAA38C0323C9034FE139B7B7227463048D31581FC62761D3D3F6149998457CFE16287BD6BB618FA48FE645BA8E8D95F59EAAEA60DE448E727F93A7E5275C6368975BA9C4B52FC45BF72F8C122B8D10E10ED14EE3E465572A1C4F66149CE6E3F48A7977E1144E210BE089043FD19CED6154680F1A1358B371F9FBD70198F6E9EF6A455195B04B2A0668600B91543C7D49105ADAFD2D2D71D4D0C581C00E163E3683D28ED328A4C3303A5CF7664E513D9377E62EAF5A1820CFA5D64D5697FE87E8A3FD79A3E6C48CE124C1CA9F07D7C05544C89D64A50BAF793E0148CDC72E2686009CC88E22F9EC5AED0308D514A3A863AC15E6A9EEA1A06E1B4E83E5544C8D425735A2FFF1A65111A985A561366D742CC44C518CBBE2704B4A9F594848AF973D0CFA68ECFA7A8C56CE84EA1F494F3DD22124DF99C1C84579998638D1092E2476CF1FCC987FA23D798D7AD3A2E6013CC65B68A41370663AFABB102971C10180BE8954F266D1D4EA91CEBEEB8AA08EEA4F482B80E70DA0A83A4EB35E86577F8803679F185D6C276DBACC004AC37E364235A8109728ADCB28958255A89F6E0070AAA4314A017072A688EF66B9F3D0B54FF40CCC8254DB48C4DBE9CC79792FE64810F51760134F55ADDA8F11EDBA46C7E483DC5F16F95E17C69794A64FA26AE1FBB65B7F98B06DE2D2C2D2AF54E16AC885F7C6DA0BA64C72D4ED62A73856793CB19E357F1DB292B9C127170C98101999B5B930E4E80B7BC69A9705F6F5AB7D0E39C46F46DCA6D6147690845603D1475BD3B4E4E907E47A834E30E4E781B684A941191A41F119069A8A5B88EC929B5E27C483E93491D6FA963600EB35B4B9699494054BF53A79096E2DDA15AEFA72B5B32531F16EFC5FDBE4654C96DB55A3898E8E07333B646BE270162BA4E5E525A0F7CC895CF6F20F54B859B8F707C647C045F330B63AA4C9A97159BC4603F8C551BC8121B90AC16DC2ED21962C2ED555BE2434A9C6264042C61E5A9596539FC5609D61C2DB01666F1CEBF33BFA228BA9C2613331A70BD813C947514C9DF9AA7C85D45187FABFE123E6543537E7D2B415D30902BB00FBA892F1E10F933BC8387F60E44EA969DA7EDE9C16BC9328EC7599C021457FC3035F12D3876A78EB4E2DC531EF0FE08B7508A9888CE723CC8E33116C94E30640FE039E34C43752860079EB81A2813C557A70EDB9D2FC93DC7E137EC33A4BA22177505DAE56FAAFFD84E00B284AA6231AAFB64CB87D12EF9532B9715D6B682979D4AD2AD8F545ACBE2547F4E99E20B3F53CEF15173D8CC8B75F986146A65DF2DE83F36C47F1F4CD8A8BE89BFC60B6BF9023265981094D9DB75FABEFCF039B43F7FAA48D22ACF45BB0FDA01F8DE84ABA8D67D241D2E9973E69F621E56ECD4DB9094FAFE4A789BF1D55AD20F7EA31C0C3220374B4FD331E4424F0628547DAF04959547760531FF2F9BE0D846789245431490B1871FA4F2692A02DB20BDAB061247A5F9F25307BD3D4835612406A92C7DFCB870F086F85A00BE35E8C9086B9F3533C3E1525C84B886BE20BA69AC8F8640017708ABBD6DCF2A439EC29F16BA57B48C37609DD6E4AC42959EDBCBCAF268081B3343C96997F3B2F868188662F2F508A63FE201A4088D6D3F19E1FFC5F1D54E63D20BDFD21286E492F94F1FD310B3552CF99EC6C1C9AB9FB7ED36D44DE605E9B225C5916C86BDDBB7206E37243914F14EAE83B4574127F6D311C891A3CF36DA40D3043BE65A19D0FD229737CDBFBF0A6C2C8452A37C1C88653E24C126905A2A02BB5CCE9C7BAB9716DD23E87D3E32192FCA470E1B703F8D2910C196F27C0CDE7A9C04BB9EFBAB6313844C8CC7AE77382A046EEFEC5CDB650D614E097A18A07AA48E5E092F248CBF222D3EB39F308DF19C8E46FACD13AAB6801CD7C177C87A107E00ACEA686C74D736DD5F2C4E996DBA9D951C4B825A4A3A6E9EFCA68ED57B3CCF2C1E42CDC3232B3B92F225B48E0ABEBA38517D0C7E859E1C6FAFA399773ECB58C83B942EF0EB372ED041F90969D61F5639E9788B1CC4281F6AD65609FE7EC8F7E67A3EC64EF983F6B389BD4C78268AEDFDAA604D363E696CD5FDE42E129CAEE9FCBAD50D5899AEA06FDBEFA73A62D091334EEC7946B33C0D7260C0F2403AFD33D2E4FDB1592F4E2804061A2FAC42DC47F4E738CE01E39152C3F44E25E3926A09830066579FB6BA08D25C8087E5D68CACB3C574B66D7724B768691A5AC69EE526053AB671F372BCE6F7BBFF7D84071C3D1F370B74ACDA6C58ECAF9A4A5D75E2AFDA08CA0FA227F35C6F0F14F761F2E95C71005370D24C41F90DBAB0645BEFCCD60FEC61D9C7778CD2C2EA7F7B4E2403C046BB110A2180FA9CADE1AD669D5849F77BE4A7354E092EE588058C8C338B8E9E703F1802DD5A019E818C52FBCA46CE1D0FDBF5C4874A99B9B8E7A3963D7835F3088D12949751FDE7DB6100C164CEE63467DE77ADF3C73F7A7D1AC81727909E489B8B4E33C529FD31F87E31A7900D3EE744BC4114803F40084629FF9BF3AB678F4989C19A1D26C5891ADE9B561E4732B8E5881FC4D0C2A9C3289BB0CCA2FC7C8FB50BA65350F0D652DECAD95ED8D4D79BD317E22007937DF52301DBD7983A67904E188BEBA616F373FDBF3F9AD3BF4B2279FB138ADDDE131E47BCC6C2D70307C325FD2703DB6D4C3EF668BF303819978C34146CA7158C651609BC81683BC8832C755C6D4D0721CBB24C7BE8A4D4276A2C5B7D276FE7C6BF6F1916356D29555DB3D51DC8DDDABC63963CD8FAD83DFB008A1A7D367326550FFECF37C6A18B0D94D7EF72C9B0525BCD54B9911A8DEA55CB1D57A0D6BCC7C3997AC3E316FB1F9899345F346C91B2BEB2A1F5656EA889AD33D0E7C9E8D5169CE7B811B5E7AE2F44CFD1435C151647F3E1D78B7FE7EA2A1C052F9639106BD8E981261622B650DE7CC6FA3B8F836F39FB4DAADF007272933D76EBB682B799CCF11E93404BF0356BCA7F87A71A13DFBCE9C8A3F26FAD90A39C13B5F6332A09077FA98E805F2DD40EA7C0204E176FF88F4A5FAA407B4E7515D00909E077A2201A21B049146E0838B048B44BC19E778EBC95CEC57BA4114B98E7C53A5C801C36D87EC0F6833FDB392A1B7FAAC5CF8592660507E436E566EC7C28CCA209250F808ED4BE2DBB69AD04B0DEEA64C692D0E455085F52A4FBEE33EF4DD9F34E71188411C626BC26A0BAAF4FD396C220BEEC63DA47E7418BB8B1A7054547BE0728ED2AD317F8E79744B597DBD25CDD9A53B37F5D27B0EA2886E4F48A833343C2C82489201C57451B73B0DF104CDC841E8662A0A8F74B24760225498AEAE6E0EBC64B07931B15E8FE2DF8504365EFBC84681A8BC68A00FCABCF16DEB6E86B70B4DC18AC5EC38F7EAAFBC12854EDF696BB988AD44E77669C960D83F832BFC3C1D019569378DE3FFDC5658C1FC7A272E2EE3D554D022B0E2ED220B83EE40B9986F9A44B22B47A54FB5B3931BC802410820E778301A85DD6C4F681ED4E36B1982C8FBD4822881972BA5A333FE729E8C644C72D4F77005EBDF0ABF643E2F9020E04278B47A69FA5E48615F4585CC5A6957E9CCC0B9B2093BE6D1F9911A5190CA6D1BDF23F3EDA2B39F45C2993480274168F073ACBDFA09C415B52DFD14F7D0C0A5009EF5D5EAB067D7A436F7F36073FB56FFAA00CCDCDBD9321AE3360DECCC463E3C4AD613660E6851C0065A6BC7EFD4493B8467D1D5BC5512D6101B8B5A90F26F635B1C0E7D794E8D0245D1E879D49E49EB094FCC26898D440ED69D6F371381A2C6F0F4B1C02CF6B34EC4A57BA1903E34E4665C336E8966419827929521ABDAFEB22013E4CBDDD80BAAD381AEECC75996B924189578B6D7C8996CAF1C48F035729E8C58D2BCF4D9C03BB0F1879A117B6E1FF03BA57360D306039F313CB758644470D391526A424DED2236EE85A313B7A3CDF8C20FE2C9C72760248111ADB3E99A9632FC5EAD0CCF59358A9D2C28B6A86D3EA44FA633BB4CBA4E35838F7B4B755B3CC316D5ADECAC4D54C7AA39B107DE0D59F4437B72C9F134D16F40DF71A6708D432DF55C32651519B9AEC7F32651107DFBD2C7DBC947243C4313CFAE6877958A1446D7CA6AD74B50723E7C06361527861CC6DCA7752870F93ADAC4214A9F0990885228116586FEECA58A6B234DFB7B0761672EBA0459EC29388686CB6B808A444BF9307E0AFF86F75F3A73C3F454DA6F23B51824E3E6CE89339ACE462B10EB2A5E037F9ECA1461860218E0057F95E6F7C20DF3A4F992DF84B7FAE1FD04163ED06641ABA8CD8BD50FB8F120757522B0130ADA1373825FB88937CDA2B36CE915E9267AEF2E4DA7FAC134D25B545F447F74F8F4A53618F3409BE6D19777751176995349AD81A622F8EDB33CD479CD5D1346239EBB5CD02735A62CC407C82E993DC410C440AE7A4719F5FE81B887F8F4437F5DBFCD1DF6E3D715A24F53B11812090A462110BA233241BAADA4D73CCF3721DA775341477216F4B115C22162614E7565B540455105760080526C30940CE63EA44BAD50A6EBDF2127C0E6865298E99598EFF4203CCFD7E6F6FB4A86C520C4D5C19606027B563E3E95A0A97117486D83858826B0F6E31772FB49A225966BD7209A8E84427DAC9F5E1AE2671E7DEEB2AF7108465624CE87861700047A327A29A88B5B8F0078234D28C478A2042DD44C8C4F7A52766B389C5122C601F0171FEA524914E42B86EB1024452DC8D436A2317F133748CBF3E53BF7E5B6674CCE6504AB820C82BB693D7D52D947B02E286864A604E24D3FB92FBFF75E723D6BC99BE2C3B0E7D2ED176694C54213871B4A41A1B9B4995C9E5019415247F4961CC1883D128349F5B619E2C45DD9E6B0DC45639CF592BD9D4C6A0DD0085671AD6906D38AC18F03B960CB68A454ED03A1235AA6CDA54ED782BC3CB92E2F32D416E2AE0F2875E6C2543E428E0AB844DFD0A11F8FF26ED8E98B447A7FC9EC52C15F0D203F64E9ED4191341469800BE023B57B9A8FB71047A4F1501A55AC4A7DB50C0DC83A9520BDFA2820AB92C66270C53B708B4961BF0013D93BBF17C2970728CFF1F72AA7643F527066DAA1CBB5536DDC8F8C6F6A8E4C4CAA33869757BF09203EC686AFDF374765557E913C0304DEF0A8C38ABF00365B577D2ED6604855DAD5AEA883D08FA38AEACC064FA6169B22BF6C8CEE937F31D7D0498003CBB4F3F89D43AC9FCA14747B7A14014A0F74973D9837AD47B2D9CCD99E5817696F0BDB25B24B96A7B22636F1C65E2880AB0CAB84E5DC8C64FBD9C95610C40EAF360F9F2AB70C9527A3E6A145239F95EEAB3F2D165B9DA6383824D587ABAE5523313205F8E23825AFB1F85B10883A89C75BA5B7F39466E9E1FA6AF1A0FA3CAAA0DC4D7F2BD6A78DA68C53A5C41B0F1518B28D427AB7BB6FEFCA43C94E30C385487CFF6D14A31EF2AA298691876F092037C96E4D43EC228630AAA7D0B04DA0899763B07E3932812DABFE48692D5DC642BD50EB03DC207927FAE5ED8A6BC9E6D0982BFE3F595E95F307FFAB1B769361441CB382D1F87E0D0A4E998201F96C4252BA50EF0E30DCBD78F0B5A829DFA666D0C2EF2524E668CE219E3AC5A7B4BC9C11523FF4F2A0C20982C04DC45D900A0F8181CCB171A4807887F3EBA2003DD1179CB19B59205A53E67BBDD8533316A18C09AEF569B1ED646F76F8E2D82486E7071A61FC7A069C9367DF4136E7A7A57B598162FFBE1AC26838A618164B510898C9D42142423F64FF08FC8757C83D9527F67978EBD1C8F84AC3B8E2671F9E3AC89AC815670B28467FF2C40A92002CF33D7E19EDFB1E025B4D82D19D7463435880B911DCAE2A46C3FD15C6353789590033E535D25ECA6C6FC6003162EB2180CAC27D59F0FA4BCB7F5DC423F665021ADA066353157FCCE75CAB3B76E91F1CD3CA1ADF0EEA6E05414FD3009AD07DDD33FCACA056A98D018ABD639EF4624A0E252A103C35A559CA9594E84BCC311356C38E5A7FFEED6DDF2DBAEB50AC3CC84503C09B2E1C7490C393283E71FFCFA4DD2CE0588407166465423D0ED23198D4EFB4551DA0B65E1C83986A7D037BC2384AD4770A1EF01F8627A0AFDA696C53CA5AC5F4A898B1EED52B5B39CF8811E4BDC12E2CDEE3C7F773ABD586C2F670BAE912965E42584BACCAA3AC880C31DF8A465237B1C136CABB5288DE14E5D1E17F8424FCE9433E92A46DFE401B0BCF84F363E4B257B6DB03B259B3E43B30A3CDF7F2C43AE89F7E72ED281F13FE804DB764D2137495658544911D63109E1129E0DDA7D37F6DD13AA8A420317CC10F5A98EB864DA56CDE195E5117F647419B519EB23D497090FEBCF99DC1925A71D530308C90BEFFE5DB15BD7B7310567126329946B240C32755AC7E468850981FEEECDED9111DBA1522FF876893E39E780CC14C8DB263B32DDF8AC16E9D7D8DC30E7A03189335A0B22A3360C97B0725B7B7E558703B735C46DD0016E97E0A91CAE78EB11FC18BA7B63D95D361EC2A0E949528F9F8BE310A2D68140401612BA40942B8A0C5D0B29B77F9C0B812AB24BFFB681B624E963B2E21F93720BFC3F07E9F77E945D53A4990CE9987AB2256093F4C59BB28514DA21BA356CEF4D941A0FA870C87D38D78EAF90069AC6B49B7A641BBD95B6BD4786ED8FA1E4426BE22739D209F1294B781CD25EB88174759995614E7E08E36CFE089BFB848E5AC7EF2BFD62504F8E5B3DF04BB3A6DB69B4D7B8304737E88CD710AB508CFF3A5EEF532885A8D88BC08A01045637FD423F59F9FDC7E14B99DEAC7187652D4AB160F87DCD6B8C28B154C185F4EA8FB1155FEB4B41FD8C3409AB6E038E50A53CEDFAA7FA7C8587E82ED66866CBE8CB3B3D86D7D4A6E500B717826AE2D77A11ED95BEEFB07F0639AE4D72D762A5C47B03F2C89FE128878B3369DD05169874DB77E3978B00F1DF5470943E5314073E59F3AD3D7E5D6DAB91CE1F7C5BED0D91249DB1F4706F61A11748DF5A58A4A4E47A2C2C6C0B54BEA2DCB578A500B91AD8EC91D0014E4941383E4407FCA24C0E873B631E63649331F06DC6BD1221EB56D3A9D7A1B982A2409C7DA26E589F4824F68CC1B4E8A3FE8711CA49C99D49C1C689EF61A93BF3D6E0ED62ECD798AA4C6F1B75A4E94791427636F55E2E6672D327FC2E498BB5E77680E424EE80477D0473BD6C8F97684451D15D4314D4FFAEC31802F970D5FB893F239DD03BF7962674A1A86F92A2C83B1837FC8C8F36EDA1B7A6B96BEAC8DCC1B5FE5477513F1B82117DCF64399EEE1ED9FCBCD455CD546EBE3FF0B7B4F8D02298E47AEE6D31006CEC6E01EB8E7E939CEC096EBE26598644FCF6F3BE62A6F8B79F70D31B1A3B86EE58F8D341EFAA085CD62CC655FBB06B817227EACB22EC3176AE875F894967EF725F3DE8C79A32C1B93D40540460DBB7A3177CA9BB8C87C7CC538E69C046E9F817BA68EA1F2AE59D4445DCDA9FED3E52D6D3E1C34EAA8AFE7235EF8C664C26E6CE1BE90DB813B7499E2F092A8FD134A2040FE6025306D93C22D0FA8E3EFDD79F636D11A2D10F25782D0D74BC2786FF83D8F19F3A3E9118F0FB67CD3507332F24EAD03D7E58F6C9D4601E6CC6629BA1DB1DAC8AD2F3D37BDB96EAB7D4BBD7EEEF93EB84A768AAEAB2C81A331BBC6168982C99B01ED65B40AD545665631B2AFE208E93778A3765A76CD5EB31AC374C17F37E776A660631B11243D5CF868956A7A8A51687E30A1112E1D4FEE53DEE25D50CCD7E2259B6E22135D17703C4D7DD2F265D3BD942364F61ADEDD7076F9C83D63CDAA91A825A29E9AB3BB1B223E2C0852829AFBE5D1CA6947E0AF34C7D9134A05C342F47C42FCF428051F939AD6E480588C30CB6CFDC0E03A1B3FF73763B02E00519E362EF666602639DBA806C6AA58A4D9A4E095442FC78398339E3513AC585EE0E5C1B981415034EFDD783E9E63327F40974EE42E6425EB9168526712121A6294525C8F27F1D262CB07DE0FC6DE383442623154152B1FF1F40329871FE8D5681013F9E90403FD2B5DB1D5DFB731609F808D7D7D547C3421B9D8AF874ED0623ECC5F6A7EAD1168149614702ED254D8974B398D00031FAF31CE5F1689133125CEA8B1D59764AD7828F7787D6CC62F1932C83305ECE20448C91208CE7A66BA789C61D609B6C3310EB1552A07E7B09B92165C1B9A19EDEBA1208874C30DE869F29665DAB99647F5448B9D9B162D21188C649C70FD9F20E4B97D56C3621BAA88F6E14EE5164D135475BAAAA0131253DE2F481321E8A1F28F75572D16A8BFFF69DF40D39BFE826356709858BFAA68A6CBB6B4F7319A311B0569F8CDE15129DFA973151CBA0D97EF863E17E9467C690BB2D8147C0C0336D1A7BD182CE9A0C28A2BC65BE15DCB19A404937BD68DC79C5E3F09283F782B89E418EA09E5F85DFD7FFFD9D70E1AE031E02F2D1F86C6FFE0A86514DFF4DE5961A20E3DBB51703C083EFC2B213D547869735E58E538FD288D8AF28D90349C08DCA0E3FFBDC0CE0AFCCC5F18E22BFABBE4FF79753222ECD47CFFBBC672FD7C75B464BA97D9905FF69112DB03CCDF03B7DC09147FE65E234CA5756F9D677BB7E5E3350AEA83354C6D4232BF0357815A3B2CFE04B7D83EB46EDABC2BCBC5DF93F3115DFC30BDF87DB4F6AA14BC9DB484159D6C5FA0B9D44EA0CA12763774A1801FE1824F297BE6E042BAAA2B2F0AE561F74B70C133222B1BE35C40641E0A55BB2A72AA383CEF2289F748C47EE90ADA025E9B1C5ADDE61F06141E4B198466EA3DA698258D6DA39B2F8825C664F796773A995CFF03F3B7626648F637D48B3A67A87B77C426252EB05083820C079398064614EC5E111E53035E94AD5B5D641D9AF2D9C7A26E2C85664D6874D48E52DAB2F7E18C01147976F7D94775FDC96ED5706BE7980FCB445149A5DA1EE18FBBDD60D9EFBF0D7FD817499BC226039689E71F83D40836A5DFED3F4A39C4006F261B300230B76D53F819ADC301D580F46D062E5464FB64BA72303227E356CB3DAB62FBF3CC1BCAA3247E4667549921BDCBD50F31C2E7AFD89C3A1DF7CA42184DC0D06DAA567EDC2897774C337FC6983B5DA226CBB4270F8A0914B66A7DB75CC9A7FA0037E6E5DEB9001F3D56193AA60365CBF26F2160B8375347F60EC131EEE65F92A737442BE07D18A1DA9897D5E2C9AAB5FFA49FB7421B1C813B9DF9D820B85C080F0F7C5E37AE30F1C72705792FB829E8402AC98ED1748392F0FF4292CDE52ED7780A005235F228DCDEC077442FEB7CF93B43A063CBF7224FE59C8BB5E2C6CEB0D4E1DA3873F3DF4AE8EC0E32E9A7E6A24923524BFC3FF6964CAAE0E51B429FE478C463B862278769E18C53B1A42C88AE06CFBBCAA6F9059A4776E0FEABB32867F6F38E3BCF0222B4150AD2BEB5E26C75107EB2B1B3FC04664B46571B45399EF1C8BC596D0567321B3ADB3B4C50F7E5A31BD0743A0A9EB5A33E507FE52FF5E7D8E4D659B8C6E4EC94C9F15CBACD56CCC39FB4F72ABA59F63613CA747D5520CD62CFE1A5AAD94AF5388ECE1FDF0B175E93C4EE830396A42246070DAE2B15B3AEF8979D5109CC83955FBFF61DAA2D1209541B2F112C60D3B3105A00F61C1CD93F2F6FD6A216779D037F5D6AEDC3A2A2CAD40ECC71A6D805F9096A10F4A1E57892255C3E9DAC2F10742EC9215B1E8201D95688A10907B180418E1F36765FEFBB5FF338C219626F72F56D64478CF46A76E74097BEA198BC3815F224479AFD83D04D3D52988CA171AB00C1F0003F69D1692E19D28226C0EF227B860320F496888E53B55142AA3FA64DD36B4C0058059EFDF7972192CE3EE946C6C885916CB8B71FAB4F7A57A9E468EB7278C4EB2B4F7EE33E729AA43F3DC7C8C2217CCC0C34DD7D132254CE6D1914DC5D33E80998EFA353312BFAA8F0981BDB966E4F25ED12BB01AE6CFB3A31DB36C06B0FFEF8BF25932DF6FDDF68983D0FD10229151C25FF15F5954219909A0E0FDBB746993969E2DB1A3833A27AA054D45C1AA11741D3157A5C615D29E592BF5CB88B055E4B3E5E4AA1F0DC552855EA34957A2E897BADD08A76BB519EFFED18DDDE0034D459FD0593304F0EAA4C14662448BF4DAC43063A670D25912F4131578732DC6770CA896F030D4219636C5D2DA4961108AC562999F3AD3A754D770423AA13243B4A1D28DB238113C8DABC33D0CDFD51E075E6E7E61DD4AF916BF6013971968EA7661DE23CD35D0D4F112A5DAF867E87F90668AB0EB929C6A0419FF3CCA7AC5E813948A885C74E0F3F75DE6E4CC4118F3EF180F7C2F4BFF55BC90AA9396F4084E3A1CD59EE7F5D13EAECA9BAA20553A3B69A66C4C71C637EBC24ECE429E1DE65A870DB2B2D62902D75DE8B73115A8A91681C7333DA629450CA4D15B69A1F0AACCCF1E41DA83AA36B9A85F1F0F9A13D96D29963ABB30319F0CB1A41C1B9E017C98C14B2E900DF3E6CA3B569FE7870EFC955882C113D2555BBFBA1C161E3DE23A61DE655AC39F01BAD738120A58E36671482B512E828F67FF285EF4797A048E66403B19D7E787B35C7A9FB25EC7005284C6B66F6BD9DFBBABFFC537D00BA4096058D7149D0ECFE049F2A762D93A1030BA1F7358582D111E5477D46EEE9F3874B09494B01C8C43BFC691EF980878F055660678D4103068C2476A90455676DAECECAF4DE53716D742B91A65A4D25B0F8995E7F5F61E4127A572A68AA5A25F58C13B08BCACCD547D11E710DF2330EEB312139FA7BF98572837FEFD43EC127B0DCA2B8D6C8A7E12F08DE0F0C9B9A0AC24F573F0EAEB302BEFAC0BE0ED6724898330C2002844C1DEE2A5DB305A840AA033F84794585EC2D6F7BB72E7B6D228BDA70429775E93D08F6C3036A64A9D0F99FA111820F7A100FC0BC12C94AB0446E2488BD3556B4272595BB021DCBBC86FDB7001A7C28AE87F28C598158E8463A3CA85B52A255973BF472F7577700F5DF8CE9542DE4B1820A7E2687BEB56F0732D9C4A55901160E02E7E36FD27FC50C62ADE867C09AB453E37FEF7F3EC212307D023BAF9230193192D43EAC53617431DBB31B827181B5EBAAC656F4BDEBEB4ABF2CB85235E2F3120806740CF672D3341666330396B104794BC2E9F57889D2A0617B4A9A5C52B44162336672F00DC9CD8AF659D243B6CD16F7E866AFD480F1137B6AC5F6CFEBFD996BF2FD251C57CF1D907A3499B35BDA81FD9B0BE9BF438A7D5324D6B6E1F42AFDFC7100D27E762DB1DF7234D7CF1B935126085ADCE0E76359FD053DD9682F9978C998EFCBA2206C1338DA91582E3BDF3BAE626B473C488C06313CE5C2CC54595B8216638A2001D2ED60BCE12871C640EB587B2DFA4697D406286105A4570B67DDB5809A15AFE46B93B3568BDE3056D86DDBF5A02BAF20B93B2F7A79AD66F50A6326D46E58AC612AB82039D5D29ACCEEC6D9D098295887FDDFFD5589F9128DC1F1E84083FA354BE38980C1120761EB447DB4DBC1FE26762A89B557C597B6189A8941931DBDB710FB9C53548AB746E545EB5345425804E8DFF47C282CF191892C32A8FD20840D5E7F99BE561C9147F8ADA6B0A47D5573004E924CF2E550CA736657B31B07990F003415DFBE5B36CF5E01975024204CC6F51EDBFE987E56A255537D98EF7AD695C0690268D2BDE68290BD376352AF35B81B0F4807EC23A1E3FC6F19768E7E17F51540E2893131A590515D6E51F8FA1905EED7A011196C598C0759BC203467CA36CE3A51413F2C479EFB972BD5528667CA5737BB4AFECDE94A9FEA8ED8AD4AA80A5F9302E2DCFC5113ACA3B90C98037A17E9D097AB7FC18DBC8A0DD1468C6A439135E50EF6C24D4B02FF9FE0A3420D17A148BD492937A277E95E07A820A87CE74FA4E0603DA51F60A69B7422D37AFA2BFB4DEA10455004D73732890DEC6D14413C7CC249B3131454F9E61A12E4B9FA80958C6A5D8BC223F0DDDC8601E139309CCCE04E5BF9FD440CAC8D504A678C5B09F8FF07968079F356107DA1AB24FD48CB21DCEDDC8FF1A48A176E51A74017E36E21B29F9E5F9CEC159F991477F157226D3B175DD71678369DA45D73418F5EA13EE24319D02042CBE2135CB34244B8FFFC934ED22F4E96B41A14CE0EB6DE51315B99315072A3C9400294263DB77A7DD65B5692C7117E55FBFFCF65B03887E5F0B956AF78904D93EE27B2B2454124730F8CE6362DF573CFE0DD721929E25B98A6F2A60F494191C59500CBD8173470404650A5702A66C2263E7529F9BEA995829A6942297F4BC45E0A2AABF0F86FDE088711F0F91113F1A34C9905DE68C79F13C69E55DAE76F8DA612551D5D01FE01BA967BDD67BA6DBBAA92B049C33CD24F9C2EBB89BD9B1926D58D1A30B0CBEFF06D68E1030C466AB6C8EFEBA674D64431D28DAB0A86D36329EC89630FFD76B8C414042C481B66E73C7C1A30703C1D7288C0D77DFFB72A9EAE605B1FB982E5FD2720687B621E65E226B2FC2ED9ECA06306F7290E30F29DF75D232F9AF1D3E9B8D234FAB391A15EA7ADE2932CF163E7B74B84A43B7562298963BC814E5487D87D27F6BBFADF1F87619AF0B4EE68ADE9E1D20C9FE8A8821DD5A7FDE2B1710D5EF4C067FBE9B8C2EB5D063A4DF72BAF7E336D70FF3148BA7CBE1BDA9C212037A5A33F24B80856B1C69D32CF1AF4ACD8A0745808EEDE3A1F4AAE3FA4F4C3717510F3BD0B74C530D63240A6A246FB63BF323E1F7F8678210D828DB632A8165FF77E34D9DF7A7541FEEF0789F27A7989CC1B6471461B3C62205507B89EB874F5C6EFA75BFCDD6AFAF6FBB727B9D66A5B6923F79A30E9BEF8AFDA76311343D1D86A22C7EC9E57A1056CE4DC33FCA6B32E969E45C81835430F9DE457905AEFD141395EA15E8D27F2D339132CD56BBA70ED86B18568D47CA5B67B27ADB0072CD963FCD5FB95D178D4642678D7DB103E932B168FA2752709A649016BB2977F3BC7041862F84002FD5DFCFD87BB8703E19E49764E497ECBA1536F2BBDD2638F8E13CEA31BD3E8400ED83DC2E2C55973CE6B21EE14FB385FDF583942EE5E322C9648BE8343FF5C0AB19DDFCD087B4303039339C9ED6AEB9F481B3E1AA202253B811327B4D0607CD13A12329A949996DDB43F4BC48B192291D9F1A41606F300CFB794DFBE1F2A436FEC7B5BD623DCB4CEC5756E027E076DC5A8065EAD136ED6CDFBED5734E94337B816693E1182B66A7AFF52FF6337E61B9BEA498F2CEF360D41A30A6971897F5094FCAD241BE68737C18CDE8E187AE8D176B5104EC86E580A52C79732ECB0D7F4A4BF54F49030C2D3749C5CA3A0922717C8A043E4A02AB05B8401BC5377452ADAE685F6837B09740099CFCAE705E05F3E3ED312792B12053B81B1F45FF7594D60E62E69DB929F5FED6A99B0C01F7683B570E2DE47873411180DA6E181CD022C6D533DFB216315A0B48EF2E07989DB49A3C5C0EB16C2C6C4A6E611ED3A010EB0FC979817EA0859663A73B6375206368981B388C524E283F328A7DEB69A05B7450B2E0BEFC26252D09D89E3FC535D0A86295E0070BF6FE3FC67E839F667FF4DDD95CDAF916B79C0120B2A4F900BCB8C375D0F763139710C259E3843279676ED94A4040E7598E916648D6D8CC66C61CCBB7800A94F2070F60BBE0C5376DFEE767D44ED6F7C56EFF3E0E4109C45F425A7236B49061A4672919ADE00D10B5F68B26CE4BB6933BEE76D31A18883149A3B0A0BAEC9C49BBCB615C69182E345C23148A02CABF31EC351ED77C0288B94CFA9570BD1D28A09C49926087B160632CA9C2736901633C96718C2A17DF5D4C939DF64004798F02FE13A4C10E76030CBDCCACC3D4A5FE90C5E75AAD3E02D201246A4878B798AD161AE39973B48F3BE3688CDA1633259C17AD0430C042A9E3D0DEE33EC3C1B2FAF67D741835FA8719EEF5BD36761F2D8AB79F71E937401B413F20597CA1F0275039BD6919C5EA48369F7960B133F6A3FEBD2DA1BCA8502774787F6E337C8FD96F2AD3E216F85999BCF1397E195B9F0CAD3C65892DC319D0F9A90A0DE667942AD9FA9146F329981F7FA203D84BFD8264ED63EBCD08A7C78E1684DF7257573DC11755F748551A9A0B4476BA1990B28159FB45E659691EC5C9633499F45468FDBCDE1417FB521B3D3FD3519C1B1735BC307E654A6C390779A39A21AE6D4FBCF2EA555748FA9E0B34C8022CF07BB32915C651D6E7A869314138C053EC0875C18B38B587ED163E3FFE2FB20A55EA7BEA621F7636153A68DBC47D6E97C62F3DF70C9ADD57F43D79E98BF166DA74851DE09AC4FE9864A0CD2D87383C68AADC2AFE3F21C447C1C8D99F3FD3D329DB87575AD7699E4325FC9CD8E21E0D824775498892867ECFF118CA871B70A2DC9C2AB7AEC69509ECF4CFF1C7555E20BEA958AF06F0FDB89B1ABE8235FE75A66CF4BE607BAF7C26C6D6B99B5578FAF2D2843EDF415BEE7DA03A86A070CA5AA3B90AA497587E252EF67F56561E71E525DB2461BFF3FFA88A469690532477AF2CFFA7FE3563A801480E16C7EA3106E6D64B833ADB5A697C71C9AA80F57351A9CC546833A0CE67FA6FE85FC5BF7E43AF8614AD344E3331A1EC6DB28C352C2C5944910F29939FED0CB66A5EB63D719962AEBBB20211AF59B4A609587F8A504D95B1A84CEE6D24D43AABB7BC6F6CF2603E37195525DDC1DC57ED5346322A46FDB484D43222838A7B5CF4CECD0A10864ACDD08EB3262BB27E1FDE97FCBBA401D1422E7020B2A1AFAE615433AC0E1FF44EDB646D8B67BF56C2FDAA5426F686F84CB7EC54A9F75C76AD42CA94D1D8B12BBFBC4290E013EAF0B9D513F71C292FE7CB8A018271D96E1DED3E837661958A722D5561AF9430C060F9C9E40683D8D666B2A89103BAE2E7D91F326A36289C9AE7EC802909F49F949D10FE8F62A9E768FF58D9FE2B9A4EE0BC1BE4A06FFD4EB766F6D0C50E9FAD2E6225AB89BE5A9E8EC060A00BE984C2E2D06533EED9E2075B5F5032850ADF0BBE65E562E7E6E171B69478FA9A8F7F96D8A711061E4D20AF26F02060D55BE5E34284AC90D73A5DC8579C05113392AFCBC5BC44EC0E01FE103C3337340E57247532D068F9B0483AF10FE53FE38F79EA5889FC364E1FC800E0455C1526CAB232FF4F3C5FD1DACE3E3E2FDAC62BCDD3A18DBEA46009D0F931FD373A301BBFB4F30AA3D5EDEE1415FDF4E7241DFB7777EAD65C72505327C624DB08434EC06136C97519CA3DBC5FFE30FF4DDAD08A39F26719CC9FB1F0AA19A00878C3639E7E869755A9C2535AB011B57FFEAA221421600B231AD51F431E857522FF631A8DBBBA5ED4B55E1BB370EA9EF619B0CA79E3E222513916605D9CC506E102123A46126DD487BBE7A247AA69E0E93A79B116F13B060F7D5D2B6A9301FDD98141E6E130E19510F79768717624A3D9DC4EFD90A8C3EDC322D1A0CDCFDC5185B73F2949413D248B51035768C36DE1A3BFF1DB8355CD8BC83D62D29E057DDC19E921E726DD64751FE39777EFA270C4B9D426B71C51D34A5977FBB9170BBD767BA25E23E48F4383D2A6408E7F90EC7A7BAB6658C3B9FFDC1F0D85ECC0514452E4392AC4E1FB2D191D0D4426E6ECE3559F612835D5887757ED0E43BF24C0A163C36A9D715E1821A5E647ED9D71E1E68A5AA4CC7A5F6CB8D97655BF3284954E6BF83343F73A9DE306ACD92EDBD10CD34D363BC29717ED3D77BC193C75443F04556706630CA6D125BD078014A1B1EDDBF5703E489E6AA22035798ACD07CC63C664E6478306CB566A6A15CED3FA75E9B8E22619A2C1AA7C3D92DC4060F85D3A15136D51E4BB0DB4D7ED5BFE6A56AE322A0241C3B2623EEFB4D4339BF3B3C720C6DC3BF10E9A8FBF527497143B3A192A2E14324EFCB40108602EA4439C2FF4B02552467437F7338D4BE364277A74F70913C254F0A375F43F2BFBABC53364A6FF105CCBA1CDBEC189F36253B914E74F0D063F14F90BC89645D662BB531B4CA8D5FC30266E20E38D87FFF6A41A784B04474526BC7AFA3197E56D1D6AF3FD1A7AAFBAF163000C58F65EF2468A2BFA675E07FC8342D1B66C32EA51435B701391059935E19E8FC101DA0DCE2F612D39986FF6EC0B7C797B124F1E2B4C10B840C76327BED806FFD1C17ACCC4D90DAC4A52ED10845FB28C1C938D3DFA5C8DEE9540CDDF7D84E6336C0C89E932535C7035322684A722977E161627508D92260EDC6D7BFF3FACE7BD9068CC006C63F9A1465D2CA4113B77B873227446AC6E0B4C3882AAAFBE1664431076C4313A21730DD1643F82551BA8633790AC160C0DE8F43123C510D7FCA6F58E77D47250426ECF5737692D283A28BCD276435174398DF8026BA658596E94554D0B31D21747321A86BCFA49DD431FCC475CB0EA0885A280280E3E060F285FC274C3689C493E010B846FFFCEC4304D66EC00E198281BE56C202821C724DC1D69D01851918A74E3F25EB85C5D2BB5614B4FCE365F79D17F64A862D1B7269208E831042202A3C73C242126D16601EDFD5BB4DD01AB131B257D08224109F779B928577BE5D5717B8C03CDB80608BFEB2F5A32E7FE2FC901C1331ED00795B2E54C6211F1645136DE63B9E22FF5BF14CDD0B8B635EF8669573BA1432213076E0DA6759F5EDC2464D02D62DDB39F39144B4235A2E27A1B1C6C44B71E1D11E5F4A97AAF894F2E7344EF0BBF3A82D3A08270F3EDA9C6CF679E19EE8E54897BFC82CA2819773D109A2790016B5D804800D2BBC87DCB5A19B259EA79ED3A8A04812FC86D7E0E40D789903C6EC8983FCCC61109A940282140A0180ED24120C090905140102263F83708BAF0EE15A53313917CC929582A29A52559312E99BD2EF13B252E1131F30ED7D619127A11F8C7740C0DF778D6EB41E3D5FFB791C1C83321B465CB9F133CA9F2395563CCD9128004EC656997495F1E40D22AACA82FCFC1D4F7EA0FAE596CAE09865E15369088692330FDAD0FFAB933CAD68B8A4884C431CDE00AB2AE9D2DFF118C7098D2246B46FF74CCFD89645467E3D35EAB26AF39FEBFCE82CB62ABAB79BB83FB40E8BEA5A39AFD06BDCAAD8340A71E10D7F943DFC3A7A79DF5EAED90089F10C6EF27CAD87B6FF6BD733F1E77C687517AD76060B67EF9988D2B7697AEE78FB904DB40B46B698F457C718F9E8F5DDF874C3DF496719C76A877DD4D58FE544B2B605E8337B0A2F7A5D72F8F4E4A004167E7CD689E6A939755532344D79E9F19568EFC521BC24EA7E5901B99617A03BE80008A975DACFEAD65ED1207928EF3108C1FE89434A970EFBAC1361191DF45E097A501663C7C78F1B7DE75A5DF372506288423F5A172DF070F8638756C54DFFECEB1933F544AF5D140B6FFE32E2A66DE8B9097F9986A7879D02E3AF3C37DF4314E153D065E577D371A255C9ABED0672E0147E5D2F98D334560A3062FF49A385A2130590BF5880070E0A25587B9008919EB022CCFE2840B67323FFE20C2A9961FF6F834A1B818CC634158C38C88532DF369A0CE4F0A83561EA8ED6884A94E893F387D0BFEC9DA811D205A6C7D60FCD5228FA11A63B66C832EBA10B09E2F13B0C049DC32EB9419EDDE4F4252069C9B946BA9E035DAFDFE5354A1EC21507085F40A2ECDF0DE2CD7250C73CD41E06E5A42C3AEF1F68DF543BD1A39C191A426E9F5E45127419A0A0F4E4249B018A70B9733EE52F2D62949ED63E0C78F474794C4566E7C22C309C4ABDF210DB84E4CF9E818DF8E48C8572F7D2666B65B62EA78ADF34775CC764E6F3D7168351810C01701B03FAB9DC2BF0FC39A5DD61E1D04D54A1B9225C1E6A97AA89912F336DA2FA7638B3D873F0B74AF779618B01EB10574FEE22AFD483FFEDD672CCC6AAEBD8ABD3D4B2990C675D1841C939BC58EF5B6F66F43DEE83582781B037846DBF172262175D601CDE9E590F36CCBDAEE4C3333B47DB7629D5DB886F561EA1E9F1D1185FEC03C8DA6B4F2B9EB1CC57B4DD4A962795A63FE5ABB3F7F1B75309E028981845567DA9EFC98E8C10B9E7A9EE6AEA0E79A2BC21802849DA4475C9BCC810627F55FA618D43BA32A17B5776D1E47E3053FC3096DDD15307ECB55FF461BF264D158E62F3AEF3720DD42C873867D2E61A396151E1542ABD058F3467D186A3DD2712E54F0BE67364C10A04BC25C2E98FD01463E86707B790EF09C79EC121CAFF4FB8105A3A965F1E60E3C8473DBB3BBD03423D55C2A9631687442668E88F3C0ECFC620729353668B2EDF646406D1C342F5CE30CFBA945CF9B8D5DD93D590F4E4E29C9B7601BB37F3711780DCBAD3B9438F46F7DA81EF18895807A120B74E08578DBFC95187C390652EB875969D94A9702C5E44E71C92EC1F91AF31C6D1A89B665197C75E93BDB1E9E1006093E5C5D0D97A966B5611D2D748BE8EA62FF47C00CF399AD013FCC24ADCBFB9EAD6C2B1E356C53072AB5DFA186AEED5102DB257145D8E89F8D43DA9015BA3B2E39B72988A0C9E52CCAB98A4522CF79EF7C7879CDB6FE5A1101A4FBAEDC48B25C9AE3D4AD95BF3E1A82A87EE7A6D46F875F44C150719D6322DB63EEB1BD9FCB022AE50716B56EA018425F4D4892D03040DF4351D797AC982CF7A3395C5138C50CE54C61FDC25B9AC97FCA53C3FE580F749C14831AC926C34162F07CDD1F39B703645545A88C90F9C8D5A4B4C9020FEB4E11E613765049554FFBA928A04DE3F1F96F84ACCCEE2B9A92A9659609AAD18F3DC5EF49C8306BC7EFF2C9C10BD70013DA66CDCA7E901237B0D78EFAED6F816269D8BC1DD029899E49ABB8431A4E08836F492864A99425B889F02F24D4F421B8ADDE65F7B976FE5607ED693A6F7EE9F80340CAFF59A68D135C7DD0E7A56CA49D5388D9F532CD0C6F784B82EE822350ADF9AD8687F1CC3669FCDCF25BEFA5BB2FB03060A4FB7415A4680C2E2DC08A9F9A126846D3374D5CF4745379FF433C1B7E242C5C3A2CAF8473B89267C5D3822994412B9428B1A5476B92A86302CA7D5CA92CB8250891943571740F4678D11678231C38D3C24E5F895372EAD80D3E278D0FAE90704A70391465ACAA9D7500BA675C821B5B36F360343D77482419643C940747EAF896589C48F42B21BA4EC29A6393A224A10FF4EF38F08125A9DB45B5F87F80B451703C981AF5F4B21F212B581255DAC787E391E1BAC1CEB2AEBC1851CA13AB8F7C7403197636BED96C1552BAA9208462FDE07C521ECEAAE89CC6F644D393A1A411EE50B51B7E2CC84F7E0148A2197C8D99B3A59ED01E291001F9323ED6AF7C0DDAD60541F2FF1B0DED8E559D50D61ACE13BA8898F0688EB21F32969A0A6C7CEEC755161F2437F096ACDA84E8D636AF18186C2543E6162B2EDCB981C4807C68C0830A5F709676465A2189C911C54EBFF133F15F15F220B1D8094E47636DA112C22E7B60F67E9936FA722CD71A9649BCA0FB7174C56BBBEE450006EF1765675ECC628A9B1C5FC19A60EBFF15B95553D289A2F2FBF76F4715EED42F4300F0EFA87040F7DB1C121CE98DFB3F80381CE6A0A717C595A34A0BF5FDCB3D6D52CEFBCBD89CD03EAEDC5AE57DC4E1C8B44EDEA8BF1D1BD16729097FF65464C7AC6FFF5F80699FB46C6EF527D232A24F1B3547671615F27C12FF7888CE5B2232D2AFEB0963B8F30524A4545BCA3E5195F9FD4415CC6AD20D80B6AAD6833B1A3ADDDE4F31255223860D9AA930E719C07D1C855CE145F5E427E52CA039FFCF7FC4B025E6C2E830F8DEDEA84CBA80BC5C25E9CF54F34C9354A6F375F856F91F4788A1A198ADA6BDCA7488EF7AD84A6EAE6E39BEF653E48C6EEEA87EF26BD7A37819DA385D1B3880C18971C1DED68EEF817C3A09D27F1DDC195FE93E20EED40EA904D5B8FAA983E04C4DBB6A5418F2799CE2391EB90915A4A876B1BD832BBF66768534B46BDF31F5F03C3B2D0FD2F80787418A8F9C65D1842AE84565E835503F850E7C7172E7F588B7609D56097F291627753B2253E3FA31203AE63372085BA801C7E3DEBCF309747E9DA3FD5D7C7CEE8368954B38AF648F8276E139526D2253AAE3A40CF43AC767CBCDB20B70A272A6C9E5A6DDBAFBA2ACA48D70534BB8D7128DFC01FA27D974A2F56603AB9D98C525DEEA140689731B63BE524656DAC579BC24D35011F3C209075B27DB81B7D58DD9D4800D79F7B5682BD151E09F6F1AFC8749E7E188B3BB4D260E9DA394C9EEA21BB34FACFC544FE6AF19F4B5E107B6FEF04D5FB2BCDFCCCC602BE1D7D58F1864BF08080E1C7D92A906A2F8151CD2FFCE6353096B4499B4C430338639A8A35555421036C5FF369B630F5D00611FBCBBE8C78C9631ADBC0F6E21C774F4A19566BB97EACAB009B103EEF515A0D3C7E3C3E690A32ACE76F6467E92FAB3A080CC28A73EDCD9A6E89A8CFE9F52BF6673B272279AC0F00D8509512F3FEBD7BE24C496B73BD2B74F9821C9ED92862BE038804DB18892EBEDF28F90C01E834E9F73DD94874EB0947A7C37990BC58FE462E58B4F572107F8D29AE058B4DB22C5DA2CDBA640435E4100315AED4E595F4A5A0A9EB74A23ACCF1817D46DAC76AE12465AD5BEB25D66510BC215495C36289F57C34302C8696ED3F070FCFAF1DE8B6E88C419201A4205A63A3C3DF6E9E091FFA16A985306, afterDelayedMessagesRead=1047138, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=102992237, newMessageCount=102992632 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=BE65B2BEFD90487CA754A0B5B80684EC985162E28B38F1F3A27E286763C32758, afterDelayedMessagesRead=1047138, prevMessageCount=102992237, newMessageCount=102992632 ) => ( seqMessageIndex=325362, beforeAcc=28E3AA21AC35173FE01D43B815CF67381A7917E34AE860A3B423B3A81244954A, delayedAcc=6B7101B4D521C543434801C69224AADE07DEE6BEF077EAD563AE4561633F1C6F, acc=DA53788786132D83DC67EE4A7B496CB1CCF11D0CBA3D9F623772F0A9E1152563 )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=8F6CB55DF7E53EADCA617B9EDEAF807B00EF13D7E5294D5261F13A18037B8EDF ) => ( 1047144 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=208146, calldataSize=99140 ) => ( success=True )
            • ETH 0.031885870542550801 Arbitrum: Batch Submitter.CALL( )
              addSequencerL2BatchFromOrigin[SequencerInbox (ln:154)]
              File 1 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.sol";
              /**
               * @dev This contract implements a proxy that is upgradeable by an admin.
               *
               * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
               * clashing], which can potentially be used in an attack, this contract uses the
               * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
               * things that go hand in hand:
               *
               * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
               * that call matches one of the admin functions exposed by the proxy itself.
               * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
               * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
               * "admin cannot fallback to proxy target".
               *
               * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
               * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
               * to sudden errors when trying to call a function from the proxy implementation.
               *
               * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
               * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
               */
              contract TransparentUpgradeableProxy is ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } else {
                          _fallback();
                      }
                  }
                  /**
                   * @dev Returns the current admin.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
                   */
                  function admin() external ifAdmin returns (address admin_) {
                      admin_ = _getAdmin();
                  }
                  /**
                   * @dev Returns the current implementation.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
                   */
                  function implementation() external ifAdmin returns (address implementation_) {
                      implementation_ = _implementation();
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
                   */
                  function changeAdmin(address newAdmin) external virtual ifAdmin {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
                   * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
                   * proxied contract.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
                   */
                  function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.sol";
              /**
               * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
               * implementation address that can be changed. This address is stored in storage in the location specified by
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
               * implementation behind the proxy.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
                   *
                   * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
                   * function call, and allows initializating the storage of the proxy like a Solidity constructor.
                   */
                  constructor(address _logic, bytes memory _data) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
               * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
               * be specified by overriding the virtual {_implementation} function.
               *
               * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
               * different contract through the {_delegate} function.
               *
               * The success and return data of the delegated call will be returned back to the caller of the proxy.
               */
              abstract contract Proxy {
                  /**
                   * @dev Delegates the current call to `implementation`.
                   *
                   * This function does not return to its internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      assembly {
                          // Copy msg.data. We take full control of memory in this inline assembly
                          // block because it will not return to Solidity code. We overwrite the
                          // Solidity scratch pad at memory position 0.
                          calldatacopy(0, 0, calldatasize())
                          // Call the implementation.
                          // out and outsize are 0 because we don't know the size yet.
                          let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                          // Copy the returned data.
                          returndatacopy(0, 0, returndatasize())
                          switch result
                          // delegatecall returns 0 on error.
                          case 0 {
                              revert(0, returndatasize())
                          }
                          default {
                              return(0, returndatasize())
                          }
                      }
                  }
                  /**
                   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
                   * and {_fallback} should delegate.
                   */
                  function _implementation() internal view virtual returns (address);
                  /**
                   * @dev Delegates the current call to the address returned by `_implementation()`.
                   *
                   * This function does not return to its internall call site, it will return directly to the external caller.
                   */
                  function _fallback() internal virtual {
                      _beforeFallback();
                      _delegate(_implementation());
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
                   * function in the contract matches the call data.
                   */
                  fallback() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
                   * is empty.
                   */
                  receive() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
                   * call, or as part of the Solidity `fallback` or `receive` functions.
                   *
                   * If overriden should call `super._beforeFallback()`.
                   */
                  function _beforeFallback() internal virtual {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @dev Storage slot with the address of the current implementation.
                   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @dev Storage slot with the admin of the contract.
                   * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library Address {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionDelegateCall(target, data, "Address: low-level delegate call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(isContract(target), "Address: delegate call to non-contract");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 2 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.sol";
              /**
               * @dev This contract implements a proxy that is upgradeable by an admin.
               *
               * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
               * clashing], which can potentially be used in an attack, this contract uses the
               * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
               * things that go hand in hand:
               *
               * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
               * that call matches one of the admin functions exposed by the proxy itself.
               * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
               * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
               * "admin cannot fallback to proxy target".
               *
               * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
               * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
               * to sudden errors when trying to call a function from the proxy implementation.
               *
               * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
               * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
               */
              contract TransparentUpgradeableProxy is ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } else {
                          _fallback();
                      }
                  }
                  /**
                   * @dev Returns the current admin.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
                   */
                  function admin() external ifAdmin returns (address admin_) {
                      admin_ = _getAdmin();
                  }
                  /**
                   * @dev Returns the current implementation.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
                   */
                  function implementation() external ifAdmin returns (address implementation_) {
                      implementation_ = _implementation();
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
                   */
                  function changeAdmin(address newAdmin) external virtual ifAdmin {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
                   * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
                   * proxied contract.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
                   */
                  function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.sol";
              /**
               * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
               * implementation address that can be changed. This address is stored in storage in the location specified by
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
               * implementation behind the proxy.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
                   *
                   * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
                   * function call, and allows initializating the storage of the proxy like a Solidity constructor.
                   */
                  constructor(address _logic, bytes memory _data) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
               * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
               * be specified by overriding the virtual {_implementation} function.
               *
               * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
               * different contract through the {_delegate} function.
               *
               * The success and return data of the delegated call will be returned back to the caller of the proxy.
               */
              abstract contract Proxy {
                  /**
                   * @dev Delegates the current call to `implementation`.
                   *
                   * This function does not return to its internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      assembly {
                          // Copy msg.data. We take full control of memory in this inline assembly
                          // block because it will not return to Solidity code. We overwrite the
                          // Solidity scratch pad at memory position 0.
                          calldatacopy(0, 0, calldatasize())
                          // Call the implementation.
                          // out and outsize are 0 because we don't know the size yet.
                          let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                          // Copy the returned data.
                          returndatacopy(0, 0, returndatasize())
                          switch result
                          // delegatecall returns 0 on error.
                          case 0 {
                              revert(0, returndatasize())
                          }
                          default {
                              return(0, returndatasize())
                          }
                      }
                  }
                  /**
                   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
                   * and {_fallback} should delegate.
                   */
                  function _implementation() internal view virtual returns (address);
                  /**
                   * @dev Delegates the current call to the address returned by `_implementation()`.
                   *
                   * This function does not return to its internall call site, it will return directly to the external caller.
                   */
                  function _fallback() internal virtual {
                      _beforeFallback();
                      _delegate(_implementation());
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
                   * function in the contract matches the call data.
                   */
                  fallback() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
                   * is empty.
                   */
                  receive() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
                   * call, or as part of the Solidity `fallback` or `receive` functions.
                   *
                   * If overriden should call `super._beforeFallback()`.
                   */
                  function _beforeFallback() internal virtual {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @dev Storage slot with the address of the current implementation.
                   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @dev Storage slot with the admin of the contract.
                   * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library Address {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionDelegateCall(target, data, "Address: low-level delegate call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(isContract(target), "Address: delegate call to non-contract");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 3 of 5: GasRefunder
              // SPDX-License-Identifier: Apache-2.0
              /*
               * Copyright 2021, Offchain Labs, Inc.
               *
               * Licensed under the Apache License, Version 2.0 (the "License");
               * you may not use this file except in compliance with the License.
               * You may obtain a copy of the License at
               *
               *    http://www.apache.org/licenses/LICENSE-2.0
               *
               * Unless required by applicable law or agreed to in writing, software
               * distributed under the License is distributed on an "AS IS" BASIS,
               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               * See the License for the specific language governing permissions and
               * limitations under the License.
               */
              pragma solidity ^0.8.7;
              import "./IGasRefunder.sol";
              import "@openzeppelin/contracts-0.8/access/Ownable.sol";
              contract GasRefunder is IGasRefunder, Ownable {
                  mapping(address => bool) public allowedContracts;
                  mapping(address => bool) public allowedRefundees;
                  address public disallower;
                  struct CommonParameters {
                      uint128 maxRefundeeBalance;
                      uint32 extraGasMargin;
                      uint8 calldataCost;
                      uint64 maxGasTip;
                      uint64 maxGasCost;
                      uint32 maxSingleGasUsage;
                  }
                  CommonParameters public commonParams;
                  enum CommonParameterKey {
                      MAX_REFUNDEE_BALANCE,
                      EXTRA_GAS_MARGIN,
                      CALLDATA_COST,
                      MAX_GAS_TIP,
                      MAX_GAS_COST,
                      MAX_SINGLE_GAS_USAGE
                  }
                  enum RefundDenyReason {
                      CONTRACT_NOT_ALLOWED,
                      REFUNDEE_NOT_ALLOWED,
                      REFUNDEE_ABOVE_MAX_BALANCE,
                      OUT_OF_FUNDS
                  }
                  event RefundedGasCosts(
                      address indexed refundee,
                      address indexed contractAddress,
                      bool indexed success,
                      uint256 gas,
                      uint256 gasPrice,
                      uint256 amountPaid
                  );
                  event RefundGasCostsDenied(
                      address indexed refundee,
                      address indexed contractAddress,
                      RefundDenyReason indexed reason,
                      uint256 gas
                  );
                  event Deposited(address sender, uint256 amount);
                  event Withdrawn(address initiator, address destination, uint256 amount);
                  event ContractAllowedSet(address indexed addr, bool indexed allowed);
                  event RefundeeAllowedSet(address indexed addr, bool indexed allowed);
                  event DisallowerSet(address indexed addr);
                  event CommonParameterSet(CommonParameterKey indexed parameter, uint256 value);
                  constructor() Ownable() {
                      commonParams = CommonParameters({
                          maxRefundeeBalance: 0, // no limit
                          extraGasMargin: 4000, // 4k gas
                          calldataCost: 12, // Between 4 for zero bytes and 16 for non-zero bytes
                          maxGasTip: 2 gwei,
                          maxGasCost: 120 gwei,
                          maxSingleGasUsage: 2e6 // 2 million gas
                      });
                  }
                  function setDisallower(address addr) external onlyOwner {
                      disallower = addr;
                      emit DisallowerSet(addr);
                  }
                  function allowContracts(address[] calldata addresses) external onlyOwner {
                      setContractsAllowedImpl(addresses, true);
                  }
                  function disallowContracts(address[] calldata addresses) external {
                      require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                      setContractsAllowedImpl(addresses, false);
                  }
                  function setContractsAllowedImpl(address[] calldata addresses, bool allow) internal {
                      for (uint256 i = 0; i < addresses.length; i++) {
                          address addr = addresses[i];
                          allowedContracts[addr] = allow;
                          emit ContractAllowedSet(addr, allow);
                      }
                  }
                  function allowRefundees(address[] calldata addresses) external onlyOwner {
                      setRefundeesAllowedImpl(addresses, true);
                  }
                  function disallowRefundees(address[] calldata addresses) external {
                      require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                      setRefundeesAllowedImpl(addresses, false);
                  }
                  function setRefundeesAllowedImpl(address[] calldata addresses, bool allow) internal {
                      for (uint256 i = 0; i < addresses.length; i++) {
                          address addr = addresses[i];
                          allowedRefundees[addr] = allow;
                          emit RefundeeAllowedSet(addr, allow);
                      }
                  }
                  function setMaxRefundeeBalance(uint128 newValue) external onlyOwner {
                      commonParams.maxRefundeeBalance = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_REFUNDEE_BALANCE, newValue);
                  }
                  function setExtraGasMargin(uint32 newValue) external onlyOwner {
                      commonParams.extraGasMargin = newValue;
                      emit CommonParameterSet(CommonParameterKey.EXTRA_GAS_MARGIN, newValue);
                  }
                  function setCalldataCost(uint8 newValue) external onlyOwner {
                      commonParams.calldataCost = newValue;
                      emit CommonParameterSet(CommonParameterKey.CALLDATA_COST, newValue);
                  }
                  function setMaxGasTip(uint64 newValue) external onlyOwner {
                      commonParams.maxGasTip = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_GAS_TIP, newValue);
                  }
                  function setMaxGasCost(uint64 newValue) external onlyOwner {
                      commonParams.maxGasCost = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_GAS_COST, newValue);
                  }
                  function setMaxSingleGasUsage(uint32 newValue) external onlyOwner {
                      commonParams.maxSingleGasUsage = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_SINGLE_GAS_USAGE, newValue);
                  }
                  receive() external payable {
                      emit Deposited(msg.sender, msg.value);
                  }
                  function withdraw(address payable destination, uint256 amount) external onlyOwner {
                      // It's expected that destination is an EOA
                      (bool success, ) = destination.call{ value: amount }("");
                      require(success, "WITHDRAW_FAILED");
                      emit Withdrawn(msg.sender, destination, amount);
                  }
                  function onGasSpent(
                      address payable refundee,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external override returns (bool success) {
                      uint256 startGasLeft = gasleft();
                      uint256 ownBalance = address(this).balance;
                      if (ownBalance == 0) {
                          emit RefundGasCostsDenied(refundee, msg.sender, RefundDenyReason.OUT_OF_FUNDS, gasUsed);
                          return false;
                      }
                      if (!allowedContracts[msg.sender]) {
                          emit RefundGasCostsDenied(
                              refundee,
                              msg.sender,
                              RefundDenyReason.CONTRACT_NOT_ALLOWED,
                              gasUsed
                          );
                          return false;
                      }
                      if (!allowedRefundees[refundee]) {
                          emit RefundGasCostsDenied(
                              refundee,
                              msg.sender,
                              RefundDenyReason.REFUNDEE_NOT_ALLOWED,
                              gasUsed
                          );
                          return false;
                      }
                      uint256 estGasPrice = block.basefee + commonParams.maxGasTip;
                      if (tx.gasprice < estGasPrice) {
                          estGasPrice = tx.gasprice;
                      }
                      if (commonParams.maxGasCost != 0 && estGasPrice > commonParams.maxGasCost) {
                          estGasPrice = commonParams.maxGasCost;
                      }
                      // Retrieve these variables before measuring gasleft()
                      uint256 refundeeBalance = refundee.balance;
                      uint256 maxRefundeeBalance = commonParams.maxRefundeeBalance;
                      uint256 maxSingleGasUsage = commonParams.maxSingleGasUsage;
                      // Add in a bit of a buffer for the tx costs not measured with gasleft
                      gasUsed +=
                          startGasLeft +
                          commonParams.extraGasMargin +
                          (calldataSize * commonParams.calldataCost);
                      // Split this up into two statements so that gasleft() comes after the storage loads
                      gasUsed -= gasleft();
                      if (maxSingleGasUsage != 0 && gasUsed > maxSingleGasUsage) {
                          gasUsed = maxSingleGasUsage;
                      }
                      uint256 refundAmount = estGasPrice * gasUsed;
                      if (maxRefundeeBalance != 0 && refundeeBalance + refundAmount > maxRefundeeBalance) {
                          if (refundeeBalance > maxRefundeeBalance) {
                              // The refundee is already above their max balance
                              emit RefundGasCostsDenied(
                                  refundee,
                                  msg.sender,
                                  RefundDenyReason.REFUNDEE_ABOVE_MAX_BALANCE,
                                  gasUsed
                              );
                              return false;
                          } else {
                              refundAmount = maxRefundeeBalance - refundeeBalance;
                          }
                      }
                      if (refundAmount > ownBalance) {
                          refundAmount = ownBalance;
                      }
                      // It's expected that refundee is an EOA
                      (success, ) = refundee.call{ value: refundAmount }("");
                      emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount);
                  }
              }
              // SPDX-License-Identifier: Apache-2.0
              /*
               * Copyright 2021, Offchain Labs, Inc.
               *
               * Licensed under the Apache License, Version 2.0 (the "License");
               * you may not use this file except in compliance with the License.
               * You may obtain a copy of the License at
               *
               *    http://www.apache.org/licenses/LICENSE-2.0
               *
               * Unless required by applicable law or agreed to in writing, software
               * distributed under the License is distributed on an "AS IS" BASIS,
               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               * See the License for the specific language governing permissions and
               * limitations under the License.
               */
              pragma solidity >=0.6.11 <0.7.0 || >=0.8.7 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
              pragma solidity ^0.8.0;
              import "../utils/Context.sol";
              /**
               * @dev Contract module which provides a basic access control mechanism, where
               * there is an account (an owner) that can be granted exclusive access to
               * specific functions.
               *
               * By default, the owner account will be the one that deploys the contract. This
               * can later be changed with {transferOwnership}.
               *
               * This module is used through inheritance. It will make available the modifier
               * `onlyOwner`, which can be applied to your functions to restrict their use to
               * the owner.
               */
              abstract contract Ownable is Context {
                  address private _owner;
                  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                  /**
                   * @dev Initializes the contract setting the deployer as the initial owner.
                   */
                  constructor() {
                      _transferOwnership(_msgSender());
                  }
                  /**
                   * @dev Returns the address of the current owner.
                   */
                  function owner() public view virtual returns (address) {
                      return _owner;
                  }
                  /**
                   * @dev Throws if called by any account other than the owner.
                   */
                  modifier onlyOwner() {
                      require(owner() == _msgSender(), "Ownable: caller is not the owner");
                      _;
                  }
                  /**
                   * @dev Leaves the contract without owner. It will not be possible to call
                   * `onlyOwner` functions anymore. Can only be called by the current owner.
                   *
                   * NOTE: Renouncing ownership will leave the contract without an owner,
                   * thereby removing any functionality that is only available to the owner.
                   */
                  function renounceOwnership() public virtual onlyOwner {
                      _transferOwnership(address(0));
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Can only be called by the current owner.
                   */
                  function transferOwnership(address newOwner) public virtual onlyOwner {
                      require(newOwner != address(0), "Ownable: new owner is the zero address");
                      _transferOwnership(newOwner);
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Internal function without access restriction.
                   */
                  function _transferOwnership(address newOwner) internal virtual {
                      address oldOwner = _owner;
                      _owner = newOwner;
                      emit OwnershipTransferred(oldOwner, newOwner);
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Provides information about the current execution context, including the
               * sender of the transaction and its data. While these are generally available
               * via msg.sender and msg.data, they should not be accessed in such a direct
               * manner, since when dealing with meta-transactions the account sending and
               * paying for execution may not be the actual sender (as far as an application
               * is concerned).
               *
               * This contract is only required for intermediate, library-like contracts.
               */
              abstract contract Context {
                  function _msgSender() internal view virtual returns (address) {
                      return msg.sender;
                  }
                  function _msgData() internal view virtual returns (bytes calldata) {
                      return msg.data;
                  }
              }
              

              File 4 of 5: SequencerInbox
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {
                  AlreadyInit,
                  HadZeroInit,
                  NotOrigin,
                  DataTooLarge,
                  NotRollup,
                  DelayedBackwards,
                  DelayedTooFar,
                  ForceIncludeBlockTooSoon,
                  ForceIncludeTimeTooSoon,
                  IncorrectMessagePreimage,
                  NotBatchPoster,
                  BadSequencerNumber,
                  DataNotAuthenticated,
                  AlreadyValidDASKeyset,
                  NoSuchKeyset,
                  NotForked
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./IInbox.sol";
              import "./ISequencerInbox.sol";
              import "../rollup/IRollupLogic.sol";
              import "./Messages.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol";
              import "../libraries/DelegateCallAware.sol";
              import {MAX_DATA_SIZE} from "../libraries/Constants.sol";
              /**
               * @title Accepts batches from the sequencer and adds them to the rollup inbox.
               * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup.
               * As part of submitting a batch the sequencer is also expected to include items enqueued
               * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a
               * sequencer within a time limit they can be force included into the rollup inbox by anyone.
               */
              contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox {
                  uint256 public totalDelayedMessagesRead;
                  IBridge public bridge;
                  /// @inheritdoc ISequencerInbox
                  uint256 public constant HEADER_LENGTH = 40;
                  /// @inheritdoc ISequencerInbox
                  bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40;
                  IOwnable public rollup;
                  mapping(address => bool) public isBatchPoster;
                  ISequencerInbox.MaxTimeVariation public maxTimeVariation;
                  mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo;
                  modifier onlyRollupOwner() {
                      if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup));
                      _;
                  }
                  uint256 internal immutable deployTimeChainId = block.chainid;
                  function _chainIdChanged() internal view returns (bool) {
                      return deployTimeChainId != block.chainid;
                  }
                  function initialize(
                      IBridge bridge_,
                      ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_
                  ) external onlyDelegated {
                      if (bridge != IBridge(address(0))) revert AlreadyInit();
                      if (bridge_ == IBridge(address(0))) revert HadZeroInit();
                      bridge = bridge_;
                      rollup = bridge_.rollup();
                      maxTimeVariation = maxTimeVariation_;
                  }
                  function getTimeBounds() internal view virtual returns (TimeBounds memory) {
                      TimeBounds memory bounds;
                      if (block.timestamp > maxTimeVariation.delaySeconds) {
                          bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds);
                      }
                      bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds);
                      if (block.number > maxTimeVariation.delayBlocks) {
                          bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks);
                      }
                      bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks);
                      return bounds;
                  }
                  /// @inheritdoc ISequencerInbox
                  function removeDelayAfterFork() external {
                      if (!_chainIdChanged()) revert NotForked();
                      maxTimeVariation = ISequencerInbox.MaxTimeVariation({
                          delayBlocks: 1,
                          futureBlocks: 1,
                          delaySeconds: 1,
                          futureSeconds: 1
                      });
                  }
                  /// @inheritdoc ISequencerInbox
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external {
                      if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards();
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          l1BlockAndTime[0],
                          l1BlockAndTime[1],
                          _totalDelayedMessagesRead - 1,
                          baseFeeL1,
                          messageDataHash
                      );
                      // Can only force-include after the Sequencer-only window has expired.
                      if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number)
                          revert ForceIncludeBlockTooSoon();
                      if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp)
                          revert ForceIncludeTimeTooSoon();
                      // Verify that message hash represents the last message sequence of delayed message to be included
                      bytes32 prevDelayedAcc = 0;
                      if (_totalDelayedMessagesRead > 1) {
                          prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2);
                      }
                      if (
                          bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) !=
                          Messages.accumulateInboxMessage(prevDelayedAcc, messageHash)
                      ) revert IncorrectMessagePreimage();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(
                          _totalDelayedMessagesRead
                      );
                      uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead;
                      uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount();
                      uint256 newSeqMsgCount = prevSeqMsgCount +
                          _totalDelayedMessagesRead -
                          totalDelayedMessagesRead;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash,
                              __totalDelayedMessagesRead,
                              0,
                              prevSeqMsgCount,
                              newSeqMsgCount
                          );
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.NoData
                      );
                  }
                  /// @dev Deprecated in favor of the variant specifying message counts for consistency
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0);
                      if (seqMessageIndex != sequenceNumber)
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber);
                      emit SequencerBatchDelivered(
                          sequenceNumber,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      // Reformat the stack to prevent "Stack too deep"
                      uint256 sequenceNumber_ = sequenceNumber;
                      TimeBounds memory timeBounds_ = timeBounds;
                      bytes32 dataHash_ = dataHash;
                      uint256 dataLength = data.length;
                      uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                      uint256 prevMessageCount_ = prevMessageCount;
                      uint256 newMessageCount_ = newMessageCount;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              dataLength,
                              prevMessageCount_,
                              newMessageCount_
                          );
                      if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds_,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external override refundsGas(gasRefunder) {
                      if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      uint256 seqMessageIndex;
                      {
                          // Reformat the stack to prevent "Stack too deep"
                          uint256 sequenceNumber_ = sequenceNumber;
                          TimeBounds memory timeBounds_ = timeBounds;
                          bytes32 dataHash_ = dataHash;
                          uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                          uint256 prevMessageCount_ = prevMessageCount;
                          uint256 newMessageCount_ = newMessageCount;
                          // we set the calldata length posted to 0 here since the caller isn't the origin
                          // of the tx, so they might have not paid tx input cost for the calldata
                          bytes32 beforeAcc;
                          bytes32 delayedAcc;
                          bytes32 afterAcc;
                          (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              0,
                              prevMessageCount_,
                              newMessageCount_
                          );
                          if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                              revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                          emit SequencerBatchDelivered(
                              seqMessageIndex,
                              beforeAcc,
                              afterAcc,
                              delayedAcc,
                              totalDelayedMessagesRead,
                              timeBounds_,
                              BatchDataLocation.SeparateBatchEvent
                          );
                      }
                      emit SequencerBatchData(seqMessageIndex, data);
                  }
                  modifier validateBatchData(bytes calldata data) {
                      uint256 fullDataLen = HEADER_LENGTH + data.length;
                      if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE);
                      if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) {
                          revert DataNotAuthenticated();
                      }
                      // the first byte is used to identify the type of batch data
                      // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes)
                      if (data.length >= 33 && data[0] & 0x80 != 0) {
                          // we skip the first byte, then read the next 32 bytes for the keyset
                          bytes32 dasKeysetHash = bytes32(data[1:33]);
                          if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash);
                      }
                      _;
                  }
                  function packHeader(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes memory, TimeBounds memory)
                  {
                      TimeBounds memory timeBounds = getTimeBounds();
                      bytes memory header = abi.encodePacked(
                          timeBounds.minTimestamp,
                          timeBounds.maxTimestamp,
                          timeBounds.minBlockNumber,
                          timeBounds.maxBlockNumber,
                          uint64(afterDelayedMessagesRead)
                      );
                      // This must always be true from the packed encoding
                      assert(header.length == HEADER_LENGTH);
                      return (header, timeBounds);
                  }
                  function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead)
                      internal
                      view
                      validateBatchData(data)
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      bytes32 dataHash = keccak256(bytes.concat(header, data));
                      return (dataHash, timeBounds);
                  }
                  function formEmptyDataHash(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      return (keccak256(header), timeBounds);
                  }
                  function addSequencerL2BatchImpl(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 calldataLengthPosted,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      internal
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards();
                      if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar();
                      (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage(
                          dataHash,
                          afterDelayedMessagesRead,
                          prevMessageCount,
                          newMessageCount
                      );
                      totalDelayedMessagesRead = afterDelayedMessagesRead;
                      if (calldataLengthPosted > 0) {
                          // this msg isn't included in the current sequencer batch, but instead added to
                          // the delayed messages queue that is yet to be included
                          address batchPoster = msg.sender;
                          bytes memory spendingReportMsg = abi.encodePacked(
                              block.timestamp,
                              batchPoster,
                              dataHash,
                              seqMessageIndex,
                              block.basefee
                          );
                          uint256 msgNum = bridge.submitBatchSpendingReport(
                              batchPoster,
                              keccak256(spendingReportMsg)
                          );
                          // this is the same event used by Inbox.sol after including a message to the delayed message accumulator
                          emit InboxMessageDelivered(msgNum, spendingReportMsg);
                      }
                  }
                  function inboxAccs(uint256 index) external view returns (bytes32) {
                      return bridge.sequencerInboxAccs(index);
                  }
                  function batchCount() external view returns (uint256) {
                      return bridge.sequencerMessageCount();
                  }
                  /// @inheritdoc ISequencerInbox
                  function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_)
                      external
                      onlyRollupOwner
                  {
                      maxTimeVariation = maxTimeVariation_;
                      emit OwnerFunctionCalled(0);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner {
                      isBatchPoster[addr] = isBatchPoster_;
                      emit OwnerFunctionCalled(1);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setValidKeyset(bytes calldata keysetBytes) external onlyRollupOwner {
                      uint256 ksWord = uint256(keccak256(bytes.concat(hex"fe", keccak256(keysetBytes))));
                      bytes32 ksHash = bytes32(ksWord ^ (1 << 255));
                      require(keysetBytes.length < 64 * 1024, "keyset is too large");
                      if (dasKeySetInfo[ksHash].isValidKeyset) revert AlreadyValidDASKeyset(ksHash);
                      dasKeySetInfo[ksHash] = DasKeySetInfo({
                          isValidKeyset: true,
                          creationBlock: uint64(block.number)
                      });
                      emit SetValidKeyset(ksHash, keysetBytes);
                      emit OwnerFunctionCalled(2);
                  }
                  /// @inheritdoc ISequencerInbox
                  function invalidateKeysetHash(bytes32 ksHash) external onlyRollupOwner {
                      if (!dasKeySetInfo[ksHash].isValidKeyset) revert NoSuchKeyset(ksHash);
                      // we don't delete the block creation value since its used to fetch the SetValidKeyset
                      // event efficiently. The event provides the hash preimage of the key.
                      // this is still needed when syncing the chain after a keyset is invalidated.
                      dasKeySetInfo[ksHash].isValidKeyset = false;
                      emit InvalidateKeyset(ksHash);
                      emit OwnerFunctionCalled(3);
                  }
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool) {
                      return dasKeySetInfo[ksHash].isValidKeyset;
                  }
                  /// @inheritdoc ISequencerInbox
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256) {
                      DasKeySetInfo memory ksInfo = dasKeySetInfo[ksHash];
                      if (ksInfo.creationBlock == 0) revert NoSuchKeyset(ksHash);
                      return uint256(ksInfo.creationBlock);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              /// @dev Thrown when a L1 chainId fork is detected
              error L1Forked();
              /// @dev Thrown when a L1 chainId fork is not detected
              error NotForked();
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              import "./IDelayedMessageProvider.sol";
              import "./ISequencerInbox.sol";
              interface IInbox is IDelayedMessageProvider {
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method can be used to send any type of message that doesn't require L1 validation
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2Message(bytes calldata messageData) external returns (uint256);
                  function sendL1FundedUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendL1FundedContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  function sendContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendL1FundedUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @notice Send a message to initiate L2 withdrawal
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendWithdrawEthToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      uint256 value,
                      address withdrawTo
                  ) external returns (uint256);
                  /**
                   * @notice Get the L1 fee for submitting a retryable
                   * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value
                   * @dev This formula may change in the future, to future proof your code query this method instead of inlining!!
                   * @param dataLength The length of the retryable's calldata, in bytes
                   * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used
                   */
                  function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee)
                      external
                      view
                      returns (uint256);
                  /**
                   * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract
                   * @dev This does not trigger the fallback function when receiving in the L2 side.
                   *      Look into retryable tickets if you are interested in this functionality.
                   * @dev This function should not be called inside contract constructors
                   */
                  function depositEth() external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev all msg.value will deposited to callValueRefundAddress on L2
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function createRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds
                   * come from the deposit alone, rather than falling back on the user's L2 balance
                   * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress).
                   * createRetryableTicket method is the recommended standard.
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function unsafeCreateRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  // ---------- onlyRollupOrOwner functions ----------
                  /// @notice pauses all inbox functionality
                  function pause() external;
                  /// @notice unpauses all inbox functionality
                  function unpause() external;
                  // ---------- initializer ----------
                  /**
                   * @dev function to be called one time during the inbox upgrade process
                   *      this is used to fix the storage slots
                   */
                  function postUpgradeInit(IBridge _bridge) external;
                  function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              pragma experimental ABIEncoderV2;
              import "../libraries/IGasRefunder.sol";
              import "./IDelayedMessageProvider.sol";
              import "./IBridge.sol";
              interface ISequencerInbox is IDelayedMessageProvider {
                  struct MaxTimeVariation {
                      uint256 delayBlocks;
                      uint256 futureBlocks;
                      uint256 delaySeconds;
                      uint256 futureSeconds;
                  }
                  struct TimeBounds {
                      uint64 minTimestamp;
                      uint64 maxTimestamp;
                      uint64 minBlockNumber;
                      uint64 maxBlockNumber;
                  }
                  enum BatchDataLocation {
                      TxInput,
                      SeparateBatchEvent,
                      NoData
                  }
                  event SequencerBatchDelivered(
                      uint256 indexed batchSequenceNumber,
                      bytes32 indexed beforeAcc,
                      bytes32 indexed afterAcc,
                      bytes32 delayedAcc,
                      uint256 afterDelayedMessagesRead,
                      TimeBounds timeBounds,
                      BatchDataLocation dataLocation
                  );
                  event OwnerFunctionCalled(uint256 indexed id);
                  /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input
                  event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data);
                  /// @dev a valid keyset was added
                  event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes);
                  /// @dev a keyset was invalidated
                  event InvalidateKeyset(bytes32 indexed keysetHash);
                  function totalDelayedMessagesRead() external view returns (uint256);
                  function bridge() external view returns (IBridge);
                  /// @dev The size of the batch header
                  // solhint-disable-next-line func-name-mixedcase
                  function HEADER_LENGTH() external view returns (uint256);
                  /// @dev If the first batch data byte after the header has this bit set,
                  ///      the sequencer inbox has authenticated the data. Currently not used.
                  // solhint-disable-next-line func-name-mixedcase
                  function DATA_AUTHENTICATED_FLAG() external view returns (bytes1);
                  function rollup() external view returns (IOwnable);
                  function isBatchPoster(address) external view returns (bool);
                  struct DasKeySetInfo {
                      bool isValidKeyset;
                      uint64 creationBlock;
                  }
                  // https://github.com/ethereum/solidity/issues/11826
                  // function maxTimeVariation() external view returns (MaxTimeVariation calldata);
                  // function dasKeySetInfo(bytes32) external view returns (DasKeySetInfo calldata);
                  /// @notice Remove force inclusion delay after a L1 chainId fork
                  function removeDelayAfterFork() external;
                  /// @notice Force messages from the delayed inbox to be included in the chain
                  ///         Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and
                  ///         maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these
                  ///         messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages.
                  /// @param _totalDelayedMessagesRead The total number of messages to read up to
                  /// @param kind The kind of the last message to be included
                  /// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included
                  /// @param baseFeeL1 The l1 gas price of the last message to be included
                  /// @param sender The sender of the last message to be included
                  /// @param messageDataHash The messageDataHash of the last message to be included
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external;
                  function inboxAccs(uint256 index) external view returns (bytes32);
                  function batchCount() external view returns (uint256);
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool);
                  /// @notice the creation block is intended to still be available after a keyset is deleted
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256);
                  // ---------- BatchPoster functions ----------
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external;
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external;
                  // ---------- onlyRollupOrOwner functions ----------
                  /**
                   * @notice Set max delay for sequencer inbox
                   * @param maxTimeVariation_ the maximum time variation parameters
                   */
                  function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external;
                  /**
                   * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
                   * @param addr the address
                   * @param isBatchPoster_ if the specified address should be authorized as a batch poster
                   */
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external;
                  /**
                   * @notice Makes Data Availability Service keyset valid
                   * @param keysetBytes bytes of the serialized keyset
                   */
                  function setValidKeyset(bytes calldata keysetBytes) external;
                  /**
                   * @notice Invalidates a Data Availability Service keyset
                   * @param ksHash hash of the keyset
                   */
                  function invalidateKeysetHash(bytes32 ksHash) external;
                  // ---------- initializer ----------
                  function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./RollupLib.sol";
              import "./IRollupCore.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IOwnable.sol";
              interface IRollupUserAbs is IRollupCore, IOwnable {
                  /// @dev the user logic just validated configuration and shouldn't write to state during init
                  /// this allows the admin logic to ensure consistency on parameters.
                  function initialize(address stakeToken) external view;
                  function removeWhitelistAfterFork() external;
                  function removeWhitelistAfterValidatorAfk() external;
                  function isERC20Enabled() external view returns (bool);
                  function rejectNextNode(address stakerAddress) external;
                  function confirmNextNode(bytes32 blockHash, bytes32 sendRoot) external;
                  function stakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external;
                  function stakeOnNewNode(
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function returnOldDeposit(address stakerAddress) external;
                  function reduceDeposit(uint256 target) external;
                  function removeZombie(uint256 zombieNum, uint256 maxNodes) external;
                  function removeOldZombies(uint256 startIndex) external;
                  function requiredStake(
                      uint256 blockNumber,
                      uint64 firstUnresolvedNodeNum,
                      uint64 latestCreatedNode
                  ) external view returns (uint256);
                  function currentRequiredStake() external view returns (uint256);
                  function countStakedZombies(uint64 nodeNum) external view returns (uint256);
                  function countZombiesStakedOnChildren(uint64 nodeNum) external view returns (uint256);
                  function requireUnresolvedExists() external view;
                  function requireUnresolved(uint256 nodeNum) external view;
                  function withdrawStakerFunds() external returns (uint256);
                  function createChallenge(
                      address[2] calldata stakers,
                      uint64[2] calldata nodeNums,
                      MachineStatus[2] calldata machineStatuses,
                      GlobalState[2] calldata globalStates,
                      uint64 numBlocks,
                      bytes32 secondExecutionHash,
                      uint256[2] calldata proposedTimes,
                      bytes32[2] calldata wasmModuleRoots
                  ) external;
              }
              interface IRollupUser is IRollupUserAbs {
                  function newStakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external payable;
                  function newStakeOnNewNode(
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external payable;
                  function addToDeposit(address stakerAddress) external payable;
              }
              interface IRollupUserERC20 is IRollupUserAbs {
                  function newStakeOnExistingNode(
                      uint256 tokenAmount,
                      uint64 nodeNum,
                      bytes32 nodeHash
                  ) external;
                  function newStakeOnNewNode(
                      uint256 tokenAmount,
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function addToDeposit(address stakerAddress, uint256 tokenAmount) external;
              }
              interface IRollupAdmin {
                  event OwnerFunctionCalled(uint256 indexed id);
                  function initialize(Config calldata config, ContractDependencies calldata connectedContracts)
                      external;
                  /**
                   * @notice Add a contract authorized to put messages into this rollup's inbox
                   * @param _outbox Outbox contract to add
                   */
                  function setOutbox(IOutbox _outbox) external;
                  /**
                   * @notice Disable an old outbox from interacting with the bridge
                   * @param _outbox Outbox contract to remove
                   */
                  function removeOldOutbox(address _outbox) external;
                  /**
                   * @notice Enable or disable an inbox contract
                   * @param _inbox Inbox contract to add or remove
                   * @param _enabled New status of inbox
                   */
                  function setDelayedInbox(address _inbox, bool _enabled) external;
                  /**
                   * @notice Pause interaction with the rollup contract
                   */
                  function pause() external;
                  /**
                   * @notice Resume interaction with the rollup contract
                   */
                  function resume() external;
                  /**
                   * @notice Set the addresses of the validator whitelist
                   * @dev It is expected that both arrays are same length, and validator at
                   * position i corresponds to the value at position i
                   * @param _validator addresses to set in the whitelist
                   * @param _val value to set in the whitelist for corresponding address
                   */
                  function setValidator(address[] memory _validator, bool[] memory _val) external;
                  /**
                   * @notice Set a new owner address for the rollup proxy
                   * @param newOwner address of new rollup owner
                   */
                  function setOwner(address newOwner) external;
                  /**
                   * @notice Set minimum assertion period for the rollup
                   * @param newPeriod new minimum period for assertions
                   */
                  function setMinimumAssertionPeriod(uint256 newPeriod) external;
                  /**
                   * @notice Set number of blocks until a node is considered confirmed
                   * @param newConfirmPeriod new number of blocks until a node is confirmed
                   */
                  function setConfirmPeriodBlocks(uint64 newConfirmPeriod) external;
                  /**
                   * @notice Set number of extra blocks after a challenge
                   * @param newExtraTimeBlocks new number of blocks
                   */
                  function setExtraChallengeTimeBlocks(uint64 newExtraTimeBlocks) external;
                  /**
                   * @notice Set base stake required for an assertion
                   * @param newBaseStake maximum avmgas to be used per block
                   */
                  function setBaseStake(uint256 newBaseStake) external;
                  /**
                   * @notice Set the token used for stake, where address(0) == eth
                   * @dev Before changing the base stake token, you might need to change the
                   * implementation of the Rollup User logic!
                   * @param newStakeToken address of token used for staking
                   */
                  function setStakeToken(address newStakeToken) external;
                  /**
                   * @notice Upgrades the implementation of a beacon controlled by the rollup
                   * @param beacon address of beacon to be upgraded
                   * @param newImplementation new address of implementation
                   */
                  function upgradeBeacon(address beacon, address newImplementation) external;
                  function forceResolveChallenge(address[] memory stackerA, address[] memory stackerB) external;
                  function forceRefundStaker(address[] memory stacker) external;
                  function forceCreateNode(
                      uint64 prevNode,
                      uint256 prevNodeInboxMaxCount,
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash
                  ) external;
                  function forceConfirmNode(
                      uint64 nodeNum,
                      bytes32 blockHash,
                      bytes32 sendRoot
                  ) external;
                  function setLoserStakeEscrow(address newLoserStakerEscrow) external;
                  /**
                   * @notice Set the proving WASM module root
                   * @param newWasmModuleRoot new module root
                   */
                  function setWasmModuleRoot(bytes32 newWasmModuleRoot) external;
                  /**
                   * @notice set a new sequencer inbox contract
                   * @param _sequencerInbox new address of sequencer inbox
                   */
                  function setSequencerInbox(address _sequencerInbox) external;
                  /**
                   * @notice set the validatorWhitelistDisabled flag
                   * @param _validatorWhitelistDisabled new value of validatorWhitelistDisabled, i.e. true = disabled
                   */
                  function setValidatorWhitelistDisabled(bool _validatorWhitelistDisabled) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              abstract contract GasRefundEnabled {
                  /// @dev this refunds the sender for execution costs of the tx
                  /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging
                  /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded
                  modifier refundsGas(IGasRefunder gasRefunder) {
                      uint256 startGasLeft = gasleft();
                      _;
                      if (address(gasRefunder) != address(0)) {
                          uint256 calldataSize;
                          assembly {
                              calldataSize := calldatasize()
                          }
                          uint256 calldataWords = (calldataSize + 31) / 32;
                          // account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost
                          startGasLeft += calldataWords * 6 + (calldataWords**2) / 512;
                          // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call
                          // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input
                          // solhint-disable-next-line avoid-tx-origin
                          if (msg.sender != tx.origin) {
                              // We can't be sure if this calldata came from the top level tx,
                              // so to be safe we tell the gas refunder there was no calldata.
                              calldataSize = 0;
                          }
                          gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize);
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              // 90% of Geth's 128KB tx size limit, leaving ~13KB for proving
              uint256 constant MAX_DATA_SIZE = 117964;
              uint64 constant NO_CHAL_INDEX = 0;
              // Expected seconds per block in Ethereum PoS
              uint256 constant ETH_POS_BLOCK_TIME = 12;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IDelayedMessageProvider {
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  /// same as InboxMessageDelivered but the batch data is available in tx.input
                  event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../challenge/IChallengeManager.sol";
              import "../challenge/ChallengeLib.sol";
              import "../state/GlobalState.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IInbox.sol";
              import "./IRollupEventInbox.sol";
              import "./IRollupLogic.sol";
              struct Config {
                  uint64 confirmPeriodBlocks;
                  uint64 extraChallengeTimeBlocks;
                  address stakeToken;
                  uint256 baseStake;
                  bytes32 wasmModuleRoot;
                  address owner;
                  address loserStakeEscrow;
                  uint256 chainId;
                  uint64 genesisBlockNum;
                  ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation;
              }
              struct ContractDependencies {
                  IBridge bridge;
                  ISequencerInbox sequencerInbox;
                  IInbox inbox;
                  IOutbox outbox;
                  IRollupEventInbox rollupEventInbox;
                  IChallengeManager challengeManager;
                  IRollupAdmin rollupAdminLogic;
                  IRollupUser rollupUserLogic;
                  // misc contracts that are useful when interacting with the rollup
                  address validatorUtils;
                  address validatorWalletCreator;
              }
              library RollupLib {
                  using GlobalStateLib for GlobalState;
                  struct ExecutionState {
                      GlobalState globalState;
                      MachineStatus machineStatus;
                  }
                  function stateHash(ExecutionState calldata execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  /// @dev same as stateHash but expects execState in memory instead of calldata
                  function stateHashMem(ExecutionState memory execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  struct Assertion {
                      ExecutionState beforeState;
                      ExecutionState afterState;
                      uint64 numBlocks;
                  }
                  function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
                      MachineStatus[2] memory statuses;
                      statuses[0] = assertion.beforeState.machineStatus;
                      statuses[1] = assertion.afterState.machineStatus;
                      GlobalState[2] memory globalStates;
                      globalStates[0] = assertion.beforeState.globalState;
                      globalStates[1] = assertion.afterState.globalState;
                      // TODO: benchmark how much this abstraction adds of gas overhead
                      return executionHash(statuses, globalStates, assertion.numBlocks);
                  }
                  function executionHash(
                      MachineStatus[2] memory statuses,
                      GlobalState[2] memory globalStates,
                      uint64 numBlocks
                  ) internal pure returns (bytes32) {
                      bytes32[] memory segments = new bytes32[](2);
                      segments[0] = ChallengeLib.blockStateHash(statuses[0], globalStates[0].hash());
                      segments[1] = ChallengeLib.blockStateHash(statuses[1], globalStates[1].hash());
                      return ChallengeLib.hashChallengeState(0, numBlocks, segments);
                  }
                  function challengeRootHash(
                      bytes32 execution,
                      uint256 proposedTime,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(execution, proposedTime, wasmModuleRoot));
                  }
                  function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
                      return
                          confirmHash(
                              assertion.afterState.globalState.getBlockHash(),
                              assertion.afterState.globalState.getSendRoot()
                          );
                  }
                  function confirmHash(bytes32 blockHash, bytes32 sendRoot) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(blockHash, sendRoot));
                  }
                  function nodeHash(
                      bool hasSibling,
                      bytes32 lastHash,
                      bytes32 assertionExecHash,
                      bytes32 inboxAcc,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      uint8 hasSiblingInt = hasSibling ? 1 : 0;
                      return
                          keccak256(
                              abi.encodePacked(
                                  hasSiblingInt,
                                  lastHash,
                                  assertionExecHash,
                                  inboxAcc,
                                  wasmModuleRoot
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Node.sol";
              import "./RollupLib.sol";
              interface IRollupCore {
                  struct Staker {
                      uint256 amountStaked;
                      uint64 index;
                      uint64 latestStakedNode;
                      // currentChallenge is 0 if staker is not in a challenge
                      uint64 currentChallenge;
                      bool isStaked;
                  }
                  event RollupInitialized(bytes32 machineHash, uint256 chainId);
                  event NodeCreated(
                      uint64 indexed nodeNum,
                      bytes32 indexed parentNodeHash,
                      bytes32 indexed nodeHash,
                      bytes32 executionHash,
                      RollupLib.Assertion assertion,
                      bytes32 afterInboxBatchAcc,
                      bytes32 wasmModuleRoot,
                      uint256 inboxMaxCount
                  );
                  event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot);
                  event NodeRejected(uint64 indexed nodeNum);
                  event RollupChallengeStarted(
                      uint64 indexed challengeIndex,
                      address asserter,
                      address challenger,
                      uint64 challengedNode
                  );
                  event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
                  event UserWithdrawableFundsUpdated(
                      address indexed user,
                      uint256 initialBalance,
                      uint256 finalBalance
                  );
                  function confirmPeriodBlocks() external view returns (uint64);
                  function extraChallengeTimeBlocks() external view returns (uint64);
                  function chainId() external view returns (uint256);
                  function baseStake() external view returns (uint256);
                  function wasmModuleRoot() external view returns (bytes32);
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  function outbox() external view returns (IOutbox);
                  function rollupEventInbox() external view returns (IRollupEventInbox);
                  function challengeManager() external view returns (IChallengeManager);
                  function loserStakeEscrow() external view returns (address);
                  function stakeToken() external view returns (address);
                  function minimumAssertionPeriod() external view returns (uint256);
                  function isValidator(address) external view returns (bool);
                  function validatorWhitelistDisabled() external view returns (bool);
                  /**
                   * @notice Get the Node for the given index.
                   */
                  function getNode(uint64 nodeNum) external view returns (Node memory);
                  /**
                   * @notice Check if the specified node has been staked on by the provided staker.
                   * Only accurate at the latest confirmed node and afterwards.
                   */
                  function nodeHasStaker(uint64 nodeNum, address staker) external view returns (bool);
                  /**
                   * @notice Get the address of the staker at the given index
                   * @param stakerNum Index of the staker
                   * @return Address of the staker
                   */
                  function getStakerAddress(uint64 stakerNum) external view returns (address);
                  /**
                   * @notice Check whether the given staker is staked
                   * @param staker Staker address to check
                   * @return True or False for whether the staker was staked
                   */
                  function isStaked(address staker) external view returns (bool);
                  /**
                   * @notice Get the latest staked node of the given staker
                   * @param staker Staker address to lookup
                   * @return Latest node staked of the staker
                   */
                  function latestStakedNode(address staker) external view returns (uint64);
                  /**
                   * @notice Get the current challenge of the given staker
                   * @param staker Staker address to lookup
                   * @return Current challenge of the staker
                   */
                  function currentChallenge(address staker) external view returns (uint64);
                  /**
                   * @notice Get the amount staked of the given staker
                   * @param staker Staker address to lookup
                   * @return Amount staked of the staker
                   */
                  function amountStaked(address staker) external view returns (uint256);
                  /**
                   * @notice Retrieves stored information about a requested staker
                   * @param staker Staker address to retrieve
                   * @return A structure with information about the requested staker
                   */
                  function getStaker(address staker) external view returns (Staker memory);
                  /**
                   * @notice Get the original staker address of the zombie at the given index
                   * @param zombieNum Index of the zombie to lookup
                   * @return Original staker address of the zombie
                   */
                  function zombieAddress(uint256 zombieNum) external view returns (address);
                  /**
                   * @notice Get Latest node that the given zombie at the given index is staked on
                   * @param zombieNum Index of the zombie to lookup
                   * @return Latest node that the given zombie is staked on
                   */
                  function zombieLatestStakedNode(uint256 zombieNum) external view returns (uint64);
                  /// @return Current number of un-removed zombies
                  function zombieCount() external view returns (uint256);
                  function isZombie(address staker) external view returns (bool);
                  /**
                   * @notice Get the amount of funds withdrawable by the given address
                   * @param owner Address to check the funds of
                   * @return Amount of funds withdrawable by owner
                   */
                  function withdrawableFunds(address owner) external view returns (uint256);
                  /**
                   * @return Index of the first unresolved node
                   * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
                   */
                  function firstUnresolvedNode() external view returns (uint64);
                  /// @return Index of the latest confirmed node
                  function latestConfirmed() external view returns (uint64);
                  /// @return Index of the latest rollup node created
                  function latestNodeCreated() external view returns (uint64);
                  /// @return Ethereum block that the most recent stake was created
                  function lastStakeBlock() external view returns (uint64);
                  /// @return Number of active stakers currently staked
                  function stakerCount() external view returns (uint64);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              interface IOutbox {
                  event SendRootUpdated(bytes32 indexed outputRoot, bytes32 indexed l2BlockHash);
                  event OutBoxTransactionExecuted(
                      address indexed to,
                      address indexed l2Sender,
                      uint256 indexed zero,
                      uint256 transactionIndex
                  );
                  function rollup() external view returns (address); // the rollup contract
                  function bridge() external view returns (IBridge); // the bridge contract
                  function spent(uint256) external view returns (bytes32); // packed spent bitmap
                  function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash
                  // solhint-disable-next-line func-name-mixedcase
                  function OUTBOX_VERSION() external view returns (uint128); // the outbox version
                  function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
                  /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account
                  ///         When the return value is zero, that means this is a system message
                  /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies
                  function l2ToL1Sender() external view returns (address);
                  /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Block() external view returns (uint256);
                  /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1EthBlock() external view returns (uint256);
                  /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Timestamp() external view returns (uint256);
                  /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active
                  function l2ToL1OutputId() external view returns (bytes32);
                  /**
                   * @notice Executes a messages in an Outbox entry.
                   * @dev Reverts if dispute period hasn't expired, since the outbox entry
                   *      is only created once the rollup confirms the respective assertion.
                   * @dev it is not possible to execute any L2-to-L1 transaction which contains data
                   *      to a contract address without any code (as enforced by the Bridge contract).
                   * @param proof Merkle proof of message inclusion in send root
                   * @param index Merkle path to message
                   * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
                   * @param to destination address for L1 contract call
                   * @param l2Block l2 block number at which sendTxToL1 call was made
                   * @param l1Block l1 block number at which sendTxToL1 call was made
                   * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
                   * @param value wei in L1 message
                   * @param data abi-encoded L1 message data
                   */
                  function executeTransaction(
                      bytes32[] calldata proof,
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   *  @dev function used to simulate the result of a particular function call from the outbox
                   *       it is useful for things such as gas estimates. This function includes all costs except for
                   *       proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
                   *       not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
                   *       We can't include the cost of proof validation since this is intended to be used to simulate txs
                   *       that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
                   *       to confirm a pending merkle root, but that would be less practical for integrating with tooling.
                   *       It is only possible to trigger it when the msg sender is address zero, which should be impossible
                   *       unless under simulation in an eth_call or eth_estimateGas
                   */
                  function executeTransactionSimulation(
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   * @param index Merkle path to message
                   * @return true if the message has been spent
                   */
                  function isSpent(uint256 index) external view returns (bool);
                  function calculateItemHash(
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external pure returns (bytes32);
                  function calculateMerkleRoot(
                      bytes32[] memory proof,
                      uint256 path,
                      bytes32 item
                  ) external pure returns (bytes32);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../osp/IOneStepProofEntry.sol";
              import "./IChallengeResultReceiver.sol";
              import "./ChallengeLib.sol";
              interface IChallengeManager {
                  enum ChallengeTerminationType {
                      TIMEOUT,
                      BLOCK_PROOF,
                      EXECUTION_PROOF,
                      CLEARED
                  }
                  event InitiatedChallenge(
                      uint64 indexed challengeIndex,
                      GlobalState startState,
                      GlobalState endState
                  );
                  event Bisected(
                      uint64 indexed challengeIndex,
                      bytes32 indexed challengeRoot,
                      uint256 challengedSegmentStart,
                      uint256 challengedSegmentLength,
                      bytes32[] chainHashes
                  );
                  event ExecutionChallengeBegun(uint64 indexed challengeIndex, uint256 blockSteps);
                  event OneStepProofCompleted(uint64 indexed challengeIndex);
                  event ChallengeEnded(uint64 indexed challengeIndex, ChallengeTerminationType kind);
                  function initialize(
                      IChallengeResultReceiver resultReceiver_,
                      ISequencerInbox sequencerInbox_,
                      IBridge bridge_,
                      IOneStepProofEntry osp_
                  ) external;
                  function createChallenge(
                      bytes32 wasmModuleRoot_,
                      MachineStatus[2] calldata startAndEndMachineStatuses_,
                      GlobalState[2] calldata startAndEndGlobalStates_,
                      uint64 numBlocks,
                      address asserter_,
                      address challenger_,
                      uint256 asserterTimeLeft_,
                      uint256 challengerTimeLeft_
                  ) external returns (uint64);
                  function challengeInfo(uint64 challengeIndex_)
                      external
                      view
                      returns (ChallengeLib.Challenge memory);
                  function currentResponder(uint64 challengeIndex) external view returns (address);
                  function isTimedOut(uint64 challengeIndex) external view returns (bool);
                  function clearChallenge(uint64 challengeIndex_) external;
                  function timeout(uint64 challengeIndex_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/GlobalState.sol";
              library ChallengeLib {
                  using MachineLib for Machine;
                  using ChallengeLib for Challenge;
                  /// @dev It's assumed that that uninitialzed challenges have mode NONE
                  enum ChallengeMode {
                      NONE,
                      BLOCK,
                      EXECUTION
                  }
                  struct Participant {
                      address addr;
                      uint256 timeLeft;
                  }
                  struct Challenge {
                      Participant current;
                      Participant next;
                      uint256 lastMoveTimestamp;
                      bytes32 wasmModuleRoot;
                      bytes32 challengeStateHash;
                      uint64 maxInboxMessages;
                      ChallengeMode mode;
                  }
                  struct SegmentSelection {
                      uint256 oldSegmentsStart;
                      uint256 oldSegmentsLength;
                      bytes32[] oldSegments;
                      uint256 challengePosition;
                  }
                  function timeUsedSinceLastMove(Challenge storage challenge) internal view returns (uint256) {
                      return block.timestamp - challenge.lastMoveTimestamp;
                  }
                  function isTimedOut(Challenge storage challenge) internal view returns (bool) {
                      return challenge.timeUsedSinceLastMove() > challenge.current.timeLeft;
                  }
                  function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
                      internal
                      pure
                      returns (bytes32)
                  {
                      // Start the value stack with the function call ABI for the entrypoint
                      Value[] memory startingValues = new Value[](3);
                      startingValues[0] = ValueLib.newRefNull();
                      startingValues[1] = ValueLib.newI32(0);
                      startingValues[2] = ValueLib.newI32(0);
                      ValueArray memory valuesArray = ValueArray({inner: startingValues});
                      ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0});
                      ValueStack memory internalStack;
                      StackFrameWindow memory frameStack;
                      Machine memory mach = Machine({
                          status: MachineStatus.RUNNING,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: 0,
                          functionIdx: 0,
                          functionPc: 0,
                          modulesRoot: wasmModuleRoot
                      });
                      return mach.hash();
                  }
                  function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
                  function extractChallengeSegment(SegmentSelection calldata selection)
                      internal
                      pure
                      returns (uint256 segmentStart, uint256 segmentLength)
                  {
                      uint256 oldChallengeDegree = selection.oldSegments.length - 1;
                      segmentLength = selection.oldSegmentsLength / oldChallengeDegree;
                      // Intentionally done before challengeLength is potentially added to for the final segment
                      segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition;
                      if (selection.challengePosition == selection.oldSegments.length - 2) {
                          segmentLength += selection.oldSegmentsLength % oldChallengeDegree;
                      }
                  }
                  function hashChallengeState(
                      uint256 segmentsStart,
                      uint256 segmentsLength,
                      bytes32[] memory segments
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(segmentsStart, segmentsLength, segments));
                  }
                  function blockStateHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Block state:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Block state, errored:", globalStateHash));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Block state, too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct GlobalState {
                  bytes32[2] bytes32Vals;
                  uint64[2] u64Vals;
              }
              library GlobalStateLib {
                  uint16 internal constant BYTES32_VALS_NUM = 2;
                  uint16 internal constant U64_VALS_NUM = 2;
                  function hash(GlobalState memory state) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Global state:",
                                  state.bytes32Vals[0],
                                  state.bytes32Vals[1],
                                  state.u64Vals[0],
                                  state.u64Vals[1]
                              )
                          );
                  }
                  function getBlockHash(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[0];
                  }
                  function getSendRoot(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[1];
                  }
                  function getInboxPosition(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[0];
                  }
                  function getPositionInMessage(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[1];
                  }
                  function isEmpty(GlobalState calldata state) internal pure returns (bool) {
                      return (state.bytes32Vals[0] == bytes32(0) &&
                          state.bytes32Vals[1] == bytes32(0) &&
                          state.u64Vals[0] == 0 &&
                          state.u64Vals[1] == 0);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../bridge/IBridge.sol";
              interface IRollupEventInbox {
                  function bridge() external view returns (IBridge);
                  function initialize(IBridge _bridge) external;
                  function rollup() external view returns (address);
                  function rollupInitialized(uint256 chainId) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ValueStack.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              enum MachineStatus {
                  RUNNING,
                  FINISHED,
                  ERRORED,
                  TOO_FAR
              }
              struct Machine {
                  MachineStatus status;
                  ValueStack valueStack;
                  ValueStack internalStack;
                  StackFrameWindow frameStack;
                  bytes32 globalStateHash;
                  uint32 moduleIdx;
                  uint32 functionIdx;
                  uint32 functionPc;
                  bytes32 modulesRoot;
              }
              library MachineLib {
                  using StackFrameLib for StackFrameWindow;
                  using ValueStackLib for ValueStack;
                  function hash(Machine memory mach) internal pure returns (bytes32) {
                      // Warning: the non-running hashes are replicated in Challenge
                      if (mach.status == MachineStatus.RUNNING) {
                          return
                              keccak256(
                                  abi.encodePacked(
                                      "Machine running:",
                                      mach.valueStack.hash(),
                                      mach.internalStack.hash(),
                                      mach.frameStack.hash(),
                                      mach.globalStateHash,
                                      mach.moduleIdx,
                                      mach.functionIdx,
                                      mach.functionPc,
                                      mach.modulesRoot
                                  )
                              );
                      } else if (mach.status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", mach.globalStateHash));
                      } else if (mach.status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (mach.status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_MACH_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./IOneStepProver.sol";
              library OneStepProofEntryLib {
                  uint256 internal constant MAX_STEPS = 1 << 43;
              }
              interface IOneStepProofEntry {
                  function proveOneStep(
                      ExecutionContext calldata execCtx,
                      uint256 machineStep,
                      bytes32 beforeHash,
                      bytes calldata proof
                  ) external view returns (bytes32 afterHash);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              interface IChallengeResultReceiver {
                  function completeChallenge(
                      uint256 challengeIndex,
                      address winner,
                      address loser
                  ) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueArray.sol";
              struct ValueStack {
                  ValueArray proved;
                  bytes32 remainingHash;
              }
              library ValueStackLib {
                  using ValueLib for Value;
                  using ValueArrayLib for ValueArray;
                  function hash(ValueStack memory stack) internal pure returns (bytes32 h) {
                      h = stack.remainingHash;
                      uint256 len = stack.proved.length();
                      for (uint256 i = 0; i < len; i++) {
                          h = keccak256(abi.encodePacked("Value stack:", stack.proved.get(i).hash(), h));
                      }
                  }
                  function peek(ValueStack memory stack) internal pure returns (Value memory) {
                      uint256 len = stack.proved.length();
                      return stack.proved.get(len - 1);
                  }
                  function pop(ValueStack memory stack) internal pure returns (Value memory) {
                      return stack.proved.pop();
                  }
                  function push(ValueStack memory stack, Value memory val) internal pure {
                      return stack.proved.push(val);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Instruction {
                  uint16 opcode;
                  uint256 argumentData;
              }
              library Instructions {
                  uint16 internal constant UNREACHABLE = 0x00;
                  uint16 internal constant NOP = 0x01;
                  uint16 internal constant RETURN = 0x0F;
                  uint16 internal constant CALL = 0x10;
                  uint16 internal constant CALL_INDIRECT = 0x11;
                  uint16 internal constant LOCAL_GET = 0x20;
                  uint16 internal constant LOCAL_SET = 0x21;
                  uint16 internal constant GLOBAL_GET = 0x23;
                  uint16 internal constant GLOBAL_SET = 0x24;
                  uint16 internal constant I32_LOAD = 0x28;
                  uint16 internal constant I64_LOAD = 0x29;
                  uint16 internal constant F32_LOAD = 0x2A;
                  uint16 internal constant F64_LOAD = 0x2B;
                  uint16 internal constant I32_LOAD8_S = 0x2C;
                  uint16 internal constant I32_LOAD8_U = 0x2D;
                  uint16 internal constant I32_LOAD16_S = 0x2E;
                  uint16 internal constant I32_LOAD16_U = 0x2F;
                  uint16 internal constant I64_LOAD8_S = 0x30;
                  uint16 internal constant I64_LOAD8_U = 0x31;
                  uint16 internal constant I64_LOAD16_S = 0x32;
                  uint16 internal constant I64_LOAD16_U = 0x33;
                  uint16 internal constant I64_LOAD32_S = 0x34;
                  uint16 internal constant I64_LOAD32_U = 0x35;
                  uint16 internal constant I32_STORE = 0x36;
                  uint16 internal constant I64_STORE = 0x37;
                  uint16 internal constant F32_STORE = 0x38;
                  uint16 internal constant F64_STORE = 0x39;
                  uint16 internal constant I32_STORE8 = 0x3A;
                  uint16 internal constant I32_STORE16 = 0x3B;
                  uint16 internal constant I64_STORE8 = 0x3C;
                  uint16 internal constant I64_STORE16 = 0x3D;
                  uint16 internal constant I64_STORE32 = 0x3E;
                  uint16 internal constant MEMORY_SIZE = 0x3F;
                  uint16 internal constant MEMORY_GROW = 0x40;
                  uint16 internal constant DROP = 0x1A;
                  uint16 internal constant SELECT = 0x1B;
                  uint16 internal constant I32_CONST = 0x41;
                  uint16 internal constant I64_CONST = 0x42;
                  uint16 internal constant F32_CONST = 0x43;
                  uint16 internal constant F64_CONST = 0x44;
                  uint16 internal constant I32_EQZ = 0x45;
                  uint16 internal constant I32_RELOP_BASE = 0x46;
                  uint16 internal constant IRELOP_EQ = 0;
                  uint16 internal constant IRELOP_NE = 1;
                  uint16 internal constant IRELOP_LT_S = 2;
                  uint16 internal constant IRELOP_LT_U = 3;
                  uint16 internal constant IRELOP_GT_S = 4;
                  uint16 internal constant IRELOP_GT_U = 5;
                  uint16 internal constant IRELOP_LE_S = 6;
                  uint16 internal constant IRELOP_LE_U = 7;
                  uint16 internal constant IRELOP_GE_S = 8;
                  uint16 internal constant IRELOP_GE_U = 9;
                  uint16 internal constant IRELOP_LAST = IRELOP_GE_U;
                  uint16 internal constant I64_EQZ = 0x50;
                  uint16 internal constant I64_RELOP_BASE = 0x51;
                  uint16 internal constant I32_UNOP_BASE = 0x67;
                  uint16 internal constant IUNOP_CLZ = 0;
                  uint16 internal constant IUNOP_CTZ = 1;
                  uint16 internal constant IUNOP_POPCNT = 2;
                  uint16 internal constant IUNOP_LAST = IUNOP_POPCNT;
                  uint16 internal constant I32_ADD = 0x6A;
                  uint16 internal constant I32_SUB = 0x6B;
                  uint16 internal constant I32_MUL = 0x6C;
                  uint16 internal constant I32_DIV_S = 0x6D;
                  uint16 internal constant I32_DIV_U = 0x6E;
                  uint16 internal constant I32_REM_S = 0x6F;
                  uint16 internal constant I32_REM_U = 0x70;
                  uint16 internal constant I32_AND = 0x71;
                  uint16 internal constant I32_OR = 0x72;
                  uint16 internal constant I32_XOR = 0x73;
                  uint16 internal constant I32_SHL = 0x74;
                  uint16 internal constant I32_SHR_S = 0x75;
                  uint16 internal constant I32_SHR_U = 0x76;
                  uint16 internal constant I32_ROTL = 0x77;
                  uint16 internal constant I32_ROTR = 0x78;
                  uint16 internal constant I64_UNOP_BASE = 0x79;
                  uint16 internal constant I64_ADD = 0x7C;
                  uint16 internal constant I64_SUB = 0x7D;
                  uint16 internal constant I64_MUL = 0x7E;
                  uint16 internal constant I64_DIV_S = 0x7F;
                  uint16 internal constant I64_DIV_U = 0x80;
                  uint16 internal constant I64_REM_S = 0x81;
                  uint16 internal constant I64_REM_U = 0x82;
                  uint16 internal constant I64_AND = 0x83;
                  uint16 internal constant I64_OR = 0x84;
                  uint16 internal constant I64_XOR = 0x85;
                  uint16 internal constant I64_SHL = 0x86;
                  uint16 internal constant I64_SHR_S = 0x87;
                  uint16 internal constant I64_SHR_U = 0x88;
                  uint16 internal constant I64_ROTL = 0x89;
                  uint16 internal constant I64_ROTR = 0x8A;
                  uint16 internal constant I32_WRAP_I64 = 0xA7;
                  uint16 internal constant I64_EXTEND_I32_S = 0xAC;
                  uint16 internal constant I64_EXTEND_I32_U = 0xAD;
                  uint16 internal constant I32_REINTERPRET_F32 = 0xBC;
                  uint16 internal constant I64_REINTERPRET_F64 = 0xBD;
                  uint16 internal constant F32_REINTERPRET_I32 = 0xBE;
                  uint16 internal constant F64_REINTERPRET_I64 = 0xBF;
                  uint16 internal constant I32_EXTEND_8S = 0xC0;
                  uint16 internal constant I32_EXTEND_16S = 0xC1;
                  uint16 internal constant I64_EXTEND_8S = 0xC2;
                  uint16 internal constant I64_EXTEND_16S = 0xC3;
                  uint16 internal constant I64_EXTEND_32S = 0xC4;
                  uint16 internal constant INIT_FRAME = 0x8002;
                  uint16 internal constant ARBITRARY_JUMP = 0x8003;
                  uint16 internal constant ARBITRARY_JUMP_IF = 0x8004;
                  uint16 internal constant MOVE_FROM_STACK_TO_INTERNAL = 0x8005;
                  uint16 internal constant MOVE_FROM_INTERNAL_TO_STACK = 0x8006;
                  uint16 internal constant DUP = 0x8008;
                  uint16 internal constant CROSS_MODULE_CALL = 0x8009;
                  uint16 internal constant CALLER_MODULE_INTERNAL_CALL = 0x800A;
                  uint16 internal constant GET_GLOBAL_STATE_BYTES32 = 0x8010;
                  uint16 internal constant SET_GLOBAL_STATE_BYTES32 = 0x8011;
                  uint16 internal constant GET_GLOBAL_STATE_U64 = 0x8012;
                  uint16 internal constant SET_GLOBAL_STATE_U64 = 0x8013;
                  uint16 internal constant READ_PRE_IMAGE = 0x8020;
                  uint16 internal constant READ_INBOX_MESSAGE = 0x8021;
                  uint16 internal constant HALT_AND_SET_FINISHED = 0x8022;
                  uint256 internal constant INBOX_INDEX_SEQUENCER = 0;
                  uint256 internal constant INBOX_INDEX_DELAYED = 1;
                  function hash(Instruction memory inst) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Instruction:", inst.opcode, inst.argumentData));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct StackFrame {
                  Value returnPc;
                  bytes32 localsMerkleRoot;
                  uint32 callerModule;
                  uint32 callerModuleInternals;
              }
              struct StackFrameWindow {
                  StackFrame[] proved;
                  bytes32 remainingHash;
              }
              library StackFrameLib {
                  using ValueLib for Value;
                  function hash(StackFrame memory frame) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Stack frame:",
                                  frame.returnPc.hash(),
                                  frame.localsMerkleRoot,
                                  frame.callerModule,
                                  frame.callerModuleInternals
                              )
                          );
                  }
                  function hash(StackFrameWindow memory window) internal pure returns (bytes32 h) {
                      h = window.remainingHash;
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          h = keccak256(abi.encodePacked("Stack frame stack:", hash(window.proved[i]), h));
                      }
                  }
                  function peek(StackFrameWindow memory window) internal pure returns (StackFrame memory) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      return window.proved[0];
                  }
                  function pop(StackFrameWindow memory window) internal pure returns (StackFrame memory frame) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      frame = window.proved[0];
                      window.proved = new StackFrame[](0);
                  }
                  function push(StackFrameWindow memory window, StackFrame memory frame) internal pure {
                      StackFrame[] memory newProved = new StackFrame[](window.proved.length + 1);
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          newProved[i] = window.proved[i];
                      }
                      newProved[window.proved.length] = frame;
                      window.proved = newProved;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              enum ValueType {
                  I32,
                  I64,
                  F32,
                  F64,
                  REF_NULL,
                  FUNC_REF,
                  INTERNAL_REF
              }
              struct Value {
                  ValueType valueType;
                  uint256 contents;
              }
              library ValueLib {
                  function hash(Value memory val) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Value:", val.valueType, val.contents));
                  }
                  function maxValueType() internal pure returns (ValueType) {
                      return ValueType.INTERNAL_REF;
                  }
                  function assumeI32(Value memory val) internal pure returns (uint32) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I32, "NOT_I32");
                      require(uintval < (1 << 32), "BAD_I32");
                      return uint32(uintval);
                  }
                  function assumeI64(Value memory val) internal pure returns (uint64) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I64, "NOT_I64");
                      require(uintval < (1 << 64), "BAD_I64");
                      return uint64(uintval);
                  }
                  function newRefNull() internal pure returns (Value memory) {
                      return Value({valueType: ValueType.REF_NULL, contents: 0});
                  }
                  function newI32(uint32 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I32, contents: uint256(x)});
                  }
                  function newI64(uint64 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I64, contents: uint256(x)});
                  }
                  function newBoolean(bool x) internal pure returns (Value memory) {
                      if (x) {
                          return newI32(uint32(1));
                      } else {
                          return newI32(uint32(0));
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct ValueArray {
                  Value[] inner;
              }
              library ValueArrayLib {
                  function get(ValueArray memory arr, uint256 index) internal pure returns (Value memory) {
                      return arr.inner[index];
                  }
                  function set(
                      ValueArray memory arr,
                      uint256 index,
                      Value memory val
                  ) internal pure {
                      arr.inner[index] = val;
                  }
                  function length(ValueArray memory arr) internal pure returns (uint256) {
                      return arr.inner.length;
                  }
                  function push(ValueArray memory arr, Value memory val) internal pure {
                      Value[] memory newInner = new Value[](arr.inner.length + 1);
                      for (uint256 i = 0; i < arr.inner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      newInner[arr.inner.length] = val;
                      arr.inner = newInner;
                  }
                  function pop(ValueArray memory arr) internal pure returns (Value memory popped) {
                      popped = arr.inner[arr.inner.length - 1];
                      Value[] memory newInner = new Value[](arr.inner.length - 1);
                      for (uint256 i = 0; i < newInner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      arr.inner = newInner;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/Module.sol";
              import "../state/Instructions.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              struct ExecutionContext {
                  uint256 maxInboxMessagesRead;
                  IBridge bridge;
              }
              abstract contract IOneStepProver {
                  function executeOneStep(
                      ExecutionContext memory execCtx,
                      Machine calldata mach,
                      Module calldata mod,
                      Instruction calldata instruction,
                      bytes calldata proof
                  ) external view virtual returns (Machine memory result, Module memory resultMod);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ModuleMemory.sol";
              struct Module {
                  bytes32 globalsMerkleRoot;
                  ModuleMemory moduleMemory;
                  bytes32 tablesMerkleRoot;
                  bytes32 functionsMerkleRoot;
                  uint32 internalsOffset;
              }
              library ModuleLib {
                  using ModuleMemoryLib for ModuleMemory;
                  function hash(Module memory mod) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Module:",
                                  mod.globalsMerkleRoot,
                                  mod.moduleMemory.hash(),
                                  mod.tablesMerkleRoot,
                                  mod.functionsMerkleRoot,
                                  mod.internalsOffset
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./MerkleProof.sol";
              import "./Deserialize.sol";
              struct ModuleMemory {
                  uint64 size;
                  uint64 maxSize;
                  bytes32 merkleRoot;
              }
              library ModuleMemoryLib {
                  using MerkleProofLib for MerkleProof;
                  function hash(ModuleMemory memory mem) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Memory:", mem.size, mem.maxSize, mem.merkleRoot));
                  }
                  function proveLeaf(
                      ModuleMemory memory mem,
                      uint256 leafIdx,
                      bytes calldata proof,
                      uint256 startOffset
                  )
                      internal
                      pure
                      returns (
                          bytes32 contents,
                          uint256 offset,
                          MerkleProof memory merkle
                      )
                  {
                      offset = startOffset;
                      (contents, offset) = Deserialize.b32(proof, offset);
                      (merkle, offset) = Deserialize.merkleProof(proof, offset);
                      bytes32 recomputedRoot = merkle.computeRootFromMemory(leafIdx, contents);
                      require(recomputedRoot == mem.merkleRoot, "WRONG_MEM_ROOT");
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./Instructions.sol";
              import "./Module.sol";
              struct MerkleProof {
                  bytes32[] counterparts;
              }
              library MerkleProofLib {
                  using ModuleLib for Module;
                  using ValueLib for Value;
                  function computeRootFromValue(
                      MerkleProof memory proof,
                      uint256 index,
                      Value memory leaf
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, leaf.hash(), "Value merkle tree:");
                  }
                  function computeRootFromInstruction(
                      MerkleProof memory proof,
                      uint256 index,
                      Instruction memory inst
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, Instructions.hash(inst), "Instruction merkle tree:");
                  }
                  function computeRootFromFunction(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 codeRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Function:", codeRoot));
                      return computeRootUnsafe(proof, index, h, "Function merkle tree:");
                  }
                  function computeRootFromMemory(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 contents
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Memory leaf:", contents));
                      return computeRootUnsafe(proof, index, h, "Memory merkle tree:");
                  }
                  function computeRootFromElement(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 funcTypeHash,
                      Value memory val
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table element:", funcTypeHash, val.hash()));
                      return computeRootUnsafe(proof, index, h, "Table element merkle tree:");
                  }
                  function computeRootFromTable(
                      MerkleProof memory proof,
                      uint256 index,
                      uint8 tableType,
                      uint64 tableSize,
                      bytes32 elementsRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table:", tableType, tableSize, elementsRoot));
                      return computeRootUnsafe(proof, index, h, "Table merkle tree:");
                  }
                  function computeRootFromModule(
                      MerkleProof memory proof,
                      uint256 index,
                      Module memory mod
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, mod.hash(), "Module merkle tree:");
                  }
                  // WARNING: leafHash must be computed in such a way that it cannot be a non-leaf hash.
                  function computeRootUnsafe(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 leafHash,
                      string memory prefix
                  ) internal pure returns (bytes32 h) {
                      h = leafHash;
                      for (uint256 layer = 0; layer < proof.counterparts.length; layer++) {
                          if (index & 1 == 0) {
                              h = keccak256(abi.encodePacked(prefix, h, proof.counterparts[layer]));
                          } else {
                              h = keccak256(abi.encodePacked(prefix, proof.counterparts[layer], h));
                          }
                          index >>= 1;
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueStack.sol";
              import "./Machine.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              import "./MerkleProof.sol";
              import "./ModuleMemory.sol";
              import "./Module.sol";
              import "./GlobalState.sol";
              library Deserialize {
                  function u8(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint8 ret, uint256 offset)
                  {
                      offset = startOffset;
                      ret = uint8(proof[offset]);
                      offset++;
                  }
                  function u16(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint16 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 16 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 32 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u64(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint64 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 64 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u256(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint256 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 256 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function b32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (bytes32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      uint256 retInt;
                      (retInt, offset) = u256(proof, offset);
                      ret = bytes32(retInt);
                  }
                  function value(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Value memory val, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 typeInt = uint8(proof[offset]);
                      offset++;
                      require(typeInt <= uint8(ValueLib.maxValueType()), "BAD_VALUE_TYPE");
                      uint256 contents;
                      (contents, offset) = u256(proof, offset);
                      val = Value({valueType: ValueType(typeInt), contents: contents});
                  }
                  function valueStack(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ValueStack memory stack, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      uint256 provedLength;
                      (provedLength, offset) = u256(proof, offset);
                      Value[] memory proved = new Value[](provedLength);
                      for (uint256 i = 0; i < proved.length; i++) {
                          (proved[i], offset) = value(proof, offset);
                      }
                      stack = ValueStack({proved: ValueArray(proved), remainingHash: remainingHash});
                  }
                  function instruction(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Instruction memory inst, uint256 offset)
                  {
                      offset = startOffset;
                      uint16 opcode;
                      uint256 data;
                      (opcode, offset) = u16(proof, offset);
                      (data, offset) = u256(proof, offset);
                      inst = Instruction({opcode: opcode, argumentData: data});
                  }
                  function stackFrame(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrame memory window, uint256 offset)
                  {
                      offset = startOffset;
                      Value memory returnPc;
                      bytes32 localsMerkleRoot;
                      uint32 callerModule;
                      uint32 callerModuleInternals;
                      (returnPc, offset) = value(proof, offset);
                      (localsMerkleRoot, offset) = b32(proof, offset);
                      (callerModule, offset) = u32(proof, offset);
                      (callerModuleInternals, offset) = u32(proof, offset);
                      window = StackFrame({
                          returnPc: returnPc,
                          localsMerkleRoot: localsMerkleRoot,
                          callerModule: callerModule,
                          callerModuleInternals: callerModuleInternals
                      });
                  }
                  function stackFrameWindow(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrameWindow memory window, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      StackFrame[] memory proved;
                      if (proof[offset] != 0) {
                          offset++;
                          proved = new StackFrame[](1);
                          (proved[0], offset) = stackFrame(proof, offset);
                      } else {
                          offset++;
                          proved = new StackFrame[](0);
                      }
                      window = StackFrameWindow({proved: proved, remainingHash: remainingHash});
                  }
                  function moduleMemory(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ModuleMemory memory mem, uint256 offset)
                  {
                      offset = startOffset;
                      uint64 size;
                      uint64 maxSize;
                      bytes32 root;
                      (size, offset) = u64(proof, offset);
                      (maxSize, offset) = u64(proof, offset);
                      (root, offset) = b32(proof, offset);
                      mem = ModuleMemory({size: size, maxSize: maxSize, merkleRoot: root});
                  }
                  function module(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Module memory mod, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 globalsMerkleRoot;
                      ModuleMemory memory mem;
                      bytes32 tablesMerkleRoot;
                      bytes32 functionsMerkleRoot;
                      uint32 internalsOffset;
                      (globalsMerkleRoot, offset) = b32(proof, offset);
                      (mem, offset) = moduleMemory(proof, offset);
                      (tablesMerkleRoot, offset) = b32(proof, offset);
                      (functionsMerkleRoot, offset) = b32(proof, offset);
                      (internalsOffset, offset) = u32(proof, offset);
                      mod = Module({
                          globalsMerkleRoot: globalsMerkleRoot,
                          moduleMemory: mem,
                          tablesMerkleRoot: tablesMerkleRoot,
                          functionsMerkleRoot: functionsMerkleRoot,
                          internalsOffset: internalsOffset
                      });
                  }
                  function globalState(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (GlobalState memory state, uint256 offset)
                  {
                      offset = startOffset;
                      // using constant ints for array size requires newer solidity
                      bytes32[2] memory bytes32Vals;
                      uint64[2] memory u64Vals;
                      for (uint8 i = 0; i < GlobalStateLib.BYTES32_VALS_NUM; i++) {
                          (bytes32Vals[i], offset) = b32(proof, offset);
                      }
                      for (uint8 i = 0; i < GlobalStateLib.U64_VALS_NUM; i++) {
                          (u64Vals[i], offset) = u64(proof, offset);
                      }
                      state = GlobalState({bytes32Vals: bytes32Vals, u64Vals: u64Vals});
                  }
                  function machine(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Machine memory mach, uint256 offset)
                  {
                      offset = startOffset;
                      MachineStatus status;
                      {
                          uint8 statusU8;
                          (statusU8, offset) = u8(proof, offset);
                          if (statusU8 == 0) {
                              status = MachineStatus.RUNNING;
                          } else if (statusU8 == 1) {
                              status = MachineStatus.FINISHED;
                          } else if (statusU8 == 2) {
                              status = MachineStatus.ERRORED;
                          } else if (statusU8 == 3) {
                              status = MachineStatus.TOO_FAR;
                          } else {
                              revert("UNKNOWN_MACH_STATUS");
                          }
                      }
                      ValueStack memory values;
                      ValueStack memory internalStack;
                      bytes32 globalStateHash;
                      uint32 moduleIdx;
                      uint32 functionIdx;
                      uint32 functionPc;
                      StackFrameWindow memory frameStack;
                      bytes32 modulesRoot;
                      (values, offset) = valueStack(proof, offset);
                      (internalStack, offset) = valueStack(proof, offset);
                      (frameStack, offset) = stackFrameWindow(proof, offset);
                      (globalStateHash, offset) = b32(proof, offset);
                      (moduleIdx, offset) = u32(proof, offset);
                      (functionIdx, offset) = u32(proof, offset);
                      (functionPc, offset) = u32(proof, offset);
                      (modulesRoot, offset) = b32(proof, offset);
                      mach = Machine({
                          status: status,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: moduleIdx,
                          functionIdx: functionIdx,
                          functionPc: functionPc,
                          modulesRoot: modulesRoot
                      });
                  }
                  function merkleProof(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (MerkleProof memory merkle, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 length;
                      (length, offset) = u8(proof, offset);
                      bytes32[] memory counterparts = new bytes32[](length);
                      for (uint8 i = 0; i < length; i++) {
                          (counterparts[i], offset) = b32(proof, offset);
                      }
                      merkle = MerkleProof(counterparts);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Node {
                  // Hash of the state of the chain as of this node
                  bytes32 stateHash;
                  // Hash of the data that can be challenged
                  bytes32 challengeHash;
                  // Hash of the data that will be committed if this node is confirmed
                  bytes32 confirmData;
                  // Index of the node previous to this one
                  uint64 prevNum;
                  // Deadline at which this node can be confirmed
                  uint64 deadlineBlock;
                  // Deadline at which a child of this node can be confirmed
                  uint64 noChildConfirmedBeforeBlock;
                  // Number of stakers staked on this node. This includes real stakers and zombies
                  uint64 stakerCount;
                  // Number of stakers staked on a child node. This includes real stakers and zombies
                  uint64 childStakerCount;
                  // This value starts at zero and is set to a value when the first child is created. After that it is constant until the node is destroyed or the owner destroys pending nodes
                  uint64 firstChildBlock;
                  // The number of the latest child of this node to be created
                  uint64 latestChildNumber;
                  // The block number when this node was created
                  uint64 createdAtBlock;
                  // A hash of all the data needed to determine this node's validity, to protect against reorgs
                  bytes32 nodeHash;
              }
              /**
               * @notice Utility functions for Node
               */
              library NodeLib {
                  /**
                   * @notice Initialize a Node
                   * @param _stateHash Initial value of stateHash
                   * @param _challengeHash Initial value of challengeHash
                   * @param _confirmData Initial value of confirmData
                   * @param _prevNum Initial value of prevNum
                   * @param _deadlineBlock Initial value of deadlineBlock
                   * @param _nodeHash Initial value of nodeHash
                   */
                  function createNode(
                      bytes32 _stateHash,
                      bytes32 _challengeHash,
                      bytes32 _confirmData,
                      uint64 _prevNum,
                      uint64 _deadlineBlock,
                      bytes32 _nodeHash
                  ) internal view returns (Node memory) {
                      Node memory node;
                      node.stateHash = _stateHash;
                      node.challengeHash = _challengeHash;
                      node.confirmData = _confirmData;
                      node.prevNum = _prevNum;
                      node.deadlineBlock = _deadlineBlock;
                      node.noChildConfirmedBeforeBlock = _deadlineBlock;
                      node.createdAtBlock = uint64(block.number);
                      node.nodeHash = _nodeHash;
                      return node;
                  }
                  /**
                   * @notice Update child properties
                   * @param number The child number to set
                   */
                  function childCreated(Node storage self, uint64 number) internal {
                      if (self.firstChildBlock == 0) {
                          self.firstChildBlock = uint64(block.number);
                      }
                      self.latestChildNumber = number;
                  }
                  /**
                   * @notice Update the child confirmed deadline
                   * @param deadline The new deadline to set
                   */
                  function newChildConfirmDeadline(Node storage self, uint64 deadline) internal {
                      self.noChildConfirmedBeforeBlock = deadline;
                  }
                  /**
                   * @notice Check whether the current block number has met or passed the node's deadline
                   */
                  function requirePastDeadline(Node memory self) internal view {
                      require(block.number >= self.deadlineBlock, "BEFORE_DEADLINE");
                  }
                  /**
                   * @notice Check whether the current block number has met or passed deadline for children of this node to be confirmed
                   */
                  function requirePastChildConfirmDeadline(Node memory self) internal view {
                      require(block.number >= self.noChildConfirmedBeforeBlock, "CHILD_TOO_RECENT");
                  }
              }
              

              File 5 of 5: Bridge
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
              import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
              import {
                  NotContract,
                  NotRollupOrOwner,
                  NotDelayedInbox,
                  NotSequencerInbox,
                  NotOutbox,
                  InvalidOutboxSet,
                  BadSequencerMessageNumber
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./Messages.sol";
              import "../libraries/DelegateCallAware.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              /**
               * @title Staging ground for incoming and outgoing messages
               * @notice Holds the inbox accumulator for sequenced and delayed messages.
               * It is also the ETH escrow for value sent with these messages.
               * Since the escrow is held here, this contract also contains a list of allowed
               * outboxes that can make calls from here and withdraw this escrow.
               */
              contract Bridge is Initializable, DelegateCallAware, IBridge {
                  using AddressUpgradeable for address;
                  struct InOutInfo {
                      uint256 index;
                      bool allowed;
                  }
                  mapping(address => InOutInfo) private allowedDelayedInboxesMap;
                  mapping(address => InOutInfo) private allowedOutboxesMap;
                  address[] public allowedDelayedInboxList;
                  address[] public allowedOutboxList;
                  address private _activeOutbox;
                  /// @inheritdoc IBridge
                  bytes32[] public delayedInboxAccs;
                  /// @inheritdoc IBridge
                  bytes32[] public sequencerInboxAccs;
                  IOwnable public rollup;
                  address public sequencerInbox;
                  uint256 public override sequencerReportedSubMessageCount;
                  address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max);
                  function initialize(IOwnable rollup_) external initializer onlyDelegated {
                      _activeOutbox = EMPTY_ACTIVEOUTBOX;
                      rollup = rollup_;
                  }
                  modifier onlyRollupOrOwner() {
                      if (msg.sender != address(rollup)) {
                          address rollupOwner = rollup.owner();
                          if (msg.sender != rollupOwner) {
                              revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner);
                          }
                      }
                      _;
                  }
                  /// @dev returns the address of current active Outbox, or zero if no outbox is active
                  function activeOutbox() public view returns (address) {
                      address outbox = _activeOutbox;
                      // address zero is returned if no outbox is set, but the value used in storage
                      // is non-zero to save users some gas (as storage refunds are usually maxed out)
                      // EIP-1153 would help here.
                      // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api
                      if (outbox == EMPTY_ACTIVEOUTBOX) return address(0);
                      return outbox;
                  }
                  function allowedDelayedInboxes(address inbox) external view returns (bool) {
                      return allowedDelayedInboxesMap[inbox].allowed;
                  }
                  function allowedOutboxes(address outbox) external view returns (bool) {
                      return allowedOutboxesMap[outbox].allowed;
                  }
                  modifier onlySequencerInbox() {
                      if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender);
                      _;
                  }
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      onlySequencerInbox
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (
                          sequencerReportedSubMessageCount != prevMessageCount &&
                          prevMessageCount != 0 &&
                          sequencerReportedSubMessageCount != 0
                      ) {
                          revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount);
                      }
                      sequencerReportedSubMessageCount = newMessageCount;
                      seqMessageIndex = sequencerInboxAccs.length;
                      if (sequencerInboxAccs.length > 0) {
                          beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1];
                      }
                      if (afterDelayedMessagesRead > 0) {
                          delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1];
                      }
                      acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc));
                      sequencerInboxAccs.push(acc);
                  }
                  /// @inheritdoc IBridge
                  function submitBatchSpendingReport(address sender, bytes32 messageDataHash)
                      external
                      onlySequencerInbox
                      returns (uint256)
                  {
                      return
                          addMessageToDelayedAccumulator(
                              L1MessageType_batchPostingReport,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time,
                              block.basefee,
                              messageDataHash
                          );
                  }
                  /// @inheritdoc IBridge
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256) {
                      if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender);
                      return
                          addMessageToDelayedAccumulator(
                              kind,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time
                              block.basefee,
                              messageDataHash
                          );
                  }
                  function addMessageToDelayedAccumulator(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 blockTimestamp,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal returns (uint256) {
                      uint256 count = delayedInboxAccs.length;
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          blockNumber,
                          blockTimestamp,
                          count,
                          baseFeeL1,
                          messageDataHash
                      );
                      bytes32 prevAcc = 0;
                      if (count > 0) {
                          prevAcc = delayedInboxAccs[count - 1];
                      }
                      delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash));
                      emit MessageDelivered(
                          count,
                          prevAcc,
                          msg.sender,
                          kind,
                          sender,
                          messageDataHash,
                          baseFeeL1,
                          blockTimestamp
                      );
                      return count;
                  }
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData) {
                      if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender);
                      if (data.length > 0 && !to.isContract()) revert NotContract(to);
                      address prevOutbox = _activeOutbox;
                      _activeOutbox = msg.sender;
                      // We set and reset active outbox around external call so activeOutbox remains valid during call
                      // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller
                      // rather than reverting on failure as well as allow contract and non-contract calls
                      // solhint-disable-next-line avoid-low-level-calls
                      (success, returnData) = to.call{value: value}(data);
                      _activeOutbox = prevOutbox;
                      emit BridgeCallTriggered(msg.sender, to, value, data);
                  }
                  function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner {
                      sequencerInbox = _sequencerInbox;
                      emit SequencerInboxUpdated(_sequencerInbox);
                  }
                  function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner {
                      InOutInfo storage info = allowedDelayedInboxesMap[inbox];
                      bool alreadyEnabled = info.allowed;
                      emit InboxToggle(inbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true);
                          allowedDelayedInboxList.push(inbox);
                      } else {
                          allowedDelayedInboxList[info.index] = allowedDelayedInboxList[
                              allowedDelayedInboxList.length - 1
                          ];
                          allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index;
                          allowedDelayedInboxList.pop();
                          delete allowedDelayedInboxesMap[inbox];
                      }
                  }
                  function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner {
                      if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox);
                      InOutInfo storage info = allowedOutboxesMap[outbox];
                      bool alreadyEnabled = info.allowed;
                      emit OutboxToggle(outbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true);
                          allowedOutboxList.push(outbox);
                      } else {
                          allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1];
                          allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index;
                          allowedOutboxList.pop();
                          delete allowedOutboxesMap[outbox];
                      }
                  }
                  function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner {
                      sequencerReportedSubMessageCount = newMsgCount;
                  }
                  function delayedMessageCount() external view override returns (uint256) {
                      return delayedInboxAccs.length;
                  }
                  function sequencerMessageCount() external view returns (uint256) {
                      return sequencerInboxAccs.length;
                  }
                  /// @dev For the classic -> nitro migration. TODO: remove post-migration.
                  function acceptFundsFromOldBridge() external payable {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)
              pragma solidity ^0.8.0;
              import "../../utils/AddressUpgradeable.sol";
              /**
               * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
               * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
               * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
               * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
               *
               * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
               * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
               *
               * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
               * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
               *
               * [CAUTION]
               * ====
               * Avoid leaving a contract uninitialized.
               *
               * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
               * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
               * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
               *
               * [.hljs-theme-light.nopadding]
               * ```
               * /// @custom:oz-upgrades-unsafe-allow constructor
               * constructor() initializer {}
               * ```
               * ====
               */
              abstract contract Initializable {
                  /**
                   * @dev Indicates that the contract has been initialized.
                   */
                  bool private _initialized;
                  /**
                   * @dev Indicates that the contract is in the process of being initialized.
                   */
                  bool private _initializing;
                  /**
                   * @dev Modifier to protect an initializer function from being invoked twice.
                   */
                  modifier initializer() {
                      // If the contract is initializing we ignore whether _initialized is set in order to support multiple
                      // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
                      // contract may have been reentered.
                      require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
                      bool isTopLevelCall = !_initializing;
                      if (isTopLevelCall) {
                          _initializing = true;
                          _initialized = true;
                      }
                      _;
                      if (isTopLevelCall) {
                          _initializing = false;
                      }
                  }
                  /**
                   * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
                   * {initializer} modifier, directly or indirectly.
                   */
                  modifier onlyInitializing() {
                      require(_initializing, "Initializable: contract is not initializing");
                      _;
                  }
                  function _isConstructor() private view returns (bool) {
                      return !AddressUpgradeable.isContract(address(this));
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library AddressUpgradeable {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }