Security Research
CVE-2024-32002 Git submodule + symlink RCE: arbitrary code execution via git clone –recursive
Thinking
2024-05-15
5 min read
Research Dossier
#Vulnerability Analysis#Code Audit#Supply Chain Attack
When Git performs a recursive clone it executes the submodule’s post-checkout hook. An attacker crafting a malicious repository with a symlink achieves RCE at the clone stage — no exploit shipping required.
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a4d4b6d4ade7253d06d61bf923572a6b8c253d117e8b63642be9ad8c68eaee7d4a02592bcdbd3155abcc6a953135deec61ed6729ad92ae056a76758bfc9dbe3a6985cd8e376b1e16f6361ad5bb4a1f33f22a15dcb21375caf8c241d6e1ee91023d3ec526f1828e5594041d661db55b9a0343cb26cf1473cbc60a67c78d66ed6bb694ecd1126edac59ea8e426fa9964265162561467fe5faf413efd0d98b6f886298f0832bd34b4595a3273137068ca5a533ffa42110473982f58c6ecc52d3da9b0a6060190208babcd67e9289adadef8a363b6c1ccd35759c7f86aa24f705fd0303ff2c75bc15f05f068436d585873097da6b4cfcfee63f49b890b67b6b390386c498f12bfcc6bd77f569fdb47a8aae001af569d7362538cb863df1865e48eaa2831dbd623f8860ab561ee3ad771bcf24d6acc7ba268acb0abddb6fdf5f19df78de854561613e1c5f30c08bbe7c444dfed21752fbd9439ed79e983e360403979fbe3311c8d573aabdf210ebaf98506574431d18d27ccb9ea7f2798fc5d9522525cafcdc73a4d41f9fabad27f0a663a6225d398b54216f577d1eff652357a42111afeccfbe617946be3157fddd94b06853764dc516e25c0a2066cdeecb37a1d0044f0d5ac98eed8e54dcf6ed44e2d4f834ce1ab306834b3e997b2ec8b58696ac766049784f329da0bcfeb1886039bb3940ef3cd5627374084d5b883911618698b5ee92799f154da8f12994fab0486d5f75183772870abf0aeac668eb5f27f487fe4775c97054634aa5a605c30d0d900f62c7e786a0d0a372d641aacc0c734dee45539bf7e3ae73092fcaba24c9c8578903efa0bf7858ff35cf49febde45fbfc543515489e3d690808d73434039db15596c13ab26006a67ee9e28461493b15709c74370a103bebd2f2a6576eafbcc6fa3b727b4a1dc5e0631f0fb7442b8dd76f269e02dffda9e28705cf6e8bdfa5eabf43ba31ff4e2ae2324acd739454cbcbd7d51a056c086db047b890893ecb899213b6fb49395c3e98111d6e33e29288104d7f484f8a1d083c41446503ec83f39d5a760a54d06b2e959f9459c9977a37dab1d9408dfbac2f0eaf5f55f2266f7efe27039234bdc0a0e2bdf2500f91fdda6d2ab1f45674c89dc9440321d9133441bfe3fbb861286e8c2c852691f1a7f4239ba93f7d198326041fcea0181df88ddf5e7a3fa0dd293e2d71eae61acbd264bf4f1a21200bc21fcef84d4fd6a64269f21bd6e91a32393040a7cc956e30c9a4930c3b5e4eaedd5d423c0c3a35257f1c03583741069434939b6238dbad950df351ff5930d051249f0c9bb68cebfc0f123c87feb54edcc0355516886c1d6ce5539861323b4e5a603edef01457c166f025312117049db0eb095a1ac5538f561cc723f47c8ec896cda071695b8738dce5837e39556bfbeed60f664bb86d38af10df4d93344da7166e152bbc8b4c2efb9f60f08e81a49be3c140a6641eee0eda99e83f50f9b2012a5b377534c5898e6d74c5151eeda72558bcf1e31ba677ec7029e7f91a20d52b382e8b230b7ffd5724909a227296303908651da4947f0fd020df4969fb993d16fbba18ff2cf2d9f9f375d7dfba677e48737b879d3beff9c67b503628014fcb108e824467c7302544a6a5ab3cdf9ea76091b627a2b245b477edee01de32c1026a878bf5199af9ac0e5cdac375a6e5f4f29544ab5b718ee836ed22f8cfdbd5194fa80c50eef6551bc616a12cc6825ce303dd5cf6265f42c9cb12265566146678af243ebd58a672c265cce522783dac90c6e0592a033c39a4534975e1955ed6bf1548eec5aea8a6d59a95cfd4059ed6ff245bccd16b83ea3e1037d92fc1ca0108e31287473afd01eeed6cd72818560a55142f40a4654c450966406582a0042762b05c31586d6fefe8b25734692069c65b897e12bd0abead0c145748ad6090dec0479e87277c8fa7f7b27a59bf648e9ccedcf6b24702c06d99ca73018fa4dc4f915d0461f50270529240e33f960e3367ca6427a186c0b511d5ce080009f8e6dbb3a9d47996748f2951cd9a0e6c891875b86b92f7906b7a4365aa112f4f4f3e21d5b4cd700258330c325a64c09b0f4d630b9f879c2a9738710977a92633bedd5a2da823732a049444070b0bdde6fef73a741096514fd1ea6f7f1a4e5845b373076b8304d411a4a214f0255216808d1ad82e76afc39ad3f245e6b990ec56a67623ae466c6acd572969bd0f08c0dee0dc0f229eb79ff9eba89b05a03788d998be9e6ddd22e1c6f1e43ca525767bd215668ed31630223220db41e9625bfde42b7cf18b8ea65550700d9347a9d16c707823726b89aa6561f3ef32e5f9379d29736e685bbd45bfb020b210d01ae9a1ab3cae63d3ba3213322502cf876829cbbebe6ac283a21630e7f0cbec6b2b14e443f0ce9ac50aeafea7189534cbc0b0fc2b043bb4994c9bbbdb0d98a3d2ea8176889464962c858ac94bd024a877135d9460ac9e7b250290cacc7afc13d68aca679d72a7267d01c7304b0203f95f906f6415bb4110f1f90b1e27e70366567af1a30c61da23389d221a6ad2a78cb7cd31489b05c91cb62f8f9e9655be56d527146f5d31a14088e26b94f80132c6d3bb6e54e2f83ccac5d0c25a0b15e11a8e5f3d8b33430c282f73e3c3a6f171f3f86970c3a92395855b49fc886fc24e54a9babf105498d49fe5eff15487333c136b1635a39225f217d801f20000f77687fe698bded690b80129b08e186c87ed5c2f24319573343976a2f84a2b26f2addbb1db2b07cc47c2ef43b115b55ab00a156c1344e44a32a2ac45ddb40856f291814ff4a59b51f1f21644737fb1414ea50de201a0c51a311fcaf8f7bde7d76d54d9352b1ec66061b51b7c4d76a2ec676006cf5251f07bb68317e4599521980bd1d210c46c2bd9775e2df425b9e2a242d7c80b4f882056f2c8a16fce17e123e736f506268e0c1a87a607f1b9ef046860842e6bd74a0e9b943183bd7e82b335382089a2c37e6f11e84cfcbd2d55c1974f303f45575db9aa8da802421155cb0d70a73c8b57db034ea4c5a78c2a71f2b0769d1428471e6f564a4f1109fcf39004bbcb5b436a8b9f3af816a60cbbd33eeba784c6762238194de044eafc38edcc1c7ad89d28886e8bd4920be16e8063479ef573198b87de3b72981388762e4d83285d737030a6dfc53620d1cbe1755b9a13bb0f772b32a7c83e9c02bd91e9da400bd8810a7d643c4d9cf2d1192c99a06e50de412510069dcfd8b61c3c700ea20a691a835a6788a8f839128eb971f514f67b032c50f732eb7149360993b8623492396a6038d64f5adfcd9148cf36f57ea8f0f02f29cc4c1750fcc51547efc68086272d4132ca0fabbe2f37cc9334dc5f6d13eb042d69565f328edec001e5571a8bbd1d46ada7acc4a0c3efb11b1677717769a8b2f95b2115af7bf1e7b57dde636174cf290e4e2c73ead8f98dcd5fca0af3afe540e0cdcff1279342ee825149d0c38dfc911301aad7edd87eb41055fa5dc32be478bb3233c32576c799e2f6396e37cf26cfdcd80e965d858d97693a5a3eb35710f341b24b798d8737ca7e66306caee10f7301cedff2c30c6e514db0dbca06fbb687fcf1bd0eab17e38edc7038c673f2c417aed3c292a842b8e74e94ea2c53c1f2bf80c6d4df0c5b803a66ae67a0fce8734826f8b66b49e6aadd936134298c93cff621432e63e54743156576ff298521c0d9d3c2072d657febf16b35347299114d743155e97ee2e2a38bb189e26e8142fba1d71f3a1194a4c41d3792ffa4b5acf17bd721d8f4cd3184f47b1fee3fdf2b47a1f232c9249a16742e513d04b5babc2f2f9f002f3b43d5d5391bafde346a8fd98374b56190d1e3fa649962d713dbac488d89684003317b7b03e707c25eec4f081af423d1888b9cd6b0616f832ec63f2f9ffa8643fa511cf6dcaa266cd6e71c774cc9003c20e83e5e7f55389a75dddf9b0396d6845edd45deee3348e271fe50dcefb74bbb2619483a99cb0d686b838af00186d98da1cbb9be094b42a8e5a503d80dd3f2c6c80af04e1153d9841080ac77c6c7a9767c89bdc8c358f0accbedca894698ccbe3030cc06bba00cc6ce079514981ea0e16412467da8a99a9e7a0c0bd9e986667c9b3e27fe5c565de405d1c3defb0638750d6e04c789df6883ccba0a59f21a3f1090551b5db235e5ef3b6e5b6f11133b7b31dc1711617af52ebb3e04ea4d2dcfffb6fd4369a4868f8f66e0db6ef50247fa01dc7a2838ec6b7bb67fa0156d468b1ab6f54d8cf5149b682208bfc49f6f117c52fa9afb09ddadffc7c48822e48f950dcf8188571e7fc982a3230fcf8b38ba4dac68c18d5a1a8452dbb439ec94c39082e7ef428d103598fe488016e5d3da9b4caf753fb3b6c6b7013381b213fe1ff705747da567b623dfca819b5e68a3858c7d2dceffafba6b3df8e7a10687e7e9cbca3394e2265ff9531197de090f40da4c48379628c3beb8b7fcb6f71e10994242f95ba194ce9142126e00013bba202bebe66eb3d67ad50fbb37adb0a6d2b858e3948890a58beba244e097b69d817fab7e3680baedb0a0878560ff41c9d357b8a431762430e1ece7000fd33560adddd5a3d809fe5cefa6a820de1e173eb42b4fcb9ae7895413080db72360b64f84f3817b6abfbca79f39bdfda24975c5a3425dcf70518709e0cf34df9dfc79f2dc5c24372e935d7a3b52b49fcb54dad0778dbeee6e4dd28e4a64ac209bbbf304f7a87ba69f2fbdb8c53097c7969b6b1293230f3d1a5549e6cdc10ce4a5a98882b683ca540ef2ce10bd5e7b4990a632feee609aa110b7494ae8517907706a002f763c28fcf396287bfa2441e61a0d3e1e3e87a6982ec5aa47b605016d868057ffc405ff769d0f123259b48af6d1bd036efe5ed4b640b95b6d8bd09390731baa89da3689da0f0a6d714300bc8de6e35a72796777fd8b29061a8eb6fb92ee61853213dfb0851c191b6c2cee86259c4874504391398b2667ac419425870631f33fe6a2a3c0b0740ba2cb02f80304d1c224e35e0787deac3da3172204da21879adc43cbda3705cee7ea50d006da2232afba2a006523d20dd67d6a0e4e81bd2a3291a3b0e15b08871588b10e9a13f2fd12b042f039c2a694227ca9490296bc40ba70f6fcc7c2a53578c9964df6af4001977ed6bb8b3c1899952e3371fbea2e89e03a450b17210622773e6b13a69cccd3fa34eeec1050ef0b506e75c3ceca53d9f367f6c46b75e4ba3ca9d8f6636afce1232f70ac9688bcf7f6bd8539b681fb280e01aa72e69ffbff167c8f78839b7a57e7a78403fd29f412793eae7bbb378ab2cfddb325dfd2acd1a5603f87c673c7edd8b5f1e4e8fd989fce5dd2e45e9b06709af8064c7900549d79a681479935c6d2bc34682e5e9d2a2efdf032030d012e89dfab855dd84f1f63b69d014cc559d1f49b68fc200812e4a14e27f7ebf42f4d69b9822653e19b6d3d09fabd0d2144f199c5602f69445d574d466813b591bc9bb17c2bc3085561cd09adaa9caeac22045ef7342f7a6a83bcd1e764945012f22e40e7d60c76383dfb9b9766bdd5f3a2d183dc76e23a6ded7963aa31c3c08c1ec8fa41dd0072bc079da3ef8eb06e532be590f19507477fffda4067913d30d3f117ea6b84a0cf42df3c8aad64595eb960690ade985474a738d7ca7423292440fa1ed6d14179021fdc903cd0816db08552cf681814578ade3a45d8c785017eaeeffe3e3d31618dce2789348473a71f3c9025f174227604122f4a22a4399735f9ab1e6b85c4e4a3d678cb08f3192f20422ae39c3ef86ae5351fd322202d2b2019f435b397e09eb5f8e0f126b7ca67462ebc4b0cba4075312c9f47dd89cc99d043723a129a8516253a93733d3b20fd72ef4dc88651f75ffae26e8b078d1e39933235610a7642e50e818f01f6d6fba1cb8c633d46a62e2d9f0f9533fa268ef3de1098534a17bad5ecc65b4f8d233df2cdca1f760e9fd063ae9e77c1a2d7dd3fd1f6668a1a2cad843f78cba585dd2b8a7d157ecff4c47aa101f15357bfc2a58a3023e48e8594467a665b0ea5cd78958ae7551af42f93c89513e35cf19ba7d428d600020a4e31c8a26995100fa120d1ef7580a121a5d7a3f9c6a495b362b345d6faeb7237b88208181d042b5b7c91d1ce974eca359cbb073a5ef7acb42c7222e4934ae74ebeebdfe086fc4fc7d05c8c6351d2815e7d692648cd719d905df85df11b650df2b7534e538be680ea2a748d9912bc2e1cf3a6430698f13084ca90dfe509c7ca36afcd890ef6c1060f71f4c4f8efd00f3713c76f31320cb644b1ebeeb125a7c6c2e8595b36c78be0e1894db7268dc808488c8a5339185a9c05bf5b38eb4a77828e42b58e554e1d93a3653212edc339284640dd1cf42026d160805e5fea606c30d204d124ed42a75f4a68af16b207d9417a665e18f9eca7d160606137d29da0039a6de5c1d869260919eb35a52b81c222caf8b5863dc8844fa2319662bec899f627949dcc08c9875d0396946bd1eb3f36cca0a1d68dee10d6e62346d175735b09c3f4e7f49269c4c1415773e13506c29bef0b808d1e8c642c91fac9d2c1ac7e4937dbddb4d16a5e77a7f2aab4b4e6e07a3c7ef5059be8e68c25fa66066f23c5665e89cf7e4fc2b17eb77c9a6be598950e253b480ceb7c43f92c7c3224bbf745c0d4494a981beacfae308ad84d4e53a26977122ed1ce82863311d4ed3fa72c5e39dc13414c10f24c06f98ea75ce328ace94ca8b00f169b46947f6e8ce10d6458c7ae6c859e5b42566c6c2ed6e86789110e56c52562df2d469a547ea67bf5d2ea4980d8d036c4b6b02d83996b21aff0d9b16bfb1e9fa049bf53461fca3e28e6b95983e50d98ee96503d7bf0b985b47f865afff90156fa42ba74928b306e4e865c886896283e6e01ddbe206059794ba2a783e7926d0152073cc2640ffc12239fe3db47040c35887fe160112299a2dd4dba8f8a795bd86146c10aa8380a19cce24fe7acd2b3d24e5e6431ebf9e9237e3395789a3adf5e6201d70c65544f6459dda1d6e0bdfa166aae7503b96dfe6291a1db84282038eb127eab98c62e35513d7b2d636e6b34182f5681c166bb2af49a51ba890b142bc93b0a242a24206d81f59428f3e4683d216b56b573c0630372b865d02c1fd5af5b81b552fa4a3d91de299240864f5613d7c1087bf933004b23b752739803c321bd5df8b5b7474e6f2241c0839deac8f884139dc39ecce5f145850b6d9a40d82d234fb428cfde4fdc34ccb0d2468e37a368168c1cb8f5ae74c2862272489c1ef53d33718e2db5ae68c6de2c6644a8eed32bfb0ed8a3d2ff53328d1ea264f3ec52e43acd4c3e8068a3800c012a65fcd199fb47d90e53b90cc12317cfcc3598689a89be0711b9bdb8f880ea32415cf7d4c0756e0ef7af3723c942fbe72ad08e42988a0c8955ac86b0aa0036887b5cb8cdfcf7509ace06488cc69b3a9d198982beb8d66a1b69ad64298c97343150e3a6d8d49ba311964d970d4c2773e9a581857024479bb07863818a56d07369962705e10d397bf87ea70b1b841be7db6ea63dba73025727cc2b432ccfe2298822a9ddc9b5427e4fb2fee72569a3972dacf7a1827ce552497fefd9e439011b4a14d46d4e4c8fdb991cdfc5af4db685358c7d7fb420f79ec6e5eafcd10105ad01175863ad0f15f2a63e64c5cc7f1f33364f5247e84cd054b534fbff9036c3807180c6687111222c6ba3c63c7a9de6e6cc1ad9d3517a6e3a6db0d77eacef63c33ee646b5d737ade6ee85830e6d37ba155b9b099c82aae6daf11e310c62aa723efbe84c88e1c65b9ef63d74f108077a6c67e6c9fd5b6c5b337f0e694206b6641fe7e91cdcbf8c2a836d11cf379f8fc6c5b35abd2e2c089b82d1cef3b82cb87ba2edf1dd0f274f3e7ceacfc638cdd9e50aaedd2e80b791f8521c1e92557a2f5dfebdaad0eae97c29fb92022cf77eff42e7ff816f7a0baf206ca413b13a806fdc7e37c6e4e36bd61e4c0f158b03c5b76a4f34d7db8933eae636872f45ee08bb239b9e4b791f25e45ead67d841fb17f7dd9ed4b9c6936d7462d8b4ad65ab8461149f44143bb6b1e317e1118cee619dd18b93aa85fcdebb28fb002a6cbb82ceea08707b068768ebe3a9e79a962eb2416272a852559e59f19d723cf60d7f81a1d243f67f9cefc4d154ce04022e542be740a58757967a79d1e5fc02cc5be3a32bfb30faa61495b6ec8f84e4a95cddec4a85d79dadb651862d36dd317389adcce98028b530a472f6f0d5a519aa6b8fdae3f231b3899672a3bf63b5886c4d73190ee33170f189d239e3fb3f16b08d7fe848bd580cf67bf804351ce4b1e773ec44404b3b0cf51dc8b6020aff4bb64e4e4468db9cb6d6f2de12c8094890309b05378e0cb61c84863c77e1d58c58cc5119bb4a430cd4b40e79c989bffb20a339537df692084189a22cf80ee6fbbd88be168ec148d641ca7ed9f906c621110c42dd4539a2426ce89d6ed0ddb547f1b3229385d88a3406b8b0f6f08236c2469d60fdeaf41a2c1bb5580e7b970526bd4f09f72239b24157fa30a186a665a0bab8a73a5488ac5c840b32934731db3d8f3e0660085bd9cedc048444014520432814f5dfbdecfa635bd1ec247263aeec452acb2bb1396f1f88829077ef23b90a6cfa87ca13923b867b4fa391f8e82e1513d4a3ef784af8d1acbc1821162c55f5464eae69145025a1db65285121e791b033dd181a4c1347edaac1793022ea6e699a36ae5c903177f687c399bb2b9a3b3508f6846dd5303f4a57e8bf3e89faa1136999a193b3a43b2062764384b78827050084e8f88ea0a66edf55bf9ea2f29af672f057b35f205931a1fdc79045f742b4e087db2f9a07330dc8c3686663f21190c23779bfe39e8b029ca083bec29a0ca3907d173e906dd0f1377d2e603b769bce1904ddec42fa0e8ab54a730a670de082b8bd49ea2611ea328310af82d6ab17f3212e00d9579373d05ff6a0c463c10650cb5d5a6680401725d7efca8fd8ea3ce7e4a76deb39ffe1f654e3bc95c580dfa7751cb3fcd5e68ac9f96b6becb4c4477372173e17bcb97f17bcd489c74e283745040f598fcd9d90d15bdee012d4bb5a01ac159b93510f5a6f094404ed95310d22867adffc4417066c67b386c25ee6a41ca900ac11b8eb2a30a2847ca34614480e59c6092f0b01f7c94f2c5d74ad52b0bfa3475e0968d3787db9b85eb11454cace3361987c9dbe2880ff3742af3f659c1347461e49d678e5e2b8b681148e39cdda90f32ad1b7372c60dcdb08b2046ce7f50b7cf55df6dca2313ed01ff20dd4c0c47031758f42cd3ab1b1f6f8be4771e47ab49d1603d15b5dee63719b2696b817d7cf70f0779659a126575610737869c593e89260199eb05c6ff80947f7cccc18d01662c818bb610bb798b11536bbcf57df04a2912874545e2d13842ddfebe84cb3c81679a47d2e9eddd23ab425a9d8ad36635aa856a823d0717a580a8596b57b0ca1194305e48569b4349afab52c5d003d257d662303d78e78747aa5cac51f0b3dd82773e2764198d7ff47f6e0864669568e8e5c8db5d9874f43318807a5a946889979e18fe4f3a81b2286eed6204ae41e1eec14cbfe6eb76e5d001558a699cb51fd36eb757819acfad19d9cb2b301da5525b4e2d5961cc0753ac3e178939acea1eb5410736d863c3d00dca6752e639a4ab545dd98761770d93c719ffbdd2369ffa1a0ac826fffcc80fb02094836618066126d189a20b44a8548186bfd835c1bec99696c445cb7396f545051fea849f3643e990a3c3bac602992d64dc2f4d071d6b5f9755a93ca9bc5e99033d8d396680be9a4cb0febb5583ea35b15237181b961a14eed3f7a2460a562687b349061423a0d1bfba9c61f4e9f0383085e8799721658376124913ead03c8db3c807fce756771fbd3394e5aa37b4b7dda94f3e396695bf381608cc8f094f43f18685f71296c2ae020ecc0346c8c2c5ab879a4bb5c34f1f0f6c7df84f100b02b82597b3ab232fcc63b612e916d1fd42757222b2b0c6e96c643492952a8cc837da6c05ef1911184a51ac6346f3062e058209aa17f18cc0f0a644bb5634b4c158a80a595c35bcf40a5aca05d9315f32b298b4e519e614545ec566821e046d51890b2f8a5f8326ebf3cd60ff782221056b96bb042ae0d056ac86c2e41c9d7f0f1ef225746c2b9679ffe01244e96354b87b5ac4f859245912d4f66791ddb78f2bb8a8c6b6eb316419008be0fdef1f91211d3ff777af4f65e88a8fb5715e3f4f405119031a1b254993a7e532ef464019e232e9a9f7639f8cd8ab9e94bafe65b5b82005d75ae1d6416208832d4ae8f43852107ef0b799320a9e723c383b4e8a3d83e5b4578da5cbbef7704417ada2d1670de68c1b9b6bd05d74a9e9025d4515fd0be5ae3890e3fea4b4c70037d2f1d3ea04896a098d6d5e4252fdd295b643aaa51340c8f12bbd3439f7ccdde725fb58a8753f0d7f27f6f16f0a119182e4d8ec754b32d2b0daa33ad6ce13a8ed420f83c5acedffe9f5d2639019034f3650d1f4367852320df757346050f26cf45d1655c26eff94030c9e7af7bc0278087d3f8dd312af13a7c652cc6d7095c72c0b5a44073293355afb726ecf3bcde5695fb1d885cd50cc3b303d302a40dc733ca80febaba3f1d9073043eaf0c277927868fb67c4dfc768382797c3738c389e47b5a0687b68740d57e538e48d09311515af94e41cb9d03a757d97d416318e3a2102b42601c5c517a65e948fb669359403612c77fd90e9346ac83574093eabeee53c72354f1baaed8ec15ab7a6ef3dd2875b8c90513ba79ad40a70a35fa81ed5f5bd08a375cb9bb7a621b43a06b62bb6d7372290422171273767da51e5f36603ca4c417f1e074331b854a0592f9700b666592657db91bbef8be48a97731c41434f8b5ea17f4d244d0097a9627ff1939df957efb42c236bc52666eea66c9d02e60d9c50c5410010844ca64f5cd93162ab8d0a04b63298eb955062106f8420e52f4dfee5981bfe533a45760e3ed5ecce4b6d09dcbb3b863072921c589528ae8629929621fff072158f2c0057d3b3dcd13acb5f4085de6cbb286561113bc710a06f5dd7e6c41ca104a6f25f280cbcfa0630c0e4092a99d1f4a840cc73b88025b7b95790aa54f9102243b971eb64f270f25ab6100aaa4d9bf0c33657ce40ed1699b741e748de03d8a8a9820811c9629f54133be22a585c5c0e4e6901dec1773ef8e9df2331d0dd0759522ee0e46eda45ebca160d05f7b8a36773ebb0e48c8500c87e9c224c4287a82f4b4d78c2bd8bb7e97851d19d71b3de9a808507ae09ffefbf2a6b0a8225308aebf60dad8255600c2a1e9f368d1b543bfb2fdbfa68319eb1dfe69728c76f16579780fbe9f161ac940196a54b5336fab72fd344d730325827dde65f24b3c941440dec7c571edb7378cf2f062d250fe4b5c60d95be0abe8967564f1aab30b6d875883b66aaea5ca8b64d05849f8ab009aa9c75271e66ebc1ac6fbb2f2394bc5e4d9d1190651767ea2f20cceec1be266475d9fd154f3fffc71b571bcd9068c9f2c0f2cb04b7e0ba87b8cb27085