ETH Price: $1,926.94 (+5.66%)

Transaction Decoder

Block:
17867491 at Aug-08-2023 03:21:35 AM +UTC
Transaction Fee:
0.025026154584630264 ETH $48.22
Gas Used:
1,837,098 Gas / 13.622656268 Gwei

Emitted Events:

383 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x00000000000000000000000000000000000000000000000000000000000f7fd8, 0xd150323257dae9a4fd684625ef69e169b3bf94c7717c9156859e5fba8f6b3ecd, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, d51a0c77ca63abfcee40c3f83253d3ba3ccf2aa79fa50cdafd5cf6d4e53b9587, 0000000000000000000000000000000000000000000000000000000328fe4c8c, 0000000000000000000000000000000000000000000000000000000064d1b4bf )
384 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x00000000000000000000000000000000000000000000000000000000000f7fd8, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 0000000000000000000000000000000000000000000000000000000064d1b4bf, c1b634853cb333d3ad8663715b08f41a3aec47ccdab6541accd4f4ed6e0ce7a3, cd51e74356de7f8b369fc42fbac2eeebad143564000000000000000000000000, 000000000000000000000000000000000004a9e7000000000000000000000000, 0000000000000000000000000000000328fe4c8c000000000000000000000000 )
385 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x000000000000000000000000000000000000000000000000000000000004a9e7, 0x80cb0c7832d7bbd2c4f25277053fd3c6f9e28892ed98a38c166b563251528311, 0xd6fa3f084ffa0e1b3bfc53f47277eaaf747bccfc6302616982676527722a8515, f29fe3d78a531db2a09c7a46e6aad1ab4d2eb1d0929157d42f121ca163b9ea17, 00000000000000000000000000000000000000000000000000000000000f7fd1, 0000000000000000000000000000000000000000000000000000000064d0633f, 0000000000000000000000000000000000000000000000000000000064d1c2cf, 0000000000000000000000000000000000000000000000000000000001108c63, 000000000000000000000000000000000000000000000000000000000110a2ef, 0000000000000000000000000000000000000000000000000000000000000000 )
386 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1873814, gasPrice=13622656268, amountPaid=25006594467621528 )

Account State Difference:

  Address   Before After State Difference Code
(Faith Builder)
4.266166690890248877 Eth4.266258545790248877 Eth0.0000918549
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
5.000641693206112028 Eth
Nonce: 254425
5.000622133089103292 Eth
Nonce: 254426
0.000019560117008736
0xe64a54E2...80E2E4eb5 628.621591074997331679 Eth628.596584480529710151 Eth0.025006594467621528

Execution Trace

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

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

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

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

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