安全研究
CVE-2025-29927 Next.js 认证绕过:x-middleware-subrequest 头部递归深度的绕过
Thinking
2025-03-22
3 分钟阅读
研究档案
#漏洞分析#代码审计#Web安全
Next.js 用 x-middleware-subrequest 头部 + 递归深度(MAX_RECURSION_DEPTH=5)来判断『当前请求是不是合法的子请求』——攻击者只要在头部塞入 5 次重复的 middleware 路径,就能让 Next.js 误判为内部递归调用,从而完全跳过中间件的认证、授权、CSP 检查。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9227687c683286f0cc05eab1af2ad120a3ddf3041cdd47e02c8eab437610b454da58032ca72b2dec700df4558e6845cc733e9cd368e4ae4b0411b87a52a7770ec64a691feca012b126b42261c857c5685af8d8ed4fcc3689145d7eb1187571acfa715fc5a6ee36a24b0ac13640261359a093b833693d9d89bd62314c2ebc82736eca6e71905d13a9da0d077eb7d8fc6d9ac6ba46a4d2c10de8f333eb746c59df619d2f97f67b9518efb75bde0fda499ffddd131681f4e27a3bab5ad2018aca39f261e7bb57d90b35ce74d6fb89f0fe4fae08958a2588ea7df7f0ae742f9fa3e5326fcfc141ed07d4fac239a3cb124b97406a7af37b92fee03314823733d286a7b3c112998cb808996c0ff064ca3ead605dbe1786c2fb4d027fd60fbd1e13359707ef3e03a0eccc7df02c02d09abe793184053749b9522c4b0e33670bee74c5afba2df442e932c4c02a2ffb69676076f24603ed9cd2ff1c075a4332023b0fcb285b8ec4c4b2233d24fae6eccab430286c36cf52680caa0c85a7c80db12387ec6be8c8a000f1e022b7e40846cfa1e87d4d112c76373c4abd7526f7e4534218ee9b738e8ca780865c95dff262ed4434cb6bdce44d7870527ffd7171d27381fb08cee5f95ba39cdb742d39900994fad4c422826c766cea6915d735e24b0637e77a0a6f92fa6c173978cd30e80d5e1f67a5dc977b9b7d9ac87fc96a894d1393d72f03102ceec5debcd273dbdc39624e17e0dad71b32bf8f5f89bca082a1b7150af2730bcd89fb37cfb9ee85be24f6d25d7937dc3f861d9124f9d33d1c4da5a0a0d1405c04e602e561cbabaf58a0244291c75f42426220c0af4e024565bb7077bcddd637042be28e6baa1911bdd748e87bcb8b95fad35a35e3ba2304cd77dca16c4cbdad8515c135a2ce40ef7de8722d885c845eb9d086a0f239a43443232ea96d5440478511b8c5c052e501c2b53b7162075cd9ae89e0580be4b04ca1acec72f1fc49bd9408dfbac2f12eb0a4be1656073ec274d8d64aad6b6e6aee35b4ad2fcc17c62fff75962c89f9f58760ac54b092096e3e773b1b6b911b841bd073e3b5c6ecea932675c972b170993e9494fb2dec94d6b73a59923353571b0e407c08875a2d48496a8de2d4780f94b45d7eac59e001bd6a71c35282b53b3999c72239acca437050aca6307ddaff3c3e7cc065136316b1e2223b408b9b15f14bf9bb538cc1fb1592d5c8cd39145d0f282eff8064076eefeb008c98e7a5f1adcabc2ac6f866fabceedd4abc0b20a0e3959d667aa6f20640c1f94dde7155b15d5508f461582eb2d914b06584d19baea88723addb1a27e3b4c7de0c9d0197a20ea2c2fb5449d0290245591112f112db6b54a28e58baf387ae284beb09e0986621ef0149fcb6bc1986f53c3a08deaf3c77c95d5617893487bbfe22b0be5bcb35dac75e97373e2fc1f65962a382f937b5b2db057389c842874d02d761d7255e69d7e0dd96e842769b9c03d52befc59b628b5d0b4a33bc0c5f17b060d203ec6cf78bbfbcc7d526d390947df5581cc1bf131beeea26df68712eec1e025cce759e7bf07f838aea503dc5c88546ac4c7b44ac9f8e64f19caca75a7f5a1fd894eac5b3d9fe430b429f9cf9cc690945e8ea86420b2c95fe06cbe6d08d16faa32fb6ce1f1d2c9931f77586b062a7eb4243fab48f775c564ccf5257e26f5de4c3088eee3fbb86cadc2a577429c1236b5906e23252d782815470c54d224513de15be2f12f95f3350933d939c15dd9f16ad74fc4a228872656ea34d0928cb7511e18da76a9dc89fee08a888da0072b62b0ccc5f93765fae9af462f6d362d57be783e08ba0ab4ad0b10489c318805262ddb4259bc9201110c7aa4ff42e55f555f7317fd5c09d0248dc062552351684f862d57f121c6f5a817c503c8df0e7c68dd75662551096b95074ed9eb9f2b115a6f5110ae5db26ce1dc435a83b5288a9d67e66c2d15a295c5aa3fd0d38e0c696296b4f65402cea3b6a4b2920307e7615237dccd9cae44cff188cf0fde913b3781ae69f7270420ac17cbb48a163a3a65b9f8d530f48a5f73b5c8d1c2a1ec6ba8f3fb29c351d16232a9506b18018c9a56b1667be18cce96e308eebf85b948fc1575ae05202b9e043477a7595bc6d3f3cc1432d2aa8eefa3ab8509ab71c488e6fb93219c60a48af3e615f5717c78dd5a3adbc25a5f7177618902a16f15aef42727bd8980a24a0173ca5c933f2780eb86e9632a8eed3e46b0a07cb1bc79c92b715f714aef47b7b473b542d22fe5a6ee6ff2348eb96d5766684ec09a633ccaa9ea2e951d4ef2ff40594d01e38fe076d7190a1229eb717f778f48958ce7a1a43c463ea9dc8be3bfadd9636934270dbf72d635956ddeda910450e84ff7e9f0db3dacc8277f10dd9583f020b8d183d4fa44983de895827ef8dbe7d57ebb60e6afea7e26388526fb86ec08c7efc0b312629ab44cabc47fead7a1486d232734ddc27ce344f215e46876a1268d1952c1c6e0c342ce6f746b8b5971c3ad4c2b672b55f0e53ccfc25d29a80417e10595587bd1614a43a1eb8e6b1f275188013192bd5e35d912649bdc3e48e57694d8787b32a7900e004a663121914cfbb8c081828b195adb1f8847be3bbd8238ea2f2af140521e2a6de2cd2328e2e3661f67776727957271beb76975e2e0a63a41196f2ca1eb088247768601bdb519f1495d355b07ab402dacb15f8ef15ad50b7e0786022509b87b16fd8e859af31012b31350ea5e46d4d49b3b74f89690a7479c5eb3eeb177a5c42198bea27685ef55fcc969949904ef5d4d8025b25de04e9a1065940c9db934ae0a5cab1082a7678a2c40ebc70ee9a2692e00e51f9f47d105f847b428954540c3a83de3b9a6576834d0607b9e7b59d3d02c87e86e9aa1663868c9bdc9697f1cff0ffcff2c51c6dc421d3d0a5516e9f1e4fd501158038e0d33f73bd612944f68bec2bada2a71e0a164cf03280f5073574d0f120cebfa9906e45ddf240db845b7268c3dc3788a31f7e6cfbf2222745c1ba5082940d3a4db4f39c0943edb23c8d49216f023d2625ac7bb68058b8ace217e81198277601644e0b9fb98f0633430bef7568ac130469649b40e39afd6379a6ad843fcd6af801952d7d6523c222e0dc0f94ad7d10f6bcbc73ab7abd8e61d1d3089340a7055edcf92ff03ea860d613eb0f6267d9d26945cb58fddd579e7703f5e6f448eb3262e923c627424db5440d2d48719923be965e36674fab22ac499cc0b44ca8372385903e8fe84db3d9c0568aeec3400ea1890dcb060e8c9af81b0f4f2fba1d908d5c37335d7fb317d1a4f42222b6cf55776757b64a47d37b7addc464bcbc1f0b819bbe79902eaa5efb0a83c5e76638b7a8516e1abec096a1e31f73bb4863741dcfe104816a9f41be52e0e3246b03a9bb919d63aa375ae55a5cc11b4a221562c08ae9ad540dc074b0de900c554c39c2d33567ab65555ed53af42358a9731987e793360affa41fbc01442514380bda47a95fc84860c2501197c0ddf28de4004987a2f9b11b7c45ceb8ac24b01bf3414d54b45ca0698a8dcfcdbfddf6e1ac37121e027b1fbfa477e05f8b46b43feb8cb8c3a36329ac0cbb73749353af94155053c71f766902f9094b08d492d2630a5a539663061ca0b5261274bf87cf2f2a4ceb98ff226cc4bfda192513a1f98a488dd89e92b40315b3a34913f8eaae765d6bd3c58ab6d8c3743e6e37bde67930a6878006011a9aca9702f9f48223f58c58c3a54a4d234678e8fd4588d04ca8bb6a671d2359a4981f2060d339fd3c1e5f184d66dfa1e934c80343ac1109a057e4513699eea4ac84df2e1131d0e17af188a503426c6ac5336d4e09a5292f3c065e486f9a79705a3305303f00b0368df349a4b4ee0ce55be749a2d6841ba7984df451ac1dd5a227bcf0314e2c8c680ad82afbf154146a0e3af5cd25a9da0d4d00bfd1d0b1c1c5cfb147d844a350cec974828153ade383b43392d0ab9780134b6b413c72b7ecf92b0388c1e92884318ab8ef0b95246cedc6f3e3d9c6f56b7f138ace24dce9ecd61d770560b76fe86a6dbaa9f5c4f7bdd4b5b2addc41f8bd6e61d89d4d70bf66434c2e7b1e0d4bcabb3ae1ea48f8875f92cd92979ff5c42d383aafb3778cf90e598014c5daa32cbf154b632a3e0bc5fb29934957681c4f5599b7478812db653d4e3c8a5b8d49df9cfbcc0186f77f61d40391c41269c4a65490d8cce0384c0b63a5f26ffcb4a5c9a7cb565eb4144dcdf6301d0f8b4226b066f4d663bb245dea5182a924ad003593440866be170feb6e4d33c660a47ce7ce00e86e0cf298919a40d3b064b87f8723e49aac85c486b2795f33d0f79802705a58bdd2ecfbf441aba185ec28a550057d0481f7bcd6cdda1f2d5d6e1bc5bd655acd628ab3d373012abd243796f29ad266ee8fb297428978707b127a6aeba8bf97eee1e14702e5c2d6bbb35002d4d1baf4eb8cd40313741297725e915ad5c7a9a3848a3e1dfc66c012ec5f53ab88a5c5c21175bfc3ad1333f449b7fd8bfd829f99f47493302a0dd85c045e6a45eca653507b3953a180923fe593e43bc49c1a14d5dcf70c746c4752be3596e5de5321c99e8d6b77ba3f6c9a425762fc27c6a9a37124e8cae7e3a89e671c60b52058f385771e1d663babbce3397dc9dc8acfc7fa5afde9ebfa56c2706901717245a7f380760b6ab2548c14bd883b27c72dd572df9516be126fa8a63869290e7b08ad38ff6d0207e52caf315d4af1ad487f1c0b5721b50a35a6a9945237a4abeaa927b50cc5cfe5a82bbb9935f01507935a0857992302b8268cc827bfab9d0305bb19e8223ede0791dc188f9338bb1a7be0b24466a65e4923b1130edc0cbb473b13f63499aca5aa3a7979dca6d14dcb273617c09b119de04429c73ce61a27952b904a59df4f0bf45549a8b38ab3f44e28140c39b9242535a9038caca2dda2dd3c0de55cb9d6a4888a0b545938e0cc7b2551e30254f7287439036215aa04843a3d771cc787e87846df30869e1b703f59f34b158ed3fcda6c76d49fa7e198bb257bc3ce5b584aa88545e82af23baea1740c53bdbe8de2e0b888c7b6b22c7b5844841f3f999d8bdbc30672c2b4cfa8ffb93f22090965d4a289baee19c0a523bc35f00a23f3ba9e71b5db374203fb3905412a9c39d7819645d76636738f4696c05d64097498eb2ebbef41b3f8962cd822fdb2c5cc049bf63ad14622f84f36bd46502225d53ad8f5f432df1f6a13925900f650b736f0e72230a37e019dcf953924a6798f70709331a55df68af9f5c996650bd93cfefcbb9cfb0c71970afe19edaf30100075fdd59eee3a77942e164e76afd86b15edd52282ec9827e07c7d7c54738091a75a582492919b1d47737f2f0c321405987b1fbae9bd5ba85fce93231485bdab1833641c4c132827d5c090b78a4d69f33cae5f9b15a353b008d20f3d53cc2c0480a9091ffb21971529e7659334c441634f72acfab0591e32ed747036b962475d63ddcfa72ff0d7417100d99959928112b118b818c7c2d8fed64fff8b1f26a7697af93bc628a3eb7903a621d890e2064d6d7dea835ab0d2ef9ffbda197118c0124cfd9f99b7c70bd2e17fb4c74de388cfbbacf4e29ffcd0b3603d282327311b5e2c2a5531aa765eb198a54d77897524d8e87aaa09bcfb008e64ee0459c3bc1b00c1c122b259d41c249bfe6dfcffc6972e632e216fa8209b2f5ba8284c934bd5354a58ceda5fffd32b2d4674275c40e01e9543e6301bb7ef3dacac68041683702999218643f9f3d38726afe77fe15c19b5ba641bcf6659416d71c23936b33671b660ea81481910dafd2fdb0dcc0752242b827647a932ef720a247141f9a6c910f79adc8e8874255d9abd50fcddd047708f29760a3867fd9a7d0d43a823ea66696f87f08c8b7046d6618cd5cd7d4d4017003ea4fc57eb1b595a8adc430951a7b083ca2f082bdc75132b1735ab37d1af87cd3d18605ef1577336555e0399793aaa184636bbc5495ee78aa4a19208ea16ecd85e6a8d4a892e772bfc504132d3f38ce7acd9fd0f6b193b312461706801ca316250876066c784da9c7f56e76d565ba466f3138063ee6512c9708afb83b0be7b7f1cad52ea41a40cb7f8c1b9782ba1c2ff38b9c597403884a79081cc962a5c32660abdc110dfb0954ccbcff998ec4129afcb730daf8362e02cefed4ddfb2e122bea724c07a27df0b1ede879f871462933cfcbe8929fb2cca8748e42cd0ba8e9441dc033214f5ae479d6e7260f6898ca6e8ca769004191eaf88ec46d10c9bee68356d127ebdd16e2789bd63f93839f65c04e992be8e13079fd23f3758b10bd7f3a1f1de6e7a0c5f181922edd9aae1d9f6ee4c4a0073c535ccb2cfe2b86c42ed6b8f203ed2d10de4b9d6fcb3e1a3567d3595a01f4424cb3892b63ae2030bac70a274350cdc015a4985e55cf39fcbfe806370172479b4e15aed9dd4d84e822521fd6074de100bef7126c38171571f786dd50285d19bcb7f351032b411c61739ca1a9158a59222e5ddf7286c7acc366c68c6949d09e4c44b47fad79ed37600294dfb2f0d76ab8d660d0acb8f647329d4893736de55b2c3e77a46215daa1a09a021e5da56220064fc2df3d020f91120233c7155c4055b4c3e43b18569972e97575d00938e0ea32b503f3b47e65e396cf6e00aa6442d8ff97abb8d96512c31ed7c2de17f0ef57efcc68b3f24db4606e14c44c3014fa063530e507548da64f4e4e2c863ac56c9a4ce7430107dc7dba034100e5910ebaa70abef9f97e570e2d964db90244ad96709042e30067bc9db64da245e572e9b49df0541deef5ac908f696e027c5a381750033dd9ebea5189f7766946ad452a05af0fa8ebc6ff1b5f52dd69514eb4af4faa8a53a56cffc9d94a0ad27f4e1b3e7addb3b3dc671010a09287238362ff7097eff2378a839f072455c6bfc3ecb0d6196a24a2f771b901e2207a504daca4fc2e9b9e7d0f53bed6dbfdf3f298eba0f6327819db8a2804e41d0fb6450aa1eaa60298a4f8f58a88afc4cb9e23eebe6d3c7886a15aff06a6c58b6fcc1ea9dc7c2cd75919f21f85930b5eea2b8f09acd69e022699f91cbacac3fe17f0f36de809e442da3c717e86a33c201f830d6c3246104a8f3d7a46570a578302e2ce368006c8abf573a65810d716ed0a2c318f5ee82abbd208c2557f48d16371e49c93749a1bcafbe44fea0e45e9105aa280b826217cb814ffa68492b416b75afe31a46700ed7eed6bda64f8e87d6d98f1bef60e305c039b52f69635bf0da3ef265ac777e145557193fcdac3b0b893eb35544799908230a8bb5335ceee8543f0ed67bf91c64079068448b08eb8ab0061cf2f19f6daa9e55793d31e48df94873a971999c6bbb3c87f636bfe7d609b863a3948e6a1d18bd6ab1196019a0e592565e9e7c7867d3c4a99b32465d48a10d5637192330ff61a1c138d120a89e1ca48b8cb61e57af139095b248d11735af79a2dce3be0d8c9bd07270ee6bdfd3172b49823aafea8876d9839183ae684b60c47155719dd21594e80dadc0ec5d9ec1bb49923c87869ac2de48fa9b3e4b95af8fd36eef8dda9749d8d7a2eeb8aa2ea475072370ec3af1951d445a469fcf3873ecc896199df75410d236b4cb2d63d36d9f6a944913c40b59de2ed92b08d6094ea6bca378912f4e633e16d3c4a04e492a03ed1dd68d2534b562fb8e569acccc758c9bb212ea1366d00f16e72c1a7b9370763626d2b3d0ed5babfbf96c6ac9cfd2dbbed257d9819424c6dbc4d2df545aea3b3d08967d2525d78ebfcb4adf375dd52f06d41cccd153e0e307aa64c6cda4a1939cc693eaa4e5514348190f03cd192ce940f702935116abc9c6a50b2a120ac7a86117921ce1757f52fec7ccf32f627e20aa0b7353527a315939dfa9665db464ae6a38d491902eb6a03f60fc68a7ad11ca7535fcb83dcbe31bd27ac7f8e408733460810643412b7f0e9185be4ea422c65098f0c3b0784f069940298612e458ec886f5c90d02197dd33b85cab73c38626be4b0f3f045eb006c35226df04dbc4a712aed4854e054bc842671fd1b7e8caf854ee17dd8e8d8de47df10573e543ea0c3142257fe030dcfa06fc30a92127eaa67dc7840cf5d772b067e3a6c39e697b86550536423bc7fa0f843b9a007d28fbdbc38be30ef7ca5a2546ad73db9405d2e02b0782953f63a76a96e03bdb0e3c49443f8de667a39be0521a99b490bf03cc162ae8e1f9a7aecc2f0641622fd093d084b162ac436ba902d30c37ddfe3808848fbbc96f6f2d252dd5dc128ed1ad9e808f22c8d4279f9ae2d486ab448cde628ac9e88306aecf36f4f1015ad71ddd5a801dd536b656eed7ddc3660563f78a7020bd03823823d5751d64beaabc7b409d5ae67c8930d08db0b5f2d8ebdb1259285949d2617a5a6f67f7efa0a8957e4233a75cade62f54b0d03f45409a6200efa292fb21e16ae32af8aa718aafae5f93d0c89b65c96153895473e8b7186331d694c57838f954ae73a0d0e6fcaffe83c41012b52d9913b0fb7d2bf3d3cbdef3b9dc352531d83d6d96ff9737cbba83d2c2d856bf93cbbb8336f0250ead6952c456bb59878410233afb5ccade3759b92679bdbd9c11d3efa926905a7bebe67fb294e34571badfd93eea58962888a1cfe5bca08fdfc0f5c554f6ca12cfbb8c760029531b8e3d007c5bd3488edbe136df2f0d6b5b13d4e2b220784b888626738a7a9f184bcefff309b394c5faaf0f26fb340ff593f512fa0f0c49748e642b6e6c2db2bc1502d1f86ac7b295c9572a7d63769a6e9cc8a6dd9f7cef886c457fe9a98a1c414b50e68ccc3e9fbbcbe2f3a93fa397c95320e86be4078146f1bedd0befb54f5ad8d16a678cd2f6d0d28c46ab4d6f78e4a8474df27bfe78c37c147169f504d27834c11255103190e017a2da4edab71b225e8f9f443f5e2c6c083dfa76a1d89ffd3b3c9c1e37c32a2b6da52233754b0f646fd5315ad9487cb593f7b693d4e03c8a5cdd69701d224892c36e8a3638b62039ff69dc68c4627cfef427f45aa5fe8c12f71424f0385a2f762b5b95ff37fe245b8a97330eacb67b22d7a0e5c4b0da9de8bd304d0493a1979aa4bbebfab1c5f407fc27675a1bd59b84b5a878c6662946bf3bb2393fb3d1a27ea998950ce87d2c70495d2a0bfbfff3e15f336517b18ba2c61f0c4905b3af232a1ec7038e4ee09ae2d6a21aa90138f28da87aec267303591118fa62b50620964a49239ff3100d09d40fda20cf3987aa336789d382ef3238dc5629a5c0e1d0421f28e0193bac63b5ad5e813e05bf7f72e681ba74dcaed50cd30c4d1287625afc63427ab19b22435c1827e207c45d7bc02557db1494ac587927028d6d09d05b03ff09ded7f4253a8d205d652a8a8cec156c094343cc77ccadb5d4d915a60d7e7a32d501139647b6b66c53857f2a3be2507249db0e84d89f47e99905d3523c52f4c14a0a7c07d15d868465b77f285fd58c25968c43c41ff096e6c1f2bd8c07d7d4dc1ca3eb94db256c5f069aa67dba0f9d0517851e225ac33b7b7c458d0be8588b7b50ac34d0ff7a9851ffb12e4d20a70d86115244d22badfbca56e31631995b0742e679942a84e83836a0522c822248ee0cc3939f3baa1a69a2482a7a6f647eab97f2caa3d4f6d9e5beb7da9448de1996b55a7844655e2bea9c90b9827594a5dad6fb205e9a957cfeeda24b5c7d454903a744cb65a4e48fbbf77585c166801a5d89ec3f9ad04224a90284c9f52f10059b1fc5633f977c72c9ef8e28a28b29b783ad4774b3c0f08faa5909ce4764fc346d22c34e3e5b3bcc9fbd777e81e9150d87f318a603f51e3dd78c78516b9de9b53731c7559d376fa967ac782f6da64f5e0fda2b3a5edd46cd70e56db810ce2bf3a913034bce2703a2c0e2944f146e3a668aa2f6be626939d6328bb4290971cd1c58896aecc920d1bb064086ea8457bd7d0b947ef9bda1d22c15ceee7f8943fd5cc174cef4bc607166454c707214b7dc58ee61c299d41855b6975d407ca00abb731d8b96af3bcbe65e2a8a61bd155df5c2f007975eab437a13395254ea2cab73e9c2d45900ec0a12e093743cdefa2bcbd1c6a984800a945369c978216c48cd386e95e89934c91a1b4abfdd51df21d544b27e1c85ee94cec5df743ddaabdc5a4649c3352e8e61897bceb5f5ac4c5d640d65bd4304afc08c196dfd62ff6f15ea9bf1b56b6d25542136072f06a78ea830db68fc20c3f294335db28c3a38f509b2f00f355348c60e3a249c498e0e4f08b3e514627d540bbf82f155c68c03c1922b13e84e9f2a71c915d859024c2405dc2b95aa6d00835be5d1579087822162ba205bda695d092fa2f2fd124496935aa063c0dca5332348d01ab4dc27711bf90d637b5d7bb757212a5b1011c391ec18057b53a2754ab2eb06cbf798ed438e4724782929ddb18267821d525f4240b0d176f886721dd666d5518046b4cb30a6f2463eff4503004595ef836c3143b266d0d90b03fd9efdf870536e3d9a5173b42b8e5f3e4dd7d16b40a743713b51c1c841fb4339a1e15970af03fc86bb418627e3e13f79d10ace5c38e3c1609640f4a71e6f37625d7c6f9d7dcbe344420b7928659200f8f26f3d04cc2377482e9e016efe61f57d437e304f4bcb883713785f3a4e095b6d99e862db320e16bbcd79da162bd038276ff2f70eef4441467468c46d5ef1e15240c2efd39e28d7b04f126e69e0416fef911932cc5f4325233d9ac0801edf26139caa580f60fbd91789983f2f3cab999c8ffafdc32d3a7bd85d23228fc362a8cf6e25ec9ac7270bccba2a9613025edde5d102dbd54b3eb14d3d0163543c272069a9e1533d721ef1f3980ddff639c5ec365d9b9ad62b96555edac5a2bafdbfbfe83c40ae37f24cb496f2e065bc2c9fa0e78b8cef8d16b9780d935767fae5c2935a7f6192cc1dd7983635d0a121631ec6f463e21c589c4610fe158cfa1b7048bf2bf3616daebeec648cd55356cc6ca0c02211c888ddc45faf0f8bcfc75345c975a4d272dbb96c0ccb1340e1d50c1241af6c81ce46dd53d86b7d91091fa2c9d7b81b6a354ca5c20274970fc2500afbabdec5772627aa01d8e0ff8335c200c7ffb00417eb719ba17de28cffe3f49dd8085c1b0ef8d0e8f5234a208421cf6d7d741d874a035dd13d1a40fe4af68d60bbe76e9776bea461b930e4d8cbd82249b7274c2bfe48911e43928a43203f0ec56c294c8ba52055fcff9b1b2b4634c5caaaff0246fb01d6383d3d40e251a28ad3b7ccb776cfdb2e59a02fa0ae66961cd67fb2c6f2d04a2890e0bc9130c6ad27ee9f249b39962117cb1d00f76c9453696e5039ab7572f07f4244fa35530628a23dc4ab7dfb53cd15f7a684591f365073ec69f038c613a885561146236c0440cf2b3cf474cba0726b50d9b22833e642fb7a01927293f82dc80ecb40dd86f81bf5fef6a11872d609e0e2471ad7da62167d33e18729eaf008b683e45db5bffe0498bfbbbd45d168d90a26f6a16c0d80f0d3421f8b99b56421bc23cad33e18471f475a5b4536d727cfcc708135835ed916a764205d1af828148b7f1a3c822419a0f727f9ee50608dcc2e09f86c3916d504d104e85687a4f1e6b108619e6cf8beb762d2148c247efb5f605a6b2353ee849dc1dc696bb817088ae90b08a04203beddc5fcc4518791ff953a784de6358f6e6a427fd7e304a9d3674fc0024998a7d6be4c923ae8558544c592929af031062debb70fc5ca5ab04b40c30d18be702c3941d4b10fcf9bd5deb0dc774708bf29b5f24d074a35a67058a20c7b3e9f13071a13cc4612c3ce65824801f1f98d919c0cf0a97c59d294093efcda12b83e9657b32b28de9053e8a5e96080cc502b11c81703c9fc93ddb288fa5c69f6a798f8295e583f7282ff59196b186f5f1d13146adeb90bec5e711e86275e9399ce169fbb322ffa992d264ac88589018265fb6ced6276520f398de5e34b97fa6dade963d4b417436f162057a34956e752bd057a469c6dde1a6ea0e3bd72071696461cd6e80ed29f35c0a0b0653fc59da976efe3f34608d5dfc3d0f46fca72043777796ac3568d2550477abfa442c78e6c866525c0b3c2523d672e6546f45e119c4a135207e696b9ee983655ddad9e452fa8b75e37170d86114a0d76ccc5299535e6a95bb06d5457654d5f41b42f35d1b7d07aa4d3e42d31f6a582b1a675bd5c42fffec39e18c3f3e13afbef8719f9c64c9e8c9ebb17319dfb0edca77e097e81096bfada0f724157a2749cc72f6c397f7fcecbba2c8995e6bfed319d59610a0df3351947b0d53e99c614e849dcc25fc76f52fba08201c99ad1e466426fec92745c2cfe4b8b180aaf3ce3ad53b98c058edae568709abe9831922e37a179882c6131d15cc7ad55c1b9507d0cd4fdc79cbd15f085e51a363bcd24638ecdb76509431e80a96ff687e537d9f8ae6070bc9a66b58b013ec6b0a461e8e1fd129a6b2f2e26b6e574d55c36ec5f843905ad85fb5b31fe854d6b5c729e716b8f0d66ac6165c60e508e2d02442ea193265c11a2df9c915fe61ce8aebba8d8feb12bc8214adc59eeb3fa9c0e3378cea3654191e4d25d14a7911c2b930ad7e4bfd1ecf6f07e908aeaccf438f37cfc38df3ca01b840ae3bd74efac52b5320ef17bf0274ec1eb39c8e50672ef43140040b2616d28d35e58120cadf5e206e053971e4df33c73cac85dc44821302d6c679d564d03cdad20e7a1a1e4c91778ff81113ae7ff0bc5a866ce8d4c719ad6d2fb8edb35897c7d059453bd1ef560e3073836d500b76aec49c7b348f8e4eb2e4ed7ba70f97ac7d3825cd57aa28e8c119c7094badd1587c9505d21ed117c54ef05330e6afc0d24abee632f4806755b6bfeafc5eff4a9f2d08068b95d54840c1463376a6b4f01d