ETH Price: $1,987.32 (-3.11%)

Transaction Decoder

Block:
15967897 at Nov-14-2022 11:12:47 AM +UTC
Transaction Fee:
0.02304104099449233 ETH $45.79
Gas Used:
1,840,145 Gas / 12.521318154 Gwei

Emitted Events:

317 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x0000000000000000000000000000000000000000000000000000000000033c7e, 0xeb7465c8b477a110cea6ed1d99ab4a7433083cd25524808c08ca2a6a918a647b, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000a4b1e63cb4901e327597bc35d36fe8a23e4c253f, 2703fea703a5d2fd08415df57707def51d6dc2e6beaf34d5a0a1eb6e464003e7, 00000000000000000000000000000000000000000000000000000002e11c6766, 00000000000000000000000000000000000000000000000000000000637222af )
318 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x0000000000000000000000000000000000000000000000000000000000033c7e, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 00000000000000000000000000000000000000000000000000000000637222af, a4b1e63cb4901e327597bc35d36fe8a23e4c253f3a0e96f58b4606ef8ec8608f, bc7f0e1348370ab9247d7419d12ea72302b3feb2000000000000000000000000, 00000000000000000000000000000000000069a6000000000000000000000000, 00000000000000000000000000000002e11c6766000000000000000000000000 )
319 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x00000000000000000000000000000000000000000000000000000000000069a6, 0xccbebdba42b452611742a1022b94075ff87322585f4787cd80f7a1a25c1a8a66, 0x1ccdabdf8388bad6a908d834991054101664949da5d129ffa7589c90668ee1d4, 4e4091b1794be444f4676f73ae1bd0de5abccaec5ab41ec87955b5bb2d8a1718, 0000000000000000000000000000000000000000000000000000000000033c55, 000000000000000000000000000000000000000000000000000000006370d12f, 00000000000000000000000000000000000000000000000000000000637230bf, 0000000000000000000000000000000000000000000000000000000000f39019, 0000000000000000000000000000000000000000000000000000000000f3a6a5, 0000000000000000000000000000000000000000000000000000000000000000 )
320 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xa4b1e63cb4901e327597bc35d36fe8a23e4c253f, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1877125, gasPrice=12521318154, amountPaid=22984925295303039 )

Account State Difference:

  Address   Before After State Difference Code
(Lido: Execution Layer Rewards Vault)
2,277.862256874006461277 Eth2,277.862541449641051457 Eth0.00028457563459018
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xa4b1E63C...23e4C253f
(Arbitrum: Sequencer 3)
5.000628427588054169 Eth
Nonce: 27057
5.000572311888864878 Eth
Nonce: 27058
0.000056115699189291
0xe64a54E2...80E2E4eb5 125.056964276992009432 Eth125.033979351696706393 Eth0.022984925295303039

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=27046, data=0x005B1B12C588E4ACD603A0113A7CCE7B80AEF9FF81C21296169776416B6B895CD08216F4FFF7AA565B81E2FF16DD71424E7BA09A5F90DB1F6207483A3A87AA48E91CCE9074074906F03FC02952A4A66989AA10B2ED0E11C0FBF73D90E2171548513620AAEA8074E8A6E40A04D541B22706A9A2647A42B64882720124D129481DA250FC9FB4CF580EA7C433006D1C9394AA26A40FCA75CE273101903B50555EB83C599E244FAAB09D9097EBE95A7A6569423EFB90176B4D5885B85CCC6A6C889A074ABE63D1A558DB208C6331269433CB97968434DF028A485916CE64CC8F7E26FE56BCE6EDFA1415951242D85BFA18A8282B4F8AA768E8C8BBF2F836700608FA199C1201931105F3B0078A449EA6CD2082AC7FAD9DCD3E4FD22BF269FD1A9228F7DD0736AC0D4CCD7F812700FA3CFF617911AC4F1BCAC3408D9034FEC99A6B1510F00FD2AA379BAEAF15196A0225A79677CDB457879AB5AE08E2B9B0F2A4AD045580A2B020CB861FF5526904FC1351531BDC11C17E5F33C7CB1396883F0AD2210970FB5D995D28BA779A129A62ED75F83CF7998D6801281117C973978A991C6889766D188F46821562806FF7F0A457A48D79AB3228CAB22F0F42B1A7788DF1239146AF9158427A26892D80AA2D5E01533518B7ACC61F82D0FF85CB57565E2DA8FB7FE05619F6437D8CAB430414B80DFC1D040D7906A74794D62147C13CEC81A206E99546A018CB28747D7C345C4D52DD50FE4E33A6E49B6F8462198E46B0AA74A7F441452A9264F83065AC7992521236122BEE56344E8971CFF91634181A7A6F33392D0325C400FC260009850E97DF4B717316B68ED6F38E9271EAA973817153D4114FC821AB6A981AFF0A48B4B58A18DE934A49D3AF9F18E6746844285018BBB6FCE76C192D767C9D292A89386040BD60C0797CE496A892BAA08AC6AE207FCC8F589240E65A6123189A24F987C67FB7A370403EC01C2C5434324E46ECDA6B045B0D3F59B178A5FFAD9D1B75575B652DAA8CA30DACBB729668207F7CE82208A0AF18A3AF66473B41AD075FEE1C9B40C2717549F2FD3F17A67E5CE240B25C410AA6FFB4C2BEC38B152564DFCA5301F10220102481E6FEABB49D2A4A87499F4052C920B9B5C34CAE9969F38B1D01F6D697937332C8F9920DFFEB31264D712BA14EBA779C833205C7A051262F6A1011E03F8D2DD6BC3CDE8A92BE1D0F79CA70480CE1DF917C3EF7385C159EED7A4AF669FD0D827EAAA28B8279D8034576ED75419F57E44ECC06FFF5FAE5A9C15D53968BB8B55220AC551AC1B4A2A1569284818181A9FDEA2CDDDEDB3D1FADEAFB0C2B8510425D13124D24A2E67EE8410CA8B8D944B0AEC7C531118D1FAFBB680DF446597CC3AD959AB4F39373D8CDFC4508800FDD071C74CA0210FA1C6C2EE8DC9AAC43D6CA0D3DB9023755DA7024569A2B22A0C0AD9E20E82757985A7F21823C1564449B90FE738A747FFBF9A5C0ED4B8480AFBB3BEA6E6C1403D74D190814160956880662964E708D5022515FD75013FE6E2DD57F8F358A2C488BF3F47F8EE6BD47E343069446DA10DD439B6F031A79883A8A0C8E7F63C10746CC1810A649163CFC55EB296D83F97532FBE2429142439EA108224AEBC4CE130305942EE68CAD0C708AF6A1CDC65BFA8F60E922575CB19F0D1C318677E881E2A03648E94DA08C2C4888E8CD5235F06A6E3E704FF69290AF9A4278D9E00E928FC226F26348BB3B4AA38252F26CC6535CE3E39549CFFBFAAD5D07886B0121CF6308080C62A182EF4A07C2DC860D080A0391631B65651D1D94DF6502B785FC6FD8C2E22D7D650C845204C763C88A74965C03A2D29CBB3E7CF7231A7BBBC2B6C80F6B7CB5CB832150201830188204028321E0CF244B1C2F3ABB42BFD3479EFEBCCFFFB370EDD9A636079F5E1CB84BF486010E44DA8FBC78664FFDD285D0A69586D2C2C9E619AAF1DD88734F0E5932D3D9C4001F8D0DF28DB75568BA9558B611F47BCBFFD077EEAF5F967845F1A69A4C2F9FF7F8D63B24181AF20CF18B28AD130C8B8247BAEA8D4471AACDB06F90D5E77AF5AC409DBA8FDE3D18E98AB17993890313C6FCADC625346B83401B1E8035DE9C587952E13111AF46081B02367F880375AAC61DEC664DD5416215F03D4B729315216DDB11054C54E79DA08C3EA68031FEDB17585810DB8643A5206A323426056A420901D10B06C852C6D1F51D4B55DB6221AC25BF7590636327B634E70C3DD1463D7E2E76FF4003F8644B13845F6105FF9F13FDFDACE32334EA52A8186F983BFE1FAD1EB2F90764A42926757C12C8537344695DF8F75978800C63949451788C9EBBC96683BD5DF45F68B2881B9113793C37162A29B474380CD42AAD8B83BA53BF97B00A8299FDB7CF2BF9DB2B33D2AA95B83B500531D4B7769AA6B86C77BD60A035099337C914630D45DC6F3C5F3A5A1F5DBF80D9443552A4D652C880A55D11191022F0F174AA162DF356B4F9C2EF733364523A488AE81BC437D98567A2318E4ADD06950982863C43A54494D6718645B5C03D46AFEE1A6A6C581B14F5DA19D708311BF481E19F7EA1824C36EAC7BF9C85F4C6B680B66E5A43C1BF098938031DBAA4A491007A2D8F3C9DDAA79FDD18525B25561BE5AFD843A1BD0E3AA2F7EA473241E22E9AB90B62229F80A95BF5F1C5328274AC4E18AE3E98DFE0A0FFA7CC40EA05C79C70646DA52F5F725CD74C877E9A5CCBE0FB51169C7A4A6F1840481496C7B85174997637C76D6F55E6287413A40B9151F07E2660A76A7E6BFC04D8FB26A44CBABB0DEBA360353B36666C71F65F97FF5274C1C59049C0A1167786B541064CC10C485B06A4B1046E91DE3C907B173274A474506CC285C92A2C2529833B80E204063F8FE803C419FF9F6D1069D8633D4A2CEF52389024A20B0893671BDFF89568B07B7462A005584ED9ADA318549408100BB43273835A510D75863694876CAF7CD1AA84F331A3344762B07BB41203A7C53488F05981B29229F62BC786EF4B1871C25AF5F3D5F85F8195F90866229ED341B5997F73E07E029DAD40EDC4B7B9C339CE160D190A1BBC8EB56E2FA67B59D298B550811C99F4A9B4A5B1A857A1EE1B0490FFD8B8E40073875319963A7727E3DFFBA39817B2A80A47EC26B4525144B00B11B19F56AA5EEB9B636680710BFD741509A1638C82A343054512BFEF6600935C5B6EF2048B5E94967A018C1F54A803C35FC25AA3649F84D44162BFE51675C792216B5AFF4EA69D224AEB26F5473C7EF4F42BF1D06AC55491660036C3F8B61EDBC2E5F3812208A4C43D34C602F7BBD6AE779C4F5F40B7CB5A9FCE710684797CB4E9BD26E0EFC58ECE7A910C1CA728F216D8EE909D56E31F49C919C98C5D65462DE09C4A00A896B2846731DA7A3FFAEF008340F97E7D4B05569EBC3F9C3C15DABF6D9FE60E5B1B707EC8534D44691DD6E2ED75D0FEEE19C847A3C6F73C5ADBE86FBAD3E388576ED75BD22A3B5F7941D726825BFD4D2BB7E9BC1CD8A50CA567F2FBAFC5A70888DE302097B4A91F8FF5BF5707A77EA5DA67022BA7034B9E363FDE57D2D72A64FB112F42407442DC28B1EAE27F7D58A074C2777AF8E9BF18040BB305D2BF285E1119D1456F3D54E59097A15B3338C75595B25C20A87A14B197975CFFAD7C38B46EBA4F550300F342D69A74A5EF7E8055BAE52282E60C1ABA36E9DD3ECB2BD26080A05E9F8F752F0BE58E2B646753DF5F8B61EA5E7D8FE8452546570803D0E35826F2672D3CA68D7C528A8D6490BB90D87E406CA66F93FF51DA2B5650790114EF326DCBD09E129D7688933423F86C320EF553EB0772BFAEB66BA74DE1D1098E765EB03AF43358997D68F617C4C55D193214690E9E152E462F36AF5AF98F40BF01B9FAAFB0D683C815FFF37AD598DD3835AC98EF8FE9FC7BC5214686B92182F12FFEDB6288E66D96F487F42D079D324814837D30BBBFF74140CED5163AAC660798FF9615948526F43822423A0C5B73F6E8FEDCD9E405A8FFBFB657DA0A9C4917A3E346E924BB7A81DA61FE45C6B2F97793D71E390ED6D571FEDEAA5BAF34D2204B46B473D3C04477212B0583A0B562D133AFF025C60966E3B0882801E95A47CAEDC7110A438898A3AC4C49693A44F0A3FCFD57EC92F49734BD870DE3CB097D80BB7B19B9DAB4A9280DC4021D24B21011D47AF20AD9E5C1D6A94BF10FAB2384C169B6E42B37A4BF5F578C7BF8F438A32B9860C9393000C5B0F2E94868CDBE1B57D79F13367F745C7EF194FE1CBE3A5A3A98082A3E92019CF6A9E58FF21DEDC3250B3E8FA5F08F8D5523453C7DEC39B7E53DC419479FB3DAC07EA0D391C6E3E61B01210A8B423AEF074522E953671C7E930C44FC77CAB27F714986BF8B130C1383631DD606869650BA9B96203B4F4EDE0C095D6B7D8B477EC35E508EA1847AA0F2FCEE9F3320B54AEB9B5C948C4B6FB9A1B156970A3F389DF8D4806B03941A6CE549AD91275BF867CC615B295EC573FDDB043F480C09BD60806B5432D1A1B0C1FFE72557BA9F11C95AF828F1D9C31227C68B925C5FB526270120ED0AE732E0174FC154641399A2DC281B4519F0FD5FB72E6AE83095FD131F3F97263B8DB5976D65C4D345DF096FFF6564AF7954BF8DDEFB8A0F8D2C0A593B4BFAD88B4F08453478D4FC026701BB72A04CE18BD7073080C2A560311D42FAFBE3C29BFF312B0A96D527C0C62ECC989330CE74B5D335F704F8C2326F9B5A4F2DB7AB042E1CEFE48E3A1929675B8499D4DF95128FDD72FF6F8347B7DE81CC8E2324E22702411F300D833F616B2893D744FB6D3A58099955D5187A04B644B458453F8A5B5401AC4F46DC39BB75EFC0E42C09B7F27E65F1EAD7F00DB9554A0A95D4975F1ED2CAAD5DD0B43E2E02ACE990B8A16D8E9781EF6A1E53B8EB8CE15F4B082AE731E05494DB7A8F43D96D6EA8B0063DB76BD6B5358BF06EFB6927649746C51585594BF6EA066DCF386D703C9785CE71AA5046514E71A4C66CED11B5B1B3C6301BB117BF782F2E0108DE7D2F6F60F66F9AE8397461984C899D0271915230C48A60FDD6DF0B738B701DBAA2F656689AD4E9EB5009E0C8D5B07F1EDA76B2F3AA5F8A93494BB254A95C227AC3000C5EFE1DA2D3D0D115493AD9718912315AC1AA896FED16A1A78FBC3434F2A4C98096CC62C416D286592B0F477DB3CC6E38A991507B2F2B253117313569D6C82B716B7AFD35C9E5E1F5CFEBD9869F190494036E422396E3EC488AB21D14902725DCA8EAB0D2E626331A900824588850642F18C0BE662A2A3E78BA7AD59BF9218928A04B1D5B701C63D1E0E975AFC287C321D707784FF9469923606F555E872CDF8EEF78672C0F676ABAA87A61EFE6FEFB8267BED406D6536AB5D044B9A6752F200661E3AF81FB5335A840EE7D380A883FE1DDE2722C4E06BC0A3C6F5C9294FF1D0A919FE50DC25C862A5EE7E8448C6F01AEB70FB307FCEFEF93E1F15F9B0411F5A8DB832C0C37B305AF493EA5937DF9F2DB20AF7AE974C8C3B93517A3605EB655FE30008844AA90CFE0ABDA766FF652792B93CA5C8525C9C0584B8313086B834405D82D848204E40A0213B018F03198409C5C4CEF93B131D248B5384AD86AFF08AC66F5E9BEAE793342833C8CBFAD9A7CADF84D4AEC16F15FE305675FF06A360894AA0895A3C9E098DF05446DCC3989AA79B478233A2ABC412CB00ECD08FE37E574C57D8066846EFE85EAFD2BCF46E198CCF5CB5741E873F3028120DA4807201E39B9EA354F84F5828126A35EBD58BFDC213AC0A091A951A6C7E6EF5097FACD01B3B883C9492685292B40F13CB1C261899588DDC749E2423C32A9C94CCC5114FBFE3F3820E7CFF2383B4C28830E59AA867E20A9FF9221E6ABC1BA1C7FF99DFAC5313A8EE4E75590994329BA8DCCB641FE2FA116F335C9332764F998EBE380702E3953221F08E352A92BEE7FDBFBE69EEACA12F36C9013AE2102230CD084736D2F2D889B20C0F7FF1139EA9E8B6ECA767C7A9E0E9521DE5193834F5B0A48DA4E326F7ADA1BFF1EA7EBAE143C759F5E2F42C79CCD827CDAF35F1DC53C62B42EE823CD7489C1E3BA82854DC8D8CCD6FEFDD70D0388F5E97A61F2FD2362C7258917D66A2D19C58A8AB0804FF78BB483699DE4458ADC306016BEF3BC08BFB2B42B6ED30689F3C5C445A9F74CAA2E02E982712FAB20113CF0A8BD6060EE05CBFE5B57CC13CFDBD286EC17237BBC5CEFA141CD83CC56EDA2C2B2ACD72D80EFDEB8D0FB8B8AB11C821375EBBAA2ACAD59A6F737D1ADBF52C602ACCFD4ADD06D60DC49A7417F6C04FC8FC66D33FC8FD38C7FF1669628C4E822469DD193FBCD5463FAD33C936854E924E6A5A38D8938E8722E03F0FA50FC008980E80D0338F93CCCA8DBED8A57E7E808CEF5B27AB8F10BBE2050850F58B378FA2C8CB0E9013630E1FD850F9142FFD3D6875244C682BB6B837D65FE0D6FA86D0DA9C71DD02C1A4F937CCFF7E4190905331FB3F0CBF84E9FA1B4ACFBB01B4718516C2B3D5E6F7244956E5B8C1607194EB8EEC07EB6BD9D8E478AB20B3BDA973683E2CE03C71F2A9B8994535168D24EDA3CEF87FC8875801AEE7B9610D27FF67C3DAE787B9D9F30C0CCF4B06B796D23BAABEBE44A1AA296ADFDD1214F9711A575282EEAEBD6C233839CB3ADF2F4F1D8CE7EFC9B074844546ACFC2892CAC35EAE4A2CA5AC3EA7CFFE0187B25F28290149010BD1061462993EF99EA75FDEB0EA5AC042482A5370CD01869485CB4EE3A4BF59C0EFBF50B05AF4F0B4EC3FAFCFBA872517B92DCBBFE2B00938F5D39B190912FA5A2DF55CEC8DC7F3A11A43B486A4B443979DE7E1766B6D606369C8C1AED1248D33D4082D7B7AEE6DABAC690857FA6A936FC91850104A698F2F164D1A0779FDCC105B7D601670E43240DFD2B0E5DE152F6D81D1D7A0785C7B8EDB66AF857097F89D9EF0503ED13BC79BA8F7FD20FA6B43496A091BFBFFBEF03DE7FECBCCFB6FF407411CBFE00ACD22A81D3CC9DA63D1FCCB2D0AC430A6D35433E5CE5368CB7AB56FC1141B4286D117229CB6501552F21E65B51CF7C6A8C6B52206F2D3EF95661B3F93CFE7F6543927626A77F5A546EA9F5BF512C4708FA2B8EC75F292B922656F2FC50ECF480DFF3DCF92111E932972B3E39088630E03FD84F45F80386E5271A97323D9FFC0E4594B3B577A4A32752383C8D6BE8170FC07A1C4133F9F8FBFC9DECBC3914272FDABB62DA1CB6B9764FFB91B3A80CBEE1928BB838C8F4D5F894D2845D9C7938574B88018BC8EB7E51F94828A8200B0B37EB96E3AFA141C35A6437D3FFEFB119C8A016E0C4AD2469BA7781F8F1428DE4157A7F7E73A55AF3882D18E1A3C96955F256E30A8B1F8E784E3BEC8655A457CD6BC193C2D99919C765787678F258F03A63F6D955104B5CBFBDDD819D4D2AC181771A576EA9167F43D67003A7B3E4F30A09ED15FCA2E609B1006767E0516DD0449330031A67A01101551875F438DD1BF5EC092F1E89C9899E217134C9C246C57166D6DCD81FFFB8D8984D8EBD14D60655EA447A4707122276093449047E9DCF5CA02844C50168E6D9E02879ADB145545905E8BAB50E1428F241611145B045AA0383F4ED42C8B18D448FE1C05B05AC3F48EE9C3DD1438E6DE85FD57BC13F3FA3987B5B75709D119D3712D34D1B3683C445062717E4448AAA83E239547AC380A61FF5EEF43DE8F7888D41FE2757F54EF5C4FD81645383978D52677D7C28BFE600EC870231D9DD816849BF908B5BB496FCF296E526A074FEB2523249E39D42E6BD0DECDD19E775877E728980E89B10AD1418C8C9D8300FA0BF412E83BAB4F5D7A4B13B4189CA5931088B52F558633188FDDFA31793284DFD0FCADCC306DDB0E967ABB9EE4E9A9E12A353A94E2D4BEF750334A01F300C6023F7AE3212937C67439462D3222CE6053D75C6B38B589EE20BA20593F582B7DE99AEFF9DD73A74D874C52BF4D99DF3D9186CC5C5DC1A54E855EC9F6CBE9F468F228AF4C861BDD072D78FC151E4C327C7472965BE629BFF5FD489F0CFC11D035090823BBECDA6DF0D8B0C8F94CB031CEA696239EFFD62FBCA7B9A05C516B0CC093BE7FF9237B37D5A43FE83F79023BCEE47482450DB8382448BE11FA5D1865BD81B59587C532A140722A7DBA69BFB0F6BD78A516EFAB01880C71355442296A4B36862B07DE336B751EF2277560EE99E82BDE1A0B68907FCDC0609B48834DE34E1992799B780689E66F1A6FF8F848214C89B0B00E424924ED2FE196AC34E24652139B50429F469554E1554BB3A503353C5DCBAF58104371CF1CB434418503425BFD6BD4512772C22F41F115795EE2289BCB6127BE9AF3DEAE505CE6AAB1FC0708AECAF89C42BA7745FDA9E7697B31221C6FA49395D8E074DE593FF757AD231021A7C898E22F10A8BDF96A1A05184DCA9C32848C280DD876F6569617DF3134417BD1A10963D95D95AC7F41A09471FF0C022F7E14C11E07CB27A4EF8C2C795F988175B3297A3D483409B1C32B9A782546D960EF52F1CB90DBCB1CBD32C955A6CA1A708BD5D77BFFAC9B530B5A47C46E7C288E9E623DD6D9C3F639CA23786340CDBC0D6BE5508B94036F4FA7E594353246DA321490C6D008F527F0AF1FA5C6DA7A40E353A6A0CAAD2ADA56F545E02E43B91C5723463418BF24A490DA7DA4E2F98DB62D1D185B21FDF0A12627A4994E5DA654F87BEE1E0AE677BC13233DBBF01ADF05BC6F77177D04545EF4A73BB8142AB3479C0F5034C8C4F63BAFCA88818405C13FAEC137479A669316CA1909AFEBAB724A581403400ECEDBA73D310A1C4EF13273769FED00299E06A6C581B44FAA438AE91C1696831C848C66CE43B09C94711A09D2CD124FFD40A9913105F1268E09C492B882B05A3EA20C91F479D03DDA45C5BF75062152C1E3137D238E9990890DE30A09BA756D5E23863FF7F98CD3F55B02B24EF8ACEBE43AA14AD37EC930F8E8A3A14102F3FA9B926C9518960B1978C6D9CF54E12D77A2351425CDC58FE5C6FB42BF56D5D3DA36A2FDC2C90601D339A2E29FC5DE887DA2D6C71D463337CB29DDCDDBF4743D90A6A825AADE5941F446A129600450B9E247B1903B58C4D925A461A262379ECDF79E4A59197E7C36B36F3216E7E52A84ECE2CDD135E76052402A4370CF83B4A78809C4342105D3611A78A6F073228206F77CCA1A9FD7FF0E865D43E3406D8367B60B7D61C1249B8EB2185B2F5888F9D94744E93217DA1AABA58D0EED8296B5D699D66BE028A5B6DFFA06A99F1251593E9DA1DAD3094CC3EE5943603354EE04E2BACD51A4939D4619035220881C67BBC6856F8CA16D20B06BEC59119D5A0474AE8FB5F5E69FF58FFC68CB89E32369EC64A7E11F50A6A492101E01582FF1811B1C1A878D7E3F49DD04CC3C9D1CA23C5C49D9E5F00CAF7DC0B7D6D60CC6BDCEF8D42EF15E1752CE3AEC1660B6BAD3C5080DCA66CBB795058DA0A50D62329F41A9E20018BEAD526FF5CA2B618AA01D9E9C9D426B3BE70DB13519D77A1919DB90C86270298D207AA3AFF57D6133A2D731F52289FDFFFE9496D410C86676B703769BA483304423E2220D9A63C7EEEF1E9C7F5456EB797A45EE90D3EFF7C94CF30C77EF558D5464081DBC0A2202810088427B542439E82C8BF7E89003B4665429E4151C0650728120E7ED95890D564CF1E439927D05E042FD34EAACB2BD6D2D28409FCEFF8C5953F25D2F49DEDA920D58FA25174ECB3747936CF91941461A868F517BB0D60FB5E474CE51F8021C3403B1FF8FE1C9E530ABFA3C6261AF72D1CDAFDC0ECAF1F5DD21B1AF2E4EE6EB7DC8F79A5C286BD396D5C0CB095AF9E2D4F5E9EBED97CEF7C8A0DD6578FA52A61B8C819127CBADC6C527D8E62B73B1A44B46A2A153D73E70868C819FAC5DF77231F742D2401AF7DDA0ACCF674C98333DBD7D5FF2F77E97B3F36FC62F8A7DDE99AF14BAF03F5DAA07C37939F340D1AF29414515A475B89EB2B78DCDC8C1F4592D182CF22C8037F729CE9EC93B4A72DC653C24A01CF1D4110BF088CB6C82343AF2FACE32582D43DA1347854205586861356C8BFC57D457523953EECE1FC6B7A425C8E2180F519E3674A13398604CB6A123E56D840DFBB6EE840F63CEFE2D7AF781489EBF2242446375543A691D47F3911F3C26C8F9A6E1D9A8FCC0F647917375B446F0DCD454B1CF5A2972FF42E367BBEDB53FDD4D3263141A6496FA71431E1E664FA3947893DA30D26FB42F46C3E9B40580CFFEBFBC742BF3657FFE2F2FF3E6E0E5B36B4A029412BD3559485DDD6ECD735C89F0D7C711A6474E6C4DFABEB652525AE4E58F6E6A1F262D3A510CD1A4C47E5D0675D4611D71869584BB0678F5744F8AE8CF86EDF84B50EAA289C84D44ED83966CB82F522FD9D55164F41C273AB20E37BF6808652ADFAFFE509955E306079271EEEB865FAFA2ECD05DBFFDD08A9F7DC7AE56F5C6F01367B9B276F0A9D14400B5AFE01590025A9D6AA5072B3D9648AE0CB9B5B784A4417B83FD8D641A693DA201D31E85F3BB4A09FC16A9160A189280CCAA3DD48AD7FBBEBD587B59A6020138B68CCA724C57D4BB9B52992AEB91DFA4BBFC4BB76E057FEF50DCD07AF05CC730883C4567A91143F849AD60A63CE6DD1F165EB60CD01257DA320526A68BC0DBFF51CA8A4B211AC6C7A432D8E1C30CDB222402AEBB8850C9FDFA8F17340A78BE0ABECEFDB7550E0C40DF15FBDD9CA52B8F7362A03EB468631413D062042F9516540353878959EBFA83C6AE0557C253444E908577CA6D6D7FAD188B64FB0B33A3D6DFE816C4D22B8D6193C2A5B4BAAABCB8E2EFF68A39A69FEC635E705A88B11E91718079763864E8EE3137EB143FB98FCF8C67F9EF06FD63A7DE93587D51956B82FA7E8BC42FB31645C3245913433AE77B97EDD3F61D35CFB9EF0C5BA0A8541F15B29483C124D529C824AD79688F7842647A82495D0F5F9940473ACD3253D6B626F40C8BFC931C09D5C0D70524F93C4D00F3D3C16819D9B3DA51F7E425EEF303C1EE925EF2B48FF73ECD9DCEA03827EF288848CCC464D8BAB0CEDFD2FE3A878C39F1AE460AD2AAC4A599D4F0D238BFA8C12CB4AAB8B56B44B144210FD94A2479858CEE78403196AAE9D19D952BA14E2A7F9BBBA8E853067F6BD355E6200558717CFDF2F3F10C75D127388CF331CDD5C90A114A9EFD43E11DBB74EACE7CFBA8C72F50A134E93318A2842CE5CA8751279D77FD96A12D852C95C1A1546385157C297D1E6D22731CBBFBF50D82C6280EA31010543EBAC2EF61F24AF7EA106B06414A582CA303E3A2E593F7B9BD3EFF778C9322ABE58699CB733314354F26495270466D8D67BBA414DAE4B8677A9B819B3153337DAC8D10EBCD177A6EF45243F6F5BF163FD7C5A5EA2E1346370807BC1C0D45249FFC3174D8B6750334DAE5A84E2392299750BBF44BC038DB9C15C6D71146090A654BE70D1B94047390D86F614D54A00846B07456FD4AF6BCC1B265115AF4C4354F4020B5186B9D1C5C2CBD85DC8609E61953AF3C79D64E1F58CD140FF2ADFFCE289C30D3BE29AAE585D7D1949C300C27669E56DA3847471390560275448C671E474FC879244F49D9A98B949A3940B8C8EF8D396AD8AF1C784DA57E1FCA78FA08D78D5111A257F041CE3247FD9A674F61944D96D207E872ADBAED28B69794E22FB2D48DE64CE4229081DFBAC8AB93D0381972C989AD161367590B807D3540FD08DE2FDD0BEFE710403FE8A3929033BC59E5E733BD09E5468EB7F2335F6233B612F4C31D098155F5985CE91BCC9A0EEC04852D1134761615596FFF60E766FF54A12A7CDEAABF29EF81B6D4F1E544595C2BF1223FA725CB537171AD284E35FBC3625121EAB1B113B3B52CD6BA9AA4423A40760CDB700C2D637294813CF65B54FC8C34AC2A375F79F411F4BF40D40B33C218E7190F6EC338DCE026EB900C0642DB3DCCF24149490057834C70BCE373995250F0F988DB2333DDA14D97338F14C4A212BDDA9606EB73E7B551169D8EFB3ABAEBE37BE25DCACCC281DAF7C20E687237EA93B840154185F60AAC63F33EA9862FBBC0BB46A797612E7A0660C4BA2CF42B943C92C8500E88B3F9DCB304FD67AB7C455CD7128CA810AD6964102FBE80B383D06A6EAF676AAEE8DD8D39F08EDAE68411E0669502469545806C6323DDCFA092670A38729258BF42C45732FD412D62A8D1769B22CA6E0396F59FC2A1096803D18046D515A66E63994082A3A202ED26E15B587B251271407B92E34FCABDFC38D45C58BC3DF18FAC23195E94F7F013E361E1DDBA14F8FA1AEDEA2932316E34B5C4CF7E1ACBB1C8AF33B6B507AAF6D6D50BD2B2703AA9D063F1ADB3FA3A8FD8433BFE6C49528FCC90E7D9AC3C561782CC4C238F67317D40625FF8A26BA9788BD4D0F44BC4C882679211776BE3E9934542E233FEB035E92CC65CE63F6FFEDA5035336C6BA13BEC84020F600C22A3CB7729589F86A9455A6D2C261BDF222BB76FFDF8F51151C442A8EBC56DB9A20081528ADE2024C05F27C04398254CC2B178F490CF2C2A169D0089447B080F4416D20E20C524C42CBF8D4D0844E2727FFFDA75EEC04EABBDE01B183044074D8589F970A028ABD24A6764EC26E892C4946CC1649D2551AE844DC55FD50C62AF2A908E168A41DDDAE7C5196452F57DF136D5110E4C429E453948D1083A3ABF34EA8E490E1B4511AAC149F658C82B4370C38C1801F11B945792C87D390AC16FA468CA82E5B2D5A9A125FC67DF2C9D627A204C871C2082191C5FA9949E2B2F595B4FE510FE0D78BD1247334A923E9F6B526196C039782A0402010080402E742439EC199DEC00AD8364A56F981CE40F92C2B8594159A831722CE26D560AA0B47E2D0193D4D1018083A29033BC57C7368EBAD710877DB140C2643FDF328782A175854B3E2F5A2DB8771476B911AE86E99315DFD89FB942F52F9C29A02B676D92A4C8353EA51CB8F67CE369243DFBB110C60C04871156CFF07EA2355B02D3EEB332E58D418ABC1C817606D23C6FE705FDCBD01E00DB80CE19D4BDEE0709B920CF8B4BA6BBA97EC74B0005806303CA9AADA64817D3E39AF3873905C9DDCB55ED1DE2B32FCB016CEF63D9EEDAA47E0F6F0F5B46020972FE9A83F4344301D3B59928B7EFDDEA2C95258746F64CEF44A368D1F5D2DE6E239B1F2A436755CAFA06B67B232AF9B303987A89C73122C7DFA0DCA1C8A70F5C70459D4788FF0D9C3326982EE7EE28EAA6FC7C02C20654D0785E1C61B85F88E193255AAACF002A2AF82506D78FFD8B96A0DA1D9BC7FDFEC983B848BE07644DCA737B1A03565A1B7A1AEADA59F01B211F433B25E2484412FDA65A01405D69C97CFC00BE1DDF84B47A8B2C1B8CAAE126199DC46B1921AE315E168330B6A433A8081CF08EBD07193741E96089F9FFBBBFDE22A3FECFF4FEF463575376CE14D409856F05605F5AA1D29F0AD9AD08E752B0B71266137F5C7C3459535F1BEB69F71B81C7285E46C89F413223F81D6EDCF05753D0DE99F2870AE1DB43FBE88791C1E2B3D0488EBEC4AFB2249C6B157BDD55CE31E2A37A90D85F7A50D96364888410CB164021285B8D4C5C0E521F9C681DB8A30F78C301D411ED68630FA8C30048E8461E36C0383A0B1441CDE524F0FAB207E405D7457FC4CB68C76FFB27CF86A4C8676016FA227A5168BBF70DD5478702E7B5AC45832F7B30C025F8C0B24AF2B796F70740E3AA4783B763C63AC8B8E1EB64B5984FE7A2E579938A80E31DE337CFB335830637B121961A0E9FF29EB3DBE04CD927582EDBE66CE1EC06D8B36FA875DDA5AF3877C85FFAE08D4C182D294599E1BF2EBDD14D5576BB62F6D869018D73C8E07C13A2F2F3B5868DE3890A805D23289696B4354D3793FE5657C31F655EEC47EB6CD8B8B0C2E52401EC71BC0857BB202B66E357F13FD1DCD73E8AFB57FE34BFA99C95471633558844BFF60A8F240D570B52490CD77CC841C24E18BAA81B03054E215BCC1F8D568EFF0FC5F88D19C9A87640869D4DD161476EF633D03A91139E2E8C8401B0D24B6760972CA7F61A6727B14FEE12AF1E3368B639909F814CDF2FCB2D9F3D436F306200E02CFA26214335896E7783846DE10BF6DDDD8F5D34AC1E8D41F2B245506D2C7AD61C0F7C0C8B736C1B9E52D6D254FFA19E1C7DF0EAB40C27DA33D3A0E001A77B3894F2DDE1EB0433188D3923CAFC33C968DA9B0CF0823D879041F88B8FB7AF798D484A7C89D3E6AB117B4D829AE46E7E1D373868AD7EF16A6812DDE78DB8BD9EB7AEC287091FFDF3DA07698F3C18C9448885924E29EF4C0C3A9B1170DCD246AEA4F9F843E51AB4FA05A6B7812C89501EA1831BACE0E23A1C84779550A58E36B7E5A8B381D08ED01AA129758BBC24BBBD2D6B14DD4EF8309FF7FDD3AC3A9FCDAD8696EF26E640E976D552E44E7840EB6A4B91366BA0742527F25A6367814261FD6A3F3C247BE7A0F014B65707FC41C3F43D68776FF77DA7561465D8A9BAC2674AF0A62F8FA5D8892CFF1F757FD91AD2A8F04ED89B388B6BD1244F395407AD9FB7828C8ADFA2BD6D55A01761AD13CA404BF480527A0E600690690A8059D3703344BD361A15F27412C06BCDE616F12B082B17B280728D0B97D0AC8B8B97E63E41E9024BABBE3A8141A51718BE82B466C4F7B84674575A4F3C7FA8E0A3F22840273B135591235AE8BC199C0EE4CAED8ADE3A9428952183BA550BEA4E6EE774A12C217407F216B8ED8734C6558F079953BCD00D40DB284F1308710BECA17FD1C5E18EF132B98CB3350FF15D6F43D1FD91BA1F4938F027342371E5802FDF0951EEBE82AA464F8F46AC147DF457B926D150B6BE5DEB99358442E86B50E06B5DF9CC98BEA0A115EDCA92B88F22E106B721E6E494C3B8694B0C88B3BDEF835BFE31C9F3D283041C5CC75080DF28A21A117FDCAB753449F92901213658797169EA37B9436C8D09220037DB60265361A26762120B25D65D3C8F62AB5417B89FADFBCE35F61C9F9B5A61EA67CE6072651E1F192130C8741FFC7CE802894104212F625CC94531447FF4A63727AEF2AFB9125B344A4DA81220E120958EEBB4088017E5DEAA9706E6837F77527EDCFBD5D1ACCDF5D4362F96B875B6BD3542368351D01E21D24C8879F405FE86300ECE0E69E023E1B498DDF9210B937FF4830814D43993A135B7BA74BFC817EFA05DF3400D9560255172B4BA95F55321614A87DCD4837298BB61022B3870A16C19D7FC7E33F5AE2B03273B2ED427676D2719B6FECC46072AB0D2ED07A89DBEF2D3C2DF401837446ACACC2EA34D1C2E99F1E9FD738C89958877779C49EE35474AA5C295383520611ACE0A9C0D3DA6640B47190D18E494949499994582A9399E003B8ABE83ADD8EC6207D6DD06E02B58107353BBAEB161DBF5BFB563B79ED7B234012966FFD3A2E01E7D7FE862ED33D9047741F4EC85F8A60EE332B4F01AF902BFFF7F3AC8C282B737B968208B3E882EC46CE44BE36E0F103E17BDB62EE166888600E28676A297EEB111CF31E076C12C257BB9EBF72C7CD92740965C61EDE3152331A4710AD11EDCB6981903649D2A2C66663656D137B8D41D1E6E06F3102C2B51CFC7FAF522F9DFC138CDB608F9F803268E3DEA51ABD12CA5B69A084B3C693E1E09C3635709CEBED6FCCBC0537D9D78334D212170736AE3FFED5680E6A833A28C722CE6A31301703B58F8A5081212BC44BC3BAA5556A152F91E9B22AA547DF4864D3769D0EA2243E5A0EBC791BC87F2A94AC8326379D7C4CA5D94DE1037094CFE268A46302A956C82704C12A93F5F0A4D67502B3CAB6A87620A8167539925277B0204F145495D9E6036B61E5E9E6E5751C817194D7503443684A3ACC7362E5493EF3EF0396687AF11898E89F3ABA3B8729FA1AAED7D2224E490B0AEF7EC47337258F25C7C52572BE0A2131F20CB40CF04E1AC50844D0863DC943A30435EF7BA7E30DDAFAA513835C97E80D03CCFFE73C8BE4950F6FFE576003A8F1374FBFF0A7F2B30B37CEA2307F570FF11D07686B699F770C4101591A702258FDED8EA6675A78E7878C2485FCBC7FDDFF65494B3924A0D3208DCDC2276A1E20E94F7E574D2870D127D3F1D161882BA98481EEA8A9E3C0F57E7B17FFAD847E5572006D9C9FC7BF6E9923EF56B67591539DAC5C5A70D111CF6CF3D8049FF4546A8EE0A6BCA9DE5FED329927864714B4D8ECFB9BF08212587F700080446E6C32D281FB1F32EBAB911996A58D54DCEB19BD9AD38F9B5AE33DC04AA381E2E3DB208455825C335026687FA461618F79C64156082887B91E354A1C9CD4D61750E303DAA1DAB117A01A42081BE5CDFF2D5E5844E9549C8FBFE0CA84774BBFA059733C967ED9B60C4166CB7EDAED1CD101CCA9C9C8BBD636099BADFE840D80AAA402DBC693DEE3F1E8C13B1E91C5E8A8D5AEA4BE9120C5E615268D244329AA9997D9DF8E3A7D90F728F47E590DE01157938968F0B3959F64E6F69A6058DF30923BFBD9D1FBECA614B5A46DA2087A06A029A0FEF817E0D71C768BE9C3F4E5D1DCCA05D7AD1C99FBFEAD83E150F6F67CAD65236DB9566AF33A8AC82A4DB5E8BBE6911C6CF83454F092ECA6B9A783FC024241C46BA2437F68C43E2666EC927A22721F0DF1DFBF9D8F4E019F8DEAFBA6C7B274804D5854D1F97BE7385456CED25474A20752642774608BF4B99F07A17331A73A4AEBF6F7CBB317A1214FB335A825C1D7E015C90027A35F96893FC0DA1E6531F892C4569EEC30EE07E35174AA280AFB0B08383A839AA4FF98F9D5BDB0F7EE6615F31B86A9C784D5A0FF5F7BD97E0FA2E63F573863AB3DEF4B3CF672C17B84FC97EC8C353A1E051D33A9EA38BE08159B53FAFCBD6180EA99606E57E9D8C3AD77BACD99CD9D8AD1296C0BC37A541907CCCAF38F17AD63C07BCBCBDAEC49F39B1ACCCDAFE7799D6C8A83D236FE8F43FC02F31B16BEEAD088D6101014089FD40B1AF2E416515A877A855716728F9571CB40FD5F6A5B155754E85FDA498F1987C04489648C80B276E135A82F4CFBABA6070D7F8B4BD9645DDF829DAF242F38E6D92104EDEE689FF161181DA2E8B5021E92258DB77A61A6045D3EBA6D8416B0FF4BCA8B4862E33E08FE05ABF006326BA51BB471E19DEDEAD7F415A9A21545598BFD4D6CCFC5B714315ED473728F7024A82A5E6F80EE10063804C28A86FBBFC5B6551D4B7080ADC41B1CA0B8EC49B214A43663DC7D77E28401124C3B1A0EA4B5DCA6287173AE3152B46C10AA433737FDAD6CDCFD2358CF28647785FD6574C853D6150EAA2646ECD942C47E69BE79A40D61834B563350388464FC3B1845A75DE2B1B0FBA44E4B2321289F29E556A0F1A524DAA2973BBB1F9DB79AB0FEEBCC9EC822405186676AB24D841E71BADBE577B7F189942D974E751987CB821AF78B43A0B4A1D5C5E104E74029A60AE0151A3D5EAEEA2D653BCFB1120C6FE975C51AA07C6FCAF0AC28A7FF3BF44783AD0D1AFE162B8704B6D3A4315838FD2900285703A28F91090539FA64CECCB00148A2A2C2FC7BAC7FD9C2231B02B12E752069D59F8173D73A0CC30F9BF8DF887FFA92E383A2DF801A17CF09F9E8885F76033080C3CC129E7009D05C89A2A78AF5636E8CAD622864082EBC4107056377A6A5FC06C84BBAD2EE95991D238ED64C0E84F49B251F4C06612F68F5FCA584A83A50B7E3A0083CA65C1A786978CF6DE81E799A397BB427C7829D26254E41A03630F4AF0B591BBAD003753EEE3F59202C6F73EDBE52FC57467A93212B5131F21A27DE0B43A8D8F50AE5B00D72885D4B4F9440A0FB59DBA2C418863B0D59C85774337CAF4175A0B838FDECE1AF297D503E9A01BCE6C998F136CBF133B373970CF9BFF462018CF476316FF6281526B03E16D5BB6DF0C6CDA032E0754BC2A26047D1914E33BE27DFB89662A0679C9B1EB3F50FDF1F9D58FBDAC652F00D47959B63A3E00E62C9894A6B19EC82BED1C5C02623E2604BAB487A440B4940C920A93695E06DC4404B45E8300C0BBA81BFD4A3E6C5DBF84149C9A6568823FAF93404B260C1DF08A321C3E413F53BEB893CD0FB1AB2CA56059802375018651A926D2B0FDAFD4D6975E6BECFEEBE61541F209940B020701A0A4BEE042B0C4F813CD06B0CDF805372F0B25FD89BCD3E8E864DCB68E5C212AC23C0C3D7D2730E60ED2A4044EF71D0352AD56BF0620E43CB103A886D4E4CFEC3D12B0F51081B939F9263F761E084BE9F0F7B07498B23B76235BC8226E81945C9BF0358DCBD28DFE6B8EA5F706706D56BA5117FC66F6D916EDD783DAF6898F9E0EF1F08C92B4D2C50F35FB0AE9DFEE61DC21608CE6BEDAA5787275F767A0667CF85EA2BE48240340D556ABB044E486643C9A6F14485E8312C9D200F0A04D9CB683ED7E69A170A879DFB7E4D8A4BCC6B10A96252D137C0B4D73E2EC24500BAE2E9375DE6F5378BE389708211A8B6708C8AEF7FA27F6A7DE65852231DB57C6F8306BE36680416E6C90500EC3E2646789D5070A04F561E350513A0A18D117B1BC7A0484A4C2BFB93851A92961E542C8E662BFCA6044A3436F4E2BA5EEB440B03AC28968F8E78A6DFAFE8A5E018CF1A37778435C4F90384F437FEA79B996366CB1FF6666302268F2980CFBD5D6E45FD8158D727FA3D99042594BFC06F99CD1756FBFC0B8ABF5F9CB9BE067E26106CE867087A2484415F67A27B372BA021B9AFC2DAC0A5346C410F918E33529B9A60D728102D0DF03339A58CC0EADCABFE53FBB708FB1FBF6694F4DC7DDD237397D3D2753B7D31489BE5FCC2ED41B8BC6AAABC9124970439DF325DFCE50342318974D70815485B3A77E61E520368AB0E23F99FAD0122BC17906B18380622E8D67F4D9AA745B2C6D154412BD7D90095FE7278E18FF3C7B3265027B1C1356469FBEE68F98AD3B5E2727456CCEB6BDA5438757258BEB3A475237F5D7439E2653530C09128B632198C58FB3BC0B913EC427D9EC386018F76AE82B15D33095AEDA2AAEE2D68EB8ECF7C2E9D38F2927E08A6D598A85EEF0DEE4C64F2A0E82220F8AFAA32C35706E27EC3073A065E01714332BC22AF3F213DC9CCAF580B3D8219AC46291DD8D0CC0642B10E0E08E88A05C0949B57181350C6D79E22FAE2772730B073D5C9C9C162999D4BD505FA8AE8FAA7576D69FFE4DF4058D97CD798D6346315801BD525ED42767383403E0F198C4F3D396315F45D6EA6A067330C4115CA31406883AC81A09F218B3519EED1D9E455407DC96310D21B4F16416D10FB6088266441130FA161EA0BDCDF6CCA6EA4E284AFBB27B01B0304D5E73B198307342E605846D40E46703450FB9F8649DC17B21BC8A51E0CBB013A478CDA34F8A01044DFC0BC37255E0F2D29F1017964731399EC9814E296505CE201BEB667F7516A41C06BCB146C98140DA4C2BAFA5F9A5A0602AE0DF3A17E34A7F0FACB75B9C3BB40460536EB231C83D7A2C9AB6B1103D7FB39B9EA539E0FAFDA92AE19A0C0A665AAAB42C9823FE582C42FEE8C515DE70005E67842EDB65586B2A8B47EE1B46645169EC760385F1721212CD330CA2760D206FE06827E0627854515578FDD42A85A15B18F4FD739E0025764AEB49F87FE73682F0BA65668DB607781A5709A8A659095D85E4F2A9357725786C91669E5CDE40BCF3B776281E34F0C49B7CECA5FBFA544470D88C155F0F9FFB051A9B9C0DCFD806FE28CD105F7ED9858F5A043AFFBC655E6CBD16C471CBE23C0182A1CCDF7B02FD06CB94F5E74F955E34F731514F7F6E83BD3E47F517CD92C3165C7FCB02714E9844471A7C46C20104BA9ACF53C70D06B82E0EE0430C9B841B3BF3F389D5B6A11186020A92757FF6B98A6DB4FB37957E1EB23C7185882501AA6CDFD6FFC9C68850CBFA9002ADD0DF7DE04ABA2C3641376AE06D9B87C8FD987B33A74812086E59CC8DC5FFBADB917AEC9EC559130A92B51974EF4A068B0560F01281281633CE3C09FC75CC34A2F8A30993F131985F5F3CBA786A7AFC2F5CD1F969149427076E5F67E2EBDC55D3389D892F78601A37C13B5BFB6E7D749A694D62F7A57BAC5071A54A4A5C166F0967DFFF4FE9516022444A487EA375BA1DF751D278AC8DE87A942677A8245247056A838487B15F06CDBA0A34705A8EC4B058F7B8CEBFF6F84F7A8C48175D042C6DD41A03668F85F41F7088892D44431B191755432B3BDE6D7955FDB2998643A4F085B5008F6DE8EE128EA858405C4EC6B01840204BE0381AB4000DC61EFFC761B0B8E06811CDE1BFB16F46AEA824CF231DF0E42EB84466CDDE1C5F9C599BFABE51AF040D62060A549763F59422D34875243E940AA340C86418A3370E24C28A165EABE2C73F822FC78E1AF39FF6206C8E302F921A8A91B089171DF8A20561DFCFFD702E2AB6A0A988857201764F8B4501070FBE2649B08BE241C3795A07C5673B2C2C20067D571BABD617B6F173E0241F3D7E9BB5F6F1870DE7352DCAB8492549E2A652075D3DF164B0A51A28CAAEB241B237FC0485C7801D4A4D5834EA60056B6E71264ECBAEE8B6D8819631200EF17326DD9004F52B6595D6E19C494B7D98082370205E43AAFE949688CA4255583233104B41138294E3BFA5540B3D9D2BFB9FC0BB84311E29F9659F6D3404CCC02389CE28738E3D9C4916D1800571C25892EA05E835FE7D86D6D2B856F152D99428EB9D2DA5DB57E134ACBEC08787CD174651D2D39A54C79EA4135FDE8AFAE8E6AF6276D9AA90227E025308C37B67E0341439E92224AEB94C3A2E091AE7A236174683276E08DBE6B2CCBA3B0D2F28C37C17381AD64FC4D12CE2BFA582EBF6DA73C678570739EFAAC9B486E3C7A449A04DED02D510E47D5B4C3FAE8025CF7ABA9A28482CED3D9D43EB2A663BB275D37764F32F1C5BFCEA79BD7B3115A0659A05159389EDD1357B19C35471A71AA5F85B6232B291961BD3907D78FCB7B395D3F7EA842442E3AE299831F465116D4D5C6D756B65EF9BEA258EE5AF6E26B22D63E73C71C6A464F017F4433C0ECCA0509129C51CBA21721B4C23B48FD3CF5F3D3F7AB55CFA1D59FD70015ECEB814E75C252364C1AAA5644CC4BB334EA48991BA3D9B4636616BAB358ECD1A611D1D416EC50D000D3F26F9FB310339C6766FCFB4F9F026BB81F6C410FF26A3C9EE4F5C2CF3E6C6ECDCA83DBA312D8E1EA1EDED82D216FA221263F3FF80799E6535F920C34848929164D9B2F48A172D3B8F25A4973E421B4BFCD911525F3BD6CEB3F867B9D74C1C696C919E6ABD9B81E88AD8DD0FC290F9F4AB4D60AD0DE669144B1D5D5AF1FD59AF3E0F3EC042B2B24C9C93424E798B2CCF8942179F73C9DB674B96F9401A0670CB7C6118E7C097D0B47944F2A6FCC15E59D5A132478CFD1CE1A8E920D9142F163AAA6B9796C04B2CBC96F2BAD0628C32BF40F362CD9510AF4A77225B9E18C56B4CE1BB6421B24AAF0F5DD03E4114D7244C06FC25E52B93620413D3E0688EF1A2099510B4D813F0DD0FF6180194E6D4CF39D1878263460844A2F18F0FDB32F9A433EC85E48BFA571293316A2BA92C9896C7C44808209CC6B879D8701A16845FD15A3BDF0635C4DFC7E8AB97D1B7F883F659B880B8744B95C511E58B8DAA06D9A22B97C2F51D05D65CB99F0F90229406FF9974F5CD1DA7FFADC045D148D3DC7740E8FC7DB6E4E25AD90D4A40AD35E3010D998E112AC40E222B306861AFAA3B3F607C5501B16726C54D48C7F65E0C5F80068C2E8679F64CFDE9D466DB5DBDB29744AD4BB7A38BF226BD78CBA2DB2E567381CB40CAA5DF79DA6A93C3C3EEB71B3C0DACC1032B75B1CAF2C52B67AEFB6C2BF0D44EAFCF18D2FFA64B10C1DD40625ED8BD7100F505E5E522D47F6E88F07C80DAC257FE803C3FF05FD5CD0E7C01D4A187DD3854542E0C4D7ED40690568FC7931BD4E0C9899266F8C95276D239D1C431684F079BCCD8FE38F31A2B2152AD207D9E7D4B2419EE33E6405F87A3056592458F2B67D2B752A85DA988FDD480327593FC839F44711AC397463CBA87EF254F659784FA9B1A65FC954C5332127DA140D5FA76650B614E73D6E6648D1A1F782013BC9CB31A64F2C8EBFB83C6545B9120D645C3F82EA03D5D423B8996F887E3CE801A242BB8E2A28F4E708DF1A66FF093CC871CA08E9AD7E6582496472958839C5FF1101056E83047E3AD0C82CA2CCE701060C17D94842C108A25DAD244D601BADC7EEF82622D082B7DD34C9A93C9EFF372C6C7D2B04928B8E78664898AEB3DF42C98A6A98AD9C691BC6FFBCE8BEEF2F7AC65108E1C04E0D6C36DC8605A479295634CB02305F367AED1C198542AAF2D37A35D0A1EB3B51DF2CEB60BAAADBC04BEFBA2BF80DF4D36524848E795CC4FD8F0D9650D31A19D41A2E7BEF97A20BCBE19578ACC7AEFBF5845DBF20979796F9E0B27DEC3C5AC072AFD51974F446D395A60046FC8701B962A1A4B926B556B2A60771AFE79A133B3F1AF0C14ABAB153BB130B3C09088ED837EB3FE9FE865D2E841AA520DC6BE373696AFF03B3D6153DF03FDCEF1B42C7FF71898C7BEC4ACBAA4C9F103F73DA3287380CFBB43ED13CF4D34C2418BBE8E28DC1540B9B1BEBD6A7F6454039B5A7787B537C36E1F53F468B8B0B063BD90B5CBEAA5EB8793DF8B39A2FEEF73CE2993BD13C2EB437D0CB8F584B95EA802630F0763B83D652CE7F56D9970F7B193389D6FBE630F3A3DFB734E329E138A90D4A49E364A895219E5F84EEB17DB92CF3333159A1A86DF2DB6290414C124D3749EA6DDEC5E87CF7C6C81798E227B6FE0B9F9AB804BA3FA942D9B8963E19E7790064114BE93981BECD6ADEE538E0CFB7624CC88A1C9CAE7CEF08CE51A2C21A7FAB8FE64B0B7ED5287E46AB5050706039FC787D28F0CF375152F04B93FE21121804050183E0206008748378735D893841B470AD11CBD165CA3B523C007FE822DE77CF47060A0206C3C082483F7B2532F1FF38D117220527F07FEDBF726D8D04B1ECDA71D52B9BE8C2FB7DA48816931810A5F0F7F93F509E0ADBC24492BDF11F8A2D49B17A4D485F5748C728E1E032DA10DF4621D10B06CCF9F6EFE91B785666E35C2814F7E662F5AE777945295035F4BA928B2391D0CA0166EEDF2755B422CF8916FD7C220BCD3327E989C7E891D7A8BA59785A58825B16E61BBD8FE273129E9020B7B43FFE3886132D27B5F1E389FCD2AF80750A7F71A0454C69E2767AA743C1CEFADFE61F6AE2E3D3A30FE7139E15E771EC775E645221DB4FF1620111A586F5088668609F9C4D8AD3B98E2C77C832846C19E3FF442C232C363982FFBE6850E9EE634D370031FD6C2E77316911A34BEFBA6FFAC4A428D9A196B8B9B7A523D50D8FF8FEAA9B215B4CFD4E5CDC69A48EB6D63F4CE94783481E575C46063ACB6444EF125687BD968CC541F9B3FC3A5D43C76700E10A64845A07FD9EF1F4543F84F42945F80598A7B73F452D4DCB9484361500B144D4CFBD7322B9D593A6508E98B5FC6772264A2FFDC7CD6054FB985797B037E1FB4E33413F0620B2983DE7433514400EA0C13128DEAC9259D0FB8A8D38576F93399DCF15EF350965A8CDB02424D277B4285EEED400856EB2459627C70D9ABCED159CB2759D2572942E56DABDEB562FDA4DD7DD23B8D60550BE611A371774A34838331F6A6C2493C6F7C393F73D01F588078425C4DA565ABE4253AB2113D8A5EDDF388D54BCDC23FE5E28F6ED691CC43300EF7DADDBDC3CEDDFDF08ABD3C1AEA986F5FF47A7C629074ADECDCDDC7E523FFAB4E1D8DDFF5330F31EF58C99F5F3C0E6EF659493C23C281AEC3C32F6194965569DD11A932A4BB251ED06BDF33BE4BF931F4D06DB797E581B26F5AF2C75FB4A60DF850C9060DD6318EC82BAF78881D907133826F04C10992031416182CA043D17B0747C91D664583039B69B1FBC0BFF4F3B4815FB142D1CCBBBA9D6209C30335097679579666A522F6730B452948D1EFF1E636CC3C75E41C0B4F20C1FB85415DBF09EA852FB133217DF7C60A7D45FDFC810C40790EAF3EF1F125D882E1EF0093DC821E2A04F16946914D82418C89AE0BF9AB355AE5413FD3F0EDFE1634389F9D2434B904182431820B224F7CC872E5295E2B08BA419EB02E819E8970C300FB83B51119052AC6F565BE6F0C93C141693A15941A9E890EFA58F29C8917755A40B43DFC0A076F2997FBDA76ABAD127CB03F50DB573C8F8988D743E478395E23E0E09041C3E6E4EA0E9EC8498A276C29979B0515941B4BE81727198491E5AA9344D9AAA6BF6C97411A647C010EDD4FD8928E4C6ED9DF45CF2152F878FA0EA7A906010C833C00EFE387FB09C959F3BE5EC553308501AD4AFF9D7EDA439AD8AE446C98B2E485E32FF2A16E5EF8FCD07927D69FA0700390CCC7CBC5129076A0B000C3344F31BFF277AD29CD0A14F5625E997ED876E03C0D2BC711ED7E6D060493B5B121F9B0A465FE3702D64030906013C034665484A2D1048D06D25A1FD571ED5F4E0F0EA1D605C8ABB57FE481526B9380F9EA8E60A7D3266F90F5901BB451B71D8BAB41469C465C242AE5487B519AD653C076242EE19683EA4AA24F0DF9712FA06D2B1405CF6EB9DAAE903C8BA0B90608D838B0D4C71C24C92CC9937C1E9E04AFE207F362FEB9E1FA9A6177DB29A5A52B4C41CAF4A44FFD27A941655E14FBEB42D62E5C50742133B2141E6CCB558AB68277FAE5BA52C1E86C4333DD0257AC140849A816E67DE031F690C12E7FC3B0630E4E06184B4BE58AEB61AE0E4928817058875A61FFC8F438E6E8D386528DEF908C366BDBAECADACF38BF4053F533D5099A108D2F2250D52425442EB011A524DCFF816804734D837406FC0C758668518C06D0C35422B96ACC367F7323E8B6538A96A08F9E086B0D74BBEC33B8D4C19CB934CE6479F1FF817F536FF98680381EF4D485FCBE07B13444879E09AF7C0B0D865D7EE3B5090A3CA87695EACCA7E3EB48B1172F1976096BD64EE7F48C7C10638D73BAED906B2D6E82002F04EB1AF2190D3FFC4D4355148E0F972FF03BF789B086870EB38BF654FBE0DB7A868F750451DE38997C635542F8AEA091410BD60804979BD7763E1D54DB06306FADB32BBB50B7A9FCA609C9631E10F0E01FDD3810580F67F6CBFDB53BEE6F7E9733E8FD2D1E61DF8A6D82A17919D9DA82533C477CF88CA8EF785DF9A02B3F1D19F6196234AEBD89FA61A44DFE9B2FAC130EC63E86CC5F305C6BAA14459B93AC51D641F15A1252C47839A6234CE4B81F439583CCD81143487F91B14185D743119EFFC543D538F24ABBFC114BACF149A1CB87F2CABF4B1D8485FBA836AA080B4E91020C98C2D2D63140A9BCECDA1F78D7E9BD1832D0E4DC8C732C09FA067347EBC1607EEAA80BA0644CA154048DAFECA50065517DE8A663C300BA9520786F19A65D78B2BBED4CF202CD7CC824777A5FFB8B35AFCD2C452064AC94FE4CF4016FF5CE6D7269DB98B469CC3AE0EF4A6017EEDC3198C3E7B5E823CC8AEDB0FA80F2D29326FFA1D3D9A2DF9FB5337A7EEE937B71112744143694FA90018871805971383894C6D18005382C9C84BEC237F6E2181630C9E9C895C4B4D326343F2618A45904CD9B5F53C790B9C29EC2C1AEFCC1A368AE3BF328C278523BC113A9EE628115B7B436F5C86735AD74FF29A21BE3F842518B263732D2112429B5B6E04D8F58E3CBAAD7A43F4FD400A0D9E6544D3A6BB0750F2BA02A50C826B5C490EC2B4D3D6AB839BB2212350B50E625E757F0F3F68416797BFDB9478B992F6CCBBFAEB7F4F47626E29DEFD82B5E6A908342A849469A2DC51A13D92EAF31675A09A1A2E1DFA58B77CBE6ACFE66052AB021811B3B56C1D2D3E57EA623D112910069BA63D55FF2C9CC19CFDFAB4191DC38825570784D6E3F7C975B3D5F15364FF2C255D3518701174445C87C18E9C5A3CE0129E16688308D94543114F41826C93F5B8AC7AC2A24E21D99A92F07D0A87756345A824B2E73F12486DB5E47744D81B06446D6096D1845CB8021502EA5FA0CE6B44BC54D806C148FBA804BF3C6123245600A3AE5BF72F677D9D8961A0A37CEB3CE5E49685888FCA5974AAE8D6D326EA1B21EA84A5EC5713A89A0931AFB7CBCD77779146817C73D192E96417DE5282962D9B3FF5AE9DB4CC701F5D8E45CEBA348DB718BEACAFBCC6707C3289368E067F616C381DB1409DCACDBA599D81D36BB9FA57A05B33A88A64115FC9016B02C32C4518CEB04A8E530F1C8977F25E6A35527F0097B250C9FFF90A86BF85F17BEA8F47C62E1BFC291735C90DE3E40C50925CEC334A57EEA03230564469504B30FFF4049E57DD389ACDB034CD412706E441722E06B0EEB266CDEA365641C6F1BD61C001832A936F522AC959CD94C73395CBD4C7ABD8CFF0EEAD29F22FADCFCC60713CC0EF27A5334D4C49160E2E9134F18B2D2207491A1FF4460DEDB299C3959DFADA026C5AD62946AF30E10B19DF77A86E6DC88F7530AF760261DC3D82B2B7A3AA2A4A37E85162D9BE8A2C8C82BDF070B1C940FF280D6F80EC7CECE90A5C1E4D5833178F75BC49E4CECBBCEA9742C17EBADB29E0DA659989492D7BC633A41E330AE6E17021122D14546E500020D4A3E92FD709151B240DCDD24E2CD41196B86F48D8952D60AFEA23D14D11B09A3B3EB84122359797E77AD6E4E2DD92F8660A436CA179FC4F9797203AF4E28451849686676DFF2344C0C454603CA5D101FB601FDE579A34E16D854CED956EF4D9C8BEB7CC7615708BB9693A222A31488625591629D5E3F25B0B1A647FB78F174116FAF30D602A55E93329EDB94F4911ED721AD7DA56303E233960D43C90FE83744033206DF4074921EF5CFB5A58E9A50F75A9E96F047ADC48617DBF0C2AE70A7D817CF814C4EF7EA54272D8DAFC740235C17F4F2C20800F24D86B85FB50FF4E36E9C093C1A2EFC55B08BFF3C5DAFF2E20071EBA2723B5019A0B863C84F78CFDEAE1DF078F7A558736C2FFC09EFE0A36C2E844412797B7E76C6D2DCB486B704D7B9179856667CDB0C919951AC86A166AC9FEC82B8717E75A6AAC088F2AFE8AB54E2AAE7E0843A31DAB8BB3F52661E3577CCE51C3F588B6CAEF8A24F8EC2FFC587DAD391380E3E0D4BF00CB231AF297D57463576EAC1F8F6DED0ED29312BEBB702971E24D1C584C96CEA709697829F21B8F08DDA00C62B1E3C88A5EA7972E4C353AF887498D17C93D481C62A0F29707A73090214CF31DD11170E4B775BA9B859ED4B6023DDB95F484DE30C0D10312C0C6E090921966A7F2AB549643654CEE476FDA8F9AAF591C7AD9E135CF00DE77D2E026D24398B1A4BCEF1A19D7E86500FBD84F831F9FFF7783BFB026A88603DF91A2CEDD5C1B45EACBE5FBC0D5A217AB84420C2035303CCE372F79F44132E2ED3CC45FFD4DD02A6EB59FCF336814E9E78F1B472700D1B0C59A1783E19EDECA792794AD9990403756D32C469C794BFCF4DD2176C741C321F3F97492E88F73C3BE4D21F3E708088C2A0E8F57885DA92D5A5C7D392F13562B24FF0A1B5508884D1C875F3C08BA4B4991D2B3E7714A69F1116827EFEAF11C798217CCD9504B8D0DA230153E2987C187E07CAEFD6E08050EE7CFB4CFDA6E88FFEEB1E7596E2D91BA5F5F006B82D5C734C0EA2067F88219C3485CE6B70638ED50FEFDD4275F876D403F6276E281E440600C837048118E5A04ED63CB2D546D8898EFEC1BDE5AFB70D60549A103C92F2C0CF0120765BCD8BDB66E8A6A7013236DF31447D79FD01E1B9B9FC792C24AE9B499C3E3504ECB9BB9BBD4D78A053409A81A67180EC2002CDCD6EA879371B75F2CAD1D5A034A761BF09E37519EBB54594AB5659F05526280974F74025B614816A4F049DCA454485BB297A5DFC83E939330B8BD9DADA4015543094DCC22B47F1E78F8E35AB225144420DAD55092CEECA85C95488A6B2AFD765AB05BAD3DD430DEFE20CFC152CAD0DF52B8E8886706C2491AE12CB42F9B9E35C5BC6C43B70D2D360AEDAA76BC34A1248A94B5C2D06707A0F3D5B9922D0AFE8771F6E84AE56CCB7680F19C7C478095FD8A7567110C05C98FD6FA344DF39B2250B4FD970100FED1A8A2B23151FBD53B8E4EFB78B555EC9C50D5F3D8C2D745538E64C38D917B06604A8FC7CFC9E5E436D6885E094C4E992070FE126B806E10D0F8E825F53392D63E29AE3CAF1C81F2F70AC3969831521440E550A10C0560601B3623572E1FA93586CB3C0CC6B567A108C37E5C88001FD929C384BA54AC1C09A0C08853495B6690C0392161FFC9F05CDF91C6B6C3CD687539FB582A1D897A6CF89E180B904F3013DB1E82ED8EC839876B0943915F55C91A5E3CA6965A43BF6286E2284D59E78CB73D0650760F3D5EE82F0E90B68BD0CC62E3F70C53FD8D158CEC11ACC2A7BCFB4A526BF45AE5ADE4D3065FA9BF69ABBC85FA596D4499EB5F267165EF6D18D94D63310602F876C3400809B60C459E3636524BF9F9EB5E8D700F8518FF9FDFEBE2FC79630B909D588B436B00716F92EFFAC7D341B0167C12F86B06F8435B4912AC311F5A51109B78952D21E736F032AC9915BDBB65DEDD587CDF88EFC736219B16E3FFF28A2EC652932878A9C018AA7B454FAD47DA498A935BB5AB84F90403848CF1034036F91FEA023354E9465F4C48B70685C255DBFBA2023EBF9A97DE8C846488BF3C79836E8F8848E04EBC26B67DD34FE59AFFE6B0DDEFDC3BDDC4D6BF87616FF42B47BC64DF08397BE60726E4B501EC5A3C41C7CCBBB2CE42CDE9AD6F9EC897F94EC5098408D39A588C541CCD24B8B053AF43D5190547173A5B154C7E87A4CAFAABD2A6C5AE46CC6045CCFAF5F353AF7B269EC93361B7047D7B7970F672CC102CF6BBA1D7C1AE08F7CE4084F4BDE61C2F61D0666F692B32B5CD360C1970708C30C3AE2D518492543333FE0759EE0D1B504EBEE095ECED936A7A8B91ED6F9D05413F4D7244C13CEC812271C0E319321469A5F273611DC2FA010798138BE5D2053FD84F7E299F4F8E8EC16FDA2EAE0D17CEF2A1354E591ECEF050FD6FE304BAFB8EC212C3C8A060CF490F19C04045DB2746ACA381A85FF5BD4535762E22BFE4671C61C52AFCB3D98A599ACA853A031A814574CD3D317EE964C616337341EAB441EC57C5C4F8AD42BBA47D7752FC8528DE19F2D7C2B76E035C74C43303025A5E9A42EC67695BCD4F36C9F3FDE4D30DB8FF8BB7450D196BCC8E88B2D2281980D0A01BB3E4EB87C2387137FEBF91C233ADBCB4F5F017EA6F74BDD327976E85AE6D10E1D2BDA7F045400C9EAC1D65A8FB9AC1441C24F1BFF2B6BE5366804AD0C4AC61CA65AC328E76E33BA3103E36741B78B0DF1AD11B0C74033766904D66ADFC8A15B4E67C9212D3BF01A2A5036CC12188CDC724B25DE1381CAD557B3E239FE60304E75D961BCCCA93B66B69C3A1C97E4A986EC47D7907857924FA768E19C1052AEBD6FD457DEA66EB5A33471142637FAAC319B1159E8E06009F28C34CE7871C7AAD914FE284A86CC8857BE78DAD7A76F5DB27ABE4A17337A20D8CFF05ABC1BC19D34719D8B381A26CB46E4091B062E91917DCC13AC6BF6DBF5726B9F77A098B2A30CB226F85B596C6FEBCB2BF2A9C7ACF618BD26E261AF3E55B4C79C3D443850508ED547AE74DC2C8766481CCEC35749536FF40E7C95F3FF47E90F799829F224A9675BB5FFFBF65E13939B88F8D8C1D937F502BE36A7A91D4BF5E2D5A420764DD0B065204F20654851AFA750CCE4F7FDDFC17945B6597E60F599F89B8F5F9FCBB52650178A09579F18328C85159D67EC5FF3B23FABC131D0FF81B5984696913FB4CE864D906AD5F5AF65C7CE8673076A762F788C2848AABB7422C54665E28F735C898D512D0964278760517F9F1FC153AE3A77678C65E2978FB903525527879F82685579D8CE5FD85963679760562C0A5622FCA8475DB0DFD167DE5C7C2A9F6FE6182027B3D00D39491347F5E29FB0B901F2D24F7ADC1491CF067407E85AE57017EB9111F44F3A82EBF9F14D70ED682B9049C3E2DA3F4ED89874C118B0F076C4A2FB31B453C7EBFF2398EF0154C0DF939E645C512985AC727185F8B147A05EF74D92F7F811B198E55A5EBAD885277178D0D04D6E7554A37AF14E24E6C04D8840974856800D2BBDE5EBC34FF70314997842B8AB7A004464DFA5AAA230B1D38CBD2A48B210A902D1BBD73E36E69614F66ABCCB1DE18D55E3486DD937FBF4A89FA82F409BD49495BF450674988D386DCEC44578DA9CC534F4A33E22D3042C0367A5FF03C43D7D249C036388C4343ABC3224C31B3CE77B1F481E743DB4651C521EA614E9D7AE53C2D85D88AF91B8454848483E4F95786DAB7BFCE7A97DDED04A9843F9D63831F3AE16A8C692A84925E2D90006331CD33F0FF3BC10C31F6FD0A9B0961EB850D5DCF2672848F6FFBEE42ED31C46D50FCC98B358EA89D24E406909BE6FE1F86F2F6DB93D216228F8567856006EB5C882324B208A58AF00F61B1D356A4127F311A50765E2517CEE8B1A91672894548BCA65D116A03D2580FA504FF61241003E0966C36F3A1F4717EAF46F8DE3E670B2E789116B031ABD9E563EE49B708FBDA0FD8E316D6047AC685AE8961B7E59A8BFFC243572DBC966AF9238BBEC23F75B4B820D47912E22723B7587A2897326EB293D2CC68AECC9D3A3C171AEC071E9A99FCFF07083D9B62A731699A44BF66D396B287B9B834114488B6FFC85B11E92681EB8A82BAD67C7B2940304403266E10FDA96443614A6E1499B2BF92DF7B571C8A37DE58EAD26E06AD9FCACFE6002F8BA965D61761291A6E030D9B84E9F72EF1AD7CBAF4BF2AB1AF0AE88E99F859734C58BCFA0415B627D1414DD9D43E932E556D8698F786E7A453802F95C25E02E4BFA8F3E223D4941B5C58204633CB4BB647126CF22ACADF027EF2C77A92A498C91815C5C876D2391A421532BF37D2244B251235EE46C70B774461FDCD6362DC74CCA6AF9EA92EFBB373F7AE7488056BBCFEC462F7FB071D80109035F6A1861B1DB73FA8E5C7C17DBAC323021845087FBB5816C38CAA082F73B6C788DA4D426C4CE4E6F9AB471B7140E1A434C6B2AF8DE4D6850DA27F1D8E8A79F70EEEA30883D0EAA8BDE4C1D0E94353F4E1324CFD56618DBFE54DEACFA8D53EACC5A9C91F313CB9E8F4C7B8D303BFD0FBD09731C7D4E7A23EB1BF1C5E44D6E0109F28F0ABF7DD07E53260A9304FDB3BB4FFAB8AA0D6E95CA15745F852F1AF06130C7BC0FB8DF4F8CEB679CAD6E8A1FE2521A118724BE46553A3172838298D2F710CED5CB327EC6C45A919149830C986C5E88E5617FF947343EA70F4FE3F7BBAB95A534AFD3352EC27BAA993692BE4C0961402AC6244B4204BD00BC23FC2C4DC3ED9EBF7B1E813267CED564188782FCDF599E6E5E5C905B03E6E5B47A1464E100F0762730EB9C87F20CE837CAF3D8F9C6BC6729D155269DB207A9983F7517C993E96E258BB60AD861D4D83739F7CF2F68B480D54AE0A43F807CA392C05B7E3D8D057B1D057357F8390E59801EA35BED5C37F1FB49A423123CB27253C67E17AFDEA4036155BA7EF78DAB36D1FA45AA6C9E8F4A18BE7CC7D8B30F7DF3342F0588538BE8997B64EF8C6EC91E9CD81BF3236FF3A0270D10C42ED1E3F8D36C99117576F371F5A3EB5A95A643BBE95F53FFF66E583FE76B5B502A31071196221AB8951E3FBFF9233C2273B249E99BB5A2599DA77D4180ACE5184F827867E76AC04D018075A1147DDFDCAE5F92373077BD5D095C5A65310404A3EC1FCE1C0660CC7FE96D9044E0C696D9941067BC4F080CF19D18D20EDF7731B74F3FF32486E89A52693A61F98A04D6668F5440A9A38ABACC7A538F433C78DDDE996E262C7E040BAFDC2D9DA20D43F7AD0DF28C6659BA90696E4E50AF93EF960738FB61092B304B93708BF0C98561A0E6594B6CAF5D093C971B5019393A8615E02E913CC2F794DAF8EC7807DF6AF50EC70732644F761C93AF8FFF9759E64651E3AB4F3297C8A8A8A8443D7D5CAC3415C3BD076E40EE99D98BD1BB0E0FA989B2A1F5DC6382099A1765DD4C639E0234BF1E47112E6A11787AFFEE62AF60AC875D7D872D47F81802A5ED942212410E36ACCB4E2F47F18DE76BBAF593C955371709727FCAE5FC9D21B06D07EF3C615F0DDA33338D949E8C1EEFD7144C620676A43E29B3E6ACC981E27C3085806BE54855FCD4A4CAE942A0C4AE323D784D33F67F9214BB09109A4586BDD684B694305CCD8C835B52314BED8E006DB7FFF5B92BAD08725B65BC1D92A4EA6264E38EFA17D65805EF3E59D1DB08A57CE0531AE1F58DE7494652D9A6A83EE05AA0986537DB2A99FB25C3346AC5ABFD4084EF279B66784F266F48CC4386B675B85F3048ACD2E94EEA5014325108AE7E5E33324B4C72136EB3E2C93F54E472A186200AE1AA714468F9E176F4067837FE6AEAF74975B4262FCED80148FF4E488B8C415B0E22C35DC35A58551FBAFBCA5AFA266D876556FB0848DFF143FF45642A1E543346247E56BD68A8C0DA5CA5CFF339BFF7264FC339E3CCFF3AD76E24FB771B8E674BFB1393F9B1FE81B69D24F344D203468E5B3D7E7AB09F9CE246A3050C9BEF919901EF15CC83526682CC8C0CA14CAC53813DD5A9AE53FDD45AFF0AEB61946B698E5934642A60DC12030078B2AD9EF6E2077C270A8D1CA938F1E620BA66200C7B0FD4CCDCE0BF28E8E5F006922F78D2A0E20FDAC5779E07B9EFF7878905ADCB54257BE6E5E6465392A7ED576AAD4B6A1F8D56BF3E659619CDC64B1504837330B02814020BF84485E293AEAB0AAF65E321CC1C911CA2F5F2A6146CBB14560B9C702C126CE65CF2EE17436CF48D94DC8F73F74E1B98A68320A492556EDD47BA085A817C0FD7D098B88AD83F85681E8E85A76777EB2813F69AE19AAAC8F431CDF4CCA66A20D5CD57DFE67B05B44699D7BBC7A844CBA3AADF90B813ED9372E185485049A36BC13360D933DFF50DC352F02BBA6ECD30BF574E19A8649A0EDAA2F1F0E02758AAA32AFF64F493EC8307CAD62BE6F4C9F4D6EFE2259E895855BE68B9E64E5C980D71B0624A85E454D5FA40DF43773E390F2B92389DFD567FEFF3D85CD5067CE78FF4B341850E864642BAA647968FA84B8BFBF7E70EF7F518EDA9FC23422990838C892745A6983AE78AEA640812FEC19F26673BE7B943F47A5D6D6B111EE5040E2C6DD9554928FAB9BEF8E3081CCE0DBFC2DE646DB7A1E261D02C66E383EA795772E1AF2FC90CC2CAD88EC311415417E743FC223F23A0F786E9CBF1E0006F8334FC8A6D50C2D586D15ABE8C860D288D8339B56636B479A893931C5C20C070134A8D4B11B8A253DB95E46618BAB0BD14396641E72AA5D6AF6D40F6A9D6EFF2FA8A28CD4C835A5D5CD76A32AAD65388B49F4AF606EE2814199167F74C2AE2EF494BFD107D4E13ABC69200F94030311F415D497C3E4E5E7E5E7E666E7E0E5E1E6E0E7E2E115E040EC2B81A674E1527EDBD1C1B2DF286D352CBE995FFBAA4697F530DDF03F00F3A955115B3EF6C70BEE043BFD3E281E59F2E47FA8085627104E2C3493F9E7700BA547015230D4F95F572B18C3A02F50B29FBB830B90BC2CE4312CE4D9BC503A4E205FE864FC93D300EA9F53BCDC0DF9F2119DE13FF82B337E10CC3F1FD2F8184D884E439D544C1749CC779211C6DD401CFA6F73F5BCEA6764DB5B60B7EB95E5E9B85A4C259390A25A715295D3422359F889138F59C131F7F707006413A4E40CDE5802941C37ACDDEB0B755F4B3285D59E3002175BA48BA3E978B75B05A56569D25CA5D2FFEB7758B8E68C8BC13377A9572712B17C3DCEEAC5859F7CB459B261A5EC6F528A250F99C1982886F58601546205FC86354DEB57A73D99CBB8693F893B34006F9222951872BCF245BE723140BF2B67CBBFF6BF45F8075CD139DDB9FD8AB920C27814BEC09981BFAAA35865FD206DA99AE58DA41E4F46CC475F131743105FE5626BFF61B68827C27AD5CA7F8F96318E6CEEE13AB021FA9BCC27F361E8B29BCD783ECDB23EAEAA692F188E30629F7905BEC41F43839DB7161EC324188836D337F951A7F7B79F2D7FBE41E549C3B9B930AF416BBBFBBF428B832B1E4109404C4D79198D4EBB22EC1DA2501DCD7BFFE2574A33CC1B18EEE0A549826CE5B0D906E1B52DB10C12A56EAA419108B6E6B971A7ADC9E400AEC94A86E15BD492DC92D777F3FA6FFF025916A708FA688A21A4F232BF7FE1EBB763AA833BAFEB506C659BBD7EFC351DBABAF03FA5A76AA53F61B4AAB50B50FF3766A3C6DD6C5BBEF6CC43325D353093E6B62AEAEFB6B0888A30F84E2A3D3E6219D8E7FED2B897874F7776ADD9FECF7C6783F127FE1C9EA187503BF319471F357D61FAC9E8330F40C79B43168A0CF39F2E2B75B862B188D1CE629797132F086E38DDA8C4B14F64C7CCDDFFA9C239D26CC43300B9F788BFAFCA660DA1F017E552BCB1C813E7BAFA4CEAB101704C18D15F26E455C624B48CEB23FFC4BC1549BB533630D4600F0E48CAC8D49CCE274BEF90FD8FDB5762289758F5F4B1A81D5E2A14ED8219A07367FC070F5F7D8F84F7163D6F65BBB41E3B79DB7051BF2515B1DB8C0EA03032D141E130D1FD397AB453DC525C78E720CD75D7B5FFDB8FD465C76B7068B494314345FCDE4F575491FD5F92C5056332486169EA517D00B537C396CAE90042EFDB7D17CFFCF18ED4D524AC2287D81544B85FD0DB6FDABFFE8926FD994063433F43A3474238F6D2B46DC63F4EC9B81A82250A4CB8E2788CBF6937128AD0B55363F2403E40958E85F9088086C13000624E54B5876311D70DF6BD7469E3DDF6BD542DDB18C99209023F10046B17060116040586818786C0813C50262AD388D9A62A96FED170AA3F6EBBDBCCC246A8DEAC33CE998126A448F67FA58D6FBFCAAB558F6A189F120C4DC52097F873693659DD90B0F962DE92896027CCDAE00FEC56E7EE7D546E8E6D4B8F6779C5B438A9DAECBAD03964E0EDB29921545098285AFCB28E96DC6642E085D3B1B6D9A0D9233E7BA1AD8D74EAF7AF19F806492A9C51820F5FC60D986CEBE6C0B5DC75FC87478F89A2A813975AFE9F3F0A2A2206CBE250BF62D0E9DB389A37814020F75F1EA0B9D16665FFA28B57A7AD115F8AE595B0618784DA69497CBC452EA955A467E71F389757902A2F7544631789FBDE5DBAE521FC520C2336660B2351FB838005A53B816E3D04218AADC740C61FF2072988E0D178822F07C5ACAC209855C30A7F375A047F16CB26DA73337D2151BCF9CA0F712EF16EA718F9E38936782E4A73C96C1917095688060A62122FC182D8833C176506561233E7CB9AEA4D9E8ACF024D86DF563EBBF1E6002B253C30D5CBB81833BAE37F86301328BFCE64FBEFF638BB0A04C14621049F5B6D606E1034E419CC1A31B5F48989483137AF981951256C557B3682E2ECE0E704114047293F5C789720430DFEA903197A2ACB6724528DE95FE86047067094143AAD4F66B45DB4B56F91609FE3808CDF844CE6E05EE27D8FF4074B6B9A36B04146B152AD6EB5DB8CF12F24A30AF68E7F8222DCB853693470BAD07E34F469F5061BF680BDC570A6B8DE06E605436F18A0E54FA540322385D0825261879882A37DB712B56277D94AE3EDA6B0AB63207104B805C4B5C99AFC6DCA50F2FC05D17A993A844E11599F898F9250C96A7D1B8F9DB9F3B236D034935C6143B8B7C2F84E651CA255350CB9BDE2E4D7BE95931917F8A086D353D64CA5D916A674E40AE85B1A52B637437F14D524B7602800034346C2B83A28AB88322583093D7E3AB17FF6F80BED2672EEEE1D9BC8D603B22701D6EFE599FBCAC766D8E4828F79BDA412BFAF65F5E319573B72F6E29BB3A5B9A23AFDD0486E9B90332CDF411169632CF4C46FF9A16CFFB85070088A7487B9A307923681CF36BE7488DD10941CC2AB9023EB62E4025CCE4F8C7F1028303126670E7918F5D589FF6B1DF279ED9C6965C3D2BE9D356A4F68838D4AC23CF8919725119850F241126F4B8CA9DC6E477429DEBF82F5A815427125D4D49063CD0D62BE5E2E3AE297810006BA3BB2F92913643E6BA5281372F3E2BF17968960858D4A929B26862BE09F208602CEE296CE731AD942588F598A2925ED74C6F0FA97C4C4581287AA61743F616C3A6137DD6D3AAF0E7568FAEF0585EE66D5FF368C8CC13D16CBC38A079DED06DE0CD329078DB1233986274A63AE2040AC7501B198D73DC13CBC83EB079DED00FA83C78D523ECDA32506DE084F8284601B84F4C9D0E0974780E76BE51ED989F91F2F10EB98B1A226C589DE062EED3043746C57BC735C22DA2146D27265E5221450BF1A8A561275826189B346B6A61E610D4E213CBB4992E49ACB49B1D854044B2F185832CCA7F95A7AD2255E771E1E07376608E5BD180952D6DA39F116538350E4890014F6F477851739CD65B6AC71B91455CD47F294B2A6BE84566EF7F640A765EC973648F34DA2A92D0F4F4E3BEB4C5F646E7A893D2B8C238D0A3B7EC21447DB90C02C03750EB2C23AC0BA677F9B94AA8A94E13FE07BD48F79CB95CCC1EF6191982AB93C018CEE791B37D70BD2CCE4D1E087917A421621C1AED6D09E3D03744FB78A4FE6C9247DCB4BA5DD765927CEAA0A402C31F030189605B6AD58CB649337A2388D40BC3B9A1B2CFB3CD29C850C040A0BC818FED8950515C144E54BA939D377306CE45325090D5CECC42492867E19C861298785DE30A046A9E71B197E7E203CDB0D3737E1F74EE3621BD5D2823D387CFDD7AEEF880773003BF13F9EB366456DD612189FBF025D67E96D7945A6778C87A68BE672FC3F5711F354342A0B478B0280B25B7421FA9C50F082A8F199FD2A3C23D8D2A851BFD26D76EAC4E9D8D9F258BF866370D111BF0C8430400936E6EDB895FF2E277D58C83A3F55C6195C69DA7FF572734742619E7CC4800818DE696CEFA54BC4FC2576A1979FE8D8573F435F94DFF5D810EA6F3075C3FFD47793EA9EF2F43BBC45871AAE367FB254DD69F6DD2A3FCF69425F5B6507FAAA3C8C4DDC1A5CB590FFD5B1462735D83FBF0C778A527D60FEAB382724404C5C14B20EF85EBF56F11F630420121F190A2E45799C68AAFD39F39F26259DC1C9136CCC08E746DB538C0457A6A3CBE7DB43C12C58D40E5CA502317949FE5F823151EBA2D4DF4F6B9D8F41F791B1D0E990419D381023AF7C4D64444A070B4FCAA1FC3B4DC2D3D72F7575492C3688A815FCC9F23429A406800613EB1E332D8FCA66946AF7B0D8464BCE96432AA5A0FC16E733308FDE2AC86580D36984EAD480B37953CA1AFA98C5F2E967B0178ACD030B7FABE0D8E462731B7B4818C0A62B4C544B7CA6375BF335ADF86182017CB2F0DD818A951096DF90BFABC1E03F6047E36A2526DF1F8DF3072949F5507BBF185ADE659A3202D23F7193F2D409F5BD0D71A31476F5F04636727E1317AABF30800E6EBA7AC0DD671E9C18B4C827E91B84FFD5CE86B7AB5A1DBF5B3703FFCA77F17D3A784DDA8CE037DA031D85C8EF3575DEC564C8AB830FCE074508FE7B0B36D06FCB05BC3EDEEBDA2C84F41C70D65C7F74CE4E18F23320ACC8CAB8D8A0373BA00784015DB0C43858915B686D55D3AB092E7356370207CD07927F534D23636215F68E85019D917D2A3A3153F37C99F132B37EEFEE1915C51FAEF86BBA9B647966FEF1BFC3E159CDD090A7FAF66D0E8D7DD60AFE78BE14D95A0FC49ED01B062021946922AC3EEF13627304D458EDA9EF2E174E65A7EE7E5E755E8D8863A9070268A79712089091BBA7AF4256EAD7205DCA7DFFC83667330537074EC6947FEC03E916A56A747D6F280D0FF08CA86D006F60E96305FF7DC12FA54331C4F95D6D608D54E5083B21C9E6AF549E6994650C57325278616FDE8E92368CF3E74327A0F544FCCBD7FC6ECBA070C6BE3D4FC94C5ACCC8D47F22DE59968D2F77F59BC93710AFE881C260C309357769A6612927FC9682BCCD17126B95E6B2D227DABD02672C1BFDE002DD283408381BB1551E7A75E2B8944FB337F16BFC9FC0EB2999EF30442BDD808C705736C9693E95580544C58241441DF15219EDE8EC898D62415FC7C3509F423D2785532FB0F863F79CACE94694A4FA5F4C4B949B11AD7A093D8F33750B11613800036A8CEFDB1E135227E635E9984E34F8A7AFA52920B2A0C07E165B575B483DE92FC03A9F52FBE829C773B641A6FD2786D1593803327EDBD4B41372A754DA3F11DFB346E914C62B8DB9CE9C01E4298A8D31D81CC656C9085C26F2FCBB67318487E70EE9478DB6857B3E000FF7685A1BE6E46B8510D1A450784A3727569EB4EDF84A6C90511828BD60A02B177C740811BAC8CF5D66B81BB35D7C34D73689EB98B31FD93C19D00E05E302819C3E691B80134F30C97A2A7AA8D9C605C92207E7ECCB9FF9B2C9CD97581FA00D318F19889914F4C008FF1194A1559BD4E5CE191454D212E736961334163DEF6919C3E3AA9D1BB2DD86486DE32632097C50437350372E31BBAE0E61401ED17C1E13382688A4AEE1B88C08A6C2AB05098820B5EFA0EF24881800E91503B58D937394054CEF49749A6A5CFABDF54DF3809AD20B64A3B96DC0EEA1D88748DDA7E534615C3370BE8F3DDEFFAF789CB78D8777FF55F7E4EDF53781F4FC8833AB3B70AD4350D2DCBB02D4DF6669B5853CDF2D7F9D231377E699B22C3D1947324CB5308CD748FE1E730C63500A874C71AA07E4F904114C0A34E2ED011487A03408E2D61ACFB4E00E03B26F10000D8116D771C17C0C8537C9C1E6856536D14C34FEE6EF72ADDD2E30B181A0EA2A711C2C78D308B9446706F8026CB4B558A4392CDC543535ECE59474386DA4969AC6E660DD9819908B8238A2EF3826B08A2E2751B4624342694041E35A253AB30BED01DD832086852EADB3E8765BD6E222AE04F97B4595746EA584376405451D892439F98E9462AC80A4AD5C5A457007D3DD3912B40FE4333272EE0D033063D80BB348C8B5FAD2FE6D7AA310396C69DE53E141CD58FDF82C212ECFD18B06FC76A385F8B5E9F8DD32B107619BEC1CC713A72D54C40CC189C0821ED97F27ED0868486B674764DCEA1C905A13A00C8484340B8BA08D81992254A56DCB1533195529D9DF90D6A2DACA7286ED8EFDDF350024764A6ED8592CC79346EEC30AE136CAAA4566B5FED463DA2930018EA6C3D3A7F5F97B4C73BF6E04145629C036231367666863C4CB4B1EA10FCEFEBF50A662298F1747CB284223A2F0EFDE270C3F2390C07DA2CF9FA50CA4FD399FE719F130660552CAEE2B0992D28A3074D841E4929D17C7D1A5D0D477B3B700EF53F139D278AD8ECB6D712D62E9C0E99DFE7F96F2556162719AC4441FD377D8BAF6C9821A6ECAD3082415DA2F111C77D1F1EB49EBE01DCC0A0130BF5F208B3B5053106DFAFD32E098EC87E71F29C929E1AE9DBDF4A57FD7E8917F6FDFFEB751B3E655652059793210F782014AD723127541A5E30EE66864CA3B652DED7A7138E225D9310B919F223CD2B2738071A9EBE390D900FBE845323A871C921EF2C5C9F756CE43DBB164C7948A26F8BF6D50C401B80A14AE02903567BB5840FAE5692C741D75B66B7F581BA4F4577CF3F7B61E8A8CE496B8B40C24C3E4DC2F5313313179A67691332FA648204A5271B4DFF871807E219E24AD6AE9E43B1ACD027A4702F2B7FAF360F25AE41998FACAA45A10433881B661B28BEF13169445C43C8773D039541DA9B57B8FE8050361FEABF5E98049715CB92451E963A5030CC554A5B2DA21B101F3E3676F59530B209CD2819945F482815C6E451DE0B43A525D46A2B6EB183DA44993FB222DED43D3B3E98848C782838418600DC0EF4BBDCB13EA45E93D5A48F849A41BF4BEF33AAE0DD3BA4BCE26F51FAA04707B37A619AF1E219F4E30B2A63326F29B1FDFB2A8AE7F9AFEA367A336648D6BD3062E56A9A74399B2BA61C333AADA19315F01819F1A43B8AC396A3B19C18422F79D4B47CAAAF59FCA24472CDD22BAB8C6FF20EB21FE0C5ABDBF84C1A1F51B6571DFB8748647973406356F7D850819BE5F91C0C4E8438D32E1F7A00F852D9F50FD1E64A3415C3997985D330387255791D3FD6512540D4872E7FD521FA022BA317F65A264D8B0C09C76FD7E3EF348CCAB6A6C6D233F4E66793AF38534D29E10037404C15E1E79FC6CC0A021FF81BEC076EC82DC5BBBFC6779C532A52458E3D3E10CA00F80CC50CBDFC3BF7798F85C9029429DE0767518941B95D5B76A8B852AB056F6DB66847937C022B9550AD57001390A1FC7C8E7300D5FE2EFAFC078F9633F2CCC1BE241C8487EE4B3593A764BC14320F972E70220FCD722AE14E8571AAD333A77F28CF61FD2F3AB1F26312BB0DB59382163680859968F2CA763DDFFB80DEC3D5A59CE7C3B9FC2BB3061A5A0FA430283E0ED87F1BCA9BF4FBCC582F021B28F9DC736620FDCA62F5D20934CDF9FB66947FA23C81883BEFD4F4024D8DD6E5652F5EC2703211A107BA87A78DC0D44FA3E854B6B93D63C9F846E2FD31630E60BC87DCBFE0903AE00D88677CBC776F6E1CA70F7ACC8E3F0702854AAFC3CB5322DE2ED9D8DE5BA23C43272A74395664015BAB227371EA05D0857BDBC0705BF654D9013F1B40D8A5E5F499FCC36831BAD977CE8A8CDC62E4AA478075C3F4DDA0C49530EBAF72D875D6A60AE6620B1EFAB0FE2308BC187352884F09D31983FBAD1CF838F69056706F6FBDE600110188949DFBEEF922D9182586B63E2B67F7EFC4B2EE3E9F0781DA38B2481C93CB37D0B115476A1866E3AC74E5397D825B322478CB82F917AB02BD8906849163A8A395BA941916FCF9F102CF47BE57885873AF6C707DBBD7F7E11C9EDB043EE0D1B9DDF1A569BA903E250A82F60AB983C796E71B5EC92AD99FF7FE79A009CB3C2B2E26D9004E57B640980EFDE6F6BEA28F43B805017E87CAC278A5D72A8ED3EB8CB27E1DE8DB5BE7B856B83EB785433E09A4AF03E196E26448CE719162197B8AD36DC652BDF4A57CAD91AD39AA431486310F0553D01501B9C74F5CC1BAD9323B78892BE82DEA7159916C662ABD58640B29BF8B159411DA2019B7C30100C39E829C66C9C31ACB249475C12EF547F1A39BCE00D31673BC47AE9FD466C4FF9DB0C3E280571F384A62F5B315B00ADCD5EB58235DA90F444411112C64EBE661413C748C118875C552D83F1EA8458EAAA1E90CD8F28C7405C0CCC3130BE459043543810948C637C8601CF98123C92AFD15FEFE0BB204A2D371F4F2B1B4A414AA7004B1B4F2F3F0B774A664A0917371F576F05571D2D694A414A7656760E4E5E764E81FF775D351FEF9F7F5A3C027C029C5C9C021CFC9CEE573D172533A5A68DAD8DA7A78533A520252533A5ACB3859D17A5201733A582ABB78D9DA783778082ABAD1BA56010A5924D80C2BE7EBA1C94CC945A0E76AE16DE3E9E27F43F319096F1D470B39465B3535551E3B79272E6F59554F662975075B7D277D2E3F690D097E6F27673B2F6E4F6D7707167B3D6E16353E190D7B7B709D49414E0F5B5B39752E4E555E39315D0B0E551B09693B165B753E1D3959292F1F10E74B157D3E493E231F03674D496D1D1B360373464575396F277547171F5D6E3F45574375471E5E157B5D4D5559171B293F3E67573B455D7F0D4E1B1E4B73770F1F46752E461B7F065E3E5F2737597E016E095F26152D2F194B653B157D3B0B0B53054B557543194F5B172B1B674529267F30C34D4E0E1F372B39152E7F1B764D2B6D173B0F1F6B6665362575757B170D65157E3E3F3B113E0E253F190F1540808746392D6D2B50EF470D7D2F294B417D060729756B774D365D2D7D677969663D7E45195F2F6B3665396B25375F6E1F057F75561B796B77373F6615352F1609761E3E371747395E071D561D2F0B7909308B4D67635E4F09373E1D3D41011A10C79C3F798DE30E0D73069DBED9D38C112F4BF65BCC35D84D89C982E43E5D2DF43614BC9425258FB00FBFD364556D9DEE1355CE19E54425E47DA4663B04E7CEA8B9913DC9BB69FDEB736B0306894E7978884495D57A6BAED395961197C0A83D7DC1066817F7F5EDAF1697416D5BFFE9A0CE36C229895862083AF1CBD0345B05302F6072AAEF18B04C34CD235AA74D160817D966C4D856B38066AADD9B8BE0C04B9084A5F877988203A108234D008F32CF99B218002C62AC858BD370C504DC01BEB7E42EB3CEB599878203696FC121870279006551F6B4FA36233A1C201C06A5965FB147C9AF0BD8AB5E1A7D6AABB07CA4ECC7BC8D2AD00164D9E056F849F684ED748EF888804F5AD6662284D44E3B70A2C809F5879D99D12C5B0DCB6944E618D12AB64338BAEC56E762FBE016032837898E682693CC708AF77FBCF67AC24DCAF2E8202F9182CD214DDC6D17C6DB01B202810080402E9BB9986A7E284862D6AE06DEA8338B961D4E62499F82CED8F31DE07A8038C7FD4E58FC25C63AE7A8A775F50E9A17B72D50982922905234060C1202838687818643B4948513EA749FABA9815394DF2A16765CD6992EF28DFBF3F629309125A07B7A93997E394879B9C2C2283E2C846E93F5E87B9538221A83872FC0B876405CFC60B393F53D5973FF66D95312B2C3F715290945A7B4B53FD5ECA3B6DA5DAA29E7C408EEF7B7C091D6DAE35B71113C2103F1E7B0182D3CB88EF7876BFF55DA861D83360AD93F6F6F1D54EC47131CC8B48C0F0AD9814BEFEDD8CE66F628EF76E1EF529497C139219AD32C43A1E5178F726C9F975050CF720100884CFF3984C458FD2413FBF7C49DAD52632F97D77D79DCBDCD33754BAB9B6FEC89FFFFB502923613955025AAC5997FF677C58AC696C3CF3C3E1A3EF0D957003A985A114AA224AC1DD7A55B1B60ADBB799146CC548C40D1236193EEFB6F2F9B49139BECE79AC8A1A5C0737957D032E281563760F146D086E222989A89FF5D0BBB5D95E17023A5E5E3064C96F8F4973579079C8F6E1CBC92818E71841F999C14B654BBA6F36B40FC0C4FD5FE8A558C77F582230330A25691DB8F50AC643D4F436B89CA5A3BA6F899132B0E08B269D471F1B20AB121D79A098F230BD12DA45D88025ECA18DC3EDE0C4EF747AD1C5D497349891AD8D4A2EC3EE8D9A58688306469EC1CB6958B7C8E465B2C45223775AF58B80A37C8E70029AA9FADBC4209F0B4D78378B0D385EE796C05AD6F668B84AEABD2463086E3F13AFCAFCB1C963E42B336412D648FD278D058A13ED67F3354F04C04DAD2D2E86A03496234F6A84863CF57B5F37026A4DA5387261E85094D5374D42E7FD33D2A4198AA13F2303017CF5A729DCD86148D0F6FEB747C2288BA60D63A5CC67BAC9FF2FB2980ADF11F2B63599CE797DE8F14B3B6A68B2FE4F8DAB6AA193AC36F94BFC443A0471FA6815AD2760A31429EC1BB32B6D318641A72699CF5DD5B484821EA6E5AA28564458BA976160B8213A97275CEAA955EE7A0B0FF41A01B3AB33182031A6D1C9BA7EB8D20FC5AE2FD15BE1C45D476D3BDE5DB7860B20B554B38F686DED7FBFDB2DC14C6570FA71EE17B134F583BF43AE307AFFA6EF8A07E7933A8CDA3885B6470DE2DCB71D43E3670485AA8615D9BEE1A77B632EBE26E2CA7115947048BBED01AAC6C4AA565297EC468595EFEE2AC970380E1CE454799759299FF4A4712A9226D994F226D00D342D581B69B42D8AB23AC1BACA88112FA49C33D0BCA38296142816B45A8C37ADB82C747BE4AE7324D6CCD5A725E3CF238ED0051567EB83E6E9C0CC6E8B71CD8780E64FB3027CCB194C8988FB26A7EF004FDE399CE9DC66D0E6B3E70DA55B6B2F5C1B0A2F08FA19852312C260B04E078D0D6B431E9C6215D9153A00AD221F6895F808BAEA445A810346482A46C0F7451C7D461CFADE883DCF889DDF0696775603AA0829532824052E0E33DF7F313433052A05FF9D56662A8CFFA30639202E0133FF0D3CB93FCF91222705B1ADD001CFA90BCB6D67A699B7AD3E23D43D7DCF18004B34EBDD53586A6E1AFC610DDE2888FDB657BB07D0BF2798AC33344219C0ECDA7CC9A6564445BACACE24A54E9EBD1D8E4DB249ED6F2DA8CB1CF6F786237C57488AE2A7C08CE6FCAF9D6B8802AB0B0B93D725A7F61AC4FCBAC09324B0F7F936F84D04BAC9E07E3E37F1CD791DFADC084558164EA35F9CD9D8780C3DFF8693B7C67C557BB0F73EC704E297BB6AFD3F635E496689C0F133918773F90A6044B34A20CF7A82F7DB3F830533E6A9ACF67D992BB8321DEE16447FFF05D32D3D7F5D35051D14E4250AE346C1111CEEBF94EE096783519EE4F499EDF54D93D686B2A65ECCC62E3E8111194930D6E4A9ED27652F4C42E650F2083F78343483FD1D1B6F578E37499D519C07CE2E50553D5F4156F24F6B6A062086722BE1FCDD1CA08547182B5F509D28DB08248E87501881892F2871050947A10424CE1B054738DDFA438503613929363822DFAA854B86E190DC35134B1E5C2CF953040E75F005E4C1FA9F70E52E01564366088B31B4C5BCE77BAA4F99FE5A9FF89C9260991A02D67E5F18C49FDB7406A45575D792E869A41930D4D8FF65AC605250F6B1B4B44B6BFE24A78E416A3FD36F4D01413F252244C13CEC81221B64A115E436B0F46EFD4CF9D7B9E977F0BAD4D9604FAAFD115BDC5123AFE2C61A3DBFABB96356A02B628E116AD1E3E21506BC1B20F1053D00B675BDED8E39C826A97A990BC2A1A8546082A47DD9A92570721D0D57836D9F57B3ECC946AE3A0B91E91EB1E78845B17D656B6525DE58ACA021F57F83D67578970543B874BDC9A89856ED6ABC1B15DF64E487DA324E240D9522D0FACF7A021898A417A40C0B589FBB86788597EE9C5F727190EA71D6473E7D49FFDA6EA218180268AACEC1720FA44776DBC778A23D78732C66CC9069455B109C6ECCD918AE9B7C36C26382750C20BAFDDB7100D5F003B936471C234FB359CE4EB3B99B87AD1AF1F5095434D4A97CA03D1ABC3B0C9BAD1898FF94F21B9099A195B85428F221FA024F925C2D1445F958D2F613468B7F1BE159AD7B7E2DA163FB585019C9CFC45B7FB4A2A9119FA73069861CB051EE231D8507F8E32D21DF1D1E71C834D6B688A4A001670C3D0B38595992D9D29C8EB796DAC7AB5A2BE277185C054D7D76D65BDA10A8215552D5A51B49FDF70B624F3B4AB614B7DFF195761A7CE726ECAB0D8F7B87A36930225509AB3C2B39ABBE94E8428288079B30A79A1DDFEA6635526EE1406A36F833F1776FA1479D9030E27962B4FDFA8F313BAFF00CAA66DCADD3389BFE68BA6C9E77182DC437DF72FB6C3F8EE234405F70F19FE5DAA179FDB04960C2E755287CFA69B1D6A481E28E0482753A14956A7A783A0CF1CA30B84AC06600F54D3FD5A14B8D0B7594B73857623524F4860105F115EB8E45C34CD5B528547DF09B2C61F7E1F885EB8FD630BE598365583D27801582D0CB19C271DCCF1DE9C97493759F8B2F5F04AFA8EC2322C93E44F9830A465FBB14EE76C33CAE663CB3A8937A77914AC11FD939F357AB44F11704DD61B65EC50474FCBA64BA401840B0A4C1D46ABFFE1409674FBAB61A1774A1C9BBC05354FBC583086FAE088FEA2F408371E9A112A7A1E3A3D93FDD140F1BF4FD5C3D9584974CE83F39E736DE3CF52C398A7594D06AD428A80F1D8D0EA7B1616DE003F5B3FA94265968AFB0B54496641C3C934C1F21D7F58E3AD28090F6C41EEE458B7E6904D8E0E5749B5A61990B36630895C550000393484B8E3F983A5A0A0A45E15CC88DEA0A6117BD38C4754BFD7983FB93079C9101AB21272FBCEF53435F92C3865C2D40F2E2A693A99C5404D0D81C6CCF7C3811951D7B982FA6910D85D100917C9E0D26A70BA11C42BDE89E3C1F575B58A658187FFDAB7A85F5E8449C3F34C0A03ED98B7175018DFD733F29A6181280E13942F06BD5C3ACF0352386843134DE8641D798A50CAA17D83DB7B5DD9255CEABF0E55AF91D257884EFB565838F88F4E1526AE811212D893E886A27EB2F50260CB8CEF4FB2CA370F759F6094336B40E64DB96A6F780313B8CA34B320FCF6629716F107B5E4631D0CD50A20352F054700293B01488B7410E64292873CC43C79ADB6D4DACC9900010E23A264F7629EBAB66B7988699DE6A7973F9FF464FC460CA1CF638EF598B464A01AC3E5F69B454CB4CF1DC8C70A3B613C43973BB12C9047BD80B0652BE11234034BEB6CC2C79B8C3F721C9088B263798A120CA06A3584BC1315991031E1D57749C91CE3751AEC2A9CB159AA19CCE504944BDD6E2AB1D6C048BB6BD5020100804024144A021CF10FE88D2BA08086E58143CD2556F24722672C680B56463A9266B2CD6F7298FC0AE55B96A8C8FB85882D967D2B0659236F0A07546D9A7F86182671414587B0988E07205713E5D8375F6A16E9CDFE61388608AC8F2CF37AB0570B5F57787346DC63DCBA808A06AA777BD13B3638088564CE478C123058753E03ECD77F4AD7797CA5876E12341ABE7D270002162CE5BA8ED821CB5804FBF803193D4E425C442E5F54398CCF3FCE274A05D008F6F8364F6CD3C5F1AF4333809FA632FCB224A7524644583A2205998671C93B08B407B83BFE665AB9E77104CC2F52A11F3736360D152BF3D5CDC4469A6A60B8712FFCB211880EDBDDC63D06CC60D8FB5AF354C2B50470BDC1EDDF330D75F94119FADCBAC446E39302BCE46AA1586F50ABB9A6AAEFFDD15DA99CA89EFF07AF083B0E3BD65069A247135CD0F98FBFE67AD63DB45D2F6002C89273393879B7112C7F24852A4545A1195838D191A248754FAB60ECD301AD5CEDA3454EFD0FB1F9BBBA6812E35A5B7F2A2D9C1712A1FBC89B3D069E88379809EF5F101262CCB7D1EAD4713B12827185B2C745AD8CCD3B845C0A0981E99F807573BCDE385667F60EA4BC186C18FF08CA9AFCB792B63A69323DE40FDCD4299B136702707AC038F1A72248B3AE80270D1FE0E2F5BC5E833A7588B4E14F9F5424CF04BD236A7AD13E6F8235EBCD143D7EA31FA0B0BBDD1792020C9996F9050AAA05F15E7FE2BE4FBCEB316F4F0C49A1CF47F73E2DAB63E70D111BF0C0C30C0BD96A551CDBFEACEBFF393AB54BC340E53D06E41C5A9064DFE0F3E6B52D78635C03AF2E7EED4FD17FBCCEF8E091904A3F57636B1EA7469DF5FCD14CE8006C210536B76FE45F3ED5111302DED0C9F1085D89EC9FD0BB2EB438647D01B6FED1F3A37F50887A3B7AE85B670A5E5DCB0D21ADCDCC76FE40C1EEE0D034A5F9C8DAC10FE0D6837B7A0CC0FC4B018B0AACBD45B897415B2D7783B337A4D021A77145D6D6FCAEB9DA55E35A304FF02DAE3E35B83BDD31F7EC39454B13BD27DB66104A896A13C7A1DCC4C4F06B5BBE2A782B509A78DA1EF8E8B7828644E76FD0DB236667515921D3A81D8421269AC5CD7E3F5857E161D5D210CD06C2C4AEB49B63D8511328B411A5EE76A051B8994AAE9BF2C7ECB6CC05E87EA00540E97FE9D54E171D50C361B0BC1CBFFCC3782B1EEAE446A5E5B60B527D50FBDE2CF06BD09FA19BD2E12C260D8348BCD5586A1E8D27AB4A95598B6557E20ABFB084A16A29983E627049BBB241328C839806AF69840FF57BB80B99FC11CC090E24D30722FF5157C47610E1F0E029743E175715FA5A7560152B5B96F806D3290F4EE0689673E1837A62A8BFC8E568F50BD8CBB14232AB12A4F6CFAFD39A2CF1F38AAA1F6EA0E803E27400C4E08284AD0DBA9F7B261490A2149ABE3675F4C851505C6834A6CD9951A94FB654BE159E851B34A7EFFDAF96B67B3270963D727842F250A5044DF06216F1E8CD8FE803B6541471A91E3A51C0EA79F4A6E2E947632929A1C0554A5CB03ED893A022C111757B00E3E1750E2485271B84004067B7859BE4B2F0A409337AC28658C5B3B3E75B427FAE9D65ABC1B4DD314F3412BC7E471E1542A623120FB65A45AF169E06DE08252C7F6578C3141D5FE64B1480C4D9C2C8DA7D131223170AE31A15A4F72E2A23B47B65E38C94DDE193E972ED43C93D4AD421F069B5E491A16161616161616060279FFB77A20D8CF100C6078CBE68746785381E9EAA02EEC32CDA5C3CFD873D189FDB7EFF2061A0D5E56AAC03C963BA32395C59CB870CDB00649BD92EC54BAD7D2B091A582425E7E2E963D2E706410758EAD39DECC699069E9C9556F766FD318A8393C824E7ADEFCFBA0FBC704E035FECBF80C6B21DB3AA0361FA972D77A017B5B660F4D7FD874D42B139F9DCE0D8821522D0D20C9520906D12D1FA7449AA93305B0C3E3196B1C383BB4D9B86C5C03D611D45A56818EEF471BF53FBC5471732CCE2560F259E768243E5A84D55382CD01DC213C894FE2297B72549BC8B1DDA7E6B2B3DC6D66C27E5CE4CC84E0EE544163405BCF360D43F85DD7A913AD842DF62154706AABE40B97B841099FBFCAE45D6422109EABBC10E4B1799BBCE28FD022AA494FB027C8963837DC34F83A3F46D2BC26046CE4EBCF1D413DAC2EC4E2FF513B4C6F9D96A3FDE27683FF351A5FCA0676F9C20C98763BB63EFC2BD22358D70B938C9C84FC0D5E1D6F89DDC4A08E79401F2129701E687C1584301627713EAD6D72F82A2F7D764567771F3016A81A39C776C30DA2C403C49A2A78C466151B49116784F06D267122358332B9754160B646C6859FC9B2964005D9EC782B371BC3BA3E9FC6C65FEC0A4F7531C84B866551CBEF9F9B41FF10E300FFCF8DA2AA5349A74B020E1D3FAB527599DB9F2DBDDEF6675FD9A65723FBA81B000791DEC6E6CC3C784B4349F9D525D7CFC98F88A44179C4B83A686FC982C9739430105E0344E6674406F236441AC833220538D29011A1E52527AB85879002D9D61D8BA72B79FE695573309D26538EB43A3E9DE1A404FDFE77CE52FA5D9442B818B26D113C8BC97769CD01F1EB9EC5EFA808F2FF3817CE73780115C36F7743951C1E040F7A46C07D0ACCF0FC7B1F895428B3C416F60B7E82E91FDA95E7457EF34649C341CB6854A0BBF6F7F2B1BC7EBB1B33064F52F9C2B678BF66A28F8F9330CA5A2CC7926A01A43FC63744F717D4095430DC2E69CE095AE484163A3EAEB699D37C1D9C3577935464D1119700222B90972888672DC830C9144A63584E61BC5FB7CD1B69575317DE7C5260ECE21318919104A3D909F8235E09F03EEEB9723C7BDF6D7BF12AFB65A96C081E4656508B78EC7C366C157CA14639F085B8770D416814A88DB18061A2D827D40DB53F34B94F30645DB46CA32C23398533A5D0EBA18326A50C6E3A4FAFF40739ADFAB39DEBB06B3AF51362A3921FD79B3C9A8B25F9E99D6E166473FAA328015EE143284880892F287125EA0112675BFA0710C2CD1BFB553B8796364CA43D67DA11786BA0D3DB9EAA167417206F2E85737AD3CD82BE41411F91A0F0E59B468E88E36BE79430D3E960524AFF6FB0D204C37AEC8A6E0B9E45401F5FF5B7BFE0E756016698661C7CED1507D97B24D0E1F95B76ECBE28F1B789D2336E8B970F5D733C506D60BFF2171ACFAD2963C68A0A2BC4B6A84ECF294BE78A72619CD3DC9C1A56D2347944A2B24B53C1391FD23F8B0B495EF76C074C3586029E3ABFB80F6AEA456C72B3CD185432B2CECDFD229C4F0DEA082DA4C8FC145A963536CACCA20A8A1E26C1BF4C8E95BD72F244C27B6FE2C5E1FCE18D9CAA97D4475EA24AFCD3D90380E44EDFCFB8DFF6D572B7B12A1321905BCCAC1FC24BDFB8B24648B88A3C7CD666DBC0666DD23406DA0A0323E485EF193D94D737519D1367B44977B1A53F1EA892E645C563A189470BE017705B0F30B0A78644D171931530BB465D8635AA452091E71840D42A17F2C42400A12F04808D50201BA0AC9E28ECF30A8A5E301060E0AA9BDF6598248F97EA57B30F0AE5D4C4C997EF1B07155012D3D8F2B22103B4C25F47960D9DBE2E8D8A728AD9B927792E82524D1A9053FA7C4A2490B538A70BDD2B27B9C569E6B532E3B41018B2DA0FA3F895AB679A7E3BE1FE8FF657F9346319632C74FCE5632D84D11FAB9E6FBAFE257F6F6A1B3B13CDA142E40824E0F8A3C673F59419B0C62323B15BD2AF3D6D132F2D81E1666B5ED04C99C3A6F98516C54F9C94DA79CE72B0C118C914A21148DC023F188CD6371BE2E7ECBD0A6D48C02747E784F8163C8463D230300269F14088F482014B198316843DB43952E29CC2EB21A21FA8CA5245B17CB52C84C5ECFF5EB045F5007D359AD952B4579E507854B67678ED77E811C351E6D3BA6419B8E2587D0FEE9836E805652D82E8714D83E8B06DAB805C8682FEC9DCB1EA133322DAC45069F12F9BB25F2C49B83484DAD117F34224118EA8E25FA84057B00986A1D36AB8786C4C24D1AE6BD4CF1E00B2525CD50A6EBF389A796475AAE944608C035E622E305DA034D48E0C417F5EC50221D1E6AED5634DAA55635980CEF70A8306A749651D94AF134E6976A573B17C4A1BA7093F7B6EC82649EE562F978EDC09D7E0F95A6A4EBB446F1840385DA6EB3A63ABEED57DBA4CC7789A9DB84B21FCCCC333A3953117751480540BA8FE16EC7C8F683DDE4C65BCC21DBB9FB9636DA0BFC114FA57D8FFB3F6CF8A60BDD8596745F1D7378A14FE0F7D8B8D0295B35FCE963787843DDD50209495B73287B7B51FC79A79144313BCAE04BCFAEEDADB14434EC75C14BACD923DC3F251510E34C8F2323D25142AC64938F99585383322C0456DE5872A107110E33A8FCC141797603F70E6FFF48281B3127E5DCF9CA38A6992C55C7C466F4ECA132671B3BA0DADEC2FEEB35579272A801CB540B5867283ED6F3BCDD09B0A8A1FAA430D6570C7D18EBDDD2344528A5826AD192068C853CC3C2E02ACF372718B6990A123006034846D62B8660EABE9192EFA64B62F872898F068B6B9886344A6ED7C63A9C8777CBE84394A79204140957B286BEA85F0BEBFDACD044933DEA137BC39E2836519B70ACDE5E977873D770414A40D120882863C430CEC6691803D0F44DFA0C354124A0DE05B3788A6D3617B60C7BE3DB9E8885FF72B000C087871471EC3B4D434D4EF17D240DC23BB0F1E4751FB9663490C8D022F422CA0716D3317CA08BB227B86C6A2B02DD297B3C68098EC06BC4F335BA089EC4D3F9F179ACA55F8A6E104D33821C805FC85B26B246988AFEBBD274B381C69E944E7E75D8C7C7D08459AF6D10FD6117393D725C8025C51781A24677E4B97996B1242CA8198C03DE53B322DC23491235A636115248336681C90DAAE6942034E483425BC289DD689C4BB862FF11867913073E1917F47F5817F75E43FEA493C7889C32AC09371590BAF74C673800241AE2CA1A040D010300C2C3C021CE60F2CDCFD1A87C415C9EE1684858770AC96294D6D9377B0C02403E79E7A5E9216064CC3F98172382F1B21969277D43BEA12355CEE794793D6F7325A1F9677F48FE065EA05F9660CA0F2F8E729710C9FD5C8DBE5223FC9A9A1A44ABE4EB8A91909660E962D163A6E67466DE9A116C4A98F3FCCA2B20BFEE9645B475537E558B125A261455023D9444BBBC80B1CB6D33CDED44E94956A9DC59E56A1E05F9E60CD69FE6A4C55FDF707ED8580486EDC8C6CC556EDCD7EDB4074B37EBB93970C3FCC91D6AF0AE94143B29762303EBBAA37ADB745FF627E87B388A01D04028140F8FF29A4C4218B6DCEB27E4B4A203B98E2E5F888C8691ECF1FEE15A421E88FA396927EAC2AD1EA5DAD1A633ECAE2A4B2A7DA0A8DE38503F5894746956EC773CF1C5684AAA6BC970B759EC9F86D1277728AF460E61D7B48438B4A2AB6D3B4FAAE3987C8CBE9A4364CC709821D1D7BEA01F0D4D350D21FFE57C2E6D9BB1465985E16AFAA8C042B4403DCBF5FBFFA4C07740EE47FB8F56D2889AEA88B52FFA9B75687E4F61CD677F778034E2E9171FFF8E222651E50FEF1544FF729FBCF867219D7D1C566BEC8314EDFF2B641B24050201008040281BF413F839323542FA2601EF640914873BD19D1CE4D0313DD8513F2CE2D7D4EA2CCBBD4E5A4341F04854FCC900574B8F2EF8D6C6B17A0CE713628B4DA0639F2A95953B94B3FBDDA7BC6AEE69E5C5E4EE0D369D9548E7914CDBDD35E057E67D8B2051F20B1608D045BF3FEA9B1C46C981A7D9E1CD0001E6CA073FFFE9D9EFDB165891E3708F7C218FB02F555B3A538FA2B8C281B2BA219C440E758ACB93495D6350A1F27D95A16B6BD8EBC6FA84EF67E1CB54EE0F0A6DADCD0C46337F5507370CA8CFC0F68463A382BC047553E8AA2A1A70BE55E46CFE5B0394DE77723E4E597249DD6EC0D5764305D2B964127367A2D2C2EA07C8D401CE4E6CDD010DAF5F5CB33B06B97C036E0845EC46E0F59F0167D7C4E19D5E9B2413B292129154E5F42AC5542D2D00FA1BBE298A1CC4A53A7A7DB67B3A9E2F3DB8738466268F48601AF82BF589EB335F7021AC8BA49BD91525250187433699FF1CC461738F185951D017D8C6F76FD2D50F14B664D841292A9B51D880B4DBED8594AC8C42A8EBFD3BBDB649541910FC1A0215A39FC4FEEC63D0A6AFEBAFCD97E3C1FAECD3648699BF12FFA61B2FB948C5570DFF4CB34241E5E23BBE99FF4F5153AE6FDFA64DF4D4CA6D32D63276EE4135B1D3BEDECCEB205B4B741794A1E0B896C89C55483605EC323A1C7B0469520B14DAB11E2886A28CF94F90201E3D3EE4ECA3A9992BDC690E80D039A3F0876F6FC469478209D3DBF8F8EFD08D95BC08D84F122171559B282D117AA80164FC1C1F3D3E0FA97A495DCBCA5B31BEBF6D330F25B755245BD9423AD692BFFDE39CC97D2C87B420C20E0F82A519E8795D6D938541F5E66768B6666E8D76AE1F7E5F515DBAAFED25412B09CE33148DDDF17988FEECD38C656C8C5282752912173D8216D63FADF92EF2CD4E39F09F63100C18B58D218AA1103F291E038241A546AE98C39F9D34D4A1377B9CEB389E0A4E848DD0DFE5BCE7CE89BFCC52FBF0DD0E9B1EEBC67F3BC79A157067434BC3FA45B5EA998F21BE5CEF2E4DBE5E0A53B444083978D9A9F1F603ACED147FF6A88BCF9FCFC7C23BB8A5C30078102688E3C917F18F50DEE0A3140E820757AC805D6582C8E0272DDF25128A1B2A6D8DEAB89C5CCA1B6DE1883712BC0C010BD54F44CDF48DB740E45EB3293463B0FCBFF7FC52A171345AD4485893C091910EC0C085A2953417F8DFEFEEB2AC9B4740CCB0061A313A8180FF30F09921391F4023D3784DBBEF239BBD915A30D2231558BF713091825A18673361312317BFCF5F9C01C10BD6020D02EFCB2A56BC4C42BBE84AF36DEA90BA97B21706D829CFCF34572EC75D9C81E30EE93FDC341B3CC378E1CE16A82F41B633C67ECF4A595328194CAC617F403DA565969E9B7F58B71552D63C46C9458A1981879415EF086781907FEC6A93E1F2AEC0AD83CDC7A1CFE709DB463DF53A6EE76E9D401552FBDD6F8223DA7866EF7A292ECC142F320397FDD0F6F7F31AB76B3AE1E8DC61EC91445AF838E92CB5841D4A44ED67614A28557E0B7461FC1430E9A3B2DDE91552F7C37E65B0531F24827BC7AC2E31F7D0CDC7FE1B8C3E9DB826842427BB1F870C9F97B55D70C3DA4ACC2DA6EFDCCB1432E094675FC61FCF530DF36D2894AD0D7658D996AD542275AD9C4E783B512BD58DF011936B51FF76D83E74CC84A0546435D129155D4B365A230F64A4091F0D8EB0629CFD5A00A46ED4DCC63ACE721C22B663E50B2CEBE6BD4A34F3F5A1F2481FBFCCBBF468CC406CD21ADC31717F30D112F4DA6D8846DA6966C1E33F5D690B775332740B5ACA5474EFD401315882947D1CEEF1309B5F8F989CBC2940B8A16EE7F67C3B3D216552A1D6FC45AC2723AC42F9F26CD470166417F16DC48E3FCFB08F781FB2B7C605B506F1820FA9025980A25F9C3E61E324E6FD2516AD1033D9995BD5747F8280867B51EB02836DDF6D338C89C50F92A05FF38B1F21A9125132D3C17A78E1252698108358071E302EF5465EAE0ED6A5A6C0596C25C091C0D029B9C83A161E0C1500870B00A1B88B1E9205D9EBBDC6D66A198D66CF2FAF5C278E51C02E335EC6B8C3790505F2F2B6D4D9E12ACF08DF5074B1C0FE94715954487DFD1CBB2EB0B4B147BFA2C414CE52C026BFDF2E1C5D9CFABD0C171A508A2C64167578AFBB2A34FCD2174B73672F4FD721D8BA560460389AF9DD53F0C93F360F11466A01CBC9EA0AABEA4A7DFF45C38E8DB2FC7A0BAD2E8AFF7DD1796E84275AA9DF39D119BFF9B0FF05213685CC0939F713870028140207C8E87D79B11A9F62EF10F62FE20C20B81FEDB01E53B4DB2605528F50AE20C9C19E5B548105C67557408FEBB471956C2CA4BD78D107767DB33865AD18ECB5DE4F7CBC1148BE3AB795012CE744118E38C33CA87AB0335D5668C5689B4C0ECBE097BB528FAA29C8D6CCFFF2A7C11ECFAC21AB19FDDAD6C04E1E0FC8249CA762AD9869702748718E0E3FF2ADC7ADB4DB5528A9256738D9A6DFD833F4F7A57D6C692F2B082BE197D0510CA3FEC47988556135EAAF6A172B1F4FFBEB8C22123C4C3DD5583F05B4BD69B2904CC5533652D5DA1EA04C47C5243D10BC7C5F5B283C91B73D501BDC9C35051D5E0BFBAE41D872505EFDF3CDC503FAEFA6304F55F7F808FD8B6C77F9423204BACFF4BE493FE6270C22CC739F30D3D200C4032812A1203140D864E4FE37A8C8E836D7ED26F7F773AF09863F61454FDAF2D06303C560D0E4C36224B4510AB97D543AAEB56D82414789D34926647D548A195DF11B69567A778AE34742E38E36FF7361BDC8F94D181D31639D887CE834A9C89EC58549E9774421008FE7F7F9E9F4BF25A7DAD249323E328BFE1ABF90DBD7942894813E650CB52343AF6138038BE136FB72BFBF52FA630A9936521578D9FE6765FAEBD6694856CCB58F130C88BFF817EFA352A2A8E1A21ECF3D4E36EEB90C854F590732584B91D10FDBCE56DC50DD846B8818AFA792BEC6016B112F763821E50CAEDFA65B7C6668B3485DB4F9A66005A55AB57B89A5E5BA60EC4E7E715FE36DF06896A245279A0356D2C542C0B004C56A8DA0D5542A10CA2D6494AA2A7061B9F76C888BCAEBC1DEE2B4FD6342CFCD43E728C040E919BE5A2239E6587F1D7661D9FAEBC51E9A721C9FF0882ECF795F2DA637E12E06F925313641DC8856067FD06459A441DF7E4EF58711F0AB2C4602F01BCCF7DB7DB702489214FCC18063CBE0DF2D92CC2B6648EDA68FB7423D91221F9ABB4304F4B797708D9E7C6F0428815FCCE2FF0443870393A8193160B15150EC3EE927426D712E9C04687E41B132650C603582C975B547119A93D2F41B43B745A113BA12537FF57C65D785B1EEC4DFB46351AB37B10285A23D0B4FB0AC0D0BEF084834642A10AA22B0C87ED87C9A399D12B244A2DFDC947473C4B48F40FB8CB67D2E04AE8A33630DBD5DAE4FACFF4A6D8B63A275B7DEDE7BDEB292105A85A4FF88ECA2A85B90A91FBC67AA06418A83456745A1E32EFE0F81FE1A61403DBC0AD4FC122EF7246E6CB69145D211A702EE7B2F217187BB0B9BFABD6F63AB377A26E92FDF03C477E9B88C0DC295F3C06B058C5BC7FA23D1AF0723AA6DFEAA4CC60F2F2D155A307CE5BA317D6BA69D7CF88752D66DF1B62E89E067572EE606642A7E3952984E6873AC3CE65441EC95D7B86268411F05B18EA84058690AE5B978D4163BB9A71C50BAFD21D0EBE44AAA114B6B8A6750ABA9E4155A6A99EC865FE95AFC44360214EDA9AB5EB8EEBAAFFBBEA4DA4B3CEB3F271893496E8A1512523283A009CABB23D47315FEA91668B228DCCCAC1F581508CD46199502AA25F36D58A908614AF1CBF2E77FC2D36116349005BB10296E8885F1E0A01039A412B242D836C32F877450A188B1BB25071319C338CA489121A48F8E974E32F0056763498E8DC31CF3BC45373A42B3A2D37A82FB2F09B33B80266E118DC9EDFBBDA9B14FA7623947767BCAE2A1C81BEE40D4CB2B8D619F4CAB46EDA42ECE191CD1BFF0F6D79904FC051E9AFE5AA8DD17D94030ED90578F0AD54C82AB930B917BFC07CE45DADC8B4262A46DEF4C92E9D2988ADD1BA7465430450C6F85DDC8C57AC29F439BEBCDC2CD4237DF3864D3AB86CB28EAD43E17492D09F7414523630B9E546AA4E46CC6BF8F159F8A993276952726B6C089AB6B2B2204FBE2ABDA8DA5BF95190AAFC4B45CDF238C83845B5B38A93BCE63C5D1B59D062AC74B6A520DE7EC21596B73A5E10B77C0609F875F0EECBCFB6A05D94CD431CC253434E8FCDEF4D5741B287339E358A7000B68DEA81028BEC6108F6ECD86B9BDBF9FDBFB6F7F78BFF7D1BA485A25D5A8339CAB1D0C46B256B233B8AACE23F8A33D90995BF9A96B6E9D9FFEC48F81D7A93C0C863C18EA509F46FB9489003B27258EEA96CA899FFD15DB17BC733E4B8826DE892003D1BF16D329B3C445119B757F302757EAFE284F5A8695402EB7190EA19365CEC235D4ADD2B4C7273C6D9482116A7FAE7EF1887ADF29510862E40B310BD06480A0D6905B78CFBE14A6C0E4ACA547E9C7C376022BA78494AFF8454903E97101B46F848FBA7735FFD8B5419B5199A125543324CC367FD9F5C1D39B89EC054C717F62AF8190237F014C6C518815E3CF70F0ADCB68323A905B04BD3F49FD05D320259651FB1B8512FCBF7641C9BFBBEE64705B5BFD0B3F5285592C0D1F30BDF37D24B65B63648C380A23B1183156CE3BC49C2DE5730FB9675CAA9F12647224EDE248CA45582A4B20E209D878193763F9F0A1FFC56F4B6657F03A7D4B549AEF35D4A40DF01FDCD7B64AD0D6205820281402010086200FD0CD1418D7AECED09B32871C7E2B584C25C7812855E50C19C09852A2449A0F0B569850F5BF28053D1200FA6C433E6119D03B6CD25987304DF4B458FAD044E1341EFD430928BEB85026DA2A31E42C9AD88658CA89AD89F2EACFA068553B6B7A593B2DE0B0249B1A67C40A645862C85A2532BC812611CBB1A26863B0CEEFA4C60E9ED532A838BDD1BA2D006CE7365D71A720ACF2B3E07594671B466CED6749B6E8EB9D05198D585194044A1D45A1B1C905E3020DF5C528275145259B1A3DFB18967D0FC639E3396C65CEF9E6E15BE618CEDAD0BF084FCEE85711169DC7A81B6DA9C73E6F052685F3721B242AB09FAD5B7FBF8B35E8D8BC9421A9E752312B8DA8FE815759729A3A94B9F41581B6410BB2C2D720A0B43EA6A688488F078A43D27DC66FD922DCAF99D2F403D1C85752367D7BC32C023C762BAC2FDBBB35979520A8785AA82BF143D8A72E37B380145DA50A151C9BCB02141EB08FA8C4E67EB018D1A57885B6D60D9FA99C800CAEFB00CD34CC46FFB94E08741B25BE9768AAC4A8E32FE61FF181A9F94D8E7F32E7075413DAA46FDBB685D47E1E5CCFEDF53FBC30366D9565A6A41B0F1095E0448412C6687B5E1280CCECC9AC0B1AF84FF6FB653D527A56ADB0E7356F1D29FAAEA0EA10E9598DA54B3E3FD9417DE4C632A19074CD3A3DE3778EFC4E06B63CDFD9F30B869F5CB4AD925B2785E8BF58E6F91ADC83BC0F8A3224811CC612A0E69E3A512931E7568F29536656032E37F8E4AD235150724C3CC26C8B75CBE27DBC0A6AFDB8DF86EB7C7FCB956AEC3C1E45EC93C9BFE797BE5A7C0131946E2BF71CC222F9690F45AB1C3BDCDCCC1101C412FF313419A8AA062C6E7B7172C6EFABFB56573C04462AE37D58B766B4C60CEFA894664953F49AA60A4C622AF28C707440F4DDABDE2B440F2FA59633808033A3443040A4CF24BDF8234F079E8CE95BD983B7E3D70FC812F2D8FF085D1885700606224CE8E3E257FACF203F366544A87039F263CCB015D9EF2A776E43091C12F7566E850A46C12ED2D87AA53117B7ABE32331D2F6871A5C4A506EC3DC93395DC7EBA509B28B188F0114289396E7AF8293A8BDD0E60853743DF2785D380621602FCFE8E57B114628191ABF9A734F588D0FEA916FCDC95FD36B4B9BF799FF23763FE3264709D23D59BE676F343E6E546887F00BE7A53F98C472F76154AA7349A6B7543582C37D2DFDE4E4749D5DEA4E0D835DB9AA6FF64C833A42EEF19E5BEC150A4D394FE4EECE501E88C963F5A25FFA04A64C1F93AC84ADD5A80F0109E47DD48A0F63F9AD99D66A1AFD9C28C7E56C36DB8EE14B19F53F6334A6E5AE1826F89739CE2A966A9DAC3AD643256C0154067F7CEE543F3F19ABDE4C879C465D6932687FBC18D918EC63F3647244793F25F2D4ECAD32B1C1B6146099E66CE26777C458D2C0F54D84ABF0832542D566DD5BAEF7E0D744FAEB3DC971B2D2A7EF100983094D372D3A767C1909803EC280D7D43B93D80FCE6BC48D6AD4D2AAD78CD38AAF7ED1D8ECD34FD33A8166AB1487D47B03FA4D90E53EFAD243B3191DD19DA96674969E4C07ECD37CACADFDD2AB578F08BE3465F93636BD679F0D4F1A7EC5BC4E22F8AE653AB2D53D63BA4975CE0FA5F8EEAC257518424699167F6900D8917FF375C29DC223FE1D65FE888E094C545CDDCE655EBA04FC6D75995D4F3FF7E1F7AC15B6F4F69BCAFF48580D481C566FA824281E85C47310A334D24EC802BC3F69C0E0593EA3AA4EE902AAA62A7948D5983AAFD10F3FAEFFAFBF1222338257B6F59739ECDF51E720D7B4F643743EE5418F2781606F19905317222FF647D95BA8D86C5A95DF9E65E5E7A4C5B2655F2169E6A113590A5826038BF3747203B2F9B8957DCE3E3611CC4FFB840686762E37490B7B0F3E80995120404D214B9142229BD5A6AF8ED6CCC148CF153EF5A6049F25CDAF05CC4CD468A65DB086BB84B235C37020CBF87BC2AA1BB6454FF6E622E0407C49F0153B272EC3354A86B6910349DD028C50CCB0F87A0231F39412E361B45608DCC1C7B0C819E1780F692885D1183BC8C18D4CF210A6D1DFA1E049E36561216BE36BA5C2A0E769E16DE36B29E6E2E326E16CA76F0849C0340D93D405A7F562BB466DE0CC240F959C5C06F4331089F8109A228A48ABB20CB6054E60741D03E12050E432467A22013BE0A3940A9C37157512370257DA2BCE778C43257C4B4213EB2F15AB11778362360D0A70391E76B08896E037C15AB85A5CA37EA6CF600B249C562981DA0B5133A512DBC0159C07F3AB9D96509D564BBF6DEC8F83E63B3BBF86887F8DE46E318044E5235235B43E340E4F7C0B68D5133C775406A9CA160824C0A48B6C221D03E869CC39D7C095018404DA075245A84A172C238BE4572533E9724DDEE9495158ADCE1F56C92A335A99977A265C6AE631C9A858849D1E7B8A906C23C03ADC22A3E3AA2B46D348E41E084A03888A2098AE3288C649F011CD6CE9A8A98F4A5EE9B5C66203C7BD1F0651E6493B02207D9EE7951E57990157E4BAD7B9041AAFBE92042F21E560C440C803237003A0CF4C2590CCCD71003BB8E4CE098C03341A81E90920A8703B33BB0F0201CD66EA3B10C85B85E8723380C48DE72EF1C1010BD61407EE540C70276F600C2D11749C2057D46865AB7D71C3FA5589E96001641B9C8BF80E2696BA1C9AF198A557FF5673B81456FFB0D41F0D498AEDD620E454848DC50F1CBE449B54B9F7EF50169BD40FF514A5503B2949C53790A14D4A9B9F21C8100CB5F3C68B0B78CE2AA1CAEFA7B5344FCD7EF5DCE9A39A902050D3815ACD64F807384DDFEA154A3EABB25CDE2369A2EF4D7E8861F9F2138C7F676639A99A9FFFBDBC0186F925D91D512894FF310AD38C6768A3BE7124F85CEE60B8A05167CB6EF1BE341E45B885EE50D175FE9625446295E910B1FBFD3FE0F57A41B02425D970C9B0B7752859AA232BDFEFDFAD748772DF1A574B68EC3865A1675F1F7521B1434341F15388A55AB41B3A65ABBF77220FE04CAA4EE4D7006DDAB2B47AC9B42B81CC528ACFC52ADA02638838824FA5440DEB8C6A80D6F9DDA7FAD663A502412F3DBD2D7B6D3C1EABE8943CFB75FCD474D50A813C469E10BED5140A8FBEB3FD6094E2F5E6C57BBF752E5D4F491D09C66092AEB960EFFD061E459A47C4AE579A056E62F450A3B128E24F020CA0925CD1DBD4BC96A3CC70781FFB720B1088C5431430418005D7B8706FA27316F372724F9354C1C4AC080765A6C5D002FED09CE7F90D05A2D04A6D581BFA224DF9361CF41BBB3ABE46B2EE0A69C220B543B44EA31C6FB605D67978F2EFCA9810A4B3655942B86A3DCAB7E6A0D054181402050065CE62BE9943DE2821F75E8228B823F7B088F0AB9AFCFF6695645F3C04DDBAE2D2767B8AE52A40EF04C61D5BE3CD92329823F0A7EEF4439AE420DDC58571D077DE9CFAE1597A6FFDA06965E093BED192F346233F82FBD0A155584D99881C2E27B86377580EE953673F5D316A4BCD00865B44CC128DE83FA84D3BD21EE24C3D7D91A9B0301F01A91E158FE708BE66EAF0C5A9C47A8634875F62ACF5329D8C97D5106F5ABEFE040760242A361B2983C07CFA92B8810345641C681BD61403557D09DF780A927B6D0D54FBFEC9EB955F25D22FBA2AD569FD9E1F9B37D5F1D807398D75158A9EDDD526A96C5326F9137CA8EFF37F10FE6B1A108C6B062EAC2B973CD643C0D467904B8CF1B3618D2694C9173E38A0E401764CC59689C88246B88922885B991B73F858A1547F57AF21640AFAEA0E670D6FBF8B204C119ED2FB2F361107FB2FBC1604E6D6BEC2CDCCA949174A5B44D65CBFC80A53C55E340D669E502FCACE1C5F70988BE9D971C8A6BF1DBB25D0EB319F0ADE389A5A3F27A0C2BD57AF413FC18C401EE7234D52FCFC86BFCADB792B693CF2D85E91FA0296F0A4ACCF4F512FB7F4B120CF5173F765306166054AA7A1B6BFBB40ED51AE8B7EF8BB0997B93D99358B7A9E32038240EDE649CE9B9589AD22DDB6E466978666E98A4AEEE8AF23E034417F671F9857B746E57F4C9FAC003A71475316F8D3E25A9E505D108B129224F99E19FC96ED2EEB98C012EAFB4B745D030EAAC9FEC3F8B59B5C27FEE6B3CD30C80E7AA9A9828061FFAE5943022FE2A0A313968FDE7FC5B5460614799CE88EE8EA77EF5DF1E0A66D1929DF197E6AB8DE80D22F2A4B961F58AAF5AD1AA730ADD226C2C6265D0A556587BF976BF48767107FB151E9F5B1544B3C468E9EF5A621AE117286EB57CB67C1F9350A9DF0059F1EFF8912A79650F7E4C92E509972EC29D93EE2C82CF22526AC4CFC470CBB89654EB1F66BF658C0190FF3A2E73B8F884FBB7487C868F84933D49150F5DE49D454994145F418C56D7FC2AD750C0A27CBCB566454B228D0E5F8673F9FF6A8EB8842184698720FF0F826B827462E83AFC32620DDAFB23851D23229AF27DC3442FF24B2C5E362DC1A830AE2E40B7480C315125EF59ADDBAC156549DB636770A7E2FF1E9BDB283CF6BB96CA84AA0D8A96CC63694B2B83CD6F973C22508E31D4AC5AAD6162F3D523F4913A1F7F9BEE6DD44ABC6068F2B108D6F462771B50FD58C6C44D47CACA69E4FC7DA6F0D73FF65B2986042E6687376CED69FC699043432380CDA755F3E0085324FE5A060BD923D5C2414060A806C8D722EA56E40FD7FCB220F72B36E44989F3C5A5B7B91D840C0582068360914020185810040904828380A191F8C9E0A1C020180808BA8FE691FB0DA9FF3BD28AAB6F34E103DBABF357D5692A1BD21CE4877FEC798DF29D5913832A294F9A3DBC92384B394A5FCDBD0F470AA2045FD42ABBACDD3CCF22BE4E0CA21567DBDBC6A9C5712318ACB06C30AC734605CADACCA6BC455957E09BD5F48201D2BB1278EDEEEFB1AE0692DD85E156887BFF3B706BFD7F4713DA98D07E5E68B30294D5FED027E7DB666D84ADAA2925BABE72940B6776F0DB427F776E5EE817B4DC22A0C02754ADA5AB40B8A8E3932FBAAE345A1D95DD7FDBB5AA4BE1D11E2B15662BD88183C2188082AD5A438EB945AEB549CA96AC4988D6B6220CFFBE828686A4739A53D825B91570E8BFFFA18D44503ECF8C9F865B6B1D852B724DA82BD2FD61B89DA0B786BBE9D3D6FAEAE4247FC08CA838C3AABB19C3411860CC19E155E216D8FBAB92DFDE49F943A60893CEF64B87E1C7B2573C6F3DFB979F80DF3A82B8D2BE42BF87180E0CB4AE6EC75F3916CB3F53947FDC269B939C0F1710B31FE84052360E94474ED5F18879FBF8E2F5954D5076D5F9D10EF1487D038320594F24F79A2E3933089C91D74BC9D68E3BF563852B28DD5EBAC964B3D1129CA1FB444C32A97FCFC27003F986FCBB18129A536F46B7A9DDC872C719A0F9F9D2274AFBD0F7527A31FE16FBB49A203ED83EC0316B1B2CB0ED559B903417EC9D1A03729F328DDC8C1D93A1F40912A42F9B8F6C031BDD2F9E5703FA19AC12DEBA83BC227F3A66B42ED44761AD07E654A74614CB749847E0B181655E1EF00F24442121871A57E4A8792D67ADDCCBE46971909F7B4A309DDC759BA47BDD1CC33EE862864CB8C44546DA3FE13FC29B6C6EC5F9760D7BADAA4E91EA4DD92C8D6116450246DC679D3976AF2220D1C6B8FF6D2B1F0F59813D14CD7D20A1E0EED3A6A0ED44C6889193DB5FCA40F83672F1DE13814F9E030D79CA8828AD0B2C8A6320549A9641E713EA7B90BC80811A0CFE6B6E7DD296E40B4E88257BF61A7F090395021E2CB58A740FA8DE3020100D4CCA5E25415AEDA0853CF79746BF992C72889F1343339B08DD242A8DF31A405790D1C39AECEED5A09F34FE7FD474DC5A32D0F85CB819AD9061E622F14D4011368D97B4913D8016440D0B972AE51F51595B9BED6A0D94724AFF3C5D31367E09FAF5F96CCD5E9B632F1DFF196B7E9255993EC2628ABC668D600357EBCC1CB0E09E85FDAA804ECBA0E2040054B9764E09BF39B37B5C8AFE131A3F4EFF7CC9D454ECE4FF9F30EC1B92EB7428065770E7B5E90029CBB20A55DB23E61B661C32BA9BE90E597A9014D8023575E2DCF3CE35ACFE9DB3907802C7C134E07B32000A3E92063673772E09BA46CB30342B0ABC3B3337306F906EEE54DAB376044918F0FF61B0566DDEF7C883C8CBFC98B417B4920DC625A869F8B0B24E6074D5B0CC0514C4699599B74EFB6C2FBE39B9BF4EC02EBCD1AB30ED9E187A88494F86450ABFB681B54FF2AEAAE1FB3A6619EECDB01CFA19E1779027FA5B6AD34E46748C6438C21A2AACF580BEA5B661BCE144A85D74E264B8B71F539571BBAD568C518DFE768CF60FAB7B41AB29541D329AA6D23EF41BFF75AB968C1E40335064F321A81D2DFD25255947CFF66E3D2B79E2AA3CF5733197B1974DEEA71986C55E306062E960DB38ED63E59A6E3CFE84998560943653598122747AB2F3EACD95F6B51EB0679C508E5DFEFC05EDD9DF174E9D0925A70FFB293471DAF22C42E9A67A6BF6BF587B9ADEEDDE7B46273102C8CDF8AE620C0A7857DFDF5EB63D1F7EAB12A2CB59E471098FB8C9DF0D0713C72093C4E63EF14F80641EA350F878E2319CCF1F6C4B4AE2F34AA57439A5AFDDAC7EF5987B061BA07F6D90E00763AEBECD35F40025AEA095DD2D012A8D86B49D08B798BA844207587BDDDE692B84F0756210A4F69A12D0EE8867D9F580C68C1C16853E96BDEAEF31C3DA33D4668CA75E6A80A2DCC78A2C7F51D4E110605BDAE32E23926D68F1E9B1F88BAE527BD4AAF70263E5AD33A695B13DE7109C0BFBEA64DF0F6A7D8D3619BA8A03F86380C88FEBC4502A3883EA0BBF8F7D73497064D563B8A2345ED2D1AB24386BBB24E0F70E5CECD188DA9A2EA0B66B7539EA4A2F9FBA956E0ADD57125CFCCE99CA8FCE1EDD19CCB9816B091E6B830882A040201008042AC0391DCA131C1FB1DA5F722C7DA0FEFF1E96037AC9D8C0DD4DC71346985D2EEBA8ADC751D16430D8A03C5CAC1ACD341B55E5334DBA63848567DF0106048774FF240FE7AA17BF1B1320DDC037C06C86E440048D7DFD6F4ABB5B60B058060E38936BBC570E8FD5DBCD2BF9AB5986426E9F41581B187AB3566478C25C9A80B044160B86D3393DC64C43318D35538838EAA322D9DF115CC88EBEC4A2E053FA967BFEA97074D4BB1B2F422C686CCD1C9A130E1D69A56CBAFBB41700F70A7D7D643668069E0D92BE2C45374B5EE7813392AD19EE67DB35E60B6D61A76182ADFDA58B504B3D7A82A501288C35A94BEFAA55E7EC95FF822130E5F7B4FD13B8762B914D8DEF6CB1DADCFCC4046B1E071F51E063F14B56A7736C7946241DE853D012B0D844FA31F08A19B2823BEBBFB9EA0B2AE7B4DE9E5F03F0ABEC854766A58B3B136BB6988D11129F1CE81DAD77905C33109706D3CB737CD012FCEDAB97526A517366F9C21B0D7C375BAB4E8069A6A1ED4A1CAACC57ED0C310BCFD765684A76AA422F55EB1FC805A474623366C1CBEFC8A53C4A3320EDB5B5A73D0B5D26B64FD935A65831A705DF36701308FA195C1B09262C8C8279D803452A2B8967B8A926B7AB707D89556CF2F6FFD53F61F46B93602CAC0D2C8DC7E3FF0D040281E6E1AC5E91A911FFCD4E5287BD11412C972D47F4EA5E009A2430609D60CEA04C96A0D5273BFF126199B957F08DC31E042199DEF56BBF09B3ACC1CB6141FD719ADEF9FBFBA3050B0C0F12D8B66BBB83719F9E1AF9551FD713F5CB6516DC70888639F373835F13565E9ED8B292AC2C923D58ECB6AE9BEDAC179D718AEFD88302D14BDBD969D7FD847D993A591C14A8186273F10244E8CFA3BAB5167D8FE3C7951F9288EDD3924F4964177386B48580C5650C97DD3D71A5727AB344D574DF78310F7DDB807CC91687B4C0CC280A9F581B344D7D8E14891148B4663E601CDCEE32C851FDA00042F508A58D196133509D95AAE101B224ED2ED11B061829901C2F2A81E0575DBFDAB49431C96978A8A82FEC4E15B0E75AF5AE62E7B102E673F38EE6A0BE7AC7F8FA7971891BA7BCE5F17FED5AACA9849DBF74E79EAAA3616717561A9585705D01808E6571DAD34DA814216911AEAA28317358B1F26AD9459F277DCE6369319600C5E91681363748907D5DFA561184D4CAB62765B9FB2980A9A6C9A3227683FDF33FDDEC3863B6628942E949CA78B006A3C02480D3B4A53D419EDD2732C3835EE4FBC554F564E58575ACDEB4EA35FE3B5EDEA3E273989F095C0008FA19CE3B425DF22CBFCD8198A00C5EABA7022F2C9739E208B6D3FE0AFCE81FFEB8A37823088780C1AD3900850002D3A1D3A1CB9316BB74466C3A3CF9DB5A93AD6BA73390FFA57D047E7D800D0223B5D2A1D3237E63F95CE280720FE34A78FCC2C11E5271C4721BD07BC1B4B774E813A8462F9E1D8D738E4D3F91CDCD89A552A01B7FEF839F1D1444BB0C821A032A8203CF912BB7D7ACD6C1BF05F859C5B7E577370BE46647B8C9AE1F82F7BE4AD41674A3034A42707FA4DCD8ACDA6CAB89EFA7D1EF262BA1D798EA522E8D74B638AE5CEA81FCC82488EB6358C2A3F30DA8A5B744CB75006919C4044A0CCCC94FB5302AF558D820E9FB629C34A54AD80FC2A7A64833D8F2F550E9EB7099820FB2488C4C06C104700C687DB22FB0058F4C81029DA761AE822F0F01872A5F6FDB964191E4051656CDEF4348CFB80DEFC7CBB9C0323599DACA8099891BD2EAEB4253D794397B13A8847137A6D5F7B328D1DA9FA4BEA75EFF43D04EFC6660F3AE5B941FEFB8B637C647F826CCF6FE96238A2AEBAABA59328B09D2775D20A148FFFE79582547F016D9854EB476DCD3859EF15D674E50193B7858449CEBD88280BF57C8640A2AAF71EDA45E30756524704F0B401C1BEE6A0E3217B9445D296F85E3A2ECAC84455A185FB2636136CD05E7B20DB681B141451C53245EE18582324A71577E8A7E5011C83517B4E3EB559071676F18E042881F479C143114782BC83EF933D865CD3AB99019F40660545B9A7D04CDC9021E8EB166D036A69D5BDCF3DB79C874A608DCD87F96B3CD06F334855BC1B9129A11D0E0D61C143DBD185D3702CCF056633F0163399381F0189A80B59DCB5341854E8F1FFA636923817122ACB4D0A3F69ADD0784D01B0688ABB1C53CFC26A7DA6DB7FA8BD49B129F4343C938D26EF2174567E0497BBFE516B023B3E1C97D6B4EC2537F4398F8F1F1FF7691A780F1579E9E5DDBBE9B381579406B0BE8314405DD755B2BF4D57947E465E566CB4481DC4A61FCA429FAAD765A24EBC6C1ED73669EDADF8D8A28443669D993352DAC7DFE78A9AB27072FAE08625C5E4AFBF41FE33A0411404263C1838C9B2D8F9D6E09B448F7C5AC8D5A34BF5FCECB8DACB0EA90E73379BC73A3BB1F0B6984EE846A1A3FCBF852C73553387D464DB497D71104355455A0809EC8BD43E5AEC16A0F2627579D8497FD895C4759810216A3D9CA69351E7F0923656BB2A272C34F6530F2D611B8FA6BBFA12053E4C685D9F94D89133454D57ACFE391E75671743EFF98E305486A3A7EA50DE6C7FEEB28CAD6BE44DD0D993E7FD2C01B3C13BED7C3C176F75FFA4761DD18981442915554D1FAB3DA43EAE6FC80BF0AE8F71C498D4E3FF311FD14EA3CF87A98BF7DFE410E096EAF63FFC066B4418B50FD918AB862E5C1C16D2A03D82CECD6A634ABC4828ADF524804BD780B9EF9AEDB0B580CC6835E03FE2C4D1214584A43AF153A678B314A729E72C02D3CEA0670A19AEB666B8F24E73712FF214F041B38B5499782EA62BEDCA44299FAFEABE15938750B9F78FA8DF23EA2A394F9657A02D9EB351E10E3DDDD6DBB894CDDC20285144D1CD03986881DB1D78E05BF4F7D0E51D85EA4B5416383A09FA1D122B47C60A9A2F78444BE4D673EFEA336661E80AC99D3247094CB89CE8209010681F1F31C800FB674DFCF4B7D7C48BB94B50972C1B7BA5EA0C0202818587868081C021A0C5BEC63F49DFFA8852D3195545826DB9568769AD9AECA3C7CCFFECFE8EA2DA3DFC9F11A55EDDD7323A7044BEDF069717F4E82096E738D3D8A98960E0BAA911AB48560D3CA73AE5BA7A96D049E0CD6FF2132588ECD5C1C96257CB1D50C943A271DEAE9D72D2CFEF28D252065E06938FD6CFEC45BD71944240BE39D73E81EFE378DC783032569D785856427FEC85C50F155CEC5B639B1BFF48774864C468F891BC7DE0D29B115EB1EDA8CDA3C080402E173BCFA97060CF16754293EC7F77394F08A492098FACD03EFBF91EAC043E03BA76AAB1A9DD9D0458E66D9E7DA8B35E9BCA5DE2F19C2F2D15CA1A6B6F04723832A64574944D22CF2044DE23C70C7D48B9254F819CF7D4FF89F00B4ECD84258E1CE5A056AC154F79E951BB47FDFC90A548F0B57541D3BF36AE94D78F0D96FBF2561E1CFE060281A48E12ED578FF6D396BF155A82FFC0B1EFC3EA53F7A4BA86D4C39FE6BF4C6EE510E20755DF513A5F4D72DCB830C7A6D0F2CCC68C98C0EC3D434EFF1417B8E133838B7A2A2154C7F629364B1EFDEB622C1F725EB0E81CAD682E8064E61307FF168C8CB7525B2AF0F3836DFBF8A1F77FD3FC9B0DCEF6D42CC096A314E9CC99985F92B766051E0400268853D7AFA5BB5A9A18B33F971AA9212383CBB0F2AF924D392FDCF60C2A16D6C6D8368722944A5779FBD6292616464E6F54D581BF820F1FF55850D03001079AC222777C48B245199885CE9B8084AC60EBC4CF0DD39FEFBE5E876A57917490E887639C71940F4A0E45C525E1DD8BF00AAE0740BBF0A84111D5BECE5E5EDBF17B5645A864C8A2EE3E9AC036B1FE06E6FE3FA3581EAED69E1EA656BE3E9EDC6EA1F1008EE5E2EF28AA936F9AE2A35228480A23BA38B2EEE587C945F39DB6D9447C205CD2874ADB300431AC97322F2D303A8EA33787EE0588DE91389F4367D9EF2219A00EDDBF21DC4FE53DAD2C6C04DF0375CE892F6836539596C7FCCDE697CFAF35E5E49B236B5A980E0E7D116882E4DF5DCBAAC950506198A1A09C045FAD6363E1193473C090F7A32A4A1C6E7DDCD35DE0E9AAE54F2DCFE93ADD619ED2FEE4A94A2695939BC600DDDA3978142FF0BC426138DF540D3476D10F176DBAEAE05131848F21A8EFB3AA380FB6C2064E54981C446920323E0A3AFFA3690BD7358209F755CB40125AA4C5B3150D724F017D9B21045A20711BE3805BE8E6CB06ECAB89E48F67D238C43DE2CCAC7C5F6EFEEAB78CE73AAF6B5AE0DE3276CDAC78880326167218F5E30B0CFD0FA23396909DBF03B1247F52257E65B35D624B6B51E564538BCB36BD2271380050EE7D5D4C0E2CFB98BD40ACB5BE748BDDA29A32BC831A323E4C4080FCFA8CFF644194E0898AD06676D9095262E8A3AC9581DF69E56D2C1779D3576CDA02762683076BD29AB822E9E4A9F422B2EDDFF3A645EAA31AFEBC61D6044527DEBB742E58EDE3C605F8C613B6235A9FC7FC3D4376D59AE1BF782FCF759A8CF1694E027BCA8F20D156DCAA630C13D0660AAEE7D59846A3481ACE29B63F46563DECFF58E09AB7CC397BFB338AB1F1DF8DDE6F2447217B06F98F05F8508871490A2CF61FD0D2D3A23C968EFD165B9807FDBD2ABDEC0FD9D83A210ED2F0D5FA84F45B1340A0BD1FE0200EFA87B2487935098816835EB9206525BFDD0FA426FBA38A470B7342F6040797BB6873C95D49626B9DFE577473C4BCFE0BC634D491662ACF0A2DBD32924D4312A4197E8ECA7A3A8F672F2C94D58E0BC03B4FE3BDE33756A38D43EC796E5AD8EC805A80DCEEEF390E2BBA79E7F340D9A46B54170406AB850B4B30C994C7D4C9BC369D802453689D65C2E854E1BADB3B13D88BDBEEDEC37A99A2EEC58DFF1B7035C15C93AC36C9411516F1850C8E4A4FBB3CA534884713C190E1D63358073A01C3DA10BB68BA12BB848D5D81EC00C7B098954F5AEF17DA8B951E1CCFFEC4EF8721DBC2A27816E1EF452CBB432DF56234ADA0824776FDF4096B59DEEDF0AF4B01403AA32084559B9BE4EB146D1D13ACE4B637069771643D724D5F0866A68800C4043426F183022C6B129925FEE338018EAA0C29C4D682F8C0CDA4D0EE84E95E7600C846F7903D8A3494874D5A803518941E5877242E0AC8F391573AF245837AC5ADAB908B5BCC76C2B98ECF1207E7B120C05614020F19F2C89921F92303F438AB83BF32C629DBB5587101BBE92EAFD1E533051250534410727A52F8685D53A8209310E3293A1FFFF3766D77394AB3AD4203039ED1DC670284DAF28507F33740535D323D64F72359D1710CDFD9E3D817480B90E78BBBE02EA838C8438E2D5F01A4454BDDC4FDEF12D94DCF5BC5EB9F28DE52E5D591141BBE68E8BA6D2F3BA03D4FD01FA034FADB6B968F96C8053D285C8FEEAC436F562C887A03A323945A331F99788E70BEA93EAD499ADF96BFCFC5AEB41D04F3511A87A51B0C97E61910907B118354D8A13539E75F667FC74906E6F2FDE107F7532FC1EC66348A64533D847DF600A93317D8CC2ADF49BFB4C4796F585B5796667937102E60797659E36AFCE25E0A9FA7BDAB137615F69F332321AC380D6EE0C3336A4C7D166DC433C1B56D0AC3CEE4023B2D0C72F00E0760BD4F0BC84C21444CFF10A32262DBF3BE2798ABE137A14470E2D9300569ED655BF0C986C7405B8B4EAFECD16134B423D26D61E5D80029A0805CDF7B4AEF502636084D0983B68C249F39F33827BCB8923B1778B3E745E501D8E948D45AA864AD500625EFC7E139A1574A426D4862B6B9A068CA0EFF08ECEFBFCEB9EBF9BCCC55734F032518C8AFEF492353794286D8DA313DDE9B4AD7D2CF89C60A205513A77FB7CFC69AA2B71F00B3D689DB3446FF59D5293D914FA48E14837EBEDA1D2275364BBA5FDA033B5C4071462E9CDE2417D8E72C83113C3DEBE8B08B5638C386D1D96B755C5C7D0E12927CDAEA0F159B9BCCF04AE0EBF84D202FDBAD532AA3333C7A93F2C8C797F7F25E8B401D73363389AB93AFC101222784D6C1F69BBF5AF8C33D845A785036AD377EED8F9FFBC4BC81E180E9FEECF00EC2DDF82B3342CD1BF9966AF2D59B533BBFF3AF125DB70B5580B5A919C7C8DB3DBC01F8FDD6D7D04E34A789E704FD4F0A32D725F21C5C0148A7749B7B74A6B55FE2CADB33B9163B7F6A36DE8F48601F449F53674F00CC717AF870AC3A2E0413915A3BE40DA9A2F1AE8BF2CB3D204CC018CEDE7A41FC1A40CA59B0B14EE61D292ECA8DCD882E315F9D85A6483EB6A8E5193867D1A661CA51513009E5D8C569E0ABA04BDF43F870E3D7A120A254174D1DF0BDA5F14ABB4BF78AF1472FF7E58247A03C9B12F36E8FCAEFD768006780DF17E5DE98CFD661854FA51AE8523E44FCD18B85CC2BD5A41367F80ADFFD2D6FA1806343E1A0F57B43C305E49A8353332B73C2B2C6ADBCC32AB71C767BFE941683D85BFC394FB1F16B17D16B3608FE0D83C4982726515453774109D018A6C61CE2D95C56697A62121E2DD14C9E86DBD3872CAB6D7B5A5BA13D31D9568F04E43F1DEC81ADB0C51B8CE68225EF65A25DA558BF9E9FB6FF3A2F0EADB99C528BEDBD48888468F78F27E864A2EAE934BA189564FC5DEFC19F0B5F8BF5F89B1671BEE63CAABB3E9260033D1F80BBFD70C0DEB1EDACE63314B401EA635A16A88602C1E17CAEA576CD5631BACEDA72F8704E5ADA40958B88C14046249B91F9670BA098512305765E6A4543249A79483C73EDAFA2A09AB2CB1EAA05F31C7DD8EC247E372B2C2ACBB43A9049F853B1ECFAAD2A1E62E5C3DEAC8F38BCF35132192233D3397BE41FF7FDDEAC93AC7C90180D552EB8CD6A1E4EC78C304FD35685545ED414AB22DC24E4C70CC9FEC460DC59A763A9F956ADCC29FF99F64AB450610D6EFC0A89B499385EBA6B80397C9A135F15CC5D4A511907FF2315356C4BF739C902512B2711EE6D4DB6FF027CE295B684F4522D54D77B8D33A22AF3B3B8C721052B7616716AF7B6FF5E0378B2B24CDC176D6A0164A4CC046F26B69695ACE64FCF70FF5100AC214EDF6EBCD7845F853D6969E664C84101AB153905A9B7D2222C233E09EBDDA644A9C3E7EC767E56D49938348998452DD79246C3EBC6F13C37709FC3D86D78F8091C8B780B866B3E6A92E7115FECDE542C068E38891CBD1A6A951E7CBFF757ED5E01498C3C50662BB5D7E598D5369678F5745D569F881C80EEC2B6EEF98C7B7EB0FB9DDB358BE0238B74526D51142A6D55FA4354DC878F4AAC57745FC6782B4B361D0FF24D1E176D0FE74F177BC879F3CE3062101773CD26C7661EDE2E344D4F457F89D50E5438CEBB4002A3429A71E54A64F5E70587B702B2A4F23DE4469C81C71D90BB2B5A1049FADC123BAE558E59BA3A158F0AA344E63D5E5B520C38286100EA3290FAAC0ECC12449C32002A40D41CCF4BF6D69D57E7F8E5515B5ABEB4C915EE96E31F22A9F7D09351E122DA8338370B600F0D1A38CC5CD0FE02278619D4087ED78344A45CFB6E791EF83163C0BF02D45F77D3A749E88F828A1DC71FB97E2A024A335F33D877B7B436597102CD83B4E78A17969CDC1924FDBCCDF7E170D8CD068312A2672251C65D1B33FC536341A05A7BDF6050B514F1E7BEAEDACD4A803D0DEEDCED548DBCD0D5B38DD354FD9BE57CDB8CAA311F04472A614C6A684318E6D602D10F433583502621405F3B0078AA44C1ECDE8FAA708AD2DFB10B9A9AB8C48F9E55DCE8833EF3AACF540E204AF1A04028140A039283A0E3A6899009067FED505DD1CE97351BD9A4DC6A16DD9B6F7772370A8940747E94B07912794A798D219D4ECEAF960802C1EAF1F667991FE01928C24F4167D6E57665994C188AFCDCEE5A2DE4657CD1AC2BA4786DCF9B35C46875D19F4973BEBD54107D4BDED01CA156FFF547F6F1E5C2D928CCD0F1A3AC3687A0C34031509ED644F81BA3D062444BF068235860A6363AC3C056A4934F2BA6F40DEBC924C47E55C4FD08F8868F363F4BE1F4F7C3C5F5914B855DEA099D0A0C80705888802B84F6B2FCC8EDCFA9F921392714767D90E33C9338286B60CAC49A1906588D6EF48B47E657C77FDA0FA09D199650133A1EB00DF8702EBCF1D492D236DFCA68362EE0D03783C19FF1CA73644A510EF005A5FDD9A15030B5B450BF79C7EDCFD4FC1B974D4070CE15245955BD1B83BFCF9A2F76AFB40F0862C4358535E5A6F4975CA28DF2310CACCB73DFB778F7C0A32CC8C89CFF4CD7837F83761B5CB0CC6E7E6FCB72223B9D12A0BFCE864115474BF14F62B7F41B22266632E210536448CE8E45EE9E8F6DE606CB2D28AE913067D8715F4EE02BE1F847F4ECBF3BFA88F58BE25D8A8FA628F708504DDB9DA04DD4660AB27B95FAB934533BFC0C64906788C9A66C2070F6BFB901125649B39F52A75BBFA09ECEC933DB2FF1C54928D3ACE404011D50B7496626311F11B3DD8C491BD1501DA9F737F1C4E651D87F83B2B8AC2854A7CEC2474BB1F9E46F8D257740A2C807DCBFC776198876AAD79C46FEE1553A1158873B739BC90E68EEB1EA20FD116853628121034E4190A2FA2B42EBC3C2C0A1EE9AA371275E93163002CD122F7AF43B1187FA3FA865EB0DB20A5A54A1DE9401CC39EACAC3125749BF9A07B47BB632EBEE2FE439BF5D3C043E610ADDA2A4266A0D211947353093AB7A0A8CF3081FB2037A85F09ACD52FD84A5B472600A126DBE4132A45C17F757F1D3764180B895E30A01ABBE6E148AB1A13B4B940F4E525F6EDB0A2191D2FD055D2CD79914AEA5E7C0A10725984FB71D6E76A58E2B73ECD5BEC3E830C7B392336B3CBE8F5B413896B13627E987191BDFCF19E100368160E3F4443298A60A2FD9E40301DDF81D3FED5F1898DC924A46D9FC9599FAD045085AC5887591782F66E4A7F040D59098AD7CBBC144282749835AE2B3BEB58AE133E32C13B06201CC7641C40358640765C24C7F6A71D08871577220E0945C0A124BF9CFA1410A4AACE505311472CDAC823FDF96A03208A03270AAB72D8A5274991F3F332C5F106116A83056D9029505925A960C4B25650156F8A597341DCD0C892AE51D70BA406732072F7839DBE3BFE13DB347C75F8F6E2966E85C2360EE1F2B1A29C4A798055583FD7A3D59002205EA0A1A4A2FDFBA3D29DE39B31E7D31CC2CB76EF55CA6497986DF79AF59FEFC566D8F294500C1316DADFA593E5BB436F1820C640D086D1EF9D449A5E8B7C27B08EF39668B3EFDEE3B1DDA37A336EF3B5BB0370F8BE7266D36249203613B43EF9A7D2EC9AC0119991C6FA8DAD807C62B66DEC25F87921BED0CF104F2C13057A80E2C9F66EF89E184FB384CD2888FAB88A827A80C3CCA356C26614DCB113F973FC23FCF799C21D088AC12DC9F5C4E43B791EE5AE47234CF63209845984896F80549954360B310DE9D51881D594CC63AEE344EA54C334D6E1CFBB4FA784822B94AE08A0F215EE6B1943039FD7D703C483D94466AB285D21FBBD1C112DB8C42CBEA8D3CC783E1699402946007FD0FD749413793FB851DEADE8D849F17FBA36FB5B4F090B734A71323E0947441B580854FD923E4224F98EEDC4F1478AC2CD3F430CBB768D413D2F34CB460C08A0647CA07074E09ABD11F2325FA06CFC839B344A5A5925C04E4475C5AF413608267337D7609D6C340750421F814546D5BCB5FDBA45B75B7279F109BFDCB55C1241B88495DC7028D932BD5286BB68BCA41B0F17609FBFAC27C2F16F4763E9A591CCC6F4AC29C0C277FFD7D5CF6FCB8DD6C71289DFE110C1A60B936A710A7F4F06361BB0FE12DE3F786721902770EBC179457C063E0119C6CCFCF73393081C6E77627FD48C974ECE611E7A9C3B62E6D42D43750C6FDB2B8EC3F5C14201087A9D7434890BF97B37B3829C657259FDDCDE3B3FE6A331CA1BF6DBBFAE5C27B7A13783A09FD1EB22210C46517074A8A028B0665B3A414D810035F5E1B05FFE9B59E64CA086544BC2160927B7FFCEDED0D290DCB4BAF8E6104DD73A306B929872D900BF3CF91E42AA9FD35A3E5730FC071EFEB1C905776006D46F22D3B34C09E1161703210E18B8E14AD323BB1F377F227C7E676BBE353D3406139DDF1F5BD92F4D1D73016E5D3B7F37A37A489874E776327FF9E80267E55ECC95B24FACDFFE71C6A077D901EB53B0E612772536D3891AA89512D68CE2AAE27B4EAA1FC4C31E7202EF13C1F0C0DB66D05FEAD3940EE56D69DEAE6E4235468E0436B162C7E379E81152DAC40B23006B19864E6DB1E4FB6EABF01F06DF72D8D95051220BE30E3E61ED8DBDB55F4BC2C08F512646C9B9C5347B5887894F993FB559CD168F581E5C5DAFA506FCFC68455BC0DBAB1DD9CE75D19711C1C932BD74DD44640313492D8900C6EBA397CDDAC29732FC5FEAE6E822888CEB6BF5E31E221B0B54DECC249FBCA5B4A3D93A0AE971D1D88774B501ACD391B57F3C09BE3085A620F2FCB1FCFCFEBF273CEDF270CFA0FF32CEA9B7D71D88FBFD1E713FA0A27DC66EEFF0E348A41873F7F76F8BD108F18E3BDA3A51E44244C0999F6D0B01297648818CE00B41C4040752C821254F0573452242D4772564F19F808FB6F2305DCF264D68CD87B1B4646B0D1B6ACE97D85AF6FD6129DDE09542220CA0402C16DD77D5C4414A9B6C35CF87A7C43622A049AB2484170E310ACDB6BC770BF05CDD6EDB83DEBBDC6EE580C9778C547077AE29EEB477E39BD398C4EF2F1C62034ECEB7E08B4A69F469FFB4044807710FF2D5116547A7CBE8E1E28D9F4420A70700AA4394624FB941983FD1FE25C93864AEB2C856EA52AA041E90849C6C5B7ABE7E034EA3BAA66B7067667507FF24DC56B5215B94854FB6588A3EF0E60C626374C9160184AF68575A4981B1ECDEC17FD996FD6A48BE9AE06A71FED1ED3184C55C109C4506B8438D14D76BD67DAA524A29505AC7E0F163CA3541F17F7EEF9B0DD3749CE9ED01D82412A21697EAC6BE77FE740A5934F3311652993D7FBC7FF671D25916AFA68A014C95194423B460E5E18E4A95CAF00F7F700D82E3288E1FAB7FE77A0B7D02D319B02A967F1E77793BDAAD8684819AFB496646926A88873191BD16B26C55AC071800A3830DC30A01CECD668CE681A855326E8139A43E2C9F8BEFF1CAD4FFD094E461C34020100804C29D341C585EB0A9743BFAD0B682A32FCF5A2090E1213EE7898946D7CF9ADE0DA3C8F8BEB030E8BD052113BE39804FBE90932BD119E4E40CD2A2BACE41A0B6749E14AB132CA8F1EE420AE1B4D23ABC2EEEA6DB6CB23483DAE6A06FA8A1200618C9CF5B6D5727F476A6ED30777456A97F16C406410C1BF62AD604931C9768A7019244DC8F3FAEAF413183122EC675761D5ED0F6FFF8D94727166CD6F045A5FED9BEEEA768EA05460E47F767FCB6E534B1FDAD8804AD31BFAEF5D44BF45699E78A179EF5082068CCB1CC880B5AC1A438EDB201D8960E62F666AEDEBA2742B559A675229F4B3C7BC4AC1B8F9B0CDE2E88293703E967395F594B034F0A7B278B48F1111689E0F29A7B51D5A588F960F137F64AD414E3252282052EC22F2AB904B0D3C3C67F61805D86EACB896344D402D3203C46FB69EFC78DF8F0AF69550A5F99DDE3EEAAFF7F3F5F24BA6141F347808001C43BC903AB8C4090D3D0CAC6E2A2CABC7702EAE55EDC9F6068E19B657ADBD53A40EDBBEB4D8116EF97A8F0A22C9C2F6B7F4D6F7B91418B3EBEEC03FA296665FB6B6D608D97AEEFAD0CBDA1183050DC608C9189E0651A00CE7BEBE55EA2E5BB49CE199985BD1B02FD83AF115CD92A3B0DC21794E75ADE241E042CDAB13A536BDD9D4FE72D09770AFA2EF38780417DC08CFC5A421B72F2492CC8F6FCB890F49179225054D1538B62C7B06FA1A10D36009F2EE419D62BA2B44E2FE1AA57AC7C968CF27D7D15D6060B1D3927FA091CB710D2F022C23903F2B5CCA00B084675A2F0E6335A7BE09862DB5133A20FDF159DD543E03EB6F62B8F03EF5F51C4170A5D0E2AC46EB837ECA99F91BEA0EC2FD406CDC2A2C8A6337E3D91F634B86F4E8383C585B9D073EE44391966E889B966BD114D2133F3F97D5289AB13FBFD9C0C4BF1AA430E0A23200F74C2EDA14E8E610CEF31E41B1058B15729C980F854FA449E0F0433FB569E0C0AC0E30834AB8AA41EE0E817F86B990E7D4B5E4681369E0E6E45360A9EC575562DB2EB3052EE0D03767582D76C6F6C3CBC707B51FAFEF8A4B53D6FA304F0424DF5530DA813546723036C1D0D693FF07F514A364654239B05FD767859C817523714BCD36E970F8126FFD9066D5A002B85A368DDE54D1CFCF4244F7E31DD2E68E7653C0863FB48A7EFE25EC07EE57ED20D89B32EFEA3BE800DF8EF9675371E0FFA5E7D69CA9F93CACE2C9B89BD9574BB241AD17C49A92372E75D7B8A54D1AAE2778530E09804960B279824DD1A1DA77B7E0FF4D9D1F30FD54D8921D2E61B4539C259FC082047FE5D9AD185BBCB97941B5466F2B818C5E66D488EF50BC65344A17B7B586E875320BB8F7A866C245DF84468E6D16046985BD0AF3520126719D3B78AE2AD5BEDC3929457E6BE3C613EB2BF7B872575756CD87A64560750729DB0FC345AFC4161F9B98963A51C5B11381CB444ECE802495B52554BD0A1F68EDD0AFE6A70A37AD8DB1F97E147CEED88845EBF7D7341387DCE0689123543A3EA654B7C99DA81C81D0FE0305A412CC3BD1B089FFE3FBE3A3F1D8781D694DA518E33D0862CD42168D7E38E6509307DD0E8EC073FF405DEBF480F30F8C0C38852474D2746EDE0C91217039A4D4A85C3ABE80B4E2E4F197F46A59AFF7EDC68A1A3BFEBDB3AFFC0BBD1E6BD84A5060ECE1F01B57091769E23C8D72B7099ABB18017830609115084E7DC29B38A21432C182A103582846F1CB3755DB941C78C8D765FBB9D53940F9084127DE429E2F436984588FEF21D53FC25AC16C18504A47262C9A961E55024C2A1EEE5D270E3CF7886420E2AC16926D050522594F65090612CF8DD11CFBCE57B4616C068E1684CF60BEF1A96237328AFCEF700F3A0FB10D95376F5B09EAF25010109FD12BE103E17EC28FFEE988F1D1A3E9D89B6D1D8DDEBA80D5FCC1A8069A3356B6EFD9D337A0E184559250B1B732EA358A10E0C4F40A8AD33E6DF3F4CA0C7E0637E8086DE2E682A2E4E606ECA43A36BF63E3A932D8F1DC96395E7379B58E28E02586EBA617436559432DCD0762D4C163085496E54C17ECFCFCD7308C275B700CFDB2A9D2EA8674C838C6E4D2FA489FF4102F4ADD1EC74BB3EA85DF2C503F5A4FC935FA3D080AC4C613E74774A9EBFBE013B000C2CC68ED55BB0F1CD65F809ECF31BB3C602AB4C6B6E6FD9A344B657CBDA56441BB23108FA19592F12C2601C0547870A8A023B110DC8A89820A3616293BFA3942D991DF065E9A0E6325A819EFC129BDD68396C07C942EC89CC905751DC8C6102B93A108802992890036BB8BC386161A51DC8649DC96F358403F9F1497222C0717800B682987927EBD3743200C7F8ED194C0CC300BB7280AE0C3061129EF9DF131A0EE11A986380A30E551786F6EF5F5EF626AFB9A5F8613FF72E0FFE42CDE1A29E76F3749E31DE210AABF7BF3518902773C16E53FEDEE1356106B783F4D14A8ED4C45ABAF435A3BC8D146F9803B6CE52549309345815D05FE36DEBE5B78CEDC6907EBD9C911FCD8F99857A468192CF5CAA43582D74696964486B0209E39F8E83CB43C7A4E8A88628A8DAC1C7BAB5098620EB990BD83A8EC35A576145327A8CD4FA395B8FB795DD656AB66F2CE0B0C8525929EFE1F86FC891D48D3F9822EF10F29812CC07959527951EEC910F29D18990A52F066BE50BFED88C3D3F4BA6A53455D161B73B2211FB80DFE316345A758C0B121AFBAFDAEBF9AB3B151D06840CAA0C061FECA8399A99244444CE1AA586485FAB253A76836E8F1EA468BED3B1709D90696FC56B2CAB8957A51B09945E30B0E0AA18B920F0FCBB088BF0C6495A56B8049BE0EB39C11BD33F0633BB549B1A2C80A76C1AC0FF5E4623EEBB3ED4924CED0D3EA3097A1BFA14A80FDD3FAECAFD206943C83F3FAE8C90D5401E0F30A092ACE8F58321DC664E9981EA1A81DA8CF64C7A215FE30E2C5C18C5C0AC8393541E27856954781E12420CAE2B8A8FCD894ED171C93A065DC4002EB6E91AC2F60DA6F5EF42FD99C7AC9446E9D94126B18321A8060A92BE5E75F5958D576ADA721DF56074DE28AD5C20B5101399F43B1FC62814369DD84F1A4AF365460FB63804AE6C93C75D828ED1389A6DBA2FDA8AD2BD220739C1FE04FCB37158B0B08563FB8FA7D8335463D562BE19240824BE7420F2B2E90E0BB2F353F5D2B67DF83AFD5BA775BFF4664341BE96FF6373B0722F8A193E9CC2E2113332F91C5C1F9AA40F15E62DC8E73C352F5F4FF64983E3D3407885E83540A977DE9C102D7B9441EF98067F46A2DF43CD60740F482F1830A4B0E95216C6444189CF48313E59FCAD921E68196C963094CDDC67CACF8A560F04A038B136A221040BC670A91DF454ECE92BCE84E9EE1B17FFC8C8B13E3740FD7095AB25E4583DC8C471BBB0CA362C514D2D1F9EC9BF369C8FF66B731DB1FD4423C859772FD6AA4650483C2FE9ECE49B509F781DB901213D2A170EEBEAB43C27FF37FB1B1F7D8A1AA2BA98CF1B9C9BB3B5DC40DEE0F93C60DA106E405C04341C47726F8AB3BDCD8517AF6F4B39C7F1B4548E3EADDB453DB4815F9801BE5F2702A6D57250FB0F741B5086257409A2CE807884F9E58927320F2665278B266D581B382AB345CC063403C5FA40CF6218CCC2763A4898A0110D75B1AF840B56DAB8A9844C512A1CE3F7099AF208169C9EB9647789F69DFF482C7A082C860463E1F589E0CFBBB3ED3B84C7C0B3D4C796110118AB3D83186A0A03A12603464D0AAF7E13D07EDF7668EC83137C90C95F7AE6A942955F160F4F9AA167C5F9367FE8406A801C948D814F819D6A12E38C9FF143354DCE9B1BAA260C18C3F3E246090529030145D8E9D09F831609F6E4A9126C9B11C42533C638FE13E1709F53ACF61151DF3D54537B2C56ABE3E6510AF6A91B2C606FBA10F30FEA99CD62002AFD7CEC5B38F38738A05D7CA7124F9EF1EF76F311169883F0BA348626F3538A83D8DFF5E1C7481BA55694E209706C6AAFD0CE8260048FCAA52A271A56CE7242CC468119FEFF79585FCCFF28AAEDB15BA881EF4253AB9896DBA1CE14DDB3F937628B48E9BFB7CCA45890E70CBFEC0286184CAF97779C1222A16A292DBD3D8E087779FA69F28DD435626E7F18DD1ECAB10C0C3931973ED915FCDC9A4B51B0B6C2ECBFD28048D8B47A6F497C19AD511E67DF6004A7CA123923D119CC176F66086B04C28130B95E0008D55E30E0D4E36020303D1ACD396BC2D394C0B42BF31F41CC973746C814F0EE3055FA2E0F10F38E617F50D864B4F393D5DC719EF7B5E4FD803B9DBAFA3A150CC78D9EED9DDF06CE02418140201008049A87863C4D47949675591F48C1EC1E8A5399A6FC941622EE7A9810A7F51E16FF87469DC452E27EB6230C85F6ED4C77E5621DD744F2CA33F6BA33343732FAB396060BD59C569498C1DB64D286F1BEF463F316A3BC781E6337B27A747AA73C5C62BA607DCD70EA4C80080B8D668F2F0EADF88762D7BA39DA2CA97A9233C047F19085901A4B68347CF061941987976958689BCD2A1C372333A849AD41D0B4D1E2FA13B736B6ACC7AAC28245B5CC8B6E043A7C90617CCBD9B7FF49831538E5878688D2B96BD202434B34101F432EE6E29E76A9B1BF4762EBFA9971738FA314B3FEB4D700CFF4F34D21B30930990E885FEC13FBB8A239AE2C36494440FEF62D9E873CF140F3C47F7AB428F4B40DF518040502814020A7AE1A3F4C00B2E52DC856B7D8E4EF2885B147EF715CDF6BD8A7F26F36E623A865407B8B1ECA4993818F82C82FB7C2C2287C1A47C581355C5E8CB0836A05340045CD80D99464603603F2E393E444183258076C0531F34E56C1721A008EF1DB339818860376E5005D19406200B319E0CA7297861D620922E618E0A843D585A3E3234A297379AE1811053A4686C88EB051D3BF0E40A13ED8962EE864D1EE3E7AEF0268B785C85696FFDC647A1BD099DBA439A12AD02243285CDEE569C4B57F78A45AC0AE55F814AE112842CF0500FAB1C0476C2DA1B006D233680174A2396BBF863A9CC67D9310EE69890B8E15C1B4FF30E39473038B40BB239E65444CD066F032D315B6DAFBC1E32006BD5CFB0F6A70D28608C955A1CF498AD8BC720250C4C89166B9BC16B6B41210FFEFDE5E4124F2D82724A34E8A1E66FF6B05BD53AB0D4A52C75087FE1D99296892E2481DDA61EC0A60E02D737563E98FAECA707968245953DEE79F2B9BCBC4B340F85AC32FA64058FE318018579D3362D44BE7506CB08AB1538DC4F63BA83BCFD0EBCE4CFAAAF50DC9001B7607128DC486C37F1E2C792E8C81130A0F10557E43D2E424D096D7C65FDE65F13AC937B612FAFD6F415568665A02A7F96FE2E47647FC3218C280A657AAE9A476AAC8C619020812A17FC54454502742E98B9976EF23DD315FE33180887C68891F43D315E5D4FB42610A0B9EA17FF76B5073A9ED5516273961DF177AA6893267BF0ED3D84D556C5CD53988F95611909482CF8E9DD2445FED9B0CFF2A4DEE92EF4424FCDB61DF5A9DF23F5C9E61A9D60A3BAA6956B70A8B8A664699590342DEC87164C2687E40DFD4583DAC08D0C4C8B314717D2D8F65CE2EC456C34DD0C1BD6E35C94D6636908B2A202F6DFE37A6D20BF874CF9FE71008B977234451CE96DB6B8228F2FFED83F0C60D228C57341443D82A344C379E55E401F46319023D68FE34C03996278C3743BC0F4DF8ADD7184099BD591ED5259FBC45EF6D84AD6CC5A75185576121BE0814B6A9C277702B500458D9F832EAB7D6878DB0887873A43D92DD592CDEFB09B5B4992C955F7D7D3C486D83120141814020100804C505FD0CC5160116888279D8034522E70F66ACB9108247269690FDBBB6523B5A9CDD627BADE1C3DA2083E94A71B7423381031114BDAF1C5495A8A47BD32A567E1B1A6CCA6A23CB22C28A7D56BD5B2A923A73A775AA9F6160E048D54DB6D7A86E156267141EA91BAA3BA61F19DFA50D2DBB7F60C5114ED5EA85153BC20BFDA33F34B255D571DBAE397C5A11DD78541056B162EA31AFFFAB250399E0FD0066C61E60433EB084A72499604DC54DAE20C1E6CD33AABA2F61F324639520055AD83177B24C06D2D206F9FFF71441F2166D23921C34A87CE58D2E510EC1576EECB65383F0AE2BE18EA11EB122CCB7844890ADB61EC682F7057E4560F87D291996A8ADCE39F2D8B46C21B00C08ED46134650FF803878F57C734974E249876111F58C208B249CF3537BCA5B606C83908277210C26F8C70084407C5B78A8C60AC8CEA0E6E87F4CC3186C1C390B7B5FEFFE4BADC03E17094AB12559AB3B69F2F006D8DB81341E40871D942BE11E2BA2E96BBF0DA517779EB3329BF71F5A45F7E45E7317D949DA97B648EE0372C25108077E9AD8E11C6CA862B43A76DFF6E0ED55171CFA843BB73D91B251C4955CED4F22946ABA2D01A92369AADFA9AFEAE9D40E0235E507DF5EC9BBE036518E01DC0CF8BA6DB18D4A9AED1D9D7519F2DB7BC2151DDDE57C7B1011466B4BAE4C24563A0A1632EE1CDFF4C7CD751359A0FC4251C4BD12F13BC84BE4B7D0FFEC97C47DFF464C37066CEC9E5B6C66DBE3267292DDBB4745193CB55ED285C3A19FB6B4A43C6517FDD3670586B77FCC2203C878C1897B4DCD55FB12E7AE0A7E4B29845822B4CB03C9F83EED444CF4FC98C3B9C5D3BC5DDD6CDEF09B09C83D5646600D68E0213C9C6D5A3DCCA20FF6D2972B74C02786DFEACBF32E28AC370C48C4E7D71F8511FEC45C2B988E54E24D68CBAF2E22E5780DFB24757828BE9AB1030C16E6B893B320464B66AEB1EFD6258A2B814E3235E483DF3FFEF4DA7D1082DFDAC09A91E830A56C9A636452D5B9883D5DAE03AE90D57BFF795B9C476DE9D82591228461FE73F041EA124AB44D29CE49B5499215AECAE6701B35759FE8D1CDCEC754CA6D7DB047F4FE79F9E271A5F7878A9891277279B5189DF4AE7369A450D35D995D644B40EDB77C1608ED9797BD42E7081302B0FF28FA3E5F681E69F9E9BFBC804D43FBCD1C8E3698E4CE01C788306DB16F4CC60A0914F56B0D9D0BCE0023F570EE3F4F759F0B742C05D4D628AC0711EF9B30C9C4A0040372211DB6664809FF15773AE7AB61FA8B8F1186CA0C5DBDCFCBBFC06EE30A5D8602123A6476652DC892E15A4C2E34DF707C7338C2DF605ACF2A498384747D1793A1DBA07140D0CFD0E89110C59F51300F7B20D5144FAACD600181926C923AC4BD8DBA4773D3FBB59E5B232C22FF731D12FA8F7E0E36ABBA7FA9876E8AA13CE25714A65860300C3414021C3CC44FC248713303C7F857ACAB2D93EDC004DCF56C7F21E33BC976C566B179B62B8FAB7AB35D8F13255EE386CB9B6313B33BEA7370B351B1F8525719D329C1B6012FFE7B62C3FD2394076BFF28BDCE6065F119588F0D6290B38A0B7674D5798E0405897042A8525632FED1312CFFAB67E055082A95866750F24764AC928A9FFCEC487AD824F87B8F2AF453D673AB7B3D663D737DD8E69BA36BF178E2195175F639970D49BFD57778DC4C968B012C8AA1EAED4CD9A8D072A6AEBC3F4B2AA5977E20100884CFF1708E1F4B6516244979DEB148D91867D2DBC798B02E998E7EEC02F8D477ECBBCF3664D309544FFEDA387F4E6F9F11E7419EA942D2081B1F5BA2884E8E217B61F36E0869353B3AA029E08D83FE628BAC3488FD1B7CB36CE9A16EFA5F05EF00A10D33C6793F9E7A50D5E715552DF4ED8C5BF6317C51017493489DA163D4E3871503AE513140C12D9A023E67445F2CFF2FE2C749078ACDB63EB9C656F67B84DFF225A6A51ADE805924F183664F94C370AF1477990B57E4CA3580C911D0F090ECEC7C1878DF3EDC06450182028140209441F21E85B966F5AEBC7B1492D636905D0E6261A08C1499DF8EFFAA1A3760F6C83AD619F0774F306FBB783CAB82562C90A1CCC248FAD61BD1AF61B974763AD117465D4FCA61676869485FCD37DE11D3CA43011D8F7302A703436721F4587DC0801C4EC69E31E1C6E9F5E2660D03DD6ECCED140DCA56ECE688C35590E378D42CBB360BDA9460B5D24D98052F7EE81CCDCCD5EE05A6F6AF5E43BA5AEBB92660FC73D7B798EF621F81FCE4F6044D63D0BE9ED7EE34FF0E06483323E92F76F75735E17ED7E034A25C5BD0056F9822A0FD25A2CDFF79197BFD3722BD58EC66AB88277AA5617F6C04C6FDC1725DC14D736620E438A9D218096B87499420B2EE637EE0D971F487B50E628BC1EC891C9DB7CB864E385150A5F94371C44FD7D08D639EE55386B5D94488343BF49C0F07DEBDFDCBB93AF62A74FD3EB427230E0761C0C70BE7CFB74B6E39D80530421044D49FE4C745530E375A5E48049457C2E6111240EA87369594B439C753E2ECA1888368E7472AE291D65596D5C07FDCFDCF50BF58572C9A8E456C7A01802DA795F9399950788368C7C663B3604C1E63CF61A204E1F2BB239E390288086BA61083C338FF8F5A3DDBD830B820D71758C48B6CA71B45F471873CD43306A065FB903D86EDFFA1A92508A4EC427A1D169AB8A40BC6A25836B82777CE962E8D70BB1E1DFA94756FBE3152752562DE0A20DA346DE927BBD2C57175472109DC10BBED5C0B064D419CEE28E7C9DEEF0D63A59FF34916202DA5EDA36A247F3E596C9235B78DF33089B9F9CA041BAF8508EE7E9BFFE2EB0F4427086199772337F73034C1F1A37A311EBA6ACD8CA13295CCDF6E001D14F68BEEE466BEB07FB4325499B51A093020B236864B78077396B00C433FF9AABDF5CFB1DF42DBF18F9120CD8B53C7E3891F11BC49BB10EA2C42FEA3897630F97BBC83C4191A3BDDC6FD2F33DA4741FFABD90FF810A916CB5DA8BA9DA7639CC647BF27F1DCC52A6F0C05D1C0C175D893238EC7C667303EF5F5A878406789D81AD4A6D7C3716B1D167AAC32318097158EFAF8D71C37F80F576BE7A53F84F4807CEC97DC6CA6C204E956C3EA57394DE62896998D8ACDBDD081E85EA5EE527EE66CD79CABE0B450762A84E44DEF17CBDF743547CD063284C2ACAD803F3AFF8FE1FEE525A437279BF84CB1030A7597D5DB78987A759A9AF35B40F5DB5C200982577CCF36B0269A1E7E8341AD266071D0239C10149B78D25086D90663B0AE3228810A5735DC178848E0B6B64772E43E41499688C809C14B0042D6D6819EB238D615D32FBAA38E59582049AAB79C856876B47A640621C3C8CB656FAF94504C51083E00A7F3DD84C93690BF31F0E1CF14A2EA71DCE69AF0FD4B2FE201375BE89FA7FA2857C10E153BFB2C26EB406328254FFC179D714449E344E40201E95B2182625D8E5C9764C16D86D75BCFF700711B349B72596F5DC4BCDE8205024D1A5FA34F20150235B24DDE3FBF7493D5CC19337D5F999E4434A18E2230CBFB5327F2CB446F88ACB8A3D164927E9C9B6F6C72796E0E3B5B3C133F180A7E474B2053D1A56559B04C75FA6D2CCEF11CB4C6D9635ABD3158AACEA33C557D67FFC38D8514CF9C85C0E72B74B89C2EA27DA37FB76B7FB596D1DCC859DA9C1E9427ADCD7D64BE9A46D50D62008E49CA9BAEBFA2781BF8B55B76747BB46E2B1EC842E1B4D68DEC3464E1F23ACD80F08366E82D773D623879D3F609B55AE136A11199FB2FB54D89C6AFF13FD45C3EA19D9F69D2B849492E8D394141AB2656FB1CFC2FBF65DDA76F8D1C20EA6F8FCEC5503177F5D3F7EB75DC7779B7753A0B1546816D40E3118745FFE84C21CB87C0BD091906B67C26CAF79F7CA29856A628E438CCC099B61B955298C7BE6E57133334D2FE78B1F86612550F56610FF96EF9228D8DADB8F5DEDA3AF68647F60032FBFC9BCBEC16B5AC1248058F39181DCC01F0928D12FCF2D0D74BF5F29463B3CF5370357591515D58451E862B78046976BEF6F3E934D66E2744A8552BAD9DFBB9A9B37796569F241E0B6D0F7366A00C25B46F5CBC8469BDC776205E760A97165EF95A0120281D67687804302C04061AAA69DCE4A4312030ADFE324C8C9898EBD39289AD3E2398448B8AE129C11168B8E58CDED7ED64018E4A56F089D1FA7037BF9EA34042B7D3B0F16D3AE9A2CD491DF344ED88ECF79DF26A30568B7A5164CCCC3513269D5EDAF7AB1E717C62DEAE4BDBE449B796730D4A7E8A2E4F4CDC3FAB1F70FDEA03D9582AF4877626E18AEC88C83DC843D3DC26FEB38DD05FCFCA7BDCFA2E8F30C622ECF6407F7F2CFB03028140F83CCFA3829F9AB9C1B9F396E353E2852A20BCDC9054E948BA1954E714889DA1D9FDC3F98129209655541153F042E2DBAAE8EFF3D560B23943FE7096FB4D0A4EC8F58DF85B8193A65102098A56843C77E1B976FB5A3FC98906FF343BF4896B157DDB8DAD93FEA17A80A348FFE954AE47C484D1489A7E9DA7CF1DDA67DEF95B48DF54133ABC17120A1B3E38A6AE48706EFA8E711F63D432FFDE6F28F345866252D6F4E98D14084630D22B62F07FC5C0DD26DE94AFD9EA5A091908038BBBB2747133ACF873F5F863E5FC75215022B8DC1C8984E146FD7F2C7021625A6B2715E3957A229734C9B12F1BF90BF4A272164C45FEE7DBFB4420E0E1EF45A1AF8AB29BF422CD8A7F942828514EC863E8254B1679646A73DCA02827DC95711D2898E5A740AF19148C11DE269DD306F60B2CE5F6E11E92F96DC740ACFBDAF21204FAE65F77A8A0FE125EDFF82274FD7CA72B70171447DEF05851DBB9F76DE9D7E10424E71D9711EC8F3AF2CB541F32DD70295D78CB1066498C380C839623059B2805DBCCB57861CF90777F37F500C53BD03DB88E39E0B92A45F2B612830A3357505725F39B4218EF9DB33545BDEF9C0502A4710F92C85DC113F94731D2F986E738148401EA2C6A9CD4547850BFD11708ECA86F9B6FB4DD33FD9145B85E56E4F8A4B7A164017B61CE9FF891474159DA0310B5A291CF2B61BB5511349C5F8281EDBEEAD1449785B68F05B68A4842040CE08036B0618CBDB6E1EAEA3A10DD241EE3BC11440F857AC37949474E509DB4F7000C3EE72950AF77C641458BA5608C7DBA31AA4063BEDDA20C1CDFCFC16F46C9036D6099E7B7850E24717144C2A46EF6FC083E5B301E28A69D360C124827379E8677D592422DB63F4670E755DA33AEC82927BE7EE121EB8E88BC9E5BCF3E639E212AB9BC7FEFF0412ADBC3F704E4E7A4811264ECD51B0680E9AB7A8B5AC17D92B2EAB489CD8FF690E46D463A3B8DF41E75094B88A33815008ED6B4C1C8AE075F98208327C5D516F7109BB7634B1E891A5ABFCE776FDD011791F785F23B1F1803FA198CA2964C7D234237FAC86A618516027916F5E6672C3D5DD50604B9168089FE8746FC9C77B19EEDC4CC32B7B7CE9C8DC8131E8BE853BCE7FE4BB5425B6CDEFD1B80EC9EF6232FECBB1856F6748AB37AA981D7FEC9DC1D99757FD70AD2FB6A1C49CBE5E73C694CD9B275A8BA09B1A7B25ED9E59AF2228BC2D5BFF12802BEB07664F1995D6D32F1F22C4BAEE962292C8D5B6CEB6A9299E7DC26DD2AEB85D4514638BF4B3D166EA9D0C0390D04FFA11462743A63A2785FCFDF1AF0ACC4B72FEBAB9D4E72EB4EDD7F3ADDEBFFFE50E6550F772D0510A3A1230D097DDFED894406F1A9024A2B170FE7BC8A5B3DACFB9866E15C681563B7EBBB14DA6A7BE30733D2F2F554307798B4A4ED6EA9FB9C56E5F465EB8DB15E7B2FBE2DF91653CC8366E15E307047037270688410A6CE30F68DAFECA12DEE375CB79165CC2FB05AAA9584DB44029AD43F3CB45B9AC4156F8CA32DB576A7205E815EDE94BFDFF6C62DAAD06A2BD3DB603A4F64FAD8C2E718D4078A0392F50A39CD15F23779E8767FB61D93994A97E439E6B7A865ED36FF7F725F9F6B752CF25B64A931CF10369E0FE1B5F2A74FE57081A93B4253E9F711EA44104C12C5534F9A095729D982EC4FC3F9957BCDBDA72554ACB0BE058F084048FB617B74A9848E12DA1AA52247166BE881B1399E3E5D141D146C71AD46FC80CC4E334E9A8F854F5B4100EF6E5D27888E27140120EAD3AA92C634A55A235D838750EEAC3E01CD3EF573473EDE8F4DE60F7E14BA489BC2EF8E78968EA775CFEB6538183F4924A3CCF7E9D97A88F772B0E7B2165F2E4460D9516ECC5B0154B1FEE998F47DC1E6601BFB82BE0959E7BC1EECFA21032D04FAEA7C5C77B75F0F9B21D6F50EBBFF719BEA3A36D9C3CFE1EC618937552E861EC2927A2026A4FED1B6A5DE89FAE445718BD6630BC235EA662DA245761DE3950D37740DE8FF1A7DFF83537398319BAFA9C1C60081FFE185CEB98BF39A0C8031C245ACD78970F30F55FF11D221587AC2E2EBBF91D616806E806A967979CC3A6AF1F7C5459BA629BA206F6C84E02D3ACF54AA0AFEEA543BE13FFD11928E13D1C75D15EAC5EF3FC44FF2A54BE40612D53FA32C311C5E3C17F9E36BC57030976409E0D2AC18B2EBB1498480EADFFF4239BB16DCCA57FDFB56D5BCFA682A9EBC0BF5476F1117DA92F7CCC99F7C124DFFDD9349598DF1820675E2D124DE0B92959F5B05AA618308BBBB13B9233B09A21B9A5F0A3EA11A222055B9EA56BD6060085388DCCB181D441621B94F3ED0B7C2F6BD51B7F905CA62CC55076E996A6E1DB0BC2A9E3F63F8E0D8FF6FB5B52FF6CA511E2259A04961A497C8943A0888125CB4413D83A09FA1EEE3A31E50F676B6D261600565241A1AFB21D8061525CB0EAC523FFC9620236C8B368021F329329B7CCEADC2B18A561C10C3CD16494AB2F9D3FB6E90CDEFE4B654D2047078E22E160BF2A85F3B15ED30A445257C560FE11B6BD576E299344A019DED61AD5080CCE69C91DD9FBD1A380D1D80AFA49D3E99956699F3CF4D35529A29679F6CB40AFB127655EB654013BE2B9D6FA08CD9B691580BBFAC98DD09B40D2E35D8197653497CB65300ADE7666A5D9A0007BF537FB4634E294926BCDCE2A32B97224A8143467CA9241E51A3E38F00776E6DFBBFCF64A3626422B2E50292A3375A1C4707CC18D83D8505B4F3D3EBDE9A1E4DF400F90A70CA9F4E60BB301778979EA325F0E2DA6E065C7E89660E72F6044BC8DF27B32FF4506D57A17B2E0F083D33147C3E0B8AC2119FDE87BC28D892FB073391788CE0D6DF5FD7F499E1922A074FD23F70623E393D9296657C83F6B682DF0FDDF0FE5A6756020E95163F901BF19445FEFED74D6676F2D9F73326A93B328BBA6DDD3DED9227A831A451CA7AB741D5258879BDD63E0B1C55A3B9BF421FAAFA47358D376C29ED9C091DA430427036A43DE3D1CD90A650DC09F7DC1CDB2B33834D66CAC7DB0F39D4DAAFF22CB579A9307AEE15D003C09914CB53F4E372AA33474A30BB30D0C339BFEBBACF47C7B5993A768EDB8F2F005A7D9B7EFA489B27010FBD9B86E53C91102761AEBF1CE573532C5CBC69F3AB0A111E3BAF85FE4B334BBFCDA0D633E517709D1D69392645CDA6E119190B4B1C7410D080E84BC592B82F2432B21A5270B54D347D69FAE4A7F39032EA554F4730BD4A6F44640468BFA9335D09DF78815622A521F33937A7A4316A11417229B4F4B4E6D4B6C22511061A87055FC6DCE0DF7F5B5C6B941CCAC18EDD609C51564899BBA70E22851F86F3E59ABF596D21813FEE8CA01A0E2013C259B8A3C75F7DBCE34CD0E476D5B66436E6711E172AE5AA650CB0759E4E2469E60B44F1ABC175E8669E9B2ABCE0F39A5E91B714FE0817D6987FA690D7748C8596DE9C89AE0D4CBC7D35B894B07B78FC288B427D55E2A050729672B340A0D6D233DE280ACA8330D9C9705EDA3EED88427BB3BDC7ACE50FEDD21AD04C4CFC324CCC1B0E2DAD265D6A4C57E80D03209B268A07C5699648F2C1B4F3375226E72C4F7D66B7093CAD91F6677624EACB005D084FCFF6D987995F7DA3437FCBB2D17DA92FAA55465125B18CA9B290547D5A39DE47E428E8940D996A10B3AA5B11F3E2DF50EF4B2B76702EE733252FD6FD12E5C577BB7A290EF89255443F01B85E031E6901775CB3FC963E3F789728B7F9034EF05A53B0FA307D9168DE890B2BABD61822D180124459645AF4BB20B582783D1A0D6DF3B725970422E0BB19D93F898ED928712100B303F6F1B87B2BDD09099C89B170FA75A464F8BB7053E5D7AB450C457362CD9F6D50F86FEFAC378FE3225C7239133BDE96950A7416C53AFC1A4B9BB4CDC51BB032C59BD27B73F3A7FED719EE90FC880D20AB356D55FB6F20B76C3A8CC7E21CE5410AFA38D0C5999E08E1ABE8793AF7C357D859EA94E29C65C87C5C63DA03589B0942D4740A92DE59FA94DA46A4DFB4EB8C72F57D5958EB8535644E9ACC7B1906022D539777E153E44D6417003063FA996C7EB30D8135D4443FB77A57F849F65BAC1C42C49A1E1A7600D595E3926DF8BC4B6F8FCDA525E3242C63ED2B4AD8BB592CD3D83378E9E514E996246933D63B4A8E4C47D3BC709248C7B72B1B1DEE683A510F2282CCC2C9E9BF22D5858CF1F8E099A2F913378F8C2A9888F1B6FA005C67F475886CDB205EC49FFDD1B00E2B62E85EA1655D9215F2DA629AF8A265FC02BFBBD79922350249E8CC07920311EBE18197F20208C621CEE20EC2DD8E58D5A802D9984FB3B43D7109EA96303A035CE8641ED530568745E7B44BDF67346155556487E50C7A0F05809A66C460BC52C87B98E9E7D1B1A890D46460F846515147128B4EBBFFCECD881A3BD3CCBEF7248C571806DB8CAEA140B570282C8DAAA81AEE4CEA48A25F443FBE58215D7A22108B4016E8E76DBF34D39D9097225C1D28C567BFE064148FE01C84B3335D8F705AEA8F95281EA3EA1326D3BB26E08C752AD3E8A256E663D9FF4158F9C3C3D01090F12368A978C2C56F1390C7A63F2C2C26D722E9E3B82C9609DA23DA6E0578C323A021EA7E3222B81B202C0E8D826A5C20C48B7E03211A588FE19F718931897F689E4BDAF20CC6E2FC5D43F92F21E06ED4BD67EAE7D6B71320184DE84CAA132DAE22E83ADDE65FBC8A8B6EDA6B6ACCF1C621B6202A7B43D906CF81E8A6E358453D42C1DABA3AA6EA13933B140C1A90F44145C1B8E39892103A69E3A8201137A9748AD209086C7DFF3B1A58AA9DBDD0018C040BF6F3E8D0098D10FFC825DEBC57B4718FB8FA7E5BA1CC617441FBCB0F39112DC5485CF90EDE9808A060F46F3236C59FB67BCCACC0B7F5921FB238009A79FD42F0EA2D533467CD244C7968562E36B8388CAE74308C49E915A87AAEAC31673B052D4BD9CFF867EEB570858C05EF88CEB67A98EBBA9F77C8A1BC41154CFC7987ECCA3F24AB239A1B7873CD2267F211778F043D3C6A8A3CC07C35E0DF17165EC537E69C8CB008C9713AC3396F934F7DA09130E327C70333C0C7112D938E2740EF6BA564242A01452196D87E1F61DDC27A04388907A105537A3C7F89DAF6BBC10D638E97C1AF9F4DF50450CF5CE83F242CB8E91E18656010C451A846CA0F5E8318C85E3128A33086BC043F00BC83B5667D55ECEC9DE8DE30A0A21FBE3ED97FA107103ECBB7844BFEDEA4F26C2B172CD9AA806BC4D9A5F74E08A837F0AAD1F886A94418A061B96B2226C625A3764D558AF327E54D33776CC7B5B7A1186075285AEEE5E395446720E3E9A48997463E489520DCB872A2EA844F113862E8F7CDB21F49B8D75D7DE298DEC17730EA7F0872715A50E413B48E92526D51A453BAEF4C8A65010977447C3695F8F1F48E2D0DBD31B8EC1CF42FC69AEB01999B59667D96DCEEA803911371736E8721BFBA0D11710C9D54423A3773695E8BD3912D068A64D7E03281800C9D04AADBEF2886074033C83AE602863EAC0DDEE857A8F0D07B1D1439680E071675FD3FB9AB93DA740E013A1CE23E0E41DB71F94CC79E10AFF11F4D67A07D78D159FF88D1CEEF848A1181624890F570A28742BC6D78D03A6E0C352B61880AAB1DCCFE09991F5B49272D87F9194207EE34A1534AEF4B832368E6A318EED93A541965E6219F3F5F20D2D714080C3AE46169EA179A9A5CA9FB48E7D78A7DD12AC014A3161D4538DD702EBFE9FFDAEEE17169A9360FAAD70190DDE208A0631CF739C071C2571421683B42B773B6214B890F0DB4F2A4F497011138CA6799DD0ADACEC2D5DAC2D9D6DBDEC6D2D3CDCFD5CEDFC5DFD5018483E7266F45B80B9831E36EFB94C04A2C99A5741C56112D1F3E0B8D30AE77E144BE6918FBC7CDC7768BEDC121DD42D65F0C8D17BEE0509842445F7D81C2CFCD9EB262E27B79A186E60E6C0F3AFCCCEF17B733D0F1FF10D6098EA4D1A03024C93CC2644823291DFD320D63A28F412493467EF340737AA0F1A4B89D81AE210FB0147A8C298A292C0D9A407C08EB395BB4EFA0ED842BAE6E23996BD0B0D00B06669832E0D3DF6707CE4A7E86F6DD94D7F72356707390583C3F269347C67F736D04606317D911F0390C225E833AB2C58E7B88DD455CC3CEFEA33F98EDA6B137EB513D48A5A1EA081EA661293E83B3BA1E35DE73D86A47E2762E67D5A84388310602225E0A5B3FF69EC083807E62E94CD378533B098306750F44F2D82C20170E672100041FDC24CF697DA3AD5D6343F96469FD8A31AC12645D20BAA4601935B0D98642D8060D6206D48B36AB7BAC5F88568D29897D973C51DBA0A28C1B337FA092528C33D49A04AFDFD5808AF2DDD7B1B2465D04BE19EA957C5C0BAEAE414513E917F4107E190AC343A0416860101812B9131EA1436DC42781C3500BF8142B4F4ADF088E714C0430A74B111C5A6CDF9AC2106791FF083339B2FF8B297867442AC8487854F80FA43AA9AA1A99E9C0C986061815152DF547D09869B73BEC9CB8B5D114B0FCB340442397CF52522B2582C081C010284165176AE826BBCC802CFEE620580C2E63E1B0D80B06F02640EE4AA25A3B17943A38DAC37F3C49DB857E18D23BF039A7617B72B71DF8017ADE4CA525CBF334C128F2777DBCD3753C18C4712618ADF59D6E3D97301FBCD23601A129DD12706468D804E3B37053EEDA0512DFB4F9D615CA02A5AC48452861F197D17FC684FD7E4E5C325FB35277F4A075703DDF0195D38B2EDAA721EAAD4A6562F3086E07288F6F4509F6AFFB81B965D8CB05AF17287445200AA2707B83461DEF9CC27734AF121B4DC9457CF8EB8E756FE1A42711D86F9FECF16F1B87A3C88A3FD4FE1395BE1B43A91A625107AE16951AFD9CB19F53AF6A5816F446FD654BA49E9E4B0767ECF27BC3B2AA5510F351889FA3507C86D59BCEB9F87D7C2F7823EF12EF65F55302F7170FFFA2DE0FB58593A4CBA4D94A6D521ED45EB705C2E59717F957E478684FE023F723148DD2E710246140C24321CE5ADA29F97C1498035D3B94340F2F116A905D8EEC74CE7FFFC72DAE1EE0F5B2CCCAD153D8DB8B506A0B6B746AC818D76A6CF74BC2F96066AB4EC29173A60D4AE082571997D568DCA35AD1D0C4E4850C9AF027EFA08E9199A66CB4EF6D436DA1E68309B170B701028159802CDF0E1B65A1EE7C41252A16C7838A0298CCCF8CCAAED1DEEEC6DE04B28740A0407060301862941F21970AE476C7F6592C19D0063DAE92170BC4070F42745B6DE2F2E1993159FA4188DB78D1DD8881232E08C30420E6B56A9959A4D7AED6F24210F452D7AB008944221B2DFECFCE724069755C88ECB5496D5DC576F9E59B438181818D454C44FF9F7C4048C7C5A88FC406A7C57D8C11FE22265A35310ED297A43E8081AC3259709838E7BF6D19D7EA808581C06B3C896B3ABA93D2D5D796C634AC0C9BEFFE10B1A0491F3FAAAE00061C8324DB24ACFF59CBBEA493103A89EDCA5D5F0FD185EAB6FD864655869108A7007CB4DBFEDA3957B1D0088FB79478FD2F3D6360E66B3A3FF7EB0973924B6C9FE6D5064F0B5F7123D3E3078F351009F82D41D7F6D985F32451D6819195C49DD329BB216E3DCAD47C42F8E8DB053EA72C6F9F237D80B0720F98ED1B7CA0C4397B814F698937B37CC988DF6FF387819F8FB6B901F80F287ADA589ABB95C3D3CF909E203AB1D889A4515122D71466DF07CD002720502B5D47D0681C46BD606079A668CD4C37B97F59F76977278955CDDB46E2D265DD0AE9DF898B0C531C1214806735802CD687571FA7F13F2868CF7BA73B7F9F8B178C3460A498C899F17983DF062F58788E96FB09095EB803DB9C79FC86B2F103A5BB7039634453E60A90B3ADBA13FEA3AEFF6B02EEE93186BAB942115FBA2144AA204842262C0C18010A1E0E02828546D349A4F5733D96317AD7B930DB2A890317D956B33A0FCBB67AFF8EB8E71A688C5FC3784D0E9C6C6B1135CB665BFBEB2F9546197D6D0E935382790EC0ADD7C5E124D7E39221FE288CE4E62899542A701307058B7EFB17B8F29A446A06C7F225414D12B4136409DF9DF4B2E7FC2712D4DC7CE583E13F3D1D7F8B23A8A1AA565A6AED5D767DEDE6BF8F516DEAFF870C26FBB598F26D3BE92CD5ACD06E8A225850CD25D3ADF2E206D1A1DECBB5EC7F1D3B738C6EC5DC69693A65D527080402E173BC9CB25B91D8026392523EDA0B7A6DC8C707AB8CDCA7377105EAA427BBE2B691B429A30169B6B35E0166D461D55EE351A286CB1414CCEBA1B5C8A5D89F249A7E0157BC022C9EA2B75199386BEE51FDA2420F056617226BCA40089478E89D3EF390CE2844ADF041CE37155B37A04973EC6BE295661B7DD330B904CCFA77CED2FF6EE80E3100BA248AA239AB38F5430C920853D97ACEBA61A20835C1866A7A429FAB3C0D8F3280B0477F3C23087DC69FFBF00F19051E4D29BC0A44DDCA7A6640C207A5CED75FF281ACE7876F2ACC53899078954CD99E2C987916ECB3E5DB5DEA25A4A7C9FD7DA352B519AF08232170A88D09A8362BB12EBA74BC19DC8A66FC23EAA6AC6EFB99D572E9FCB6C7F10D893B74E16F1B347111FA85E6A1A045B38C63705C8BC6686E16DEF593562BAF865AB174BE0EB2F2CD10BEE9DD3727D896E13BBBD2ACEBB7D7DB173676FAC6E58620C39F2E2DC3BB235B05EAF475469A071927E57F068684C8C4C3C47328804AE58598E4729237173EB29CB01093959C89A269AF8EAAD5691D29A5038A57FB62B90AC498101E0388C9C80A66A11A2F20535E72DCFD5887574E66FE54A7F76C387D3DF76DD84E151A0A2B47FD823CCCFBEE179DC6E800636A64F7106943CA255F16CA936DF44B70978EA0CD974C1AB0F0E0394E27868BAD0417A1757341BDA03B8FB6DD5192670247DB7B318363448D7AEE2F2A396C9B138DE7F1DDE01B46C3A2EFC1D0811031E1CB14C69DD77855597A2142EE9BCA5FAB700B4529B052F29C6915E02A17A22B9EF7E33DE5B234A729D9FB587A55D824BB9885B3A7B7D25914019FA5B47E9A8485237A0180137A57B43B4F287C40B4DDB072F2D04383234FA9C35C3DC19F1019907188191DF43904BFF3E77747FC4EC34118F004D80C5FB927C189C497FFC028CE82FAD723958D2A7B8FF14573E939B982AA04A0AFB8FEBB44503248BE480B8F1B9D04571AF8F1EB87D69C0BBA0F535F9CECC752B3A1695C1632F4F380FAAF5E5C42421106ACEE1C4ACE9B9161D59A178376473C4BE4E52382D2B33F3068E98FCE682546E249FE0DD44F7D0F4292C057C69DD2B836F204FCBF20319529E11056CE2B256A302C25912BF78C099C882B0849F4C9169CC4EC8E158D178F8459382BB73EEC30334B197A9FDF326AD56D5ABF36FCC34EBCDC69425DE7A073AD740DE6149C880C88BDC66952EB140942434C561F6E2D831F3BF8FB92A7A671003DF1CF041B9A8C1E3324F29BFA7BA691FD6D29F102670E2CC0BF4B2DA6E0B82C2E4DB011307F63EE4BF03213FD7A93E54B291F08AF6EE7D5A2D271A9D4F173E686DF2F07B1B8996EFB1648CA4C28C241B4CF33244973E7FA01CA23B03FDB729BD1E7D395B6174BFC05CDEA06D35420444EEBEE886706C5C54D9BED5136868047F6A0BAD83B24FB8C277F7F45F0D7F09F53F97F3B29080880238A986BD317A558A828392F347575940B9A237AA306B3DBFB0E7FFCE4C92CF236A8E5D76C9AD9A5E11B61707F8551679F31C0DAE016E76695F2B9CABB23DD470DA7FCC11315D60665BDA8E69E92948938289DE2CAD070BFE3904CD6C866819CA82521A980FD440C3DD4D9C55FFCB8EE0ED666643334277A0D38943BD4E67AB288AF421192EF525F6BD6C6E114A57951F4411A28F0BF33199D0F9C66CE92BE56FCF8A58812D44E683126EB3A9A86B1F8BDB714B84480450535A5DD66990FBBF88F370BB619F1071873C0044E623E67A0AF41741BDEE8C96897E1337360616FE74156AC7B6A757C651D87E9A0395169D8A48C6EC751A0446E4B2B01B903B16D0AAB0C9C3021AC56A83008DAC681D00B063A4BD35D69BE08AAF3AFE64BFBCF64737C86B6C7DF35D0B14877FF0AB64756D904689F9B29BF6513A0091F435796538DCEDBD5CF3B4C5945D0A3E1C98BC6B71ABD23125490AE3EB625AD3B81EC7A1A3A6B18D6798ACFBB7DAF8D5AAE980F078A75157CB84CBC03B92DD6ECB5A1E9C11287FDB41BABE90281F0892998A9159FFC61CAD48C48B048C833F8D9CA5EFEBCFCF833FA23CE470E6E88308AE8050302FDEE8FE1D218A4B264CCBEBFA2C342E49C47974CE2D63559A006F95395EFBD01430D5661F73A90A2F27DED285B2F8C6CFA59B0D2276CD577128FA574850601D852942942C57A72FE2349A3C2B8C30E1A31D981F42908EAD8D1C30CFF0583FD296811D75CB4D3677EFB9C2697A530E337F46B5AFDFC8B3E6F23FF88375290A16E26FC8E565E952F17D4A328EA81F153853393B088B6FDD362D02937668F771173CC8DBE75C27ED12C35A229E646AB7644240223EF3D9B9B52036B2AF8DD11BF1C0EC000BC316ADB10D329C1D40B0A2D8764A5AF7AEF28EB570CE1E0F024415C237B813940F307F69B79A127BD13A95603DCBCA97FC896BFA30A4871CB90681DF95FD2EFE1104863B1D170B827F658F0E5C6A4F640A29AAEF4EBC8F523569FFAC98B6CE325B23677342949F8480370347FB931C1AE5F6FF6D4C8B458EBB43DEA3AEE9DA1613271FA3B5F1518A87240D6C67C64D09406E06F0E840235BB2EA47A36D239DBB3A117FD645CBDA97A4409D9EAEC6932A6365CD61A5CFECEA53CA1214FAE5E71D6AAABB88CAF116E8A5E979B8DFAE87F33C00EFED546BD67D6D109E5A9FBB5775F2360B24535DF7EA1837ABE73298BA79EAE7CED1FD8280FCC308453F8D2EE6404CD0F98E7BAFCD30B3BD25D11F8C73B7458FED8F3A29860C702459E446F526BCAAB91D506F38C47419E61D267B892FCC52B295B69867D7E3E83B03698A872B49D662A2A727499C14A4BA782661700E711524E66676493F5FC8B38A0BE1480EAEEA1DCA16261ED44007B015A9DE06574C8717A8A9148D00920A5A046EB0601850350DD2120418647C193E070B455C034DFE4156A771645C96D9C6007216B3A780F049E7013DDEF5C01023B95A8D512B24FF09221695E124164F9897D2ED3C3FFB33B39F964B146B0FE0E12E00CBA9284A1F2F7CF9B239736D7C6E9C212610A479901D90E0A37E5E10FAB20315E84C442E7B3AD5750AFF961CE05614BE5118224447AC3000BF6ED6EF4D2BE8F00460AE77BEC8A55BC5AD9E4E9D401789407E10FA26DF76540FFE32DB584FCB27236A8CD54D2244960129D5FA9F336D6473AAC1CFF8C2F30BE0DDACD41CBA10947A887AD40290F30E44C5ADCFD4290DE69C54356C14A8C3941F86F454672A3DCD442588B5CC53D942188C6C31C439EACF0AA2E483EE64AC1601D8F9D8DA27B69287847FC9E20DFE365800E122A8B7E508E1EF9DB099056BE493F539D7CAD40CF7237820C96279CC930F87E009D0BF1BD3025169D50648BC7B1B95702E83360CE0D5577A87FA71142189056CC8DD11885AEC6DB581720A231E8DCCAEF7734096FC67E34F5043D33A1310D2054AD5FCA07332F9776708BFEEC641880F81EB0EC1BED534934510C39A2B33CB58189AAE6492720327425ACA98B05F2386037F9C7C30311D13F9327DFB79715B28F325FE95BDE2AEB423467802065969131E278EE9D148F8E0A089E48C569B3C9C1E09D17C1C9DC1376898EC8E0A58725E0FD45FA66AC716FEDD71E749A5FC9ED641E0EC00085A721DC1012D7460197EADA4C384731B6B081DC5C0DC961EF978F22AAD25A1B807A769A57C0518A1EA253F85568C9620DC52266CA40AF75A36B054FC6F8BB4887590AA98D990EBD1EFF43223E1EF6FCE1EBE87C94AB44122C650972F85B15BA7EC3C062D7D02D7E793F9D3D661F1B2FA5D3DA774035E48D1C65DCEE32FDDFBDE82D460676972E88CD58D34D82CF27E0066115A7B994BA74522350A2C2FF48B34632FDB70B5960BD7168D38BADEBF8544359DB725E13D892F68341D2F05C03197038763EAAE08C13A5F68B8D5E068C7F88FFD01B4BB9469D886A6874BB601C547359DB0C808327E2707B22262BAF9D5A4FAE01CD5D7DC4FE1B8EA97F1DCD803F7009C19EB62E83A987FFCFDC110BDA71BA111A6A7C20D23063CE7F340CBBD9D3803201F37A5EA2ADCB6150831023A168E0549E856833FFBC860C5336A29EE342D9133FADB727492AFCFEF3D04449EAFD102072DEF80FB56223F2A3815D1129D254331F51BCF83479873291A8F84C26E33DB114C10D11B119DAC46B497F0CC85EE6904B5BCFA1A733A64FA33CF0D1C642C2400081C701CAB06ECBE03877EE89DBF6A4848244FFBB5FD5C20D710A68609455A28CDA8317ECBF49CD0008B234441AF7F58601178D7807B8D86B372982B57AB85208C6085D34C25E7F93EE7FBD7556F8C25BB20304E5FD093A526CA7E7C2A23D2D7293AA3811B125B39C76076AAC4F8B1186322E17CCF701EBCD6C184C03DB20E631B3C38D5CCAEF6968B958A2B38F50BDBC90BB690EEE9B46C8D73E19753A1167C9D22500F1C0087E7A215B848FE9F46A798D5CF955AD3A7363F424CB9FDF9882D92CAE8647C4646307FFCA718FE4C6C82D1C07BEB190244E065D3ABF3C0323D135A9FD435DFBD6AB015948C71B940D89FED121CC9D327E085A0B35EE26D447D23098A1EB877999A331B6BB989566ED47B822C9B69CB9FD6DEF0D03B289577F10A32711918585AD7EE3FC73A2979B8268FEA3BC45208DCAD9C750F11F20195142B84906FB5B5D4A038728F71997AB4E441DB715516BCC0BBFB30739FDA50DB20C827E86CCD1FCEDAD0307057DA3C240771B6111D3DD1D70A1D3B26B1D8220A0EEF0D3E7899CA100B48E92CCCE5313DAFB5109F56BEBCF7713D38A0D7AD2FB553404C149D851DE39C3C7E2715657155FB402E0A7D3B6076AFB14067DF2F95CB05618077EA1CDB730F9EFCCF2FBCCD2CB35217283F355EE22FF2846DA6F5E4B65BB5CF2E1C1C797E58C0943878461C11C566302A3E7D2D752B87B92197DE3DBB80B4B057F3E1660D9D1F67E4D9EE69936F26D17A97CCA4652020D49DFB916616F8626AA67D22EE992A08F2FB2C2E53F13641E36A0A631137D3551BB5E83D0B2A186FD87E7E52E222CD11CA406BBFA33F7F4A43F1324AC1891D040C9C6CF3FDAD4C16D6C0780B195E704F2F971A1198ABC34D0340659DBA5F8AABFE9290BE6C94771730AE651AE41833C5A52F05191761A00C1325D6682A22FB5B08F26319CE3508C0EAACE812D979B535D3D0221ECB7BDDCF49D467A3F857B06E661BEC17CC47C2F1A876D9AD1854BFFC3DFA691DEC0F9C9618CFA2E7FB381C4E86291C8B6E61E1C14CB02E6E30C8843346B78F00CDA43CD7C22E0D99371A1FFB9A5EC69D746BA04D1AE09A8BFEF22A48087F3F833F4F4BAD3147FB34A5929BA2F404DEC4ECF5E9ED71BDFACD6B31853340CF1FCC42D7442957E8E635A8F2A8EF71CC15830022685CEE640687A3AC88A95ADD348EB89403624BBFFEF78317AD6171A384F74AD361823101408040281321330213A06D054B02BB143358110767FE8F7F07415095C2DDA2FD56E8467786D59CD6665035416B973D57B43C89F5E1999028091BF7981C875F4A92128037DD1C066F19759E36DB238353A3CC8ECD0FA43FADC7F3E2801E867281E4390BA475A4469BC7EA11B7AD66B1B64F0DFFD126EDBEA8CDAEAC35951627701C126FA55ABA40868E030972888E319001D737CB99CF21A0A3FB1BAC375B031569E1454C467EFF551771B7097D44EAF6059F9EB22885F7DE237EFA7B4A6B110D8DECC945473075C5ED74E9B2FED7700D0B83C49F545BEC1EF6B9263904A77BCA5D7D8A93FA7919F2394CB856C0FD3911F9BE60B1427891E48CAF7E09F57D5CE8F914F6D52C9CB8659F2DB06689F433E89F0CE5F32A3A2AB9DD8AA95A620E5E1FA630A38E9B2D2040EDCE87F113A4BFA81FBF91A56672DDC1F395474E0F3CF98F7DFBBA8497DCB41D9163E9C16BADE1858C4F23991DBED98ED1E5ABD608053A22F630B151CF4E4CB0CC893FEE55AF31E38EBB8500B9E0A777A610F1DE306B0C5C4FE7CF51CC02F7191A17945EC0A6C33DF52198154FA57CE11FAC7E264B28A6D0B5310AFD099FB19ADEE401512826C2B0B8C41120694A1FE182C5242747E4A7589B51DD9E1C27415464299473D8597F7FA85F550B90D609738C37ECF9C6A65DE753E9845B9780C47E3E20111B3B9BE33A5462F1B74DBB441ADA45BD6CC9547809B10EC09368692EB34E70B9435C6A5F04D3CB7B84714D7434FD8D379C8324CA088A93D6621090D45F1904931E83380BE07037643D82F89EE23354326359B737854E90D033E7087F1FD87BEAA64FC89DF4851BB9133E7BFF5351F14D1FECF3C42A3D1116F0598B30C9BCCF827E158EB1CBA6E8FB2566F50F863781BAFD448D063F89D43718363D4AE1877020A6EF1E9AED7B6EFD39CA43467E05EA978815EDFFBC1293BB48E31EAD905678C79FC24A79201480BCDC3A9B4BA59AFD8B079E48207542212581E0EEB4CCB9B841E90FE030C6E5C3502DA6964683216AEF89B290A707690F0DB7446A0067537D830B49CEE21412E282901D808AFB292D594C1B8EE398C524810F03F294AC99C3486F4971C1AD4EB0503640C51A18F28DB36EE1C3637982062DFBF110C6028B9040EBE6F4D7FBD5DEEC30156BAFFB0C57334AC9A1B13A759D88C1DCF88124DE4A2B3A746AE67C3FBE7E14EEA7E8D59A97A5555BD8558F3510A1F67E599A7D1E592E7DF0F156B5763F3B5767768EA7FA91C415957D2315EC8A30B01B2EFA10806F224C93D45559334D7D5931814CDB350BCB12EA4AE7D3031F242EDAE8A64EB12CC41E0077A11DD567E55786D0DCAEDD2B5DDF1E714E3D58F28C09F2ADB76259A07973AA2A9EABA593017919E06094EFF53DEA51EBF2FDE9CE2F4B88C9331AC150AC173A7013A9C0CB721A97A4E53C5FB9D147EFBE6973DD9FF15F371C977D9480D00C469ADB8273CBC4ABBED52C3F5D73CE2CA82AF3DFBF146CA075C6D5FA97AD373DA60D2E2D819644987231929CDF1FBF970884477F81D9F0C6D1C9B4212D959FF9A0EBF676C205B094273A865A2477C6D4ABA30DA3F8838F5E10F4F396F8A11D84915A580C91FA3235AFADC26C55997E072C1B6C10B721D218A38EB35B6E7531640DC89A09D4F431D0A252D7C55CCB7A9F7CAD2784427166D36345C4193C1FA1DF8AFCD53F4F5F937A6F864875520E09A72D9B2E1FDCFC848071D7FB9EF9F4FFEF595328AEA3E93A08D49D39E140CCC1FED134CB0575EE2447265028A63C25EA9027695D232C1EBAF696ACEBE9F8548679CDF51A22A0C1CBF7A9A55084AA16D367276F320FC8402012BA14C84822CB2C6EF8E7866F4AFFFF8452A7ABD12E0DA0C1D3B5883BC2F93F4B05599FADB59710CBDC74C96A9009065A608A43E4064DAAC2139B1C35CC5E3345B321B4AB1D1A67B9CCE57FCEDE312EDA2C214AE5C522010FC13838E5FF731C731A1AE9F4B7CAECF1E70EED3A4F11F4C25FCAF9FB6B9B50D84DEA711D14E67CADA7778B61A140D69B63271AC40E6755389A54B8AD3DFC5125B3B57BCB296D2616B4054538DFC66195DD8247C906F22B217814A18A45D51DFF2D1A77E7BF7DBD912A162D1956750CCA26AB3B89822603D3CAB5D30D8AC9E23561100CCD31264E4FD32351A11B076565F73CEA685926BEB479531AA6B4E2E2ED8A1453CE231316080863EF204BEF73C66DC5AD9A0D194AF875A9D15FEE034C71B924CFCB5AAB9A283EBDD0C0BD0F0608CDA63047CEAA0A1DAB56326C830419494D0072B241EEBBE12D115990985484A119785F364D581C93074727C5E0AF0E139E95742F5E6A2FAEA88F687A9517996AF897B89279A1652AA6BF520E6CD1B30276C0D63247B57F105247301F1A9A8518FF6445643AE7127A9D993708C70A721445A195C5E3DC792B7AE1BA9CCFC951B286B35160452AF99D8F1A8B1217A59285DF5347ADF3E32705C7F366999F3BDF9F435C9C5135C3D40166E012D0CBB07E86527989A41CE342DFB23FB3AAE4D13B4FF18F9AFEA746BF609976B280367864C4D6A79F8EEE5A86E4C623A4EB8265403E5A67D79065BE9BB7F35F12D06A8C2A0ACF8E2E0F262882B4A249B3A2FE8EEAE60E9FCD2FB806A8C01BA486D1779567EFF8F4C8B97CA6D54536EB772726E75C6348E70D74836447FB21A7D6CD17D73F8EB327FF99A74D751B352C09C273C79DECABED90E90FD534C964FFF0F7D385BA6662A1E2633F37339E2A9A51A9BF67FC2A174B5F9501BCC26081AF20CB31C515AA71B16058F74D51B89A6E491F13DF9C6B5B4B57AC71E88BEB4409223D99ED495EBAA982B8D8A32E4E67B15A315584BAAF00C5305E325A7B0666A271ED67D1A1E8DCB2109D31082AF3DB9218E9406DF210BD482CD6E4AFF5585F118E220F4D4854B4AB5F5A2B8830205874D87066E2C895B66F4608B83A008D51BE510748CC6D16CD309C3CE27938B1CF5579F45F57F615AFD5B5ACDF8B5FEED9725A1790A99BF40893B9F04E307288FD72F5F3F72CFC4F40DC86FC35CC09F3C4FB014535EB2328772B871FC5A5FCEE42BFFF32A92AABD55BC2E9067F2AFCACF6002F117C140D17CAA5D2F18F84D1E0DCB66DC1AB64480B10491B63806192447D994777BE32EEB3FE96C597D076C50C34F0EEA48813358D5EFE62D82E15876E42B56736ED25F1D7E6D8D0D67B4454081DB108240D09067049F88D23A98B0B37C4D70016F963A7B0BB01B6A64EDB6214043087B9FCB049AE8B36FA2DE2A25741DE3DF1BA540DB504C1841158E8BD92564198C153ABCA581B746250EEEF8BB9197990F260BFDE28718168418BDBAFFA4B97BDB8D850E8C78488DE86B150709832086051A36A97C54F0ED0515AB1DA7DCC1D692CBC4C8077D328A6E3E142DCC7BE546E67DBFCEBC04E42B42E54880BE861046DFC9A432BC55EB05E466A204A2E9EEBD081BB7B5C5755156434614A4A9EAFFB301084E87A7F30AFBD66CDF664FF0F28A5B7798BC821BC99E90A00635664B2B23FDCDF12E28AE59861A819E50C44159BAA8AC1748AB9BE8737E15C0CE8CBC56915ABB39103675BE06B6CBE3E30336CBD4FAE5859B2EDDDBA22A69ADAF1BC62DADB07D5DDD32C335806203D3E39DC3038E9EBEF1F9845E159F7CABB26C634AD752C1C89AE1F5FCB190F9520C3881ED1F6998557FD452212B519E1A94D79754D044E50B261DD653D2E4818793504D1884983FD6C476E7DD81021F6C6C6FB99946FC879ECFFD062370A9B3AE26A2F040BA35BA68A7280E381A62FFF02B65E346921911B210A2E333A9CC2F159CC1B6541B16FFF73E14EB1F12CB60CA1E115CCA1F1AF2E4ED47BE6BBE5B199A4D25B17E3E1DBA51A71722ECBD61C0DA28E77FFAB3FFACC31A5F6DB0968821847087BC2F1DFC30032A1873B677F95D802EDBD77C4B34065C747292BF693CDFB199B2321F296E0C939ADBBF02131ECCF92010080402C11041439E6170234AEB1C81F11B390E17BD31C400DA8CE9EA9E719F795C75EA7C88BCE333D7D4E4D34D3EA12B7EB7EE3476F93D453EC72E6402414CF4ABB8D2D4CD29ED5BD2608ABCBD4A861AA123A13C7C9B6760D381A573540372BD6A7B517F81253674911BD69D6EF7C71236833121B923427306E46DE2CA916B954A7FF03731FBC10A1F9FAB88D1A589D04FAF7646FEDCC417E0A53A096CC36342A654275051DD951491373F9D81F58ECABB8C7F8EF39EC7346D833A02418140201008043684863C8375224A9BD7E21E0995FAB2E88B58FD39533CCBB0BF2E6C2C7E3948386CBA4BD4B250C5FF93480071B2EE8CD1CC8ED1365B49D83DEB279286C10AE841B3D115C040D26704EA2ED4B81E618AF34A48F9219D1F323AC311907C73D9D422541359B500982A35E5344EE861CD5C04BA8AC561834C7444EFAEBD6CE2FE6F2CF0BC99F00A4E76C949689A3A567D287A31A1FC8293BA69B21AE213087EE12D843E3883873661E8391F2FD013C280B8AF3BAD43DBF2BD0BC7C601F277B42217427335EF7EFA1797AB97FE8FEFC99D00E7CB01FBEB18AC46F1C9AF016B931AE66FBBEE1A4C880DC48A603B99B0C3ED5B33ECA4C34C58E2653954E973D61C0D07EE01391AA8BC2269EE3E53FF64C1A82DAC0E1E1387C318E040C55D25309B561721A62F144B05ED29A222B704AB456490E9732A60267F2108A0DFD392EB4E9BCCB1A987DD90D1293FAB6D3788135DB56AA039C65930DD62DBB0F8081DFE8D0DC4C929C414C478E75018065CA9B15B62F6055C7709EE3187CDED0E73621F6C4DD4BCF9700BFB878BC9B254001A57A27FBD2B9BC6C0BF7022E312F72E8909F0C24D1BE99303A4F59AFE5047799AF09909F131003AD3CF7E17AA09C7ABD4B42D06FBC772553221F1B1511CB594717EB7530BDDE2908BB86344DB90A672FCA5D01B38E0DEA646AC34594646EBC6EEC814802845002ED0F216D3B63A8CD7F40DE18D449B3E786C17E6D7E818331F140B5FF4DD07895A7D41666E2DA13AB8AF2AE49D3EC37FD5CC7FF3320AF55AE5833CD1F88DB42CDBE4380E19786269CBEB5DE6C1E7B48D94CFD26A7676B6135F4747965C5B6AC9D6EC34E630AEB2E0FF59452F522D40474340F8636024C83AF85CD2DDB2392A07899E002AABDECE76CBB30DAAEAAFFA90E53BD77214DC1042F3AF98F88D1389DF61BCA496426D3429FCC16AC3B41F4B330F21D3A6A72709790829C10A044D1E7751E522BF5690E3BB885ACC88B7BFB3DF69C4D0872187EDBB9FAA1BF77F89EED197CCF55F19B2C5AA487C9991A21F80EB5500D3A98199AAACABC153D3F155DACDC50D9C313FA9C2FE6AF1DFD5829130D875E20D4D5613714383F493E30201B9CA9B232A44BBE8F1CA0049FB0CC186E8BF3BCF5DA4AAB3BEA7DF0FF831FA133984A7F1D6D929C57F7B79ED118DD324F315C0D1ED7B979F656BEE9612EB33CE31FA01C7232910862CF4BD83C313C146D1D15CF9089A885067A4586A3B30B1ED1B700A5E42F51C9B3BA51FB034CB38D29008B70C7AAD83B3E29279BC1A1BB1B501F7236737F5DACAD7E7E9500A9E6046D78053586EA204E4C6BF893D5F3D75ED5BA6C5A1E1CFD698078AEA7586CE05674CC96CDE416F0EDA86A5EE0AD1303F2FF99661F077B29199831F7438022A71057F370C2D83246DB2B6A929AF92C67D44E747058791874C62D20460539ECC21FE4B38DC9B6D21558A2F6267AC653C9BF97825FC9E54483102E7EBDF70456326238D51132CFE08F6CB7B490508E708A098BF8CDE41EA9A6651CCEF9D23C86F072B6FA174D30DE94BBAEEAE22FC23291D20A134455B33E1F46BEA803FF060A931C9AEA13AEB77FA93B3B633EEE7F672DF6CC450C2A33159A89B1600E8C7CC7B448C842207446F5CF18DF716282DBB239E25FA12AAE76C4E2B3CD11ECDEBDD94978DAA89FC7C586991861F48C33EFE44BB550C01DABBAA660986BCC0F99C591AF43DAD7E5C8B8EE7E86A613B64597502EBB56AAEE36A2825AFF0305A19A9C9CDBCE08820CBAEC59D2A011434F0B515B35F1047F49300074FE917D5F3AF263A2FCB5DCF0AD975F0D3A36021B89B362090B08FF41DF2722531CC7937DB08F85FDA635F5CE709083236B3C48BA068CE84004B73A134672F55D650FDC33F696A998BEDC72E962B4B469FAD3BAA8ACCC8C7EC6D90506440FC5D313369B847718A38B85B40B48AE55CECF05F128A04101DB411FD3A7E7DFE0A8A2814B29B1B7AE1677C3EF600F53D021CCD73B1C3DCFDD43085FCD21CD1DCEBD75F2BA4EF2105429A43BE89C37C8356D5AED36739362580E4C7414B93E643CDF76022966E57E1B5D52F60C2B48900885E8A8F96B08E7D75FF3069ADBC416CAF0AEA6B2D38FE94D603E32ECA39345F9585E4C0FFAAA363CEBB3D6473FCE6A48221511E5AD96513740DA6E38FAAE5FAA70A31D55680455542C28DD83FFD781BDBDFAB49F1A25B99ECE3CF3D05C1F7245ADB2AFEAC17DFFADB4346D6AE34B4F7BF0CA2C5CCAA301396D290D603FC1B0DBED5499EF1E658DB0F7163845D060C87D1C08101F6AA2EEA036BFB890F0B16674DBDEDE9CF1149B9255DEE939DD96F2D3678C09781976EE256045DD703EAF99FAF45A7CCCDBF98A20C64D79D5C8672FE150659E5E4A298156E9CA1C843576427AA9916254F55D2707B6FFBA2818EB3A8E164AB0CBF8D1839FB6ADBD808681B0BA61DCD067C7938176F6176441E49C3EBC7CD98C575A190CC5DE3C3481C5B718AB25EE0E80C8DEB2FC9DC3DB293BFA769B488639D661BD16BA891B94E5EF144D4DE0D1077BF467FFA9F2C1AC19A2CC91A0C984F078A022AB261DC35BC18956985206D8F4F10C0744C76AC579AABB2C8EE283F04C5F188F557476A5595A456939E1F25FB673454F0D25AFDA5615E68879833BFC27F7034EA9397D5FDD00BC2578975165B537A5DC510F8625A7DE1D9007AE8465752A254F21F72AC11131A19FE5FE37EC1B4BA5CEE06021CE878F3DAACC950FEA9277448336A849107CA4AA48AAD725944C4BA220C278E4778E79AD6FA55C29F1296866363E1919B4C9390753D208C29452C8E8D796CA48336C740E4910D2AE208CC7EBFAC53F48CBCFEC226EC24DD2C84AFE95B0EDF063E8644C6250382847F614AA749E3B7EC32E03F4B13C3E7791B88663F1DB8E12801670F04C6DB8715DAF03BF6DBFEC6CB1C8FAFF0ACB283CFD741E368B96ED4290E9C8F14336535F689E1340CC8714531EA6479577FEE21A48663CCECDA441D3C341FB554E3A1008FAF5F2EB303C6E7BAD2135F91505AE7D65B50CCB6662D2A15B58BD80317879255FE2AE0FC9C6D830481A021CF90DCB16C0CEBE7C183B273406342990105F9E504BF3BE29921F13F4A5E19D7F78EDC3B615E46E580E03D7249215736BB2AD4D3A3B26D9748421420578A54E89B8F5283A713172F652FCFC91069C3FD4309DDB1E05FAF98179076D006317977C9796D214522D0358FE7F0339F5B985B52188F07A59DC18F8819D2F0FF1A718132B2C21FA22D42B749843FB6576968DF2FD10C6C5F86F128EC767EA4FC04423479A293874E4465D6BBECCB4AC32E2863BB751E660521B1D8595CB4849F5D408C70B7A4A320C7020169A6A49F383294EBF11AE608E20F9F67F4DF6AB9EB3BD714518C19118A59C7C5AD267BA0254A6FEBAB4BB88DD26AB3C2F402E633CFB95DC77F6C39EA4E5F6D1678195413F174F36F73B9495A7260BCF01754AEDBA791F732F78C69218255F289C4DC7DF703AADA1286410E299E0FC86AC1AABDB615BDE152950A3366E2BAB0698285D7288281519A67B42BFBBC9CD8F0BFA89181342B5F9A7FF1862BFB3313CFEC346CECE2370031CB49A30052E185B92E4979CE5192B05D0F9A2AE7BCD76C6984814615F85FD0065D5ACBCAD0E92587B9470CF01B0D64BE0A6B83A67FFF41DA631CCAD17AA93FA986B4A18FBA645D5BDAC66413E72A8B26AF60D1FF0464D3320967C3AD3CC9FFB376DF7F8F513F41C378EC0A290AA7AB74E73433324CC7C63068BA63E2E2871647E2E1F690EEBF8CC2C23831CECB3EE948A851C4302BB30E73B2E8E3271F87D5E4074124B2F9D0A36348B67A07F7A375BDDB25E7B44D6C673B77960085258792DFE58614F0C6F8B19BD44345E0680F36743FB444D1F5CBF269A1E6F658238DC62220A700A0EC1633F24D25144920DA75F2F8FA3108CCA399916F0A914FD11169FBC54BE3B5744592FF0DD5BD703DE861DE37C855E1EAAEF62F1328CB1720794DE7A9BEFFEA5170494E2F813EA8D8761CDB2EB968AC8EC602534AD7E293F6C69C09E4188040FC3FC13ED5B76A1221AC61D7ED2F1969F9DF0AD675ED7134B3BC87A307AC58972CC215E17DA824BFD97959FB6003C034B1B2ACF16F19ECF62F7B66CF61C1A134E8F479417DB9864BB709B7DCD2522964CFAE9C381DBBB11BAEF3BEAAD710F37E56754BAAC723C27C87F64BF36E0A3839FAFAED25AF308C45494E3F5FAFA3C0CB24D59CDDB93E01C153D9BE9D6B21252FB7853BBB08EE8FCF5552F496BCCE236583EBA3DFDEAF7BEB670B0B5AFBD2B3F5524EBAA1DAE69796D645D1AB3BEA5FFC98F0119180225E46E0E3D7C27B5D4EE3D16A780ACEF9EBE9A87005FD3C9E49EE44E7751EC2182DC9E27AF3DDB741FAB6E26BF4774F2990469BF77052EE99A6243183DFF5AC23117493E60FF533CD90ABFBDA5E00B72843E6C85B17658216131CEE2DCF69B258B6C2DF5335D2D6498332486E02D52A64E89C1BBA3EA70153B61A8B49B55344FE1842DD323404F78201492B88E644DF030AC2FE7346BADFE4D340FE2F154A308B6D899B2C5CE1E84003C05509D5C8F47F89A665655F08085AB01A527DD37216FE27E72E681CF34BC58D65A3538213199AB1AE9AB4B627438C3AB4101DE2B0203F51B41294E43AF16DFA39CD5861777D66DB5188B2700A18F69F5A82C18F26DFEB4839489178957F7136D0184B72FB39EEF63BE06CC9BF0796497F1EFB54CDAE634D6FCB0ACBB0667BA9F761B9EB3C758F74FFC10B8F5627CF1C56E8B02C918214FCC54009A068025110480434A50D12F6808501F1633C392AD3C7722179BBB9D99608813BF9DD2A18334142D62005723F2537FE06C88C52BD9ADA164EDC9F69EE3F0ECF11D8BDC30A0ADC0E1AE5AA11E0EAD96173B68105CEECEFCD1DE61E4E336EA4467C55E2C0FE28EF7994109DD64105CA787F84054EC66F044233A542C25FE939D6CD2984EA59D7036C2571DBBE9308D0AC8AF14B34DDBB5A6541B1FCCA275B7952E09DBB234F7B6B48AEAEBE9524713A5CE38F4E4352AFDBFB80ED2019785EAAB572CB3B701EE05A110512A7E2A6739308EE386BD737A5E1FD361335E5A6D85709F4AFDD97BD920D50EAB201BD1E92E13063C273FB3B32DEAB7B6D465CD5D0822F74C61E3645C2CDBCF5437779B51C73DF9F21E0B7613E9199B8FB994FA88D1E724926F72F764CB6339F0C90918157EA3CB0A6D23919F795EE995DCB29A95BA8F90F678B55A9AF5466B0CB74C29AEA93F9194DC09C4795467E501806548E24FEC1D420FEB5A6EAFF9FD3B671EB6E1C4BF8317964B254AAD60D8F32680640740D7DC4521BBE7E8688B7EBBEF42BE71BC3907347ED243055580D27B870BEB78D671016E6DBF7C40424B9A5D9DEAA11ED9F817EDD25BAC633FA6F6864C3427070056528BBE34B782B8E666E6936B9FAA9A2207CF9E369A572CD2BB3EB183F9A6144E85C137799C796590FF56CC2614901734C2C8A947FC945AF9E2A8819B8EC2B4564A8925AEC1E18F0736E061477134C28D23C113E46253C7ADA40143D1C69BC0DA2FF27E88FE701ECB591C1423D2E335B2A40DADD1D2A264ED1340105FE3D3CAE2142677C9E79BBD8C3FC28C26510E395AE5FE31210A610E56288E2A8F85D0117784259CAB5F3A1AEEA1C86C3C794299CE5633A621F9D62280FBA4B832A0F4FC81BB3E63DD75186F22231D05FE904D4EB0AC1FA6FB493CF0B23FFAD84F1F81C02F60AE1D403438FA0E94687D627C33B1FC0F1456AF48AA25434137A62A064EB12AC409F2C65697B4DCA772DF25C24E1123198E630D7931B0CD0D7883732116740CA0DF393B6877F61D19EB53E1B183110688566003E3B7919117E27B9C82A76CAF88627A5A100E61E3A414E4466B008EA5BF4C9F7F117DEDFFAC0F3E611289FFC05334E9695D6381D9C9B01CE5825BCF0E630650512A0EA27C4BC61235F8B568F52D63FDA76F9684361FA29CA932830A687B72A9A09C604C5DFEF8861EC7796FA29190E1A82A16BB19CD2C2583DCB73E04AFC0BD73C5F18BADE2D0A108F3E67294DADB5E33624FE72EE721747115BC17B62DA213D49563E4F57D7550D455DC0756EB9D9851D1F53FF362A7B7458CE520FF5FDD385326434450D449DFDCB0E2BDE42E365AD2F69429907250D75AFB867F489F4B81B363217EA944E0DCC887FA923BAF1ABB8748952B7EE0B9A179A8CEFFD0A103F6D1890257651FB5C9D791038DFF52646B823E155E2FF88D84E722C0E343C7C6AA42394B2DE3CCD7B54F57FC4BC9301E1EB523D1496A855859D5A398F531DA1044EA7ABE6DA73E3F0FB7017948D7453CB363E61FCA2458428CC47D2783A55A4FFDD0D82B6BEF230E77F25849A6165483C93820DD33BE2BE063CA4504C8633E52F4DBF8EFE4C0D33334A1076BD0F7A630604ABE4ED39352BBD5050A65AFC3070D190276647983352150DB1F4BDEF2932BDDB20E829B76D2E204F53B8B540C878C709E10FE9BA020D6D6BD6D8E99C080F8BDD1167AE9CBD56D035B4B3F45DD2A1EBB0A2DF0FB8D66DE5440FE662016BF0C61AC6D1D8DF0D22747C45FC5D112DD97CBA3B7A459608C69BD8C150C5670FCFF903FDF44BC5F9A67B1D06977C06C65423136AA34BE6736AF7966C66F9FE0B9482BFC812648BDDAE8326C0AAC8555790FD616974887A5A185C9CB2D37F91DF1CBA938F1772904A67DDC481972DE6A3D05B3C73C4F06B6A3F8B7E101A01F61400A8AD88F9FE227DCD920704835680A22E33278D70741D88CA472246A9FA80CDFC1515E8FD6ECB6D4366C6235A147B332BB9073E6CC4B4337510E9B3083F8BFA0F33C7B2CE1C5CE325207AC1C076F1B779561AA6ABD97C93F9DB3A63A5F94EA218D6217415D78131EE0D8F2B64400E5DED3499C2675E4139D0E213CBC13B2F7866F1E3D5641BB43B1736BF78037F3D2F870B0F19AB8721F271B26FE4F8FC8401B469D3D53DED3E73B3B40741B4D0C02136179F2B92F4444FFC6EDD79FCC5E04D7E92F7BADD7AE5FE8868CBF0FF48AC0A907BCC8EFA2C3A4D74800CA528119EB91263B28B55C543E1F2AEF6E541629ABD6B5BB70BC52AB7804E2A7DF376B2B0170C548A7137AAFD0DC39AA3B2B0CA33FE1132B05FD592B320D4A15C555211F6838E018019A8901266C7779388F7292AE0152BC44FCAAAA5D11BCC0B0BB2B68BE27B8BA59443B48B2EA305B36C662BA148C38AFC18409C0D0381C0A93C6BC01199D27382A5D037016B990E5D3144E1321C8401431C0ACD89CD54AABFDE27CD07566BF161AC5CC99757BF6976343A7460B4260B020CDF8C9646E430441365BBD53ED263DF7065B9688CFE1B174CDA6DC8763EC28BB9171BC56A044A07C89A976EB4E1495D79A67B4897A51661DD3EE613C7354F4F099C14AF30DE13BD6EA69E1BD6DDA7F19633FC9416F7B8FE4020A4EA54CCBB0AAC4F552CE5011CA6C8A693E65536AA5D66F4608B43B496297A9C25E81845CA2E2FCC15F658774AD90260A179D9BCBF34831F782BDC01DA7C027A54CA26BE26752B5B7AA5B16804932564E1461EABDE9FBF67AB0F6EF82C09A149B8F6809D580D445F001D25EEEED066E06FED8FFE944E353D8C7676A39693135D3449AC0632934E5640C14F8E6916F1A89584FAB5B57F9331F50ECBDB6742ECD5B79EE63BB70C852E4F23379C783AF3DB2AD85B9A7EE40C5BC6CC2165F8F74D6720DE3B7AAC1B4327F5D0E947C8B210A7AC53C6F8CCC19DE2F106112580B4F27A9044761590EF64E01A5FA544C6B0D11C5D76B4F3FA4A2B0B2CFE93D26F83A602418140201008D4112D34170B579EB32896414345BF731E8653721F8B70E46158F0992D0E772E58E29767FDED985DA5F8A318B4E9FF8CD417F542213F3B91A30ECE039D2F6590ED773263D22581CB9C6D2AF7BDC77D40FA77A31B2A428093A0409167A58613F91CE367B0A2B4C61BFE59924504BF6A3C9EBB0AFD0C59D4FCC613740AA94191C58DF9E0C30D622C3D86DF1482F86E7058C64DC691AE6BDDC96EF3F21CFC6E5A86619BA630740D7708EA95E10A374664478850954472C58079320C489F2C2046739A167F10F86F834D35C267446E410FC4C6A3366797C56990515FBAAC2C5A74004DC0423EA50080DB2D84FA7F251469206A0A5D05755611BF3BE29743411830C7F617C7A1BC648D3EB5B85B5EFF1B13EF979D9F747563D18031E4CE7E4E9F1A20C3F2A57A98DC740E2A99BD67E41AB5BE5A2C7DCEDACEB31E9209A954D223D698C602070E06C040083B15C109DC579746876C47107BA4E3BB84A38A9787898B7D76E7A629C45100E062BEC311D6DA351C34990E9D992C31A4146C88D9DF65420AD780FB52F57CEE690E80090BED9FD16D123DA5370CE0F098FD770DBBCC2216F545BB115F15F381B50E81FAB2FB5F57A0F783F88D661E401110497056D351C8EACB66E1BC8A2757665B02A467BD704C7CFD991F2DBB83D206FDC442CBE99D863135C41E50F8FB57ACF6FE25C47B792027DEE4BB829CB94C12A301B2D6E4A406B67F0BC2AFA89FF0AC53BD23037073136E29EAEDFF0BE35993FF8592AA53BF8AAAB99E2896F0339F79CA482969F78281E18E93D402AB763BB7FD9F5B9AE6E67E0DA5F46164F724E3D9FFED27B284FA6D0166C920A6D6523275B5EBEEC886A66C175415CD9DE83FFDE013ED21029DAAF6661008040281B4D59F46B1FA84460FF1D284CF8F648AB10429BB669B7B11F3D0B868A8036C028A7F44A6D3C557968FC49B99264B86E1969BD90702731DC2C08260C008F07050109A687C2CA27A6D62F19631009F240B49560DA0C23780C3DC00CEAF06F0C8D74A809DA704DB52F4429F2B64729FFAA9B408E87F30955B0F2F7E573BC5CEAE2E556B11094E8D636C4E27B126C1120F9C15804107525B0B6C1C2C8CF696D9B3C9B611ECB3FE940860DA6C32CC1C42CAC687E44C1DB40F57FA50FE2DA29687A4FB914A9B48FCB8A01A378A2649DCD35D04124557D975A6CF03D8B7A55C5E0ED44C12C51E78E7402010089FE7954522252FE2B3785058FFA7DB2DFFAFCDAF5D1E96432E41753A2C57D48AB4E0A7ADFDE6A2723AF561B8E1626E8694B8EBFBE83B554EB86E1612C7DA4EF7FEDA63560C2E0B2A64C2C70DC95677BDC94CCEE80AA1DC7CFD91C624F06BDA64FA67055BB54091C168753CD735D2CD79791D81C98E0D68A0666C83670C177FD2308D02ED8F0E6B1B06DE49B60F9570135462732B9D99ED8BC2870A0F9359A8CDBC29A691049C15DDFBB8BDDF99C0D4CE032786D8EE2DD6CEA2FD644FF94A7A323D9665B36CB0F32EE0C27293D7F658882D98F620282C30B3392865E5AE050B1953B2446154BDA0B42C60B432A636B40B1E8E2CB2E72017A17EFD0BDF3780E94655096A3A0B9A8782C300D8ED482CE83A0AD2F5CA4A0ACBC90FBCBFEB28115BEF2A72B4FD888E062E56F500B50212EDC4A9C74DEBC8F7033436E64D7D70F6A62F2CAC44907BE9D0766566830162C6ACCBC0C74EEABF8F887935D5916F83B2983E1DE9DC88EB4F1D7BB5E7BB6A72754C0BE2530B24CAE063BFF23D6958F13D71C7EB562BCA79FF6D888692F97A9E7977F67F7C43323A262E4782B73CF6966E254A28A8230FA6DC95F1772728CE1B7085ECBCA256717D5AF43F92969400AC914963B220B2EEEC409C15EAE02C4834AF5EDE15C630823C2706FA377CC3037D81943DE8258203D870EEAD80F379FBFF9C8AE751788EBE10DB57478D3DEC164D7D0F093F6E09C200F0F17A8BD46A5433BC5009E08597BC577BDB37E3F82F5195E4C1FEFEC33F4AF4DAC0FC81CA95B3D3E43C411AA355F92FD3A3167A42CC617F3BF11524E42858A74C757776AD4F1C6B78427604B7C332AF94B60D71A9E66F96509EF6CE4F715FA4C06B7149AC5BBE1ED10B065AC52E3193514F16AD159FD7ECEB0D940EE47FC0443C53463016901828E7CE1E02BEC563348E93569FA885E6A1A95BA32D5AF34C8FEA45548A3F4E5225EA247D26B3D631813A0660A97EE44D42359940866E8E83DF3B5329DB3F4A2ACF234901BC17D1DCF5A8D997E84F516EE38B5F16A96461617A001302CC2C74BE4FB6F5D96AE07DA801F69A4B17269D55274ECA5220EB76E74FEB939D0EECD88D84AA2F117BB6171E307C69420C096F35E313FA31F24DC72BFE68B39E3B165285A437501992C3A880CC865EDD6648EA24AADF32FE020ACF371B0827682CBC5693FC671397BE448CDDDF429ED1D7B249415D90BF175E3E12EBEF0256F793B4FDED120A4370731DF6D30C50F9A31D3B42BD73E35FC8CAB0E1C237F5423E9822996A55F479C2A0536E37235EEA8FD6C6552285B7EDC44750CA1D5650BFE96F07F10C81FA3F62A5FC54FEC9EFC2C1FF53EC3F4D87AAB112BE4C4157C12F6787F00749E187AA7D9545DDFD5216AF482D0C28AFBD4F8AAFB176AB3D66D40F911E23A394DCBB8B06E3A4125C2E0D1787F7B87AA235D5E6F6B331A3DE2554B94C9232B20962DB969DE9E9FAFE316AE15EB6309B8AA9854F0806147BD3FE588781A4DD857AC960A6A8E9CE2F1A2544EF6ABE8737DF5A8EFFB1710ED9BD01461635A83B00140BC49B333C68E67E972056C23045FB6CD6A7903C144AFC835334BE15FE868ED62E462C303D0DF102117FAF06D79131B8B742598D082D0696248D702306EA6B30816102CB041E31786FC252F178F091ACBC35F5DDA14BACF3D30E84BCB22D87B0F89F9A560F5E6398C64698925F4123AE16648BA1009FE6494DDD9967FCBA765F0B5A86E8C40D5E2076B4FDF903E58B9A7B9A15AD9A31808C1A029AF0498371D41F37F33B80048340F6013B817FF943FE98218AA4ECA39A51808E0105093FC204C92C437E6255E0BB40C0A771D61DCF2FBBAA19469F4CE1643109D16D131CABDB6D84AA75468637149746AC65B75E6C50903480E4A6BC43AA0AA996F072CC1F18B13A73399E44D50CA14F76F84391C3B0682D6F8B73ED7B17ADE12585B1F37FE2DD071B0C91B397E4064F9159B2394F8987EA13F4FE55A9062FAA86117D32F9A5534188C080B4C8DCAC755995E2DE5705D9E509AB08EFFE36B010949C799832168A6D14BEE9108E4AEAC21A9F30F060A1370CB00A3792DC8781533688F0E4141D2697E39D9DC848D5DA19D6C8B9AF7D93512D020C3475867D306ACE704119FEE5E54637ACB8B4F9237A6562FB4A3570A13D9A776D30D2DA3FAF1B81FEEFB66A9B196A62327A7719CB4CD0F7E374F684AC2BF7F803A1ED094130B11128DB5B5124AA7C9D08C832C6415E58372E22E5922EB4BE625DB87014AED3093D7ED987F969E461D8F02F48B3E6DB34DE00B6875415AA8457F0A793AADCAFE35B18F7776C371C1612A823C66474A10CBF115682F08158CC22CE9B108405B2F3A38579DA92BE52C8940BB716BB828669250D6119FDB4FBC9FB6CB2FC08FBCB8CDB97D5C8078AAC056131FC0FF7959318DFA9EAFFF745C3858B5F68C9241E9095581D6796F01C5975DC18F50233580B8A6E81C233640E8EE8F85B1AD5269E7FAD0CB7CFF55D3193933AD251C28B69FADB46E18F1872CBC9031FE7993C4DBEFF625B2919F5A9E7219FD1E39F3415190315290DBBD7980D2C735F55CB2AF0CB276AD763E12D9F59D75FE7FEE51AD6D056FD8D6EEA08CF8E32C1D5F4DD390C7BA20E9FA4E77D7B36A46F72F448360F7156E5E52862555782C8470281A9A154FD8D2AF01E4B1D1E8401F6CA071891D1A85A30D1950BEEE2160A47AB3BABF93E5FE1678E89B38D9D7966DA446FE451EE9AD13DC01120B7FC22DEEA2562391368BC98CFFFFF8C6CA41EFECC9580BE3AF60486D71172034DD9F5A1485F4B855EE5DC9EB904147AC1405EF4DFB6DF4324399C9C4B8AA5C7E8E3E2BDCE57B4027F538824FE304AFF85B10702E0ED96FEEE32941CC98EC84858D22CE9E963326F771E8D1B38B3F67C69C82F0381C0172B4A91097304EDB94BAEFCD91AC62F298C7FAA8FF6ABE0FA3F7E8EE18018284F980BF84553A61613523CCD7C2CCBFEC0E85BAB216E65C76A2DCE4C98553D0C90D8B1FCB34B155E734B12BACA6D469D0E51394B929F299EB52B620BD58F8F8A2EEB586BF32AAD686FE2512A6C7CEFBF943CD57F2A70A8E3D6338CA5947EB30ADB8547205CC27DA6DDC8508B7A6446655F8C559AFACC4285D27B048EC538C6F37008B2FC07F82E57E13560C5D99BE1DFCA605DF3BF3140CC13AC55E9581DAF3B91FE96EB9FB7FA41E3B972F8CC5F5FBBDAFBCE806022BA2858959D1758EF56F7DF8B0E09712376CAC2DDCF083348DB0BB41DBF93657A7DBE0E7B37E85CA425B87B48733FC29B1E12FE4000586FA2DFFB3D872A3EDED9D68952DD098C1BF47217191790CA9721481C0CA46BED8E72417AC689B93892F90E42B33DF85231B2F764FB6777900404D2EB0C644A8787929CBA754346D932886A426D86822B8C08B9C7ED42197DA50480F714F24161B7E34697DF2D8E2EF4248D592961792C515ED70B69E1E459057F6F03EF6275E075131B7945758FC9E808FEAF23B1E549894A7F6CCBDAC0D646712777044E749BC077C7246CB6D7A1FAFC7C7697E1E5B8B834026E083F00F05E20AA1E7F6A1A8BAA35D857CD02B8974BC84E8EEB28E44D58F4DB64293BDB199797EF3847AEE0CCB47C53BBEDA0EBFC4F7491869C450672FAA20BD0F86CB328C672E37D0D76DC69C1633784977FF40FF046DD71DB85EBE8FF7BD256560E45AFE8612CFCE6E060E0BCD2AD8441E8E6C2BF690FA8B1DC2E6D52BDA3B579E8ADB9F5C3711520A8A00684BEFEB385C1FC0AACBF912E1D046D62968A751DC0F76CFFE78ACCCB5DEDD8A86E46E6BF0F2C0C609135E34E5DF339864B43BB5FDE93FEF3FC512709678C80943D8EFEC9234C0B03E89211AB8DF1B65959632BA2CEB63FFF6D4A70689CE2A9C04C7211A1BC19C749D15F6F841C06C4182C8DE47C963175B2ECB2B0D643ED3C77C686A3D4909E93BFF65F9D12C9590101B74D52C1F3DB9B1D912C7F7A56B789041EBB63EFD272DD650AF361A62BAED1DB50E57557A2D8EB1B6196FD5CE40BA8A4C8C3F13A27EB773CCA5E117FBBFB5FF68C7B377113E54ABCFB6AE95A4A6ADAE6BB49613ACDB37A8F64970DF86AF22700F3BD9EDBD07F166FE7CFCC7C4206937E98CC72D37A56EC431819657CC87FDC82A994EFE55AA24487AE1006B0E050E1F97C39CB0D5086351C532B585CA32199FFE5538E08BB87544CB87D990FA876BD93568FCC48928D0448C4E5B53A9A60FEC17FFA9978D7174DA4CAF0170F862F1FC20034E419A1FB65B7073817A098C97B50C46E8F331F40A03604F964C37D32036F3DEF0BD3CF54510B3343CA88F15DEEA81C4348DAFBB2381B3C57A448CB7469B803E162087E6F4919AC9B42D8743CA60E0946FFFE22211F28DCB73D1D4E1B04270A82E307C121628D1AE45D068EFC33360A646D638255822B03A05A6175C61328C07DF110574426ABA4A0B0048A9484A525C9B012D6BA54074E8387F2439E006D0FB5DE1DFD21BDF570C2C2E796824ED6F2FF9B02BC094945334E8292C3BAE24ED6A1FC017373A8E029CB1FBE7768BA12F603192A7D1D0EC3093A17A0A85A30DE1EED3F9564B15CFAF31EEE6D2468D6F1E2FB84A9AE7DA121870FD7A89AD81DF1335DA21B22A494F814A31FDF128AC6C55D214D254F67E404BF03CC5EBAAAE1747F2B910266F5E776AFFAF0EAA62BF03C7FD50B479EFDD1DC9CC99D9476DB7ACD630D56637F753CDC7CB634A6818567ACF6691EDB9CD49D4E420CEF8C07E49AFEC1D071F9571513206404D1D9841B36393DA8A251ACDB8750F26E26D54D4EB39005996984CA147ED04E09041A8D9550F603210BC1F934A12C063E17D687D2B23BE2993BFC6D3605B6A8C8786A69D7D9B643535B8DD91618410AA5CAFA81A4C9F9C44CDA806B5D3CAD19C9859FC303B1E55282A6DD2178BFDAB425AE4E928E0ED502EF940821C2D7ACF5CFB5DFE2BE88CB13B8FF5FABF06C855A65C374428ED0BABF513A81AE965531F18F1EA0C04EA3985C07B19704E335C2487248E0CC5E3DA6677B603AE2A438F23818E65A122D6228880110F7CDA04442CD095613BE9063D7243C2D873EE784584FF7054766CE2181551D0196F9B249DDD86239A9D62E9F27502EFDF8769233B9B28A66A4EB354F7786344C31C71467BDC3102834C9FE85A103252CA6E1E9180AD77755700A5E1985E212038A090383C9C62487F5573306E1A9AED4351CB3AE8F007A3D5C76F8CE9B4D496215779FFDF0C2207E41FD57E7E2CCBC23DF8889A1A7C336F000EBE11D3B94724A59EEF1621155ED80989F6DEBB430AB63143A04FB366FFAF8A046563839352E714EE6FF419BC09FBF0339F012BF588D45C37F6FB935713718A50E1584BF6D3613395A4463360DB312FB3770F0AB9D2E5DEA946F2024742CE44BAF8828CEB5EEF1CF24305580EBC803D0D85268001E7E02153ED31B58EFF9E7C22CFA559AC7DD61018A9079FDBE305ADB8A7E99E30A0D743053359628E56552EFC320E68D2E379909ADE0911B5E7BA04C4EC1C1A39DD0DC34FF83377FE1451F431A38F1A2B6F5A4B7D53F3BD6256A96B5F214BB3E841D6A9E8D5BB67EE66583518222288A5DDFC35091891E6511B4800C26C1E27654C676EE5B103E38883344C7848A7EF18B06503A59D9E13183FE245DD745632935FE09F8CF565057994E8EEA65A4D3E17066C395DA50ACFCFB8979A09FC11C9160B48B41FBDC942830070BE8AF391DD453EDEB9E1B53D0E73C0028917B06C06663D5799497DFDA9DB31D0FDD14E174946F982343FE3DED137C86EE5835ADAFBB1F78085396115D5C9E2301D8128478A9B6DFA87E1B26FE65AB5AF13AF5B2E3997D33D517ED7EC0F68478BD2D8546351F3F4C21C6B82711413D85884DFE8E52208B521A048190C27F3EE86372E6450F12B44013B2820DA20D560D3AAC3352AC143AEA3A6A126BB8BC186139FE8BD300647603BAAF93811E00F2E393E444E03C0301B682987927EB14CE2700C7F8ED194C0C2300BB72D421323BC5D0EF37C095E52E0DCBD9672E986380A30E55178190F81DF5F6C4647C64383492214331F52248D942F2B937F7ED330A96EF5C2539FB011099A0FBFBEC0775DA4E8060E09AF1966425EB92AD47167082E2115EAFB52E85DA0693917EC1CE4C80F4666FF34BCCF82F9C5826D32D93FFBFBC81E5074055C8DD16D35FBB982C79F08A9E95B0FD6B93C5A0FAEFFC13F7F5B283EC072C4F6AFC0DEF29A3DB6209A99955E448881D5F0DEC1B6C21EE508D326383CF12599F0F045CF81B3695830337BC94073DECBD647571E7DBAE621CFFB657688A7B6CFABA26FB2F7410BE7140164A290104C96FA541C3C38011A04070D0B0C8BECEDD3CB9F120BE0011906142075C867DFC571118A9DB60349E1977D678234E3FA883F09D2A766B07F1C4BCE753C18D65047DBC7D5BC8647C3844C5AE891AB0C57626DBD1289274BE7177AAA4B00AD50DA51132ECB0494F969E3CE4EFA2DA4C717D41BF49C278A669952F9F62960F7D2886D19768FF87BCB34AEFC949BB6FDC6E46DC124FA8EB1868651FE8ABC1F11B16C5E1941207250581A54FA4DE47CAEFE9E1CB1E0B9618080402814020FCAD813554E4A3906CD4BB12AF961643D3C386060F53ED4DF337C1A5D04A4DFF142314A8CF3DD4CFD24894CCA44F7FFA78B52E63D9CB1C88643C08F3B02DA2CA14D1DF80A50219267D17D64CD162D2EE74FFACF4C7255CFA3F0A37236F1CBA45F4FF6C24AF9C80596C77FA951A42D85854097C04C94FFDDD9E86C5825CFF9820A547CE48B04234301FC0AB2DD40453ADE24CDE0D13BFF1E5ADB906664B66C0F1E38420E4CBC8183F80FB7F5A9896EE64C1A14AD500B3D25CD56A47BC057134F32F9A1007DB8B08DD9EB0A5CB1A0B9A654D9918792E27D358DFA394E38D835323908D6BAD5AC31A7A523FE993278305ED53A78ACB00D7FB7E8422345EB35D641D76E209EFB651F52AE3DDD2AABF094D45AF88588670A464EA05C6A4BFFE0112B640897C4A03312D5A1CC37ED15CD489F1CBBFF218430FEABDE15679B945C82839C0642080C3CD1B1C91408FF95F5ACAB0BEC6218BB0C1CA85B2BABBD723986DEC33EBE8DD36DB8513C55EEF882FD3869E2D7814C5AD6AE23AECDBC5F783AD9CD895A42DB9E9F2C69C04AFA2DFAA970D1DAF51046A34B982AE857E0B346636ACAD92C0E6D6B9B35EEB0582CBCE6CBE7EDD063CFEFF3BE6F0BCFDD84E4FA291168B29533AEE93C3443EEE9321151B849FA561A4BD33E87CA0D442BDCA93FCC751644C43A0F87227A0E6CFE3B620A9400649FEBA8CDF7F8EB348A4ACA11E60B1268423DA5F32840108141F51E70474804E304E5BABC8310179A3271BE591306BA68AA4E0B9B5744AFD6AEEB500D464B5196192A60D8C8D5E30108D97C3A79F7FA92C6CE0372A0947F8B2AB2A273B10054B70A1C4EA5D1ACD4000B0CC8666973A4B6CFDD2A01FDC5C9717B5CFBB909A2499E4D6C2EE540DC5CF159265E0F6706235EBDA3809FFAECBFF6FBF1CBE7366162212DCE0661A0F8B771683AA97B2C5B314666D6BD355AF96DE01A4B96797DFAB50425B8C355AC3313562CC051756F6472E8F4F2915E63E8171FB93AD821157983717F5027B6B3D28C1642DF742302EABD2ECB4727C88394F9C0581C932971DC34118606C46D76E9DA5D2861F72896AB3880B380613306E142A6A2C14F39E8AB42A8001C43DBF337FEEC8EC869B4C41275AAEC8E5FC4853AED46F652AEDCEED5C0EB09C8546D2642C442F0B00B465E768DC4A425102A2A60AC067C5B4265B3A8016E53E26BF3BE2770A1030E044FF65C61905FED6C1C5B8E8CE7CBD6198F64162BF998031AE6D454CBDDC8B1FB02F423C051B24B251B6497443F229C615C4A5282944B59D0979863442CC854ADBA00843E02A50D8D5B7AEB932A645B02D3A5A9BDFF98BAB4BF4E3542688FB566424375AE6A8FA2430B5A2BBDF38BE88613B8D1EC4AC501249064318503772A8B71E589351C11D3A89A2B1EE4E52782D08DB2727F0EF3A1BE67303F704A00A4DCAED1CE8EDD1163DA1E1901D4BA0F6414D7770001274FE68539CA31B1D5D5E8BF55F8957A6D95297B7DD70DEF28A551F0AC1001855EE2F0AC322519BC4E087DA9F62B2AA0478277BA52715D25BF5A07EF1B6622024FC425AFC4F5542FF3557F4B44DEC7D9F36BD74C58FF1065A5B0EDD9F3F99117B9A6CFC3003C81698205B5F6293BFA3F7147BE670E966D364B96338865CD427FA45208119164BFE1E8E0E2BC2FD761CBD881DBD27ACE1F26244F8B2C44CF698B53300A61E4E065145203F3E41DE1510C215FF01B68278F90758FF87366101708CDF9EC1843012C02B471D62D692BDA822E4CA72974608472E26E618E0A843954522446200BDC428C934DC6FC68B509305CCBA8F36A72C4B8C4A568A8DCA24748964DE5F9B01EE486583327402E9EFB15439DF901061FF5F9DDA81CC0D41131EDCE5A5D3F3746D50838D2DAB3C40430D16A559F340C58AE4E7AF84E20788EA7CA8A4216AC6ED8E78968E2FA7367186C62AFC9B019C65D3A3F9FB918C805E63581A98F7DEA23AE72DB1D6009EBD409AB15E68A7C224A73F137074F8017EDF008DF4496A1ECC171A2ECDE04EDA551B460BB20088366B7954381C5FE1511B01EAB0CC9A82A336702E7275934C249AB23234E31E1E462D6E237108810CF14C0651897F3B178D648F1A10BB87FD029E213F8A208C61509438D492E4191CC3E4A84C50613787597AF907504CED699CEFB6A4391CC7AB91EDEE31C240D7E02DE5CB601719B519096F5408B6C1D681A040201008044A93304D68E049B55ABC89C315E76A8A77CBD932E41FED90CCB2F5EA4127F4734D56A28C113820129AFF443A58F33360E17746AB81811CCFA040D070F008B068047931DBEE32EC6B8C675DF940AFF1BF8B52675D0DEFB6F14DB5B2C6B75692AC571B96384F09E68847000EBC7ED9987BCD93DF0420E355FA5BD426F9DF04C2DE9FDEFEB408D60E7CEB348CEEE3A46D5E439530FCF288D0429058EDA853F4A307A995DA4A18EB3C116D54858E6FA634C82FED8B99869DEC805B92780BC51AC820B2A7A72E20578D37752D9385406753F744D5E237C14F3C6BEBEFE0433B9893D9C5AEA0D22C4F27100804C2E77964CFD84DABFA126151C20EC41ED70D8C97009C3151966C41785455ACEE68F654D3A12DF2691F5696CEF1AF3B0FF750220961B449452926FC24B3D9C2088FB2B16CF9050D1B310DA137D63F37E2416401CBE1EAD9CE3D5C6EF83B334A08612975589C1BE3DF9783EF2EB0D150E9FEB0ED0C84084FF7E85BD4810A49D74E62C31AD0F1C80F97B0B03F66CB6B73E0A247DF9B182AF248639FFE702CF044FF573A47293505DCC748303A46A7BE53909EF410FE5341508E7A6513B571A8695FE05A83E82C3D806F313013E8630042A34A8A7259FCAA2980B0614FDAE9E77E26E7292250A6426789AEF6482147F2E6F9BED126EA4F600392EFDF04095F01E5A76C27075CDA248CA80B180D6569F3A3ECA37DACDF781CB56161564A1D2B950F3FE70FF4D32FA90DEC092232BFD353CD3369FCB749DF5729892A4D637817E7F1A04FD4BF1DE7C5F61AE3F4356074BAFA579545570133D59F391F5F7AF0D4DF96A6C0DAD502D00A2FEBCAE4A9C5850060E75E2F3E45F2FB50F8ADD623448439FF9B18B5E285DFDF8A5B4EFB3B323DF29366896FD96936E7C9750F9541D475F7C5D13EE6CE0FB6C74008039656366382E4194688FB4948D038C7C026D1BEEC315BFDC5CAF94849BB1578D3802922BF433CEBC86D096262D8959C1B4910B4ED8FE83B1F6BB3CABC3FD601E92D3807CCFBEE80EFE001FA61BAFCAA9085FF937A83C6C7EC0A4E2A22774EB9AACA8244D9DA30049E3433E00500E5CF52329790643EA3E74E2201E1E0F15173F275E42495C376F81DB74522A527EB06532429E3F74B0E7CC0379D01C0C28A4F25AC7C81210DF550B27097C9D96D957090349BD9EF37F96B74CB1760A60D1C08CED7874AA1B8666DC763FA85A23967F8AA340460E36298D1799C535610C70E21B284F012271AF0957A87D28B76D1134D60123DD5A0408D7E43EF8091001850E6FAA34E3DA813E25F14477377BCC8758FF11F06CD07B9AACD006769E85FB4140039E2B1B609383B081D868A12F46E377EA4DCAE2BDCF524328A214DC29808F06F2DB83EC2243DD1EA60EA8C505E7DF3213F4CE0481FEFDFB2123106024417E35088F393E7EB5886F126A7EB6390AE3DAA19F5B92F3038F99971BCE2E941098680F40DFA8C605636692A0F0291A99CF2E2BA44B6CE424EEB19153F9E6A9B80CD2BF68A3A45DE5A2931C64330C02B809A4EBBB96C5B44264205B41F459A2CC7CA294AED09D0AC127C284CEE7D440C15164B716BBDAA3918AC56013ACA0A2FF78A756D6D7F2971FAF480ACD68EF79CB25B332E1C6F4F8D48C4A97C150BED7467E7C78AE73985C5E49B638D82C77F00AC4D310A2EBBEAF67526FFCFBA3ED0D269B20164AEF755669DF738FECF5113CA6BDCB75428759B9E1ED941FF3A04BCEAD180AC4612A4C3BEB5A1E735E9A7DE77FCB5ED4FAFB944CD4F7188FC88711451F3C3A0EE9DB37A56D7E2EBE95C011F6ED86032D254FC2707ADDB475B00EECE90C85CF478E0CBF45DBA8CEF706E69E5D422464BA96BF8582942AD3733DF0BCEF1C31C204BDD822C718B4DFE8EA026F6E372FDAA0688894FEE26D1FC374C08EADDD4C83CFA6892CBB490E3AD38B086CB8B1176B05B8BB54051A701B3F9C9C06C49E4C727C8BB02ECD06811602B88977F80F55990CF148063FCF60C268451005E39EA10459DB560B624E0CA7297861DCA1713CC31C051872A8B42104403929720F45F1EBB274CEC8C7DEA31C67BA755EE36CB3BD011FF6845DE72B5316A008E11D4284CDF03B767D197039EF2C475E7C965019F384E53480A4DCE0F27E19160F758B036E8075044E2328905FA74611A280893413F14440373DF37FABEDC76882F83BE37ED2EEAA6BB1EEBE347D292EA75CFA364849800AE0077FFB2EABA8156FF0190925CA8374EA259A0393753FE319BD14D074DF7A821FC33F6247D6FE620C7546235ACF36C5093A5BB7D72832FC39E31F550A84E3DF30C17CF23C5B55F0D1D68A1AFFE90EC3A3737AB6EBA6A8D9756F3B05E69BF464035FDA2299EFB56EB7A9DB2CE22ABD9C39A4A7001AD97F10D8A0021F103CE8D436874C490434A254AEF5B83AEF24D2FB9C05AB96F8B5A16DB6FBFB13EC018680D78900D13E3ECE5252D3CA0AC004FC21D7D95F1F73AE6CE440998173D6883C92DFBCA3A78EBA8CBE4CCF177E2CAD9A0D0E5D9FB35F9DA413CE9FE89DAEE380896C1053F213A53A8CEC8A71BA4E7B3DE5DB2FBA8D5A8910FDF4A467651D969FD144C0B1F7A2FAEDA2409CA6A60578B2ED4CDCE0AFDE877D25CDEA089DDC3307CD94EDDB17977A6613E36298E3754C6076B7870EDF87239402FEB802F3C24E3ADD93C4FF57FA69B08E1763274C9EA970252560E13AFB67C2D4465500FF94934D74BC3239E8179452F3FCAE8ADD38B3BAC0D2AAA9653A26D1525A93D112CF6D4F4526485C96EF104F20A255B0C414C4F2056DFE25752A42B142C95551469222E01C16A0B0A66D3A3DEDCFC6D28F0330A9B3DA04FA7042D834B845B57EFC3813538BA52BFAFD3EA8F2D2947FCABFBADE5228C9AE0BA895EED839689E1A65B97B2DE616CEA98B05D7D3F1CD8520F917665D448ACEB3824F68281F82EB0A39C33062F0ED6C3BF9F40E125622924E480F3A3B51231FA662399D701C0B7157E26055938FFE64E6C3DF2B45730CA8DB31CB3F8D1D1A617E26544F3DCD9FF5AB61334F53709F1281DABF965A69E8C6B5AB41DA1F72BB759D9303053D202FC56445E326363621832FEB9243BEDB422AA99C2D356BEAF57A2CD47657F4BF8B5D7C9E12A5191E6C97D217F6F34AA25BA420C20B78EAA1A62BC506E55C7D862D03E30807B8F5989AA3352AAF62F5AE752985E1730421BB3F7734D5B7FA68CDF1BE7039D708FCD7DCF26170A8A46A33552237EA8855D8F32E888A66C617F8DEAAAFE44CC8B87C969E084A5DB97B6DBFA4F26742A1229E4158A3C76F6B74BAEFC9D9E3713322BDBD850B8A6551B2FFFDA5CAB1D7FA119A65AADBC109AAF7363764712995EA6DA891DBED390B9BDC72CD62C1B5CC8433D81484E629E9E190BDB232E74C31BCF2886FB1BA09BAD8A455D166CD86E542D6ABC0A0B3AE6F2FDBBF76DED444DD9402B9292C6C9BD9723D9223D1A958505F99FCA604C26FCA6B7077DC55B5630511E659B4EA7E089FB540D680B6C7989A6060DA19A3008194B579D0EA63D64EBAEC26C9C70A6C3F299451D132F767334B4CF834D420CA2D768BEF2061CB730046708726298BA19616576E15A5CADFE5B31E30F990CDE6CC7720ED5DCD7962CFFB8D97065D045D12BEAAFEC0C2513CD92ADF361932EA0E3DE9A583BC7075718B284A5E89B8BF8257BB601AD109522E4562A9FD8615AAE3176AE2232B73D5B63CAAA851E0128EC1E9B2A31FD6183F22416F881DF3B1130649D3C8E54588E3E597B367F34ABD566541A9C65FF0F138A3A60F7E726C03275A15A2BE80341513EE16A96AB1DB5E4A486AC3D7955BAF3555D9DB63EC24B443884D559ED4B2DDA583C89105A0740991AED25CC81876538E38BE59DA883832FADA42BECC957FDEE94FEA11B468FD5C1B85FE3DF47492EF9E834F1E1801DF1B33B178807EF5776F9A4E92AB4D54EDD0F65AF2C083E7D77D41420805EC13BBD492237BEBEBF183AD5863304FB95C3796EF0C3DEF931529B104B27D2C4883F195D211AE8B6374D51B5F034E5C477D9E7D2940BBE0CFA8B01F2B77F16AA3F62FB4D4F2A0AB8B61DF20D718A59FAE461BAEF74AD27D858F8B7E89F3DF0E35FAB2C166E3A94E2BC5018D0CF5028AA9A81BA67CB45CEC78F1CD13C480D421D886BE75D5110066329A4B45D867AF87280D9E3DECCEA9F5F9E548D975DF7ED9A8F2E75DA099ED9E8228E05B3E8EE96FC7602B6E3347E04140E705777091180FBD6700787FFA7712527B51E2D67C703DFCBBA2D5414845EB3A87212E3510FD704DCF26918050130CDE83F9E497CFDB58B2B5AA3E69DF6870F07C96B9D8AF205CF0D8251B1E8A6A9B2FA2A10BDC298DC671428A290A29F7A84841AAB6DB663F08AEF62D48C085326E5B3157D508B888C1245D31D8D3CC5112BE08FA1FD8BAF2531C2D8A0B8E19454D837E61D8052527A5D528BB57CF9DF2F4AD506F586F341F1433F4371B7D7D703849D663FC368D914CDCC41357C23D69AE90F4964026B38888F3557D6DF26E009022A8723DC864B8375550E4B65814074C8F95987EE4413122D60D9061C6FFD9428245DFBCF7FAD9FE577CC6856CE9D7DB2F25FD49B813DC26F34FDB926BD2D0458294F8EEBCDB42CDBE4E867AED6A8A10A659590A9ADA4350C1B5239873EC7300197F11E4858EF64D75B434A5669785DCCBECE6626EC1E495F225FFF633943F1031E13859AF3A6091700615AF8BD86D0A523F0E29788499FE57046E75B4A0759F221815EA6C442FB836A2C6BCD4F37FA49BE413FA544821592BB3BFFFA81342A2CC3861D63CCD238368DF64FDFB52E259EC052142E4C58690B3179CE8C4F06D192A070CB3B01D516120AB61F097EAF2B82FB059C2084124B5A38DEC5010D1B56732C6FC30666FE5DF9040005B2CBD035AC9C4ADC594368B59F498F9F938CDF4E3CC870C758B87C8833A6D806A98BC2CE94213A9CC90859C73D7B4A2D38257EFC8E4F6A9A36642772ACEB8326240626225CF821555D1B6F6FE79F5C52DCE516DFE91D21547D9365ADDF7762B8FA97E46E183F6666A3565EB9F1CA591DF33244CBC4E2896CA1056C0F734F56569BDBABB787AFE0D9E16F653D7344CE53B935FCF87A1C9EF132241FBE7C675D73F8DB95183E81D27AD281241ACA89F1077A031DF766CAEA0DD18F555114D8FA52921F4EC8221611E19AF72359D1C2955B308E9FBCAB8C92C72B10D0B05B4E2856B349C811D3D654785C59FCF6CA3DA392B468732EBA42A540B784E92C57977CFA13613F31E80F71B4E84B92B5EB0249A5A89B54C7717FF0FE8E572DDB6CA07DC393F5B7D77B233021416591121BF0606818776E9CB3827102F14DBB74C67AE1F572397DEB3EE1884502109BE1FF463C250AB3E774541A0A8D8ADDA73D8B8918ACF1EE778242299334B2DBA02CA2011ABD3D4B2B02E21005B7F79C1C89057B689EA871E5047DB29E7209182200F84D8438A39D1BAFE588E22BC70A29D783FD17E4C87DFC9E24B056FDCCF67BB8F5FFF309A06690971112F3CE188C6120D765916FC529350733B3CA97F6C0B3C8A4F145561415E6599148222FD9AF96B0D3EAD72DC67FF7B67F5954575D9A5B33C5363CDD2EE0D3E407D1D2008BE0E2E5158C3EC9E9866ED173742321687F5A6A9AE62E658740BC078A9EA32324C473A9E7A7B548AF613DC9E1DEA949C513740E3A115B9AE46E001189475A049E20EF001ED88C754B9B30AD279A06D50C82D22EF10993188D538D887E93D4114ED9C49F4FC955FD8698D788498C98E1524FD7E9E1AF5EF43FE1F83F7088C5C27CCC77C2ECFD46A636138B2A35DEBF744913989528B1751FD618944413688116CE97A70436DCD621FC3EB4DAAF42C2F6B703FDBB5F98A0D1B7F7E77EF4DB418F895615EF0C73F766ED74818DDC713D802B5860E77FC490D762AD76A0CCD3B54BFC94A4E2CFAF49947B17B8F9975A5BD16D3085518EB4664D5D7904E4C787CC064331F934916D42FF1B96DA6604F19D2498062A394B31F503C8759074CE73313A3EC64E8F007FD77D9938C8AF8F068F7A76073030F1E8E8986EF8D3D10BF1713AE99716952527691DD4133324C6E479D677AD621D3039C160FC59F263EB564D98687ECCE0A379A58F98B374E9BC6899CC51836AD08BD6F8BCDE527E240E2B02CB64F38EAF6DF912ECED577D77F48FB0D35AE397142BB3A41A15B9C945D09552A198FC5429A0D35E12FEAE018F6270D295E1F2350C07BFCC7C91FB6F09ECD6E2BDBAEF6F8E29B1FD382339377B7D941F4F06C84D029540A2068E9524A642B6E4E4CFEE5B394F69C14BAC7E0BA89CB207CC47B9E381D04972580D9F83C0510EC8B1F4BF52D7A99CDF6524C07DEDDAE31FC97D47EE054A23EB3A1D37B93F1B13698D2106D0128787F3BD2F59D9BF499E55D08859EDFDD8A399F8744DA480EFD0FD25AE91C167ED41439EB652C6144F5E569E130D072148F2E63CA956E09D95E7ECF0417455B5113B1F7A42EADC7D360B6B7539E89A1F0A99BB72F24F9A5ED3DED1C3FC55EC58887CC160C93D1800A78480CAECEB37467889EAF2E0F98454975F95D9EE31CFE468EE1B648D0DCC80B501EC4964D9E7D6185CCF37964DE65D1CEE7BD8335DCF5FF04C6A37AA6F6C66AD9E99DF2AB8987FBC06FE36FAF2779FA8D397D5CBDE3080A11AFC747CB91F4A334A7B0C071A53B48B5D4318E7BC7E7FFCAE9276108CAF02181B05017FFF8467CC31E0B31FADA766363AF0961B2E5CADA565F9796E9198FA7833D00F46CB1E2517F375BB918E763366C508AB2E1CB73F438919060AC00DF4A5E3081B68CA5EDEA3E8E76C63964D360E114CC4F8E45D9D9F6281A2FDF3D16E04B8EE57DD7F7AEFCFFCF10F77AB1B2F37CFE8CFC3FC29F3AE79EC93570A10EEE0E3223EF8549E698BA1F6B85156F1A033E6197EE168DF1ED13E15AA7F187FDD5B995E89DD4BB828FC31C872D821C7C6AE799A132389367802355758FEE4BC1E4EB8EEC07ADF7D22AA14D70FE90AD1C012E44EEB13BC9D606491FE5CB5A119141751368CE91EE940D8D7148A46DC480ED00548A650B6B9CC9171CAD9DA2987B6424CE21F751B1394F66ACC3BA598ADF5613BE3DC81119A4ABF9AFF4C2D958F83CCE657BF0FFB045B4AC817BB54A360DD43E2846ECE081FCC638E48FB67B6FAC8A0BEC5DF009513C471047BA2384B12290BBCA558760BFEF59FD55E038E4CC9D01F527A7B01D7DD460773EDC1D45A7B8318E0F2C18A751B0833B4919D12F7DAE828C81EFFEBD3939D7E64B472F9273F1FAED2ECF233CADA9357836188FAA6C3CF8A1F3BABEE1E92390230875DF94B51E7D89F3A94F940B5B6D72D8FA0591EE244FDBBDE50AFD1C73DE9BAA8C2440C148C1188B7CAD6D1E52CBC5486850DCC23A24F2CE134382A2B692888B3F9D830079E730FB5190DEB059C8692F5A2EA189A19791203991A03643614C501B6B6D51F839435FC93AFCA7C528C7C0E2D2563AAF2B18075D06DFC4F63E3AC05A8DFCF7BF57D9BEDD32536F331640371875F8BE7A60DA6EB75A6243C80BA5972479E9A96B25A2C32D4E01CFF873F7C9382EA050348E2D8427EF9A4F4177B76D57F2C75B6A19FA83ABDFFB334C263B226EA4D37A202812A7149C375962FF73FA92CD23A517502BEFC9886A27BB878901625501588E86C039B0B571407139863007508A3013B54530A21863B33B1ED69C12E06C876256B016E711D43F7CD31A99BF49CB779E5342E1389433F54478901F67F77FF719F7914C18035B4D2095EC2376705AD32511155C1E012BD62F15F92978E95A125DF0A594DD0AEED7CD4A1CD11600B81C73A299999652CBEC6CB031EA2D7813BA051B47CD41CE6EF3F110CC5D484FF9991B5DD8C9A94158E234EA24DBE644586D8FF8D9FBF1F61A2AD5A1CF00B70074360405060080802052685588EBB22F4707D470EAB772C43F71D7CD3DA2D7AC38041FA005A161842E8F1A61935B4984D32D2C5840C43495B0912B5AF7588C33AF240A034A661560F06156B77E2CA6D6BBE3CEF9FCA1903A3D4C54B4B8800F94A443FECFAFB7BD2CAA315A58E7E45B1F450A11A2B0CF8186AB02CD44D9C3DE2C48999E40FB4A5E53F23B2D5C82DD7139B72E11D7E572F6F7EDE063A1B552937C055DAE11DA7F6B74DDE7F6F2B310FDD3E1DF52C5AA2BEE2933DC91936394DD1A13698124C812159F20C331C0929823B3BD040A0C68C30C99DAAB9F7998BC18642B9E106CDA5904F28EC54D269E077EB5663977FA5C083D3FB21AD4DBDD5500C8351192A9E229D755E405AE145FB7E146D1BB846EBF995151D83F599E26E76240CD191FBEBA65354588FEA2C38FA4078D7AE6600FE7FFC943DF69357106776EA605A5B03EB8FB53ED518A55541D436A012549661FF006AB504E2CD8ED85CE81106E1B18159ACFBD834D607726A59399A43FBB1CA5B12B4DE4A69ADFFD22863F26374A8FD755B7E3C43AD821AB120151202C74A53EEF7A6D9E39607424EC5E8B8966677D3FA89C9721982C84CA187AAD6B74844846B33FF7DAB9217405DEF0F4D2D050122A421F220D4D6FAF42F1B7F59307A24B98E2E3D46C3E6DCADFB8BCBFA55C80C57500EFE6D02541F210ADE3FEB9C40EC28D75D495A410720925F6662559899E89F1F91BF00191C8522671E854032BA188306389232B1BCF0528ED32A7745CB75EB62DE2787217B4285A56C71A9F210AA4640CC9FC53E845FC374273B1F436A0A57379A11D4BBECCFCD96079CBB8970B9F2E54ABA3C379364CE14D52B200F4EC6B42CB5F6E618C94F91071ED9EDE089EEC22E42B8FBBFB6E27886278AABE55DCEEB34144C32FC3264F403AF4F0AC2EFBC5C8776951D017484D373E879FBE95B6B41464783015D8977B68351EC84E988A089D84A682822F0C353F03432754AC0592A3FCC56EAE66488D9D8A3826F2DF3546C853BF9D8F0B56ACD4BC5B90D0F77B03CC73981493B26D00482DF5048674C8B395712B6DC967474122404A9A3F9AAC37C9608F03152CA9ACC23A0206D30442068C8330C4EC44F9C1FF7A859C7D11DDB8F2AA751E65F27758931DC61EBFEDD9F7A0DC32D32B391802BB36BDB86F1EE07E133F538D6E33E8D4B42D9C11B7272CB0012FD082BF6E35BE0F349070BDF46814C4C60D34164B1F22B97193DD8E240FABFDEB672083A4691B2CB57C240D8456396863551B756D3F52E1E51E357041FD43A9454C26A6D7E59ABBC1DB3439A0B565F406BB2BD8C5882EFCDBFD6AEA98FFFE085777EF61F88EB319BE0D61F676EE98784A9EAAA9291903B151EBAFFC6B971728E3D533EB602B3D683D5771F802AF1876877FD54EE613B8C7E9C22C1D2D9E065488B6EE2DAF6248151172F775183D45236E6E4E2AD6A1062DEE35F53BB1F108594BDC3B05A29F6864F3ADC0FBBB81608B7FC336A7D4487C74FC5C909B2D1C0E8E19361CAE207A3134135353E3BC646D157B3CC23484EA7C24F465FAF68E6D84DC14F25739C25F3CFEEF35314626816A80D2E4CFED1615406ADBD40007AD1BEC0BB5B4A73FE6A29F85D006559702376AA1F0F996912EEA5F6B9F01A76FFE8F0A56C4832540D46CC6BDA60730B5E34F1AD95A49678DE4C39F92B96602419C582E475C98759BDB2A717ECFDFF0A92DC236287880EFB62F2ECCBFA7190D9E1327E4014449EC2091D478BE8FB7171526FE8A88DA4F07A67632E40716B24409F89176ADD2F3D0555ED06DFFC1590167844F0CAEB69836822D0E38ED12C4936B2DC6E2AE4D1D518980C8AF358201B5696DAF20A83699051713F9E7166B9FB1D476104ABFA5DB6254572AEDE4B0284B0502A5D93F72F243E8863F3460AF9E501D233DECB2F45CB17CCE5787B213C60F8A3AC6716AA4A724F8AA8E65E0C3DCBE2B6CC2E82155C099E6569FBA6777BAD7BE4A6C80E9E209253FC9AAEDEF41316E97860C1522EC9CB5C5C4DFE4FBACF66A0151249C9201AB4DBEE80262F1134DC00FCD80FE5EDFFCBA8F285D950688DEF545BBA6530F6CE416ACB1D98D774C6820F14298A666A912B3585B699C3410C109EF863E330D00D6F615A9867A2FDA2DF61117E817AAA151D8E8D6AF0771AA333A0D70A376EDF9C0E93C26ACB364D4167A785E922F548670BA585C62749A47BBAD6B76634110B58F2B9E1E23C47EFC05D50B1ACFC857724206631E8B3429054627F8A2D6CD78B9D806AEC28A420E28038A6C25F3E45AAB4E631464490DCE8108861634DC78C3F7F8BF5606BADEB94BA04B0EC9D08E989ABEFEE3413D1D18ABDBB72740FFDCF049AEF87522C34C701941F6D902D6440569686A76C60F7985BA74589BCBB3016BC27CEE28F64DEE6BF160680EF0DD8CA60B7DB68DDDCC229B8AF04F21E9C19CD2E10A2F7C150CA7F631DCF966651ED4F589EC3479C7E8033AC50A9B3A88F638036CACCE8938319AD203CDDED001DEFA18DFE443FE06CD256917B39B479971D7422323F57321566E4ABAC68BA46C3A3844DC5847AE6C38EDADCF5029D35E36A3AB2FA1CECEE4E7D85B2701C084FAD6328DB4CD9D30442FBAFCE1D25C94DCB639FCF9D083535EA1A95207BD7B14AC85EA97FCE2B9D0F6F6C035808C9A88B79F4F35DF2E7B40F0762CC5E04E9171E147E525001BB510E633084701C5663FAD891B478163BAA6BF5920FCEA23E537E81B2D04E5D19031C28223B0F8EBF28D5A907E4191EF456F8BD5397890771371ECA076B9327CAAE28978C7DD997E14512469EC16F57562496E40792F66D3010419161341F0C66AED7A1A5CFDCB45C2E4143E166B194A5B81E2694C438A47206AD5E440F6322806977EE49E8F1E2F33B4D82A60B27C74A8C60CD7A78EF8730D7439D5BA861FB751BECA5230DD6553F0034008B0D39C37B71A62BCC01BEF6456D8EE0E56540D44C8D2047E076A207E3EDCD32D540C86816B6654082B915FAB503338ED40FC1E1B8A581D738945373AB88DBBB7156580689A631476EC7C357EFC4090630E052B3B9FB9D3C3E379644D9752F53F29936DB1E9D75DE235124181F5B35809B02401B7EE6CEDDAD40FAFE156B7D5F885ABB89F6E8A007C799DF2B61F5CE894732CDE09B5580F85F6126F40B00F46341770C7342D104A2DA36E273D27D282DBB239EA5E347EA36DFCB4B925F60FD07169E0562E4DBB002CBA26C0543784B409B8A8641A200C9E9C59D4A5C8677ECE7EABF6D7A93E2ABCA01F9D40EA6DFEFB19305F59D921E37F3E9B4DB8D556A9F31E228DCFDA180782083C436C9CC6FEB58F52310C04644FF11C605CDAAE23B7D42781E6D048A2CE1731D89BEBE71045AB42E2CD1B0C9764D0235A90E9C11E605C6F0809EBB3ACD256DCB712A20B8D1B80CE6C4109AE67FAF44B26BF092F9F3A5BE42FF8A1C10B46F568607A5DC98211A737A0717EC416046EC97B687A2FA274EBC4346FA4BF368E783978BA9D603D2AB03CD1001030492ECCE89FA72C7B8EA5F482ECD8B571BB7E3D55A246FB41BD1CA37BE9BF72101EC7754D38112B2FF678D0DB4E1C1A959CD52DEC82CE57F894ADE90EB2AC4E443DAC08B6F8C8BD0778206E9134740D54783E516F440BF760012C963B79BB16D92B63A6CBA318DD3E7D4AC60F6F41C998F411AD6FA1D1EEDF3F393FAA6DE667BE54F131FA482D4FA29702613E7EC8EEEE92C88EE4FED5EE012BCD25BCE76288FDE3080F4928E01FAFA00F1ADCE83E69077B374BAFFCDFAA730E2992E5341E470AB580510429E70559AB62C71134D5D786074A616EC4F304E4712FDE4544502F7FDA24E4878B7A5D0C691755A6DFADEB1FA8535AF3DF93E09B68D403768BC4BB082B1F931602C78BE6216039443410C20D5C164DA722947872A21636403C5A2F8886A23677ACF69CC4E4546E670633500501756A0F9B6CB374F6DAB7B67BA7DD17AEE1B7FEB0FA1AAC4F24E3BFA7E03582651A618C87A05ED30A86988C5D9E4A39644E9C96756D6A028BA6915997735AD11E455CA8AB5EAD2390D78F2D37911A176F01CB0F8FBD3E2F9B488BDBDE7D2F09B780F66679EFC692A3D8D1835D1CE7DBB5FD186C534D1EFCBD89BE1D42DCF8FC1C66DF4867D0143B00427824CFF9FCAFF53289DAAFF512506A4BCAA7CD09FB36EBC5CF0F4E905BCE92E8B226BAC5ACF8E021A6BC5370B10D33117762B8E9647DC3A8426B9EE3806F29D1E2C08061A0C050B0FA20E9B99EDAA6D85D3B7DB6ABFF5B9651E74BFE8B8E5D7CB95625E4E0986FAA6040E74CB413C93482E26289B9264FD5BFE24D577DB291C922F4DDA4CE486FE26355C66C0FC806DC99AAD616BB7FE8CCE208A3796B0F3B23CF85C32568B276A4CC8398320635D45FC055973981D534BEB334091C9F451C9982FDBAAFCB966A4BAD034A9B9A5511E49EAE8A380DD34F947E5D5975D96F10822985F53DDBF8D402010089FE3A56BEBB1097FBB557DFEF7477C7FCFA589187FB8EA7FCA57726B91713DDF0B4F17B76AC9DE40E974DFBFBD76D50B4AF6C2E0A4A26BA9E34A9A09890F466499AC72F9AAF567CF3FA4F8CA0978E2F97A323ECB184C8FB6D5DEA69462CE1390E3D5CAEC3659D8CFB8AC3638B7B23F7F17B8C45EC8E2B5BAF26DF2DB59B790D8E12C2686821860874139EDEADB7A3C47DA33D9AF31037ED070F5CF23858693A870CB8DCF7D6D1B403A58BD59FA17C1F9B8ACA21CBCD96B1D8305D6DC9B0DB477EF5F03FDF2A0543FBDE2B5A99076A83977ECDF9ACE72AC5FE6451A06B81E1D4BB8E095AA4D29D929762900F0E8AECC1394A043E2C2471781C54B4903A003B79E9A369046CBC1C1486AEEFFEB5F8A54648A3B19A35E955EFF843722C42862CC056B0BD53B4A0E7F8F295A3BEDD5CCC8431DB718F9B7B51762D059986224448A2266C0254112A52A8A2B14B4017FE38701B050D091EC06A6F3484D361DA41EEDC7D8EEC8442BE44D16E4AF2BF162AA09655D87685CB716081915EC41F8A29ACF6B06BF9EA26AB20E0162470872E5AFE31B4EE05590062176BC1D9A3E577AFCD5CC7E40AF69D2AA19E0E6F6F5B84851D22D5B666B1B7B861CE642679B304D26DECA29ADFB26A2D921B6865D836CF592AE1B014EDE69AF955FC0488D11D960B781FFB717FF8E21FA99028AB141206B618F205F2D8B56C7ADE7BA7E638AD870554D3CAF1BC462C45C9EA7E99EBBCB0CBB55069C739236AC0794845ABF97FBA97E48A5A612CEE421111F06DFD45961DE769519B72122AEC61458FC0B7B86C51A2CC35E91E0D032F497DEDCC2DA604AEBA51B9D2DFE21A4DDE156EC41CF1840FDCCD71F517FE8AC7680142FAA0CE9D07DF656FAACCACEEBE80C9F79047F3D77C9DC2AD8DDE6035330913C5FEA705E9771F2FB811495BD0E87E18CA773018C6F8F5677C927B03CC3E9F83EDF8C3BFF4BD12606029C750FF73A1156CEF0B1BACFAD586E21FC1F5F06E15A0005321EAAFFDE7FF5FD46F3C7862A5FF91964CB5A9D386B7BDC5753FF68D05C5CB10C8A308BA106A754E829620D78CEFA88E04FD1FE645DA9DEA05132B908F4ADC8303794D7D1AA9F0FD458555A18DD88613B1DC6B13B8401CD32B8DC23A2BB7752F5FB7B491B98458F28C19348CE33A1A55F7BD7C9C724DB01CFA7983A3884D09AD77193FF8A1D2CFFF7EC7217EECD3E699AE66F839C792D34A6677743439EDADFE2DB3902E3CD853C1525C3255B94EB0F3CF80F564BFA775D6F63CF0EBC9FA471E0A3D66156C13050ABB4FBCB5F1491A2300DE5D7E046FE9BE7EC6ACBCF390E654262B4AC9C41055D6C39E8BAFA0EA9EA0503D451887289614FFDB80612C8B2C1215CFADE308B0CCC318FE8FA36778476D3FC807699EFEDEF21787297C07F59EFC7343FF7BF3B18C9D0149C5E978EAA1351CADBD0CD05AA52A5420D3568591676DF7E12B0B2E423049FB075367F53F922D6A70B147CC8633EA1C9D36ED45CB04278058E3870FB55662864F68601D1B5D26E99457CB6C4672F24CC04AA71557F29513E5298253A5499A8C4155EA3019879B194C7D8381169A2BF51EC1BAC7373D4B750F01CC94A95AEB04847453F6B090A87F54EA1FB6DA5AAAB2B927A1F15315F301679C1758C407E83F5732B68A49E2DDBAD7EFE260A9AF3F4D0507CD94D223790B317F9A0EB877589F64B403D3CB5CCC01A0CB9A1E54AB890BCBBD4635CD10EBA4318C05E6B29DE601900463C6FB56C73146811B1E5EE4FE4F6BB525D4AD27246BA3E02703B180E62E3DA1F2E8629DD4C390DA52F5A60919B09AB28482DBC81553B2845291C57442BF84F11B0D88DA66066F4957BC534CE1D22BB9F76CF9BF283D77D7F0D39E48F62672C8C5E5A0D1CF97B2D0186F10F1B85C599C7BFFBF4416CAC53340A5E705FF7A0AB393C5AFEA6BFD65D0EB9262DCD959ABCF68E466E3CF877ED7A80AB519861821AF9E2CBC1F1EAA413291318B1E73E5E3BCE3687932C6821617BCDC7BBDF51F44D4700D7AA6CD3395CC5C096066E248FC385203A6C64F19E27403438977825BC35DDBEDAC304661AF9FB13612534955160288C01DCEB4F59539D879279A7704B2DD2A267DA7ADC0A47A7C38E9E57AAA9D2B83155010865CDF00C0A916EC61F5AD5DAD91D50A5D3EF4FC9E3B25F282627DFCF599CC76CC4C308F66E407BA56214AAA98110DFE0EB0AD1400649C1AA29F9B3CD2AC6062BCD0EC48BFD14C34887BCF347563E63F93A06AD0C80623FFEDE035AFF2FB246AE4FA70FE7B6F8F3CB0E9438E6B82EC5B631561DC7BFD7A2E9321B0AD19AF8A72C0D2C470FB7D66D3F110AD1C88EFE8CB1FE71BD9E28327724B80F3B9E365BE97A502883794223DB0DF85A4B8E8F24FD38EBCFAFC9D75EFD5DF9D7A3E380774FCCAA3D95358FB723051424A640C89F047986109E3B5DCB1E14B94795AA6E48932DE75C3E804B838EE724AA075C82B840D9EB4A8D06099DD0EA6CBF7A14553CADD001F7C2ACED8B5B1535C3339B5BB2CADCCBEC2714BEF8C757802237C4049F232BBB0E41275B783B9CD40EC6E0A7362B350818737E66253973D950B5BCE4259487D122B1505DA60D32B020CB340232949E079B2A30EDEBAADA0EC74E2D9B078394FCA502DC5CADE67C383E2ABE678D34D5011FE64780DAFF51621A580EC103FE51E1EBBF24F5E57524E060D8B0000C63A31BC48C8B8E1800D9CEE29EBD6637E9B7B562ABA885CDFB999E3FF26A1D268E4347CBBBA1748FFC3AA8F04D04D0D365BAF514DE7143CEE9F50990CCAFF85174180C8668C0CCC7B29B458F6167959F306BBFEEBCC8D51AC6E802CB610295FDC20BC47FEE03F8DF71715C39165799AD4618FBB41F34F7CDF67D7327A9E325F67D24406E0921BA3DA2A55782121CE6153A3CC971BA0DA5E403F00111E1C1F2DFABC7F51BF32D274E194754F30B58CFF20D83D290FFC9FCC83FD1A87BA76A486A2A2CDCF6F9F11B64A00B2101571009A707D4B86577BAA46BA677BA924955AA92F1352D7169DADC33F6E708B0677EE93C4F9ADFE1198D41254B7D7A9D88A5EB1BB0385EEF2242CC2789A81F75D1281AB519C1AAF8DCF18D53B79C0367ABC395ED7DD56DDC8173F0C2CF9C665FB3E488036D4561D6365252531CE3C461E38F502898BC721B17FD3D1F078560606BBB4D25D8E25B013235E7C107976BD2E85136013FACDDD74479C93026227B5B00013C7AE4A2E8A8F58B3A1FF0C51BEDA571DC2F4E2E38EE3E188576366075B688709E455CBDAF88BF300B1343697483A6ECFCCDEE27B407339D56E23619DF5A02235224133701A361D274A47D01C0C7897A23E4DC6CAB6DF73585DE74FE3864B04A99AB094ADC33A4F17B2483E37B1BD80C0405028140A0127B99A566C7527C6AF087C3A713B82A0EEB01D1808C320F393479B22A8AC65B47129FBE7C6EC2ED551941E7B83B5763605A3D021BA01F1FD2CAFBEA135CC38264EEBA645A1CD2FAFB008575F64980E43D00FAAA21789674989AFBB11160E9C236DC13CC86BE7DBDC2C55A2D4EE1B28B8324B020827887186EBEE12EBD6100D2EF52DEE723CB8244C602890CC6885ECE55224C779C109F8849F3BDB7EE3273C0E3F2AB5881C3B2EC602682DC6F15E51303FADA8B741ED7E9E24BC58FE437104DE858DCF152B4B8AE2057E65C8256D1070CD8F01A7CF4FC6EDB1DA46F43E2987DEDC49593AD5FFEC5A7745A20D7F4178F6F88C267CA98463306AE74250B2A80880E9C52A1E0E2625C134ED3D550FDD63BF4BD664E6B7C9C1E8EBA405BDA07A40D4C9880EDC59EC1C814B74E71799B5E7720860A691F63E5A9F023B523144E59F2F493A19E8462F5D82934398541BFD65B0DC67F7637996AD4185E28654503F0113FDD49B1ADF73A7CD4A83EFACDC2303A5A425E626820610DCF7C445B9FE9ADBD7BD7A695B136CF4C812EFA4A22AF53E75BA7B41CA6630E0A21062438D409F283C44C49E494B5A769E26228E9282C841E01136C9AD5A9C0B69937DDF6EADC8C546C4E72221AB9F3E83A538DC23993BAF8009D78D2E18E42E2383CA38136CB9D80D6C3022EDFB1138EB17663A1662BECD3C4A80BDC93FE462630F056F7F8F536A6C35F5AAE989FA1E219ADC19D6BFE37F1C99D084027CEF81A51C3A304066AABD361EADAA5C1B25B23789C8A37163BF781BF85ECD0C504EE1840742C1AE60ED53442D858FE8B3C93224C7F6A590BE38FE6E088A805259007C93A7C926A350DE1B1778DDBE62A14E094356925A3E9F5CBDA8255B8827A1EAE34B4C5656AD60C0493E1E382751F2F050A53E13F9619A2AF3A5925B4432D50B0525540232A7D16F547B87881C562700486E205BD6CAB6F0DE0D5FBCB6EEEDBE643AB76309CDC4D124960402B7CBD74E7FCE1F74492B272B3BF26CBB0F9E5B0B03E399D1B1500DF357821833D962FA5EEAA4CC3EDE89DEA2EA189FF3E95A581155D9ACE8205AF66A8C6C6E9CD70F5F89B86AD5245653B08113DB682D420E0BB0C126F14DAB8D1CC3B59EF201587ACC0AEC650E3B7E24813D87C88CC50DA4740415A1B40D090A79A1F1607810106F2694E6851B270C7547F50CAEDDC223736748DD1CFB7A5CE150652F34353923403507BEE160C45BF65E8B976E7EFD4D8BEB94608DFB1C7242A914BD493072A2957B6419EF27E0306518B805189829564168F44FDF1A70AE3313D0045F969B5A42C4971DD15B27F94BC7E8B784287CD7C3E2554CA844F609C464C59AC6ABA6DD40B86372FD14FC70524AE57D638D3E3AE40D15744D9D94441146BA7BCACE8EE63C7818AC22CDB737B0B0BDFBB8070B25F193D0378A108C79F0A1EE22C62E9B51B5C293AE8481E2E3F0E745E5F7D8FC7BDE3B30DC81945E3B3D0202C00E0760B4D2BDE846210440D73A1208B1FF1BB239EA7E823F315878B6BB03E85C6C256F00ED7B38E055469E61D6425F7288D1DFA9AF9EC00E578D8D4A94A6F631E2DC721D356F316F1C79DF922FFF9161997E9084CC967E64EEF5CC121390FF0666AE5F34E8C0052BCEEDD265B0EE99FCCF18A3F5CDB388B572B3E2C7C389E93AEFED02789FAB40130F9D1B519E80213FC773CADA59EA32372F8505287A87FE25A24064C04CC671F22864E780567BB0DB96D3CCC48A78922FE9FCE5926DEF2334A2E14C4C81E4C9B2BE86BB54122132A48F818030F75CD34766F83C3E9AC9601649872448D75D35D2339C9B4D42787A4522695058C6B43182C87D41BA6459FF3CC906C14FAE741F8C9DF72B884A20B440DB5A820C384F1BB239E197DD0E251556D3DABD488B047C2B5AC4FC566416DD4F512538AD0EE96E6E966B0640004EE9F63BBC1953E46162DDFEFE70C410957D67F7B3359B7A87E1315B650CB4B3F7D164A3C2AC7A1896BC0F33D453ACFAE0006B4EAEA07767ED995DEB9EE1482AA56CEFEE44AF3ACE1583CC81576CE487D8B4702C483A5177EAD7A621D8870D4638349E4BDF0849866B556A6BE11F7582F1E2EFA4C170AD6823622E81151510AFD6A441FE4FCA4A1190F440DDA43A4EC5A2E5F292965EC306945643960CF9AF736AA68EB305B42D0A1E0FC25C9F7D9F8AA52E0EAB647EE943B3B10FC0F998AF316B19FB87470A05CC06D31B53FAEC98C080102FDD071278C87656D9061BC5F0EF6CE3F4AD34FEFFD3C5E3CC3C29CFDE39733A890C0CBB202D0A1C88A552BACD15F53F532A19EB8AE170CA762583A460D4CB541EC0FFFBB446F18305A3D449C3118BD86423C20DC2F0A654426F7E72AD0DF6323116F1815F11F57012061265F4037E854C61899567B4666D30CD65838E6C1123D9E3AED45F2B8F52843612D4289CB0C16E8B3A6BE30D7DFB4F82132064043EF13A2897651EF9058FB2FBDC05C7C2C40F364D6788331AC25EBE41D1FDD02785C7198DB88F5656DD9FAEB29710C7CA29B61DA7C731AE49EA724BC11F7E7B28C80068FFB2E9D0C4C43E08604A37F360B3495E56BEC303DA2E5CB47076BA8E5F45F6252BA2D087EC84F9CCE86E61B20BC5CF09DDD560AC9A6DB7A6ECCAFF8D3CEEA3397E4CF7EDCB33A74377B5C348A316869ADB54F20D20BBD2F84D3BBA0CE09662040D85884B061FC342FD8D554A33615A2FE9C3F291D101B2F7226EB883DA2CC2500141E4EA8FFF37A0178D1D48B18D8BFD46689ACFF8623405D89F1CC46F6AD99696D70AF6397C2713CFBF28ACE669151DADECB0E6B831D95D0B1496C053ACA4029AD9DCE1A0645CA7ECFFCF9C676CEB032F705742607BD64805C29403A1D89825E0726A80CC4C5402D03BB63779C29ADAE4ED067A846D03280D1392B3C0CC167A075C0FBD4652FC5D47175F0F2B370D7E522E9638049986318C5ED498110AE3510934229B86744132081083AC85798F832C80F0EBADA88004D62D085683E26D03904F43D4061D0711F627F1E375B4C66D494A47C6F70DB188A98C3FAC35B4CDA0EDB73D6D2D68DC94F28F67D7FFD9B9527654184A44738C19990D257FF80048A2B2097D256716F9CFD9A5A47FFD5DB42B5077E0B54E90302A616F3158AD4B6E98D4BB1F3CBB93615B88D7639A06B11FC2B9EEC3AA60307DA507F9C33F632D44CE867D4B4480883C580494D7A546A805AC7036AFD0E41C9421471982F40AA1889DF1799EA1999FC7B23133E23E3D50BCCF6673B30320BEF944E274C42A1FF20E81A505898B6B84D2A62507FB0471C246472CF6293215C5C11D1B07E25FBB5DE29B74BBE628E29B80BA374D818E3F30C49D7FFC6FB9F289B80E03E15FBDE8A3B6A87C765FE158015C44785D132530261DF1FE3704FB56EBDD1413957E44714CC0721B85D44DE00285B0378449301491BB0BD8B974A392E1416F4381E3E4EB7EF8F45D584305AF956E0950174E607890148DA802BC75D1ADCEEF38FC898CC28CBBA8A06CD60E194BB4B1D06FFD867FD2C3B16ACDC7DF85E614ED44C0DEBF02E544F50116463F77FE389A8731C90F8E81E8925D1CD62264EDF44C68199B2E0B5CCEA59D2E0AEFD489B251F7BCD8BF8598441952BD61A11A72B2B451E9171C55FB54B2966F9C6F63636E094C9F7A472FCD28BF508567372D8B98C881CD0C2B4806A2B91EB4360D9FE4EC8398E68128F83F2F5BA4BCF11354637293D80F259F9692C535DE18704CBBC4462C37AB43D55AD4A1EAC135B90EA8A4351CD3D7C7CFA7B2A154E981EA52B49CDABCD3DE538109CD317AA287010AD3F7A4EFD5B5E10CB654E058372F520AEF3BE354D21075100, afterDelayedMessagesRead=212053, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=15795422, newMessageCount=15795974 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=3A0E96F58B4606EF8EC8608FBC7F0E1348370AB9247D7419D12EA72302B3FEB2, afterDelayedMessagesRead=212053, prevMessageCount=15795422, newMessageCount=15795974 ) => ( seqMessageIndex=27046, beforeAcc=CCBEBDBA42B452611742A1022B94075FF87322585F4787CD80F7A1A25C1A8A66, delayedAcc=4E4091B1794BE444F4676F73AE1BD0DE5ABCCAEC5AB41EC87955B5BB2D8A1718, acc=1CCDABDF8388BAD6A908D834991054101664949DA5D129FFA7589C90668EE1D4 )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xa4b1E63Cb4901E327597bc35d36FE8a23e4C253f, messageDataHash=2703FEA703A5D2FD08415DF57707DEF51D6DC2E6BEAF34D5A0A1EB6E464003E7 ) => ( 212094 )
          • GasRefunder.onGasSpent( refundee=0xa4b1E63Cb4901E327597bc35d36FE8a23e4C253f, gasUsed=208167, calldataSize=99172 ) => ( success=True )
            • ETH 0.022984925295303039 Arbitrum: Sequencer 3.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);
              }