Security Research
CVE-2020-10770 Keycloak SSRF: One OIDC Parameter Exposes Internal Servers
Thinking
2020-11-18
6 min read
Research Dossier
#Vulnerability Analysis#Code Audit#Lateral Movement
A single OIDC parameter — request_uri — is enough to turn Keycloak into a proxy. With no proper validation, any URL the attacker controls becomes a request Keycloak will fire for them.
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a4d4b6d4ade7253d06d61bf923572a6b8c253d117e8b63642be9ad8c68eaee7d4a02592bcdbd3155abcc6a953135deec61ed6729ad92ae056a76758bfc9dbe3a6985cd8a37691c11f1341ad5bb4a1f33e626138a85221db5b1e572a5e0abd95968619172c5849b559404012254b902f10153dc6ac31977858546f17c3e25bb26f3c8af96445f9c80ea8fc842d8cd6222437c561533d158b8587fff0999f7e19432ca0877a428e756412f761b677f951e3b0bc52458143c81324dc7edd9377afaa4e00d099f208dacd632cf5aa695dbede269bac5dbd157429ff863a14c7404993f36b6865fc0520af668116910457f4130b5bacc8ae86effd8a71d3e9d8ab31227088f57ac9a7dd03d4895d156e4aeb202a846cf67634fdfea678e1e79fa96b066b87b366bf09c49a97be33dcd65bcf24d6ad17db32df0b9a3c5b6eaf9f18efd9ae2550f595dd28df50e47baeb8109ccf0236527a4d56bfd79fed3eb605a6d69b9b0701dc4c384328d644defabd6530e4578d7c677c4bdf97364b3f45ac67a084ba9cbd63e4c02e5bfb19d660e27316d23df86e45c74ba389aefbf1c35122b3562fecef9e3448635a90e7fd8d95954872d2bdb4a68219fb7475cf8c5bf78710b40f684c8dda08cb651c03ac8144e199d50a5e2666877e3ec8db7f1ca466d6ad13a548689ad22d40dc9ae5784038cbd9b5396830262791486cbd3da804654658654ba72c8a71d9fcd44d60de65c909bd75583340d55e9d6ade036a8b9eb2f0f5ec85d6bcd190829ed0c0f1264999a41a265312a2e02107839335badd68b63c9f25203ab7e30af6d9de1beaa048b8f64df7be017b09b83ff51acd3aad847afa059280c469f3278145bc239250e89a75b8ac06ef9321aab65aab1cf704c28105acf2d7a465975bcddbea24e34f6f89ebe2b21271b478dfd26041ee4422690da622b12ed38eae1e39e18df6cdf8494eafc0ce874f11d73b33610837b8b15dbd7849101076a1f6db64dbfd3c96d9088d609e9930c755e20f35458611ec4a7c510067e0d51e351496f12596751a9ccf2955e350115df7729cd908450d591706787d3d40ec2afe9224de00d49a4687830a11726ea3bfd95e1b7f1b103508ba38e3904f9e1547ac290805a6e28d4085d3fcfbef7b9392070f469d473d4a2f3a723c4a2387f5889240c02dabd570ef397ca4a643dbc9523712b71b6f010d6d25ea44951246729d346cef84d40d8a6c18a020cc0f94f2c253e45e29f916e20d3ea97433a5f5ba5dc41423f0c3836277c1d4e4d344147d062decc247fd5efd355aa0db94d389b53249359d0b683effb065672d3f1ff4788923b5d0b94260723e3569f2b303a5c426d2ed3e70155cd76f72b6f6b1a038cae84511f599007ce085fc66aeb2c92d897dea07169559a2e85e7837e3a5f79e0f9d150711fec2672a408dd419c631fc8456e4564f5c51867a99073a482cdb69de38c0bb76802fe1c8888e56251e5af1068453f7222928bc44c7c951712ebfe2443f6a28552e83cbf6d6fa6b555219c30793f8c270a2ce8062f98852e7d8f2071447917f0943c0ddd22ce4827edc22333f2b059ee25f69cb8b637d6d8b82a541a2635c9d475b4f6e9775f6b780a47d610cb82512f943c3418f3f8fe668dae9c1fb9f930a6f107aa7defe64bc0518f562fd5c5b4559ab6a14f0ad0cc71a6bae9b38b4ead5a3091ee2aa128f6cfdfd81040ae1953a5a66805965f830fa98d7d9d798450f64705179b8e12537c4b316a3b84061dee08e174c672c8f0313279a19fc7f01c66043e3ebe164e6fb7ce6ddcb25649f888aeb1afd3d298c8c215d2d8e23509eab83b90eb385e30d22c80cb0703fe5b9d596af30bfba12fd522024445c5ff9c73824a4a1946205269d4ff69662bfe0f6558242efff3b11a7c682d3f945d957012a743f3ad00024112ff628a91c75c98837867c39ad79c6347c52dd8d39adca6fd0e50dc7edfc66d40bf9ece2ea7180471e4007f43924de42a9a4d7f67dc752ae0d3f2ed45dfce0b4c54ffb88ccaecd436d074db6114d19a026c890c76ab7392bed36d765f6eeb4b2d4401353dd2f1947c4d4868472f5d2ed2ee0c45641898879c3d977c5f402e89037cbcc41f78fe63376d55d8585c055b93f6f2f32a5e79d0511f90be30381749495be6644e79c60bd909b2b505f23352158983119b0d3eb8cf82d9be4caab496ef1df61823ef46222f99006627be1c4dc4c0e4dc0f3fccb795f2f7e99d0ea96ec6d480b4d06acf60f4d8baac1cb2343f5dec093b878e4f5f713c20bf08ba2319ade5627eb98dc2b54352384a925685c17f6b3b2d3a6492ab7229b0e932b1e8318c2b02725c7fef47b7bc65a80bd03eefbbed67e72294f577517d634d83b06329cdabfb2ce09ebe1175b3b1cfa538483fb158e9d4d9c916b98b8027d062cdc5adb8291c3ba8dc0d175f680098e0c6e68576888221d22bd09ccb04db3fa86b401c977ee38e32254a9686c66ce956577e3c71d874aa206b16842252401cf35f8c716405ef83c530d41d406fa0473e1b648ff65e2fda6c7ec72d1d6cd6fc9ea0dd2a049107c31ce53aca858706b858c922152513bc55b6c2ec6899fa06309bb6e92b5ab1a171868c82c11a0b10ec178e492992614b10232775efd9abd877f3bd2273d0eb279bc90a6ff08266835a5db9eaf45817d4b1dca0bca254d4637d58610c6dbfde2dfa129536f05245a433c6b025879acec1f0006da5c1157483f05b303810a352177872b4fc09203be7aa9fbfde300dc216dc8c0db15cf11ffe5e5c240257b45b31b5b65285e40913e086851de7acc44bf7e506057e6cbf5d02e352d807aed214330d93a6bdb6b59c1411d961635bc60925d95f7c4876a3f9267710811944fb28b2c242f343cd3c831ad0df1cde763dd36c446bea16b0f3e747d9de584f09c1b7a1c4f520c652c711d13bb35934d74042d0b645a6e8f3123b609f6f6b982d089bdc2083e87e93b2632e2798e18c4e7218ad01fbbf2750c6993a2d1d45401ca7a68abc0458174d8e4460eb3e8c4184466de191e28e3d66eae476c4133447533c5740475e24edcfd547bbd65bd28f64883abd1ebc03b5da6bfbbc9fd2226138134ee1086419c3acc90e2ecdd52cc67acacf9911f030ce605ecab4631c87c98d3e719b1980706b08c12e51717826f599d62d3990c9e4304ccf13bb0f6b232ae8c822c24d8f8de9dd1f1e998f067b2c6f4690a7d7022d93f42357c859640d0191cddeba106c0528810a7815941f649afafe3808d4eb4af15df673052050f434b86b062b4780a52731846b75672d9f4354c4cf8d06c962b575aaf5ee447b894c5650b09c5d4af2d9d3db7c2c08039d7181fb6976f98429cc026178ec083a254d517967540500f9521791b00246b0bbacf8aad3ef9c1403326e3e68bff7e513310fa87afbf4f034d96a606ec37d5c4e3968fc96b881c85c990aaaafe847efc1d97fc27216af9f5a05d1d8c4707fb140b3d3e9c52df60a19e15bc97ee277a12435903e7583d6e2f4286f2ddc33d4c7de05965d8a8c96200d6c51fd7671ef46b51537b6ab17a935280f71fcfc14701780caa1cb0e215c5cbfc6d602e5b69beba39d26f015ffc0d67d6e9c0ca08d59e9d396c6e2069ed834ebe5294fc3a4d0e4919e9c2f4e8a3e6ffc6eb9fdfb592b15b1a12a4cfeaa989d66772bdfc7c1f631423837f44248057f67bc7ad324c0cfdec41b686564daf06b3338728b0e4a652618b136e5b7a2d8bd8fb12f9451fab099083f1d9bb5818c990b87fff698f16bd63ec9f18e3183ef7d14e734802b53e7f07bc979870a6f654f7d10bfa5e860299f0c22340cd4c93048eae5074cdac58b68fb358fcbe3f1649e64d71fc1b60686c07550057c616f56ea0ede1eab2e1300f060c888889a93b4702e8320dc3e6fdaf1c817e6500af6ddaa237097e006245581117332fe2f443544748479c7c39b0487da9c17da40c4ba2e46b675ee18c1e2a40ed44d0f485fdfc51b3f288d9cbe0081cad9a985acfb324148a2fda510ca088cf2d18e1fed1a17138b84099cad6b80c8fb60758ca0c58546e5e3d1e7cc824fd38dc45f3ec502e2a61bdcaa32840fd30ab6e12c525c3881a49efb52041987aa9b6d38cf6c62e20c1f0bae5d81cd8782651a4e3b6e6f82d09c3ecc94ff1a0ad41a20018b161345cb06ecea63215e275850697b77ee615f47309408ef0242ce6637f5b886941853ffb4d6a72cd1c14fa96b09c057f42e0712cc7632f36aa00a2212d417b2f357d8e417982467413330633d197e4ce187f55fd7d2ebc5cbf746c7c69348d69b824f192c96cbad2a5dda8e73ba6bad6a899115149d44dbac38ffd197849ee4ef44de506f97f21cce0afeddd28306bd7527b4f8d3e4520d86a61ff605fa0b6f29a529e425d6cc8ad0d39d4389dc4f26d6b6beef643aacf2aa08c2f5b4c7d629cdf32156f65d1ac2c2065c47ca12012e8c7cd1a5a2beb0e2ec1e429f4a53f946f59cd9da555369134938a1227aada760fdc676d504b92fefa3bb91f162a59dc79bab88e0ab00a190fe9ed470ab31208bf4f4a7bb8ac16efd459b8046a2b778652062ace2fb540bd16025e78f97ba9052a70db2b99413d30f025cee2b40da8df59f1212040daf2e49b2588dbdc13c37b29f81eb30b6b9e3546f84b34655d870429a02f6c721cf9cbd79ecdc1225722a944b332352a597c20786b311c2b4d54272edcb5521f42f8ebbeb0ebffe7ea3da73bdf8db2585dd8f8c2b4fd5667b381e1942f7cdca1ef2a5a38299aacf953024e6c615e9566a59fe820292c421d0e60dab0302f557751c2b3a1c3566746bfde5d5377cea702bd710123f1e2387c3cd7f8de505af0a5c7f83ef03ba9609ff21d546513509b39df688b4460dd07bf3800cab5f679ad0c0d83f4ea99fda3889cf56784c514305ae91eeac4f79532132a9c861065b8ee5f180f268c17a07d9a5ce46530d6e1af7da2f9305116572d03c962700ec40d444e3436ced6ae9a2a7c0fe724e3024e5b1151ed79b45ac074c9fd9a876f74a70528c7b97c084068dc32c11dbfce303931edd2977acf2626b0226c608d03873096998bb662a93e6fea11c29a72cb7f5189a1fe49925f30cf7338cb3c07b078f6e2cdba74caa3cf2a891eb93125699eb37a3fb1301c33693e9ce6c109edd686b25d0d707a6ca750b0b436943221c7b6702a6d39098b233ffee150fb20344276edcd58813dfe87db6d7742fa58d3fa98aab4e4cc0c5475665f98e8cb4fcf993bc1a8af898250116a43ce6cda9e31a768b3199983f952e74d159bb26bc197f3d846fb477f4d0e198ab71dbdca6d4b46122feec73d5e8c8b9fbf581b8e9caea5dd1bc17814e6b8cfe55056d4954d57fea9d5d9d7b40335d222d285389302bffe7730711022cc4d9c9d61d966d1a399cf44a0a867acda3d469e0655b31f3a04f26f0e6f366695581b00c37a0c9522666d08a0d2107e982d17a6b7c445010656a5e23b5b586b0933d25c20d4e39850fb1fbe58bbc2d175ebf2f33155c9bb6d6b38c26ec12ef0275e7c91a7c3d3ab580d671b79c7f503083c06bf3276dfc7f72ef33d1928a02d9be56d60474ae029aec7f71053d3a41d2d9ecc6105b68e999557d972c305218e1af3f0e437d11e31ab7e2724956b5357f49c2841b6af429c481653f292443fd0fcaca0a2a4d0b99803dc7c47ea5a842d375184119ca99517adec9894e44948bde713a38288dd83699618565b11faa7ed2f10c4b537c173e5f4ddd6eeb60ceba0e279acce2a3cf74d003a1706d615f2bc9f227f66bfc3904c6447d7a2b1508ec38f088ed89b5c1d6c476a1d0674771961f43ba47396507a22be2c1dbdcc14f75260799d71d603c8f62266f2efc69f40f800bbe080cb4b2679d12d4082393713a6b0c6b05a30684c30efacdb4f6cac9612046b9365be05ddc33d258faa18b5487574859add4bccb51069a2026ee83c95a2215da8c72a29837ddafc6d47ad4b77a8c1723ad883536c5f1a1981abc5d313f8ff48631e215b85c52d1e8f2c5621ff8989f945760624341a3d63db6c3e77506e52fcbd99210e250e6dea7913acc070b2a6e668fe61f921c0fe83f94ee749cbb78dbd7eaad81b98eb372be4cddbfbff1c54c951908425c78d08a60d1d28b5f9a35c3e65e3845a3b3ae3b3025ab9604f64aa3e6c5ab85eb14d4cd10ca6f5aa1ab3f01054d1ccd789bdb1cef41f11160528ab703017d8ce6c56c8c8fd9da1fa76e738ae653139ce92991e0351c230981c52aafccc710fada0f1122a8dcfbf1cb0e3050d23d16132f9e0b3f4213e123a1cac5ae491437dc9aa3ddf3608958c5d722488cc91fb2fba6c82ea45662e1566481de00c0e238135685bf746e0eddd920325458c61bf0376a9664974151fc7f0362dc479e69e21020bdb13aaf0da3448cd799855e18fffaafc67964616e9191a11a8563e7c9b7071907198c6fff64e8c927d8d2d8ac31df94039f13b862a6c9ccee2bd1c9d204c4c93e5f9fc71bddf82f3b85aeb6b99cfb15af982f4ace707a15158aedeaf88f7c8acb5a5f3eaa0800c09be81687c019876234feef94d2ebb063483795c8a9d14b64409ba7bcb4e5f2a57a3133ed03d5e3ae9630e7394d60229f5576bec43b4984b365fa238767ef85944b32200858e56b0ce46d7a3f2fef9c4097d04c51d610ead8a23099de4b0652fb3c3209379edf88ff65129dd129b6375f3e880e5f4c10e64019ec92b05cf26da0e94cf0bc1c01f47ad23b7f82e558476d9bf624d190520d41482144a1a8068e1c0259c76b4f93215efc3243aa77f5d2eb5598de9530cdb1f9318b9f776fb3b6d9b169b01c98f440f1544318cb3838a9a24e8d9e2a98e8885c3068b4a499f770de78c4d40150e04ebd62d4d62b7857db53817990300c331dc9ea36610c3b44b1a692af947a4d5c0735987818b30c2e99f99f4216013e8d3afa774d2588a4915cbbc7de6c57da6849c148a8314217cded4ff4acc8fb9e2174482df1ffe923667aa676b5768e0c7117c004715e422016c6bec6a2fabe2224b5791bfc71d02fd9b3c0867b7b63b01474b4839a761138327662717d7736776f02d486358837e78f42b1c3451520c07e2b585c650a7f84e5993ae9f80d212d0257bb7e893c571aae7fde210bc3bd08c8a42a9831469f816edf4bcf16035ad1dc0801a07d5b1f7ce51b71854d9c26a04699a6f8572b161019cf87d8e7d6f49d02d4dfc68ed4db60d66821d54fce212010ab21b1d405b3508cfdd31fac3ba3010a8447ecd98a3baafb544a1bd942aa6e246afc07f2a767ddcb4e290badfc913eae5de7ebc8f45a3e871af72cc4c640f626d3425fd220f3931b157f74e7c0e6fe40dc427cb045dd2247f3da2e9a629addcd4602b5e982bd82ea355f47b3e7c3622940a5a56e66f678c7ca2ad0c3099d960ac14aabd0fca30d7fd73c12bedab4c34efc824b5ec996d86893048498f7bbda7a787ba91a29df86332f5cf5bac4c5d2ad1bc84db41c41346cbcebc5c2286201defc67208f891d9165789b2b19a41e7a5fc2459f2116841babdc3ae970fe38171e278343700ff68b2bc122e1d98da2072219f1aae7366ff7c52bb2efa9987ccf39047fa999b20a1a115814dc291c6cb3e49941c5c2e153f9842fc934439208d5cad3e0b8f8d21218ba1c594763b20e598bb5086597c63d50093b06c3e71a52d958b735a8f78873829c7195d5702e4c2d3f6df7cb317dd0f0fdc415d987567e7f276db0d57db0e76a8e298914e0f125b5a5fd86901d6737e3451cb829eeb1f3e65903f8703d4ac1727ebbe12bf2a3860ff4b7351db9222d771f38afe5fe4e765e2f72422c4a17ae681eb9a25295a5926d9e6a55de7f8293c6f4af42f379705dccc58c8ca7e96dbf70a4a1e688012f413e29f2c5c625ccd7fb5eb0d33080a995e81b1213d15167385df8b7ecccf7f86a7be19c4e69fd7eef58e6e8c2246e4efb6b65bf1dfa25c567d96c39c7ade377d15c4715038a07c5b663246d8390c00cfca54cc87d56f91cfe2a9b8b5677113fb711bf1ed24be13d828dd486b8c59f391f64ceb9a763adcfa3e063031974a2b5fd44eb1190ab2787cf8e9ab1cbe3c5fa20ba5d6b27eb8cd7ae156c3a098279f1a4bbea92da33b443627efe454c841cee9d6975f8166e99e4f80fb36a90fdc8ce50d40247612d6aa005aca057de232deff3b048910bf0b52ebe24eebb0fc7b8f38589f4fbd729061683db85f0a3519c2d25d26f2b9dec9ba4dd16a33da27ab9e3dbf847eb2ccb9ba0b607a5f1c037fcb279af83650155195fd51d23f7d1fa38f4ee2944a0cd37ff4abf264dbf35bd5b667eb0e5ba2083180a1c2c1cb20c90a5020af85abbc8acf96fd181eddbaa9f1e871453c36dcb5176dd5c9c48ccc33c3bb5c9994fd70250e1174b1bd3ff6a1a99deb1d82aa173467cf393492fe6b62df100a8cb83c7b0048fdd58b8189f2a85e9788e64110208945962be5d70b9c161ddcef25ef4b02097cf8a9d351eb6b7f8f58229cd589463e3d6ff003e46f64c043697116fff7d5ba87e6aa26457f77ee0c6e32df6bea7a77456c4a350930828841d70947dd02c1d675b149a8d974cbd7f6d276f0c200bbb86eca5ae3417d4fd3b3263e18a092a972baa2e6e0bd6cf9271f83afa543afae6f330a46fe9291df9a2c28e1c5431cbe5c13669c2cbcffa6f481e5c55c2196dae445b7266e2eb0a27223589d4fe33be715948155aaebcd0656e67bd2132dd71cb0e907035fb9ed4d9b323805c1f2a93ca378c6e6b4716aae76adc83f2563ab3e1c4fee82720312264f3dd857b7668c8e8b5c1eeaa6ac354fb83a6bdaffa3cf714bd0a71076ff1d797c20ab442b7e0d4852f9e023e1b8fbd616a66c23bf39c6235e3b18ce547c8e5c0a9db9058f0c9077864c22390bb3a4d7f256e30daf74c01d1e14ee4418abc1e36422056a698f1ef0abc680bb07ac679ead1c8ab10b2363f15cf03fc37d00dbfaacd6fcc1553ce4d4d3593134334bea385c19d9630e7e4ad67ec69ffebf159f1bbbf95c18de26b1a83e8d2ea9d96aa7333b7b0c15c30397e765ef0fd530fa1df8bcc102a626938564ba78fdcc39959d2ed10cfa70c5da25f8c8b4f595a284c1f09e2d87c4622e32a9ab2461e2c3d67a886d75abbf016b219a75fbae23669a98760b6273c610e4bc809424442bed5542a0d3ba95da9a4ad495c0773c76978ecf11aec4141999a6f3fc43c9df766c4ba2910ae373ccd054d590a12b23cf8e0ffffd519dd38c6c393f2629fb9722073d4d51dbc0446b4a14a28a00ee6d6c12e71cd34fb18d4889a32752acb579f7ba2f4bcaec66d31a43a9eb71800937755f82d3a9e24cf8f13d7db7cba09c5738b52585c5f667b639cc2fe966713c1b05a67ac2365de84c40a8947369846e43052b5fbe21536b2c950c50eeba0242c175c3a54c76b9ce7f05ca8c61572b07a67cdc6cf33f339e281f73a4e58e159ec7dc5736c411c9893a4341da05a4804aa895cb824d2efb3654a1f2b732578334fcaf1107161b5cf93700b7c86273cf36a4cd7c0a40ad485a63e3c05da8e4089b7d4d1674370db07f1e10e88ce63e8a8ebf4e16e12bfe78b7b43f44a05b604c3f066af71174d1744bf99ca5eeb36eb6c371badb69b8a98b2af06df1466a9e9cb9c0cdd2e34c4ec30db80d9a6bb5f423c6991272710daa6753172814da94ef18466173590303e8ff69e717cfabab7a79535aab3a6fa5a5f4f3370c4291239178131a95d8c104860e0845907f192607b094cfb7862554b65e4ec15f2647d8d58392ab2243c9fd645d8bc9359d1b2b67f5ad4cc8bc6f9dc6c8cee966e42a0a39f51b1eb1277b95510392590a420ac55ea77323f73ab737c3a74ba1907795849e5a1c41906991d9f5c318b9926430a796c6b8321fd158b96278663c10c6d7bf7d378001ea321006ec2d9b2f38b3d5ded8f6d9d9beda5f03f026f4477222078a670c0dc337e8a2c5eae2af0ba5767d0c0c7b79ea3bf1da6368f5b7b36b97c93886d287cde2352913e4c70673b590ac2870a076c00a883d17dddad55b3cf4bfe8d2e861a604e0d8e1d3982a83e1fc8421c2b1c95436b5657a8e390bc8107961cf2a1f04dd647b36a72ca535cb73d4843f606737abc49da1897aee2b5bf3260be33d60ffd8b221747b376e3c341ef405be7066d069a89a7b5f062051d87f52eacf2062b5e9f3746dcbded4584d948c53c472c791eca62b2e793927b02a605298f0abf05c3edff1613d2ef7144fcef12d2d7933070a4a2b82549903cbab3008e2f7b5524b55510902077dada4665b780d8e9ba1df1bf61489272002dfb51031231dc20c3a7db52d72b0be6017a8b7be6b30dc599b4a991af04156a47ff7cb9ac2b6d5d7bdc3848269431cfb0efad06de5f82df32c91c12c1bc5bed9e0937e5594d650536341638ec5680ec80c5cfe4397d933d5f622da0123213801ca7c14c8f6bda9d371bb8838b49ba96f265735b8ff24d1e260499cc5083372644a838a579e210c19a6af37942d5c9e48f67732a068d35f47e1144182dd0357c9f312f0044507d9305977a4229e2f6507590b9ee73d336938ac2eacc7077f734656a7083d5184372daa5fa57732d235fb3e33be2bfac9d33dbbe1b8e51d817d5fb10c62fa5068e6dcd90efe0e32b38b52e1139a70b293c36c48daa625fbd64868a7e303a3cbdcce42e410791eb8641d27e218858c79e58100b970b6bfdda4a9819ce74527e0ab2a002264b6c5f124e6f6ea14c94218559436149f767e9158402f0980e66a095adee5ec0210f89f4ef88a51db93764f1923769e68a1a55bf6ce901bb1b33a587f64225bfc76332e8d23b2e1b058e6e73bb6b64762c50795e083b6032bb0e1d386036b7c115a4f3666706824156c8923b1c236095757db964a7efa110a33e3cd20e6fbfffaf13f68f51df0e25c121800d79cbf7119a11d435a1497769e367c9c1247cc9d35f46421d0616ce6fbbdb830d3beacda948343285ae1a523e0aac495c5dfd8bff4fd483d857951260edfe5ecdaa90eab89be4a5784f7d3dc8cc028aee73963e2952f9422b44bcd91e61273dc914e9b1a6195ee6ddb5d2681712a07c5a02fdc071214dcd554c3d60a69ac1808111234f5780be9d1445d72ee81fdc1302229e7045ad5393092d5afe0e9d0a620728a32e00b7f097a711677933b010d525977d1d658ca43081c59321c4458b23e95e1feb31be80c5d1abe39b0eec0d7da28e9db767320184348733ee1958fab357f8ee71d1077b9f37337aaa004c9d5f17d5efc877da283494f8b9c5de2bd4bf6dd2945c05d01a78e2e4134228e2d6fff8b4f5abbe384c41b4bc76dab8604e0fd9aff1eb68c1bc5ea7b2afeaa18418eb07e46b36d87dfb21732d12b2830a10c840301e638a7d5c8f4fb33e517c2100c7bf3f85a64c308d515b97d29772fbab2495f7a4f520a1f35351739c58aef2f3917c3aaae3a81d228e4f9ebb60aee6c9c262cb4d1db1ac489ee5f95758b528a71ecfb4b7fe3a03c5accc9e0b06506578e79d5ec9a314d35d7d4d9fe758b1acdc78a02ed5a73d8f83b75b468750b2f99510c71e08cd63327f09bf956e5d33ac89689c9941ca87f149641093bfe352f6703fb9ee5fcd38e13ab0883324b38917094f23a8817c705e049f3e0641c05f3cc6886913f36136725b29db952e1d686240046fac1d471f0d84632e4109745100fa5f4b6d2d19697c620bdf253f0ed06370d4b91e9950cf2e507767b67e65c4a79d1b6f34a2c051d75602f9fa0b32b482d9610aebf4a073df74270914fda19d1879dc1188a6717ebcaeac5050420de1fe448ff68f1b51a667f9442cf16798d5328be704d1951c4b09e9abb11371f71d1b309ffaf47569962031b38c8b1c8275470c34cd90d842a753087fb30d64da475e81934892818c5e35178e9307553d2fd2236fadb3a2460263c4f00da25893d17f29843bb46af47502b60c92046e281ba0a41c6049acd1b9be89141d65750d33707eef842827783700775e6efda94eb333539c5b3acb2f6f741aff5c43c512f4aba26a092cffe4bb19f5cd6876fcf7632c5761e5dbd9b9e248d6ceec8c44c7fefa67c975dc70f3a4b7ed0023c161f48b8f23d926cde23ff85d4f080f44b907cc907ae9286266c840ed699d941d28b3ffd39f3316e59271d8f2ed6b2082e9926472a9d4a5e6b4f5e359e92e11695cef0e8a30d0cef2bd8209744c0851dda194007a5bb4789cab1da7fa0555a458a346d3b7a5145aef42d2edd33f1fd39825df86b2915eb8bfa9228bde96bdf8af932129a50323f133623f7b5a3f7d2db86c7ea13e56031462c79a3c1f0656985a0523b3663e7e6f75caf0f6c08323d65d0437663e075a263a7a30043a18d8136ee03d04d2d86dbfc8ed705ae1e35112412f91d52de4c8390b2ceb8c32785f1cc9f82864f849785c386e42793ffb519b7f54d30e2aa9508a4c1f0f83a766b0f4d1dd9497e0e109bf16f4d31681322e8a3bb30c1b8b839d8038c0759e01777f06bf9709b722910a319c97c1a6511e2d868704582e00e3d7379e81b8cd04c279eb322c713ab5e796bd900da3593f9bdf10933c93985768a200732c9c6fdc5e643997498cb8f631c67e55c7cf1be1f4901b9dde2f5fa92fee2228616040053bf7355d8031377365f1404c7fcf0565c9c2c8e8c8e91e83b3e90576e325858468b774d5e00fcc2714de35c66f8adbdeaed8d316ea7baf73865f5beef0f87dec3ec2ff15955a0d139cc98e20dcf1aa95f7b866f47ec2bdb1293b9bcdb9a6cd98307dae04d3434209a634a6c17259d0599619ae22138a85edd8aa5ffc662a96e92cd12561dc6fb56c1b4018ad7be95026119557105ea2c5cf0c629ce6a5cb5fedaeedf8431358b0f5014fad2e7441ea57c9d48c090e1982dc6eec2e1df451d9ef19128cd32bc841fd39944aac719fd165401b5ae96676f21c0a9a84307f2470b0534aa1255d91e24581115280a9476c8e6a082f7dbcddee40601ef99438b3a2721f52313683d783f3722678ba6877e0e76ac2326766a894d922700b78131d68f97a949eee3aa41635d5e1fc5a382a25339049b317c474c3e7df296492ac9ce7c2ce8a75ea20ca5a76fcf19af1e8249bf1285ed29caa2a39323e28d0a5fd4239fc5b8253ee8b0f4cddf2142e99a80cbaf603bf23d7c203cf0d905edb8eaf152ee037e357bea238fa477b0b7bba14c10c1a0cb5860c8fb05759298930c80f5555283210eff7572f2e8e8afa05178c25bc1e273864688fded858b0290634fb42eb0cce03a05d976f8ac57de43099b161a4d8d6931daa8f4192ff783df147ff4dc3266cde6294077318979163cc1e97f1ed990e682c7fc3d80386c514f3f58dfcf5c89af9a99c01b18aeb0744000378d01f9d7c197f80cfdbb43a279db859212cab067379bc62acd49790c6db5aacb7ee6465459adecfb26628d286ba52583e49fa0642558248801d9df6842fdc1742e2bc67724d8db718fc115ec607a84a0aebb1bcca475bdbd0818a5d73a0b9a25018e2e196b528d4767ad7a3b2a274c821ea39ffda3c768de7852425615dda5e18e0defbfafcea4522ac4aab7a452899888587868fc1d78c4e2eb14e6350d01fc3aaa067f8b84eeb4bc1131617828523e7a0b602cfe6bc710dcedeadd4728eccf383e1de56f0e715c3c8e7f676e08842b034422857b97f6b1ab91e1dd33553009cd9a5e5df06b6ad57e50de6e74f2b213b8789bc4c6afc94f68f575b2296438fe04e19cd387e7cc2f77739729c14f4382e754b0e4dae4aeaf743af8b11d1c4f2922ff91fd35e69fcf6c5fdb12bf1c7a5c8fc84ca456495eb0fcbba92c9f9201225d554f8cb2a87b59b3d29a8633c27aadcc693e2419f293504a00aa8fe4b12acafcde3a1e1baf944f3de7b4eabbda1a8c5fb4e68bf73d73da21df9bb676586a8a8395bfccd037419995cc3c790d515952c7bbe06670e6705a747fac315c2465aa98bd5e23f956d2e4684f305db981e6241be765b2e854b3910eb949410ddc9657623a5c58afbfb4ad0d9af22561f57bfed534d69532d2e45d042ee4354449c77096e0d5d513780cbb961004ec73eef010f4e14c0936f47f8a3ef55f80e8e2720ab8442c57941b1ecda033c5322554a4141f5f6ef8fcd09f32055a3e25e485c51f92a8db49c4b3588982d4c082d8ae01f7349b07dfea98f23b7676f7b2d3feb95f435f930ef5661f281e499