Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/libexpr/primops/wasm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ struct NixWasmInstance
while (!args.empty()) {
auto arg = &getValue(args[0]);
auto tmp = state.allocValue();
tmp->mkApp(res, {arg});
tmp->mkApp(res, arg);
res = tmp;
args = args.subspan(1);
}
Expand Down
4 changes: 2 additions & 2 deletions src/libstore/binary-cache-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ BinaryCacheStore::BinaryCacheStore(Config & config)
: config{config}
{
if (!config.secretKeyFile.get().empty())
signers.push_back(std::make_unique<LocalSigner>(SecretKey{readFile(config.secretKeyFile.get())}));
signers.push_back(std::make_unique<LocalSigner>(SecretKey::parse(readFile(config.secretKeyFile.get()))));

if (config.secretKeyFiles != "") {
std::stringstream ss(config.secretKeyFiles);
std::string keyPath;
while (std::getline(ss, keyPath, ',')) {
signers.push_back(std::make_unique<LocalSigner>(SecretKey{readFile(keyPath)}));
signers.push_back(std::make_unique<LocalSigner>(SecretKey::parse(readFile(keyPath))));
}
}

Expand Down
10 changes: 6 additions & 4 deletions src/libstore/keys.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@ PublicKeys getDefaultPublicKeys()
// FIXME: filter duplicates

for (const auto & s : settings.trustedPublicKeys.get()) {
PublicKey key(s);
publicKeys.emplace(key.name, key);
auto key = PublicKey::parse(s);
auto name = key->name;
publicKeys.emplace(name, std::move(key));
}

// FIXME: keep secret keys in memory (see Store::signRealisation()).
for (const auto & secretKeyFile : settings.secretKeyFiles.get()) {
try {
SecretKey secretKey(readFile(secretKeyFile));
publicKeys.emplace(secretKey.name, secretKey.toPublicKey());
auto secretKey = SecretKey::parse(readFile(secretKeyFile));
publicKeys.emplace(secretKey->name, secretKey->toPublicKey());
} catch (SystemError & e) {
/* Ignore unreadable key files. That's normal in a
multi-user installation. */
Expand Down
6 changes: 2 additions & 4 deletions src/libstore/store-api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1269,8 +1269,7 @@ void Store::signPathInfo(ValidPathInfo & info)
auto secretKeyFiles = settings.secretKeyFiles;

for (auto & secretKeyFile : secretKeyFiles.get()) {
SecretKey secretKey(readFile(secretKeyFile));
LocalSigner signer(std::move(secretKey));
LocalSigner signer(SecretKey::parse(readFile(secretKeyFile)));
info.sign(*this, signer);
}
}
Expand All @@ -1282,8 +1281,7 @@ void Store::signRealisation(Realisation & realisation)
auto secretKeyFiles = settings.secretKeyFiles;

for (auto & secretKeyFile : secretKeyFiles.get()) {
SecretKey secretKey(readFile(secretKeyFile));
LocalSigner signer(std::move(secretKey));
LocalSigner signer(SecretKey::parse(readFile(secretKeyFile)));
realisation.sign(realisation.id, signer);
}
}
Expand Down
1 change: 1 addition & 0 deletions src/libutil-tests/data/local-keys/mldsa44-message.hex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3B8513E51D75912EA8311333F6E7D16EEBF43515FDDD417ACDA0D5DD97C2E9711BD9A8B92AC448B9BF1B37DBC74636870213E004DDE33DE43E3EA9652E504AE00CDB792D6FD381CCF913F93BC280B87706042EE2A2F64C9506178DAB9041CCB857F95B7FBD3D8C30F582FA2A7944FCCBE93AA7FB09A1D9685A376AFB04764FF43D727FBE4BA2B1AEFF37847C5FA6CD71139122DF360A2BD6B8A7216FEB8B6879FE5AD146B50F5C0C19DE06357892107CA755876CF04D4E0EB934CDA8AECB8C066CFC0E6F2374C79AFD122D8419E40A854FCF3B7792D5760CC9F4BA7CA95A1F47621F1983175F4CE2CD1941665A170373B07702CD12EE26867F26CF6F5694B33F79889C1C58BBFD529D4E66B85BF633986311105D9999CFFF3C723F15B2E93033D19D5D8DB06685C1D49C66E2EE62F8BE3B815886C884DCD6154D83DD7DD1EF0430541A54B56E1ABC98D9E1766FE54CC050BCE7A2ED6088ECF112FCCB221D9AB613D6C73A22487B222446E75071CEE91219A6FB188803DAF88F3D9C30903E028029524459F766664BD56FA5C859172A8E438D0A249DC409582FBFA189945191C90E40689B5C2C9F24CA99DD915B0AB730C73182220810C191EDA185968A31E5B20100D21048F1BFC5B012355E56F7F9B4552BBA790393C9E051B08C1CF14F3700F8338854BE0D5B81AB85B6D1F112427ABD76E6C131DEE68A55911DA4726B4B66E426719871B72B3CECEC57EA1D1E726F54FE873CB51B2669CCFA0CEA49486D0370D3F06381977845B29BDD5847B284617B67ECE06EBB39D58AF22FEAFCDDD7CA449F9CA180EDD641DFF5F7EEF1B15CFCE409C82112B2A30C74715157D8583BAA8ACE09A4AE696B4388FF9311C7AE46DB4A0842388861984E444B0BEB315E407207BF9C378CA60427415082AB01E757805D83B619CA42692606964AB290AC930BAA94F81F2EA35E00210D7AF1889FE58FFD9B98C569EB0600DECBDBEBA62534BC410B4AE676551BF5481F04D14247F2E282F1D8C568D516F57A6F744A98A71F26DEBD387A816880D561009A7FE1816F53157493C64B13797A86CB4EF72B7DF5E39FE652B29A075615B723D8E24F9CC1C9669FC78E8BBF0C3070D382D77E37F939E3EA1CA24BD6F2DC031E855744EA4D08A3CC2E24B7D9CEBC899D898DE45A343D7B1CCD9DA4649695C47E68597B95CEF9616631B2757456B088C107E16BB75B6B7801ED12E4AF6ED57FA4990D89567D907EF5453FC5AC3E692FB14C133A15395D8CF1AFF9264DEEA6A5F75FB3DD8561D4D542F7A515E75D27FA1460D35514CDDE577793EB2B53D3769A5A2723D4397D8F84A22707F491D51FDCDB4CF9C38900CC1B33ED5A15E677FC49EB37EA073A03470D235D56E0E81245D2A8D1A24F1C61D2442E5DD7808AB3E1F808EF06D6A7C8AD7D9C16255C45FB780B6EE5C8C76F0539F20E91D0E880E42449B99CDB611EB3B8709911555653E0D6FE455865AEFC9B94E451248A5F39478FF16C783C1CF9BE63D394C46304E98A1698F1092F0FD690C1F6B8D51F82864C35FC163FE16A78C80874683B3FBE914DBA70A610AC6E43A5314DE3B5E40233CC0ED482F451A4FBBDA99D7872B507DEA5AB9DD7524E9521B8F067E3DC28226580E71D421E633CEA92C3F5A6CD27330D142A0BD84A821AEA50F2E6313C36BFB34F6A9FA6C31B08B183E75A6D38E6139E21A3199BDB72D0208DE15D2714C0D1EC312D8CE0C555B12DC5E74A1BA2A8CBAE19FAF20D23F0E0DC4B65FC7449CE98CE02FD1603942D9913B13C8BBC4E1C858A55A7F5AD8ED4EA4731210E5E69636A51A39837283221550FA780E20D3712FD59C365D8B3203C6639254824EA3D40949449C2CE4B7649F02E5A16E9F50E0F8F560B4B9FFEF7B41472E4AD71224FB0259175F01CC76809A56364CF6734AE4AE7976B749B62D20A84668A37541BAD54FEC24A973FF5A6FBCAA6AE71097C1A9EA938C81E774D737028B5E6C3C233AF53D56D4C82D35783B0B5E2C10ED3FAC06B294C6A046E82C14A441EEFC3A65CDD8CB5816CC9E743EA133D37A13897B88E17798C1F9FBF65D4413734C6BD6BC1E7571B59C6621239F749EB2A6943C4F87E0BDB5A848DB3F8E57BE47E03DF8DD63EA77A653116C36A72FE1AD397A5E0B9C03A135394A96862BC4C7089CD8438111D83CF4AFC8433915E7003EDF070455505B1023BF0AA590DF177EA65A822DA76EB0A44DCFBE66AC37604FEEDB65AD9A7B118ACA8FA231C615FCA306647A9955D5DBA47CA17F66EB259FD5F0D0CB9D822DE320E3E7F383033D45CD36998C3C0D5110AA68E7DB8D9C0562CE02B57F1BD3333C92A087FA7680449C482F1B7C4DE3A28B6FFC9EC0BEB093A8EE5E83C7AF8574D8B2D76FEE88C10D4939A69C1144F3B141DA64F480ABE613F29F10CB83C97E42D43050700F257CE0547D4AA6C2B322C9A9D24D45F269B52922D6955B79258A93E0794F340EAD938F10575E45D508EA97EA89E10E5D5ECC23746F1DA2B48D47B2C32FBFBD5B1D439AE0AA94BE9D3998307949E8C0D84DB390369A4152388439A515EB7F6D3963D1C34AC95C10FEF2CDC5B14626EE325DAE329CF9212CD09E544CBB83B15B0F4976A0381B2E8680409967C721F08CD0E538D7467EB6B01419EE694FEC61886A94F7A1C2F7D36B34E4B143B93546CF0794391D0C1BFFF6EB49A80B86536B419442AD0DF0F8110A0234E346759209BC1574BCBB3DF5CB07A2F899D401D5A0183B36E5B2F15C33C44F7712C713A2EF852DA9D1266BA67879F59E6A24CC5071150C06E965272765F69B2851B67FC0960D1D663482FABC2F149C0CEA5742DEFC912D8297B9B00CEB522CDBE29ABB1486DFE5BD03B8E1AEA793C09962028982C27DB31CDAF6A08BCA211F2621A25FEFBE0E1F63EA155CBFADF88938457A3E0A785E7E327A79229643DFC250689F9730DC0603A01D01E140B03D85FD9CE45B8C8187B5C8D32BF5C1AE3C75CB560CFD23E6162CA0F6BF922E17515E703AC0C2B99B286D65B38D46F8B70A5FBF3FF8920EBDB0BE5FADF6A4EEED69462A14ACCBFDEBA5B3F80BAAD4A475CA97AB9E8F975D7B632CF6CEBE6F4F1079009821BCC35EA5FE4EC7560D71DAB77D0E0D45B557FDF177E6D80B71FC2A7D0A057D859C2183D7ED60F68D98D5524B2878BAD8DC5915F6862443309B3C16F4CC602B6FBD032037E6E99EDB5E8425CB27733788E0E6DD25653A88BC596AC17C3C4501BE9079CE5FF19BCFB98E7B311EE0ACAB6CB84349CE2EBBE98B5321D3A6932D568FA30667C2DFEFCC2AB4FBE14EC5EBDE2D1154A982D4A4C5084CAE3FCDC684B56FC9F70ABED9BCB151D61E72E3B4263992EF9A3B489D2086ADC5418F9131923937EF9574FF8ECDC74CAD36A35B528A49CC4F716FFFBC95054EF6898C91096E887969D56E0DF279145F99E7ED926F7D3741E2890FCA1BA31D4DA37778A31D51348AC912D889CC3C554F4B7BA2C9E2A8B67F3C99F23DF9519C326F3A3A57C85FCB3CB1C04B25FC63DBE4C6F92BA7D57C87DDCF30F2E89DE65B1448C4FDA8112C38672378466A8685A03F7280244475D4F75CD24B73F0B6FEB4F82AC1BB9C935E64EB3D917CDCD96A194331B9D742EE85D5F4619106761775F8A0551FC4AFD8E1F959C302CA4BC958FDE8C18B76BF9F1A07FF61848E8CB837FDF7ED4635C742EADEA879765CF6754788E02DBEBE057DD5F69AD7178AA78A62D02FF93F9342492BA77F90E48585A4EF06EC3C08FF8867F73770987EE2EA5A7F8CFF0BF1D58C33B4E91D4715FCB5568F19CA01E5271751EC21DECBC7072238FE959D99DC14BEB918C15310416489C60347AFA12BE8F00D26DB20B08E950518096EBB9FC2B89E3EBAE5EAD5343E3D0CD26D50DC2F3BA7BA3560427A4379AEF3A6875E7E715C335413CEDCC393257D7945642A3D88ABAF57ED2CFC061CB1FD97B97DFAA1A77270FC9AE977CE8384D721666F2C41015871A138F5F0E258CE4D8B9D50487A46E3D861B52B860A4CD84DDE1F54D45A4D8AE7F1F841857FE4262810E3B496D152E6763AB969DBE94A69E2BE65D50880EF31403421AB60CD1E91DB8114D0643F86B3B317D5B38B8DBF19AD591EA401BFA73CF157F42D85160E4BFE44F79B02E7B301527794AFCDD0894451B6B16F190CE6C31C27C82730E93B57C7939414D210D05EB827A0E882C364B97F2506B06DC5EF8269C9ABE3467B29036027632299F86968771F24F89F409CC80B0E9269EC9B7F2AB62E1D3B79477DED2040391F8B6FC8018EF35BDCF095B07705253AC46859539936FE925209F85BC2FC259E5FB791ED35D2FAB34034B62948701723D51A7A02BEAFF0B178A59B0C3233908319EE309E390A553E6B07F399F86737ED162A9F638F3F7C9055CAF78B0165BB33CEAE80806D3D5E747DF9422B30467C60309C71FD775F219A6E9DCB877EC327BD3333D064C77889881816B2A0D9EB2E2142765E3912EE77AF0347F8E6C5768B30AA1C166E67CED69ED594EBFEFE34E2678490FE0A03D1C949924833AE076F1CF405B0E5BC42B2B24070620AEC3819E746F60045E27A90F18FD859111A1F56F0E0711408E57BD877CA73689AF551A1A2B36242F5084F9E181EA65194CA8D25B91B676C8DDADD4989EB18957082AF97E16D239E4FC862585D0EFED63F05B3906FE3FB4A9D331EC651A21B57609CAD16E4D557585AED19B455F4AF9CA12EFBA53289321D99947D38C58E8B597CC85CFCABA0052AAAF619920194DF0A7BD444ECFB981FBD8948B6FA00024E747F1B4934FF1B70F60BE73D5246BB66508E7D4B03F30A74C5FD4C081CA61111E848505D77E56D77B6E847E7605E1D0991655D0B11EA96D4DC832E9276D2594DE3579B6F405CCBAD998F25AAC7D6F7E49FB2EA65E4046973B7A0BA33830706EC831FBE6842ACCC8BDB311F8B6E4E7586C6A1997DBEDC5DA1CFDE0C0CD896EEA90A93E94D5DCE962920A94241A62951B3AD92CA61A001707C6D0C26D8C5ED251D72B5B4C00223199113497F3F58BABDE6B6D1FA0DB4516EBF53FB60675FA972AFD8AB0C5410089597908EC31EC0D467CD737672489D0DB88F19C4D8A7CAAA1FD6584013C088216D291A870B7CE078842C932B116F8FCAFFFC6B84857D31B02EABFBA38755010AF884E602038CFA24039F420A57E9461B89EF9514CB80A6433B2E140590F417C636FB14578B09AA950127052BC06CDE42A19C97AF1B37F61CDC610BBE220B4B18CB0277363BE7A8218EB05CC19D82B446DC3600EC0CE2D8BE21404F232B39556DE8A2BE74B3BA88B278A481F3F6276D2B8436E7777933CB89872AE0B4AA10C600A442E8FABE488DC3BD8A1FC86C5FD91204E933F149F9B0C19D6CCD317E363C887CEE43DF396214C838217129F558E6445C5EFAD69942FEF812126CC300B5E52EA4152152A43570FFCFDD4438F1C2E3FA3FCDE76364D09DAE30F804AA61E4958C6A72ECE953261243C25FB736E13FF026CCCEA7A6425F9190FE7478C689335F77042578F1F9A0C8E77429B2F6619C12B9CE9DDDB16BA9B1D364D68A1C0D867D755618C303E9BEB49A80034FF432F6777890765D06A8A59FD73952A0AE3B48EAB42DE5FCD914B3301B948656FB70EB360584C554F84A9B6B52F1D7B719DA4920D70EC0DF790BFC4DE57EA79203F891BEF07C7AF76C2FF974FD5F08D55298AEB3369A5F9D2FDBB2808C2174E1CF98CA5BD73A5FC88D8FBB36ABE0BB2B9C886F6A60673ADE5468E94045088717569565B88A955DC2030F2A7168B406192BF7890348DB87355144F124FC52C7B7F123EAA209E723258BB835F7AC8C13559DE5A30CC0783B31476F9FBDCAD97A38F6D70D8C09A3FECF04597B840CDEA4F102CC0E769BCE8EFEAFF445F8B6377EF73C42C6418D1611AC6C4EDB4F66EB259D6855E539D0B68BCD188AA22B405B1DEF98E26F326C0D46E7F5EF3D278BA779421F9643C41717E9AB85325EC40E178B996666F6E03D4523BC1A0C41CA6200FF774EA032DBF474569FC29C879FC950F447A9AF288B2EC7F2426248386DA7BC480CD22825025F35388EF215A82F9795F44279F976BA1DC1AF63A292012D0348B57ACC1F35BDA36E312059365CCE2BA4D473753BA65D27041C07E5C860905581C54EE3D3C47C19698E2056ADBE29D9853C132266BEC887994E908B4F27319E97DE1760264367C806EA24043DF675A497570CF9FF2823A93565373B9C72F39D825E5D2362C1208236124A9A57FDECC08A2CFE32B4B3ECE4F17A2146D59DDA41748C022AC6FFC19589C1BDEC0D251356BC0CC976C46829947914132456BA53E40E47BF7B54A8DD4393B2AAEE4865F9049E77F12971E899340766C3A443654834A006520639B1DEAD364B5F5DAC20FB4CB866899EEF03FA605DE92D2356039EE310570F43B2B17B2816E02D7C48E72D248A19A7E258588BBF4A04C7A4E9E59D53B7A844C94585566058E1F77AC33465159E0718E367568B652054C90921C41A0E6AE0A0BE0CBB2BA30D1F38E3BDBC14031DE978F3F3F844685641847128537F81C5B526D74782FF06FB1CEBBBBEE1A6A4D5E16CA155DFC391C7E840FBC226BFE8CAF7C56450E9F47A8ACEC3C79A1C50974D46A7D84C4A899B2987C13C0D89D5CED475C81F88F3FB7DC9A8EBEF6AFD1989244E8597E5846E83175E585C67BE2366AE2EB4A39574E5C2EE9D6CAADDA0E981E428FA20F083FD89296D946EC6EA0B2643B980447F0DA21E6F761BE30D87F0ABBD1F3662E477203E7323B147934548FA707A22CE4CA6A12A8BEE9810B260ACDAA537B40FE47BA07677DCEB10283DFD0796CE43BA5295D3712F1AEE94ED980B6E33D975905CDFC8C43485542017C0457A7385A8BDDEE0A42AD800DFAD4FD4FBCC0D02D06DA8608D3F8C22AB06B0AB720EC82E69E964086114372E00DA1F54E6DF9C14DB99CF0D98DD6F1CC63004EB48D8EAFF0226B487E0D89CAF7B414DEC5C5252AFE1F9845CFDCA551E7144E0FDC3A26F5EC66BA7498F8E1E6FF6CCD7FDFBD051B73DD89DA827A15AB9603415FF48837C433F39CCAE0990888FA1BC0E5873C552874429814FF59E989319B0DA080DC02BF5255BB34E67A5E0BF188346B034746A4A4C13BF6478919EE2883453EA5F9102F87C32DCEE0F9E9B039DF9E1948110C76D9B39A900B89827F239C2ED02A97EB8FA17C7D0FBD20573F524780CA093D8A57536FD69189B2AC05D3EBEE38393CF7B9AAA756D2685FE5B0442343B78E566A12D4670C21519636F84FE66EA3D09C6295FE0E20734F5FBE5F902727BFAAFBEB418EBFD49CD1F5C8CA1AA63227BE76D76BE3EEB37997F9D1A903DD161961519F820D2D1AA7074683B188B86D2108C23DA7408811497DF86EA866DCE255A7518388C73BEAFB1D18F4F538317206A23886E633BE6AE4D966BDF72837C0FC3CBBE3FBBE0F598FA97065AB6DEBB03BF097E026D91E
1 change: 1 addition & 0 deletions src/libutil-tests/data/local-keys/mldsa44-signature.hex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
12CFDA699CFF51B6BB67C36C067BB8B26A2AAFFDF75487E7843DE75720F389B01A695206D9558505C4629322889C9073D002CDDD1FDB42D30625544ED22B4D43552732F56C7E06E192B02B9A791C2DB5C605EB3184DAFFDA41FCA4F998FECBEBD4743B43A1FAD7B755A262BCE5D605417AC150C4223B407CAF423ECA1AB8BA1DDA8E72FCC62CBBE67C804A6A82C09395DBA4EC531AAE9F5E4A84632110591CFEDFADAE629F1A168F3E91EFE247F9984C0E6CFC605F7253CFD3248B48BAF98D5A0DA0165599C1A351CEAF32F43F319B4CFCC83A898E92716593607417F0B701103C6335557B10D21D38723CFFC015FF4951CC78582031D84E866646249A85DD0648BC57DD2F1289E27514AA62CED865240A50F76DDE51640D80ECA8F9EC641EF1398925E11B5339AA1B36A4AD059B3B491FF3BDE9C55B8B65685CC62C507018E248182902222D69979159AD2DED90FB33810A542B7685AF4B2F9396A91A251B1CDC2F4B6D6DD6FC60F510ADDF804075A6BE97F267C773B1C23BAB469763A1CAF56E370E0AA3301CA2C96DB07947E9737B42187C3B40200226C787CFD65F021B82788DD8FCA7A97AA7BD1D252CE313843B362497645F80394B811C2F3C64B710F5193F76EB63C5480BDF209BCC347979071738FA028B1529A620280D450B0043EE873B559D147CB4CC1BA01E614D2E4AFC454A1A19526DBF748743FEAA17D754C877F4C7E411BC5CF033C629A15B0D1D740CFA8B223F775CE984E32571FCDA67A67807E0186EBAF978D31ED2336C50A04E4B5EF99502C390542C268004BDC56A1065AC14F9762B59422C225AAFF2EC75E090700A32B3E22C64CF0D98B306147ECE1B38BC88D6ACE621B06E6D668908646532DFA628C5C2B2C10D50442D86A75F2DD7A30D503482A83327F3D2346EDFC51A8187E915A43513E026FF9C460ECD6194B42F9B47D0155124BCFF55E2625640890FF4B138427949B3BC51023A649780C11F4DAD114A3408A125FD9E36F6B28DDF1E070D067C6B51C463059C7448FD0CFC86FB749E0E2E3CF02B88290B5564A3860ECD6C85D128704559C01F791A4429686F21C183D3BDB9984CB77699AA372C5690EEA5A191BBDF8B0942F95751D289F423DF170F176BB661ED8D2AB784BC5B6A344D82E261D5B34B6AFC80B957C1B943648BC46A2A79B4ABA54553F3EB41B9BD8C610D2FF82C34C491E04F678F33E5B383F8E6AC4822586887724F71AC5F161FC25B8FC14D9FC6DEBC25ED2741186080795E253397CD73FB8F27F89E25D60D4B8F40524D9A98B1E3194D2B1C283FB805DB34962EB8AEFE59BBF8444F86E0C644B3589BFC4A3D898A73FEE7326E8C415D5148882F570DFFE375FCC422BDF0F68C456C5484050097BD714DBB3F8777ADF4DF29DA756A28FB2F0A5B919A1D67BC748FC7EF031453C0E3CFBBC963870AE46B7D5B4C06DC828E910DD0622FCC21511B476DA150D9AF7462F4FA634B33260089CC8DBCE5977BED935704EA495F90B569AA8E801F84DBBFE14E8A6C0839B74D917361406BA619BD1FA7085845906C8AED1DC118578CB32A390888FAA7EB234A51ED90601A48ED2A12EF8FC6E743C947399B56D62554E8CDC7687AD9870FFC48F10243E2721031D510443483F7963ED4102625289406311490579A8881F19D520133F95E30CC693C88294F8ECADFB82F7FD20A4BD20DF4210B1ABA449A9521DCC6977DAB0EAEA29306FB7F69E9C4CD54E18149E71CA25D09B76B489C1CC7EE04183EE91214C48C40567C9A9259484C994AC1B38DCC3501DBBBBB4B56C8E442B630C8198F0929DEC00895084F3DB0E02001534146426B88AF58759E7B8ED9A19C5AFF32341931EC8F9018EF84B78BBE67D7873D50CDD8188BF9B8E4785BE4AF4E556A7D51D88CEB8BB1BB7B4F3901BA42CAC5DC0D97A48B19B5B76306DDC1CD71479ECA9A785BAAC6CDAC243F958148A7B4E5088014485593A24008FF164B7AE1B7329F06CEF7BEACE70825A21836A791382C80D35B4B5E3953CFDC53F3411C9F24786F8A14F7567E70C52FF205F1AEDBEBE6006DD10DCFA1968ADE2E53F9651D1C06E3B0E55415DCE2B38601B82433D52108EC8AF384FA54C12175C5B344318CE1152C31601CE86AEAB9BD6C9B960967175A5C947FEA79A458DFA05A27648F5D94304336D7ED633B67A4545C31274427BF3A76F5B4411664D858EE96FC564058CD287030EF45228123D7EAA6A1F4261E94E6C21D13763C7FF4FFBE23DEE2F5805C2E2E32A9549B8F9E7A0BAB1F1D7636132A31BF03389A71A9CD9708EC9BC23F42D42B8E9C51B3AF13893B36FABFBABD0EAF87CACE3B26D8983E70C47312C1255BA030969B55FA05FE7DF89485742A816FA13E7FFCE19C0B2F4B02CE2BA8C6D0E5C2BBED204CBB6D042B244487C60B80D4C2AF150C45D0CDD56C043C14E795EEF4926268F8062F720DEA3EE6D56D0BDB4FE7A7C8E926B08ACAB9F8484C0A71C02DD4606672661A5E32B96A722DEFEDC2CF6853D5E962566D7DF1E8B3E013E427DD8FB18A20ABAF9FD778B12EA781EF293268BBDB21352199FF80D3FE368A838785FFDD66E65AAC6ECBAAEDB5CFF8EA0828300A891333B8F8351C3D5D6FE5C6C51AD15B0FCAD198B0954BBAD081B90C4BAA9AC2059C31F36E8850F3038BA3797E72187A672940BFC68B8F8BFBE4953D97156C3FB79FE43A89079AC4DDEDFF6503921D4752670C832F5EB23B026A5178123C2FB725632550060A91E7AC74D981C69BE2AA6186B42D6234A5D30BD7514C0665F385CC0A014F638B300D82B80CF32E5ABEF0F16AC55BD6A157662ACF38050D8617A339C68C3DC41B263A8385053386F3F837239879D6BF49AA513D1FF7C96D7962ABE3F48F680285D563791DE253187B879B36445842DA6D2D6FEDDEB6AE374EA9A7BE48F62DF175FC207F9E0BDCB173A99A9860975FB35C7E5175A232570B9A013F6605E3165658BC03B32F096F9FB417AE6D8CD1451B8D80022AAE91194F2B270A474A931B8ADD9B0A26B2AA3430D293EEFD911714250E6D95147D3166CB387B948F7FACC76F0B3AD96427AB286C712F30054715B6D788A676A0D95D96CD4D92F4C1EBB57C8A12A93B83F4AA95384B0A4F20A55D200EE76B097F2F4406178CD4D3A0D672A87327A278B65D033217437AED9FFB605CFE7DE6353FB498FEC6C81E1C4EBF0D5CB8121B383ABADEBD720D7D96B52FDEF7B13BDD4A634F6CA6C3D08DC85DFD4472FE53A13CDBE655DE63F1DFF26CEB8FFD7F68FD724970B9DFA60AA0D08B181B20A43E93FD038893D3F0B700031D2F3B4E58627074A9AEB0B3C0CCE0101D27282A3A5D6C8998ACC7D426373849595F81A6B2C0C2CFE40723273E4D5D6F7B7C7E82888F9EA3A4A6B3C2E00000000000000000000000000000000000111E2B3F
Loading
Loading