Security Research
CVE-2021-34527 PrintNightmare: A SYSTEM-Level DLL Loading Trap in Windows Print Spooler
Thinking
2021-07-06
7 min read
Research Dossier
#Vulnerability Analysis#Code Audit#Malware
A DLL-loading control gap in the Windows Print Spooler service — a single crafted SMB share is enough to coerce the system into loading an attacker-supplied driver DLL and handing the attacker SYSTEM-level command execution.
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a4d4b6d4ade7253d06d61bf923572a6b8c253d117e8b63642be9ad8c68eaee7d4a02592bcdbd3155abcc6a953135deec61ed6729ad92ae056a76758bfc9dbe3a6985cd8b376b1813f4331ad5bb4a1f33f10f2dd18c3f5182b1ef70a5d1a1c6587f7d8972e48a99129818586a52a002e81449fe62c8286ecccd5ee0355a66e17ea694dac04463958baeace475bb9d54264668750f2beb0dab5f3baf18a8f9e2972fc83c3ea13ee9106f33211b616f9119700fc42959086f822819cea2c12236e0b2ef04158f69ac8eee32f566cad4c3acdd4d9c84dcd0595ed6f422b95272109b2271e28f4e944019f2620f7f4211790f29bbf1c5c5fd62f3968b582e8acafc12224cdc46b68938e65177d0da4aa1acb514a4419d6f7f4596fc67df1f74ecc2b0363594ce38efdc4fbd6ba707fa51c8c36f6adb7ca93ce7afb687aab6f8ea8eaaf3a7060f18139691b90641b9b19d00c0f262622ab1c738a535e8c6f76c556b79ffa13116d9d0975ac12b0ea4a9c86501013181d86b80f4b33b34fff645d4345904eecad62c5b00fff1b7df7c047e362c20dd8fa30e5ca45bd5a2ef537b57792922e282fdb109ff28ab5c3a8b9c1806d8216fc3057f28d3a85503bfdbf83557055fe5838bd6a18ca0408c3d955e2157c952bb90362b16bbecb4b3b8c75e696be6751f8289ac02cd5ff89639d14c91b5c6519a8613733733e9b7b8cc91444a6fc74aee3dc8ba52c6c757ab55a91edbebea4c882e0a78aefdb6e339bfbfbf4c0431e4615888560028a244190c7f9f9553a0223b3c6b440f723c7e12bcd6da66deee4539ad7f77b33298faa9f96bdfca36c47bb443fadfa1ec16f3dbaccf0cecbf5d29091ecf607c141ec26b3403d5bc518dd163eb2c1ab077a6b3ea34057e0e70cf2d7a5a1166a091b6aa4b79f7be85ad78272a085796ed6a190ff20a2b83db6f6a5ebc07eab5a1bb38ff74c195f6f9e226e874f11d73af7e039f7c8e0288c7d5d2001124587ea15db29fd5618cc0950afc94447a1370cc544f3575b5a7e06904240e5dd85c5a7b074b704aa9b5e09946614230fa2469c184d61dc286786381c9d909c3a8f86e42e34349b36f6b75fa265994368be99fa7b0e15d03d5fdd2393ffdec5f369192841e2d7ae309215995fea3f87e680cd575d672d4bcb4e65fd4bd396455bc2e1705cbf8481cc1868c0b546f94d6263c292fabf14ec8c76db85851703211905ec0e41946c7bd8e8d0d058fa50c2f2e3c08f9cc9d6824d9e89f1020584ae7d755583e0c69677921435e0e765140c867df9a783dc5d4c54ca41fac59249c54218a1288f287fcaf045e72d4e3eb45958568571e8e201d2ee4579f2b6f3651412e3694ab7d1c8e33a42573645e5692a3ae125318c354d31602c770f873dcdf9685ee7d7151c431d9a794776b0451ffead81e6b4cb72b6cf86e9202d76101e2456e5920bc931824f99933f7dc83a58be3d448b76e19b613959fe8625ce5b50120472a3279bfc59625468c1815f0b5780ba6f0e617a668ec6d2ee8f1493690342f399235592da04a3394982c3c892b7c49470aed9f654ee13cd54225fc923d01fbae0fe323e3cbf7a92fdfdaec0a2d3b071eea9d78bcbbd26049657d16439d5f83ce5661d76e6245b0edee31cc89aa3f9eb573aaf051bd75ebeb57c04a88512187dcbc4dd2acaa1d08d1ca34a6f7a4b5c74fbd4a6793f935ef28f8d6df911b00f64658a5be227c9657e278da8d08ff59be0ae83a1b0b9fcb5176507c117b39b1203eab04f663cf3bc7eb247e78e392c6f757255e5977f0160721e38b3f86bb060ce8dfefb6b48bd08ec4c213dfc5f22856e1f73f94b23c1f30ce30c3863505f912864e26b500a9f3059b6756130a97b49c0ea56f4f1719635773d1fc41346ead4a240a7b69b6f4a85025212726da4a9c7f15f64098b11605451fe12196d4cc13ded6673482c583da714fef409190c893f5b24818943e9ac67453a5998a2ca00d1375f1173c42d24eee3a96016763d26968e2a4d5ae41d7d5061812f9ec92a9bfd47295389a385189d24b7ec01c7ba86c84a38577760c5bf85020580c0822c9fbd57a50066f47335f658fde5c0a2a1a9386d977ab396008048f1d65b4cc5a699e3d682c099d450e086486e3e5f5710e64cf010ad18e3a231f45421eeb2b417ecc03dd4efeff09932317118d8948dc3434b4dccec6b04be3b58aa718fd0a66e24a6c2c82056a30f84e4dd0c6f3c61f6b9cb192efae99860fa66ec6d782bf9351ce29eadef3bc18a7256a66d90775c984414c3c1820db41e9625bfdaf2663a7d6dea34f556d4c8d43a9c73020692e2c6087ac6324bdee33e5f9748b672258731ef12efbf520e65fd07da0e9e33da0348af5704b2f2f11c6866829dda4f621c594b31734b0b1c6e7274a639050eec595d719e0e2fd03c32aa689e4fc684874fadc501d523e4394e2c1fc913ed89564c83a919ac74c993fab660550987de28d773f56d198e260b95a407979769763b7782e10822a4d4007e51b84236207e8c6b00dfb4e0f73e44625033fe9fb1d6094383b83765976c5b0d4add73904940acb03ff698fd7961afd4fda2d146c1ca744f39be661d6f00366c0dbbb620ee8a13ec08cdf895b4e1eef02981a70c27a5806346827c5c5a1c538e6f86c73d0fa319e88145cf09923804848b7b3be5e0499cf9df4f9e654842c310d661c3bfed325bb00857fa7414cf734c2aa2799decfdcbe4517afc01f6f91ed0f736a2f9f77227860b3f911203ba6a499b2d32d0ac0459a970cfc15f408f24341221a05bd090d8e9d1693f90f41e2919311b7afc34bbee91d0a7a3eb2044fe65fdf03a2cf0e355ef78894f5bd9a47069c7b6a53832461e011615476b5e8633306821f4cf954b7900cf154ca3cd71bdd8d16c87630ce60062fa305f1eef110d9d20b00862057e8cee06cc44e8210da7ea44360df4509dcf817b7f1e3571b4dbf1b5aba2d0480da3194b079d8fc3a2f3c9df1a63a3a5dad4cb4ee6d5adbcf51437e015f0bf5c5e4fe53113903ff587aa838c57c98576ceddee9d80866faaa719d33304d5170465a28743dfbf69b50faeb0bcf85698e20bd5fa64da2de7bbfa583dc6c76741e5ae6436c12d3edc4017afb9c23cc719dd5d945dc36806c5384b460149d87c838758705cc733041cd3f12747a21a6cad23739d1dee0755fc217b6046a233de6d67b831fee8ef4c74607999a43797e754d87b7d74579bebc2b02995e340b009ec4d9fc553c3108b90a6e068714739afafb381480b376f41ca3711e351efb2ebe6c06124c95be322a9239626a61b95750c2c796018830e9318cedfd0232c7095c507220e60eefc788c7202d1303ca18eef82823de8023cb056143fb18373d02597c1e2a3c10e3451291bf1a46ada7accea6c4a4f41419713d6e75a0f1ee4d3105ae28ecf9b5309d60607f8a6b5c4e3768fd96b8918b4d821caab2fb40e0d2d960877f0de2894649cbc2c1767ff84eccaadbc968fa5340fa468663f862ef6216c2387dd79bb0fa272113c920c482911f8d18cc90946f31537ba01956f340ae53389a8d3d9c7e7a3276fcfa097b44cac4b0cb066f4b56f1d28a30d9da88aebe9963e2178ce9fc796e9e10be8144a2d396c6e248f1f502c7b53b1ac3a4d0e7c5968c6e4e863c71b37ab4e0f5592408fda73800e7b7dc9a753420bc89f2812c443978e05d7d336860ef6c9e7780f6c9dd06626a4cd5d750140c17b83b5e3a5e32952ce9f9a3ceaaddf53c8853f7a7845c3a178ca4c49ec421c98d9aaaa37dd033d8e6cd25b5a7402fe223c86450fcc908c478861c7676104e07aaa6a76e109317252649d2d23917eac2346f93c38375bc6193d1e3b4348d6ecd0493a9498dc078150733663f17ab11c115af671a07f660ca9f908182a2762e9e2ecc3339c094ac16c97c1dbfc7aa3724f3c539245188003b34d06206290a7c9f75dfd2c95d8bd7841ac34fd9a63409b27efa11bf808840e86d2f6e5fcdc11b3b6dcf91fb0598d1dfa199b2fb1f4d5da4e2e651c041df8afced53fa0f0c599dc10a9caf7a8fd0e8697885a998de5ef2acf5fac68357a88bd75135d846a7aa18d6b7779313994bb3e72d5c087d9fa19cf5560f19d9f8812330cb6577a7135a4fb8549782828431074930620493c88d35c681b44a0bd80622018b1a5a50d607a0ff2021462118090b513fc61159463bc039e81540df6b37d99daf941a48e5a1d0a23dfec916ee660dc047f334145bdb7277a535bd0a2148c154b6b533a6c60a9d68337c34276778006c07e99bf75fd6c8edcac5ee44dac6915fc88d824f1e3ac9cbab2a09cb9478fb75a874c1874c559b499ef800e8988d91ccd0fa5fc21c7e8db91cf817e4fde1a143ae3b34f5c1f7d1522793af10f309fa142632a47ab62cd8ce86d04575b2c48c4e2cc8b0a8a86d6eacfbac43c7d4e0d7cd22d4af1e48f3560a8bc40e0163cb574f33b661d7bca9abbce2fc17519a500a963ff4efef8d41092c1e0f1ca73b2ef6e167f49c43d503b63796abbc97fd78ab92c499b997ddaa1cb4c9e6899d7db32a3c8cbffcb6e298dc7cfd41d6dd53bea6380c4f16ece7b34613ce2d2aa1cd9ba3cd0fe74bffed824c9451524823c1b38e8cf4824b1a1359e66042bd5a89e09b6139a6d98d9b1294fdac4f21f4af5a4cee33539c1ce4876658684e2df5c11538263b8e0e7b2e4fa281cf5585fa12d5b4d64968f7da1872b93d9eb7f545a58539e99f70b6b8c721d6de91982e0a92284a70124a00e8c5c018f0e0a5c78fa48a902d74fdc11cba4d2d58e28b07928d3bdca35993144be94a32272f75003067636bfcf9863734ff2224c6101039527cd3ebd06487ed05ab125e778deb1bb39d05ad23d35c123c5af1b78faf886660a538bde277885d6b978493e32054aa979f25c7d35d374d511003b49aedac5d7a1c300af59b3f0b49def9f78bb17dd73504ceb3cc1e50127532acd828940c513818d01181314dbc4e9d41f9163bf03ae5a1a2d6e6280baac151e30205d09b6fba5e7caae59d589a5a7014d73cc486944b8ecd30159aefe909932ef90077b5e730660022d61e8271615a259dbb297e99befaac4915961cc7bc15d602e992718c75d708e99f8e6148b4480583a7042d9c07fc91e2990a1382b867a2e70501c53199ef8b2f18988e6b2e3ed59f16aa8f3a135e5b6f4370367c770da3c888dd984aa4bc301aa5485b62658bd4dd099afe73f9c6706cf5b639a9c4ad071fc4c24c0561ad8e85b2f9f996b81494e5982b0f1aa46fb2d7b4f908798f68cd9c33de0415d045ba75e0557f24846fb332a0d4e1debe25dcd4b1ccf1676de8ec72d3f9cdb3e2f590e1d5d0f640c3ff5b9a4366cfc5382e3e1a48dc68afce018f61453c4b6662234ecf2c37abe27b07104d228dd7d1d610936d0277b69f1a09c75c82b59a72e6791608f3bf0c31e7e6f56e675090e94c3c9391651c3c99fa056954ee8fdc712f795f465549577512ecf988b99e7361d60e516ed10ea7e182e0b0241443b522343f4da49f84fa00895212c72841e7ca1b3b203cf0d0c57fb5d4e9f6d1cac16bb62125fc3170e322d6db845dcfb357dd507dbc1e86a3f184e133167de799a5c7164063f3d75328823730622ed69e5aa1ebcf65c23bc7aa6f5e5ba628745ed79b1b3de638c2c0723b292440fa0ed1d7597b4d1b999023d0c473f1835fc47132480a8ae7334c91e9bf43598d9dd3710b0402c8df2c9e248270b55cbb36d7835602726a161f5841c06ed167f8a107718fdfd5bac231d00eb22e6711592d87e27ecb7afe3f0bc25a3166731102f331a3dcf183b5fcfaf176b8dd76427bc4000c78a1c83105ea7ff9c6d2dccc456a364695a407643f8a57277260ee55f205c89d53fd5eb0f2219e1ad21822d62529615f610da31085801de1d6e2b198cf71394fb97824e147d033fe66dcf0df5c874a4e50adc3bcdd4043d90803c7cddb046d0b9f8a6ca2ca49e38482c232c3a473c51a2cad82716b83b4ca910cbc50327e84a7c76ca301c4594edcbef2d6632fe9cbd9e8174972134ab8d03db197fc6f16b627cfd08551fc45fdd4b9d42a99014e6e256f83f11f95075ba72385f2209aba7e8f93f1b0d7a893e021af4bccf7ebf2c25fd009140d05785c6580d1c39b5fd933d2f1083443a3bda43a756dab8a0de31ab9efdfe48dea40c2d655932e55f8e70f34201355d4718a9e5df75af313671798e730017a84fbc74ec58ac89a5ea72f59f4f45a1493f82fc18b522a1448c0893eb5c0c50ef0da075c30e4c3f5f1cc4b3617c76f1c09349416364d18e32fb9c6d3f00a1f30c09aa3ddb37385008d89460c8cde1bbebea5dd1da45136e35a76d1ea46ace279044787ea756f1be5cb373f4959dc1bef2d31d160c3595ffe7046739a45986aed0336f9b968b907b3018c5079731b1affa0eef17d21672697debd079064ff85bd05335351cb35f123918933d0bdf2973bd58342950aa32ebecfcda23f83d2d904d980141ac3822e86aa3c2dd5a1abb09ef85eb994155f9c31496c31b7dccfbedaea2c3a125a2fb40f0acbd7af4ccc85098d7160165b28d2c2a07d597cd0d1a2912f1075a7ebeea5fce2e07e246ab9089af4a8c230ff66422c2b8a4879fddc2a52c6bc2afe62866bef89c65a3931482bda4a37cc002e3425a1a34096c700dc37efeadcaf2b8cd3194852fb372f1c2385c19ad52154c4a32de231443ecf16520974d8694af092bf4bb724b2ba09eeb21b12bc35c0742b86e1166c0cbddb1fa5b3734f5a275d02eea82495050e5bc22f299a364c954d63ab71e8dc972ad793d00ac3a4b0298a8e2e19aebbc4f479b41b9fb840eb4e0f3ac02f37fac12af9ad3fcae29a493f73b9b9caf77ac669d3df5d1efa43f168d39e7f7e5bdb5e8264992a25624f9df92366427d05b1efb1ae8f7c0c481b78e77a03b2126ba9fd9444090723db2be72e0e249ca3dd58f28ed8604ccf7608f16197380404cce44ff6a38688b106745a30e4e2e162667ba037b86e834d6419d71f3754482a42c1a2c3bfb394731ea87f57ff71ff74c5e7c7826d316cf6003db484cf614c3e7d7a6d7560773032601fdb8a668b31fc9a51ab874e14238c6f2d51151b617180a58e2bbaf1696f0b2c79fe64c170515fcd41f47f4d9ae15fc5e172ca261bd09466d14e804e055afde4304b905855304eda3e34821f8d3bb712e0a3ec17546c761aca8ad8e0cee79004d69ad6b6888e348f7223d942c92c2c12a26eb5df589050e6c9db03ed25aa680c8e19ece9a81bf7e90d0b0b801cba2c603fd66cbbbd6edd9d646542a8f8dc3bc715cdfcc1c74438880599799e8e05a96991090ed279bcc10a166376f3d1cbab46dd071eba40d2314980f628cc64899cf25c46a4a1b5f8a3ed394247b3f2dc7f2149b2ae6e3cc046faf866fa935b93801bcd50ab8ffca73766cd1c18bff9aeee4b82c71969de89cb7f8810d182a7b7cc6d7860a3307d9787760f72c5f3c4d0cfaa558602df0d503220beebc28b7a39409ba17644a2ab59d0743d96641ee50d775ec846897359e031e98b6da857f029005d27850c7840d781298f37e5cfa7db4f7045be9db1276ea3970787baffda3ec572507f8b9eaa0b070f4d5dd5225b4ac1edcf51d8dfaf07e8c667c96269a935b69ecaecafb9cb1f09ff3e0b5c68b75b6f88ae387c80dd331933201bd1ab174d9556e036faff8827869a2590c4723d5b7f652282dd2c6ac0a5fbc047ddcb5c3b6c356ce2887cb0ed7bcb299f45f8f538b4e4f7859b562236f54555855ac999bfbe4812ef653b45cf3d28fee632a2f1d44deee42178ec6e69773e2ca5f5fe1d64567a770f245703ab6603a8e35499aedc2b9d6d12901de1c1bdc7ac4bf3682275ea8cd3d4e5b039ae76b6aae7da3062106224e3dc833ed69bbd1bee923287b4d986315e50981e500731acb4adcbfde5616eaf8d433de731b60db3fad231720db75360b915ac2cd275ee756896ddf0449f11400c189d06cfb1307b37939dcf07a1ab0a8d3a4de818f62f868f027a0c38fb54b1349b05b269b691df87f9c0966a3b21dbbba568eccce6e6690f5836a1a4af43ea1bdee32e9dc0c688ac85b0d9bb23fb183a61fbc388f74168740b9c63b5b7a8eb848e22b80a752ce1464598597e7c9f3ce0177b94ed810fea7780e98dcc5ccc0e56752d40a306afad23de3279cbf7e54aed0ff0b120fb11e9bb01d6bea0a382e0e0d057756c88d1c8a8ad579c2d7698266dc5b7cbe9d235a734b173b8f190b415ab6d88c6b1ef23afa3d600fefc6ba283505e6e125ac50a14f195ca32f4cc3456f9803ee74ba00c1af661f51f2836b0f9af73ca56480e7b18f91a9bbc010bab249c86e48478df8ba79ee3cf9068e907f4309111629901f348a8af503cbfabe75bc7111eab405167e5a167328ececfcd2cb928557bdb8f0f3de6b009e044f7ccb4f6fc70d6830db5148f3fee8513da3050414ed1433bb94061df8b38d6d7bb40f1b06edac188bb3e18b1aab1d08428870bc12cbaa7b35c5348b50b8f8f6d7f05a72b0bf13b2eb20a18a030ac84a221f1eaa3bc2b59af8875c70933925c338f789a7f017847169fc1860680400e49265e2604ae9aedb5e47d01dbed372f2d87ee4c7dbd2be978fffe68a8b86be936b95072b3d1d1069979fa7344b3c3d0f81e5b19fbffff7c57f19ce4b11a754b3209e14c57ed5b054e20ddb4347b3f77f1ea8220c26d575f0a40e0a6dc7f6f3ca9656b9f48a14ed05a1fcc80d887fa34ce1d3b19f6886bd0257b1953fbb7389fa9a61e7fb3efd2f7ac2d2d64775484dce40e673face8f188bda434906ea2d0a1bdb8ec26b94be71c2d4838a6a8c3870aed42b3bdada275d123291f86ac2834231a9b57920f7eb8efd98a15c8b188af8bb90db1ce5d3754fa6dc3e12f127534000acbe0370ed0c85fe1409fb256580a631ae9d09ead08f6015ef42685148c98c9ab44ee727c22946586768445c3b3c34b8d0855de54742295401560c6aec68ed3863ceeaea679ba6ba1aebb1fbee6bf95c18d209dfbe6ffd7e686c0f96e78ababc8133d3d15320df0a9480ebd9b86cd5e3a7b2c29401fcbc69bc3fd35bee018d3bb115eac438a8f44041d315a460baec47e4c6ec96bd9e0094d7f3033a897834ffbf016b410e201eae02575b8982fb3256c0e4d1f875b1b4d65be9d00bcfb86c578aabfa74855096fce7f30a5bf4ab35d54ddca392f906efbbe258df53a0ce8125df0575b0b1f47d978f8a5a9ba9b40dd2ac6c59ae47f5f54857964d0df5cba4720fde20367f55debb2e4013ec613f61ad294c26c64729542db2bf4e4f6eda3227df76c90f24d45d17b5eef647d8d35bccc5f9858910b099726c516535f03333963c9d6ab9a664a88e0527eb62f7592c9985a8d4f6f885ae43e55e487ec503ab687031da81af6226d10043a1e9253ccabfb33db9b5949b9746bdad0ce3cb838a39bf0364f58ed41ed238f326e0a1d8592b5381bed256022e8d54fa9289aefb4695c040a647d6f004ac89e7a3962aed18e0e0b3bce7371f36641dbd1ea4ff7eed2766951dac756c8bad39e4d05398954a5e14fcd9d38e782efa7c0770cd3f6973a46a15202fa17cafd73e26356445650ae889803fe2ae5753d1ceefac08d8db9e11ac85c25a7a7c99c08c0753cdcf92c81d3dab98855113570930f271899b43032639a4bfa5fc1d0790822ce36719ffbdd237df7a1a0a1822e87bff4e00448407339d467046d1b9438fd5d83071b7dafae762eec9663775c0ff363665c585fe9a841ef7571d85e383beb65329adf0cd5f9915fd1e13b93abd2df80d3accd779d91937d5ff5eb884da4b25678ab5d59352885b732bc44fd31154047b5616c3527d87607290a06eba5c3094e881d89031bdbdc74105a3c223f9e2ee84abbbc71b241ca753976b28b284c51ea25416cc48cf1ff963a18eb9c6b8cd2a589f022027758626daede1770f1c6337c8f3200ef2a6654a067fbf9f7ba96dbe044b336815b6a2ca53fedda286d728e6d159843293e623b0a648787494b2d53fb9ed32e99e912f6d550faca04951364212ab4172097e92d02ca0a1b6657ed002e50139ad6e69ac054d55dffaeb2148515ae2a64df5b1d82704153e704227ec703de198daff4b6fd714bb668c714fedd68105aa1219a800ea54140e809601f9896b1e1ff65091492b421b7e310295f9c365096bef80ed4fc0091681757720d8f63f2bad780284c9020098254e65280e0a7480491b73a1de9f511d6adf15b09e2a1f40f508439bbbd548b3e61532dfb3007976d3bd5d0510a83b2c8ea9918e6871902dc450930ca474a0931da04dffa8050982a16be48f47f9da7fb07c593f1bfa0bc3641424cd243aaa12d045a6bcd761b73d572ddf5e5ba0bd65b9add778d1e10d5b500b3be0934ac515f570475234f76e35497a6d384c8e23568db285f7e79bb19385fdc10b6ca0f876193d3341ab782c61dc29ee9757413f6f20c1e29088cd657fc2a2a1ce5058845b2738f9a38e97913c6c5e5884c263b0edc31a07d080a5f6d947765c26a7d5a0b153ed84e8539176ae7f345648aa2af2596369ac286f8dd7237f0312826628ada41116cc7a8bf1460682b5fbafe26eabebec65cdba25e9350d940d7dd1cdc16b913a139c981a7bff37e73ff71496db50b233737ca9aad6a50a96d858a79713d25de9aa17a404286f29b4ac26f118e589bdb161c44870604d7940bbd1ed9784f6518fec42f0e066254464d2e6cab41fa62931c53670ce533c509920eed951c74b5ccf6ef17fa3d0388bae797a81dfd2e68e7c83969ea805619b172f347bb0a35b981fb1148d494795ef3d93f625f068b6b60fe6b7837291e35171273767db31358387a2cb8c71cf1e075764f99584ac1eb781e276381646bed58b3f1a45ee97732c24060e4b8af47f0ce459e0f33c530e61939c28e3bb650db3db2546d6ef5238adc25689cd759460d030410c269b4c4871b6fb8cbaf492a358ce95b55763cd5797a79d6d1900bd4f0be77bf443288a518c2f9acdc918599c62f047d1ac5df4799f3738e57481aab45626884fe3f2e3d628241e993b50f4ab3eba5c945074ae3265a4ab28a1a6108931a686223a69dd68afe794f0f74b7f6f35f6de764c851f532181ad9402cf168d03637409809e4622820769b6e28e3ccd7da55333b399310d171d2790b2085a5348b96d9799b149023ee5d2fec28fa9280c0a7e29418e90636a28386e0333b10d034902caf195cf2b11bf5f96bd15277de35382dfe185bd44a11cbf8ca61d9672895e0a2cb8c3dd5ed33d6880856cb1b7ab7e41d5728fbccf4efbdaae3bf201f14b3b161da9a6b4309c7a1f3f421ddb70cbfb2b8aead9347be1de96366c935eb6f7f3007be8b1a1a8040102350b27d72a76bf2324b7c3a0682fc319fb44437835a5dd9c0db79eaba69d9f8ea63c552a14e4d6f9017a1b1e3d97861bce3b6196082559eab7cee8fa6dc36c37c3bab9440dba8d55266e66eea1eccace0eb2c4ac7adc5db0d17572469e9895987a251e22d118115795bf0f9e135b92196a345e4cde371498d09f6b8960c931c03c167213001ae80625567ac8d7b809a4e988fc56d524e9393f844ec7c7dfc8975f331b5b0533a7761f48b12081a34e9947660571894390641c9552d85de7f0ef9275d2b1e12d48d6b02697549496ba6040e03449e667a4d0832430af8114368271f7b611c08f57f735f841166dabd149e58d5201f760b9c4363c2a78a556239fbd646d60c4bf3f15862a099d97e43ebe5e53ce6753b184298cac7162a9349aea27717f9ae9a50545e0de1a6438fff935e44bd35a95a24ea7083c02782a0419dd0254602bdb9e84f33b349493ddba4b1186e902629af918662a8524a0a61d296df4fa7421975b51c73955349c5924e849c885f7c0cc69307552034c47669effc834a472ee2d229e65c89c42d33c521a270b56c43b81dc61f6c3c40e1e20b724fa690baa4ca02176676043e7e56e590643e67320a23542dba9964e5792aa70e37cb2e3d7317e4574fc54baf80955b046aa7b3aa7d8bbd0e64aef929560a26ab85d38bb60d9b92b7da04c99fa3378933c925fde0fece5238ca74bdc9d461e03088a40ae55f1a0c4771f618c08175ac2e2a359a4bf96883890a63f9adfb877637c5e04397b4fc6b20c7bd956f3e9b91baf7b7f7a246bb28076f4fee5cd927c7d9f4a7945a3b776561fcf8c7067a4be17a93ac559d956821af4fe647cea9bd1252f71192a8c43409928b28c986838a43b7a8e226979ac39eefb5dd2166b95064a535786c7f132d7735fd7f70f5040a426406f2d01820200af77c0673fc0b2363617adfe1f1c6834efc18427e3f34315f353b3b3b077c4cd61349e43600db976fbc9db22854beab414d03609156d904892e0869b88b256f4b1adfa27d22a400721e1d69557434f9539b46559a083ffb679f4d1507ddf527eae2ddc49699e0f95b9364d5c557933539cf7cf6064dc4ab95976a9371801b7d7a10fbcd6be478914474bcd5c1f1500923c2c21358221de49e3a96c3eccd1ec073a15b69617296ee8bb2d925a3000f87df1e947983dd1252b8052139c971ed536333c566c5bbe53cd26211d3871cfab89e1885d8200ceb37a22e5b7a7a444a07e7294fc926203250e7464033de18259790e3ecdce91e8e9cd65767e767c2836ee37cf4c72a893659802d8b3fcb819ea0858802a024ec22c0004da1bff37dfd7f87b311894d0147b691a405f9cce3fae8b620b738e1f2b02f2ccde18691b2ce6339e004dd5d12249804e7f058049e108b0fa835189b93be1a58beb27c2b9df72cfe2f769877fa6315059e0d83a67a0a39e6515017bed4907301d0a3febc44eda9f6f45e5d01abef4a49a2337805f44cc1d5884c4c1c999f61fa7e15f546deef252ffee16ede15f33a8301ad7b8ad42f012d4ebd236afb1807879871682271aa0f2ff96718c9bb2dc8274b81ad4322897d417e6eb0c2ff3f6609e28277ebeb7e565d7f26cbd3d3cc1b115ee87d7efbf124c3616162b08cc96c73173a140c26e46a839fee36b91025cca4ff5c0e3123339e0efa86648e8cf59a2966d3a882e7c3ce8b74a631cc5b38afec9cb8e43691a62126bdcefc630f322e63b9e4ba0d7df6458e4fee8f144dddd81f33da811babf14cba3890e34c8352c25ad988b812048574e356b8af6ce54135463ba813d1441d0bea900691eb49412e8373973e6a66647445fd8f2a3c68dad6aa00444eca5a1e352228649eb88e358831124eb811bc46dc7bfd5ecb0aa0823bb01393ab69a796a28907b38d5adcac1a43c661c95ade392999388b43364ac9d567d65d84beb79f19716175c2ec56968b15f3a687fba78991b9f5db4bb7ccea0c5300406adc108e241b68c9c3cab93c2d90bf14212aba4a756aec78a6de97d2d58d14e9baec75671d88c4cf853e2ec983f441142000f810491d9001871bd2ebdc30c21d1df7f267264080b504fb1c52c40be34c0aa6afd3b1111d88e2c882596be385a3510aa9a980b356fe5161caa5a999698f28be37f1da2b3397e4846d3528529d5c2bdef3a8e4e4a40c30b852ac7059699780908b80dac15c78fa6ca045671dd047d2e6a97ce9bc1ad177fd754856a28566b0ada051dde5a0340bcfc9e8d1768ec9a493fc8013e3fa188cd3eabb75b2860fe325583b1298124049fc09048d7072018d9dece59042b4a94fa05eece04d2c6e2f9acdfd1e7de88cfa92474d70c30d85a84a1fd5746b39dfe73e3b37df0ae8332e68094947ed41adf14eb9d862ebf8c8a310b6109c5d68eafa91b3f47ff882e3cce19adb0673d9e30898f69ec9e42619249b17a6942a9da89a6e3ce6213234b0ddd595f30e85207d15f674c7b2053daffbc1b7f1d7a2ba11fe8d364affb8acbad0e91a68a337d033a207e4a6202480a2a8215bfec90f7946df13bba1b987189a363c8804671478408634c1f615c6465aba87c2e47dd45e156c88b725cf8a097502eb641528c06f1b35b899d50fccce773a20eb8c85f2b74bd8daa0235f0f5bd6d262706c416c7245eb7acf737467d97150230c4c563294d3ac6d534adb2ca603095e5d90856913b6abfa4cee5c8962159aa41b867c48adf39518281628445f0047edebadc3b914ef3610cadb72694f05f56e9fba945d31dc827e183419bdd25a7049f979e2a8c32ef1084584dd4143f3c903ea3f00108015e450ff690f2c1dcd213fbf880a989d3ffbcbc7063f9602cd111725d440106cdfb74ad972012c53db1714a548e12ac766a8fc4b95d47ce065d881d5c4b515a132a5426dd133b1cc963b28edf38a4981cb8fb905ca8d80da683f69716ab49e93c7f31efed796c0cd4d5b73a2411b413480f276965618147b6839335a8ec601fc