django 实现指定文件合并成压缩文件下载

需求是在一列学生列表中选择指定的学生,然后下载他们上传的报告文档。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAClCAIAAABDS2RsAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu2dB1xTVxfA38sOgbD3FBBFNg5AEUFwL6yzarVata5aq7a1duinbW1rrXtP3FqruEFluBBRUBERFJBN2COBrDe+lwGEEEYwTu779VeTO84953/vO+/cER6M4zgELkAAEAAEAAE1CZDULA+KAwKAACAACEgIAO8JxgEgAAgAAh0hALxnR6iBOoAAIAAIAO8JxgAgAAgAAh0hQFGqVExcHA6Coh0RBuq0gwCFQrG2ttbX129H2baLgP5qm9GHUEKzo+JDsPhj0FHZexYVFRkYGNCo1I/BuPfSBoFAkJ+XpynvCfrrvexktZXS7KhQu3lQoUMElGfuGIYB19khku2txGAwxAjS3tJtlQP91RahDyNfs6Piw7D5w9dS2Xt++BYBCwABQAAQeBsEgPd8G5RBG4AAIPDxEQDe8+PrU2ARIAAIvA0CwHu+DcqgDUAAEPj4CADv2cE+xVFxLTjW1UF4oBog8DEQUMt7Yny+uKZO1Pp/XCGm6u+OiGK2nBpyqUokhya+ueu/kZdK71+9s+IeV9ycJMJPSq2skQjC8u4/XHG9ok5apjY3fWtUQZ7qLWu8PCPrYqZAkikq+3nlf9+9VF1OsTXuy8dLT2Zm1xcUlWb9uj/pFk+VBU2UxDIjI3zXPkqpt6e5Be9BykfXX/z86UvObyrA1GGLJJ299sWVCj4ECfMfhSyPvUV8aueFCpIe5ue0PYggYfaDoJX3k4jBgCO5OTWS4SMs/vb7s7+8QiBMlJHL5amlcjvVA8XeNQHl856t6cPnLPk+5mabAVeXfneX2RnCMknIw5PXvksR4RBeW4nUZEYNjifDENk1NGAchPEEsEUX5PrRBL8eA8foyivIqokr87btfyQYNTwsUMfIBI87kXi1d8g4rcr9hxOPm/WbFKRKTbTu2tmEI27DhjowVGWrSsOF96PSY9A+8yu52VKHidcimU+fx5tZWvbWIhPfYZilp23ccPgVrd657tLmogZRqeO/SW2UC+uvXDV0urFaDyRVWmkq7ePrr0Yy4ju7/pv9tOlYZNge+t3fl94EH1qdt/12NWMmixgT6j7pUF7x3pN384uHnxmh11Rqiz0kLstYsuFZt/mjfrOXlxGXZy79O73ft6O+t5YMKHB9TATU8Z5M823/TG58iOKiyC3nd/YY+u8gnSZn62ESvdETkl2G+u8ZQHgmcfzR63utfHYF6lAgmKnHyHsKY2LI2M1zyQCOmaLDwdESTk2p2GD6UNs4Uu3zXDEZMp8+mK1XXnrhUtyeWpufArRL8yt5erpd2CRFjysueXWsSG/KrKbKtNpXSHn27lTq6PnMk1svHCtXKHrlxogrsq+MUYvHrO9WTwnHUYTsNXXoRmeakmCMm7NgQ1Y7wpRWFdJs5kfUXzjCT8uu4QmqqlCkILfkoYjKxcnmAwKPDtGVjT1BbtLUUzQtpScXLrwTnnRXJIJ2n3GuZzt3+bFGzNq2B//n79fwtCVayanhNg5x+rDe2t9F3t9v7dGbqTCmmWxXK6Z8BGBISTm/skKEYFhRKddY2/Y739SZp57PWG4qbQV7df9FlrHjRgvgOjU7uN8Laep4TwimUhQGAU6iwjCJQqZTyC3+MglFBSQqW4swFdYmw2QqRUeLJiksEtbisLCWX8w3GhJkS/hWMU6jysYnWnNox5VDAqaRpFxhRAOlO5JPBnDJjkMl/Gq+4ciRF4fJ7xxJBi6Kv5aWIRL+uurErw1VNp260PAZZk1eOnK1vYK9uCgxMuUpzXSZvZnvmqk/N5Rs4wP66HjEkObYcFSI6I1uo+5bzv54+gutKdxy9MkzIVKCiV+di3tgaDmBiVPoDCNdJpnPLxeTSbxaPtvEpKmP4r5I+vEBZdq8kTPMJRmiomczD3C//ta3T/2zDyZTjBWiSrS2ZNuRxGSilRoxxGSaSIuZaCMnT8adhPDqaoGQTDfRJjHtvI/MtjORemq8ruD73+/ck4a1y37PNewdfHVEj+73X1zmGEuShBXH4kT9xzl2Ac5TguNju5q7AU1aKCpJm/nHk7SGkCwzKjhGUf6tIY8kXyn6Dod/8fVuiOfIzNB5o393aEk3YtYW/ntTNfl5qb89Zn2zdMhw2QqAuPyfTQnCCYN+sGsQQtLRayJQWJC2Jk4AMWHiLkArM6asuv+k2aKEw4gR54brNY0zKb5fjj3k1iz2rMn69JfnmmT3LmS9t/1FMXDYudoBItY9f0j0/nrUEkv0zq6ccCkicfHLn0/lFeFaU8dYK62a6Dh67vwGdXLQlnlIoYBGI9ylvrY1UzVcsq7tttW2EFZ76p8L220Crk00alwD4nOW/RxTMnlkWC+GYoALE9HrRuvc6KuDr+juW+vvTxMVldFXLjIxZFT/hWJIHX3ODD8BW1wmopvQmqxNqdYApH5QBFryUO00As288+S4Xc8pXZkqw0+auWv4JhcEw2vSE+bHmW3+3MaIGEIwTCHh2devjHniErXMFn1VXmtmaN/gjmB6z94OdVpVm9Zc21XcfPeG4v/l6O+62YUYKQxGceWug6l1fYKn2utoy4aoSKBNJlF1ta2NWjBQVLEn7FmxqTadJ7GUrGd/8E8bRLk1mEyjKLtJCInfe66nPE5WoIQhtWLdIe3E9s6KfbD9pUgMxiqLqyswPC8mekQSsYwuu2qunIounxzya3d5jwleJX2691WJwnYNjggr+PiS1f8pzMIhsq7d1mU9PRS7maQV1M/497Np90b4B7HqpWdl3BIZfOdIV7GqjYueptRA/KqfL3Q9HVA2f93jtIbH8P4rVyUCSP7zx+1zbTaU3tkwAA1rhkALzqW9wmE6uXrHpvB/fXv9Od7RRXFUyiWgz8IvTbgh23LMDHx0l0iG9bse+6VPF0M6XFdXwy8/uDe2YsqYbW713pCsFTzCg5gSCZaPm96we48hrx6nrD2bmW/lONma7uTee6mihhT22FDfwK4mctfZDuUxATdb23nLIOGKMElgjNbkLt+Q+ER5W4HUdUjI3iClhVRyr89H73FRflhgNa8+//VFO1p+t0U+1P6SURPzhXyEd2bHuV0CvbEmxKJ5N//c5Ie9+v/PhQ4LS//clUajN86QaWZd1862Vu7S5vgpDAflzoSNPd1GX4j6K6ay70h9SdyKcs9dykV7+A9surcpE4Zxi89kYBBZm5UYt8F1+NktLk08LHH845cbjRuNzRUAKR8sgdf0niQrP/8j3Uv+PPhg3OrcxV/0m+vEaCqR7DJ25HmtyKlP7Hb658252zViub2JNFoQ6Omwa6tyc+tuIsar7JvPamCGFl02b8JqOZv23t5TpDNxwtAwP0Pd5k9/mGznYW9VUxb9qJbY3ZdcSE2OAEFe5kVwZaVhqp7xAHtm4zSebbv+K1tRzn1Zx5HZ1r8vN5XXVehLKpOufGdB6MP9Z71V97fecNXp70/qh9pf4sqcP8Ien3nJE0Jkb9++RweZ5B0899DIdKKFzsXnQssRVno52UVUw/lmjd6TxNRxtdcR8XiFdcpzivr+gJlslilDxYQaZpp8Nc5i+KE721yGLu1Czrlz/5883XmfWdWfJFHsUCz3fuoztrYWZrJ4FPZfoQB1URWfvj9DAGiiOQKv6T0JRUg61l3/+N7Y+0j0qj33nVYHhDSNAOteJX91md9von51eaaYX/M0s9SAoeVsyaIaGJkIUk6cF+Pu/X3q50eEOLSuKiGLJ1AY8FhlbngO/bNP3fpq85Oe5ctsh2naXl31FD2puCxn3xWO9IgoEbmK84UIFpeyrX6RSsepj5+C95ToreiFReWbt8fF1ipxpfSaNOgvN4UTBBTdOSsnzcJwFMdhGKrIKSkzMeneuNELU2nNXbuSzHf+9YPsLyqTZWXn+Osg6tE9z/t4mdvRUek4oNj5du92LXl3plnQnVxhdx8v5bNqaPqVaxNutnjC03PGuON9mqxj1ncPbOLt8+uTy0u23aIMZV4IL7EfOXymhYrOxbgFG6NFQ4aa3IkkGfX03Y6Wrlp57L9qpV4m+b/zbgcKvAECr+89JUrBdL1Js0b6lUOWzSbPZCrNyVG3PPHZ3kqeuCJn3+UyLQP7VVPsbVj63qzaw7kG38800VYwDCnL3vpfTqnicpVYUIIil68+jFWIEogF/r+/8lT0nkz7nsd/rBdETJdW3xTOGPZX1/YZiCGFpajXhP4zGg5P4bXnD8Sl8iVvHG1oVljwdNpR9IdpWv/7O3vmL/2g2wkr03S+nNN/YTcGqY7z6+ZE0tiQld0/gNDjw+svhtHMUCNi1+jfppEiWd/uhwGpn+66fklMm/qduaqJNazrFRw920zhAS0dJCjv8J+X5cfSVN5XJOaQT/uF/i96ZzhE7+Z7ZLCesmeW1qot4pQ6eS63LrkDEUMWpjAMl387Zp7i9iOxgfnPPa7KJkDiB06gfc6lPUaSaDbSQxpNLhwTsW2//sS0rLru1RPeo0dalmxqZXV5nrCLcXVFnggiO/UYo1cTdrrAbZSLt3QnlG7jeXyVp6IQcfGzsetLv/shMKCFrVLlRjv2HSYbWxp62NRP/VD6AwascBRecr+F//s819jfhibbaWKFzhpueiF2xbW8UHODjDxKiDM2+8CDvr/0G9jsEdIxjd5srQ+9v+R0KE4+jo7XH6Wx7d10VMzBO8oQK3n5csOppPO12n0csYT0hLlHkdWhXXs1WzbScep9zAkSZZfIG4LJ+vraTV4bINnAhID37GhHvNf1NOc9VZqJVIUdTXxEZloYsHTqMDLLaMQgRzdjliFU/vvup4KeNiYJKTtusK89pm4MVVEfE/ELeRC5RihUkamQhKPllfw6xR/DiWt5KCas5uWVNRpIHDc11qMrzMObCsXEOen5UZX13hOrfdFkvQwrvH9/XabOwh/N9eCXMCouqhYLmBS3wYGnhOKipPvfRmjv/sF3SsK11Ze7+Uw0ZmnwRm7dds3mvrf9hfKT0msgUmUlRhzYqLcZFabE3V97OoPb03VqRdrCVRWhY3p/N8DEoMkMG69+dHvoyoat+QZexPlNpOEIfSNFHMlLzzoQmXLiBd/MxW3nfJdAAzwjPvHbkw+nJTzrE+D6ZbC9n1GjCkRFxa4WFaUuOJBZoBh7YuJCLt5bs90EpL0fBN6w96QaLFowSGopXpZQcrJS18VSR3JoCTL6bmUomYo+1o6ec6XYdUyIyuMcaE3ez+sf3uPh2g5eFs22bxoBCkv+ty76muyX8IpYD16OVvyq63BstW9PledGYJhORR4npO1tPDuNVWH0LtSGe4Nk7Nxt6TSdSWYkitAwwPLJ5j/+3VwvnK6l029kb3dddpfP/bwZ7BYdtKIy7+fn97a/MH7suZg9hShk1PUnPcI7oiQahVyV9eu9UpvRQ9YGGemiDn2vPNxbIG7y+zMJZJjp4PLbKEPleQvGv3L0ntIBXSEnfcm2hzGVkIlTt9XfuHziKP9BUVc/n//cHcOvPt4c8+CLWw/tA0NOj1d9wIOiZzFrNJuv+CBHqo8cffp+9jbQ6jUJwLhkZa/xSkpKsjA3f02hoHrrBAqLiry9W9i3b71ms9xO3l8IilOah5XNKLU3Aa2LvZ0Pd7fzN6Op/HEQUld1OyGv2NF5spXmww4Njor22gvKvR4BzQ+C19MH1AYE1CCgSddJNEvWCgx0aqV5ipZeUKBeKwVAVqcioOIQRqeyHxgLCAACgEDHCADv2TFuoBYgAAh0dgLAe3b2EQDsBwQAgY4RUPaeJBJJLFbxt947Jh3Uak5AIBRSKBpbbgb91Zzwh5ii2VHxIRL4EHVWvo3Nzc05RUUopnjm4kO06/3VmUwm29jYaEo/0F+aIvlu5Wh2VLxbWzpP68onljqP5cBSQAAQAAReh4DyzP11ZIG6gAAgAAh0HgLAe3aevgaWAgKAgCYJAO+pSZpAFiAACHQeAsB7dp6+BpYCAoCAJgkA76lJmkAWIAAIdB4CwHt2nr4GlgICgIAmCQDvqUmaQBYgAAh0HgLAe3aevgaWAgKAgCYJAO+pSZpAFiAACHQeAsB7dp6+BpYCAoCAJgkA76lJmkAWIAAIdB4CwHt2nr4GlgICgIAmCQDvqUmaQBYgAAh0HgLAe3aevgaWAgKAgCYJKP99z+g78ZoUD2QBAoAAIPCRElD2noSZLk7dNGvssxfpGpfZoOEbFa5ZDu+htDdK78MV/oZ66o0CeUM6qyu2M9jYwATM3NUdHqA8IAAIAAISAsB7gnEACAACgEBHCADv2RFqoA4gAAgAAsB7gjEACAACgEBHCADv2RFqoA4gAAgAAsB7gjEACAACgEBHCKg4sdSSGJFIlJSUUFJczONxlcrQaDQraxtv7z7Eh5aqg3RAABAABD4mAmp4zwcP7hkZGgQFDmCz2c0RXL9+/eWLNBdX9+ZZIAUQAAQAgY+PgBoz96LCgoCAAJWuk+Di6+ubl5f98QECFgECgAAgoJKAGt6TQmktUNXR0REIBCrbAImAACAACHx8BNTwnmQyuXX72yzQrDouLLgTGV+ENMt46wkYNz06OqUShbCqxCMHowvEEISW3Tt5LKpAiL91Zd5hg6Kci7sv5YokGuAIn8tHRVlnt5/OliY0uYiuiw07da9Ejb4T513dfz6XIIuL6/gIDvHTj/599lVz0cpNSZXhPdn/17mcNgu3qx9xYWHy03wBDqHlt3ZtjeSgzVsUF906fPpOLh/HeY/3bIsoQPC67OuHL6XxsOZllcm0U9U2BbWzQLtMbiILF5a/yij5cAc2JuTxxKpuS1xU+jyVIzcMF+Q/vJdSrnKAokU3tm67U66i49sJXVastXBSSVDrsSdRuM0CMoFIya0z51O4UusxQWlBaWzGYwOazI1TrYMnj7RnwhBaHLN1Y0w1na7osXFEiDl+tmJmV7paNranMEnLkFlwPoHjNMTcoYdudCFXSE07H1vnPMuUDsvrv22V2qO2pstg/NJioRZD2hni3Kt7rtt/HqyiDVzEiT92KOqFkJyZEVXPB4KoVqO+nN5Lt60nMl6Xenpf5sAFw1CxmHCiipco58zGfUliOlUiFBMJtfrNW9S3JOahToCfCjVUJLWjHyGcn3ktIt7FzsWKqkKCLIlq1ttf//iNx87T3SQJuCAnKrLIdnQAq8G411a1xbbVzGjLZEHqwT+OcbRYZIRbZxC6aLorE+MXxp++aTxtup8BGSbTGUxKW12mpkoaLo4UXd19xXj6rF4sfkFWXo2w9N6lBHbwMBcdElnbytFS0ic4yq+pEYhrM+9evJ9JndLXiIKU3D0ZVdF3qlNFFV1HV1s6ohQvXFBVmJNbK/cvMMPIwoTVRnjYzCw1vGeboWWbBWStY/ySQtT908lujSOxQS2crMWoN5NqEbJwQYCRgobC9GNb38CfgEJL7oYdvCd9EJ3YnCjTJWMDj8eHmGX7N8XpeX46N8RSqsZbU6lZP72FBKT0fuTN1MyCSmb02Roj1/7dsvJoDv21SFlN28ZFJU+uHD3/hDVsya99DOW9g3FTL+wLF3h11WnpPkR5lTVCpDrtYcZAE/rzCu2u+hSIp8oqmt2ERbO8WDCEVcfvP1QG4XVFLzJEfr5tPzHb2Y9YderdHH3PUG0SpCp+ISYd5Q/PnEgokwYmJ7c/rCsuFZ0My5Tcfuf2PYYZXUd+NtxaerSk46qqMrwjae0x2RCiGPf7/MvB5Fvb/8MYiQe3ZdJ06bABs/bKv6+QmmJxz3lfNbnLOqLHW6qDi6uLs7P4zK79fWEh52UBX8fRxF7qPdHKJ1cupFQTHWrEyos6vKEIMbE21DaCkiPPJdOshkwc2kV5/GA1GQmxlTS5t6GaBYaGdCEru9g27HoH3pPQCKayaKWX95xKF9arh4qECG4csvjrALkBMBkqidm59raiPTgqJnf3acMi9bNxpLZWP2T+HE/t5vAE6Ye3pSKy6dpbVEl9I16/Bkw3stBFnrK6uhnVPHzJseM9qajGw7bc5fIE6RszqGQd10nzhlpwE0/suU329nNIiQ2PNpocYs+CarPvhJ+5hfSd9al7i3EnWh5/+qLAgAIVXr8cb5ZRlZe65bfziFCE5vz6kgKTdDynzB9rK3VJxJz5zLFkybgUl5cgTmrY1a5+xAW50bG5QkHxxnWRxE0nGXZ7fo+T3Tawbu/p80ZaUfU9Rs90xnBB0YMrFxIhc32UPWKEVUWtuasdmwyRqIz6kLXjqqphVatF22WyVIIwLz5Fy2eqMbfUa+So/ibyKKs2LfySkNR82Lfa6FvNRIqidh26k89HSJv/Sh45b6otdj2S9tnnvnq1ibv3FA8coifzYBQj70B3XpJ0no7zRJwqprWVuXTaSNbt3s9W2XVK0k16hc7wN1Q33GxivBres82JeZsFFFtmOE5ZvpKXnfgMdehKSr9+OSbbeNBU34ZIk2wSsPDXgLfTTyRd50B/avWtIwcfVDRZ1qIY+Uwe3DPQVV+K+G2q9HYMb9oKmW3vYBjF6hHQx/Hu44zypEzT0MWzvBjZZ/c+9J4z0U5+kNeg12c/eJPIJDzQ+XGqoOhxVEL0/Xw9n9DFgU6Ea2nxQriliI4FFeo2cpTDg8PlI76e76MvTD24KWXAson2jWeEKSb9PhnHKc3noMbWhnS4J93YgNzmWmd9o+3oR1yYGxOeavrJ91O9JI6eWPfce5wfumCIWVPVUW7Oo9vRcdks33HzPKuOHy6kQsJX1/ffMeo7ekRAdyIuJq7XUrVFTmpmtMNkmURBXtwLpmegvoX20IIT+zdziNVn4qJZhcyY7tPiI09NZd5IcYp58KJve8hn7jrEkp7PAMdsMYZVpyXVOg2ya5ipQmS2VVdnIwzCalOvJJn5DfSUu0yYrl8fYBKzmd0bwkupdHmMuXPNTUJnHBWKTUcuW9hHfQ5qeM82J+ZtFpDjxTH5jInENNCrOr39r1ydPuPmfONuLLcSLYnZvz+2FJGEJmQanaL8aCRpu02fP6aLxs7lk1jWbj2ITZLJX/pJFSPWnp/diYh4InZwsTcwMjEzJm6zt6xSCwMxMSUtM7ugIZNwYuOHBbVQVv1knJ+fyrX0NxQVlVK6hE7sa6RFzMOVfBcmrq0s5hTl5mZlvEh/wcEt3fuOmj/BSb/ZslLT5jExn2LSxZCaXEWh6zkFjnLWUzXDx+pKS/gUGl6cnCQIcLTSJQI9DFc9u1ZlXTv6EcKMPcd8oWfX6o2CVqTExpeYh8wZ3U2fCvGz3Xppm9k4Tl3U/Xls+MXTdw1mDzAlv6aqqtTvSFp7TJYehGHYBvW69V9CsVeIee+pX/fuSFvvvA5em3p887lXkvnqnStSbY7+/kw6a7Gue3ji4DVi9xkX87h8jMzUeXA+LIonhOjabDoJotoMmz3VRTqzpBj6z1440kLR7SH5V7df6JhxanhPPT39srIyIyMjlS3l5uYaGqrOUiov2fuBuQ8P//VAsmGLCUQQXJd6/VBapLiGR/aZs3SstUnQ3B+CUE7kjtPQhIXKcYHK1jWQCFOoUn+Mlt06euSpzbCZi93MmfX3OPmdqNTMKkdb6/+uxtbx5SfDRgT1bVbkNRJwoQATlWVkpuVwjQOMGbzbB/c9rEJF3GpB+pYsGtU8cPpnHqJbYTtj6gwMxISfI/6+IY2TGns8NVbeKMmo/8zZIWYqxhRJ23XCBGLPPRmCtaxdDc/sWneQWPRE+Hwkd10GFaKZD5o1va8BVp397HGxiJfLFdFfJSfn17xIEQ//erh6JrXajxBJy9wOSzn223nZMYImM3eq5dCF03vpk8hGvSbO6iVrFat+dj2ucnhvEgST9HuEzHQOxmHJXYhqQlX1DGu5dOsmy+pRzXv7aR9+cJ+Xd/N5aQ2fos0U8vgMbTbTMnAmYXQr04aW233LOTCrx9SVPVQ2Sus56QvzjGcP7919ou0xbupQFzYJKXt09sSNIhOvfn08e9ioWJRTKUi9RBUjvSUB9g5Ojx4/FrZwqJNwnfYO7fmj9Jigopqkb+M3NmAA0RJxEuXAjqyQJWNtobwrm04J3U3ki0pIRdrT0tLKfevimoSeJIPeMxYOlu3htKSomunyuLL+9AIRyIsQUunFXY8uygQ1hLpvT6WWLNDVYU0aEXzwzGWiQBdri2B/jQYRJH2vCROLd++9yu0xxYpGYQbP/HogJMw6tz/R64sJdnTCfxArZMHzVwfDoldnt113/HKOu2wSK1VXtsnT9oEeyWbLuEUrPoEgftqhLU8HLJkgWdAnZBNrI+Y+wz/B+SlH04VeIz9xJWeczLxFVhWkquTT3n6EtV2n/egqFaFy5o4UXdt78K58DUc6GuD9a5Ma1KCYBX4xp5/xa6mqUv8OJLbL5CHEXUYcPuOS6sQIyXrEwm+9L+y412Nmn0d77nl+NeUNnF/pgCFtVsH4RSn3n9iZ5RzbH8+nU6W9gQqFekGLlwQZU4gu2xX2VMvR071/94cZqGQswcSyeble30C76qTLhxJ7zpztRyxxwjSG4MHBPx4oN0e1HaE8wVUuovK7Gt5TS4vl7t5TpRQ1EnFir6ya7UzsHzS9MKFAr89IV+ImlV0U48DlawKblkE5UTtOkTQ2Y5cLl8WVDS2hxdd2X9SbNqsPW/m+fXsqNTW7yTePHl37ePR48jxjWugQkjQM0uAFM8zsLbXuPautqkMh4hwL4S3JRCMwsUQgGZHSSwNNEgIlmhPxHATDCqIl4onTi/H52t2GEyv+IrEIolOoZgM+n0rWJqW1ZWe7+7ENQRTzwfNXDpaows++feJIEjvQtuixuPfk0X2sGuYiUhEdV7UNDdqd3S6TBanEWlTujbDkchO/cRZUrLqAA5v4yu8/HKkTk7Tk5wXb3e5bLIiUJ12+cudxpdCUg3RzgnGadejc2dJ7Ey29ufu47GlNMR+yaIXkKcF/tj8Go0qXNYknRq3QoEsffw+fEXJ9YaqB86DZ45yZ5RU0C7TqfRoAACAASURBVEttQX5qPqNbNwPhy1u36tD2rxA1Wq/sxN40F7wu80GejvNQ2RktEXE6HcWkNyRJp2vfwNZbx0UVHKG2l/YbnmWog/EtqdSUyydDA927Oxrq67aOS/1cjJd++WKWXUi/2ltn4x1n+Ru1Qpq4Hw/vuK9wxANHqjli6eHI1i8cx1BUuvKNYsQaPyJGEIljJpEpJBgXFcWdvcJxDJ2oQyzm8zg8qh6TTGGy2TDEIwqr57hV9yOOIo03CoqiOI6iIgSp30YnHhRkGOWVZr94Eh93Px13Hf/5KA9dgf3ts8c2xRk6e3k4d+1iY27IJEOaVLV1Yu3PVW0yAVer29ivAiX3OlL19No9YfcpBhRi4QXCMd7T4yd5obP6t9bV7W//DZQk0Q3s+4wL+tSCTex/IAVpOCasq+NJxh1aJ0ahJiMUKU+O5+i6mKrYYZcYK8iJ/jdWNLaHfWHk8bS+C6aaF949+6B09rz+epSs85efOUx1V3d+/7a9J1rDwe383aTrLOK8C1sOPKyhOo7WbU0N4oFyYvOJlyISGUMYbtNCG7fZNN1ZxK+Ljuy/mVer5fk5sdbcyvX2VFKlBINOc+1mryrntdKwqgenwjnuk+f0txba5PE4p37fnSWU7EiKkKd/PqPAFJP+X84aUH/WhWLWZ/j4blqNDg2refzfpXbsj6PFt8MOxjf8zOPsxg2E1mS9XtPmDTQoiDkXzwiePcaxJnr7X/fKqBYBs4zI/Mz/tpxK5YopXUbLj6e0ZWbL/UgoeWrv5TzZjnO9mKObk+o/UsyCZk8wjT985qVWFzf/z0PdrKTPapb9gM+WeeclP3yYdOP0I8/ps/rqaEjVtkxpb37LJitKwGqeRsZBAZODTClwmSkz+9+/t8L6frP0WnlKtleBN1WOpG3nprggKC6KPrrnnlRhpLaa1q+xXeKYbniCVsjkngYq712M+/zOS5OQmfZaOsZeejHPOKizxxCPxzdfVUF9eg93ehSbwXX1bDbfbN0sGG+6qUm8kVjj77/UxGv2JAELisMUivKBVk0Ibx1RS7ktqtRShfcwvQk9TFBZA+vpNfy46nX1faNd80aFv67lLdT/EHVuwZQWk99jG4lpB0aSOBDizsVgYo7RaERDVot2qcxoLehTWeEdJRIzqvft52TvoUqv1zkkhr7e60kAtQGB95cATKbIgmzJ8kxTNRuy1NNeZZCrnghQGhAABACBTkgAeM9O2OnAZEAAENAAAeA9NQARiAAEAIFOSAB4z07Y6cBkQAAQ0AAB4D01ABGIAAQAgU5IAHjPTtjpwGRAABDQAAHgPTUAEYgABACBTkgAeM9O2OnAZEAAENAAARW/NdKAVCACEAAEAIGPnYCK3xoN9PfVrNXErz81LrNBwzcqXLMc3kNpb5Tehyv8DfXUGwXyhnRWV2xnsLGBCZi5qzs8QHlAABAABCQEgPcE4wAQAAQAgY4QAN6zI9RAHUAAEAAEgPcEYwAQAAQAgY4QAN6zI9RAHUAAEAAEgPcEYwAQAAQAgY4QUHFiqSUxNSLkf/Fpdwsrq+rkb8RtKMmgUoJtjVf5docRcVRScqi/T0tCQDogAAgAAh8HATW856IbT17hNDc3DwaDITVe+pftib9zT7yDHoMSn6cee5p543x47+5dPw40wApAABAABFohoIb3fJBT4DNwUBYfEYsEcscpFUx4TxYJntzD5uDWLc5mBiumEK/qBhcgAAgAAh85ATW8JzErF0EwBSLeI4cTHyRuk7hwnApD/nTk3/17CK+6dfGcjxwYMA8QAAQAASkBdXaNEIR43eJAMi+IiZAw4rXYxH/Eq7jxgUzketieqspKx54+OlpMAPbjICDMCPvx7/tcVa8Ix7gFOaUCVTkfium4uKa4sEKoIRPEuWd+WXO5CHkt67HqpAPrj6XwGnQSpGxfsT1FaYtBXBQTdiqpEpM1hde9CA+7mi1UapjQZ/W6mHJ5IdVaYdVPr1xILEcgrPzuzn8u5hLvkkaKY3fvuJzdUsfiguL054Ut5apupeVUcc7pX/68WdGqji3XJqI2YX787edVaKMcpDL19t2sWsU+FeVGHoto0aB68aL8yK3bb3A60H1qxJ4QKnZlQsf+2czW1wv+bHZkLZkIPIOZ4qjD+0qLikZOmJRbxW3N3vbk4SLOvcObj7zqvXL1J9bU9tRoTxlcWJQQfuL8nfRyEd3Ue8ycGQOtJS+FJ97wfGHvocj0KpKR2+gvZg22l72dvJkO4rJHl06ev51SVIvTTdxHzJwpKdmCTKJbm5vQQkNIxZNLx8/dflEmJNtN+HHpACOSKpXa31CLJdvDqL1liEbijh9ONB47nZF++ho8aDB6eGvmgAldOQnxGczAWZ/2Mmj/y8GxipvrVh4vojEkL4fFhAIRTqVLPuOIQGQ948/v++oqvDS2HQoKXx79dceDGtkdSQgRImQ6g5gaSS+60/SfF3ihj07su/g0n8NlWLsFTBrDPr3maIm2Lk0SRGCCaqj3t79Ns624ffrSc55MCtXQGkq9mcZDRdU1dXS2HoME0bvN+GFWD41HCSQdR0/28eMXfX/51EG2r9DMYrwu4+K+8Ke15LjoPTrGVt1DAkgR0c+hm4vD+TrGJrrWQxfM6WvYJB7iP9m4dEeazBTYftb673x05DhILBOtnCO3811Dbbp76l/MrRZQnxyJ4HkutpTcGhDEf/LP8t35LB2yuJpnPGX1Ym8trDY35tAV8y+/HmhMhskMLS2qOqFXM2NUJ2BV8dt+O5FJ+HIIRwVCMUxj0DCFjqSYDV767QhLuPLhkW3h0MQfFN7nTqZTONe37xJ893WwqdSt4TUpFy/fSr2Repum1BhZr/cXS0JtJQ4GKYs/vCOyRMvowF8JxLfq3IJqhxl/LOurV28cVnnrjx//rTHUpykPRlyohveEEQTBcKGAX1rEjzm8b9C02YSCMYf3l3KKPP360Zy9kk+fVo2knamEkwnffihVx1hHw92C84sLYe9ZaxbZ0fKu/L057I7bDyEmpLr0fw/c0Qr96R8PNH7vxn0XnFZP7kJTpQMMIVSnsd/OdDGF869t/ufgdZdVY6xIqmSSVVXHVTYECV+Fbzle5D931TwHtrwXVJaktL8hlSXbCb++GM5/dTNe4D3AmS5PQSuTY5J1/QNspQ+c6sTDO69UWHajPrh8AybxC8/F24u4Wck5Tv1HzwuofF5cgxrot999QhDZqN+8JWOIByVWGbd9b2noN5LPopz/NkaoqbekOL3rtLUbp8krCp5tXx09YPVXrk1cEd5j6AyrXlG7rjl/M8+DUXWXbNB30S/THSTG8p9s+v0p8S/F1H/yFKODv0e6f7uoJzEUa+yKd1/JqeLWiFja2kyKrtegrhp3nRKdSWz3cZNL0ik4ET0p36iSfJz7+HjYS4/Fa0aaZB7fmeQ60z/nyJWg5b+G6Dw7fxMOGu2lT9w24rzLOw8nlpYWlVK2/JbgMLgfpOu9ZPWXznBG2JpwORkIKbq2ZWtUMUp83/nLPVlq6g81NXUQq3jzT1EGfvOWhppAFLPgb1aMIUesO4gx72z8PZWuz4CNtLj/7U1HqgpE/it/HCZzUvVS2/6XiF4z8mAbRxNiDqt4YTUvk3L0PNyMqRBJz3fxetlfKSIi6N+OGX71vV/pvtVXfVZ941FPHa99duzv4+X9v/7aS5eEVEnQoLzsuIgL99DA/sILYbc9lgUZkXHhq8hzeZ4L/jfBvn4oN7QJk2hMKhHnFD84s/fwzRIr/4Gu+sQ9iHLTb+ZoOVqU3rlyCSLruw3oaysNqCSD9OfJdsrRnPCFGt6TiD1LxVjI2PE3zp0hPGbs0X2E4DJOkaWdvXPw8JgaMVGgbYKtlIBpbLshXw8yuLd+fyulOpBF0vMcO1FWz8bdWTuOw0UhE6QgPp3Zf7GPJYsC9R/d8/qBh0XjuthSVOhAMeo9crCsupVbD72o0lpi3FFUySSrMkGkqiEb0fMrD9mhKwY6sBsfFSpL2ra7IZVmquPKJDYKc2MiHzh5DGjADMN1Ty9F0lyXBRBhDUnL1IxNLSrLzy0nxiwionv2t8RiY7ISbxQ9ui4U6g1e4u2sVgdhNalXTnBZBANRKadCIPuM8XJ4UHe15LSzMFqVmfIopyi3ilMXFVlqbAWjda9uXT6fIqGEcErELIkcGEZLkvN0vcfqUEjEdACp4ojcpn2/xIQoVJe8c2MaH4OIKfPFE9GF8vFORGWlxeSTe/KY8r6kmPhPDHVV6Nm21MNFlQWFVWLc2MvLmqnKdUrU0vH64gdm2LrVP8MMQpUXWzMlUvf9dpdQXQDxevSY7kQnXN6AaXOcE3b/Hes4Yc5ga3ruQRVN4wiXaxj641I/dvOm+Mlbfn9EnKGRXrjgVfRDVuBCs+oinylTBpnLvAXOSz5ymk9qXldFU02S0IqEk6coc1cou11x8d1z13p0czWWzBNw7tN/D0cRaHF+ISeftn9zkjCnsqRox6YYMkQ26D1pSj8TLcchc39g2xBOGBdzRWYu2rf++vm6lf/I8aN9rCC3Whox/cEFWRcO3TMImfR052/HG1dDJOpQLEd8szBAm/hEprPNrfXYer1c7E0oeE3yv9eFAV/MtCcet2hp3KmbzN5+Mu+Jlt7c8uOj+kmMgknqeE9EHFcp9OnqHjIWIhwo4TcJOTp6+oMmTQ0vFWAUCoS8pvekW3p7QeIcFIPUUautPlPMx6qzM0UWg0yIB091CUfAdteTtkTRt9apTaoUQ7bUVnTA+IUPIu6jblOtmswEGmUSI7x5dZyvqiHz4meFNGOb8+t/TC3HDVxHzpjsZ0ZVWVI6v5BebTRUX0yppEJyOz4K8+5naLmPIG78+mUgkp7H0O7nTt4p6jvGktgyFFVX6wxZMt+NCAT4T3duekGyGzb3O9OuxDOoA7cTAYzCNrexJcJVvA7NzubJPiPlFa847VBW/SLE083IWLeIy0eMtY1NDIwtpsy3qJPEYJLLqZungaWEtjDv3jO61wAWKkZwCuEQYTJNi1JyJ6rGN4hJkToNmG7RO2SIQO5kEE5UbgXDf3A/I/mzCqYbylaB5JLb/AetTrsV8TAvM4M2fqb+hUOPJPc7LhYI0WfffS25a0n6fl+tnGxPI6G1tbBBd1u9Jg9FtOpFeh0iXfCDqdr6rMzMYrSyIDyx37dBKmdxZH2vESG0imtbNt4tqzdeqiLFNOiLT/yH9jKS33/8rJgUVp8RRta643N2/r02X3Z/02xDlywIkkS6b+LCRWWZBdqBM4MNSyI5102GjHGpCN8d5zJijKMw6eiZAj5xxAcRIsK8uAsRKclPUvJ5sJ6DT8C4HmZMUklqYrluVw8nSRdRDT1Gzg7p2UM/pOWz52Q9Jw87rX/P3DhXQoNRXnGZQPvBpTNJRG1cVFXDajx5ybANnjjcWnn+T/BqPwDJzB3Fb5QLBtY7UDqDMWLytBtcnIvgDBJOFGi/tHdREi2/fzoCH/iVB7H4gyECBKbKl25gCoOCi4RoC3MmYkKUfXrNn1ElGNmi/8x5XRXvDEWZKm0i1t9UNITWllcVF1eHLl09nV0Zt3P9/hiH7weRVZWsn8a12VBD6+0v2UxhQfbdVJrXIEPi5mzsS6ZDkIdob2zu0KnSOZC4NCkqooAYOEhxqZglyDh/OsVjRJfSRwlpcP/5cwaYKk9wmjXSkEBie01fZCXdh0CrnnGch/b3cWJL/YKzO9NEW/3gpuWm5DkklnWPrmWxVVhV4p3cgPm085uPvFDYcyEb+s//ZqRuytV7xdmiv1dF1Im6f/1rqKQuLixJfVbuEWghF0TWNreVhC/SS0zWo9GZVnZd5MFZfXr7/6UY+02Z1zPz6NqLjG6f/7bpc0lNYtdo9c0Bqxc2XXqAYBKVuJp4TxIFbmSFc5/fTBNDBu6s2/vCLQYhEEkhU6YRSdu+lweEu8xbESh1ubiQ8zjyzLn7wm7e3YzMLCzNiTS+JIPpOKx/xOGbBT6h1v4L1/jLar+F/9P0LO2sqRmlpC7B3e2tX2nTtMxsu3Th5zLgYiKIqHoQtu1qNbm6hOrmE+godeK8gqwMySBKTRSMd3bSIx7tZL2uLtk7V36d3nTbDRUIDEat/mWkvKdgds+Zi6kP78TczWNa6Ivoo5Yu6EcMfqT65cMXTE/ZGjKGYSJueXkZMddveqGVanhPU312eUkhw8Q8rgbxc/KY+JMXISytDq2oQ+lUSJid7mpp8hbIdrQJYsn9/M7z6Ijlg6XxhdRhihH5DgMqRGEaXbJ5ofqi2k1cu3MCWluQcHLrX/vIq+Z7Syc9SjJV1m2hIQylWAYN8TAkIgsTz36mZ2LzhYMcWlSpPQ3JWm9/yeba4txn155q+XxrrDQqaFZ+7vjO2znj7SWPdVxYwSnCiNsXrRLixFQX471KybHzG7og1LAk+WWlYQ/JElI7LnH+1b3Hk+Wb+gTanBItTkmyfH4Ea7t9One45jYOG/RBiu9efYHRuwzqwS9Cnb9Y8ydhQMXN9ZuKJ/88URrm4zUPHlR3sTNmjl7W/+Y/8fKKuLgOgSgtD5B22KuZIjBMZbF1dZsgRkQ0uP5hhxTdusqxczIUdR8zzDpdWCWgsCTbHVIv2fSCKTS6RAxSfG3b1iSHCV+t6W2l1TSghGlWAcHszbdu12RFPuZU1VJ0tATcOiZbj2Uz8psF/etDbWXJr/8drXl27ux18oBvu9AhFCZj1ZkvMlkopw6XxuF9v/rNt/L2n/+L4FZXowoaozwR1ggGZnku+HNzU13Qkmt/7uTXx9tIcdSW7fepTl69x0ztlhp1reD5uf/i6I75t6MSa+wGTeqBQ8RaPybmQ2a+/taFR8Ke1jVIo9l9smyWffsGurTS9snDvzjwb3WNZGM9uhkgJ3v7fyYNa5b8viSICqN3701znbvEXz4rgZkmZgxeQTXiTax7IpV5PJaVvvLDRUl5mMyy8u7f/ez+52VibzYNaiZTpbGqG6KwzVjiKmIFDSImragYhUhkmNSSSu1rSNJ6+0uq0BUpunkxwzR4ikmzQUGz6N0D2nMvV+hkC0E025Fz5ncpfJyen8IpZRBLg6wufQN6dqGLCx5euVQ4yqO93pNi0nf8Z57SkUwsLO3cRx4/+zMXlvQBxk8N218oUnHHq9BarSRxYfThGEZ/b8OiLsM+9aDXPP3vxC0OIirNKxWc2lWqo+/+yeT+pr2/XGpwfP2NJoIRbjGPbN1s21WtxjVQmGLqN8wvvzg5Kl6rX6ADCyaWjaMfkH2D/IZaS7dwkJJbx27rDJ5sHhtB0nUfHZi6K5rlInmaKa6pIYVX/94Q0XDASrq3TSo6vj7uuExDErv3gp/GSZYOaqurSTwRQrKb/PPafsf+jPL6asC9DVG+Py5waeFUgAZMlIjAal8li1xnLRwsCRHJ1gMG2ly5/t9LUXUF6tHYApntHDQq2ExhsIpyz++Wb4K1oAhMLMGgFbJFDkKyTo/BQ0RPHiVdPJPhOWjolMGibWcv36FYcJAeM6YO7i6bYqI1RbUMZxaSzbeZ/r+FUsORokt/HOajGNLsRmmhWSK5u4XJ3Z8Wtpz//uYQU9lDW6LY45cMtiKLhMRMjUw8dWmWvt3qwiKT+01zQxMjHkFuC81Ve0+M++p5iY5DFyMGLCh6dPOZ0GyCAQVSKVNl7KqyIaqlrye2LfyO79wBxqX3bpaY+VgxIJUl299Q+0uq7CochfTchnzSy0DFghbdyj/IJ5+B42Q9F39vYm5DwnlFZTr9JwxwtMzySo4/eyKeWBxk2Y0Ybtdsg1NlY0QiTNM1MdclblJBTsSR+3C/Rf4OFrLTMljFCxJTr34LpqX6HUonazuPmeRScOCypDZJy85/OFuA1iSWFZcHDB9sQURVkikxrLiES9LpMXwEt+zuIdhc/04cLfDT4BbGSYf0Ua4kzL22L9lqwtSeus16QZh5av3eJCJWJ7ZK+LWk+zfzycSuCa+2Frp/i0OBY6Ojgxct8rPqN8XDSy8mlhCM12XFv2J7hjYcYcFF3BqBNpthMWzFhsZAByk4v+64waJl/ZusZPKfEJOMzPPbE0rMg2da07Cq7HzYPEh+hxB+VURm0ZupqGxNR7+T2B6fjreRNwZrOQ6dtXiofIrQKBIpub33z/gmOhBhSFe/1holMfR10Ke1YiFXTNbWIqHVBWU0p8Ez/GqeRl87fIYYc/quo6aMrg779cT5599P7kEsHiEVGfkkqyBiMBKsq6urJes8CFeAQtrE4qga3rM1rd7rPLTiUURiZTm072fiRJfkYvktX/d5V61uE2b67jn406LdJCPXkbNH2zVfFZaWxoWFcUfObCuqw4jbzcwlcO7M3noktFSlTFWuA1bZEM1u9LyRR/av//qkiGXtN3FuP+K0J6SiZPsbasFMVSqp7C5iJ8R/HLGuhyN8Ps5gQhimEPwx7IeNs5dUIxmJ7+w5bfbDBDv4/COyPxvmZr+oc5m7OAC/tWV3HoPZZEFOZTuNiThSnZMUezn8erbVhKVj7WWuk8gWlmTxdD111RHVRkv12VTTvqNMiaMw8u8UHVNrHeK2zGbQEGLDqv5+leTyHu/97bkAcw2GqWytwpOH0rpOnobf2ncooc/C71yJfKy2KJuYSUoFiTmVQkFdblZmnUxlWMvMzlxyjkC9C6bQkazrGR7Lhqjcrac7TPppXWh5RkLEqfCsgUtXjCRWoJDCi+sONNnFNu/rAYlziYZxUX7MuQz7ERMbphIY/9XZPyKtl/4QLBlrjVdLMT5J2336jyMkPgwpf3A+SuC2wJhSK5GM1Tzcs6tmyvIhpmp3kbjw2pZfE4gYHheWF5dTN66JJbbhMEFplX6PRoVQzvW/lt1utkxCnAhmDWwsRTELXDBvUJPYM+fc9tuKljX/TDPtzi55+uRy+G39ecv6iriCiqeX9l6nOviGTPtxGnb5tzAmk8K2/2xO7qad63YPnfHpAJ1HCVzbieZ0hqVZXdT+7VFykVpWDuS6kvfPe1JtJ/66prnZr5FCNg5ZtTukuQCSjnPosr+kmwJKVxMdiNNec1YrnMqVlW1BpjRT2QSVDcEM66A5q4PmNGm6ecmWlG/eUKsllS1s5TtSGLlhQ2SBGIINg4KUTuaJ867ui6YHrbBn0lFnk6JDtwsDxvi6VO6IfNV3ap+hXa4dOPXMcbabbPrdShOSLLQ0dvPaEzkG7gGjv5/pYy2dJiEFVzfviOXwEV3fORPV27WW7CY0HLRuaPrF9183fJYftG4Y8Xht8v4/j72s3zTa8VMi0XNWI79Z2N8QJjGMfect+ISRnV9+7veV90m+U5eN72VM9frJMGxD2HGXVXM9KJyE61ckv9CRXVbmgoTIK/IvNJvhM8a0dOS9QZ9mH6g2oSvWDmGZ1B//bVaA2Fy4tHVPqs2Q+d8MlC7et3IRa9hRWU6fzfGSeWKythnr1cm9uVbDBipEtcTC37bNV7J4LN9FrUT6xBbbmSho2NxhllQSx5L1ct/Pq0mGA5eq8bMIuZ4Us0HLf/NvsssvzRG9Or1RcS2QbDboux8bYs96I2XL040mI8W39v+dqOi/JUG5bZ9WoBAPf8NeIxz+2nXPcvpKfTKVp2fhMbLvpw5G4id7fl95jEt1GPct8bCBKV3HfLvC9lo8V8znl2h5Btoz6IxPvllZLxmve3bojwOrVhGnqppeUbfvKaW8/tc3IbNBqzcq/PVtf88lqE0PE1SU1aFSq8TVhcU8BMdRfnkFX5KE8cuKa8SNFrclHBUJxFhHAbUlvKNyleuJq4srBApaorVVcvuVS7b9/W3p3LYmb65EZ7Cxgd77F3u2+ugAme+YAEzXN5SrQJzUlJ2xYBjoS5NghqGJOrsJJOqbWznTGCYK20RmnVwiSUu3/jcvGmsDCPpACai9OPOB2gnUBgQAAUBAswSA99QsTyANEAAEOgsB4D07S08DOwEBQECzBID31CxPIA0QAAQ6CwHgPTtLTwM7AQFAQLMEgPfULE8gDRAABDoLAeA9O0tPAzsBAUBAswSA99QsTyANEAAEOgsBmDg3r2hr9J36v8nVWQgAOwEBQAAQ6AgBFb81Gugve69IR8SprEN4ZI3LbGjojQpXac7HlPhG6X24wt9QF79RIG9IZ3XFdgYbG5iAmbu6wwOUBwQAAUBAQgB4TzAOAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAHgPTtCDdQBBAABQAB4TzAGAAFAABDoCAEVb+ZoSUyNCPlffNrdwsqqOoFSGQaVEmxrvMq3O4yIo5KSQ/19WhIC0gEBQAAQ+DgIqOE9F9148gqnubl5MBgMqfGw7H84hIsxKPF56rGnmTfOh/fu3vXjQAOsAAQAAUCgFQJqeM8HOQU+Awdl8RGxSCB3nFLBhPdkkeDJPWwObt3ibGawYsonrbQHsgABQAAQ+DgIqOE9iVm5CIIpEPEOY5z4IHGbEt+JU2HIn478u38P4VW3Lp7zcXABVgACgAAg0DoBdXaNEIQOQwPJvCAmQsJQBCX+Q0gQPpCJXA/bU1VZ6djTR0eL2Xp7IPdDISDMCPvx7/tc6SMSXG+eAFaddGD9sRReA3BByvYV21OUthjERTFhp5IqMZk+eN2L8LCr2UIl7cS5Z1aviymXF1KtOlb99MqFxHIEwsrv7vznYq4IgpDi2N07LmcLWuhyXFCc/rywpVzVrXzkqWrEnhAqdmVCx/7ZzNbXC/5sdmQtmQg8g5niqMP7SouKFuTYSQAADUFJREFURk6YlFvFfR1auLAoIfzE+Tvp5SK6qfeYOTMGWjOkKwTgeq8I4Nz76789kENjUBR6BxMKWANXrp1oS1VDV6zi5rqVx4toDDIhiZAgwql0yWccEYisZ/z5fV9dDfY/kh++au01/alrlwYYSmIGtPTGuvXZE9bO7kZXQ+U3V5Sk4+jJPn78ou8vnzrI9hWatYXXZVzcF/60lhwXvUfH2Kp7SAApIvo5dHNxOF/H2ETXeuiCOX2ltjVc/Ccbl+5Ik7lR2H7W+u98dORISSwTrZwjt/NdQ226e+pfzK0WUJ8cieB5LraU3XT8J/8s353P0iGLq3nGU1Yv9tbCanNjDl0x//LrgcZkmMzQ0qKqE3o1M6ZDCe9ZJ6rhPWEEQTBcKOCXFvFjDu8bNG02MW+POby/lFPk6deP5uyVfPp0h5DIK+H84kLYe9aaRXa0vCt/bw674/ZDiAn5dSSCuuoTwPmvbsYLvAc41/sUtDI5JlnXP8BW4VFGMuz7zS8zHBvdDuEH128qVr81iGzUb96SMdZUCKuM2763NPQbyWdRzn8bIzogrK0qJDKcceHcs55fuLE06JbbarW9+SS2+7jJJekUnIj9VKmHcx8fD3vpsXjNSJPM4zuTXGf65xy5ErT81xCdZ+dvwkGjvfQJbybOu7zzcGJpaVEpZctvCQ6D+0G63ktWf+kMZ4StCa/XBCm6tmVrVDFKfN/5yz1ZauoPNTV1EKt4809RBn7zloaaQBSz4G9WjCFHrDuIMe9s/D2Vrs+AjbS4/+1NR6oKRP4rfxxmqob3aC+FNsu9T52ojv2ouFSMhYwdf+PcGcJjxh7dR1haximytLN3Dh4eUyMmgtM2bW+lAEnPc+xEWb6Nu7N2HIeLQsB7tgLsjWQJc2MiHzh5DGgQDsN1Ty9F0lyXyUI2aTpW/eTU9k2sxtgDF5UXIG4dUAirSb1ygiuRJCrlVAhknzFeDg/q3gFpbVShWAQMYcSfjszt9oktTbEsXpd1LezQ5cfFYpaN3/gvPvUzo8LExHnVVYte1PuxzyshY++JC2cNMKdCeF1mxIEDl5+WwSben3z5eaAVsZilgQsXVRYUVolxYy8va2YLEmEdry9+YIatW/0zzCCCihdbMyUN7/vtLjHnFkC8Hj2mO9EJlzdg2hznhN1/xzpOmDPYmp57UIV2OMLlGob+uNSP3bwpfvKW3x8RZ2ikFy54Ff2QFbjQrLrIZ8qUQeYyb4Hzko+c5pOa11XRlOaT3qdOVMd7IuK4SqFPV/eQsRDhQAm/SaDR0dMfNGlqeKkAo1Ag5LW8ZyNorDo7U2QxyESdWaDmu6lTShTm3c/Qch/BJkGI3H6SnsfQ7udO3inqO8ayfrSQWF36jxxJRIn1F1aTdPSMJJZR94IpbHMbW31iEagOzc7myT4j5RWvOOpKakd5HGN5TwhO3nQqLmBZoH5DBbwu7dTO69DYn7b5sotjd/6z87L1T6HWxDOCl3GXO/eHTV9R0479diA8vc98Fyj93z2xzIlrtrmJ4rb/te9at59GWahzC7WkJFqddiviYV5mBm38TP0Lhx5JVj9xsUCIPvvua2JXFiLp+321crI9jYTW1sIG3W31mszJ0KoX6XWIdLkSpmrrszIzi9HKgvDEft8GqZxck/W9RoTQKq5t2Xi3rEmnUUyDvvjEf2gvI7lN/KyYFFafEUbWuuNzdv69Nl92f9NsQ5csCJJEuu/iep86UY2ul8zcUfxGuWBgvQOlMxgjJk+7wcW5CM4g4UQBTeBEy++fjsAHfuVRv0SjCaFARrsICLLvptK8BhkSN2djXzIdgjxEe2Nzh061l87VcQyiGVjZdenSGL9hFbkMWO2ZO4ntNX2RlXQfAq16xnEe2t/HiS31C87uTBNtzQc3OEqxGPxpzzt7zqb0nGVRT0SUH59K8prfy4RYyLPqO6Tb5WMJnBHWxhBE0e8T7G5IJUNde9qSwkvrMFFFfArJa6G7AZWK9+xv/l/Ei+oRFk1XGtuFuVkhirHflHk9M4+uvcjo9vlvmz6XFCCC39U3B6xe6Np0FRQmUYmrifckUeBGVjj3+c00MWTgzrq9L9xiEAKRFDJlDZO07Xt5QLjLvBWBUpeLCzmPI8+cuy/s5t3NyMzC0pxI40symI7D+kccvlngE2rtv3CNv6z2u/7/e9SJanhPU312eUkhw8Q8rgbxc/KY+JMXwTGtDq2oQ+lUSJid7mpp8tpkiYXx8zvPoyOWD7YEkedr01RTAM59du2pls+3xkqjgmbl547vvJ0z3p6YG0IYv6a2IvHwhnymwsxdXJkv9lavOXH+1b3Hk+Wb+mhtQU6JFqckWRJpERes7fbp3OEK0a16slsoLVlRZDqOGtdlzb8ROfMN5G4F41cJGd3l6xBklj5dUFGLQYT3JDH15DaSKSQcwyGsrpJbkbZuUYxMPmzhIiLmuG81CINhKoutq9ukhxARDa5/2CFFt65y7JwMRd3HDLNOF1YJKCwagVTqJZteMIVGl4hBiq9t25rkMOGrNb2ttJraAtOsAoLZm2/drsmKfMypqqXoaAm4dUy2Hstm5DcL+hu9k12J96gT1fCe2ycP/+LAv9U1ko31aOWugJzs7f+ZNKxZsnoJosLo3XvTXOcu8a+fO6hXH5R+HQJI0c2LGabBU0yaDQqaRe8e0J57uUKnrnRcwMkUdvtk7gQHhb1qrCrhwAnlgzNt6EIx6Tv+M0/pzBEtvblzH3n87M9cZNs5/NSw/YUiFXd8GyLblU3S9Ro/9Mafp+P7ywM2wknShZWEw5SqUlclpOvLnaZy9Eti6uqYDP36l7FW7+jRTjH1G+aXX5wcFa/VL9CBBRPLxtEPyL5BfkOtpVs4SMmtY7d1Bk82j40g6bqPDkzdFc1y0SdyFNfUkMKrf2+IKKr3tzgqEIpJRcfXxx2X8SOxey/4aZxk6aC2uprEEyEku8k/r+137M8or68G3NsQ5fvjApcWTgW0qwM0Uej96MRmN0rLpnW3MLn708KW8183h5ixH9oSxR6/ZLAVWSQkbkUy8WxUHr+v2wio3yIBHIX03IZ80stARSxFt/IP8slnENvBxMTwdp6Z3zRbc8UtB4yuR4PUnLnDNF0Tc13J1kROxJH7cL9F/g4Wsn19rOJFY9jXor4dz6CYBkzyi90QVU73lAihWfn2QA/GpAy39dKuTLqRRnNbaEbsD6mQT7PycRYejUoZMNXTAK4rzq/RsTZXCtdU1FInSZh7bV+y1YSpPXWb9YIw89T6vUlErI6Lufxa0v2b+WQYF/Nqa6H7tzgUODY6OnjRIj+rflM8vPRiYolGib2w+Fdsz1CdelG4iFsj0GYzLIat2NAY6CAF59cdN1i0rH+TlUz+E2JCn3l+e0KJefBMaxpWlZ0PmwfJHxqEXxWRWfRmKqpj6euWfR86UQ3v+brmtlEfrXgUkVhZDu37OUFWkuW3fN3nXd+Pw3ht6P5RZMN0C/9xxGIgjvD5OIMJYcRUteFi2A8bZ098E+XcuJDnMHFm45o0hqDED9AQIaLymE2rZHCkOicp9nL49WyrCUvH2jcciRKWZPF0PXXf4LyQ3mXoRM+4HSlS9WCt7pPmBR8K+983h1CKodvIeWMl67vKfwlHVrLH5HlBhw+v+Wq3gMQ095qwcKa5VqsmqpMJU+hI1vUMj2VDiE275hfdYdJP60LLMxIiToVnDVy6YiSxtoUUXlx3gDJ3RePhIfO+HpA4l6iNi/JjzmXYj5jYMJXA+K/O/hFpvfSHYKMm8lU9JyTNk7Tdp/84QuIwkfIH56MEbguMKbUSyVjNwz27aqYsH2L6BruoOQDllHffie+P9yQbh6zaHaJMCHx/6wSQwsgNGyILxBBsGBTU9EAOESbeS9MfMrt743lJhBP515+XcwWYbu/5BuqMJrQ0dvPaEzkG7gGjv5/pY60lmWUgBVc374jl8BFd3zkTpSmauyhWoatXN4iDdTzmbNxd/xXWchiyYM2QJo0xXL/a6CpPYXSfu/4n2Wct+8HzVg/WnFoKkqg2oSvWDmGZsFvEKMy+tHVPqs2Q+d8MbGtbgFjDjspy+myOl8wTk7XNWK9O7s21GjZQIapFiqO2bb6SxWP5LlJYxFY2DqtKPBMFDZs7zJJK4liyXu77eTXJcOBSg3fgOt+3TpT8al3hirp9Tynl9b++CZkNWr1R4a9v+3su4Y3Sa0s4KhKIsY4Cakt4R+W+yXofos7q8ugMNjYwafExp/wAAt8BAQ0TIFHf7cqZhs0B4jodAVULLJ0OAjAYEAAEAAG1CQDvqTYyUAEQAAQAAYIA8J5gGAACgAAg0BECwHt2hBqoAwgAAoAA8J5gDAACgAAg0BECwHt2hBqoAwgAAoAA8J5gDAACgAAg0BECwHt2hBqoAwgAAoAA8J5gDAACgAAg0BECMPGrI8V60XfiOyIG1AEEAAFAoJMRUPaencx8YC4gAAgAAh0kAGbuHQQHqgECgEAnJwC8ZycfAMB8QAAQ6CAB4D07CA5UAwQAgU5O4P8qq6VMonPWSQAAAABJRU5ErkJggg==" alt="" />

用Js构造一个表单将选中的学生学号传递到后台

$('#output_student').click(function () {
var arr = new Array();
var sign = 0;
var inputs = document.getElementsByTagName('input');//获取所有的input标签对象。
for (var i = 0; i < inputs.length; i++) {
var obj = inputs[i];
if (obj.type == 'checkbox') {
if (obj.checked == true) {
sign = 1;
var length = arr.push(obj.value);
}
}
}
if (sign == 0)//没有被选择项
{
alert("请勾选要下载的数据!");
return;
}
if (!confirm("确定下载选中的条目吗?")) return;
var form = $("<form>");
form.attr('style', 'display:none');
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', '{% url "teacher:downloadDoc" %}');
var input1 = $('<input>');
input1.attr('type', 'hidden');
input1.attr('name', 'number');
input1.attr('value', arr.join("&"));
$('body').append(form);
form.append(input1);
form.submit();
form.remove();
});

后台接收数据

class DownloadDoc(LoginRequiredMixin, View):
login_url = "/" @staticmethod
def post(request):
try:
numbers = request.POST['number']
list_number = numbers.split('&')
if "on" in list_number:
list_number = list_number[1:]
temp = tempfile.TemporaryFile()
archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
for number in list_number:
student = Student.objects.get(number=number)
if Document.objects.filter(student=student, period=''):
document = Document.objects.get(student=student, period='')
base_dir = os.path.dirname(os.path.dirname(__file__))
target_file = os.path.join(base_dir, 'static', 'media', str(document.file)).replace('\\', '/')
file_name = str(document.file).split('/')[4]
archive.write(target_file, student.real_name+"--"+file_name)
archive.close()
wrapper = FileWrapper(temp)
response = HttpResponse(wrapper, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename='+time.strftime('%m-%d')+'.zip'
response['Content-Length'] = temp.tell()
temp.seek(0)
return response
except Document.DoesNotExist:
return

注解:

temp = tempfile.TemporaryFile()

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])

该函数返回一个 类文件 对象(file-like)用于临时数据保存(实际上对应磁盘上的一个临时文件)。当文件对象被close或者被del的时候,临时文件将从磁盘上删除。 mode、bufsize参数的单方与open()函数一样;suffix和prefix指定了临时文件名的后缀和前缀;dir用于设置临时文件默认的保 存路径。返回的类文件对象有一个file属性,它指向真正操作的底层的file对象。


注解:

archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)

zipfile.ZipFile(fileName[, mode[, compression[, allowZip64]]]) 
fileName是没有什么疑问的了。
mode和一般的文件操作一样,'r'表示打开一个存在的只读ZIP文件;'w'表示清空并打开一个只写的ZIP文件,或创建一个只写的ZIP文件;'a'表示打开一个ZIP文件,并添加内容。
compression表示压缩格式,可选的压缩格式只有2个:ZIP_STORE;ZIP_DEFLATED。ZIP_STORE是默认的,表示不压缩;ZIP_DEFLATED表示压缩,如果你不知道什么是Deflated,那么建议你去补补课。
allowZip64为True时,表示支持64位的压缩,一般而言,在所压缩的文件大于2G时,会用到这个选项;默认情况下,该值为False,因为Unix系统不支持。
1.2 zipfile.close()
说真的,这个没什么可说的,如果有的话,那就是你写入的任何文件在关闭之前不会真正写入磁盘。
1.3 zipfile.write(filename[, arcname[, compress_type]])
acrname是压缩文件中该文件的名字,默认情况下和filename一样
compress_type的存在是因为zip文件允许被压缩的文件可以有不同的压缩类型。
1.4 zipfile.extractall([path[, member[, password]]])
path解压缩目录,没什么可说的
member需要解压缩的文件名儿列表
password当zip文件有密码时需要该选项
对于简单的应用,这么多就够了。

FileWrapper
简单说就是用FileWrapper类来迭代器化一下文件对象,实例化出一个经过更适合大文件下载场景的文件对象,实现原理相当与把内容一点点从文件中读取,放到内存,下载下来,直到完成整个下载过程。这样内存就不会担心你一下子占用它那么多空间了。
上一篇:Effective Java 第三版——30. 优先使用泛型方法


下一篇:执行python文件