solidity icon indicating copy to clipboard operation
solidity copied to clipboard

Packed layout for memory arrays with small base types.

Open jrynkiew opened this issue 2 years ago • 4 comments

I think we should look into memory handling on EVM, and not into gas cost reimbursement mechanisms. Obviously there is no benefit to using anything apart from strings in the EVM for max contract memory storage handling, as uint8's occupy a much larger memory slot than they should.

Please look into EVM memory management, as I am intending to store massive data on EVM compatible smart contracts on IoTeX blockchain throughout a chain 10,000+ interconnected smart contracts, and memory optimization + compression are a top priority for me.

Please see below npx hardhat test results:

jeremi@jeremi-ThinkPad-X260:~/Code/JRPC_Alpha$ npx hardhat test


  Test1. Deploy contract with given string. Compare deployed contract string contents with initial string. Change string. Compare again
**********************************
Deploying smart contract with data string....
**********************************
Contents of deployed smart contract:
**********************************
676C544602000000EFBFBD580E00380D00004A534F4E7B226173736574223A7B2267656E657261746F72223A224B68726F6E6F7320676C544620426C656E64657220492F4F2076312E382E3139222C2276657273696F6E223A22322E30227D2C227363656E65223A302C227363656E6573223A5B7B226E616D65223A225363656E65222C226E6F646573223A5B302C312C325D7D5D2C226E6F646573223A5B7B226D657368223A302C226E616D65223A22436972636C65222C227472616E736C6174696F6E223A5B302C2D302E33303030303030313139323039323839362C305D7D2C7B226D657368223A312C226E616D65223A22436972636C652E303032222C227472616E736C6174696F6E223A5B302E303030343030353336363335343234393431382C2D302E30313639373137363639343836393939352C305D7D2C7B226D657368223A322C226E616D65223A22436972636C652E303031222C227472616E736C6174696F6E223A5B302C2D302E33303030303030313139323039323839362C305D7D5D2C226D6174657269616C73223A5B7B22646F75626C655369646564223A747275652C226E616D65223A224F757465722053746172222C227062724D6574616C6C6963526F7567686E657373223A7B2262617365436F6C6F7254657874757265223A7B22696E646578223A307D2C22726F7567686E657373466163746F72223A302E31393939393939383830373930373130347D7D2C7B22646F75626C655369646564223A747275652C226E616D65223A224D6174657269616C2E303031222C227062724D6574616C6C6963526F7567686E657373223A7B2262617365436F6C6F7254657874757265223A7B22696E646578223A317D2C22726F7567686E657373466163746F72223A307D7D2C7B22646F75626C655369646564223A747275652C226E616D65223A224D6174657269616C2E303032222C227062724D6574616C6C6963526F7567686E657373223A7B2262617365436F6C6F7254657874757265223A7B22696E646578223A327D2C22726F7567686E657373466163746F72223A307D7D5D2C226D6573686573223A5B7B226E616D65223A22436972636C652E303036222C227072696D697469766573223A5B7B2261747472696275746573223A7B22504F534954494F4E223A302C224E4F524D414C223A312C22544558434F4F52445F30223A327D2C22696E6469636573223A332C226D6174657269616C223A307D5D7D2C7B226E616D65223A22436972636C652E303038222C227072696D697469766573223A5B7B2261747472696275746573223A7B22504F534954494F4E223A342C224E4F524D414C223A352C22544558434F4F52445F30223A367D2C22696E6469636573223A372C226D6174657269616C223A317D5D7D2C7B226E616D65223A22436972636C652E303130222C227072696D697469766573223A5B7B2261747472696275746573223A7B22504F534954494F4E223A382C224E4F524D414C223A392C22544558434F4F52445F30223A31307D2C22696E6469636573223A31312C226D6174657269616C223A327D5D7D5D2C227465787475726573223A5B7B2273616D706C6572223A302C22736F75726365223A307D2C7B2273616D706C6572223A302C22736F75726365223A317D2C7B2273616D706C6572223A302C22736F75726365223A327D5D2C22696D61676573223A5B7B2262756666657256696577223A342C226D696D6554797065223A22696D6167652F706E67222C226E616D65223A224F757465722053746172227D2C7B2262756666657256696577223A392C226D696D6554797065223A22696D6167652F706E67222C226E616D65223A22496E6E65722053746172227D2C7B2262756666657256696577223A31342C226D696D6554797065223A22696D6167652F706E67222C226E616D65223A224F757465722052696D227D5D2C226163636573736F7273223A5B7B2262756666657256696577223A302C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3130302C226D6178223A5B312E393032313132393630383135343239372C302E363030303030303233383431383537392C312E363138303334313234333734333839365D2C226D696E223A5B2D312E393032313133303830303234373139322C302C2D325D2C2274797065223A2256454333227D2C7B2262756666657256696577223A312C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3130302C2274797065223A2256454333227D2C7B2262756666657256696577223A322C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3130302C2274797065223A2256454332227D2C7B2262756666657256696577223A332C22636F6D706F6E656E7454797065223A353132332C22636F756E74223A3132302C2274797065223A225343414C4152227D2C7B2262756666657256696577223A352C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3130302C226D6178223A5B302E393531303536343830343037373134382C302E33313439343635363230353137373330372C302E383039303137303632313837313934385D2C226D696E223A5B2D302E393531303536353430303132333539362C2D302E323831313431343330313339353431362C2D315D2C2274797065223A2256454333227D2C7B2262756666657256696577223A362C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3130302C2274797065223A2256454333227D2C7B2262756666657256696577223A372C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3130302C2274797065223A2256454332227D2C7B2262756666657256696577223A382C22636F6D706F6E656E7454797065223A353132332C22636F756E74223A3132302C2274797065223A225343414C4152227D2C7B2262756666657256696577223A31302C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3435352C226D6178223A5B312E313134303434393034373038383632332C302E352C302E393437363633333636373934353836325D2C226D696E223A5B2D312E313134303435303233393138313531392C302E31303030303030303134393031313631322C2D312E313731333736323238333332353139355D2C2274797065223A2256454333227D2C7B2262756666657256696577223A31312C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3435352C2274797065223A2256454333227D2C7B2262756666657256696577223A31322C22636F6D706F6E656E7454797065223A353132362C22636F756E74223A3435352C2274797065223A2256454332227D2C7B2262756666657256696577223A31332C22636F6D706F6E656E7454797065223A353132332C22636F756E74223A3936302C2274797065223A225343414C4152227D5D2C226275666665725669657773223A5B7B22627566666572223A302C22627974654C656E677468223A313230302C22627974654F6666736574223A307D2C7B22627566666572223A302C22627974654C656E677468223A313230302C22627974654F6666736574223A313230307D2C7B22627566666572223A302C22627974654C656E677468223A3830302C22627974654F6666736574223A323430307D2C7B22627566666572223A302C22627974654C656E677468223A3234302C22627974654F6666736574223A333230307D2C7B22627566666572223A302C22627974654C656E677468223A3330343437312C22627974654F6666736574223A333434307D2C7B22627566666572223A302C22627974654C656E677468223A313230302C22627974654F6666736574223A3330373931327D2C7B22627566666572223A302C22627974654C656E677468223A313230302C22627974654F6666736574223A3330393131327D2C7B22627566666572223A302C22627974654C656E677468223A3830302C22627974654F6666736574223A3331303331327D2C7B22627566666572223A302C22627974654C656E677468223A3234302C22627974654F6666736574223A3331313131327D2C7B22627566666572223A302C22627974654C656E677468223A3330343437332C22627974654F6666736574223A3331313335327D2C7B22627566666572223A302C22627974654C656E677468223A353436302C22627974654F6666736574223A3631353832387D2C7B22627566666572223A302C22627974654C656E677468223A353436302C22627974654F6666736574223A3632313238387D2C7B22627566666572223A302C22627974654C656E677468223A333634302C22627974654F6666736574223A3632363734387D2C7B22627566666572223A302C22627974654C656E677468223A313932302C22627974654F6666736574223A3633303338387D2C7B22627566666572223A302C22627974654C656E677468223A3330343437312C22627974654F6666736574223A3633323330387D5D2C2273616D706C657273223A5B7B226D616746696C746572223A393732392C226D696E46696C746572223A393938377D5D2C2262756666657273223A5B7B22627974654C656E677468223A3933363738307D5D7D2020204C4B0E0042494E00000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD000000004AEFBFBD3E000000EFBFBD0000000000000000000000EFBFBD0000000000000000000000EFBFBD0000000000000000000000EFBFBD0000000000000000000000EFBFBD44EFBFBDEFBFBD000000005FEFBFBD1EEFBFBD44EFBFBDEFBFBD000000005FEFBFBD1EEFBFBD44EFBFBDEFBFBD000000005FEFBFBD1EEFBFBD44EFBFBDEFBFBD000000005FEFBFBD1EEFBFBD7178EFBFBD0000000079371EEFBFBD7178EFBFBD0000000079371EEFBFBD7178EFBFBD0000000079371EEFBFBD7178EFBFBD0000000079371EEFBFBD15EFBFBD3AEFBFBD0000000060EFBFBD723E15EFBFBD3AEFBFBD0000000060EFBFBD723E15EFBFBD3AEFBFBD0000000060EFBFBD723E15EFBFBD3AEFBFBD0000000060EFBFBD723E1779EFBFBDEFBFBD00000000EFBFBD1BEFBFBD3F1779EFBFBDEFBFBD00000000EFBFBD1BEFBFBD3F1779EFBFBDEFBFBD00000000EFBFBD1BEFBFBD3F1779EFBFBDEFBFBD00000000EFBFBD1BEFBFBD3F0020EFBFBD3300000000EFBFBD4B443F0020EFBFBD3300000000EFBFBD4B443F0020EFBFBD3300000000EFBFBD4B443F0020EFBFBD3300000000EFBFBD4B443F1A79EFBFBD3F00000000EFBFBD1BEFBFBD3F1A79EFBFBD3F00000000EFBFBD1BEFBFBD3F1A79EFBFBD3F00000000EFBFBD1BEFBFBD3F1A79EFBFBD3F00000000EFBFBD1BEFBFBD3F15EFBFBD3A3F0000000062EFBFBD723E15EFBFBD3A3F0000000062EFBFBD723E15EFBFBD3A3F0000000062EFBFBD723E15EFBFBD3A3F0000000062EFBFBD723E7078EFBFBD3F000000007E371EEFBFBD7078EFBFBD3F000000007E371EEFBFBD7078EFBFBD3F000000007E371EEFBFBD7078EFBFBD3F000000007E371EEFBFBD46EFBFBDEFBFBD3E000000005FEFBFBD1EEFBFBD46EFBFBDEFBFBD3E000000005FEFBFBD1EEFBFBD46EFBFBDEFBFBD3E000000005FEFBFBD1EEFBFBD46EFBFBDEFBFBD3E000000005FEFBFBD1EEFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBD4FEFBFBD3E000000EFBFBD00000000EFBFBDEFBFBD193F000000EFBFBD00000000EFBFBDEFBFBD193F000000EFBFBD00000000EFBFBDEFBFBD193F000000EFBFBD00000000EFBFBDEFBFBD193F000000EFBFBD44EFBFBDE6BE9AEFBFBD193F5FEFBFBD1EEFBFBD44EFBFBDE6BE9AEFBFBD193F5FEFBFBD1EEFBFBD44EFBFBDE6BE9AEFBFBD193F5FEFBFBD1EEFBFBD44EFBFBDE6BE9AEFBFBD193F5FEFBFBD1EEFBFBD7178F3BF9A99193F79371EEFBFBD7178F3BF9A99193F79371EEFBFBD7178F3BF9A99193F79371EEFBFBD7178F3BF9A99193F79371EEFBFBD15EFBFBD3AEFBFBDEFBFBDEFBFBD193F60EFBFBD723E15EFBFBD3AEFBFBDEFBFBDEFBFBD193F60EFBFBD723E15EFBFBD3AEFBFBDEFBFBDEFBFBD193F60EFBFBD723E15EFBFBD3AEFBFBDEFBFBDEFBFBD193F60EFBFBD723E1779EFBFBDEFBFBDEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F1779EFBFBDEFBFBDEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F1779EFBFBDEFBFBDEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F1779EFBFBDEFBFBDEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F0020EFBFBD33EFBFBDEFBFBD193FEFBFBD4B443F0020EFBFBD33EFBFBDEFBFBD193FEFBFBD4B443F0020EFBFBD33EFBFBDEFBFBD193FEFBFBD4B443F0020EFBFBD33EFBFBDEFBFBD193FEFBFBD4B443F1A79EFBFBD3FEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F1A79EFBFBD3FEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F1A79EFBFBD3FEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F1A79EFBFBD3FEFBFBDEFBFBD193FEFBFBD1BEFBFBD3F15EFBFBD3A3FEFBFBDEFBFBD193F62EFBFBD723E15EFBFBD3A3FEFBFBDEFBFBD193F62EFBFBD723E15EFBFBD3A3FEFBFBDEFBFBD193F62EFBFBD723E15EFBFBD3A3FEFBFBDEFBFBD193F62EFBFBD723E7078EFBFBD3FEFBFBDEFBFBD193F7E371EEFBFBD7078EFBFBD3FEFBFBDEFBFBD193F7E371EEFBFBD7078EFBFBD3FEFBFBDEFBFBD193F7E371EEFBFBD7078EFBFBD3FEFBFBDEFBFBD193F7E371EEFBFBD46EFBFBDEFBFBD3EEFBFBDEFBFBD193F5FEFBFBD1EEFBFBD46EFBFBDEFBFBD3EEFBFBDEFBFBD193F5FEFBFBD1EEFBFBD46EFBFBDEFBFBD3EEFBFBDEFBFBD193F5FEFBFBD1EEFBFBD46EFBFBDEFBFBD3EEFBFBDEFBFBD193F5FEFBFBD1EEFBFBD67EFBFBDEFBFBDEFBFBD71776CEFBFBD0E48EFBFBD3D2776EFBFBDEFBFBD72776CEFBFBD22EFBFBDEFBFBD3D011A67EFBFBD73776CEFBFBD34EFBFBDEFBFBDEFBFBD321866EFBFBD72776CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD694E1FEFBFBD71776CEFBFBDEFBFBD28EFBFBD3EEFBFBD531F3A72776CEFBFBDEFBFBD28EFBFBD3E3018663E72776CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD19673E71776CEFBFBD37EFBFBDEFBFBDEFBFBD2A76EFBFBD3E72776CEFBFBD24EFBFBDEFBFBD3D66EFBFBDEFBFBD3E71776CEFBFBDEFBFBD47EFBFBD3D3C5873EFBFBD000000002FEFBFBDEFBFBDEFBFBD2776EFBFBDEFBFBD72776CEFBFBD22EFBFBDEFBFBD3D2A76EFBFBD3E72776CEFBFBD24EFBFBDEFBFBD3D3C58733F0000000030EFBFBDEFBFBDEFBFBD3C5873EFBFBD000000002FEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDCFBA00000000EFBFBDEFBFBD7FEFBFBDEFBFBD531F3A72776CEFBFBDEFBFBD28EFBFBD3E2A76EFBFBD3E72776CEFBFBD24EFBFBDEFBFBD3D28EFBFBD16EFBFBD00000000EFBFBDEFBFBD4E3FEFBFBDEFBFBDCFBA00000000EFBFBDEFBFBD7FEFBFBDEFBFBD531F3A72776CEFBFBDEFBFBD28EFBFBD3EEFBFBD19673E71776CEFBFBD37EFBFBDEFBFBDEFBFBD7DEFBFBD73EFBFBD00000000EFBFBD71EFBFBDEFBFBD28EFBFBD16EFBFBD00000000EFBFBDEFBFBD4E3FEFBFBD19673E71776CEFBFBD37EFBFBDEFBFBDEFBFBD66EFBFBDEFBFBD3E71776CEFBFBDEFBFBD47EFBFBD3D7DEFBFBD73EFBFBD00000000EFBFBD71EFBFBDEFBFBD321866EFBFBD72776CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD66EFBFBDEFBFBD3E71776CEFBFBDEFBFBD47EFBFBD3DEFBFBD24163F00000000EFBFBD584F3FEFBFBD2416EFBFBD00000000EFBFBD584F3F321866EFBFBD72776CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD3018663E72776CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD24163F00000000EFBFBD584F3FEFBFBD2416EFBFBD00000000EFBFBD584F3F67EFBFBDEFBFBDEFBFBD71776CEFBFBD0E48EFBFBD3D3018663E72776CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD7CEFBFBD733F00000000EFBFBD71EFBFBDEFBFBD67EFBFBDEFBFBDEFBFBD71776CEFBFBD0E48EFBFBD3D011A67EFBFBD73776CEFBFBD34EFBFBDEFBFBDEFBFBD2CEFBFBD163F00000000EFBFBDEFBFBD4E3F7CEFBFBD733F00000000EFBFBD71EFBFBDEFBFBD011A67EFBFBD73776CEFBFBD34EFBFBDEFBFBDEFBFBD694E1FEFBFBD71776CEFBFBDEFBFBD28EFBFBD3EEFBFBDEFBFBDEFBFBD3A00000000EFBFBDEFBFBD7FEFBFBD2CEFBFBD163F00000000EFBFBDEFBFBD4E3F2776EFBFBDEFBFBD72776CEFBFBD22EFBFBDEFBFBD3D694E1FEFBFBD71776CEFBFBDEFBFBD28EFBFBD3EEFBFBDEFBFBDEFBFBD3A00000000EFBFBDEFBFBD7FEFBFBD3C58733F0000000030EFBFBDEFBFBDEFBFBD67EFBFBDEFBFBDEFBFBD71776C3F0E48EFBFBD3D2576EFBFBDEFBFBD72776C3F22EFBFBDEFBFBD3D021A67EFBFBD73776C3F34EFBFBDEFBFBDEFBFBD2C1866EFBFBD72776C3FEFBFBDEFBFBDEFBFBDEFBFBD5D4C1FEFBFBD71776C3FEFBFBD28EFBFBD3E71501F3A72776C3FEFBFBD28EFBFBD3E2E18663E72776C3FEFBFBDEFBFBDEFBFBDEFBFBD001A673E71776C3F37EFBFBDEFBFBDEFBFBD2876EFBFBD3E72776C3F24EFBFBDEFBFBD3D66EFBFBDEFBFBD3E73776C3F0048EFBFBD3D3C5873EFBFBD000000002FEFBFBDEFBFBDEFBFBD2576EFBFBDEFBFBD72776C3F22EFBFBDEFBFBD3D2876EFBFBD3E72776C3F24EFBFBDEFBFBD3D3C58733F0000000030EFBFBDEFBFBDEFBFBD3C5873EFBFBD000000002FEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDCFBA00000000EFBFBDEFBFBD7FEFBFBD71501F3A72776C3FEFBFBD28EFBFBD3E2876EFBFBD3E72776C3F24EFBFBDEFBFBD3D28EFBFBD16EFBFBD00000000EFBFBDEFBFBD4E3FEFBFBDEFBFBDCFBA00000000EFBFBDEFBFBD7FEFBFBD71501F3A72776C3FEFBFBD28EFBFBD3E001A673E71776C3F37EFBFBDEFBFBDEFBFBD7DEFBFBD73EFBFBD00000000EFBFBD71EFBFBDEFBFBD28EFBFBD16EFBFBD00000000EFBFBDEFBFBD4E3F001A673E71776C3F37EFBFBDEFBFBDEFBFBD66EFBFBDEFBFBD3E73776C3F0048EFBFBD3D7DEFBFBD73EFBFBD00000000EFBFBD71EFBFBDEFBFBD2C1866EFBFBD72776C3FEFBFBDEFBFBDEFBFBDEFBFBD66EFBFBDEFBFBD3E73776C3F0048EFBFBD3DEFBFBD24163F00000000EFBFBD584F3FEFBFBD2416EFBFBD00000000EFBFBD584F3F2C1866EFBFBD72776C3FEFBFBDEFBFBDEFBFBDEFBFBD2E18663E72776C3FEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD24163F00000000EFBFBD584F3FEFBFBD2416EFBFBD00000000EFBFBD584F3F67EFBFBDEFBFBDEFBFBD71776C3F0E48EFBFBD3D2E18663E72776C3FEFBFBDEFBFBDEFBFBDEFBFBD7CEFBFBD733F00000000EFBFBD71EFBFBDEFBFBD67EFBFBDEFBFBDEFBFBD71776C3F0E48EFBFBD3D021A67EFBFBD73776C3F34EFBFBDEFBFBDEFBFBD2CEFBFBD163F00000000EFBFBDEFBFBD4E3F7CEFBFBD733F00000000EFBFBD71EFBFBDEFBFBD021A67EFBFBD73776C3F34EFBFBDEFBFBDEFBFBD5D4C1FEFBFBD71776C3FEFBFBD28EFBFBD3EEFBFBDEFBFBDEFBFBD3A00000000EFBFBDEFBFBD7FEFBFBD2CEFBFBD163F00000000EFBFBDEFBFBD4E3F2576EFBFBDEFBFBD72776C3F22EFBFBDEFBFBD3D5D4C1FEFBFBD71776C3FEFBFBD28EFBFBD3EEFBFBDEFBFBDEFBFBD3A00000000EFBFBDEFBFBD7FEFBFBD3C58733F0000000030EFBFBDEFBFBDEFBFBD17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363F17EFBFBDEFBFBD3E770A363FEFBFBD75EFBFBD3D5843383FEFBFBD75EFBFBD3D5843383FEFBFBD75EFBFBD3D5843383FEFBFBD75EFBFBD3D5843383FEFBFBD1D433E0A55213FEFBFBD1D433E0A55213FEFBFBD1D433E0A55213FEFBFBD1D433E0A55213FEFBFBDEFBFBD653E18EFBFBDEFBFBD3EEFBFBDEFBFBD653E18EFBFBDEFBFBD3EEFBFBDEFBFBD653E18EFBFBDEFBFBD3EEFBFBDEFBFBD653E18EFBFBDEFBFBD3E1801EFBFBD3E3E13143F1801EFBFBD3E3E13143F1801EFBFBD3E3E13143F1801EFBFBD3E3E13143F491BEFBFBD3EEFBFBDEFBFBD113F491BEFBFBD3EEFBFBDEFBFBD113F491BEFBFBD3EEFBFBDEFBFBD113F491BEFBFBD3EEFBFBDEFBFBD113F60EFBFBDEFBFBD3EEFBFBDEFBFBD353F60EFBFBDEFBFBD3EEFBFBDEFBFBD353F60EFBFBDEFBFBD3EEFBFBDEFBFBD353F60EFBFBDEFBFBD3EEFBFBDEFBFBD353FEFBFBD54EFBFBD3EEFBFBDEFBFBD563FEFBFBD54EFBFBD3EEFBFBDEFBFBD563FEFBFBD54EFBFBD3EEFBFBDEFBFBD563FEFBFBD54EFBFBD3EEFBFBDEFBFBD563FEFBFBD14EFBFBD3EEFBFBDEFBFBD573FEFBFBD14EFBFBD3EEFBFBDEFBFBD573FEFBFBD14EFBFBD3EEFBFBDEFBFBD573FEFBFBD14EFBFBD3EEFBFBDEFBFBD573F21EFBFBD763EEFBFBDEFBFBD6E3F21EFBFBD763EEFBFBDEFBFBD6E3F21EFBFBD763EEFBFBDEFBFBD6E3F21EFBFBD763EEFBFBDEFBFBD6E3FEFBFBD72443E3A354B3FEFBFBD72443E3A354B3FEFBFBD72443E3A354B3FEFBFBD72443E3A354B3FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBD6C4C3FEFBFBD5F433FEFBFBDEFBFBDEFBFBD38760A363F37EFBFBD383F48EFBFBD7F3F37EFBFBD383F48EFBFBD7F3FEFBFBDEFBFBDEFBFBD38760A363F34EFBFBDEFBFBD3DEFBFBDEFBFBD143F34EFBFBDEFBFBD3DEFBFBDEFBFBD143F1366543F42EFBFBD5B3F1366543F42EFBFBD5B3F6BEFBFBD563E4A37EFBFBD3E6BEFBFBD563E4A37EFBFBD3E47EFBFBD7F3FEFBFBDEFBFBD683F47EFBFBD7F3FEFBFBDEFBFBD683F20EFBFBDEFBFBD3E6819EFBFBD3E20EFBFBDEFBFBD3E6819EFBFBD3E763A663FEFBFBD5F433F763A663FEFBFBD5F433FEFBFBDEFBFBD0C3F0C59083F47EFBFBD7F3F24EFBFBD1D3F47EFBFBD7F3F24EFBFBD1D3FEFBFBDEFBFBD0C3F0C59083F2EEFBFBD083F667F343F1466543FEFBFBDEFBFBD2A3F1466543FEFBFBDEFBFBD2A3F2EEFBFBD083F667F343FEFBFBDEFBFBD0C3FEFBFBD633F3BEFBFBD383FEFBFBDEFBFBD063F3BEFBFBD383FEFBFBDEFBFBD063FEFBFBDEFBFBD0C3FEFBFBD633FEFBFBDEFBFBD373F3935343FEFBFBDEFBFBD373F3935343F0CEFBFBDEFBFBD3E11EFBFBD6D3F0CEFBFBDEFBFBD3E11EFBFBD6D3F1BEFBFBD0C3FEFBFBD5F433F1BEFBFBD0C3FEFBFBD5F433F61EFBFBD563E48EFBFBD7F3F61EFBFBD563E48EFBFBD7F3FEFBFBDEFBFBD373FEFBFBDEFBFBD523FEFBFBDEFBFBD373FEFBFBDEFBFBD523FEFBFBD2DEFBFBD3D7DEFBFBD593FEFBFBD2DEFBFBD3D7DEFBFBD593F080011000C0005001400100007001800150009001C00190003001F001B0006002400200000002600230002002A00270004002F002B0001000B002E003A003E004300370042004600390047004A003B004B004E0035004D005100380052005600320055005800340059005C0036005D006100330060003D001D00210053001D0053004F00250029005B0025005B0057000F00130045000F00450041002C00300062002C0062005E000A000E0040000A0040003C0016001A004C0016004C0048001E00220054001E005400500028002D005F0028005F005A0012001700490012004900440031000D003F0031003F006300EFBFBD504E470D0A1A0A0000000D4948445200001000000010000806000000EFBFBD2417000000097048597300000B1300000B130100EFBFBDEFBFBD1800002000494441547801EFBFBDDCB10D0021100341EFBFBDEFBFBDEFBFBD01EFBFBD22EFBFBD605EEFBFBD63EFBFBD39EFBFBDEFBFBD63EFBFBDEFBFBD47EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408EFBFBD14583F1FEFBFBD3601020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020EFBFBD040C00680201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBDEFBFBD31EFBFBDEFBFBD0000200049444154030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEFBFBD01001D2040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010201010300EFBFBD23EFBFBD40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040C00EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081008081800081C4104020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040810206000400708102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD4040EFBFBD0040EFBFBD0822102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000103003A40EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020402020600024710EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081800EFBFBD01020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00010204081020101030001038EFBFBD080408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBD0E102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD00EFBFBDEFBFBDEFBFBD01EFBFBDEFBFBD11442040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102060074EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD000102040804040C0004EFBFBD200201020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408103000EFBFBD030408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040202060002070041108102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBD0001020408102040EFBFBDEF
**********************************
Compairing values of Smart Contract contents to input variable.
**********************************
Modifying smart contract
**********************************
Contents of smart contract after modification
**********************************
Hola, mundo!
**********************************
Checking if transaction is mined
**********************************
Checking if the contract updated correctly
**********************************
End of Test
    ✔ Should return the new string once it's changed (5679ms)

  Test 2. Read file, encode it, deploy, return and compare arrays
**********************************
read in the file ./assets/star.glb
**********************************
<Buffer 67 6c 54 46 02 00 00 00 a0 58 0e 00 38 0d 00 00 4a 53 4f 4e 7b 22 61 73 73 65 74 22 3a 7b 22 67 65 6e 65 72 61 74 6f 72 22 3a 22 4b 68 72 6f 6e 6f 73 ... 940142 more bytes>
**********************************
Encoded file. encoded into Uint8Array of size 255. Anything past this size fails to deploy.
**********************************
Uint8Array(255) [
  103, 108,  84,  70,   2,   0,   0,   0, 239, 191, 189,  88,
   14,   0,  56,  13,   0,   0,  74,  83,  79,  78, 123,  34,
   97, 115, 115, 101, 116,  34,  58, 123,  34, 103, 101, 110,
  101, 114,  97, 116, 111, 114,  34,  58,  34,  75, 104, 114,
  111, 110, 111, 115,  32, 103, 108,  84,  70,  32,  66, 108,
  101, 110, 100, 101, 114,  32,  73,  47,  79,  32, 118,  49,
   46,  56,  46,  49,  57,  34,  44,  34, 118, 101, 114, 115,
  105, 111, 110,  34,  58,  34,  50,  46,  48,  34, 125,  44,
   34, 115,  99, 101,
  ... 155 more items
]
**********************************
Compiling smart contract....
**********************************
Deploying smart contract....
**********************************
Contents of smart contract:
**********************************
Contract {
  interface: Interface {
    fragments: [ [ConstructorFragment], [FunctionFragment], [FunctionFragment] ],
    _abiCoder: AbiCoder { coerceFunc: null },
    functions: {
      'greet()': [FunctionFragment],
      'setGreeting(bytes)': [FunctionFragment]
    },
    errors: {},
    events: {},
    structs: {},
    deploy: ConstructorFragment {
      name: null,
      type: 'constructor',
      inputs: [Array],
      payable: false,
      stateMutability: 'nonpayable',
      gas: null,
      _isFragment: true
    },
    _isInterface: true
  },
  provider: EthersProviderWrapper {
    _isProvider: true,
    _events: [],
    _emitted: {
      block: -2,
      't:0x5776d2e98a703991c5a1cb497d3f839a2a5037c0db6157c469c65278751514d9': 1,
      't:0xdd63a23c79e2a630add6cfd34c9eaa95677300841330cfd34e847e75485bac48': 2
    },
    disableCcipRead: false,
    formatter: Formatter { formats: [Object] },
    anyNetwork: false,
    _networkPromise: Promise { [Object] },
    _maxInternalBlockNumber: 0,
    _lastBlockNumber: -2,
    _maxFilterBlockRange: 10,
    _pollingInterval: 4000,
    _fastQueryDate: 1659570751857,
    connection: { url: 'http://localhost:8545' },
    _nextId: 42,
    _hardhatProvider: BackwardsCompatibilityProviderAdapter {
      _wrapped: [FixedGasProvider],
      _provider: [FixedGasProvider],
      sendAsync: [Function: bound sendAsync],
      send: [Function: bound send],
      _sendJsonRpcRequest: [Function: bound _sendJsonRpcRequest] AsyncFunction
    },
    _eventLoopCache: { detectNetwork: [Promise] },
    _network: { chainId: 31337, name: 'unknown' },
    _internalBlockNumber: Promise { [Object] },
    _fastBlockNumber: 0,
    _fastBlockNumberPromise: Promise { 0 }
  },
  signer: SignerWithAddress {
    _isSigner: true,
    address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
    _signer: JsonRpcSigner {
      _isSigner: true,
      provider: [EthersProviderWrapper],
      _address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
      _index: null
    },
    provider: EthersProviderWrapper {
      _isProvider: true,
      _events: [],
      _emitted: [Object],
      disableCcipRead: false,
      formatter: [Formatter],
      anyNetwork: false,
      _networkPromise: [Promise],
      _maxInternalBlockNumber: 0,
      _lastBlockNumber: -2,
      _maxFilterBlockRange: 10,
      _pollingInterval: 4000,
      _fastQueryDate: 1659570751857,
      connection: [Object],
      _nextId: 42,
      _hardhatProvider: [BackwardsCompatibilityProviderAdapter],
      _eventLoopCache: [Object],
      _network: [Object],
      _internalBlockNumber: [Promise],
      _fastBlockNumber: 0,
      _fastBlockNumberPromise: [Promise]
    }
  },
  callStatic: {
    'greet()': [Function (anonymous)],
    'setGreeting(bytes)': [Function (anonymous)],
    greet: [Function (anonymous)],
    setGreeting: [Function (anonymous)]
  },
  estimateGas: {
    'greet()': [Function (anonymous)],
    'setGreeting(bytes)': [Function (anonymous)],
    greet: [Function (anonymous)],
    setGreeting: [Function (anonymous)]
  },
  functions: {
    'greet()': [Function (anonymous)],
    'setGreeting(bytes)': [Function (anonymous)],
    greet: [Function (anonymous)],
    setGreeting: [Function (anonymous)]
  },
  populateTransaction: {
    'greet()': [Function (anonymous)],
    'setGreeting(bytes)': [Function (anonymous)],
    greet: [Function (anonymous)],
    setGreeting: [Function (anonymous)]
  },
  filters: {},
  _runningEvents: {},
  _wrappedEmits: {},
  address: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0',
  resolvedAddress: Promise { '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' },
  'greet()': [Function (anonymous)],
  'setGreeting(bytes)': [Function (anonymous)],
  greet: [Function (anonymous)],
  setGreeting: [Function (anonymous)],
  deployTransaction: {
    hash: '0x20c4ac227cc0ce4b1946d4fe7d989da8d2e3ba15d4416ef471bf9ea562b20a6b',
    type: 2,
    accessList: [],
    blockHash: '0xb73fa57f3f3d9692d4b057a286f79d8a7ea5c73534bf44b8c9c4fd3ca86ab741',
    blockNumber: 3,
    transactionIndex: 0,
    confirmations: 1,
    from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
    gasPrice: BigNumber { value: "1902430604" },
    maxPriorityFeePerGas: BigNumber { value: "1000000000" },
    maxFeePerGas: BigNumber { value: "2804861208" },
    gasLimit: BigNumber { value: "744005" },
    to: null,
    value: BigNumber { value: "0" },
    nonce: 2,
    data: '0x60806040523480156200001157600080fd5b50604051620009b7380380620009b7833981810160405281019062000037919062000272565b620000416200011d565b60005b82518160ff1610156200010057828160ff16815181106200008e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c828260ff1660ff8110620000d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060ff16908160ff16815250508080620000f7906200038f565b91505062000044565b508060009060ff6200011492919062000140565b5050506200042d565b60405180611fe0016040528060ff90602082028036833780820191505090505090565b8260ff601f01602090048101928215620001ce5791602002820160005b838211156200019d57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200015d565b8015620001cc5782816101000a81549060ff02191690556001016020816000010492830192600103026200019d565b505b509050620001dd9190620001e1565b5090565b5b80821115620001fc576000816000905550600101620001e2565b5090565b6000620002176200021184620002e0565b620002b7565b9050828152602081018484840111156200023057600080fd5b6200023d84828562000323565b509392505050565b600082601f8301126200025757600080fd5b81516200026984826020860162000200565b91505092915050565b6000602082840312156200028557600080fd5b600082015167ffffffffffffffff811115620002a057600080fd5b620002ae8482850162000245565b91505092915050565b6000620002c3620002d6565b9050620002d1828262000359565b919050565b6000604051905090565b600067ffffffffffffffff821115620002fe57620002fd620003ed565b5b62000309826200041c565b9050602081019050919050565b600060ff82169050919050565b60005b838110156200034357808201518184015260208101905062000326565b8381111562000353576000848401525b50505050565b62000364826200041c565b810181811067ffffffffffffffff82111715620003865762000385620003ed565b5b80604052505050565b60006200039c8262000316565b915060ff821415620003b357620003b2620003be565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61057a806200043d6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b8e46d3a1461003b578063cfae321714610057575b600080fd5b61005560048036038101906100509190610300565b610075565b005b61005f61014d565b60405161006c91906103bf565b60405180910390f35b61007d6101be565b60005b82518160ff16101561013657828160ff16815181106100c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c828260ff1660ff8110610112577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060ff16908160ff1681525050808061012e906104ab565b915050610080565b508060009060ff6101489291906101e1565b505050565b6101556101be565b600060ff80602002604051908101604052809291908260ff80156101b4576020028201916000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161017d5790505b5050505050905090565b60405180611fe0016040528060ff90602082028036833780820191505090505090565b8260ff601f0160209004810192821561026a5791602002820160005b8382111561023b57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026101fd565b80156102685782816101000a81549060ff021916905560010160208160000104928301926001030261023b565b505b509050610277919061027b565b5090565b5b8082111561029457600081600090555060010161027c565b5090565b60006102ab6102a684610400565b6103db565b9050828152602081018484840111156102c357600080fd5b6102ce84828561046b565b509392505050565b600082601f8301126102e757600080fd5b81356102f7848260208601610298565b91505092915050565b60006020828403121561031257600080fd5b600082013567ffffffffffffffff81111561032c57600080fd5b610338848285016102d6565b91505092915050565b600061034d83836103b0565b60208301905092915050565b6103628161043b565b61036c8184610453565b925061037782610431565b8060005b838110156103a857815161038f8782610341565b965061039a83610446565b92505060018101905061037b565b505050505050565b6103b98161045e565b82525050565b6000611fe0820190506103d56000830184610359565b92915050565b60006103e56103f6565b90506103f1828261047a565b919050565b6000604051905090565b600067ffffffffffffffff82111561041b5761041a610504565b5b61042482610533565b9050602081019050919050565b6000819050919050565b600060ff9050919050565b6000602082019050919050565b600081905092915050565b600060ff82169050919050565b82818337600083830152505050565b61048382610533565b810181811067ffffffffffffffff821117156104a2576104a1610504565b5b80604052505050565b60006104b68261045e565b915060ff8214156104ca576104c96104d5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f830116905091905056fea2646970667358221220e9b71659db8d42255f6c51811b1d301fadb2b17da2f3d34f04b8eb332d58c41064736f6c63430008040033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000ff676c544602000000efbfbd580e00380d00004a534f4e7b226173736574223a7b2267656e657261746f72223a224b68726f6e6f7320676c544620426c656e64657220492f4f2076312e382e3139222c2276657273696f6e223a22322e30227d2c227363656e65223a302c227363656e6573223a5b7b226e616d65223a225363656e65222c226e6f646573223a5b302c312c325d7d5d2c226e6f646573223a5b7b226d657368223a302c226e616d65223a22436972636c65222c227472616e736c6174696f6e223a5b302c2d302e33303030303030313139323039323839362c305d7d2c7b226d657368223a312c226e616d65223a22436972636c652e30303200',
    r: '0x71a3243ea5e7dae6b4046d28178e38dab279337794366b7f5e040b6d8c41f695',
    s: '0x4022ea5094c4aef41ed1dae63395ef6095a79b856628a3eb36491d94ca14d57f',
    v: 0,
    creates: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0',
    chainId: 31337,
    wait: [Function (anonymous)]
  }
}
**********************************
Contents of deployed array:
**********************************
[
  103, 108,  84,  70,   2,   0,   0,   0, 239, 191, 189,  88,
   14,   0,  56,  13,   0,   0,  74,  83,  79,  78, 123,  34,
   97, 115, 115, 101, 116,  34,  58, 123,  34, 103, 101, 110,
  101, 114,  97, 116, 111, 114,  34,  58,  34,  75, 104, 114,
  111, 110, 111, 115,  32, 103, 108,  84,  70,  32,  66, 108,
  101, 110, 100, 101, 114,  32,  73,  47,  79,  32, 118,  49,
   46,  56,  46,  49,  57,  34,  44,  34, 118, 101, 114, 115,
  105, 111, 110,  34,  58,  34,  50,  46,  48,  34, 125,  44,
   34, 115,  99, 101,
  ... 155 more items
]
**********************************
Check if the deployed uint8array is the same as the one passed to the contract
original Array: 103,108,84,70,2,0,0,0,239,191,189,88,14,0,56,13,0,0,74,83,79,78,123,34,97,115,115,101,116,34,58,123,34,103,101,110,101,114,97,116,111,114,34,58,34,75,104,114,111,110,111,115,32,103,108,84,70,32,66,108,101,110,100,101,114,32,73,47,79,32,118,49,46,56,46,49,57,34,44,34,118,101,114,115,105,111,110,34,58,34,50,46,48,34,125,44,34,115,99,101,110,101,34,58,48,44,34,115,99,101,110,101,115,34,58,91,123,34,110,97,109,101,34,58,34,83,99,101,110,101,34,44,34,110,111,100,101,115,34,58,91,48,44,49,44,50,93,125,93,44,34,110,111,100,101,115,34,58,91,123,34,109,101,115,104,34,58,48,44,34,110,97,109,101,34,58,34,67,105,114,99,108,101,34,44,34,116,114,97,110,115,108,97,116,105,111,110,34,58,91,48,44,45,48,46,51,48,48,48,48,48,48,49,49,57,50,48,57,50,56,57,54,44,48,93,125,44,123,34,109,101,115,104,34,58,49,44,34,110,97,109,101,34,58,34,67,105,114,99,108,101,46,48,48,50
Deployed Array: 103,108,84,70,2,0,0,0,239,191,189,88,14,0,56,13,0,0,74,83,79,78,123,34,97,115,115,101,116,34,58,123,34,103,101,110,101,114,97,116,111,114,34,58,34,75,104,114,111,110,111,115,32,103,108,84,70,32,66,108,101,110,100,101,114,32,73,47,79,32,118,49,46,56,46,49,57,34,44,34,118,101,114,115,105,111,110,34,58,34,50,46,48,34,125,44,34,115,99,101,110,101,34,58,48,44,34,115,99,101,110,101,115,34,58,91,123,34,110,97,109,101,34,58,34,83,99,101,110,101,34,44,34,110,111,100,101,115,34,58,91,48,44,49,44,50,93,125,93,44,34,110,111,100,101,115,34,58,91,123,34,109,101,115,104,34,58,48,44,34,110,97,109,101,34,58,34,67,105,114,99,108,101,34,44,34,116,114,97,110,115,108,97,116,105,111,110,34,58,91,48,44,45,48,46,51,48,48,48,48,48,48,49,49,57,50,48,57,50,56,57,54,44,48,93,125,44,123,34,109,101,115,104,34,58,49,44,34,110,97,109,101,34,58,34,67,105,114,99,108,101,46,48,48,50
**********************************
Updating array in Smart Contract
**********************************
Checking if transaction is mined
**********************************
Checking if the contract updated correctly
original Array: 1,2,3
Deployed Array: 1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
**********************************
End of Test
    ✔ Should return the new uint8array once it's changed (1240ms)


  2 passing (7s)

jeremi@jeremi-ThinkPad-X260:~/Code/JRPC_Alpha$ 

If you read into the above output, you will see that the array of uint8's are compiled into a data structure and submitted to the smart contract with lots of empty space, like 000000000000000000000000000000000000000000000000000000006000 if you inspect the data key. data: '0x60806040523480156200001157600080fd5b50604051620009b7380380620009b7833981810160405281019062000037919062000272565b620000416200011d565b60005b82518160ff1610156200010057828160ff16815181106200008e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c828260ff1660ff8110620000d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060ff16908160ff16815250508080620000f7906200038f565b91505062000044565b508060009060ff6200011492919062000140565b5050506200042d565b60405180611fe0016040528060ff90602082028036833780820191505090505090565b8260ff601f01602090048101928215620001ce5791602002820160005b838211156200019d57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200015d565b8015620001cc5782816101000a81549060ff02191690556001016020816000010492830192600103026200019d565b505b509050620001dd9190620001e1565b5090565b5b80821115620001fc576000816000905550600101620001e2565b5090565b6000620002176200021184620002e0565b620002b7565b9050828152602081018484840111156200023057600080fd5b6200023d84828562000323565b509392505050565b600082601f8301126200025757600080fd5b81516200026984826020860162000200565b91505092915050565b6000602082840312156200028557600080fd5b600082015167ffffffffffffffff811115620002a057600080fd5b620002ae8482850162000245565b91505092915050565b6000620002c3620002d6565b9050620002d1828262000359565b919050565b6000604051905090565b600067ffffffffffffffff821115620002fe57620002fd620003ed565b5b62000309826200041c565b9050602081019050919050565b600060ff82169050919050565b60005b838110156200034357808201518184015260208101905062000326565b8381111562000353576000848401525b50505050565b62000364826200041c565b810181811067ffffffffffffffff82111715620003865762000385620003ed565b5b80604052505050565b60006200039c8262000316565b915060ff821415620003b357620003b2620003be565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61057a806200043d6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b8e46d3a1461003b578063cfae321714610057575b600080fd5b61005560048036038101906100509190610300565b610075565b005b61005f61014d565b60405161006c91906103bf565b60405180910390f35b61007d6101be565b60005b82518160ff16101561013657828160ff16815181106100c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c828260ff1660ff8110610112577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002019060ff16908160ff1681525050808061012e906104ab565b915050610080565b508060009060ff6101489291906101e1565b505050565b6101556101be565b600060ff80602002604051908101604052809291908260ff80156101b4576020028201916000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161017d5790505b5050505050905090565b60405180611fe0016040528060ff90602082028036833780820191505090505090565b8260ff601f0160209004810192821561026a5791602002820160005b8382111561023b57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026101fd565b80156102685782816101000a81549060ff021916905560010160208160000104928301926001030261023b565b505b509050610277919061027b565b5090565b5b8082111561029457600081600090555060010161027c565b5090565b60006102ab6102a684610400565b6103db565b9050828152602081018484840111156102c357600080fd5b6102ce84828561046b565b509392505050565b600082601f8301126102e757600080fd5b81356102f7848260208601610298565b91505092915050565b60006020828403121561031257600080fd5b600082013567ffffffffffffffff81111561032c57600080fd5b610338848285016102d6565b91505092915050565b600061034d83836103b0565b60208301905092915050565b6103628161043b565b61036c8184610453565b925061037782610431565b8060005b838110156103a857815161038f8782610341565b965061039a83610446565b92505060018101905061037b565b505050505050565b6103b98161045e565b82525050565b6000611fe0820190506103d56000830184610359565b92915050565b60006103e56103f6565b90506103f1828261047a565b919050565b6000604051905090565b600067ffffffffffffffff82111561041b5761041a610504565b5b61042482610533565b9050602081019050919050565b6000819050919050565b600060ff9050919050565b6000602082019050919050565b600081905092915050565b600060ff82169050919050565b82818337600083830152505050565b61048382610533565b810181811067ffffffffffffffff821117156104a2576104a1610504565b5b80604052505050565b60006104b68261045e565b915060ff8214156104ca576104c96104d5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f830116905091905056fea2646970667358221220e9b71659db8d42255f6c51811b1d301fadb2b17da2f3d34f04b8eb332d58c41064736f6c63430008040033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000ff676c544602000000efbfbd580e00380d00004a534f4e7b226173736574223a7b2267656e657261746f72223a224b68726f6e6f7320676c544620426c656e64657220492f4f2076312e382e3139222c2276657273696f6e223a22322e30227d2c227363656e65223a302c227363656e6573223a5b7b226e616d65223a225363656e65222c226e6f646573223a5b302c312c325d7d5d2c226e6f646573223a5b7b226d657368223a302c226e616d65223a22436972636c65222c227472616e736c6174696f6e223a5b302c2d302e33303030303030313139323039323839362c305d7d2c7b226d657368223a312c226e616d65223a22436972636c652e30303200'

The first test contains a string of length 41,280 characters. This works as intended on hardhat, and is limited by the EVM memory limiter https://eips.ethereum.org/EIPS/eip-170 as far as I understand it.

However, why does the uint8array end up being capped at 255 elements and storing lots of empty data in the process? The code should be natively optmized in my opinion to work with bits of memory, not 32-bit strings and uint256's.

jrynkiew avatar Aug 04 '22 17:08 jrynkiew

I'm not entirely sure I understand what you're getting at, but the memory layout of dynamic arrays other than string or bytes is specified to be padded to 32 byte boundaries per element and that's not easily changed without a major breaking change (even though we could consider it as breaking change). Is there any particular reason why you would need to use uint8[] instead of bytes if you want a packed layout?

ekpyron avatar Aug 04 '22 17:08 ekpyron

Hello @ekpyron,

Thank you for getting back to me. I think that the uint arrays should be automatically packed into the available memory. Otherwise there is no reason to use this feature at all, and make all arrays strings or bytes.

I will use bytes arrays which I will pack myself with data from now on, however I would like to see this memory optimisation done on Solidity to be able to be in full control of memory usage of Solidity.

jrynkiew avatar Aug 04 '22 22:08 jrynkiew

I think that the uint arrays should be automatically packed into the available memory. Otherwise there is no reason to use this feature at all, and make all arrays strings or bytes.

Depends on your use case. Packing is not free. EVM operates natively on 32-byte words so accessing a value that's the only thing in a word is cheaper than extracting it from a packed slot with bit masks and shifts. Whether this makes sense or not really depends on the relation between the cost of memory and the cost of operating on it. That calculation is for example very different for storage which is why there the arrays are packed.

uint8[] is a bit of a corner case because you almost always want bytes - that's why bytes exists. But for bigger integers stored in memory the padding sometimes makes more sense.

cameel avatar Aug 05 '22 15:08 cameel

Anyway, can you concisely describe what you are actually requesting? Your post is long but also very vague about the specifics. Which types would be affected (only ints? what about fixed bytes? addresses? function pointers)? In which locations (memory, storage, calldata)? How would that affect structs?

In any case, I doubt we would want to change the semantics of the existing types given that this is a trade-off. We'd probably either introduce new types or some syntax to declare them as packed.

Somewhat related issue: #11691.

cameel avatar Aug 05 '22 15:08 cameel

I'm closing this, as a part of general memory optimizations on our roadmap.

ekpyron avatar Sep 14 '22 08:09 ekpyron