[{"data":1,"prerenderedAt":16686},["ShallowReactive",2],{"navigation":3,"/urls-and-views/file-uploads":1016,"/urls-and-views/file-uploads-surround":16681},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":158,"body":1018,"description":1028,"extension":16676,"links":16677,"meta":16678,"navigation":1215,"path":159,"seo":16679,"stem":160,"__hash__":16680},"docs/04.urls-and-views/09.file-uploads.md",{"type":1019,"value":1020,"toc":16661},"minimark",[1021,1025,1029,1034,1039,2650,2654,6088,6092,6096,8677,8681,11387,11391,11395,13249,13253,14536,14540,16654,16657],[1022,1023,158],"h1",{"id":1024},"file-uploads",[1026,1027,1028],"p",{},"File uploads are a common requirement in web applications. Django provides robust support for handling file uploads securely and efficiently, with built-in validation, processing, and storage capabilities.",[1030,1031,1033],"h2",{"id":1032},"basic-file-upload-handling","Basic File Upload Handling",[1035,1036,1038],"h3",{"id":1037},"simple-file-upload-view","Simple File Upload View",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","from django.shortcuts import render, redirect\nfrom django.contrib import messages\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.files.storage import default_storage\nfrom django.core.files.base import ContentFile\nfrom django.http import JsonResponse\nimport os\nimport mimetypes\n\n@login_required\ndef simple_file_upload(request):\n    \"\"\"Basic file upload handling\"\"\"\n    if request.method == 'POST':\n        uploaded_file = request.FILES.get('file')\n        \n        if not uploaded_file:\n            messages.error(request, 'No file selected.')\n            return render(request, 'uploads/simple_form.html')\n        \n        # Basic validation\n        if uploaded_file.size > 5 * 1024 * 1024:  # 5MB limit\n            messages.error(request, 'File size must be less than 5MB.')\n            return render(request, 'uploads/simple_form.html')\n        \n        # Save file\n        file_path = default_storage.save(\n            f'uploads/{request.user.id}/{uploaded_file.name}',\n            ContentFile(uploaded_file.read())\n        )\n        \n        # Create database record\n        user_file = UserFile.objects.create(\n            user=request.user,\n            file=file_path,\n            original_filename=uploaded_file.name,\n            file_size=uploaded_file.size,\n            content_type=uploaded_file.content_type\n        )\n        \n        messages.success(request, f'File \"{uploaded_file.name}\" uploaded successfully!')\n        return redirect('uploads:file_detail', pk=user_file.pk)\n    \n    return render(request, 'uploads/simple_form.html')\n\ndef multiple_file_upload(request):\n    \"\"\"Handle multiple file uploads\"\"\"\n    if request.method == 'POST':\n        files = request.FILES.getlist('files')\n        \n        if not files:\n            messages.error(request, 'No files selected.')\n            return render(request, 'uploads/multiple_form.html')\n        \n        uploaded_files = []\n        errors = []\n        \n        for uploaded_file in files:\n            try:\n                # Validate each file\n                if uploaded_file.size > 10 * 1024 * 1024:  # 10MB per file\n                    errors.append(f'{uploaded_file.name}: File too large (max 10MB)')\n                    continue\n                \n                # Check file type\n                allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf']\n                if uploaded_file.content_type not in allowed_types:\n                    errors.append(f'{uploaded_file.name}: File type not allowed')\n                    continue\n                \n                # Save file\n                file_path = default_storage.save(\n                    f'uploads/{request.user.id}/{uploaded_file.name}',\n                    ContentFile(uploaded_file.read())\n                )\n                \n                # Create database record\n                user_file = UserFile.objects.create(\n                    user=request.user,\n                    file=file_path,\n                    original_filename=uploaded_file.name,\n                    file_size=uploaded_file.size,\n                    content_type=uploaded_file.content_type\n                )\n                \n                uploaded_files.append(user_file)\n                \n            except Exception as e:\n                errors.append(f'{uploaded_file.name}: {str(e)}')\n        \n        # Show results\n        if uploaded_files:\n            messages.success(request, f'{len(uploaded_files)} files uploaded successfully!')\n        \n        for error in errors:\n            messages.error(request, error)\n        \n        if uploaded_files:\n            return redirect('uploads:file_list')\n    \n    return render(request, 'uploads/multiple_form.html')\n","python","",[1047,1048,1049,1081,1098,1125,1152,1177,1194,1202,1210,1217,1227,1247,1261,1294,1329,1335,1349,1375,1398,1403,1410,1445,1469,1490,1495,1501,1520,1568,1586,1592,1597,1603,1626,1643,1656,1672,1688,1703,1708,1713,1751,1786,1792,1814,1819,1833,1843,1864,1893,1898,1910,1934,1956,1961,1972,1982,1987,2003,2011,2017,2047,2080,2086,2092,2098,2146,2168,2198,2203,2208,2214,2230,2268,2284,2290,2295,2301,2321,2337,2349,2365,2381,2395,2400,2405,2421,2426,2444,2492,2497,2503,2513,2552,2557,2572,2592,2597,2606,2624,2629],"code",{"__ignoreMap":1045},[1050,1051,1054,1058,1062,1066,1069,1072,1075,1078],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"siDh9","from",[1050,1059,1061],{"class":1060},"sftqT"," django",[1050,1063,1065],{"class":1064},"soVBu",".",[1050,1067,1068],{"class":1060},"shortcuts ",[1050,1070,1071],{"class":1056},"import",[1050,1073,1074],{"class":1060}," render",[1050,1076,1077],{"class":1064},",",[1050,1079,1080],{"class":1060}," redirect\n",[1050,1082,1084,1086,1088,1090,1093,1095],{"class":1052,"line":1083},2,[1050,1085,1057],{"class":1056},[1050,1087,1061],{"class":1060},[1050,1089,1065],{"class":1064},[1050,1091,1092],{"class":1060},"contrib ",[1050,1094,1071],{"class":1056},[1050,1096,1097],{"class":1060}," messages\n",[1050,1099,1101,1103,1105,1107,1110,1112,1115,1117,1120,1122],{"class":1052,"line":1100},3,[1050,1102,1057],{"class":1056},[1050,1104,1061],{"class":1060},[1050,1106,1065],{"class":1064},[1050,1108,1109],{"class":1060},"contrib",[1050,1111,1065],{"class":1064},[1050,1113,1114],{"class":1060},"auth",[1050,1116,1065],{"class":1064},[1050,1118,1119],{"class":1060},"decorators ",[1050,1121,1071],{"class":1056},[1050,1123,1124],{"class":1060}," login_required\n",[1050,1126,1128,1130,1132,1134,1137,1139,1142,1144,1147,1149],{"class":1052,"line":1127},4,[1050,1129,1057],{"class":1056},[1050,1131,1061],{"class":1060},[1050,1133,1065],{"class":1064},[1050,1135,1136],{"class":1060},"core",[1050,1138,1065],{"class":1064},[1050,1140,1141],{"class":1060},"files",[1050,1143,1065],{"class":1064},[1050,1145,1146],{"class":1060},"storage ",[1050,1148,1071],{"class":1056},[1050,1150,1151],{"class":1060}," default_storage\n",[1050,1153,1155,1157,1159,1161,1163,1165,1167,1169,1172,1174],{"class":1052,"line":1154},5,[1050,1156,1057],{"class":1056},[1050,1158,1061],{"class":1060},[1050,1160,1065],{"class":1064},[1050,1162,1136],{"class":1060},[1050,1164,1065],{"class":1064},[1050,1166,1141],{"class":1060},[1050,1168,1065],{"class":1064},[1050,1170,1171],{"class":1060},"base ",[1050,1173,1071],{"class":1056},[1050,1175,1176],{"class":1060}," ContentFile\n",[1050,1178,1180,1182,1184,1186,1189,1191],{"class":1052,"line":1179},6,[1050,1181,1057],{"class":1056},[1050,1183,1061],{"class":1060},[1050,1185,1065],{"class":1064},[1050,1187,1188],{"class":1060},"http ",[1050,1190,1071],{"class":1056},[1050,1192,1193],{"class":1060}," JsonResponse\n",[1050,1195,1197,1199],{"class":1052,"line":1196},7,[1050,1198,1071],{"class":1056},[1050,1200,1201],{"class":1060}," os\n",[1050,1203,1205,1207],{"class":1052,"line":1204},8,[1050,1206,1071],{"class":1056},[1050,1208,1209],{"class":1060}," mimetypes\n",[1050,1211,1213],{"class":1052,"line":1212},9,[1050,1214,1216],{"emptyLinePlaceholder":1215},true,"\n",[1050,1218,1220,1223],{"class":1052,"line":1219},10,[1050,1221,1222],{"class":1064},"@",[1050,1224,1226],{"class":1225},"sljsM","login_required\n",[1050,1228,1230,1234,1237,1240,1244],{"class":1052,"line":1229},11,[1050,1231,1233],{"class":1232},"s5Kfy","def",[1050,1235,1236],{"class":1225}," simple_file_upload",[1050,1238,1239],{"class":1064},"(",[1050,1241,1243],{"class":1242},"sCyAa","request",[1050,1245,1246],{"class":1064},"):\n",[1050,1248,1250,1254,1258],{"class":1052,"line":1249},12,[1050,1251,1253],{"class":1252},"sm7ve","    \"\"\"",[1050,1255,1257],{"class":1256},"sVyVU","Basic file upload handling",[1050,1259,1260],{"class":1252},"\"\"\"\n",[1050,1262,1264,1267,1270,1272,1276,1280,1284,1288,1291],{"class":1052,"line":1263},13,[1050,1265,1266],{"class":1056},"    if",[1050,1268,1269],{"class":1060}," request",[1050,1271,1065],{"class":1064},[1050,1273,1275],{"class":1274},"sBPpx","method",[1050,1277,1279],{"class":1278},"sVsLi"," ==",[1050,1281,1283],{"class":1282},"sbYkP"," '",[1050,1285,1287],{"class":1286},"sTbE_","POST",[1050,1289,1290],{"class":1282},"'",[1050,1292,1293],{"class":1064},":\n",[1050,1295,1297,1300,1303,1305,1307,1311,1313,1317,1319,1321,1324,1326],{"class":1052,"line":1296},14,[1050,1298,1299],{"class":1060},"        uploaded_file ",[1050,1301,1302],{"class":1064},"=",[1050,1304,1269],{"class":1060},[1050,1306,1065],{"class":1064},[1050,1308,1310],{"class":1309},"sFGJz","FILES",[1050,1312,1065],{"class":1064},[1050,1314,1316],{"class":1315},"siWMO","get",[1050,1318,1239],{"class":1064},[1050,1320,1290],{"class":1282},[1050,1322,1323],{"class":1286},"file",[1050,1325,1290],{"class":1282},[1050,1327,1328],{"class":1064},")\n",[1050,1330,1332],{"class":1052,"line":1331},15,[1050,1333,1334],{"class":1060},"        \n",[1050,1336,1338,1341,1344,1347],{"class":1052,"line":1337},16,[1050,1339,1340],{"class":1056},"        if",[1050,1342,1343],{"class":1278}," not",[1050,1345,1346],{"class":1060}," uploaded_file",[1050,1348,1293],{"class":1064},[1050,1350,1352,1355,1357,1360,1362,1364,1366,1368,1371,1373],{"class":1052,"line":1351},17,[1050,1353,1354],{"class":1060},"            messages",[1050,1356,1065],{"class":1064},[1050,1358,1359],{"class":1315},"error",[1050,1361,1239],{"class":1064},[1050,1363,1243],{"class":1315},[1050,1365,1077],{"class":1064},[1050,1367,1283],{"class":1282},[1050,1369,1370],{"class":1286},"No file selected.",[1050,1372,1290],{"class":1282},[1050,1374,1328],{"class":1064},[1050,1376,1378,1381,1383,1385,1387,1389,1391,1394,1396],{"class":1052,"line":1377},18,[1050,1379,1380],{"class":1056},"            return",[1050,1382,1074],{"class":1315},[1050,1384,1239],{"class":1064},[1050,1386,1243],{"class":1315},[1050,1388,1077],{"class":1064},[1050,1390,1283],{"class":1282},[1050,1392,1393],{"class":1286},"uploads/simple_form.html",[1050,1395,1290],{"class":1282},[1050,1397,1328],{"class":1064},[1050,1399,1401],{"class":1052,"line":1400},19,[1050,1402,1334],{"class":1060},[1050,1404,1406],{"class":1052,"line":1405},20,[1050,1407,1409],{"class":1408},"s9Tkl","        # Basic validation\n",[1050,1411,1413,1415,1417,1419,1422,1425,1429,1432,1435,1437,1439,1442],{"class":1052,"line":1412},21,[1050,1414,1340],{"class":1056},[1050,1416,1346],{"class":1060},[1050,1418,1065],{"class":1064},[1050,1420,1421],{"class":1274},"size",[1050,1423,1424],{"class":1278}," >",[1050,1426,1428],{"class":1427},"s7CZa"," 5",[1050,1430,1431],{"class":1278}," *",[1050,1433,1434],{"class":1427}," 1024",[1050,1436,1431],{"class":1278},[1050,1438,1434],{"class":1427},[1050,1440,1441],{"class":1064},":",[1050,1443,1444],{"class":1408},"  # 5MB limit\n",[1050,1446,1448,1450,1452,1454,1456,1458,1460,1462,1465,1467],{"class":1052,"line":1447},22,[1050,1449,1354],{"class":1060},[1050,1451,1065],{"class":1064},[1050,1453,1359],{"class":1315},[1050,1455,1239],{"class":1064},[1050,1457,1243],{"class":1315},[1050,1459,1077],{"class":1064},[1050,1461,1283],{"class":1282},[1050,1463,1464],{"class":1286},"File size must be less than 5MB.",[1050,1466,1290],{"class":1282},[1050,1468,1328],{"class":1064},[1050,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488],{"class":1052,"line":1471},23,[1050,1473,1380],{"class":1056},[1050,1475,1074],{"class":1315},[1050,1477,1239],{"class":1064},[1050,1479,1243],{"class":1315},[1050,1481,1077],{"class":1064},[1050,1483,1283],{"class":1282},[1050,1485,1393],{"class":1286},[1050,1487,1290],{"class":1282},[1050,1489,1328],{"class":1064},[1050,1491,1493],{"class":1052,"line":1492},24,[1050,1494,1334],{"class":1060},[1050,1496,1498],{"class":1052,"line":1497},25,[1050,1499,1500],{"class":1408},"        # Save file\n",[1050,1502,1504,1507,1509,1512,1514,1517],{"class":1052,"line":1503},26,[1050,1505,1506],{"class":1060},"        file_path ",[1050,1508,1302],{"class":1064},[1050,1510,1511],{"class":1060}," default_storage",[1050,1513,1065],{"class":1064},[1050,1515,1516],{"class":1315},"save",[1050,1518,1519],{"class":1064},"(\n",[1050,1521,1523,1526,1529,1533,1535,1537,1540,1542,1545,1548,1551,1553,1556,1558,1561,1563,1565],{"class":1052,"line":1522},27,[1050,1524,1525],{"class":1232},"            f",[1050,1527,1528],{"class":1286},"'uploads/",[1050,1530,1532],{"class":1531},"s3h35","{",[1050,1534,1243],{"class":1315},[1050,1536,1065],{"class":1064},[1050,1538,1539],{"class":1274},"user",[1050,1541,1065],{"class":1064},[1050,1543,1544],{"class":1274},"id",[1050,1546,1547],{"class":1531},"}",[1050,1549,1550],{"class":1286},"/",[1050,1552,1532],{"class":1531},[1050,1554,1555],{"class":1315},"uploaded_file",[1050,1557,1065],{"class":1064},[1050,1559,1560],{"class":1274},"name",[1050,1562,1547],{"class":1531},[1050,1564,1290],{"class":1286},[1050,1566,1567],{"class":1064},",\n",[1050,1569,1571,1574,1576,1578,1580,1583],{"class":1052,"line":1570},28,[1050,1572,1573],{"class":1315},"            ContentFile",[1050,1575,1239],{"class":1064},[1050,1577,1555],{"class":1315},[1050,1579,1065],{"class":1064},[1050,1581,1582],{"class":1315},"read",[1050,1584,1585],{"class":1064},"())\n",[1050,1587,1589],{"class":1052,"line":1588},29,[1050,1590,1591],{"class":1064},"        )\n",[1050,1593,1595],{"class":1052,"line":1594},30,[1050,1596,1334],{"class":1060},[1050,1598,1600],{"class":1052,"line":1599},31,[1050,1601,1602],{"class":1408},"        # Create database record\n",[1050,1604,1606,1609,1611,1614,1616,1619,1621,1624],{"class":1052,"line":1605},32,[1050,1607,1608],{"class":1060},"        user_file ",[1050,1610,1302],{"class":1064},[1050,1612,1613],{"class":1060}," UserFile",[1050,1615,1065],{"class":1064},[1050,1617,1618],{"class":1274},"objects",[1050,1620,1065],{"class":1064},[1050,1622,1623],{"class":1315},"create",[1050,1625,1519],{"class":1064},[1050,1627,1629,1633,1635,1637,1639,1641],{"class":1052,"line":1628},33,[1050,1630,1632],{"class":1631},"sqOPj","            user",[1050,1634,1302],{"class":1064},[1050,1636,1243],{"class":1315},[1050,1638,1065],{"class":1064},[1050,1640,1539],{"class":1274},[1050,1642,1567],{"class":1064},[1050,1644,1646,1649,1651,1654],{"class":1052,"line":1645},34,[1050,1647,1648],{"class":1631},"            file",[1050,1650,1302],{"class":1064},[1050,1652,1653],{"class":1315},"file_path",[1050,1655,1567],{"class":1064},[1050,1657,1659,1662,1664,1666,1668,1670],{"class":1052,"line":1658},35,[1050,1660,1661],{"class":1631},"            original_filename",[1050,1663,1302],{"class":1064},[1050,1665,1555],{"class":1315},[1050,1667,1065],{"class":1064},[1050,1669,1560],{"class":1274},[1050,1671,1567],{"class":1064},[1050,1673,1675,1678,1680,1682,1684,1686],{"class":1052,"line":1674},36,[1050,1676,1677],{"class":1631},"            file_size",[1050,1679,1302],{"class":1064},[1050,1681,1555],{"class":1315},[1050,1683,1065],{"class":1064},[1050,1685,1421],{"class":1274},[1050,1687,1567],{"class":1064},[1050,1689,1691,1694,1696,1698,1700],{"class":1052,"line":1690},37,[1050,1692,1693],{"class":1631},"            content_type",[1050,1695,1302],{"class":1064},[1050,1697,1555],{"class":1315},[1050,1699,1065],{"class":1064},[1050,1701,1702],{"class":1274},"content_type\n",[1050,1704,1706],{"class":1052,"line":1705},38,[1050,1707,1591],{"class":1064},[1050,1709,1711],{"class":1052,"line":1710},39,[1050,1712,1334],{"class":1060},[1050,1714,1716,1719,1721,1724,1726,1728,1730,1733,1736,1738,1740,1742,1744,1746,1749],{"class":1052,"line":1715},40,[1050,1717,1718],{"class":1060},"        messages",[1050,1720,1065],{"class":1064},[1050,1722,1723],{"class":1315},"success",[1050,1725,1239],{"class":1064},[1050,1727,1243],{"class":1315},[1050,1729,1077],{"class":1064},[1050,1731,1732],{"class":1232}," f",[1050,1734,1735],{"class":1286},"'File \"",[1050,1737,1532],{"class":1531},[1050,1739,1555],{"class":1315},[1050,1741,1065],{"class":1064},[1050,1743,1560],{"class":1274},[1050,1745,1547],{"class":1531},[1050,1747,1748],{"class":1286},"\" uploaded successfully!'",[1050,1750,1328],{"class":1064},[1050,1752,1754,1757,1760,1762,1764,1767,1769,1771,1774,1776,1779,1781,1784],{"class":1052,"line":1753},41,[1050,1755,1756],{"class":1056},"        return",[1050,1758,1759],{"class":1315}," redirect",[1050,1761,1239],{"class":1064},[1050,1763,1290],{"class":1282},[1050,1765,1766],{"class":1286},"uploads:file_detail",[1050,1768,1290],{"class":1282},[1050,1770,1077],{"class":1064},[1050,1772,1773],{"class":1631}," pk",[1050,1775,1302],{"class":1064},[1050,1777,1778],{"class":1315},"user_file",[1050,1780,1065],{"class":1064},[1050,1782,1783],{"class":1274},"pk",[1050,1785,1328],{"class":1064},[1050,1787,1789],{"class":1052,"line":1788},42,[1050,1790,1791],{"class":1060},"    \n",[1050,1793,1795,1798,1800,1802,1804,1806,1808,1810,1812],{"class":1052,"line":1794},43,[1050,1796,1797],{"class":1056},"    return",[1050,1799,1074],{"class":1315},[1050,1801,1239],{"class":1064},[1050,1803,1243],{"class":1315},[1050,1805,1077],{"class":1064},[1050,1807,1283],{"class":1282},[1050,1809,1393],{"class":1286},[1050,1811,1290],{"class":1282},[1050,1813,1328],{"class":1064},[1050,1815,1817],{"class":1052,"line":1816},44,[1050,1818,1216],{"emptyLinePlaceholder":1215},[1050,1820,1822,1824,1827,1829,1831],{"class":1052,"line":1821},45,[1050,1823,1233],{"class":1232},[1050,1825,1826],{"class":1225}," multiple_file_upload",[1050,1828,1239],{"class":1064},[1050,1830,1243],{"class":1242},[1050,1832,1246],{"class":1064},[1050,1834,1836,1838,1841],{"class":1052,"line":1835},46,[1050,1837,1253],{"class":1252},[1050,1839,1840],{"class":1256},"Handle multiple file uploads",[1050,1842,1260],{"class":1252},[1050,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862],{"class":1052,"line":1845},47,[1050,1847,1266],{"class":1056},[1050,1849,1269],{"class":1060},[1050,1851,1065],{"class":1064},[1050,1853,1275],{"class":1274},[1050,1855,1279],{"class":1278},[1050,1857,1283],{"class":1282},[1050,1859,1287],{"class":1286},[1050,1861,1290],{"class":1282},[1050,1863,1293],{"class":1064},[1050,1865,1867,1870,1872,1874,1876,1878,1880,1883,1885,1887,1889,1891],{"class":1052,"line":1866},48,[1050,1868,1869],{"class":1060},"        files ",[1050,1871,1302],{"class":1064},[1050,1873,1269],{"class":1060},[1050,1875,1065],{"class":1064},[1050,1877,1310],{"class":1309},[1050,1879,1065],{"class":1064},[1050,1881,1882],{"class":1315},"getlist",[1050,1884,1239],{"class":1064},[1050,1886,1290],{"class":1282},[1050,1888,1141],{"class":1286},[1050,1890,1290],{"class":1282},[1050,1892,1328],{"class":1064},[1050,1894,1896],{"class":1052,"line":1895},49,[1050,1897,1334],{"class":1060},[1050,1899,1901,1903,1905,1908],{"class":1052,"line":1900},50,[1050,1902,1340],{"class":1056},[1050,1904,1343],{"class":1278},[1050,1906,1907],{"class":1060}," files",[1050,1909,1293],{"class":1064},[1050,1911,1913,1915,1917,1919,1921,1923,1925,1927,1930,1932],{"class":1052,"line":1912},51,[1050,1914,1354],{"class":1060},[1050,1916,1065],{"class":1064},[1050,1918,1359],{"class":1315},[1050,1920,1239],{"class":1064},[1050,1922,1243],{"class":1315},[1050,1924,1077],{"class":1064},[1050,1926,1283],{"class":1282},[1050,1928,1929],{"class":1286},"No files selected.",[1050,1931,1290],{"class":1282},[1050,1933,1328],{"class":1064},[1050,1935,1937,1939,1941,1943,1945,1947,1949,1952,1954],{"class":1052,"line":1936},52,[1050,1938,1380],{"class":1056},[1050,1940,1074],{"class":1315},[1050,1942,1239],{"class":1064},[1050,1944,1243],{"class":1315},[1050,1946,1077],{"class":1064},[1050,1948,1283],{"class":1282},[1050,1950,1951],{"class":1286},"uploads/multiple_form.html",[1050,1953,1290],{"class":1282},[1050,1955,1328],{"class":1064},[1050,1957,1959],{"class":1052,"line":1958},53,[1050,1960,1334],{"class":1060},[1050,1962,1964,1967,1969],{"class":1052,"line":1963},54,[1050,1965,1966],{"class":1060},"        uploaded_files ",[1050,1968,1302],{"class":1064},[1050,1970,1971],{"class":1064}," []\n",[1050,1973,1975,1978,1980],{"class":1052,"line":1974},55,[1050,1976,1977],{"class":1060},"        errors ",[1050,1979,1302],{"class":1064},[1050,1981,1971],{"class":1064},[1050,1983,1985],{"class":1052,"line":1984},56,[1050,1986,1334],{"class":1060},[1050,1988,1990,1993,1996,1999,2001],{"class":1052,"line":1989},57,[1050,1991,1992],{"class":1056},"        for",[1050,1994,1995],{"class":1060}," uploaded_file ",[1050,1997,1998],{"class":1056},"in",[1050,2000,1907],{"class":1060},[1050,2002,1293],{"class":1064},[1050,2004,2006,2009],{"class":1052,"line":2005},58,[1050,2007,2008],{"class":1056},"            try",[1050,2010,1293],{"class":1064},[1050,2012,2014],{"class":1052,"line":2013},59,[1050,2015,2016],{"class":1408},"                # Validate each file\n",[1050,2018,2020,2023,2025,2027,2029,2031,2034,2036,2038,2040,2042,2044],{"class":1052,"line":2019},60,[1050,2021,2022],{"class":1056},"                if",[1050,2024,1346],{"class":1060},[1050,2026,1065],{"class":1064},[1050,2028,1421],{"class":1274},[1050,2030,1424],{"class":1278},[1050,2032,2033],{"class":1427}," 10",[1050,2035,1431],{"class":1278},[1050,2037,1434],{"class":1427},[1050,2039,1431],{"class":1278},[1050,2041,1434],{"class":1427},[1050,2043,1441],{"class":1064},[1050,2045,2046],{"class":1408},"  # 10MB per file\n",[1050,2048,2050,2053,2055,2058,2060,2063,2065,2067,2069,2071,2073,2075,2078],{"class":1052,"line":2049},61,[1050,2051,2052],{"class":1060},"                    errors",[1050,2054,1065],{"class":1064},[1050,2056,2057],{"class":1315},"append",[1050,2059,1239],{"class":1064},[1050,2061,2062],{"class":1232},"f",[1050,2064,1290],{"class":1286},[1050,2066,1532],{"class":1531},[1050,2068,1555],{"class":1315},[1050,2070,1065],{"class":1064},[1050,2072,1560],{"class":1274},[1050,2074,1547],{"class":1531},[1050,2076,2077],{"class":1286},": File too large (max 10MB)'",[1050,2079,1328],{"class":1064},[1050,2081,2083],{"class":1052,"line":2082},62,[1050,2084,2085],{"class":1056},"                    continue\n",[1050,2087,2089],{"class":1052,"line":2088},63,[1050,2090,2091],{"class":1060},"                \n",[1050,2093,2095],{"class":1052,"line":2094},64,[1050,2096,2097],{"class":1408},"                # Check file type\n",[1050,2099,2101,2104,2106,2109,2111,2114,2116,2118,2120,2123,2125,2127,2129,2132,2134,2136,2138,2141,2143],{"class":1052,"line":2100},65,[1050,2102,2103],{"class":1060},"                allowed_types ",[1050,2105,1302],{"class":1064},[1050,2107,2108],{"class":1064}," [",[1050,2110,1290],{"class":1282},[1050,2112,2113],{"class":1286},"image/jpeg",[1050,2115,1290],{"class":1282},[1050,2117,1077],{"class":1064},[1050,2119,1283],{"class":1282},[1050,2121,2122],{"class":1286},"image/png",[1050,2124,1290],{"class":1282},[1050,2126,1077],{"class":1064},[1050,2128,1283],{"class":1282},[1050,2130,2131],{"class":1286},"image/gif",[1050,2133,1290],{"class":1282},[1050,2135,1077],{"class":1064},[1050,2137,1283],{"class":1282},[1050,2139,2140],{"class":1286},"application/pdf",[1050,2142,1290],{"class":1282},[1050,2144,2145],{"class":1064},"]\n",[1050,2147,2149,2151,2153,2155,2158,2160,2163,2166],{"class":1052,"line":2148},66,[1050,2150,2022],{"class":1056},[1050,2152,1346],{"class":1060},[1050,2154,1065],{"class":1064},[1050,2156,2157],{"class":1274},"content_type",[1050,2159,1343],{"class":1278},[1050,2161,2162],{"class":1278}," in",[1050,2164,2165],{"class":1060}," allowed_types",[1050,2167,1293],{"class":1064},[1050,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2191,2193,2196],{"class":1052,"line":2170},67,[1050,2172,2052],{"class":1060},[1050,2174,1065],{"class":1064},[1050,2176,2057],{"class":1315},[1050,2178,1239],{"class":1064},[1050,2180,2062],{"class":1232},[1050,2182,1290],{"class":1286},[1050,2184,1532],{"class":1531},[1050,2186,1555],{"class":1315},[1050,2188,1065],{"class":1064},[1050,2190,1560],{"class":1274},[1050,2192,1547],{"class":1531},[1050,2194,2195],{"class":1286},": File type not allowed'",[1050,2197,1328],{"class":1064},[1050,2199,2201],{"class":1052,"line":2200},68,[1050,2202,2085],{"class":1056},[1050,2204,2206],{"class":1052,"line":2205},69,[1050,2207,2091],{"class":1060},[1050,2209,2211],{"class":1052,"line":2210},70,[1050,2212,2213],{"class":1408},"                # Save file\n",[1050,2215,2217,2220,2222,2224,2226,2228],{"class":1052,"line":2216},71,[1050,2218,2219],{"class":1060},"                file_path ",[1050,2221,1302],{"class":1064},[1050,2223,1511],{"class":1060},[1050,2225,1065],{"class":1064},[1050,2227,1516],{"class":1315},[1050,2229,1519],{"class":1064},[1050,2231,2233,2236,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266],{"class":1052,"line":2232},72,[1050,2234,2235],{"class":1232},"                    f",[1050,2237,1528],{"class":1286},[1050,2239,1532],{"class":1531},[1050,2241,1243],{"class":1315},[1050,2243,1065],{"class":1064},[1050,2245,1539],{"class":1274},[1050,2247,1065],{"class":1064},[1050,2249,1544],{"class":1274},[1050,2251,1547],{"class":1531},[1050,2253,1550],{"class":1286},[1050,2255,1532],{"class":1531},[1050,2257,1555],{"class":1315},[1050,2259,1065],{"class":1064},[1050,2261,1560],{"class":1274},[1050,2263,1547],{"class":1531},[1050,2265,1290],{"class":1286},[1050,2267,1567],{"class":1064},[1050,2269,2271,2274,2276,2278,2280,2282],{"class":1052,"line":2270},73,[1050,2272,2273],{"class":1315},"                    ContentFile",[1050,2275,1239],{"class":1064},[1050,2277,1555],{"class":1315},[1050,2279,1065],{"class":1064},[1050,2281,1582],{"class":1315},[1050,2283,1585],{"class":1064},[1050,2285,2287],{"class":1052,"line":2286},74,[1050,2288,2289],{"class":1064},"                )\n",[1050,2291,2293],{"class":1052,"line":2292},75,[1050,2294,2091],{"class":1060},[1050,2296,2298],{"class":1052,"line":2297},76,[1050,2299,2300],{"class":1408},"                # Create database record\n",[1050,2302,2304,2307,2309,2311,2313,2315,2317,2319],{"class":1052,"line":2303},77,[1050,2305,2306],{"class":1060},"                user_file ",[1050,2308,1302],{"class":1064},[1050,2310,1613],{"class":1060},[1050,2312,1065],{"class":1064},[1050,2314,1618],{"class":1274},[1050,2316,1065],{"class":1064},[1050,2318,1623],{"class":1315},[1050,2320,1519],{"class":1064},[1050,2322,2324,2327,2329,2331,2333,2335],{"class":1052,"line":2323},78,[1050,2325,2326],{"class":1631},"                    user",[1050,2328,1302],{"class":1064},[1050,2330,1243],{"class":1315},[1050,2332,1065],{"class":1064},[1050,2334,1539],{"class":1274},[1050,2336,1567],{"class":1064},[1050,2338,2340,2343,2345,2347],{"class":1052,"line":2339},79,[1050,2341,2342],{"class":1631},"                    file",[1050,2344,1302],{"class":1064},[1050,2346,1653],{"class":1315},[1050,2348,1567],{"class":1064},[1050,2350,2352,2355,2357,2359,2361,2363],{"class":1052,"line":2351},80,[1050,2353,2354],{"class":1631},"                    original_filename",[1050,2356,1302],{"class":1064},[1050,2358,1555],{"class":1315},[1050,2360,1065],{"class":1064},[1050,2362,1560],{"class":1274},[1050,2364,1567],{"class":1064},[1050,2366,2368,2371,2373,2375,2377,2379],{"class":1052,"line":2367},81,[1050,2369,2370],{"class":1631},"                    file_size",[1050,2372,1302],{"class":1064},[1050,2374,1555],{"class":1315},[1050,2376,1065],{"class":1064},[1050,2378,1421],{"class":1274},[1050,2380,1567],{"class":1064},[1050,2382,2384,2387,2389,2391,2393],{"class":1052,"line":2383},82,[1050,2385,2386],{"class":1631},"                    content_type",[1050,2388,1302],{"class":1064},[1050,2390,1555],{"class":1315},[1050,2392,1065],{"class":1064},[1050,2394,1702],{"class":1274},[1050,2396,2398],{"class":1052,"line":2397},83,[1050,2399,2289],{"class":1064},[1050,2401,2403],{"class":1052,"line":2402},84,[1050,2404,2091],{"class":1060},[1050,2406,2408,2411,2413,2415,2417,2419],{"class":1052,"line":2407},85,[1050,2409,2410],{"class":1060},"                uploaded_files",[1050,2412,1065],{"class":1064},[1050,2414,2057],{"class":1315},[1050,2416,1239],{"class":1064},[1050,2418,1778],{"class":1315},[1050,2420,1328],{"class":1064},[1050,2422,2424],{"class":1052,"line":2423},86,[1050,2425,2091],{"class":1060},[1050,2427,2429,2432,2436,2439,2442],{"class":1052,"line":2428},87,[1050,2430,2431],{"class":1056},"            except",[1050,2433,2435],{"class":2434},"sa2tF"," Exception",[1050,2437,2438],{"class":1056}," as",[1050,2440,2441],{"class":1060}," e",[1050,2443,1293],{"class":1064},[1050,2445,2447,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2473,2475,2478,2480,2483,2486,2488,2490],{"class":1052,"line":2446},88,[1050,2448,2449],{"class":1060},"                errors",[1050,2451,1065],{"class":1064},[1050,2453,2057],{"class":1315},[1050,2455,1239],{"class":1064},[1050,2457,2062],{"class":1232},[1050,2459,1290],{"class":1286},[1050,2461,1532],{"class":1531},[1050,2463,1555],{"class":1315},[1050,2465,1065],{"class":1064},[1050,2467,1560],{"class":1274},[1050,2469,1547],{"class":1531},[1050,2471,2472],{"class":1286},": ",[1050,2474,1532],{"class":1531},[1050,2476,2477],{"class":2434},"str",[1050,2479,1239],{"class":1064},[1050,2481,2482],{"class":1315},"e",[1050,2484,2485],{"class":1064},")",[1050,2487,1547],{"class":1531},[1050,2489,1290],{"class":1286},[1050,2491,1328],{"class":1064},[1050,2493,2495],{"class":1052,"line":2494},89,[1050,2496,1334],{"class":1060},[1050,2498,2500],{"class":1052,"line":2499},90,[1050,2501,2502],{"class":1408},"        # Show results\n",[1050,2504,2506,2508,2511],{"class":1052,"line":2505},91,[1050,2507,1340],{"class":1056},[1050,2509,2510],{"class":1060}," uploaded_files",[1050,2512,1293],{"class":1064},[1050,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534,2538,2540,2543,2545,2547,2550],{"class":1052,"line":2515},92,[1050,2517,1354],{"class":1060},[1050,2519,1065],{"class":1064},[1050,2521,1723],{"class":1315},[1050,2523,1239],{"class":1064},[1050,2525,1243],{"class":1315},[1050,2527,1077],{"class":1064},[1050,2529,1732],{"class":1232},[1050,2531,1290],{"class":1286},[1050,2533,1532],{"class":1531},[1050,2535,2537],{"class":2536},"sJdAF","len",[1050,2539,1239],{"class":1064},[1050,2541,2542],{"class":1315},"uploaded_files",[1050,2544,2485],{"class":1064},[1050,2546,1547],{"class":1531},[1050,2548,2549],{"class":1286}," files uploaded successfully!'",[1050,2551,1328],{"class":1064},[1050,2553,2555],{"class":1052,"line":2554},93,[1050,2556,1334],{"class":1060},[1050,2558,2560,2562,2565,2567,2570],{"class":1052,"line":2559},94,[1050,2561,1992],{"class":1056},[1050,2563,2564],{"class":1060}," error ",[1050,2566,1998],{"class":1056},[1050,2568,2569],{"class":1060}," errors",[1050,2571,1293],{"class":1064},[1050,2573,2575,2577,2579,2581,2583,2585,2587,2590],{"class":1052,"line":2574},95,[1050,2576,1354],{"class":1060},[1050,2578,1065],{"class":1064},[1050,2580,1359],{"class":1315},[1050,2582,1239],{"class":1064},[1050,2584,1243],{"class":1315},[1050,2586,1077],{"class":1064},[1050,2588,2589],{"class":1315}," error",[1050,2591,1328],{"class":1064},[1050,2593,2595],{"class":1052,"line":2594},96,[1050,2596,1334],{"class":1060},[1050,2598,2600,2602,2604],{"class":1052,"line":2599},97,[1050,2601,1340],{"class":1056},[1050,2603,2510],{"class":1060},[1050,2605,1293],{"class":1064},[1050,2607,2609,2611,2613,2615,2617,2620,2622],{"class":1052,"line":2608},98,[1050,2610,1380],{"class":1056},[1050,2612,1759],{"class":1315},[1050,2614,1239],{"class":1064},[1050,2616,1290],{"class":1282},[1050,2618,2619],{"class":1286},"uploads:file_list",[1050,2621,1290],{"class":1282},[1050,2623,1328],{"class":1064},[1050,2625,2627],{"class":1052,"line":2626},99,[1050,2628,1791],{"class":1060},[1050,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648],{"class":1052,"line":2631},100,[1050,2633,1797],{"class":1056},[1050,2635,1074],{"class":1315},[1050,2637,1239],{"class":1064},[1050,2639,1243],{"class":1315},[1050,2641,1077],{"class":1064},[1050,2643,1283],{"class":1282},[1050,2645,1951],{"class":1286},[1050,2647,1290],{"class":1282},[1050,2649,1328],{"class":1064},[1035,2651,2653],{"id":2652},"file-upload-models","File Upload Models",[1040,2655,2657],{"className":1042,"code":2656,"language":1044,"meta":1045,"style":1045},"# models.py\nfrom django.db import models\nfrom django.contrib.auth.models import User\nfrom django.core.validators import FileExtensionValidator\nimport os\nimport uuid\n\ndef user_upload_path(instance, filename):\n    \"\"\"Generate upload path for user files\"\"\"\n    # Create unique filename to avoid conflicts\n    ext = filename.split('.')[-1]\n    filename = f'{uuid.uuid4().hex}.{ext}'\n    return f'uploads/{instance.user.id}/{filename}'\n\ndef image_upload_path(instance, filename):\n    \"\"\"Generate upload path for images with date organization\"\"\"\n    ext = filename.split('.')[-1]\n    filename = f'{uuid.uuid4().hex}.{ext}'\n    return f'images/{instance.created_at.year}/{instance.created_at.month:02d}/{filename}'\n\nclass UserFile(models.Model):\n    \"\"\"Model for user-uploaded files\"\"\"\n    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='files')\n    file = models.FileField(upload_to=user_upload_path)\n    original_filename = models.CharField(max_length=255)\n    file_size = models.PositiveIntegerField()\n    content_type = models.CharField(max_length=100)\n    description = models.TextField(blank=True)\n    \n    # Metadata\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n    is_public = models.BooleanField(default=False)\n    download_count = models.PositiveIntegerField(default=0)\n    \n    class Meta:\n        ordering = ['-created_at']\n    \n    def __str__(self):\n        return self.original_filename\n    \n    def get_file_extension(self):\n        return os.path.splitext(self.original_filename)[1].lower()\n    \n    def is_image(self):\n        return self.content_type.startswith('image/')\n    \n    def get_file_size_display(self):\n        \"\"\"Human-readable file size\"\"\"\n        size = self.file_size\n        for unit in ['B', 'KB', 'MB', 'GB']:\n            if size \u003C 1024:\n                return f\"{size:.1f} {unit}\"\n            size /= 1024\n        return f\"{size:.1f} TB\"\n\nclass ImageUpload(models.Model):\n    \"\"\"Model specifically for image uploads with processing\"\"\"\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    title = models.CharField(max_length=200, blank=True)\n    \n    # Original image\n    image = models.ImageField(\n        upload_to=image_upload_path,\n        validators=[FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'gif'])]\n    )\n    \n    # Processed versions (auto-generated)\n    thumbnail = models.ImageField(upload_to='thumbnails/', blank=True, null=True)\n    medium = models.ImageField(upload_to='medium/', blank=True, null=True)\n    \n    # Metadata\n    width = models.PositiveIntegerField(blank=True, null=True)\n    height = models.PositiveIntegerField(blank=True, null=True)\n    alt_text = models.CharField(max_length=200, blank=True)\n    \n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    def save(self, *args, **kwargs):\n        super().save(*args, **kwargs)\n        \n        if self.image:\n            # Get image dimensions\n            from PIL import Image\n            with Image.open(self.image.path) as img:\n                self.width, self.height = img.size\n            \n            # Generate processed versions\n            self.create_thumbnail()\n            self.create_medium_version()\n            \n            # Save again with dimensions\n            super().save(update_fields=['width', 'height', 'thumbnail', 'medium'])\n    \n    def create_thumbnail(self, size=(150, 150)):\n        \"\"\"Create thumbnail version\"\"\"\n        if not self.image:\n            return\n        \n        from PIL import Image\n        import io\n        from django.core.files.base import ContentFile\n        \n        # Open image\n        image = Image.open(self.image.path)\n        \n        # Create thumbnail\n        image.thumbnail(size, Image.Resampling.LANCZOS)\n        \n        # Save to BytesIO\n        thumb_io = io.BytesIO()\n        image.save(thumb_io, format='JPEG', quality=85)\n        thumb_io.seek(0)\n        \n        # Generate filename\n        thumb_name = f\"thumb_{os.path.basename(self.image.name)}\"\n        thumb_name = os.path.splitext(thumb_name)[0] + '.jpg'\n        \n        # Save to model\n        self.thumbnail.save(\n            thumb_name,\n            ContentFile(thumb_io.read()),\n            save=False\n        )\n    \n    def create_medium_version(self, size=(800, 600)):\n        \"\"\"Create medium-sized version\"\"\"\n        if not self.image:\n            return\n        \n        from PIL import Image\n        import io\n        from django.core.files.base import ContentFile\n        \n        # Open image\n        image = Image.open(self.image.path)\n        \n        # Resize maintaining aspect ratio\n        image.thumbnail(size, Image.Resampling.LANCZOS)\n        \n        # Save to BytesIO\n        medium_io = io.BytesIO()\n        image.save(medium_io, format='JPEG', quality=90)\n        medium_io.seek(0)\n        \n        # Generate filename\n        medium_name = f\"medium_{os.path.basename(self.image.name)}\"\n        medium_name = os.path.splitext(medium_name)[0] + '.jpg'\n        \n        # Save to model\n        self.medium.save(\n            medium_name,\n            ContentFile(medium_io.read()),\n            save=False\n        )\n\nclass Document(models.Model):\n    \"\"\"Model for document uploads with validation\"\"\"\n    DOCUMENT_TYPES = [\n        ('pdf', 'PDF Document'),\n        ('doc', 'Word Document'),\n        ('xls', 'Excel Spreadsheet'),\n        ('ppt', 'PowerPoint Presentation'),\n        ('txt', 'Text File'),\n    ]\n    \n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    title = models.CharField(max_length=200)\n    document_type = models.CharField(max_length=10, choices=DOCUMENT_TYPES)\n    \n    file = models.FileField(\n        upload_to='documents/',\n        validators=[\n            FileExtensionValidator(\n                allowed_extensions=['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt']\n            )\n        ]\n    )\n    \n    description = models.TextField(blank=True)\n    tags = models.CharField(max_length=200, blank=True, help_text=\"Comma-separated tags\")\n    \n    # Access control\n    is_private = models.BooleanField(default=True)\n    allowed_users = models.ManyToManyField(User, blank=True, related_name='accessible_documents')\n    \n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    def save(self, *args, **kwargs):\n        # Auto-detect document type from file extension\n        if self.file:\n            ext = os.path.splitext(self.file.name)[1].lower()\n            type_mapping = {\n                '.pdf': 'pdf',\n                '.doc': 'doc', '.docx': 'doc',\n                '.xls': 'xls', '.xlsx': 'xls',\n                '.ppt': 'ppt', '.pptx': 'ppt',\n                '.txt': 'txt',\n            }\n            self.document_type = type_mapping.get(ext, 'txt')\n        \n        super().save(*args, **kwargs)\n",[1047,2658,2659,2664,2680,2704,2724,2730,2737,2741,2760,2769,2774,2807,2848,2881,2885,2902,2911,2939,2973,3028,3032,3053,3062,3111,3139,3165,3182,3206,3233,3237,3242,3267,3291,3317,3341,3345,3355,3373,3377,3393,3406,3410,3423,3461,3465,3478,3504,3508,3521,3531,3545,3593,3608,3638,3649,3668,3672,3689,3698,3728,3761,3765,3770,3786,3798,3853,3858,3862,3867,3912,3956,3960,3964,3995,4026,4057,4061,4083,4087,4115,4139,4143,4156,4161,4175,4209,4237,4242,4247,4259,4270,4274,4279,4330,4334,4365,4374,4388,4393,4397,4408,4417,4440,4445,4451,4479,4484,4490,4520,4525,4531,4549,4589,4606,4611,4617,4662,4701,4706,4712,4728,4736,4752,4763,4768,4773,4803,4813,4828,4833,4838,4849,4856,4879,4884,4889,4916,4921,4927,4954,4959,4964,4980,5017,5033,5038,5043,5086,5122,5127,5132,5147,5155,5170,5179,5184,5189,5207,5217,5228,5253,5276,5299,5322,5345,5351,5356,5387,5410,5446,5451,5466,5482,5490,5498,5573,5579,5585,5590,5595,5618,5664,5669,5675,5699,5741,5746,5769,5774,5799,5805,5818,5858,5869,5890,5927,5964,6001,6021,6027,6060,6065],{"__ignoreMap":1045},[1050,2660,2661],{"class":1052,"line":1053},[1050,2662,2663],{"class":1408},"# models.py\n",[1050,2665,2666,2668,2670,2672,2675,2677],{"class":1052,"line":1083},[1050,2667,1057],{"class":1056},[1050,2669,1061],{"class":1060},[1050,2671,1065],{"class":1064},[1050,2673,2674],{"class":1060},"db ",[1050,2676,1071],{"class":1056},[1050,2678,2679],{"class":1060}," models\n",[1050,2681,2682,2684,2686,2688,2690,2692,2694,2696,2699,2701],{"class":1052,"line":1100},[1050,2683,1057],{"class":1056},[1050,2685,1061],{"class":1060},[1050,2687,1065],{"class":1064},[1050,2689,1109],{"class":1060},[1050,2691,1065],{"class":1064},[1050,2693,1114],{"class":1060},[1050,2695,1065],{"class":1064},[1050,2697,2698],{"class":1060},"models ",[1050,2700,1071],{"class":1056},[1050,2702,2703],{"class":1060}," User\n",[1050,2705,2706,2708,2710,2712,2714,2716,2719,2721],{"class":1052,"line":1127},[1050,2707,1057],{"class":1056},[1050,2709,1061],{"class":1060},[1050,2711,1065],{"class":1064},[1050,2713,1136],{"class":1060},[1050,2715,1065],{"class":1064},[1050,2717,2718],{"class":1060},"validators ",[1050,2720,1071],{"class":1056},[1050,2722,2723],{"class":1060}," FileExtensionValidator\n",[1050,2725,2726,2728],{"class":1052,"line":1154},[1050,2727,1071],{"class":1056},[1050,2729,1201],{"class":1060},[1050,2731,2732,2734],{"class":1052,"line":1179},[1050,2733,1071],{"class":1056},[1050,2735,2736],{"class":1060}," uuid\n",[1050,2738,2739],{"class":1052,"line":1196},[1050,2740,1216],{"emptyLinePlaceholder":1215},[1050,2742,2743,2745,2748,2750,2753,2755,2758],{"class":1052,"line":1204},[1050,2744,1233],{"class":1232},[1050,2746,2747],{"class":1225}," user_upload_path",[1050,2749,1239],{"class":1064},[1050,2751,2752],{"class":1242},"instance",[1050,2754,1077],{"class":1064},[1050,2756,2757],{"class":1242}," filename",[1050,2759,1246],{"class":1064},[1050,2761,2762,2764,2767],{"class":1052,"line":1212},[1050,2763,1253],{"class":1252},[1050,2765,2766],{"class":1256},"Generate upload path for user files",[1050,2768,1260],{"class":1252},[1050,2770,2771],{"class":1052,"line":1219},[1050,2772,2773],{"class":1408},"    # Create unique filename to avoid conflicts\n",[1050,2775,2776,2779,2781,2783,2785,2788,2790,2792,2794,2796,2799,2802,2805],{"class":1052,"line":1229},[1050,2777,2778],{"class":1060},"    ext ",[1050,2780,1302],{"class":1064},[1050,2782,2757],{"class":1060},[1050,2784,1065],{"class":1064},[1050,2786,2787],{"class":1315},"split",[1050,2789,1239],{"class":1064},[1050,2791,1290],{"class":1282},[1050,2793,1065],{"class":1286},[1050,2795,1290],{"class":1282},[1050,2797,2798],{"class":1064},")[",[1050,2800,2801],{"class":1278},"-",[1050,2803,2804],{"class":1427},"1",[1050,2806,2145],{"class":1064},[1050,2808,2809,2812,2814,2816,2818,2820,2823,2825,2828,2831,2834,2836,2838,2840,2843,2845],{"class":1052,"line":1249},[1050,2810,2811],{"class":1060},"    filename ",[1050,2813,1302],{"class":1064},[1050,2815,1732],{"class":1232},[1050,2817,1290],{"class":1286},[1050,2819,1532],{"class":1531},[1050,2821,2822],{"class":1060},"uuid",[1050,2824,1065],{"class":1064},[1050,2826,2827],{"class":1315},"uuid4",[1050,2829,2830],{"class":1064},"().",[1050,2832,2833],{"class":1274},"hex",[1050,2835,1547],{"class":1531},[1050,2837,1065],{"class":1286},[1050,2839,1532],{"class":1531},[1050,2841,2842],{"class":1060},"ext",[1050,2844,1547],{"class":1531},[1050,2846,2847],{"class":1286},"'\n",[1050,2849,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2877,2879],{"class":1052,"line":1263},[1050,2851,1797],{"class":1056},[1050,2853,1732],{"class":1232},[1050,2855,1528],{"class":1286},[1050,2857,1532],{"class":1531},[1050,2859,2752],{"class":1060},[1050,2861,1065],{"class":1064},[1050,2863,1539],{"class":1274},[1050,2865,1065],{"class":1064},[1050,2867,1544],{"class":1274},[1050,2869,1547],{"class":1531},[1050,2871,1550],{"class":1286},[1050,2873,1532],{"class":1531},[1050,2875,2876],{"class":1060},"filename",[1050,2878,1547],{"class":1531},[1050,2880,2847],{"class":1286},[1050,2882,2883],{"class":1052,"line":1296},[1050,2884,1216],{"emptyLinePlaceholder":1215},[1050,2886,2887,2889,2892,2894,2896,2898,2900],{"class":1052,"line":1331},[1050,2888,1233],{"class":1232},[1050,2890,2891],{"class":1225}," image_upload_path",[1050,2893,1239],{"class":1064},[1050,2895,2752],{"class":1242},[1050,2897,1077],{"class":1064},[1050,2899,2757],{"class":1242},[1050,2901,1246],{"class":1064},[1050,2903,2904,2906,2909],{"class":1052,"line":1337},[1050,2905,1253],{"class":1252},[1050,2907,2908],{"class":1256},"Generate upload path for images with date organization",[1050,2910,1260],{"class":1252},[1050,2912,2913,2915,2917,2919,2921,2923,2925,2927,2929,2931,2933,2935,2937],{"class":1052,"line":1351},[1050,2914,2778],{"class":1060},[1050,2916,1302],{"class":1064},[1050,2918,2757],{"class":1060},[1050,2920,1065],{"class":1064},[1050,2922,2787],{"class":1315},[1050,2924,1239],{"class":1064},[1050,2926,1290],{"class":1282},[1050,2928,1065],{"class":1286},[1050,2930,1290],{"class":1282},[1050,2932,2798],{"class":1064},[1050,2934,2801],{"class":1278},[1050,2936,2804],{"class":1427},[1050,2938,2145],{"class":1064},[1050,2940,2941,2943,2945,2947,2949,2951,2953,2955,2957,2959,2961,2963,2965,2967,2969,2971],{"class":1052,"line":1377},[1050,2942,2811],{"class":1060},[1050,2944,1302],{"class":1064},[1050,2946,1732],{"class":1232},[1050,2948,1290],{"class":1286},[1050,2950,1532],{"class":1531},[1050,2952,2822],{"class":1060},[1050,2954,1065],{"class":1064},[1050,2956,2827],{"class":1315},[1050,2958,2830],{"class":1064},[1050,2960,2833],{"class":1274},[1050,2962,1547],{"class":1531},[1050,2964,1065],{"class":1286},[1050,2966,1532],{"class":1531},[1050,2968,2842],{"class":1060},[1050,2970,1547],{"class":1531},[1050,2972,2847],{"class":1286},[1050,2974,2975,2977,2979,2982,2984,2986,2988,2991,2993,2996,2998,3000,3002,3004,3006,3008,3010,3013,3016,3018,3020,3022,3024,3026],{"class":1052,"line":1400},[1050,2976,1797],{"class":1056},[1050,2978,1732],{"class":1232},[1050,2980,2981],{"class":1286},"'images/",[1050,2983,1532],{"class":1531},[1050,2985,2752],{"class":1060},[1050,2987,1065],{"class":1064},[1050,2989,2990],{"class":1274},"created_at",[1050,2992,1065],{"class":1064},[1050,2994,2995],{"class":1274},"year",[1050,2997,1547],{"class":1531},[1050,2999,1550],{"class":1286},[1050,3001,1532],{"class":1531},[1050,3003,2752],{"class":1060},[1050,3005,1065],{"class":1064},[1050,3007,2990],{"class":1274},[1050,3009,1065],{"class":1064},[1050,3011,3012],{"class":1274},"month",[1050,3014,3015],{"class":1232},":02d",[1050,3017,1547],{"class":1531},[1050,3019,1550],{"class":1286},[1050,3021,1532],{"class":1531},[1050,3023,2876],{"class":1060},[1050,3025,1547],{"class":1531},[1050,3027,2847],{"class":1286},[1050,3029,3030],{"class":1052,"line":1405},[1050,3031,1216],{"emptyLinePlaceholder":1215},[1050,3033,3034,3037,3040,3042,3046,3048,3051],{"class":1052,"line":1412},[1050,3035,3036],{"class":1232},"class",[1050,3038,1613],{"class":3039},"sD-vU",[1050,3041,1239],{"class":1064},[1050,3043,3045],{"class":3044},"sYn-s","models",[1050,3047,1065],{"class":1064},[1050,3049,3050],{"class":3044},"Model",[1050,3052,1246],{"class":1064},[1050,3054,3055,3057,3060],{"class":1052,"line":1447},[1050,3056,1253],{"class":1252},[1050,3058,3059],{"class":1256},"Model for user-uploaded files",[1050,3061,1260],{"class":1252},[1050,3063,3064,3067,3069,3072,3074,3077,3079,3082,3084,3087,3089,3091,3093,3096,3098,3101,3103,3105,3107,3109],{"class":1052,"line":1471},[1050,3065,3066],{"class":1060},"    user ",[1050,3068,1302],{"class":1064},[1050,3070,3071],{"class":1060}," models",[1050,3073,1065],{"class":1064},[1050,3075,3076],{"class":1315},"ForeignKey",[1050,3078,1239],{"class":1064},[1050,3080,3081],{"class":1315},"User",[1050,3083,1077],{"class":1064},[1050,3085,3086],{"class":1631}," on_delete",[1050,3088,1302],{"class":1064},[1050,3090,3045],{"class":1315},[1050,3092,1065],{"class":1064},[1050,3094,3095],{"class":1309},"CASCADE",[1050,3097,1077],{"class":1064},[1050,3099,3100],{"class":1631}," related_name",[1050,3102,1302],{"class":1064},[1050,3104,1290],{"class":1282},[1050,3106,1141],{"class":1286},[1050,3108,1290],{"class":1282},[1050,3110,1328],{"class":1064},[1050,3112,3113,3117,3120,3122,3124,3127,3129,3132,3134,3137],{"class":1052,"line":1492},[1050,3114,3116],{"class":3115},"sSC40","    file",[1050,3118,3119],{"class":1064}," =",[1050,3121,3071],{"class":1060},[1050,3123,1065],{"class":1064},[1050,3125,3126],{"class":1315},"FileField",[1050,3128,1239],{"class":1064},[1050,3130,3131],{"class":1631},"upload_to",[1050,3133,1302],{"class":1064},[1050,3135,3136],{"class":1315},"user_upload_path",[1050,3138,1328],{"class":1064},[1050,3140,3141,3144,3146,3148,3150,3153,3155,3158,3160,3163],{"class":1052,"line":1497},[1050,3142,3143],{"class":1060},"    original_filename ",[1050,3145,1302],{"class":1064},[1050,3147,3071],{"class":1060},[1050,3149,1065],{"class":1064},[1050,3151,3152],{"class":1315},"CharField",[1050,3154,1239],{"class":1064},[1050,3156,3157],{"class":1631},"max_length",[1050,3159,1302],{"class":1064},[1050,3161,3162],{"class":1427},"255",[1050,3164,1328],{"class":1064},[1050,3166,3167,3170,3172,3174,3176,3179],{"class":1052,"line":1503},[1050,3168,3169],{"class":1060},"    file_size ",[1050,3171,1302],{"class":1064},[1050,3173,3071],{"class":1060},[1050,3175,1065],{"class":1064},[1050,3177,3178],{"class":1315},"PositiveIntegerField",[1050,3180,3181],{"class":1064},"()\n",[1050,3183,3184,3187,3189,3191,3193,3195,3197,3199,3201,3204],{"class":1052,"line":1522},[1050,3185,3186],{"class":1060},"    content_type ",[1050,3188,1302],{"class":1064},[1050,3190,3071],{"class":1060},[1050,3192,1065],{"class":1064},[1050,3194,3152],{"class":1315},[1050,3196,1239],{"class":1064},[1050,3198,3157],{"class":1631},[1050,3200,1302],{"class":1064},[1050,3202,3203],{"class":1427},"100",[1050,3205,1328],{"class":1064},[1050,3207,3208,3211,3213,3215,3217,3220,3222,3225,3227,3231],{"class":1052,"line":1570},[1050,3209,3210],{"class":1060},"    description ",[1050,3212,1302],{"class":1064},[1050,3214,3071],{"class":1060},[1050,3216,1065],{"class":1064},[1050,3218,3219],{"class":1315},"TextField",[1050,3221,1239],{"class":1064},[1050,3223,3224],{"class":1631},"blank",[1050,3226,1302],{"class":1064},[1050,3228,3230],{"class":3229},"s8XtY","True",[1050,3232,1328],{"class":1064},[1050,3234,3235],{"class":1052,"line":1588},[1050,3236,1791],{"class":1060},[1050,3238,3239],{"class":1052,"line":1594},[1050,3240,3241],{"class":1408},"    # Metadata\n",[1050,3243,3244,3247,3249,3251,3253,3256,3258,3261,3263,3265],{"class":1052,"line":1599},[1050,3245,3246],{"class":1060},"    created_at ",[1050,3248,1302],{"class":1064},[1050,3250,3071],{"class":1060},[1050,3252,1065],{"class":1064},[1050,3254,3255],{"class":1315},"DateTimeField",[1050,3257,1239],{"class":1064},[1050,3259,3260],{"class":1631},"auto_now_add",[1050,3262,1302],{"class":1064},[1050,3264,3230],{"class":3229},[1050,3266,1328],{"class":1064},[1050,3268,3269,3272,3274,3276,3278,3280,3282,3285,3287,3289],{"class":1052,"line":1605},[1050,3270,3271],{"class":1060},"    updated_at ",[1050,3273,1302],{"class":1064},[1050,3275,3071],{"class":1060},[1050,3277,1065],{"class":1064},[1050,3279,3255],{"class":1315},[1050,3281,1239],{"class":1064},[1050,3283,3284],{"class":1631},"auto_now",[1050,3286,1302],{"class":1064},[1050,3288,3230],{"class":3229},[1050,3290,1328],{"class":1064},[1050,3292,3293,3296,3298,3300,3302,3305,3307,3310,3312,3315],{"class":1052,"line":1628},[1050,3294,3295],{"class":1060},"    is_public ",[1050,3297,1302],{"class":1064},[1050,3299,3071],{"class":1060},[1050,3301,1065],{"class":1064},[1050,3303,3304],{"class":1315},"BooleanField",[1050,3306,1239],{"class":1064},[1050,3308,3309],{"class":1631},"default",[1050,3311,1302],{"class":1064},[1050,3313,3314],{"class":3229},"False",[1050,3316,1328],{"class":1064},[1050,3318,3319,3322,3324,3326,3328,3330,3332,3334,3336,3339],{"class":1052,"line":1645},[1050,3320,3321],{"class":1060},"    download_count ",[1050,3323,1302],{"class":1064},[1050,3325,3071],{"class":1060},[1050,3327,1065],{"class":1064},[1050,3329,3178],{"class":1315},[1050,3331,1239],{"class":1064},[1050,3333,3309],{"class":1631},[1050,3335,1302],{"class":1064},[1050,3337,3338],{"class":1427},"0",[1050,3340,1328],{"class":1064},[1050,3342,3343],{"class":1052,"line":1658},[1050,3344,1791],{"class":1060},[1050,3346,3347,3350,3353],{"class":1052,"line":1674},[1050,3348,3349],{"class":1232},"    class",[1050,3351,3352],{"class":3039}," Meta",[1050,3354,1293],{"class":1064},[1050,3356,3357,3360,3362,3364,3366,3369,3371],{"class":1052,"line":1690},[1050,3358,3359],{"class":1060},"        ordering ",[1050,3361,1302],{"class":1064},[1050,3363,2108],{"class":1064},[1050,3365,1290],{"class":1282},[1050,3367,3368],{"class":1286},"-created_at",[1050,3370,1290],{"class":1282},[1050,3372,2145],{"class":1064},[1050,3374,3375],{"class":1052,"line":1705},[1050,3376,1791],{"class":1060},[1050,3378,3379,3382,3385,3387,3391],{"class":1052,"line":1710},[1050,3380,3381],{"class":1232},"    def",[1050,3383,3384],{"class":2536}," __str__",[1050,3386,1239],{"class":1064},[1050,3388,3390],{"class":3389},"sRjD_","self",[1050,3392,1246],{"class":1064},[1050,3394,3395,3397,3401,3403],{"class":1052,"line":1715},[1050,3396,1756],{"class":1056},[1050,3398,3400],{"class":3399},"se3Ec"," self",[1050,3402,1065],{"class":1064},[1050,3404,3405],{"class":1274},"original_filename\n",[1050,3407,3408],{"class":1052,"line":1753},[1050,3409,1791],{"class":1060},[1050,3411,3412,3414,3417,3419,3421],{"class":1052,"line":1788},[1050,3413,3381],{"class":1232},[1050,3415,3416],{"class":1225}," get_file_extension",[1050,3418,1239],{"class":1064},[1050,3420,3390],{"class":3389},[1050,3422,1246],{"class":1064},[1050,3424,3425,3427,3430,3432,3435,3437,3440,3442,3444,3446,3449,3451,3453,3456,3459],{"class":1052,"line":1794},[1050,3426,1756],{"class":1056},[1050,3428,3429],{"class":1060}," os",[1050,3431,1065],{"class":1064},[1050,3433,3434],{"class":1274},"path",[1050,3436,1065],{"class":1064},[1050,3438,3439],{"class":1315},"splitext",[1050,3441,1239],{"class":1064},[1050,3443,3390],{"class":3399},[1050,3445,1065],{"class":1064},[1050,3447,3448],{"class":1274},"original_filename",[1050,3450,2798],{"class":1064},[1050,3452,2804],{"class":1427},[1050,3454,3455],{"class":1064},"].",[1050,3457,3458],{"class":1315},"lower",[1050,3460,3181],{"class":1064},[1050,3462,3463],{"class":1052,"line":1816},[1050,3464,1791],{"class":1060},[1050,3466,3467,3469,3472,3474,3476],{"class":1052,"line":1821},[1050,3468,3381],{"class":1232},[1050,3470,3471],{"class":1225}," is_image",[1050,3473,1239],{"class":1064},[1050,3475,3390],{"class":3389},[1050,3477,1246],{"class":1064},[1050,3479,3480,3482,3484,3486,3488,3490,3493,3495,3497,3500,3502],{"class":1052,"line":1835},[1050,3481,1756],{"class":1056},[1050,3483,3400],{"class":3399},[1050,3485,1065],{"class":1064},[1050,3487,2157],{"class":1274},[1050,3489,1065],{"class":1064},[1050,3491,3492],{"class":1315},"startswith",[1050,3494,1239],{"class":1064},[1050,3496,1290],{"class":1282},[1050,3498,3499],{"class":1286},"image/",[1050,3501,1290],{"class":1282},[1050,3503,1328],{"class":1064},[1050,3505,3506],{"class":1052,"line":1845},[1050,3507,1791],{"class":1060},[1050,3509,3510,3512,3515,3517,3519],{"class":1052,"line":1866},[1050,3511,3381],{"class":1232},[1050,3513,3514],{"class":1225}," get_file_size_display",[1050,3516,1239],{"class":1064},[1050,3518,3390],{"class":3389},[1050,3520,1246],{"class":1064},[1050,3522,3523,3526,3529],{"class":1052,"line":1895},[1050,3524,3525],{"class":1252},"        \"\"\"",[1050,3527,3528],{"class":1256},"Human-readable file size",[1050,3530,1260],{"class":1252},[1050,3532,3533,3536,3538,3540,3542],{"class":1052,"line":1900},[1050,3534,3535],{"class":1060},"        size ",[1050,3537,1302],{"class":1064},[1050,3539,3400],{"class":3399},[1050,3541,1065],{"class":1064},[1050,3543,3544],{"class":1274},"file_size\n",[1050,3546,3547,3549,3552,3554,3556,3558,3561,3563,3565,3567,3570,3572,3574,3576,3579,3581,3583,3585,3588,3590],{"class":1052,"line":1912},[1050,3548,1992],{"class":1056},[1050,3550,3551],{"class":1060}," unit ",[1050,3553,1998],{"class":1056},[1050,3555,2108],{"class":1064},[1050,3557,1290],{"class":1282},[1050,3559,3560],{"class":1286},"B",[1050,3562,1290],{"class":1282},[1050,3564,1077],{"class":1064},[1050,3566,1283],{"class":1282},[1050,3568,3569],{"class":1286},"KB",[1050,3571,1290],{"class":1282},[1050,3573,1077],{"class":1064},[1050,3575,1283],{"class":1282},[1050,3577,3578],{"class":1286},"MB",[1050,3580,1290],{"class":1282},[1050,3582,1077],{"class":1064},[1050,3584,1283],{"class":1282},[1050,3586,3587],{"class":1286},"GB",[1050,3589,1290],{"class":1282},[1050,3591,3592],{"class":1064},"]:\n",[1050,3594,3595,3598,3601,3604,3606],{"class":1052,"line":1936},[1050,3596,3597],{"class":1056},"            if",[1050,3599,3600],{"class":1060}," size ",[1050,3602,3603],{"class":1278},"\u003C",[1050,3605,1434],{"class":1427},[1050,3607,1293],{"class":1064},[1050,3609,3610,3613,3615,3618,3620,3622,3625,3627,3630,3633,3635],{"class":1052,"line":1958},[1050,3611,3612],{"class":1056},"                return",[1050,3614,1732],{"class":1232},[1050,3616,3617],{"class":1286},"\"",[1050,3619,1532],{"class":1531},[1050,3621,1421],{"class":1060},[1050,3623,3624],{"class":1232},":.1f",[1050,3626,1547],{"class":1531},[1050,3628,3629],{"class":1531}," {",[1050,3631,3632],{"class":1060},"unit",[1050,3634,1547],{"class":1531},[1050,3636,3637],{"class":1286},"\"\n",[1050,3639,3640,3643,3646],{"class":1052,"line":1963},[1050,3641,3642],{"class":1060},"            size ",[1050,3644,3645],{"class":1064},"/=",[1050,3647,3648],{"class":1427}," 1024\n",[1050,3650,3651,3653,3655,3657,3659,3661,3663,3665],{"class":1052,"line":1974},[1050,3652,1756],{"class":1056},[1050,3654,1732],{"class":1232},[1050,3656,3617],{"class":1286},[1050,3658,1532],{"class":1531},[1050,3660,1421],{"class":1060},[1050,3662,3624],{"class":1232},[1050,3664,1547],{"class":1531},[1050,3666,3667],{"class":1286}," TB\"\n",[1050,3669,3670],{"class":1052,"line":1984},[1050,3671,1216],{"emptyLinePlaceholder":1215},[1050,3673,3674,3676,3679,3681,3683,3685,3687],{"class":1052,"line":1989},[1050,3675,3036],{"class":1232},[1050,3677,3678],{"class":3039}," ImageUpload",[1050,3680,1239],{"class":1064},[1050,3682,3045],{"class":3044},[1050,3684,1065],{"class":1064},[1050,3686,3050],{"class":3044},[1050,3688,1246],{"class":1064},[1050,3690,3691,3693,3696],{"class":1052,"line":2005},[1050,3692,1253],{"class":1252},[1050,3694,3695],{"class":1256},"Model specifically for image uploads with processing",[1050,3697,1260],{"class":1252},[1050,3699,3700,3702,3704,3706,3708,3710,3712,3714,3716,3718,3720,3722,3724,3726],{"class":1052,"line":2013},[1050,3701,3066],{"class":1060},[1050,3703,1302],{"class":1064},[1050,3705,3071],{"class":1060},[1050,3707,1065],{"class":1064},[1050,3709,3076],{"class":1315},[1050,3711,1239],{"class":1064},[1050,3713,3081],{"class":1315},[1050,3715,1077],{"class":1064},[1050,3717,3086],{"class":1631},[1050,3719,1302],{"class":1064},[1050,3721,3045],{"class":1315},[1050,3723,1065],{"class":1064},[1050,3725,3095],{"class":1309},[1050,3727,1328],{"class":1064},[1050,3729,3730,3733,3735,3737,3739,3741,3743,3745,3747,3750,3752,3755,3757,3759],{"class":1052,"line":2019},[1050,3731,3732],{"class":1060},"    title ",[1050,3734,1302],{"class":1064},[1050,3736,3071],{"class":1060},[1050,3738,1065],{"class":1064},[1050,3740,3152],{"class":1315},[1050,3742,1239],{"class":1064},[1050,3744,3157],{"class":1631},[1050,3746,1302],{"class":1064},[1050,3748,3749],{"class":1427},"200",[1050,3751,1077],{"class":1064},[1050,3753,3754],{"class":1631}," blank",[1050,3756,1302],{"class":1064},[1050,3758,3230],{"class":3229},[1050,3760,1328],{"class":1064},[1050,3762,3763],{"class":1052,"line":2049},[1050,3764,1791],{"class":1060},[1050,3766,3767],{"class":1052,"line":2082},[1050,3768,3769],{"class":1408},"    # Original image\n",[1050,3771,3772,3775,3777,3779,3781,3784],{"class":1052,"line":2088},[1050,3773,3774],{"class":1060},"    image ",[1050,3776,1302],{"class":1064},[1050,3778,3071],{"class":1060},[1050,3780,1065],{"class":1064},[1050,3782,3783],{"class":1315},"ImageField",[1050,3785,1519],{"class":1064},[1050,3787,3788,3791,3793,3796],{"class":1052,"line":2094},[1050,3789,3790],{"class":1631},"        upload_to",[1050,3792,1302],{"class":1064},[1050,3794,3795],{"class":1315},"image_upload_path",[1050,3797,1567],{"class":1064},[1050,3799,3800,3803,3806,3809,3811,3814,3816,3818,3821,3823,3825,3827,3830,3832,3834,3836,3839,3841,3843,3845,3848,3850],{"class":1052,"line":2100},[1050,3801,3802],{"class":1631},"        validators",[1050,3804,3805],{"class":1064},"=[",[1050,3807,3808],{"class":1315},"FileExtensionValidator",[1050,3810,1239],{"class":1064},[1050,3812,3813],{"class":1631},"allowed_extensions",[1050,3815,3805],{"class":1064},[1050,3817,1290],{"class":1282},[1050,3819,3820],{"class":1286},"jpg",[1050,3822,1290],{"class":1282},[1050,3824,1077],{"class":1064},[1050,3826,1283],{"class":1282},[1050,3828,3829],{"class":1286},"jpeg",[1050,3831,1290],{"class":1282},[1050,3833,1077],{"class":1064},[1050,3835,1283],{"class":1282},[1050,3837,3838],{"class":1286},"png",[1050,3840,1290],{"class":1282},[1050,3842,1077],{"class":1064},[1050,3844,1283],{"class":1282},[1050,3846,3847],{"class":1286},"gif",[1050,3849,1290],{"class":1282},[1050,3851,3852],{"class":1064},"])]\n",[1050,3854,3855],{"class":1052,"line":2148},[1050,3856,3857],{"class":1064},"    )\n",[1050,3859,3860],{"class":1052,"line":2170},[1050,3861,1791],{"class":1060},[1050,3863,3864],{"class":1052,"line":2200},[1050,3865,3866],{"class":1408},"    # Processed versions (auto-generated)\n",[1050,3868,3869,3872,3874,3876,3878,3880,3882,3884,3886,3888,3891,3893,3895,3897,3899,3901,3903,3906,3908,3910],{"class":1052,"line":2205},[1050,3870,3871],{"class":1060},"    thumbnail ",[1050,3873,1302],{"class":1064},[1050,3875,3071],{"class":1060},[1050,3877,1065],{"class":1064},[1050,3879,3783],{"class":1315},[1050,3881,1239],{"class":1064},[1050,3883,3131],{"class":1631},[1050,3885,1302],{"class":1064},[1050,3887,1290],{"class":1282},[1050,3889,3890],{"class":1286},"thumbnails/",[1050,3892,1290],{"class":1282},[1050,3894,1077],{"class":1064},[1050,3896,3754],{"class":1631},[1050,3898,1302],{"class":1064},[1050,3900,3230],{"class":3229},[1050,3902,1077],{"class":1064},[1050,3904,3905],{"class":1631}," null",[1050,3907,1302],{"class":1064},[1050,3909,3230],{"class":3229},[1050,3911,1328],{"class":1064},[1050,3913,3914,3917,3919,3921,3923,3925,3927,3929,3931,3933,3936,3938,3940,3942,3944,3946,3948,3950,3952,3954],{"class":1052,"line":2210},[1050,3915,3916],{"class":1060},"    medium ",[1050,3918,1302],{"class":1064},[1050,3920,3071],{"class":1060},[1050,3922,1065],{"class":1064},[1050,3924,3783],{"class":1315},[1050,3926,1239],{"class":1064},[1050,3928,3131],{"class":1631},[1050,3930,1302],{"class":1064},[1050,3932,1290],{"class":1282},[1050,3934,3935],{"class":1286},"medium/",[1050,3937,1290],{"class":1282},[1050,3939,1077],{"class":1064},[1050,3941,3754],{"class":1631},[1050,3943,1302],{"class":1064},[1050,3945,3230],{"class":3229},[1050,3947,1077],{"class":1064},[1050,3949,3905],{"class":1631},[1050,3951,1302],{"class":1064},[1050,3953,3230],{"class":3229},[1050,3955,1328],{"class":1064},[1050,3957,3958],{"class":1052,"line":2216},[1050,3959,1791],{"class":1060},[1050,3961,3962],{"class":1052,"line":2232},[1050,3963,3241],{"class":1408},[1050,3965,3966,3969,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993],{"class":1052,"line":2270},[1050,3967,3968],{"class":1060},"    width ",[1050,3970,1302],{"class":1064},[1050,3972,3071],{"class":1060},[1050,3974,1065],{"class":1064},[1050,3976,3178],{"class":1315},[1050,3978,1239],{"class":1064},[1050,3980,3224],{"class":1631},[1050,3982,1302],{"class":1064},[1050,3984,3230],{"class":3229},[1050,3986,1077],{"class":1064},[1050,3988,3905],{"class":1631},[1050,3990,1302],{"class":1064},[1050,3992,3230],{"class":3229},[1050,3994,1328],{"class":1064},[1050,3996,3997,4000,4002,4004,4006,4008,4010,4012,4014,4016,4018,4020,4022,4024],{"class":1052,"line":2286},[1050,3998,3999],{"class":1060},"    height ",[1050,4001,1302],{"class":1064},[1050,4003,3071],{"class":1060},[1050,4005,1065],{"class":1064},[1050,4007,3178],{"class":1315},[1050,4009,1239],{"class":1064},[1050,4011,3224],{"class":1631},[1050,4013,1302],{"class":1064},[1050,4015,3230],{"class":3229},[1050,4017,1077],{"class":1064},[1050,4019,3905],{"class":1631},[1050,4021,1302],{"class":1064},[1050,4023,3230],{"class":3229},[1050,4025,1328],{"class":1064},[1050,4027,4028,4031,4033,4035,4037,4039,4041,4043,4045,4047,4049,4051,4053,4055],{"class":1052,"line":2292},[1050,4029,4030],{"class":1060},"    alt_text ",[1050,4032,1302],{"class":1064},[1050,4034,3071],{"class":1060},[1050,4036,1065],{"class":1064},[1050,4038,3152],{"class":1315},[1050,4040,1239],{"class":1064},[1050,4042,3157],{"class":1631},[1050,4044,1302],{"class":1064},[1050,4046,3749],{"class":1427},[1050,4048,1077],{"class":1064},[1050,4050,3754],{"class":1631},[1050,4052,1302],{"class":1064},[1050,4054,3230],{"class":3229},[1050,4056,1328],{"class":1064},[1050,4058,4059],{"class":1052,"line":2297},[1050,4060,1791],{"class":1060},[1050,4062,4063,4065,4067,4069,4071,4073,4075,4077,4079,4081],{"class":1052,"line":2303},[1050,4064,3246],{"class":1060},[1050,4066,1302],{"class":1064},[1050,4068,3071],{"class":1060},[1050,4070,1065],{"class":1064},[1050,4072,3255],{"class":1315},[1050,4074,1239],{"class":1064},[1050,4076,3260],{"class":1631},[1050,4078,1302],{"class":1064},[1050,4080,3230],{"class":3229},[1050,4082,1328],{"class":1064},[1050,4084,4085],{"class":1052,"line":2323},[1050,4086,1791],{"class":1060},[1050,4088,4089,4091,4094,4096,4098,4100,4102,4105,4107,4110,4113],{"class":1052,"line":2339},[1050,4090,3381],{"class":1232},[1050,4092,4093],{"class":1225}," save",[1050,4095,1239],{"class":1064},[1050,4097,3390],{"class":3389},[1050,4099,1077],{"class":1064},[1050,4101,1431],{"class":1278},[1050,4103,4104],{"class":1242},"args",[1050,4106,1077],{"class":1064},[1050,4108,4109],{"class":1278}," **",[1050,4111,4112],{"class":1242},"kwargs",[1050,4114,1246],{"class":1064},[1050,4116,4117,4120,4122,4124,4126,4129,4131,4133,4135,4137],{"class":1052,"line":2351},[1050,4118,4119],{"class":2434},"        super",[1050,4121,2830],{"class":1064},[1050,4123,1516],{"class":1315},[1050,4125,1239],{"class":1064},[1050,4127,4128],{"class":1278},"*",[1050,4130,4104],{"class":1315},[1050,4132,1077],{"class":1064},[1050,4134,4109],{"class":1278},[1050,4136,4112],{"class":1315},[1050,4138,1328],{"class":1064},[1050,4140,4141],{"class":1052,"line":2367},[1050,4142,1334],{"class":1060},[1050,4144,4145,4147,4149,4151,4154],{"class":1052,"line":2383},[1050,4146,1340],{"class":1056},[1050,4148,3400],{"class":3399},[1050,4150,1065],{"class":1064},[1050,4152,4153],{"class":1274},"image",[1050,4155,1293],{"class":1064},[1050,4157,4158],{"class":1052,"line":2397},[1050,4159,4160],{"class":1408},"            # Get image dimensions\n",[1050,4162,4163,4166,4169,4172],{"class":1052,"line":2402},[1050,4164,4165],{"class":1056},"            from",[1050,4167,4168],{"class":3399}," PIL",[1050,4170,4171],{"class":1056}," import",[1050,4173,4174],{"class":1060}," Image\n",[1050,4176,4177,4180,4183,4185,4188,4190,4192,4194,4196,4198,4200,4202,4204,4207],{"class":1052,"line":2407},[1050,4178,4179],{"class":1056},"            with",[1050,4181,4182],{"class":1060}," Image",[1050,4184,1065],{"class":1064},[1050,4186,4187],{"class":1315},"open",[1050,4189,1239],{"class":1064},[1050,4191,3390],{"class":3399},[1050,4193,1065],{"class":1064},[1050,4195,4153],{"class":1274},[1050,4197,1065],{"class":1064},[1050,4199,3434],{"class":1274},[1050,4201,2485],{"class":1064},[1050,4203,2438],{"class":1056},[1050,4205,4206],{"class":1060}," img",[1050,4208,1293],{"class":1064},[1050,4210,4211,4214,4216,4219,4221,4223,4225,4228,4230,4232,4234],{"class":1052,"line":2423},[1050,4212,4213],{"class":3399},"                self",[1050,4215,1065],{"class":1064},[1050,4217,4218],{"class":1274},"width",[1050,4220,1077],{"class":1064},[1050,4222,3400],{"class":3399},[1050,4224,1065],{"class":1064},[1050,4226,4227],{"class":1274},"height",[1050,4229,3119],{"class":1064},[1050,4231,4206],{"class":1060},[1050,4233,1065],{"class":1064},[1050,4235,4236],{"class":1274},"size\n",[1050,4238,4239],{"class":1052,"line":2428},[1050,4240,4241],{"class":1060},"            \n",[1050,4243,4244],{"class":1052,"line":2446},[1050,4245,4246],{"class":1408},"            # Generate processed versions\n",[1050,4248,4249,4252,4254,4257],{"class":1052,"line":2494},[1050,4250,4251],{"class":3399},"            self",[1050,4253,1065],{"class":1064},[1050,4255,4256],{"class":1315},"create_thumbnail",[1050,4258,3181],{"class":1064},[1050,4260,4261,4263,4265,4268],{"class":1052,"line":2499},[1050,4262,4251],{"class":3399},[1050,4264,1065],{"class":1064},[1050,4266,4267],{"class":1315},"create_medium_version",[1050,4269,3181],{"class":1064},[1050,4271,4272],{"class":1052,"line":2505},[1050,4273,4241],{"class":1060},[1050,4275,4276],{"class":1052,"line":2515},[1050,4277,4278],{"class":1408},"            # Save again with dimensions\n",[1050,4280,4281,4284,4286,4288,4290,4293,4295,4297,4299,4301,4303,4305,4307,4309,4311,4313,4316,4318,4320,4322,4325,4327],{"class":1052,"line":2554},[1050,4282,4283],{"class":2434},"            super",[1050,4285,2830],{"class":1064},[1050,4287,1516],{"class":1315},[1050,4289,1239],{"class":1064},[1050,4291,4292],{"class":1631},"update_fields",[1050,4294,3805],{"class":1064},[1050,4296,1290],{"class":1282},[1050,4298,4218],{"class":1286},[1050,4300,1290],{"class":1282},[1050,4302,1077],{"class":1064},[1050,4304,1283],{"class":1282},[1050,4306,4227],{"class":1286},[1050,4308,1290],{"class":1282},[1050,4310,1077],{"class":1064},[1050,4312,1283],{"class":1282},[1050,4314,4315],{"class":1286},"thumbnail",[1050,4317,1290],{"class":1282},[1050,4319,1077],{"class":1064},[1050,4321,1283],{"class":1282},[1050,4323,4324],{"class":1286},"medium",[1050,4326,1290],{"class":1282},[1050,4328,4329],{"class":1064},"])\n",[1050,4331,4332],{"class":1052,"line":2559},[1050,4333,1791],{"class":1060},[1050,4335,4336,4338,4341,4343,4345,4347,4350,4352,4354,4357,4359,4362],{"class":1052,"line":2574},[1050,4337,3381],{"class":1232},[1050,4339,4340],{"class":1225}," create_thumbnail",[1050,4342,1239],{"class":1064},[1050,4344,3390],{"class":3389},[1050,4346,1077],{"class":1064},[1050,4348,4349],{"class":1242}," size",[1050,4351,1302],{"class":1278},[1050,4353,1239],{"class":1064},[1050,4355,4356],{"class":1427},"150",[1050,4358,1077],{"class":1064},[1050,4360,4361],{"class":1427}," 150",[1050,4363,4364],{"class":1064},")):\n",[1050,4366,4367,4369,4372],{"class":1052,"line":2594},[1050,4368,3525],{"class":1252},[1050,4370,4371],{"class":1256},"Create thumbnail version",[1050,4373,1260],{"class":1252},[1050,4375,4376,4378,4380,4382,4384,4386],{"class":1052,"line":2599},[1050,4377,1340],{"class":1056},[1050,4379,1343],{"class":1278},[1050,4381,3400],{"class":3399},[1050,4383,1065],{"class":1064},[1050,4385,4153],{"class":1274},[1050,4387,1293],{"class":1064},[1050,4389,4390],{"class":1052,"line":2608},[1050,4391,4392],{"class":1056},"            return\n",[1050,4394,4395],{"class":1052,"line":2626},[1050,4396,1334],{"class":1060},[1050,4398,4399,4402,4404,4406],{"class":1052,"line":2631},[1050,4400,4401],{"class":1056},"        from",[1050,4403,4168],{"class":3399},[1050,4405,4171],{"class":1056},[1050,4407,4174],{"class":1060},[1050,4409,4411,4414],{"class":1052,"line":4410},101,[1050,4412,4413],{"class":1056},"        import",[1050,4415,4416],{"class":1060}," io\n",[1050,4418,4420,4422,4424,4426,4428,4430,4432,4434,4436,4438],{"class":1052,"line":4419},102,[1050,4421,4401],{"class":1056},[1050,4423,1061],{"class":1060},[1050,4425,1065],{"class":1064},[1050,4427,1136],{"class":1060},[1050,4429,1065],{"class":1064},[1050,4431,1141],{"class":1060},[1050,4433,1065],{"class":1064},[1050,4435,1171],{"class":1060},[1050,4437,1071],{"class":1056},[1050,4439,1176],{"class":1060},[1050,4441,4443],{"class":1052,"line":4442},103,[1050,4444,1334],{"class":1060},[1050,4446,4448],{"class":1052,"line":4447},104,[1050,4449,4450],{"class":1408},"        # Open image\n",[1050,4452,4454,4457,4459,4461,4463,4465,4467,4469,4471,4473,4475,4477],{"class":1052,"line":4453},105,[1050,4455,4456],{"class":1060},"        image ",[1050,4458,1302],{"class":1064},[1050,4460,4182],{"class":1060},[1050,4462,1065],{"class":1064},[1050,4464,4187],{"class":1315},[1050,4466,1239],{"class":1064},[1050,4468,3390],{"class":3399},[1050,4470,1065],{"class":1064},[1050,4472,4153],{"class":1274},[1050,4474,1065],{"class":1064},[1050,4476,3434],{"class":1274},[1050,4478,1328],{"class":1064},[1050,4480,4482],{"class":1052,"line":4481},106,[1050,4483,1334],{"class":1060},[1050,4485,4487],{"class":1052,"line":4486},107,[1050,4488,4489],{"class":1408},"        # Create thumbnail\n",[1050,4491,4493,4496,4498,4500,4502,4504,4506,4508,4510,4513,4515,4518],{"class":1052,"line":4492},108,[1050,4494,4495],{"class":1060},"        image",[1050,4497,1065],{"class":1064},[1050,4499,4315],{"class":1315},[1050,4501,1239],{"class":1064},[1050,4503,1421],{"class":1315},[1050,4505,1077],{"class":1064},[1050,4507,4182],{"class":1315},[1050,4509,1065],{"class":1064},[1050,4511,4512],{"class":1274},"Resampling",[1050,4514,1065],{"class":1064},[1050,4516,4517],{"class":1309},"LANCZOS",[1050,4519,1328],{"class":1064},[1050,4521,4523],{"class":1052,"line":4522},109,[1050,4524,1334],{"class":1060},[1050,4526,4528],{"class":1052,"line":4527},110,[1050,4529,4530],{"class":1408},"        # Save to BytesIO\n",[1050,4532,4534,4537,4539,4542,4544,4547],{"class":1052,"line":4533},111,[1050,4535,4536],{"class":1060},"        thumb_io ",[1050,4538,1302],{"class":1064},[1050,4540,4541],{"class":1060}," io",[1050,4543,1065],{"class":1064},[1050,4545,4546],{"class":1315},"BytesIO",[1050,4548,3181],{"class":1064},[1050,4550,4552,4554,4556,4558,4560,4563,4565,4568,4570,4572,4575,4577,4579,4582,4584,4587],{"class":1052,"line":4551},112,[1050,4553,4495],{"class":1060},[1050,4555,1065],{"class":1064},[1050,4557,1516],{"class":1315},[1050,4559,1239],{"class":1064},[1050,4561,4562],{"class":1315},"thumb_io",[1050,4564,1077],{"class":1064},[1050,4566,4567],{"class":1631}," format",[1050,4569,1302],{"class":1064},[1050,4571,1290],{"class":1282},[1050,4573,4574],{"class":1286},"JPEG",[1050,4576,1290],{"class":1282},[1050,4578,1077],{"class":1064},[1050,4580,4581],{"class":1631}," quality",[1050,4583,1302],{"class":1064},[1050,4585,4586],{"class":1427},"85",[1050,4588,1328],{"class":1064},[1050,4590,4592,4595,4597,4600,4602,4604],{"class":1052,"line":4591},113,[1050,4593,4594],{"class":1060},"        thumb_io",[1050,4596,1065],{"class":1064},[1050,4598,4599],{"class":1315},"seek",[1050,4601,1239],{"class":1064},[1050,4603,3338],{"class":1427},[1050,4605,1328],{"class":1064},[1050,4607,4609],{"class":1052,"line":4608},114,[1050,4610,1334],{"class":1060},[1050,4612,4614],{"class":1052,"line":4613},115,[1050,4615,4616],{"class":1408},"        # Generate filename\n",[1050,4618,4620,4623,4625,4627,4630,4632,4635,4637,4639,4641,4644,4646,4648,4650,4652,4654,4656,4658,4660],{"class":1052,"line":4619},116,[1050,4621,4622],{"class":1060},"        thumb_name ",[1050,4624,1302],{"class":1064},[1050,4626,1732],{"class":1232},[1050,4628,4629],{"class":1286},"\"thumb_",[1050,4631,1532],{"class":1531},[1050,4633,4634],{"class":1060},"os",[1050,4636,1065],{"class":1064},[1050,4638,3434],{"class":1274},[1050,4640,1065],{"class":1064},[1050,4642,4643],{"class":1315},"basename",[1050,4645,1239],{"class":1064},[1050,4647,3390],{"class":3399},[1050,4649,1065],{"class":1064},[1050,4651,4153],{"class":1274},[1050,4653,1065],{"class":1064},[1050,4655,1560],{"class":1274},[1050,4657,2485],{"class":1064},[1050,4659,1547],{"class":1531},[1050,4661,3637],{"class":1286},[1050,4663,4665,4667,4669,4671,4673,4675,4677,4679,4681,4684,4686,4688,4691,4694,4696,4699],{"class":1052,"line":4664},117,[1050,4666,4622],{"class":1060},[1050,4668,1302],{"class":1064},[1050,4670,3429],{"class":1060},[1050,4672,1065],{"class":1064},[1050,4674,3434],{"class":1274},[1050,4676,1065],{"class":1064},[1050,4678,3439],{"class":1315},[1050,4680,1239],{"class":1064},[1050,4682,4683],{"class":1315},"thumb_name",[1050,4685,2798],{"class":1064},[1050,4687,3338],{"class":1427},[1050,4689,4690],{"class":1064},"]",[1050,4692,4693],{"class":1278}," +",[1050,4695,1283],{"class":1282},[1050,4697,4698],{"class":1286},".jpg",[1050,4700,2847],{"class":1282},[1050,4702,4704],{"class":1052,"line":4703},118,[1050,4705,1334],{"class":1060},[1050,4707,4709],{"class":1052,"line":4708},119,[1050,4710,4711],{"class":1408},"        # Save to model\n",[1050,4713,4715,4718,4720,4722,4724,4726],{"class":1052,"line":4714},120,[1050,4716,4717],{"class":3399},"        self",[1050,4719,1065],{"class":1064},[1050,4721,4315],{"class":1274},[1050,4723,1065],{"class":1064},[1050,4725,1516],{"class":1315},[1050,4727,1519],{"class":1064},[1050,4729,4731,4734],{"class":1052,"line":4730},121,[1050,4732,4733],{"class":1315},"            thumb_name",[1050,4735,1567],{"class":1064},[1050,4737,4739,4741,4743,4745,4747,4749],{"class":1052,"line":4738},122,[1050,4740,1573],{"class":1315},[1050,4742,1239],{"class":1064},[1050,4744,4562],{"class":1315},[1050,4746,1065],{"class":1064},[1050,4748,1582],{"class":1315},[1050,4750,4751],{"class":1064},"()),\n",[1050,4753,4755,4758,4760],{"class":1052,"line":4754},123,[1050,4756,4757],{"class":1631},"            save",[1050,4759,1302],{"class":1064},[1050,4761,4762],{"class":3229},"False\n",[1050,4764,4766],{"class":1052,"line":4765},124,[1050,4767,1591],{"class":1064},[1050,4769,4771],{"class":1052,"line":4770},125,[1050,4772,1791],{"class":1060},[1050,4774,4776,4778,4781,4783,4785,4787,4789,4791,4793,4796,4798,4801],{"class":1052,"line":4775},126,[1050,4777,3381],{"class":1232},[1050,4779,4780],{"class":1225}," create_medium_version",[1050,4782,1239],{"class":1064},[1050,4784,3390],{"class":3389},[1050,4786,1077],{"class":1064},[1050,4788,4349],{"class":1242},[1050,4790,1302],{"class":1278},[1050,4792,1239],{"class":1064},[1050,4794,4795],{"class":1427},"800",[1050,4797,1077],{"class":1064},[1050,4799,4800],{"class":1427}," 600",[1050,4802,4364],{"class":1064},[1050,4804,4806,4808,4811],{"class":1052,"line":4805},127,[1050,4807,3525],{"class":1252},[1050,4809,4810],{"class":1256},"Create medium-sized version",[1050,4812,1260],{"class":1252},[1050,4814,4816,4818,4820,4822,4824,4826],{"class":1052,"line":4815},128,[1050,4817,1340],{"class":1056},[1050,4819,1343],{"class":1278},[1050,4821,3400],{"class":3399},[1050,4823,1065],{"class":1064},[1050,4825,4153],{"class":1274},[1050,4827,1293],{"class":1064},[1050,4829,4831],{"class":1052,"line":4830},129,[1050,4832,4392],{"class":1056},[1050,4834,4836],{"class":1052,"line":4835},130,[1050,4837,1334],{"class":1060},[1050,4839,4841,4843,4845,4847],{"class":1052,"line":4840},131,[1050,4842,4401],{"class":1056},[1050,4844,4168],{"class":3399},[1050,4846,4171],{"class":1056},[1050,4848,4174],{"class":1060},[1050,4850,4852,4854],{"class":1052,"line":4851},132,[1050,4853,4413],{"class":1056},[1050,4855,4416],{"class":1060},[1050,4857,4859,4861,4863,4865,4867,4869,4871,4873,4875,4877],{"class":1052,"line":4858},133,[1050,4860,4401],{"class":1056},[1050,4862,1061],{"class":1060},[1050,4864,1065],{"class":1064},[1050,4866,1136],{"class":1060},[1050,4868,1065],{"class":1064},[1050,4870,1141],{"class":1060},[1050,4872,1065],{"class":1064},[1050,4874,1171],{"class":1060},[1050,4876,1071],{"class":1056},[1050,4878,1176],{"class":1060},[1050,4880,4882],{"class":1052,"line":4881},134,[1050,4883,1334],{"class":1060},[1050,4885,4887],{"class":1052,"line":4886},135,[1050,4888,4450],{"class":1408},[1050,4890,4892,4894,4896,4898,4900,4902,4904,4906,4908,4910,4912,4914],{"class":1052,"line":4891},136,[1050,4893,4456],{"class":1060},[1050,4895,1302],{"class":1064},[1050,4897,4182],{"class":1060},[1050,4899,1065],{"class":1064},[1050,4901,4187],{"class":1315},[1050,4903,1239],{"class":1064},[1050,4905,3390],{"class":3399},[1050,4907,1065],{"class":1064},[1050,4909,4153],{"class":1274},[1050,4911,1065],{"class":1064},[1050,4913,3434],{"class":1274},[1050,4915,1328],{"class":1064},[1050,4917,4919],{"class":1052,"line":4918},137,[1050,4920,1334],{"class":1060},[1050,4922,4924],{"class":1052,"line":4923},138,[1050,4925,4926],{"class":1408},"        # Resize maintaining aspect ratio\n",[1050,4928,4930,4932,4934,4936,4938,4940,4942,4944,4946,4948,4950,4952],{"class":1052,"line":4929},139,[1050,4931,4495],{"class":1060},[1050,4933,1065],{"class":1064},[1050,4935,4315],{"class":1315},[1050,4937,1239],{"class":1064},[1050,4939,1421],{"class":1315},[1050,4941,1077],{"class":1064},[1050,4943,4182],{"class":1315},[1050,4945,1065],{"class":1064},[1050,4947,4512],{"class":1274},[1050,4949,1065],{"class":1064},[1050,4951,4517],{"class":1309},[1050,4953,1328],{"class":1064},[1050,4955,4957],{"class":1052,"line":4956},140,[1050,4958,1334],{"class":1060},[1050,4960,4962],{"class":1052,"line":4961},141,[1050,4963,4530],{"class":1408},[1050,4965,4967,4970,4972,4974,4976,4978],{"class":1052,"line":4966},142,[1050,4968,4969],{"class":1060},"        medium_io ",[1050,4971,1302],{"class":1064},[1050,4973,4541],{"class":1060},[1050,4975,1065],{"class":1064},[1050,4977,4546],{"class":1315},[1050,4979,3181],{"class":1064},[1050,4981,4983,4985,4987,4989,4991,4994,4996,4998,5000,5002,5004,5006,5008,5010,5012,5015],{"class":1052,"line":4982},143,[1050,4984,4495],{"class":1060},[1050,4986,1065],{"class":1064},[1050,4988,1516],{"class":1315},[1050,4990,1239],{"class":1064},[1050,4992,4993],{"class":1315},"medium_io",[1050,4995,1077],{"class":1064},[1050,4997,4567],{"class":1631},[1050,4999,1302],{"class":1064},[1050,5001,1290],{"class":1282},[1050,5003,4574],{"class":1286},[1050,5005,1290],{"class":1282},[1050,5007,1077],{"class":1064},[1050,5009,4581],{"class":1631},[1050,5011,1302],{"class":1064},[1050,5013,5014],{"class":1427},"90",[1050,5016,1328],{"class":1064},[1050,5018,5020,5023,5025,5027,5029,5031],{"class":1052,"line":5019},144,[1050,5021,5022],{"class":1060},"        medium_io",[1050,5024,1065],{"class":1064},[1050,5026,4599],{"class":1315},[1050,5028,1239],{"class":1064},[1050,5030,3338],{"class":1427},[1050,5032,1328],{"class":1064},[1050,5034,5036],{"class":1052,"line":5035},145,[1050,5037,1334],{"class":1060},[1050,5039,5041],{"class":1052,"line":5040},146,[1050,5042,4616],{"class":1408},[1050,5044,5046,5049,5051,5053,5056,5058,5060,5062,5064,5066,5068,5070,5072,5074,5076,5078,5080,5082,5084],{"class":1052,"line":5045},147,[1050,5047,5048],{"class":1060},"        medium_name ",[1050,5050,1302],{"class":1064},[1050,5052,1732],{"class":1232},[1050,5054,5055],{"class":1286},"\"medium_",[1050,5057,1532],{"class":1531},[1050,5059,4634],{"class":1060},[1050,5061,1065],{"class":1064},[1050,5063,3434],{"class":1274},[1050,5065,1065],{"class":1064},[1050,5067,4643],{"class":1315},[1050,5069,1239],{"class":1064},[1050,5071,3390],{"class":3399},[1050,5073,1065],{"class":1064},[1050,5075,4153],{"class":1274},[1050,5077,1065],{"class":1064},[1050,5079,1560],{"class":1274},[1050,5081,2485],{"class":1064},[1050,5083,1547],{"class":1531},[1050,5085,3637],{"class":1286},[1050,5087,5089,5091,5093,5095,5097,5099,5101,5103,5105,5108,5110,5112,5114,5116,5118,5120],{"class":1052,"line":5088},148,[1050,5090,5048],{"class":1060},[1050,5092,1302],{"class":1064},[1050,5094,3429],{"class":1060},[1050,5096,1065],{"class":1064},[1050,5098,3434],{"class":1274},[1050,5100,1065],{"class":1064},[1050,5102,3439],{"class":1315},[1050,5104,1239],{"class":1064},[1050,5106,5107],{"class":1315},"medium_name",[1050,5109,2798],{"class":1064},[1050,5111,3338],{"class":1427},[1050,5113,4690],{"class":1064},[1050,5115,4693],{"class":1278},[1050,5117,1283],{"class":1282},[1050,5119,4698],{"class":1286},[1050,5121,2847],{"class":1282},[1050,5123,5125],{"class":1052,"line":5124},149,[1050,5126,1334],{"class":1060},[1050,5128,5130],{"class":1052,"line":5129},150,[1050,5131,4711],{"class":1408},[1050,5133,5135,5137,5139,5141,5143,5145],{"class":1052,"line":5134},151,[1050,5136,4717],{"class":3399},[1050,5138,1065],{"class":1064},[1050,5140,4324],{"class":1274},[1050,5142,1065],{"class":1064},[1050,5144,1516],{"class":1315},[1050,5146,1519],{"class":1064},[1050,5148,5150,5153],{"class":1052,"line":5149},152,[1050,5151,5152],{"class":1315},"            medium_name",[1050,5154,1567],{"class":1064},[1050,5156,5158,5160,5162,5164,5166,5168],{"class":1052,"line":5157},153,[1050,5159,1573],{"class":1315},[1050,5161,1239],{"class":1064},[1050,5163,4993],{"class":1315},[1050,5165,1065],{"class":1064},[1050,5167,1582],{"class":1315},[1050,5169,4751],{"class":1064},[1050,5171,5173,5175,5177],{"class":1052,"line":5172},154,[1050,5174,4757],{"class":1631},[1050,5176,1302],{"class":1064},[1050,5178,4762],{"class":3229},[1050,5180,5182],{"class":1052,"line":5181},155,[1050,5183,1591],{"class":1064},[1050,5185,5187],{"class":1052,"line":5186},156,[1050,5188,1216],{"emptyLinePlaceholder":1215},[1050,5190,5192,5194,5197,5199,5201,5203,5205],{"class":1052,"line":5191},157,[1050,5193,3036],{"class":1232},[1050,5195,5196],{"class":3039}," Document",[1050,5198,1239],{"class":1064},[1050,5200,3045],{"class":3044},[1050,5202,1065],{"class":1064},[1050,5204,3050],{"class":3044},[1050,5206,1246],{"class":1064},[1050,5208,5210,5212,5215],{"class":1052,"line":5209},158,[1050,5211,1253],{"class":1252},[1050,5213,5214],{"class":1256},"Model for document uploads with validation",[1050,5216,1260],{"class":1252},[1050,5218,5220,5223,5225],{"class":1052,"line":5219},159,[1050,5221,5222],{"class":3399},"    DOCUMENT_TYPES",[1050,5224,3119],{"class":1064},[1050,5226,5227],{"class":1064}," [\n",[1050,5229,5231,5234,5236,5239,5241,5243,5245,5248,5250],{"class":1052,"line":5230},160,[1050,5232,5233],{"class":1064},"        (",[1050,5235,1290],{"class":1282},[1050,5237,5238],{"class":1286},"pdf",[1050,5240,1290],{"class":1282},[1050,5242,1077],{"class":1064},[1050,5244,1283],{"class":1282},[1050,5246,5247],{"class":1286},"PDF Document",[1050,5249,1290],{"class":1282},[1050,5251,5252],{"class":1064},"),\n",[1050,5254,5256,5258,5260,5263,5265,5267,5269,5272,5274],{"class":1052,"line":5255},161,[1050,5257,5233],{"class":1064},[1050,5259,1290],{"class":1282},[1050,5261,5262],{"class":1286},"doc",[1050,5264,1290],{"class":1282},[1050,5266,1077],{"class":1064},[1050,5268,1283],{"class":1282},[1050,5270,5271],{"class":1286},"Word Document",[1050,5273,1290],{"class":1282},[1050,5275,5252],{"class":1064},[1050,5277,5279,5281,5283,5286,5288,5290,5292,5295,5297],{"class":1052,"line":5278},162,[1050,5280,5233],{"class":1064},[1050,5282,1290],{"class":1282},[1050,5284,5285],{"class":1286},"xls",[1050,5287,1290],{"class":1282},[1050,5289,1077],{"class":1064},[1050,5291,1283],{"class":1282},[1050,5293,5294],{"class":1286},"Excel Spreadsheet",[1050,5296,1290],{"class":1282},[1050,5298,5252],{"class":1064},[1050,5300,5302,5304,5306,5309,5311,5313,5315,5318,5320],{"class":1052,"line":5301},163,[1050,5303,5233],{"class":1064},[1050,5305,1290],{"class":1282},[1050,5307,5308],{"class":1286},"ppt",[1050,5310,1290],{"class":1282},[1050,5312,1077],{"class":1064},[1050,5314,1283],{"class":1282},[1050,5316,5317],{"class":1286},"PowerPoint Presentation",[1050,5319,1290],{"class":1282},[1050,5321,5252],{"class":1064},[1050,5323,5325,5327,5329,5332,5334,5336,5338,5341,5343],{"class":1052,"line":5324},164,[1050,5326,5233],{"class":1064},[1050,5328,1290],{"class":1282},[1050,5330,5331],{"class":1286},"txt",[1050,5333,1290],{"class":1282},[1050,5335,1077],{"class":1064},[1050,5337,1283],{"class":1282},[1050,5339,5340],{"class":1286},"Text File",[1050,5342,1290],{"class":1282},[1050,5344,5252],{"class":1064},[1050,5346,5348],{"class":1052,"line":5347},165,[1050,5349,5350],{"class":1064},"    ]\n",[1050,5352,5354],{"class":1052,"line":5353},166,[1050,5355,1791],{"class":1060},[1050,5357,5359,5361,5363,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383,5385],{"class":1052,"line":5358},167,[1050,5360,3066],{"class":1060},[1050,5362,1302],{"class":1064},[1050,5364,3071],{"class":1060},[1050,5366,1065],{"class":1064},[1050,5368,3076],{"class":1315},[1050,5370,1239],{"class":1064},[1050,5372,3081],{"class":1315},[1050,5374,1077],{"class":1064},[1050,5376,3086],{"class":1631},[1050,5378,1302],{"class":1064},[1050,5380,3045],{"class":1315},[1050,5382,1065],{"class":1064},[1050,5384,3095],{"class":1309},[1050,5386,1328],{"class":1064},[1050,5388,5390,5392,5394,5396,5398,5400,5402,5404,5406,5408],{"class":1052,"line":5389},168,[1050,5391,3732],{"class":1060},[1050,5393,1302],{"class":1064},[1050,5395,3071],{"class":1060},[1050,5397,1065],{"class":1064},[1050,5399,3152],{"class":1315},[1050,5401,1239],{"class":1064},[1050,5403,3157],{"class":1631},[1050,5405,1302],{"class":1064},[1050,5407,3749],{"class":1427},[1050,5409,1328],{"class":1064},[1050,5411,5413,5416,5418,5420,5422,5424,5426,5428,5430,5433,5435,5438,5440,5444],{"class":1052,"line":5412},169,[1050,5414,5415],{"class":1060},"    document_type ",[1050,5417,1302],{"class":1064},[1050,5419,3071],{"class":1060},[1050,5421,1065],{"class":1064},[1050,5423,3152],{"class":1315},[1050,5425,1239],{"class":1064},[1050,5427,3157],{"class":1631},[1050,5429,1302],{"class":1064},[1050,5431,5432],{"class":1427},"10",[1050,5434,1077],{"class":1064},[1050,5436,5437],{"class":1631}," choices",[1050,5439,1302],{"class":1064},[1050,5441,5443],{"class":5442},"s6DHA","DOCUMENT_TYPES",[1050,5445,1328],{"class":1064},[1050,5447,5449],{"class":1052,"line":5448},170,[1050,5450,1791],{"class":1060},[1050,5452,5454,5456,5458,5460,5462,5464],{"class":1052,"line":5453},171,[1050,5455,3116],{"class":3115},[1050,5457,3119],{"class":1064},[1050,5459,3071],{"class":1060},[1050,5461,1065],{"class":1064},[1050,5463,3126],{"class":1315},[1050,5465,1519],{"class":1064},[1050,5467,5469,5471,5473,5475,5478,5480],{"class":1052,"line":5468},172,[1050,5470,3790],{"class":1631},[1050,5472,1302],{"class":1064},[1050,5474,1290],{"class":1282},[1050,5476,5477],{"class":1286},"documents/",[1050,5479,1290],{"class":1282},[1050,5481,1567],{"class":1064},[1050,5483,5485,5487],{"class":1052,"line":5484},173,[1050,5486,3802],{"class":1631},[1050,5488,5489],{"class":1064},"=[\n",[1050,5491,5493,5496],{"class":1052,"line":5492},174,[1050,5494,5495],{"class":1315},"            FileExtensionValidator",[1050,5497,1519],{"class":1064},[1050,5499,5501,5504,5506,5508,5510,5512,5514,5516,5518,5520,5522,5524,5527,5529,5531,5533,5535,5537,5539,5541,5544,5546,5548,5550,5552,5554,5556,5558,5561,5563,5565,5567,5569,5571],{"class":1052,"line":5500},175,[1050,5502,5503],{"class":1631},"                allowed_extensions",[1050,5505,3805],{"class":1064},[1050,5507,1290],{"class":1282},[1050,5509,5238],{"class":1286},[1050,5511,1290],{"class":1282},[1050,5513,1077],{"class":1064},[1050,5515,1283],{"class":1282},[1050,5517,5262],{"class":1286},[1050,5519,1290],{"class":1282},[1050,5521,1077],{"class":1064},[1050,5523,1283],{"class":1282},[1050,5525,5526],{"class":1286},"docx",[1050,5528,1290],{"class":1282},[1050,5530,1077],{"class":1064},[1050,5532,1283],{"class":1282},[1050,5534,5285],{"class":1286},[1050,5536,1290],{"class":1282},[1050,5538,1077],{"class":1064},[1050,5540,1283],{"class":1282},[1050,5542,5543],{"class":1286},"xlsx",[1050,5545,1290],{"class":1282},[1050,5547,1077],{"class":1064},[1050,5549,1283],{"class":1282},[1050,5551,5308],{"class":1286},[1050,5553,1290],{"class":1282},[1050,5555,1077],{"class":1064},[1050,5557,1283],{"class":1282},[1050,5559,5560],{"class":1286},"pptx",[1050,5562,1290],{"class":1282},[1050,5564,1077],{"class":1064},[1050,5566,1283],{"class":1282},[1050,5568,5331],{"class":1286},[1050,5570,1290],{"class":1282},[1050,5572,2145],{"class":1064},[1050,5574,5576],{"class":1052,"line":5575},176,[1050,5577,5578],{"class":1064},"            )\n",[1050,5580,5582],{"class":1052,"line":5581},177,[1050,5583,5584],{"class":1064},"        ]\n",[1050,5586,5588],{"class":1052,"line":5587},178,[1050,5589,3857],{"class":1064},[1050,5591,5593],{"class":1052,"line":5592},179,[1050,5594,1791],{"class":1060},[1050,5596,5598,5600,5602,5604,5606,5608,5610,5612,5614,5616],{"class":1052,"line":5597},180,[1050,5599,3210],{"class":1060},[1050,5601,1302],{"class":1064},[1050,5603,3071],{"class":1060},[1050,5605,1065],{"class":1064},[1050,5607,3219],{"class":1315},[1050,5609,1239],{"class":1064},[1050,5611,3224],{"class":1631},[1050,5613,1302],{"class":1064},[1050,5615,3230],{"class":3229},[1050,5617,1328],{"class":1064},[1050,5619,5621,5624,5626,5628,5630,5632,5634,5636,5638,5640,5642,5644,5646,5648,5650,5653,5655,5657,5660,5662],{"class":1052,"line":5620},181,[1050,5622,5623],{"class":1060},"    tags ",[1050,5625,1302],{"class":1064},[1050,5627,3071],{"class":1060},[1050,5629,1065],{"class":1064},[1050,5631,3152],{"class":1315},[1050,5633,1239],{"class":1064},[1050,5635,3157],{"class":1631},[1050,5637,1302],{"class":1064},[1050,5639,3749],{"class":1427},[1050,5641,1077],{"class":1064},[1050,5643,3754],{"class":1631},[1050,5645,1302],{"class":1064},[1050,5647,3230],{"class":3229},[1050,5649,1077],{"class":1064},[1050,5651,5652],{"class":1631}," help_text",[1050,5654,1302],{"class":1064},[1050,5656,3617],{"class":1282},[1050,5658,5659],{"class":1286},"Comma-separated tags",[1050,5661,3617],{"class":1282},[1050,5663,1328],{"class":1064},[1050,5665,5667],{"class":1052,"line":5666},182,[1050,5668,1791],{"class":1060},[1050,5670,5672],{"class":1052,"line":5671},183,[1050,5673,5674],{"class":1408},"    # Access control\n",[1050,5676,5678,5681,5683,5685,5687,5689,5691,5693,5695,5697],{"class":1052,"line":5677},184,[1050,5679,5680],{"class":1060},"    is_private ",[1050,5682,1302],{"class":1064},[1050,5684,3071],{"class":1060},[1050,5686,1065],{"class":1064},[1050,5688,3304],{"class":1315},[1050,5690,1239],{"class":1064},[1050,5692,3309],{"class":1631},[1050,5694,1302],{"class":1064},[1050,5696,3230],{"class":3229},[1050,5698,1328],{"class":1064},[1050,5700,5702,5705,5707,5709,5711,5714,5716,5718,5720,5722,5724,5726,5728,5730,5732,5734,5737,5739],{"class":1052,"line":5701},185,[1050,5703,5704],{"class":1060},"    allowed_users ",[1050,5706,1302],{"class":1064},[1050,5708,3071],{"class":1060},[1050,5710,1065],{"class":1064},[1050,5712,5713],{"class":1315},"ManyToManyField",[1050,5715,1239],{"class":1064},[1050,5717,3081],{"class":1315},[1050,5719,1077],{"class":1064},[1050,5721,3754],{"class":1631},[1050,5723,1302],{"class":1064},[1050,5725,3230],{"class":3229},[1050,5727,1077],{"class":1064},[1050,5729,3100],{"class":1631},[1050,5731,1302],{"class":1064},[1050,5733,1290],{"class":1282},[1050,5735,5736],{"class":1286},"accessible_documents",[1050,5738,1290],{"class":1282},[1050,5740,1328],{"class":1064},[1050,5742,5744],{"class":1052,"line":5743},186,[1050,5745,1791],{"class":1060},[1050,5747,5749,5751,5753,5755,5757,5759,5761,5763,5765,5767],{"class":1052,"line":5748},187,[1050,5750,3246],{"class":1060},[1050,5752,1302],{"class":1064},[1050,5754,3071],{"class":1060},[1050,5756,1065],{"class":1064},[1050,5758,3255],{"class":1315},[1050,5760,1239],{"class":1064},[1050,5762,3260],{"class":1631},[1050,5764,1302],{"class":1064},[1050,5766,3230],{"class":3229},[1050,5768,1328],{"class":1064},[1050,5770,5772],{"class":1052,"line":5771},188,[1050,5773,1791],{"class":1060},[1050,5775,5777,5779,5781,5783,5785,5787,5789,5791,5793,5795,5797],{"class":1052,"line":5776},189,[1050,5778,3381],{"class":1232},[1050,5780,4093],{"class":1225},[1050,5782,1239],{"class":1064},[1050,5784,3390],{"class":3389},[1050,5786,1077],{"class":1064},[1050,5788,1431],{"class":1278},[1050,5790,4104],{"class":1242},[1050,5792,1077],{"class":1064},[1050,5794,4109],{"class":1278},[1050,5796,4112],{"class":1242},[1050,5798,1246],{"class":1064},[1050,5800,5802],{"class":1052,"line":5801},190,[1050,5803,5804],{"class":1408},"        # Auto-detect document type from file extension\n",[1050,5806,5808,5810,5812,5814,5816],{"class":1052,"line":5807},191,[1050,5809,1340],{"class":1056},[1050,5811,3400],{"class":3399},[1050,5813,1065],{"class":1064},[1050,5815,1323],{"class":1274},[1050,5817,1293],{"class":1064},[1050,5819,5821,5824,5826,5828,5830,5832,5834,5836,5838,5840,5842,5844,5846,5848,5850,5852,5854,5856],{"class":1052,"line":5820},192,[1050,5822,5823],{"class":1060},"            ext ",[1050,5825,1302],{"class":1064},[1050,5827,3429],{"class":1060},[1050,5829,1065],{"class":1064},[1050,5831,3434],{"class":1274},[1050,5833,1065],{"class":1064},[1050,5835,3439],{"class":1315},[1050,5837,1239],{"class":1064},[1050,5839,3390],{"class":3399},[1050,5841,1065],{"class":1064},[1050,5843,1323],{"class":1274},[1050,5845,1065],{"class":1064},[1050,5847,1560],{"class":1274},[1050,5849,2798],{"class":1064},[1050,5851,2804],{"class":1427},[1050,5853,3455],{"class":1064},[1050,5855,3458],{"class":1315},[1050,5857,3181],{"class":1064},[1050,5859,5861,5864,5866],{"class":1052,"line":5860},193,[1050,5862,5863],{"class":1060},"            type_mapping ",[1050,5865,1302],{"class":1064},[1050,5867,5868],{"class":1064}," {\n",[1050,5870,5872,5875,5878,5880,5882,5884,5886,5888],{"class":1052,"line":5871},194,[1050,5873,5874],{"class":1282},"                '",[1050,5876,5877],{"class":1286},".pdf",[1050,5879,1290],{"class":1282},[1050,5881,1441],{"class":1064},[1050,5883,1283],{"class":1282},[1050,5885,5238],{"class":1286},[1050,5887,1290],{"class":1282},[1050,5889,1567],{"class":1064},[1050,5891,5893,5895,5898,5900,5902,5904,5906,5908,5910,5912,5915,5917,5919,5921,5923,5925],{"class":1052,"line":5892},195,[1050,5894,5874],{"class":1282},[1050,5896,5897],{"class":1286},".doc",[1050,5899,1290],{"class":1282},[1050,5901,1441],{"class":1064},[1050,5903,1283],{"class":1282},[1050,5905,5262],{"class":1286},[1050,5907,1290],{"class":1282},[1050,5909,1077],{"class":1064},[1050,5911,1283],{"class":1282},[1050,5913,5914],{"class":1286},".docx",[1050,5916,1290],{"class":1282},[1050,5918,1441],{"class":1064},[1050,5920,1283],{"class":1282},[1050,5922,5262],{"class":1286},[1050,5924,1290],{"class":1282},[1050,5926,1567],{"class":1064},[1050,5928,5930,5932,5935,5937,5939,5941,5943,5945,5947,5949,5952,5954,5956,5958,5960,5962],{"class":1052,"line":5929},196,[1050,5931,5874],{"class":1282},[1050,5933,5934],{"class":1286},".xls",[1050,5936,1290],{"class":1282},[1050,5938,1441],{"class":1064},[1050,5940,1283],{"class":1282},[1050,5942,5285],{"class":1286},[1050,5944,1290],{"class":1282},[1050,5946,1077],{"class":1064},[1050,5948,1283],{"class":1282},[1050,5950,5951],{"class":1286},".xlsx",[1050,5953,1290],{"class":1282},[1050,5955,1441],{"class":1064},[1050,5957,1283],{"class":1282},[1050,5959,5285],{"class":1286},[1050,5961,1290],{"class":1282},[1050,5963,1567],{"class":1064},[1050,5965,5967,5969,5972,5974,5976,5978,5980,5982,5984,5986,5989,5991,5993,5995,5997,5999],{"class":1052,"line":5966},197,[1050,5968,5874],{"class":1282},[1050,5970,5971],{"class":1286},".ppt",[1050,5973,1290],{"class":1282},[1050,5975,1441],{"class":1064},[1050,5977,1283],{"class":1282},[1050,5979,5308],{"class":1286},[1050,5981,1290],{"class":1282},[1050,5983,1077],{"class":1064},[1050,5985,1283],{"class":1282},[1050,5987,5988],{"class":1286},".pptx",[1050,5990,1290],{"class":1282},[1050,5992,1441],{"class":1064},[1050,5994,1283],{"class":1282},[1050,5996,5308],{"class":1286},[1050,5998,1290],{"class":1282},[1050,6000,1567],{"class":1064},[1050,6002,6004,6006,6009,6011,6013,6015,6017,6019],{"class":1052,"line":6003},198,[1050,6005,5874],{"class":1282},[1050,6007,6008],{"class":1286},".txt",[1050,6010,1290],{"class":1282},[1050,6012,1441],{"class":1064},[1050,6014,1283],{"class":1282},[1050,6016,5331],{"class":1286},[1050,6018,1290],{"class":1282},[1050,6020,1567],{"class":1064},[1050,6022,6024],{"class":1052,"line":6023},199,[1050,6025,6026],{"class":1064},"            }\n",[1050,6028,6030,6032,6034,6037,6039,6042,6044,6046,6048,6050,6052,6054,6056,6058],{"class":1052,"line":6029},200,[1050,6031,4251],{"class":3399},[1050,6033,1065],{"class":1064},[1050,6035,6036],{"class":1274},"document_type",[1050,6038,3119],{"class":1064},[1050,6040,6041],{"class":1060}," type_mapping",[1050,6043,1065],{"class":1064},[1050,6045,1316],{"class":1315},[1050,6047,1239],{"class":1064},[1050,6049,2842],{"class":1315},[1050,6051,1077],{"class":1064},[1050,6053,1283],{"class":1282},[1050,6055,5331],{"class":1286},[1050,6057,1290],{"class":1282},[1050,6059,1328],{"class":1064},[1050,6061,6063],{"class":1052,"line":6062},201,[1050,6064,1334],{"class":1060},[1050,6066,6068,6070,6072,6074,6076,6078,6080,6082,6084,6086],{"class":1052,"line":6067},202,[1050,6069,4119],{"class":2434},[1050,6071,2830],{"class":1064},[1050,6073,1516],{"class":1315},[1050,6075,1239],{"class":1064},[1050,6077,4128],{"class":1278},[1050,6079,4104],{"class":1315},[1050,6081,1077],{"class":1064},[1050,6083,4109],{"class":1278},[1050,6085,4112],{"class":1315},[1050,6087,1328],{"class":1064},[1030,6089,6091],{"id":6090},"advanced-file-upload-features","Advanced File Upload Features",[1035,6093,6095],{"id":6094},"ajax-file-upload","AJAX File Upload",[1040,6097,6099],{"className":1042,"code":6098,"language":1044,"meta":1045,"style":1045},"from django.http import JsonResponse\nfrom django.views.decorators.csrf import csrf_exempt\nfrom django.views.decorators.http import require_http_methods\nimport json\n\n@login_required\n@require_http_methods([\"POST\"])\ndef ajax_file_upload(request):\n    \"\"\"Handle AJAX file uploads\"\"\"\n    try:\n        uploaded_file = request.FILES.get('file')\n        \n        if not uploaded_file:\n            return JsonResponse({'error': 'No file provided'}, status=400)\n        \n        # Validate file\n        max_size = 10 * 1024 * 1024  # 10MB\n        if uploaded_file.size > max_size:\n            return JsonResponse({\n                'error': f'File too large. Maximum size is {max_size // (1024*1024)}MB'\n            }, status=400)\n        \n        # Validate file type\n        allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf']\n        if uploaded_file.content_type not in allowed_types:\n            return JsonResponse({\n                'error': 'File type not allowed'\n            }, status=400)\n        \n        # Process and save file\n        user_file = UserFile.objects.create(\n            user=request.user,\n            file=uploaded_file,\n            original_filename=uploaded_file.name,\n            file_size=uploaded_file.size,\n            content_type=uploaded_file.content_type\n        )\n        \n        # Return success response\n        return JsonResponse({\n            'success': True,\n            'file_id': user_file.id,\n            'filename': user_file.original_filename,\n            'file_size': user_file.get_file_size_display(),\n            'file_url': user_file.file.url,\n            'is_image': user_file.is_image(),\n            'created_at': user_file.created_at.isoformat()\n        })\n        \n    except Exception as e:\n        return JsonResponse({'error': str(e)}, status=500)\n\n@login_required\ndef chunked_upload_start(request):\n    \"\"\"Start chunked upload session\"\"\"\n    if request.method == 'POST':\n        try:\n            data = json.loads(request.body)\n            \n            filename = data.get('filename')\n            file_size = data.get('file_size')\n            chunk_size = data.get('chunk_size', 1024 * 1024)  # 1MB default\n            \n            if not filename or not file_size:\n                return JsonResponse({'error': 'Filename and file_size required'}, status=400)\n            \n            # Create upload session\n            upload_session = ChunkedUploadSession.objects.create(\n                user=request.user,\n                filename=filename,\n                file_size=file_size,\n                chunk_size=chunk_size\n            )\n            \n            return JsonResponse({\n                'upload_id': upload_session.id,\n                'chunk_size': chunk_size,\n                'total_chunks': (file_size + chunk_size - 1) // chunk_size\n            })\n            \n        except json.JSONDecodeError:\n            return JsonResponse({'error': 'Invalid JSON'}, status=400)\n    \n    return JsonResponse({'error': 'POST method required'}, status=405)\n\n@login_required\ndef chunked_upload_chunk(request, upload_id):\n    \"\"\"Upload individual chunk\"\"\"\n    if request.method == 'POST':\n        try:\n            upload_session = ChunkedUploadSession.objects.get(\n                id=upload_id,\n                user=request.user,\n                status='active'\n            )\n            \n            chunk_number = int(request.POST.get('chunk_number'))\n            chunk_data = request.FILES.get('chunk')\n            \n            if not chunk_data:\n                return JsonResponse({'error': 'No chunk data'}, status=400)\n            \n            # Save chunk\n            chunk_path = f'chunks/{upload_id}/{chunk_number}'\n            default_storage.save(chunk_path, chunk_data)\n            \n            # Update session\n            upload_session.uploaded_chunks.append(chunk_number)\n            upload_session.save()\n            \n            # Check if upload is complete\n            total_chunks = (upload_session.file_size + upload_session.chunk_size - 1) // upload_session.chunk_size\n            \n            if len(upload_session.uploaded_chunks) == total_chunks:\n                # Combine chunks\n                final_file = combine_chunks(upload_session)\n                \n                # Create final file record\n                user_file = UserFile.objects.create(\n                    user=request.user,\n                    file=final_file,\n                    original_filename=upload_session.filename,\n                    file_size=upload_session.file_size\n                )\n                \n                # Clean up\n                upload_session.status = 'completed'\n                upload_session.save()\n                cleanup_chunks(upload_id)\n                \n                return JsonResponse({\n                    'success': True,\n                    'completed': True,\n                    'file_id': user_file.id,\n                    'file_url': user_file.file.url\n                })\n            else:\n                return JsonResponse({\n                    'success': True,\n                    'completed': False,\n                    'uploaded_chunks': len(upload_session.uploaded_chunks),\n                    'total_chunks': total_chunks\n                })\n                \n        except ChunkedUploadSession.DoesNotExist:\n            return JsonResponse({'error': 'Upload session not found'}, status=404)\n        except Exception as e:\n            return JsonResponse({'error': str(e)}, status=500)\n    \n    return JsonResponse({'error': 'POST method required'}, status=405)\n\ndef combine_chunks(upload_session):\n    \"\"\"Combine uploaded chunks into final file\"\"\"\n    import tempfile\n    \n    # Create temporary file\n    temp_file = tempfile.NamedTemporaryFile(delete=False)\n    \n    try:\n        # Combine chunks in order\n        for chunk_number in sorted(upload_session.uploaded_chunks):\n            chunk_path = f'chunks/{upload_session.id}/{chunk_number}'\n            \n            with default_storage.open(chunk_path, 'rb') as chunk_file:\n                temp_file.write(chunk_file.read())\n        \n        temp_file.close()\n        \n        # Save final file\n        final_path = f'uploads/{upload_session.user.id}/{upload_session.filename}'\n        \n        with open(temp_file.name, 'rb') as final_file:\n            return default_storage.save(final_path, ContentFile(final_file.read()))\n    \n    finally:\n        # Clean up temp file\n        os.unlink(temp_file.name)\n\ndef cleanup_chunks(upload_id):\n    \"\"\"Clean up chunk files\"\"\"\n    chunk_dir = f'chunks/{upload_id}/'\n    \n    # List and delete all chunk files\n    try:\n        dirs, files = default_storage.listdir(chunk_dir)\n        for file in files:\n            default_storage.delete(f'{chunk_dir}{file}')\n    except:\n        pass  # Directory might not exist\n",[1047,6100,6101,6115,6141,6164,6171,6175,6181,6199,6212,6221,6228,6254,6258,6268,6306,6310,6315,6335,6352,6361,6401,6414,6418,6423,6464,6482,6490,6507,6519,6523,6528,6546,6560,6570,6584,6598,6610,6614,6618,6623,6631,6647,6667,6685,6706,6730,6749,6772,6777,6781,6794,6829,6833,6839,6852,6861,6881,6888,6914,6918,6942,6965,7000,7004,7023,7056,7060,7065,7085,7100,7111,7122,7132,7136,7140,7148,7168,7183,7218,7223,7227,7241,7274,7278,7312,7316,7322,7340,7349,7369,7375,7393,7404,7418,7432,7436,7440,7474,7502,7506,7517,7550,7554,7559,7587,7607,7611,7616,7636,7646,7650,7655,7694,7698,7722,7727,7743,7747,7752,7770,7784,7795,7809,7821,7825,7829,7834,7853,7863,7874,7878,7886,7901,7915,7933,7954,7959,7966,7974,7988,8003,8025,8038,8042,8046,8059,8093,8105,8137,8141,8173,8177,8189,8198,8206,8210,8215,8241,8245,8251,8256,8278,8308,8312,8344,8365,8369,8381,8385,8390,8429,8433,8467,8498,8502,8509,8514,8534,8538,8551,8560,8580,8584,8589,8595,8621,8634,8663,8669],{"__ignoreMap":1045},[1050,6102,6103,6105,6107,6109,6111,6113],{"class":1052,"line":1053},[1050,6104,1057],{"class":1056},[1050,6106,1061],{"class":1060},[1050,6108,1065],{"class":1064},[1050,6110,1188],{"class":1060},[1050,6112,1071],{"class":1056},[1050,6114,1193],{"class":1060},[1050,6116,6117,6119,6121,6123,6126,6128,6131,6133,6136,6138],{"class":1052,"line":1083},[1050,6118,1057],{"class":1056},[1050,6120,1061],{"class":1060},[1050,6122,1065],{"class":1064},[1050,6124,6125],{"class":1060},"views",[1050,6127,1065],{"class":1064},[1050,6129,6130],{"class":1060},"decorators",[1050,6132,1065],{"class":1064},[1050,6134,6135],{"class":1060},"csrf ",[1050,6137,1071],{"class":1056},[1050,6139,6140],{"class":1060}," csrf_exempt\n",[1050,6142,6143,6145,6147,6149,6151,6153,6155,6157,6159,6161],{"class":1052,"line":1100},[1050,6144,1057],{"class":1056},[1050,6146,1061],{"class":1060},[1050,6148,1065],{"class":1064},[1050,6150,6125],{"class":1060},[1050,6152,1065],{"class":1064},[1050,6154,6130],{"class":1060},[1050,6156,1065],{"class":1064},[1050,6158,1188],{"class":1060},[1050,6160,1071],{"class":1056},[1050,6162,6163],{"class":1060}," require_http_methods\n",[1050,6165,6166,6168],{"class":1052,"line":1127},[1050,6167,1071],{"class":1056},[1050,6169,6170],{"class":1060}," json\n",[1050,6172,6173],{"class":1052,"line":1154},[1050,6174,1216],{"emptyLinePlaceholder":1215},[1050,6176,6177,6179],{"class":1052,"line":1179},[1050,6178,1222],{"class":1064},[1050,6180,1226],{"class":1225},[1050,6182,6183,6185,6188,6191,6193,6195,6197],{"class":1052,"line":1196},[1050,6184,1222],{"class":1064},[1050,6186,6187],{"class":1225},"require_http_methods",[1050,6189,6190],{"class":1064},"([",[1050,6192,3617],{"class":1282},[1050,6194,1287],{"class":1286},[1050,6196,3617],{"class":1282},[1050,6198,4329],{"class":1064},[1050,6200,6201,6203,6206,6208,6210],{"class":1052,"line":1204},[1050,6202,1233],{"class":1232},[1050,6204,6205],{"class":1225}," ajax_file_upload",[1050,6207,1239],{"class":1064},[1050,6209,1243],{"class":1242},[1050,6211,1246],{"class":1064},[1050,6213,6214,6216,6219],{"class":1052,"line":1212},[1050,6215,1253],{"class":1252},[1050,6217,6218],{"class":1256},"Handle AJAX file uploads",[1050,6220,1260],{"class":1252},[1050,6222,6223,6226],{"class":1052,"line":1219},[1050,6224,6225],{"class":1056},"    try",[1050,6227,1293],{"class":1064},[1050,6229,6230,6232,6234,6236,6238,6240,6242,6244,6246,6248,6250,6252],{"class":1052,"line":1229},[1050,6231,1299],{"class":1060},[1050,6233,1302],{"class":1064},[1050,6235,1269],{"class":1060},[1050,6237,1065],{"class":1064},[1050,6239,1310],{"class":1309},[1050,6241,1065],{"class":1064},[1050,6243,1316],{"class":1315},[1050,6245,1239],{"class":1064},[1050,6247,1290],{"class":1282},[1050,6249,1323],{"class":1286},[1050,6251,1290],{"class":1282},[1050,6253,1328],{"class":1064},[1050,6255,6256],{"class":1052,"line":1249},[1050,6257,1334],{"class":1060},[1050,6259,6260,6262,6264,6266],{"class":1052,"line":1263},[1050,6261,1340],{"class":1056},[1050,6263,1343],{"class":1278},[1050,6265,1346],{"class":1060},[1050,6267,1293],{"class":1064},[1050,6269,6270,6272,6275,6278,6280,6282,6284,6286,6288,6291,6293,6296,6299,6301,6304],{"class":1052,"line":1296},[1050,6271,1380],{"class":1056},[1050,6273,6274],{"class":1315}," JsonResponse",[1050,6276,6277],{"class":1064},"({",[1050,6279,1290],{"class":1282},[1050,6281,1359],{"class":1286},[1050,6283,1290],{"class":1282},[1050,6285,1441],{"class":1064},[1050,6287,1283],{"class":1282},[1050,6289,6290],{"class":1286},"No file provided",[1050,6292,1290],{"class":1282},[1050,6294,6295],{"class":1064},"},",[1050,6297,6298],{"class":1631}," status",[1050,6300,1302],{"class":1064},[1050,6302,6303],{"class":1427},"400",[1050,6305,1328],{"class":1064},[1050,6307,6308],{"class":1052,"line":1331},[1050,6309,1334],{"class":1060},[1050,6311,6312],{"class":1052,"line":1337},[1050,6313,6314],{"class":1408},"        # Validate file\n",[1050,6316,6317,6320,6322,6324,6326,6328,6330,6332],{"class":1052,"line":1351},[1050,6318,6319],{"class":1060},"        max_size ",[1050,6321,1302],{"class":1064},[1050,6323,2033],{"class":1427},[1050,6325,1431],{"class":1278},[1050,6327,1434],{"class":1427},[1050,6329,1431],{"class":1278},[1050,6331,1434],{"class":1427},[1050,6333,6334],{"class":1408},"  # 10MB\n",[1050,6336,6337,6339,6341,6343,6345,6347,6350],{"class":1052,"line":1377},[1050,6338,1340],{"class":1056},[1050,6340,1346],{"class":1060},[1050,6342,1065],{"class":1064},[1050,6344,1421],{"class":1274},[1050,6346,1424],{"class":1278},[1050,6348,6349],{"class":1060}," max_size",[1050,6351,1293],{"class":1064},[1050,6353,6354,6356,6358],{"class":1052,"line":1400},[1050,6355,1380],{"class":1056},[1050,6357,6274],{"class":1315},[1050,6359,6360],{"class":1064},"({\n",[1050,6362,6363,6365,6367,6369,6371,6373,6376,6378,6381,6384,6387,6390,6392,6394,6396,6398],{"class":1052,"line":1405},[1050,6364,5874],{"class":1282},[1050,6366,1359],{"class":1286},[1050,6368,1290],{"class":1282},[1050,6370,1441],{"class":1064},[1050,6372,1732],{"class":1232},[1050,6374,6375],{"class":1286},"'File too large. Maximum size is ",[1050,6377,1532],{"class":1531},[1050,6379,6380],{"class":1315},"max_size ",[1050,6382,6383],{"class":1278},"//",[1050,6385,6386],{"class":1064}," (",[1050,6388,6389],{"class":1427},"1024",[1050,6391,4128],{"class":1278},[1050,6393,6389],{"class":1427},[1050,6395,2485],{"class":1064},[1050,6397,1547],{"class":1531},[1050,6399,6400],{"class":1286},"MB'\n",[1050,6402,6403,6406,6408,6410,6412],{"class":1052,"line":1412},[1050,6404,6405],{"class":1064},"            },",[1050,6407,6298],{"class":1631},[1050,6409,1302],{"class":1064},[1050,6411,6303],{"class":1427},[1050,6413,1328],{"class":1064},[1050,6415,6416],{"class":1052,"line":1447},[1050,6417,1334],{"class":1060},[1050,6419,6420],{"class":1052,"line":1471},[1050,6421,6422],{"class":1408},"        # Validate file type\n",[1050,6424,6425,6428,6430,6432,6434,6436,6438,6440,6442,6444,6446,6448,6450,6452,6454,6456,6458,6460,6462],{"class":1052,"line":1492},[1050,6426,6427],{"class":1060},"        allowed_types ",[1050,6429,1302],{"class":1064},[1050,6431,2108],{"class":1064},[1050,6433,1290],{"class":1282},[1050,6435,2113],{"class":1286},[1050,6437,1290],{"class":1282},[1050,6439,1077],{"class":1064},[1050,6441,1283],{"class":1282},[1050,6443,2122],{"class":1286},[1050,6445,1290],{"class":1282},[1050,6447,1077],{"class":1064},[1050,6449,1283],{"class":1282},[1050,6451,2131],{"class":1286},[1050,6453,1290],{"class":1282},[1050,6455,1077],{"class":1064},[1050,6457,1283],{"class":1282},[1050,6459,2140],{"class":1286},[1050,6461,1290],{"class":1282},[1050,6463,2145],{"class":1064},[1050,6465,6466,6468,6470,6472,6474,6476,6478,6480],{"class":1052,"line":1497},[1050,6467,1340],{"class":1056},[1050,6469,1346],{"class":1060},[1050,6471,1065],{"class":1064},[1050,6473,2157],{"class":1274},[1050,6475,1343],{"class":1278},[1050,6477,2162],{"class":1278},[1050,6479,2165],{"class":1060},[1050,6481,1293],{"class":1064},[1050,6483,6484,6486,6488],{"class":1052,"line":1503},[1050,6485,1380],{"class":1056},[1050,6487,6274],{"class":1315},[1050,6489,6360],{"class":1064},[1050,6491,6492,6494,6496,6498,6500,6502,6505],{"class":1052,"line":1522},[1050,6493,5874],{"class":1282},[1050,6495,1359],{"class":1286},[1050,6497,1290],{"class":1282},[1050,6499,1441],{"class":1064},[1050,6501,1283],{"class":1282},[1050,6503,6504],{"class":1286},"File type not allowed",[1050,6506,2847],{"class":1282},[1050,6508,6509,6511,6513,6515,6517],{"class":1052,"line":1570},[1050,6510,6405],{"class":1064},[1050,6512,6298],{"class":1631},[1050,6514,1302],{"class":1064},[1050,6516,6303],{"class":1427},[1050,6518,1328],{"class":1064},[1050,6520,6521],{"class":1052,"line":1588},[1050,6522,1334],{"class":1060},[1050,6524,6525],{"class":1052,"line":1594},[1050,6526,6527],{"class":1408},"        # Process and save file\n",[1050,6529,6530,6532,6534,6536,6538,6540,6542,6544],{"class":1052,"line":1599},[1050,6531,1608],{"class":1060},[1050,6533,1302],{"class":1064},[1050,6535,1613],{"class":1060},[1050,6537,1065],{"class":1064},[1050,6539,1618],{"class":1274},[1050,6541,1065],{"class":1064},[1050,6543,1623],{"class":1315},[1050,6545,1519],{"class":1064},[1050,6547,6548,6550,6552,6554,6556,6558],{"class":1052,"line":1605},[1050,6549,1632],{"class":1631},[1050,6551,1302],{"class":1064},[1050,6553,1243],{"class":1315},[1050,6555,1065],{"class":1064},[1050,6557,1539],{"class":1274},[1050,6559,1567],{"class":1064},[1050,6561,6562,6564,6566,6568],{"class":1052,"line":1628},[1050,6563,1648],{"class":1631},[1050,6565,1302],{"class":1064},[1050,6567,1555],{"class":1315},[1050,6569,1567],{"class":1064},[1050,6571,6572,6574,6576,6578,6580,6582],{"class":1052,"line":1645},[1050,6573,1661],{"class":1631},[1050,6575,1302],{"class":1064},[1050,6577,1555],{"class":1315},[1050,6579,1065],{"class":1064},[1050,6581,1560],{"class":1274},[1050,6583,1567],{"class":1064},[1050,6585,6586,6588,6590,6592,6594,6596],{"class":1052,"line":1658},[1050,6587,1677],{"class":1631},[1050,6589,1302],{"class":1064},[1050,6591,1555],{"class":1315},[1050,6593,1065],{"class":1064},[1050,6595,1421],{"class":1274},[1050,6597,1567],{"class":1064},[1050,6599,6600,6602,6604,6606,6608],{"class":1052,"line":1674},[1050,6601,1693],{"class":1631},[1050,6603,1302],{"class":1064},[1050,6605,1555],{"class":1315},[1050,6607,1065],{"class":1064},[1050,6609,1702],{"class":1274},[1050,6611,6612],{"class":1052,"line":1690},[1050,6613,1591],{"class":1064},[1050,6615,6616],{"class":1052,"line":1705},[1050,6617,1334],{"class":1060},[1050,6619,6620],{"class":1052,"line":1710},[1050,6621,6622],{"class":1408},"        # Return success response\n",[1050,6624,6625,6627,6629],{"class":1052,"line":1715},[1050,6626,1756],{"class":1056},[1050,6628,6274],{"class":1315},[1050,6630,6360],{"class":1064},[1050,6632,6633,6636,6638,6640,6642,6645],{"class":1052,"line":1753},[1050,6634,6635],{"class":1282},"            '",[1050,6637,1723],{"class":1286},[1050,6639,1290],{"class":1282},[1050,6641,1441],{"class":1064},[1050,6643,6644],{"class":3229}," True",[1050,6646,1567],{"class":1064},[1050,6648,6649,6651,6654,6656,6658,6661,6663,6665],{"class":1052,"line":1788},[1050,6650,6635],{"class":1282},[1050,6652,6653],{"class":1286},"file_id",[1050,6655,1290],{"class":1282},[1050,6657,1441],{"class":1064},[1050,6659,6660],{"class":1315}," user_file",[1050,6662,1065],{"class":1064},[1050,6664,1544],{"class":1274},[1050,6666,1567],{"class":1064},[1050,6668,6669,6671,6673,6675,6677,6679,6681,6683],{"class":1052,"line":1794},[1050,6670,6635],{"class":1282},[1050,6672,2876],{"class":1286},[1050,6674,1290],{"class":1282},[1050,6676,1441],{"class":1064},[1050,6678,6660],{"class":1315},[1050,6680,1065],{"class":1064},[1050,6682,3448],{"class":1274},[1050,6684,1567],{"class":1064},[1050,6686,6687,6689,6692,6694,6696,6698,6700,6703],{"class":1052,"line":1816},[1050,6688,6635],{"class":1282},[1050,6690,6691],{"class":1286},"file_size",[1050,6693,1290],{"class":1282},[1050,6695,1441],{"class":1064},[1050,6697,6660],{"class":1315},[1050,6699,1065],{"class":1064},[1050,6701,6702],{"class":1315},"get_file_size_display",[1050,6704,6705],{"class":1064},"(),\n",[1050,6707,6708,6710,6713,6715,6717,6719,6721,6723,6725,6728],{"class":1052,"line":1821},[1050,6709,6635],{"class":1282},[1050,6711,6712],{"class":1286},"file_url",[1050,6714,1290],{"class":1282},[1050,6716,1441],{"class":1064},[1050,6718,6660],{"class":1315},[1050,6720,1065],{"class":1064},[1050,6722,1323],{"class":1274},[1050,6724,1065],{"class":1064},[1050,6726,6727],{"class":1274},"url",[1050,6729,1567],{"class":1064},[1050,6731,6732,6734,6737,6739,6741,6743,6745,6747],{"class":1052,"line":1835},[1050,6733,6635],{"class":1282},[1050,6735,6736],{"class":1286},"is_image",[1050,6738,1290],{"class":1282},[1050,6740,1441],{"class":1064},[1050,6742,6660],{"class":1315},[1050,6744,1065],{"class":1064},[1050,6746,6736],{"class":1315},[1050,6748,6705],{"class":1064},[1050,6750,6751,6753,6755,6757,6759,6761,6763,6765,6767,6770],{"class":1052,"line":1845},[1050,6752,6635],{"class":1282},[1050,6754,2990],{"class":1286},[1050,6756,1290],{"class":1282},[1050,6758,1441],{"class":1064},[1050,6760,6660],{"class":1315},[1050,6762,1065],{"class":1064},[1050,6764,2990],{"class":1274},[1050,6766,1065],{"class":1064},[1050,6768,6769],{"class":1315},"isoformat",[1050,6771,3181],{"class":1064},[1050,6773,6774],{"class":1052,"line":1866},[1050,6775,6776],{"class":1064},"        })\n",[1050,6778,6779],{"class":1052,"line":1895},[1050,6780,1334],{"class":1060},[1050,6782,6783,6786,6788,6790,6792],{"class":1052,"line":1900},[1050,6784,6785],{"class":1056},"    except",[1050,6787,2435],{"class":2434},[1050,6789,2438],{"class":1056},[1050,6791,2441],{"class":1060},[1050,6793,1293],{"class":1064},[1050,6795,6796,6798,6800,6802,6804,6806,6808,6810,6813,6815,6817,6820,6822,6824,6827],{"class":1052,"line":1912},[1050,6797,1756],{"class":1056},[1050,6799,6274],{"class":1315},[1050,6801,6277],{"class":1064},[1050,6803,1290],{"class":1282},[1050,6805,1359],{"class":1286},[1050,6807,1290],{"class":1282},[1050,6809,1441],{"class":1064},[1050,6811,6812],{"class":2434}," str",[1050,6814,1239],{"class":1064},[1050,6816,2482],{"class":1315},[1050,6818,6819],{"class":1064},")},",[1050,6821,6298],{"class":1631},[1050,6823,1302],{"class":1064},[1050,6825,6826],{"class":1427},"500",[1050,6828,1328],{"class":1064},[1050,6830,6831],{"class":1052,"line":1936},[1050,6832,1216],{"emptyLinePlaceholder":1215},[1050,6834,6835,6837],{"class":1052,"line":1958},[1050,6836,1222],{"class":1064},[1050,6838,1226],{"class":1225},[1050,6840,6841,6843,6846,6848,6850],{"class":1052,"line":1963},[1050,6842,1233],{"class":1232},[1050,6844,6845],{"class":1225}," chunked_upload_start",[1050,6847,1239],{"class":1064},[1050,6849,1243],{"class":1242},[1050,6851,1246],{"class":1064},[1050,6853,6854,6856,6859],{"class":1052,"line":1974},[1050,6855,1253],{"class":1252},[1050,6857,6858],{"class":1256},"Start chunked upload session",[1050,6860,1260],{"class":1252},[1050,6862,6863,6865,6867,6869,6871,6873,6875,6877,6879],{"class":1052,"line":1984},[1050,6864,1266],{"class":1056},[1050,6866,1269],{"class":1060},[1050,6868,1065],{"class":1064},[1050,6870,1275],{"class":1274},[1050,6872,1279],{"class":1278},[1050,6874,1283],{"class":1282},[1050,6876,1287],{"class":1286},[1050,6878,1290],{"class":1282},[1050,6880,1293],{"class":1064},[1050,6882,6883,6886],{"class":1052,"line":1989},[1050,6884,6885],{"class":1056},"        try",[1050,6887,1293],{"class":1064},[1050,6889,6890,6893,6895,6898,6900,6903,6905,6907,6909,6912],{"class":1052,"line":2005},[1050,6891,6892],{"class":1060},"            data ",[1050,6894,1302],{"class":1064},[1050,6896,6897],{"class":1060}," json",[1050,6899,1065],{"class":1064},[1050,6901,6902],{"class":1315},"loads",[1050,6904,1239],{"class":1064},[1050,6906,1243],{"class":1315},[1050,6908,1065],{"class":1064},[1050,6910,6911],{"class":1274},"body",[1050,6913,1328],{"class":1064},[1050,6915,6916],{"class":1052,"line":2013},[1050,6917,4241],{"class":1060},[1050,6919,6920,6923,6925,6928,6930,6932,6934,6936,6938,6940],{"class":1052,"line":2019},[1050,6921,6922],{"class":1060},"            filename ",[1050,6924,1302],{"class":1064},[1050,6926,6927],{"class":1060}," data",[1050,6929,1065],{"class":1064},[1050,6931,1316],{"class":1315},[1050,6933,1239],{"class":1064},[1050,6935,1290],{"class":1282},[1050,6937,2876],{"class":1286},[1050,6939,1290],{"class":1282},[1050,6941,1328],{"class":1064},[1050,6943,6944,6947,6949,6951,6953,6955,6957,6959,6961,6963],{"class":1052,"line":2049},[1050,6945,6946],{"class":1060},"            file_size ",[1050,6948,1302],{"class":1064},[1050,6950,6927],{"class":1060},[1050,6952,1065],{"class":1064},[1050,6954,1316],{"class":1315},[1050,6956,1239],{"class":1064},[1050,6958,1290],{"class":1282},[1050,6960,6691],{"class":1286},[1050,6962,1290],{"class":1282},[1050,6964,1328],{"class":1064},[1050,6966,6967,6970,6972,6974,6976,6978,6980,6982,6985,6987,6989,6991,6993,6995,6997],{"class":1052,"line":2082},[1050,6968,6969],{"class":1060},"            chunk_size ",[1050,6971,1302],{"class":1064},[1050,6973,6927],{"class":1060},[1050,6975,1065],{"class":1064},[1050,6977,1316],{"class":1315},[1050,6979,1239],{"class":1064},[1050,6981,1290],{"class":1282},[1050,6983,6984],{"class":1286},"chunk_size",[1050,6986,1290],{"class":1282},[1050,6988,1077],{"class":1064},[1050,6990,1434],{"class":1427},[1050,6992,1431],{"class":1278},[1050,6994,1434],{"class":1427},[1050,6996,2485],{"class":1064},[1050,6998,6999],{"class":1408},"  # 1MB default\n",[1050,7001,7002],{"class":1052,"line":2088},[1050,7003,4241],{"class":1060},[1050,7005,7006,7008,7010,7013,7016,7018,7021],{"class":1052,"line":2094},[1050,7007,3597],{"class":1056},[1050,7009,1343],{"class":1278},[1050,7011,7012],{"class":1060}," filename ",[1050,7014,7015],{"class":1278},"or",[1050,7017,1343],{"class":1278},[1050,7019,7020],{"class":1060}," file_size",[1050,7022,1293],{"class":1064},[1050,7024,7025,7027,7029,7031,7033,7035,7037,7039,7041,7044,7046,7048,7050,7052,7054],{"class":1052,"line":2100},[1050,7026,3612],{"class":1056},[1050,7028,6274],{"class":1315},[1050,7030,6277],{"class":1064},[1050,7032,1290],{"class":1282},[1050,7034,1359],{"class":1286},[1050,7036,1290],{"class":1282},[1050,7038,1441],{"class":1064},[1050,7040,1283],{"class":1282},[1050,7042,7043],{"class":1286},"Filename and file_size required",[1050,7045,1290],{"class":1282},[1050,7047,6295],{"class":1064},[1050,7049,6298],{"class":1631},[1050,7051,1302],{"class":1064},[1050,7053,6303],{"class":1427},[1050,7055,1328],{"class":1064},[1050,7057,7058],{"class":1052,"line":2148},[1050,7059,4241],{"class":1060},[1050,7061,7062],{"class":1052,"line":2170},[1050,7063,7064],{"class":1408},"            # Create upload session\n",[1050,7066,7067,7070,7072,7075,7077,7079,7081,7083],{"class":1052,"line":2200},[1050,7068,7069],{"class":1060},"            upload_session ",[1050,7071,1302],{"class":1064},[1050,7073,7074],{"class":1060}," ChunkedUploadSession",[1050,7076,1065],{"class":1064},[1050,7078,1618],{"class":1274},[1050,7080,1065],{"class":1064},[1050,7082,1623],{"class":1315},[1050,7084,1519],{"class":1064},[1050,7086,7087,7090,7092,7094,7096,7098],{"class":1052,"line":2205},[1050,7088,7089],{"class":1631},"                user",[1050,7091,1302],{"class":1064},[1050,7093,1243],{"class":1315},[1050,7095,1065],{"class":1064},[1050,7097,1539],{"class":1274},[1050,7099,1567],{"class":1064},[1050,7101,7102,7105,7107,7109],{"class":1052,"line":2210},[1050,7103,7104],{"class":1631},"                filename",[1050,7106,1302],{"class":1064},[1050,7108,2876],{"class":1315},[1050,7110,1567],{"class":1064},[1050,7112,7113,7116,7118,7120],{"class":1052,"line":2216},[1050,7114,7115],{"class":1631},"                file_size",[1050,7117,1302],{"class":1064},[1050,7119,6691],{"class":1315},[1050,7121,1567],{"class":1064},[1050,7123,7124,7127,7129],{"class":1052,"line":2232},[1050,7125,7126],{"class":1631},"                chunk_size",[1050,7128,1302],{"class":1064},[1050,7130,7131],{"class":1315},"chunk_size\n",[1050,7133,7134],{"class":1052,"line":2270},[1050,7135,5578],{"class":1064},[1050,7137,7138],{"class":1052,"line":2286},[1050,7139,4241],{"class":1060},[1050,7141,7142,7144,7146],{"class":1052,"line":2292},[1050,7143,1380],{"class":1056},[1050,7145,6274],{"class":1315},[1050,7147,6360],{"class":1064},[1050,7149,7150,7152,7155,7157,7159,7162,7164,7166],{"class":1052,"line":2297},[1050,7151,5874],{"class":1282},[1050,7153,7154],{"class":1286},"upload_id",[1050,7156,1290],{"class":1282},[1050,7158,1441],{"class":1064},[1050,7160,7161],{"class":1315}," upload_session",[1050,7163,1065],{"class":1064},[1050,7165,1544],{"class":1274},[1050,7167,1567],{"class":1064},[1050,7169,7170,7172,7174,7176,7178,7181],{"class":1052,"line":2303},[1050,7171,5874],{"class":1282},[1050,7173,6984],{"class":1286},[1050,7175,1290],{"class":1282},[1050,7177,1441],{"class":1064},[1050,7179,7180],{"class":1315}," chunk_size",[1050,7182,1567],{"class":1064},[1050,7184,7185,7187,7190,7192,7194,7196,7199,7202,7205,7207,7210,7212,7215],{"class":1052,"line":2323},[1050,7186,5874],{"class":1282},[1050,7188,7189],{"class":1286},"total_chunks",[1050,7191,1290],{"class":1282},[1050,7193,1441],{"class":1064},[1050,7195,6386],{"class":1064},[1050,7197,7198],{"class":1315},"file_size ",[1050,7200,7201],{"class":1278},"+",[1050,7203,7204],{"class":1315}," chunk_size ",[1050,7206,2801],{"class":1278},[1050,7208,7209],{"class":1427}," 1",[1050,7211,2485],{"class":1064},[1050,7213,7214],{"class":1278}," //",[1050,7216,7217],{"class":1315}," chunk_size\n",[1050,7219,7220],{"class":1052,"line":2339},[1050,7221,7222],{"class":1064},"            })\n",[1050,7224,7225],{"class":1052,"line":2351},[1050,7226,4241],{"class":1060},[1050,7228,7229,7232,7234,7236,7239],{"class":1052,"line":2367},[1050,7230,7231],{"class":1056},"        except",[1050,7233,6897],{"class":1060},[1050,7235,1065],{"class":1064},[1050,7237,7238],{"class":1274},"JSONDecodeError",[1050,7240,1293],{"class":1064},[1050,7242,7243,7245,7247,7249,7251,7253,7255,7257,7259,7262,7264,7266,7268,7270,7272],{"class":1052,"line":2383},[1050,7244,1380],{"class":1056},[1050,7246,6274],{"class":1315},[1050,7248,6277],{"class":1064},[1050,7250,1290],{"class":1282},[1050,7252,1359],{"class":1286},[1050,7254,1290],{"class":1282},[1050,7256,1441],{"class":1064},[1050,7258,1283],{"class":1282},[1050,7260,7261],{"class":1286},"Invalid JSON",[1050,7263,1290],{"class":1282},[1050,7265,6295],{"class":1064},[1050,7267,6298],{"class":1631},[1050,7269,1302],{"class":1064},[1050,7271,6303],{"class":1427},[1050,7273,1328],{"class":1064},[1050,7275,7276],{"class":1052,"line":2397},[1050,7277,1791],{"class":1060},[1050,7279,7280,7282,7284,7286,7288,7290,7292,7294,7296,7299,7301,7303,7305,7307,7310],{"class":1052,"line":2402},[1050,7281,1797],{"class":1056},[1050,7283,6274],{"class":1315},[1050,7285,6277],{"class":1064},[1050,7287,1290],{"class":1282},[1050,7289,1359],{"class":1286},[1050,7291,1290],{"class":1282},[1050,7293,1441],{"class":1064},[1050,7295,1283],{"class":1282},[1050,7297,7298],{"class":1286},"POST method required",[1050,7300,1290],{"class":1282},[1050,7302,6295],{"class":1064},[1050,7304,6298],{"class":1631},[1050,7306,1302],{"class":1064},[1050,7308,7309],{"class":1427},"405",[1050,7311,1328],{"class":1064},[1050,7313,7314],{"class":1052,"line":2407},[1050,7315,1216],{"emptyLinePlaceholder":1215},[1050,7317,7318,7320],{"class":1052,"line":2423},[1050,7319,1222],{"class":1064},[1050,7321,1226],{"class":1225},[1050,7323,7324,7326,7329,7331,7333,7335,7338],{"class":1052,"line":2428},[1050,7325,1233],{"class":1232},[1050,7327,7328],{"class":1225}," chunked_upload_chunk",[1050,7330,1239],{"class":1064},[1050,7332,1243],{"class":1242},[1050,7334,1077],{"class":1064},[1050,7336,7337],{"class":1242}," upload_id",[1050,7339,1246],{"class":1064},[1050,7341,7342,7344,7347],{"class":1052,"line":2446},[1050,7343,1253],{"class":1252},[1050,7345,7346],{"class":1256},"Upload individual chunk",[1050,7348,1260],{"class":1252},[1050,7350,7351,7353,7355,7357,7359,7361,7363,7365,7367],{"class":1052,"line":2494},[1050,7352,1266],{"class":1056},[1050,7354,1269],{"class":1060},[1050,7356,1065],{"class":1064},[1050,7358,1275],{"class":1274},[1050,7360,1279],{"class":1278},[1050,7362,1283],{"class":1282},[1050,7364,1287],{"class":1286},[1050,7366,1290],{"class":1282},[1050,7368,1293],{"class":1064},[1050,7370,7371,7373],{"class":1052,"line":2499},[1050,7372,6885],{"class":1056},[1050,7374,1293],{"class":1064},[1050,7376,7377,7379,7381,7383,7385,7387,7389,7391],{"class":1052,"line":2505},[1050,7378,7069],{"class":1060},[1050,7380,1302],{"class":1064},[1050,7382,7074],{"class":1060},[1050,7384,1065],{"class":1064},[1050,7386,1618],{"class":1274},[1050,7388,1065],{"class":1064},[1050,7390,1316],{"class":1315},[1050,7392,1519],{"class":1064},[1050,7394,7395,7398,7400,7402],{"class":1052,"line":2515},[1050,7396,7397],{"class":1631},"                id",[1050,7399,1302],{"class":1064},[1050,7401,7154],{"class":1315},[1050,7403,1567],{"class":1064},[1050,7405,7406,7408,7410,7412,7414,7416],{"class":1052,"line":2554},[1050,7407,7089],{"class":1631},[1050,7409,1302],{"class":1064},[1050,7411,1243],{"class":1315},[1050,7413,1065],{"class":1064},[1050,7415,1539],{"class":1274},[1050,7417,1567],{"class":1064},[1050,7419,7420,7423,7425,7427,7430],{"class":1052,"line":2559},[1050,7421,7422],{"class":1631},"                status",[1050,7424,1302],{"class":1064},[1050,7426,1290],{"class":1282},[1050,7428,7429],{"class":1286},"active",[1050,7431,2847],{"class":1282},[1050,7433,7434],{"class":1052,"line":2574},[1050,7435,5578],{"class":1064},[1050,7437,7438],{"class":1052,"line":2594},[1050,7439,4241],{"class":1060},[1050,7441,7442,7445,7447,7450,7452,7454,7456,7458,7460,7462,7464,7466,7469,7471],{"class":1052,"line":2599},[1050,7443,7444],{"class":1060},"            chunk_number ",[1050,7446,1302],{"class":1064},[1050,7448,7449],{"class":2434}," int",[1050,7451,1239],{"class":1064},[1050,7453,1243],{"class":1315},[1050,7455,1065],{"class":1064},[1050,7457,1287],{"class":1309},[1050,7459,1065],{"class":1064},[1050,7461,1316],{"class":1315},[1050,7463,1239],{"class":1064},[1050,7465,1290],{"class":1282},[1050,7467,7468],{"class":1286},"chunk_number",[1050,7470,1290],{"class":1282},[1050,7472,7473],{"class":1064},"))\n",[1050,7475,7476,7479,7481,7483,7485,7487,7489,7491,7493,7495,7498,7500],{"class":1052,"line":2608},[1050,7477,7478],{"class":1060},"            chunk_data ",[1050,7480,1302],{"class":1064},[1050,7482,1269],{"class":1060},[1050,7484,1065],{"class":1064},[1050,7486,1310],{"class":1309},[1050,7488,1065],{"class":1064},[1050,7490,1316],{"class":1315},[1050,7492,1239],{"class":1064},[1050,7494,1290],{"class":1282},[1050,7496,7497],{"class":1286},"chunk",[1050,7499,1290],{"class":1282},[1050,7501,1328],{"class":1064},[1050,7503,7504],{"class":1052,"line":2626},[1050,7505,4241],{"class":1060},[1050,7507,7508,7510,7512,7515],{"class":1052,"line":2631},[1050,7509,3597],{"class":1056},[1050,7511,1343],{"class":1278},[1050,7513,7514],{"class":1060}," chunk_data",[1050,7516,1293],{"class":1064},[1050,7518,7519,7521,7523,7525,7527,7529,7531,7533,7535,7538,7540,7542,7544,7546,7548],{"class":1052,"line":4410},[1050,7520,3612],{"class":1056},[1050,7522,6274],{"class":1315},[1050,7524,6277],{"class":1064},[1050,7526,1290],{"class":1282},[1050,7528,1359],{"class":1286},[1050,7530,1290],{"class":1282},[1050,7532,1441],{"class":1064},[1050,7534,1283],{"class":1282},[1050,7536,7537],{"class":1286},"No chunk data",[1050,7539,1290],{"class":1282},[1050,7541,6295],{"class":1064},[1050,7543,6298],{"class":1631},[1050,7545,1302],{"class":1064},[1050,7547,6303],{"class":1427},[1050,7549,1328],{"class":1064},[1050,7551,7552],{"class":1052,"line":4419},[1050,7553,4241],{"class":1060},[1050,7555,7556],{"class":1052,"line":4442},[1050,7557,7558],{"class":1408},"            # Save chunk\n",[1050,7560,7561,7564,7566,7568,7571,7573,7575,7577,7579,7581,7583,7585],{"class":1052,"line":4447},[1050,7562,7563],{"class":1060},"            chunk_path ",[1050,7565,1302],{"class":1064},[1050,7567,1732],{"class":1232},[1050,7569,7570],{"class":1286},"'chunks/",[1050,7572,1532],{"class":1531},[1050,7574,7154],{"class":1060},[1050,7576,1547],{"class":1531},[1050,7578,1550],{"class":1286},[1050,7580,1532],{"class":1531},[1050,7582,7468],{"class":1060},[1050,7584,1547],{"class":1531},[1050,7586,2847],{"class":1286},[1050,7588,7589,7592,7594,7596,7598,7601,7603,7605],{"class":1052,"line":4453},[1050,7590,7591],{"class":1060},"            default_storage",[1050,7593,1065],{"class":1064},[1050,7595,1516],{"class":1315},[1050,7597,1239],{"class":1064},[1050,7599,7600],{"class":1315},"chunk_path",[1050,7602,1077],{"class":1064},[1050,7604,7514],{"class":1315},[1050,7606,1328],{"class":1064},[1050,7608,7609],{"class":1052,"line":4481},[1050,7610,4241],{"class":1060},[1050,7612,7613],{"class":1052,"line":4486},[1050,7614,7615],{"class":1408},"            # Update session\n",[1050,7617,7618,7621,7623,7626,7628,7630,7632,7634],{"class":1052,"line":4492},[1050,7619,7620],{"class":1060},"            upload_session",[1050,7622,1065],{"class":1064},[1050,7624,7625],{"class":1274},"uploaded_chunks",[1050,7627,1065],{"class":1064},[1050,7629,2057],{"class":1315},[1050,7631,1239],{"class":1064},[1050,7633,7468],{"class":1315},[1050,7635,1328],{"class":1064},[1050,7637,7638,7640,7642,7644],{"class":1052,"line":4522},[1050,7639,7620],{"class":1060},[1050,7641,1065],{"class":1064},[1050,7643,1516],{"class":1315},[1050,7645,3181],{"class":1064},[1050,7647,7648],{"class":1052,"line":4527},[1050,7649,4241],{"class":1060},[1050,7651,7652],{"class":1052,"line":4533},[1050,7653,7654],{"class":1408},"            # Check if upload is complete\n",[1050,7656,7657,7660,7662,7664,7667,7669,7671,7673,7675,7677,7679,7682,7684,7686,7688,7690,7692],{"class":1052,"line":4551},[1050,7658,7659],{"class":1060},"            total_chunks ",[1050,7661,1302],{"class":1064},[1050,7663,6386],{"class":1064},[1050,7665,7666],{"class":1060},"upload_session",[1050,7668,1065],{"class":1064},[1050,7670,6691],{"class":1274},[1050,7672,4693],{"class":1278},[1050,7674,7161],{"class":1060},[1050,7676,1065],{"class":1064},[1050,7678,6984],{"class":1274},[1050,7680,7681],{"class":1278}," -",[1050,7683,7209],{"class":1427},[1050,7685,2485],{"class":1064},[1050,7687,7214],{"class":1278},[1050,7689,7161],{"class":1060},[1050,7691,1065],{"class":1064},[1050,7693,7131],{"class":1274},[1050,7695,7696],{"class":1052,"line":4591},[1050,7697,4241],{"class":1060},[1050,7699,7700,7702,7705,7707,7709,7711,7713,7715,7717,7720],{"class":1052,"line":4608},[1050,7701,3597],{"class":1056},[1050,7703,7704],{"class":2536}," len",[1050,7706,1239],{"class":1064},[1050,7708,7666],{"class":1315},[1050,7710,1065],{"class":1064},[1050,7712,7625],{"class":1274},[1050,7714,2485],{"class":1064},[1050,7716,1279],{"class":1278},[1050,7718,7719],{"class":1060}," total_chunks",[1050,7721,1293],{"class":1064},[1050,7723,7724],{"class":1052,"line":4613},[1050,7725,7726],{"class":1408},"                # Combine chunks\n",[1050,7728,7729,7732,7734,7737,7739,7741],{"class":1052,"line":4619},[1050,7730,7731],{"class":1060},"                final_file ",[1050,7733,1302],{"class":1064},[1050,7735,7736],{"class":1315}," combine_chunks",[1050,7738,1239],{"class":1064},[1050,7740,7666],{"class":1315},[1050,7742,1328],{"class":1064},[1050,7744,7745],{"class":1052,"line":4664},[1050,7746,2091],{"class":1060},[1050,7748,7749],{"class":1052,"line":4703},[1050,7750,7751],{"class":1408},"                # Create final file record\n",[1050,7753,7754,7756,7758,7760,7762,7764,7766,7768],{"class":1052,"line":4708},[1050,7755,2306],{"class":1060},[1050,7757,1302],{"class":1064},[1050,7759,1613],{"class":1060},[1050,7761,1065],{"class":1064},[1050,7763,1618],{"class":1274},[1050,7765,1065],{"class":1064},[1050,7767,1623],{"class":1315},[1050,7769,1519],{"class":1064},[1050,7771,7772,7774,7776,7778,7780,7782],{"class":1052,"line":4714},[1050,7773,2326],{"class":1631},[1050,7775,1302],{"class":1064},[1050,7777,1243],{"class":1315},[1050,7779,1065],{"class":1064},[1050,7781,1539],{"class":1274},[1050,7783,1567],{"class":1064},[1050,7785,7786,7788,7790,7793],{"class":1052,"line":4730},[1050,7787,2342],{"class":1631},[1050,7789,1302],{"class":1064},[1050,7791,7792],{"class":1315},"final_file",[1050,7794,1567],{"class":1064},[1050,7796,7797,7799,7801,7803,7805,7807],{"class":1052,"line":4738},[1050,7798,2354],{"class":1631},[1050,7800,1302],{"class":1064},[1050,7802,7666],{"class":1315},[1050,7804,1065],{"class":1064},[1050,7806,2876],{"class":1274},[1050,7808,1567],{"class":1064},[1050,7810,7811,7813,7815,7817,7819],{"class":1052,"line":4754},[1050,7812,2370],{"class":1631},[1050,7814,1302],{"class":1064},[1050,7816,7666],{"class":1315},[1050,7818,1065],{"class":1064},[1050,7820,3544],{"class":1274},[1050,7822,7823],{"class":1052,"line":4765},[1050,7824,2289],{"class":1064},[1050,7826,7827],{"class":1052,"line":4770},[1050,7828,2091],{"class":1060},[1050,7830,7831],{"class":1052,"line":4775},[1050,7832,7833],{"class":1408},"                # Clean up\n",[1050,7835,7836,7839,7841,7844,7846,7848,7851],{"class":1052,"line":4805},[1050,7837,7838],{"class":1060},"                upload_session",[1050,7840,1065],{"class":1064},[1050,7842,7843],{"class":1274},"status",[1050,7845,3119],{"class":1064},[1050,7847,1283],{"class":1282},[1050,7849,7850],{"class":1286},"completed",[1050,7852,2847],{"class":1282},[1050,7854,7855,7857,7859,7861],{"class":1052,"line":4815},[1050,7856,7838],{"class":1060},[1050,7858,1065],{"class":1064},[1050,7860,1516],{"class":1315},[1050,7862,3181],{"class":1064},[1050,7864,7865,7868,7870,7872],{"class":1052,"line":4830},[1050,7866,7867],{"class":1315},"                cleanup_chunks",[1050,7869,1239],{"class":1064},[1050,7871,7154],{"class":1315},[1050,7873,1328],{"class":1064},[1050,7875,7876],{"class":1052,"line":4835},[1050,7877,2091],{"class":1060},[1050,7879,7880,7882,7884],{"class":1052,"line":4840},[1050,7881,3612],{"class":1056},[1050,7883,6274],{"class":1315},[1050,7885,6360],{"class":1064},[1050,7887,7888,7891,7893,7895,7897,7899],{"class":1052,"line":4851},[1050,7889,7890],{"class":1282},"                    '",[1050,7892,1723],{"class":1286},[1050,7894,1290],{"class":1282},[1050,7896,1441],{"class":1064},[1050,7898,6644],{"class":3229},[1050,7900,1567],{"class":1064},[1050,7902,7903,7905,7907,7909,7911,7913],{"class":1052,"line":4858},[1050,7904,7890],{"class":1282},[1050,7906,7850],{"class":1286},[1050,7908,1290],{"class":1282},[1050,7910,1441],{"class":1064},[1050,7912,6644],{"class":3229},[1050,7914,1567],{"class":1064},[1050,7916,7917,7919,7921,7923,7925,7927,7929,7931],{"class":1052,"line":4881},[1050,7918,7890],{"class":1282},[1050,7920,6653],{"class":1286},[1050,7922,1290],{"class":1282},[1050,7924,1441],{"class":1064},[1050,7926,6660],{"class":1315},[1050,7928,1065],{"class":1064},[1050,7930,1544],{"class":1274},[1050,7932,1567],{"class":1064},[1050,7934,7935,7937,7939,7941,7943,7945,7947,7949,7951],{"class":1052,"line":4886},[1050,7936,7890],{"class":1282},[1050,7938,6712],{"class":1286},[1050,7940,1290],{"class":1282},[1050,7942,1441],{"class":1064},[1050,7944,6660],{"class":1315},[1050,7946,1065],{"class":1064},[1050,7948,1323],{"class":1274},[1050,7950,1065],{"class":1064},[1050,7952,7953],{"class":1274},"url\n",[1050,7955,7956],{"class":1052,"line":4891},[1050,7957,7958],{"class":1064},"                })\n",[1050,7960,7961,7964],{"class":1052,"line":4918},[1050,7962,7963],{"class":1056},"            else",[1050,7965,1293],{"class":1064},[1050,7967,7968,7970,7972],{"class":1052,"line":4923},[1050,7969,3612],{"class":1056},[1050,7971,6274],{"class":1315},[1050,7973,6360],{"class":1064},[1050,7975,7976,7978,7980,7982,7984,7986],{"class":1052,"line":4929},[1050,7977,7890],{"class":1282},[1050,7979,1723],{"class":1286},[1050,7981,1290],{"class":1282},[1050,7983,1441],{"class":1064},[1050,7985,6644],{"class":3229},[1050,7987,1567],{"class":1064},[1050,7989,7990,7992,7994,7996,7998,8001],{"class":1052,"line":4956},[1050,7991,7890],{"class":1282},[1050,7993,7850],{"class":1286},[1050,7995,1290],{"class":1282},[1050,7997,1441],{"class":1064},[1050,7999,8000],{"class":3229}," False",[1050,8002,1567],{"class":1064},[1050,8004,8005,8007,8009,8011,8013,8015,8017,8019,8021,8023],{"class":1052,"line":4961},[1050,8006,7890],{"class":1282},[1050,8008,7625],{"class":1286},[1050,8010,1290],{"class":1282},[1050,8012,1441],{"class":1064},[1050,8014,7704],{"class":2536},[1050,8016,1239],{"class":1064},[1050,8018,7666],{"class":1315},[1050,8020,1065],{"class":1064},[1050,8022,7625],{"class":1274},[1050,8024,5252],{"class":1064},[1050,8026,8027,8029,8031,8033,8035],{"class":1052,"line":4966},[1050,8028,7890],{"class":1282},[1050,8030,7189],{"class":1286},[1050,8032,1290],{"class":1282},[1050,8034,1441],{"class":1064},[1050,8036,8037],{"class":1315}," total_chunks\n",[1050,8039,8040],{"class":1052,"line":4982},[1050,8041,7958],{"class":1064},[1050,8043,8044],{"class":1052,"line":5019},[1050,8045,2091],{"class":1060},[1050,8047,8048,8050,8052,8054,8057],{"class":1052,"line":5035},[1050,8049,7231],{"class":1056},[1050,8051,7074],{"class":1060},[1050,8053,1065],{"class":1064},[1050,8055,8056],{"class":1274},"DoesNotExist",[1050,8058,1293],{"class":1064},[1050,8060,8061,8063,8065,8067,8069,8071,8073,8075,8077,8080,8082,8084,8086,8088,8091],{"class":1052,"line":5040},[1050,8062,1380],{"class":1056},[1050,8064,6274],{"class":1315},[1050,8066,6277],{"class":1064},[1050,8068,1290],{"class":1282},[1050,8070,1359],{"class":1286},[1050,8072,1290],{"class":1282},[1050,8074,1441],{"class":1064},[1050,8076,1283],{"class":1282},[1050,8078,8079],{"class":1286},"Upload session not found",[1050,8081,1290],{"class":1282},[1050,8083,6295],{"class":1064},[1050,8085,6298],{"class":1631},[1050,8087,1302],{"class":1064},[1050,8089,8090],{"class":1427},"404",[1050,8092,1328],{"class":1064},[1050,8094,8095,8097,8099,8101,8103],{"class":1052,"line":5045},[1050,8096,7231],{"class":1056},[1050,8098,2435],{"class":2434},[1050,8100,2438],{"class":1056},[1050,8102,2441],{"class":1060},[1050,8104,1293],{"class":1064},[1050,8106,8107,8109,8111,8113,8115,8117,8119,8121,8123,8125,8127,8129,8131,8133,8135],{"class":1052,"line":5088},[1050,8108,1380],{"class":1056},[1050,8110,6274],{"class":1315},[1050,8112,6277],{"class":1064},[1050,8114,1290],{"class":1282},[1050,8116,1359],{"class":1286},[1050,8118,1290],{"class":1282},[1050,8120,1441],{"class":1064},[1050,8122,6812],{"class":2434},[1050,8124,1239],{"class":1064},[1050,8126,2482],{"class":1315},[1050,8128,6819],{"class":1064},[1050,8130,6298],{"class":1631},[1050,8132,1302],{"class":1064},[1050,8134,6826],{"class":1427},[1050,8136,1328],{"class":1064},[1050,8138,8139],{"class":1052,"line":5124},[1050,8140,1791],{"class":1060},[1050,8142,8143,8145,8147,8149,8151,8153,8155,8157,8159,8161,8163,8165,8167,8169,8171],{"class":1052,"line":5129},[1050,8144,1797],{"class":1056},[1050,8146,6274],{"class":1315},[1050,8148,6277],{"class":1064},[1050,8150,1290],{"class":1282},[1050,8152,1359],{"class":1286},[1050,8154,1290],{"class":1282},[1050,8156,1441],{"class":1064},[1050,8158,1283],{"class":1282},[1050,8160,7298],{"class":1286},[1050,8162,1290],{"class":1282},[1050,8164,6295],{"class":1064},[1050,8166,6298],{"class":1631},[1050,8168,1302],{"class":1064},[1050,8170,7309],{"class":1427},[1050,8172,1328],{"class":1064},[1050,8174,8175],{"class":1052,"line":5134},[1050,8176,1216],{"emptyLinePlaceholder":1215},[1050,8178,8179,8181,8183,8185,8187],{"class":1052,"line":5149},[1050,8180,1233],{"class":1232},[1050,8182,7736],{"class":1225},[1050,8184,1239],{"class":1064},[1050,8186,7666],{"class":1242},[1050,8188,1246],{"class":1064},[1050,8190,8191,8193,8196],{"class":1052,"line":5157},[1050,8192,1253],{"class":1252},[1050,8194,8195],{"class":1256},"Combine uploaded chunks into final file",[1050,8197,1260],{"class":1252},[1050,8199,8200,8203],{"class":1052,"line":5172},[1050,8201,8202],{"class":1056},"    import",[1050,8204,8205],{"class":1060}," tempfile\n",[1050,8207,8208],{"class":1052,"line":5181},[1050,8209,1791],{"class":1060},[1050,8211,8212],{"class":1052,"line":5186},[1050,8213,8214],{"class":1408},"    # Create temporary file\n",[1050,8216,8217,8220,8222,8225,8227,8230,8232,8235,8237,8239],{"class":1052,"line":5191},[1050,8218,8219],{"class":1060},"    temp_file ",[1050,8221,1302],{"class":1064},[1050,8223,8224],{"class":1060}," tempfile",[1050,8226,1065],{"class":1064},[1050,8228,8229],{"class":1315},"NamedTemporaryFile",[1050,8231,1239],{"class":1064},[1050,8233,8234],{"class":1631},"delete",[1050,8236,1302],{"class":1064},[1050,8238,3314],{"class":3229},[1050,8240,1328],{"class":1064},[1050,8242,8243],{"class":1052,"line":5209},[1050,8244,1791],{"class":1060},[1050,8246,8247,8249],{"class":1052,"line":5219},[1050,8248,6225],{"class":1056},[1050,8250,1293],{"class":1064},[1050,8252,8253],{"class":1052,"line":5230},[1050,8254,8255],{"class":1408},"        # Combine chunks in order\n",[1050,8257,8258,8260,8263,8265,8268,8270,8272,8274,8276],{"class":1052,"line":5255},[1050,8259,1992],{"class":1056},[1050,8261,8262],{"class":1060}," chunk_number ",[1050,8264,1998],{"class":1056},[1050,8266,8267],{"class":2536}," sorted",[1050,8269,1239],{"class":1064},[1050,8271,7666],{"class":1315},[1050,8273,1065],{"class":1064},[1050,8275,7625],{"class":1274},[1050,8277,1246],{"class":1064},[1050,8279,8280,8282,8284,8286,8288,8290,8292,8294,8296,8298,8300,8302,8304,8306],{"class":1052,"line":5278},[1050,8281,7563],{"class":1060},[1050,8283,1302],{"class":1064},[1050,8285,1732],{"class":1232},[1050,8287,7570],{"class":1286},[1050,8289,1532],{"class":1531},[1050,8291,7666],{"class":1060},[1050,8293,1065],{"class":1064},[1050,8295,1544],{"class":1274},[1050,8297,1547],{"class":1531},[1050,8299,1550],{"class":1286},[1050,8301,1532],{"class":1531},[1050,8303,7468],{"class":1060},[1050,8305,1547],{"class":1531},[1050,8307,2847],{"class":1286},[1050,8309,8310],{"class":1052,"line":5301},[1050,8311,4241],{"class":1060},[1050,8313,8314,8316,8318,8320,8322,8324,8326,8328,8330,8333,8335,8337,8339,8342],{"class":1052,"line":5324},[1050,8315,4179],{"class":1056},[1050,8317,1511],{"class":1060},[1050,8319,1065],{"class":1064},[1050,8321,4187],{"class":1315},[1050,8323,1239],{"class":1064},[1050,8325,7600],{"class":1315},[1050,8327,1077],{"class":1064},[1050,8329,1283],{"class":1282},[1050,8331,8332],{"class":1286},"rb",[1050,8334,1290],{"class":1282},[1050,8336,2485],{"class":1064},[1050,8338,2438],{"class":1056},[1050,8340,8341],{"class":1060}," chunk_file",[1050,8343,1293],{"class":1064},[1050,8345,8346,8349,8351,8354,8356,8359,8361,8363],{"class":1052,"line":5347},[1050,8347,8348],{"class":1060},"                temp_file",[1050,8350,1065],{"class":1064},[1050,8352,8353],{"class":1315},"write",[1050,8355,1239],{"class":1064},[1050,8357,8358],{"class":1315},"chunk_file",[1050,8360,1065],{"class":1064},[1050,8362,1582],{"class":1315},[1050,8364,1585],{"class":1064},[1050,8366,8367],{"class":1052,"line":5353},[1050,8368,1334],{"class":1060},[1050,8370,8371,8374,8376,8379],{"class":1052,"line":5358},[1050,8372,8373],{"class":1060},"        temp_file",[1050,8375,1065],{"class":1064},[1050,8377,8378],{"class":1315},"close",[1050,8380,3181],{"class":1064},[1050,8382,8383],{"class":1052,"line":5389},[1050,8384,1334],{"class":1060},[1050,8386,8387],{"class":1052,"line":5412},[1050,8388,8389],{"class":1408},"        # Save final file\n",[1050,8391,8392,8395,8397,8399,8401,8403,8405,8407,8409,8411,8413,8415,8417,8419,8421,8423,8425,8427],{"class":1052,"line":5448},[1050,8393,8394],{"class":1060},"        final_path ",[1050,8396,1302],{"class":1064},[1050,8398,1732],{"class":1232},[1050,8400,1528],{"class":1286},[1050,8402,1532],{"class":1531},[1050,8404,7666],{"class":1060},[1050,8406,1065],{"class":1064},[1050,8408,1539],{"class":1274},[1050,8410,1065],{"class":1064},[1050,8412,1544],{"class":1274},[1050,8414,1547],{"class":1531},[1050,8416,1550],{"class":1286},[1050,8418,1532],{"class":1531},[1050,8420,7666],{"class":1060},[1050,8422,1065],{"class":1064},[1050,8424,2876],{"class":1274},[1050,8426,1547],{"class":1531},[1050,8428,2847],{"class":1286},[1050,8430,8431],{"class":1052,"line":5453},[1050,8432,1334],{"class":1060},[1050,8434,8435,8438,8441,8443,8446,8448,8450,8452,8454,8456,8458,8460,8462,8465],{"class":1052,"line":5468},[1050,8436,8437],{"class":1056},"        with",[1050,8439,8440],{"class":2536}," open",[1050,8442,1239],{"class":1064},[1050,8444,8445],{"class":1315},"temp_file",[1050,8447,1065],{"class":1064},[1050,8449,1560],{"class":1274},[1050,8451,1077],{"class":1064},[1050,8453,1283],{"class":1282},[1050,8455,8332],{"class":1286},[1050,8457,1290],{"class":1282},[1050,8459,2485],{"class":1064},[1050,8461,2438],{"class":1056},[1050,8463,8464],{"class":1060}," final_file",[1050,8466,1293],{"class":1064},[1050,8468,8469,8471,8473,8475,8477,8479,8482,8484,8487,8489,8491,8493,8495],{"class":1052,"line":5484},[1050,8470,1380],{"class":1056},[1050,8472,1511],{"class":1060},[1050,8474,1065],{"class":1064},[1050,8476,1516],{"class":1315},[1050,8478,1239],{"class":1064},[1050,8480,8481],{"class":1315},"final_path",[1050,8483,1077],{"class":1064},[1050,8485,8486],{"class":1315}," ContentFile",[1050,8488,1239],{"class":1064},[1050,8490,7792],{"class":1315},[1050,8492,1065],{"class":1064},[1050,8494,1582],{"class":1315},[1050,8496,8497],{"class":1064},"()))\n",[1050,8499,8500],{"class":1052,"line":5492},[1050,8501,1791],{"class":1060},[1050,8503,8504,8507],{"class":1052,"line":5500},[1050,8505,8506],{"class":1056},"    finally",[1050,8508,1293],{"class":1064},[1050,8510,8511],{"class":1052,"line":5575},[1050,8512,8513],{"class":1408},"        # Clean up temp file\n",[1050,8515,8516,8519,8521,8524,8526,8528,8530,8532],{"class":1052,"line":5581},[1050,8517,8518],{"class":1060},"        os",[1050,8520,1065],{"class":1064},[1050,8522,8523],{"class":1315},"unlink",[1050,8525,1239],{"class":1064},[1050,8527,8445],{"class":1315},[1050,8529,1065],{"class":1064},[1050,8531,1560],{"class":1274},[1050,8533,1328],{"class":1064},[1050,8535,8536],{"class":1052,"line":5587},[1050,8537,1216],{"emptyLinePlaceholder":1215},[1050,8539,8540,8542,8545,8547,8549],{"class":1052,"line":5592},[1050,8541,1233],{"class":1232},[1050,8543,8544],{"class":1225}," cleanup_chunks",[1050,8546,1239],{"class":1064},[1050,8548,7154],{"class":1242},[1050,8550,1246],{"class":1064},[1050,8552,8553,8555,8558],{"class":1052,"line":5597},[1050,8554,1253],{"class":1252},[1050,8556,8557],{"class":1256},"Clean up chunk files",[1050,8559,1260],{"class":1252},[1050,8561,8562,8565,8567,8569,8571,8573,8575,8577],{"class":1052,"line":5620},[1050,8563,8564],{"class":1060},"    chunk_dir ",[1050,8566,1302],{"class":1064},[1050,8568,1732],{"class":1232},[1050,8570,7570],{"class":1286},[1050,8572,1532],{"class":1531},[1050,8574,7154],{"class":1060},[1050,8576,1547],{"class":1531},[1050,8578,8579],{"class":1286},"/'\n",[1050,8581,8582],{"class":1052,"line":5666},[1050,8583,1791],{"class":1060},[1050,8585,8586],{"class":1052,"line":5671},[1050,8587,8588],{"class":1408},"    # List and delete all chunk files\n",[1050,8590,8591,8593],{"class":1052,"line":5677},[1050,8592,6225],{"class":1056},[1050,8594,1293],{"class":1064},[1050,8596,8597,8600,8602,8605,8607,8609,8611,8614,8616,8619],{"class":1052,"line":5701},[1050,8598,8599],{"class":1060},"        dirs",[1050,8601,1077],{"class":1064},[1050,8603,8604],{"class":1060}," files ",[1050,8606,1302],{"class":1064},[1050,8608,1511],{"class":1060},[1050,8610,1065],{"class":1064},[1050,8612,8613],{"class":1315},"listdir",[1050,8615,1239],{"class":1064},[1050,8617,8618],{"class":1315},"chunk_dir",[1050,8620,1328],{"class":1064},[1050,8622,8623,8625,8628,8630,8632],{"class":1052,"line":5743},[1050,8624,1992],{"class":1056},[1050,8626,8627],{"class":3115}," file",[1050,8629,2162],{"class":1056},[1050,8631,1907],{"class":1060},[1050,8633,1293],{"class":1064},[1050,8635,8636,8638,8640,8642,8644,8646,8648,8650,8652,8655,8657,8659,8661],{"class":1052,"line":5748},[1050,8637,7591],{"class":1060},[1050,8639,1065],{"class":1064},[1050,8641,8234],{"class":1315},[1050,8643,1239],{"class":1064},[1050,8645,2062],{"class":1232},[1050,8647,1290],{"class":1286},[1050,8649,1532],{"class":1531},[1050,8651,8618],{"class":1315},[1050,8653,8654],{"class":1531},"}{",[1050,8656,1323],{"class":3115},[1050,8658,1547],{"class":1531},[1050,8660,1290],{"class":1286},[1050,8662,1328],{"class":1064},[1050,8664,8665,8667],{"class":1052,"line":5771},[1050,8666,6785],{"class":1056},[1050,8668,1293],{"class":1064},[1050,8670,8671,8674],{"class":1052,"line":5776},[1050,8672,8673],{"class":1056},"        pass",[1050,8675,8676],{"class":1408},"  # Directory might not exist\n",[1035,8678,8680],{"id":8679},"image-processing-and-validation","Image Processing and Validation",[1040,8682,8684],{"className":1042,"code":8683,"language":1044,"meta":1045,"style":1045},"from PIL import Image, ImageOps, ImageFilter\nfrom django.core.files.base import ContentFile\nimport io\n\ndef process_image_upload(request):\n    \"\"\"Advanced image processing during upload\"\"\"\n    if request.method == 'POST':\n        uploaded_file = request.FILES.get('image')\n        \n        if not uploaded_file:\n            return JsonResponse({'error': 'No image provided'}, status=400)\n        \n        try:\n            # Validate image\n            image = Image.open(uploaded_file)\n            \n            # Check image format\n            if image.format not in ['JPEG', 'PNG', 'GIF']:\n                return JsonResponse({'error': 'Invalid image format'}, status=400)\n            \n            # Check dimensions\n            width, height = image.size\n            if width > 4000 or height > 4000:\n                return JsonResponse({'error': 'Image too large (max 4000x4000)'}, status=400)\n            \n            if width \u003C 100 or height \u003C 100:\n                return JsonResponse({'error': 'Image too small (min 100x100)'}, status=400)\n            \n            # Process image\n            processed_images = process_image_variants(image, uploaded_file.name)\n            \n            # Create database record\n            image_upload = ImageUpload.objects.create(\n                user=request.user,\n                title=request.POST.get('title', ''),\n                image=processed_images['original'],\n                thumbnail=processed_images['thumbnail'],\n                medium=processed_images['medium'],\n                width=width,\n                height=height,\n                alt_text=request.POST.get('alt_text', '')\n            )\n            \n            return JsonResponse({\n                'success': True,\n                'image_id': image_upload.id,\n                'original_url': image_upload.image.url,\n                'thumbnail_url': image_upload.thumbnail.url,\n                'medium_url': image_upload.medium.url,\n                'dimensions': f'{width}x{height}'\n            })\n            \n        except Exception as e:\n            return JsonResponse({'error': f'Error processing image: {str(e)}'}, status=500)\n    \n    return render(request, 'uploads/image_form.html')\n\ndef process_image_variants(image, filename):\n    \"\"\"Create multiple variants of uploaded image\"\"\"\n    variants = {}\n    \n    # Convert to RGB if necessary\n    if image.mode in ('RGBA', 'LA', 'P'):\n        image = image.convert('RGB')\n    \n    # Original (optimized)\n    original_io = io.BytesIO()\n    image.save(original_io, format='JPEG', quality=90, optimize=True)\n    original_io.seek(0)\n    \n    original_name = f\"original_{filename}\"\n    original_name = os.path.splitext(original_name)[0] + '.jpg'\n    variants['original'] = ContentFile(original_io.read(), name=original_name)\n    \n    # Thumbnail (150x150, cropped)\n    thumb_image = ImageOps.fit(image, (150, 150), Image.Resampling.LANCZOS)\n    thumb_io = io.BytesIO()\n    thumb_image.save(thumb_io, format='JPEG', quality=85)\n    thumb_io.seek(0)\n    \n    thumb_name = f\"thumb_{filename}\"\n    thumb_name = os.path.splitext(thumb_name)[0] + '.jpg'\n    variants['thumbnail'] = ContentFile(thumb_io.read(), name=thumb_name)\n    \n    # Medium (800x600, maintain aspect ratio)\n    medium_image = image.copy()\n    medium_image.thumbnail((800, 600), Image.Resampling.LANCZOS)\n    medium_io = io.BytesIO()\n    medium_image.save(medium_io, format='JPEG', quality=85)\n    medium_io.seek(0)\n    \n    medium_name = f\"medium_{filename}\"\n    medium_name = os.path.splitext(medium_name)[0] + '.jpg'\n    variants['medium'] = ContentFile(medium_io.read(), name=medium_name)\n    \n    return variants\n\ndef apply_image_filters(request, image_id):\n    \"\"\"Apply filters to uploaded image\"\"\"\n    image_upload = get_object_or_404(ImageUpload, id=image_id, user=request.user)\n    \n    if request.method == 'POST':\n        filter_type = request.POST.get('filter')\n        \n        # Open original image\n        image = Image.open(image_upload.image.path)\n        \n        # Apply filter\n        if filter_type == 'blur':\n            filtered_image = image.filter(ImageFilter.BLUR)\n        elif filter_type == 'sharpen':\n            filtered_image = image.filter(ImageFilter.SHARPEN)\n        elif filter_type == 'grayscale':\n            filtered_image = image.convert('L').convert('RGB')\n        elif filter_type == 'sepia':\n            filtered_image = apply_sepia_filter(image)\n        else:\n            return JsonResponse({'error': 'Invalid filter type'}, status=400)\n        \n        # Save filtered image\n        filtered_io = io.BytesIO()\n        filtered_image.save(filtered_io, format='JPEG', quality=90)\n        filtered_io.seek(0)\n        \n        filtered_name = f\"filtered_{filter_type}_{os.path.basename(image_upload.image.name)}\"\n        \n        # Create new image record\n        filtered_upload = ImageUpload.objects.create(\n            user=request.user,\n            title=f\"{image_upload.title} ({filter_type})\",\n            image=ContentFile(filtered_io.read(), name=filtered_name),\n            alt_text=image_upload.alt_text\n        )\n        \n        return JsonResponse({\n            'success': True,\n            'filtered_image_id': filtered_upload.id,\n            'filtered_url': filtered_upload.image.url\n        })\n    \n    return render(request, 'uploads/image_filters.html', {'image': image_upload})\n\ndef apply_sepia_filter(image):\n    \"\"\"Apply sepia tone filter\"\"\"\n    pixels = image.load()\n    width, height = image.size\n    \n    for y in range(height):\n        for x in range(width):\n            r, g, b = pixels[x, y]\n            \n            # Sepia formula\n            tr = int(0.393 * r + 0.769 * g + 0.189 * b)\n            tg = int(0.349 * r + 0.686 * g + 0.168 * b)\n            tb = int(0.272 * r + 0.534 * g + 0.131 * b)\n            \n            # Clamp values\n            pixels[x, y] = (min(255, tr), min(255, tg), min(255, tb))\n    \n    return image\n",[1047,8685,8686,8706,8728,8734,8738,8751,8760,8780,8806,8810,8820,8853,8857,8863,8868,8887,8891,8896,8940,8973,8977,8982,9000,9024,9057,9061,9082,9115,9119,9124,9148,9152,9157,9176,9190,9223,9246,9265,9284,9295,9306,9338,9342,9346,9354,9368,9388,9411,9434,9457,9489,9493,9497,9509,9554,9558,9579,9583,9599,9608,9618,9622,9627,9669,9693,9697,9702,9717,9762,9777,9781,9801,9836,9875,9879,9884,9927,9942,9977,9992,9996,10015,10049,10085,10089,10094,10110,10142,10157,10191,10206,10210,10229,10263,10299,10303,10310,10314,10332,10341,10380,10384,10404,10432,10436,10441,10468,10472,10477,10496,10521,10539,10562,10579,10615,10632,10647,10654,10687,10691,10696,10711,10747,10762,10766,10818,10822,10827,10846,10860,10894,10923,10937,10941,10945,10953,10967,10987,11008,11012,11016,11052,11056,11068,11077,11093,11110,11114,11133,11150,11181,11185,11190,11231,11269,11307,11311,11316,11376,11380],{"__ignoreMap":1045},[1050,8687,8688,8690,8692,8694,8696,8698,8701,8703],{"class":1052,"line":1053},[1050,8689,1057],{"class":1056},[1050,8691,4168],{"class":3399},[1050,8693,4171],{"class":1056},[1050,8695,4182],{"class":1060},[1050,8697,1077],{"class":1064},[1050,8699,8700],{"class":1060}," ImageOps",[1050,8702,1077],{"class":1064},[1050,8704,8705],{"class":1060}," ImageFilter\n",[1050,8707,8708,8710,8712,8714,8716,8718,8720,8722,8724,8726],{"class":1052,"line":1083},[1050,8709,1057],{"class":1056},[1050,8711,1061],{"class":1060},[1050,8713,1065],{"class":1064},[1050,8715,1136],{"class":1060},[1050,8717,1065],{"class":1064},[1050,8719,1141],{"class":1060},[1050,8721,1065],{"class":1064},[1050,8723,1171],{"class":1060},[1050,8725,1071],{"class":1056},[1050,8727,1176],{"class":1060},[1050,8729,8730,8732],{"class":1052,"line":1100},[1050,8731,1071],{"class":1056},[1050,8733,4416],{"class":1060},[1050,8735,8736],{"class":1052,"line":1127},[1050,8737,1216],{"emptyLinePlaceholder":1215},[1050,8739,8740,8742,8745,8747,8749],{"class":1052,"line":1154},[1050,8741,1233],{"class":1232},[1050,8743,8744],{"class":1225}," process_image_upload",[1050,8746,1239],{"class":1064},[1050,8748,1243],{"class":1242},[1050,8750,1246],{"class":1064},[1050,8752,8753,8755,8758],{"class":1052,"line":1179},[1050,8754,1253],{"class":1252},[1050,8756,8757],{"class":1256},"Advanced image processing during upload",[1050,8759,1260],{"class":1252},[1050,8761,8762,8764,8766,8768,8770,8772,8774,8776,8778],{"class":1052,"line":1196},[1050,8763,1266],{"class":1056},[1050,8765,1269],{"class":1060},[1050,8767,1065],{"class":1064},[1050,8769,1275],{"class":1274},[1050,8771,1279],{"class":1278},[1050,8773,1283],{"class":1282},[1050,8775,1287],{"class":1286},[1050,8777,1290],{"class":1282},[1050,8779,1293],{"class":1064},[1050,8781,8782,8784,8786,8788,8790,8792,8794,8796,8798,8800,8802,8804],{"class":1052,"line":1204},[1050,8783,1299],{"class":1060},[1050,8785,1302],{"class":1064},[1050,8787,1269],{"class":1060},[1050,8789,1065],{"class":1064},[1050,8791,1310],{"class":1309},[1050,8793,1065],{"class":1064},[1050,8795,1316],{"class":1315},[1050,8797,1239],{"class":1064},[1050,8799,1290],{"class":1282},[1050,8801,4153],{"class":1286},[1050,8803,1290],{"class":1282},[1050,8805,1328],{"class":1064},[1050,8807,8808],{"class":1052,"line":1212},[1050,8809,1334],{"class":1060},[1050,8811,8812,8814,8816,8818],{"class":1052,"line":1219},[1050,8813,1340],{"class":1056},[1050,8815,1343],{"class":1278},[1050,8817,1346],{"class":1060},[1050,8819,1293],{"class":1064},[1050,8821,8822,8824,8826,8828,8830,8832,8834,8836,8838,8841,8843,8845,8847,8849,8851],{"class":1052,"line":1229},[1050,8823,1380],{"class":1056},[1050,8825,6274],{"class":1315},[1050,8827,6277],{"class":1064},[1050,8829,1290],{"class":1282},[1050,8831,1359],{"class":1286},[1050,8833,1290],{"class":1282},[1050,8835,1441],{"class":1064},[1050,8837,1283],{"class":1282},[1050,8839,8840],{"class":1286},"No image provided",[1050,8842,1290],{"class":1282},[1050,8844,6295],{"class":1064},[1050,8846,6298],{"class":1631},[1050,8848,1302],{"class":1064},[1050,8850,6303],{"class":1427},[1050,8852,1328],{"class":1064},[1050,8854,8855],{"class":1052,"line":1249},[1050,8856,1334],{"class":1060},[1050,8858,8859,8861],{"class":1052,"line":1263},[1050,8860,6885],{"class":1056},[1050,8862,1293],{"class":1064},[1050,8864,8865],{"class":1052,"line":1296},[1050,8866,8867],{"class":1408},"            # Validate image\n",[1050,8869,8870,8873,8875,8877,8879,8881,8883,8885],{"class":1052,"line":1331},[1050,8871,8872],{"class":1060},"            image ",[1050,8874,1302],{"class":1064},[1050,8876,4182],{"class":1060},[1050,8878,1065],{"class":1064},[1050,8880,4187],{"class":1315},[1050,8882,1239],{"class":1064},[1050,8884,1555],{"class":1315},[1050,8886,1328],{"class":1064},[1050,8888,8889],{"class":1052,"line":1337},[1050,8890,4241],{"class":1060},[1050,8892,8893],{"class":1052,"line":1351},[1050,8894,8895],{"class":1408},"            # Check image format\n",[1050,8897,8898,8900,8903,8905,8908,8910,8912,8914,8916,8918,8920,8922,8924,8927,8929,8931,8933,8936,8938],{"class":1052,"line":1377},[1050,8899,3597],{"class":1056},[1050,8901,8902],{"class":1060}," image",[1050,8904,1065],{"class":1064},[1050,8906,8907],{"class":1274},"format",[1050,8909,1343],{"class":1278},[1050,8911,2162],{"class":1278},[1050,8913,2108],{"class":1064},[1050,8915,1290],{"class":1282},[1050,8917,4574],{"class":1286},[1050,8919,1290],{"class":1282},[1050,8921,1077],{"class":1064},[1050,8923,1283],{"class":1282},[1050,8925,8926],{"class":1286},"PNG",[1050,8928,1290],{"class":1282},[1050,8930,1077],{"class":1064},[1050,8932,1283],{"class":1282},[1050,8934,8935],{"class":1286},"GIF",[1050,8937,1290],{"class":1282},[1050,8939,3592],{"class":1064},[1050,8941,8942,8944,8946,8948,8950,8952,8954,8956,8958,8961,8963,8965,8967,8969,8971],{"class":1052,"line":1400},[1050,8943,3612],{"class":1056},[1050,8945,6274],{"class":1315},[1050,8947,6277],{"class":1064},[1050,8949,1290],{"class":1282},[1050,8951,1359],{"class":1286},[1050,8953,1290],{"class":1282},[1050,8955,1441],{"class":1064},[1050,8957,1283],{"class":1282},[1050,8959,8960],{"class":1286},"Invalid image format",[1050,8962,1290],{"class":1282},[1050,8964,6295],{"class":1064},[1050,8966,6298],{"class":1631},[1050,8968,1302],{"class":1064},[1050,8970,6303],{"class":1427},[1050,8972,1328],{"class":1064},[1050,8974,8975],{"class":1052,"line":1405},[1050,8976,4241],{"class":1060},[1050,8978,8979],{"class":1052,"line":1412},[1050,8980,8981],{"class":1408},"            # Check dimensions\n",[1050,8983,8984,8987,8989,8992,8994,8996,8998],{"class":1052,"line":1447},[1050,8985,8986],{"class":1060},"            width",[1050,8988,1077],{"class":1064},[1050,8990,8991],{"class":1060}," height ",[1050,8993,1302],{"class":1064},[1050,8995,8902],{"class":1060},[1050,8997,1065],{"class":1064},[1050,8999,4236],{"class":1274},[1050,9001,9002,9004,9007,9010,9013,9016,9018,9020,9022],{"class":1052,"line":1471},[1050,9003,3597],{"class":1056},[1050,9005,9006],{"class":1060}," width ",[1050,9008,9009],{"class":1278},">",[1050,9011,9012],{"class":1427}," 4000",[1050,9014,9015],{"class":1278}," or",[1050,9017,8991],{"class":1060},[1050,9019,9009],{"class":1278},[1050,9021,9012],{"class":1427},[1050,9023,1293],{"class":1064},[1050,9025,9026,9028,9030,9032,9034,9036,9038,9040,9042,9045,9047,9049,9051,9053,9055],{"class":1052,"line":1492},[1050,9027,3612],{"class":1056},[1050,9029,6274],{"class":1315},[1050,9031,6277],{"class":1064},[1050,9033,1290],{"class":1282},[1050,9035,1359],{"class":1286},[1050,9037,1290],{"class":1282},[1050,9039,1441],{"class":1064},[1050,9041,1283],{"class":1282},[1050,9043,9044],{"class":1286},"Image too large (max 4000x4000)",[1050,9046,1290],{"class":1282},[1050,9048,6295],{"class":1064},[1050,9050,6298],{"class":1631},[1050,9052,1302],{"class":1064},[1050,9054,6303],{"class":1427},[1050,9056,1328],{"class":1064},[1050,9058,9059],{"class":1052,"line":1497},[1050,9060,4241],{"class":1060},[1050,9062,9063,9065,9067,9069,9072,9074,9076,9078,9080],{"class":1052,"line":1503},[1050,9064,3597],{"class":1056},[1050,9066,9006],{"class":1060},[1050,9068,3603],{"class":1278},[1050,9070,9071],{"class":1427}," 100",[1050,9073,9015],{"class":1278},[1050,9075,8991],{"class":1060},[1050,9077,3603],{"class":1278},[1050,9079,9071],{"class":1427},[1050,9081,1293],{"class":1064},[1050,9083,9084,9086,9088,9090,9092,9094,9096,9098,9100,9103,9105,9107,9109,9111,9113],{"class":1052,"line":1522},[1050,9085,3612],{"class":1056},[1050,9087,6274],{"class":1315},[1050,9089,6277],{"class":1064},[1050,9091,1290],{"class":1282},[1050,9093,1359],{"class":1286},[1050,9095,1290],{"class":1282},[1050,9097,1441],{"class":1064},[1050,9099,1283],{"class":1282},[1050,9101,9102],{"class":1286},"Image too small (min 100x100)",[1050,9104,1290],{"class":1282},[1050,9106,6295],{"class":1064},[1050,9108,6298],{"class":1631},[1050,9110,1302],{"class":1064},[1050,9112,6303],{"class":1427},[1050,9114,1328],{"class":1064},[1050,9116,9117],{"class":1052,"line":1570},[1050,9118,4241],{"class":1060},[1050,9120,9121],{"class":1052,"line":1588},[1050,9122,9123],{"class":1408},"            # Process image\n",[1050,9125,9126,9129,9131,9134,9136,9138,9140,9142,9144,9146],{"class":1052,"line":1594},[1050,9127,9128],{"class":1060},"            processed_images ",[1050,9130,1302],{"class":1064},[1050,9132,9133],{"class":1315}," process_image_variants",[1050,9135,1239],{"class":1064},[1050,9137,4153],{"class":1315},[1050,9139,1077],{"class":1064},[1050,9141,1346],{"class":1315},[1050,9143,1065],{"class":1064},[1050,9145,1560],{"class":1274},[1050,9147,1328],{"class":1064},[1050,9149,9150],{"class":1052,"line":1599},[1050,9151,4241],{"class":1060},[1050,9153,9154],{"class":1052,"line":1605},[1050,9155,9156],{"class":1408},"            # Create database record\n",[1050,9158,9159,9162,9164,9166,9168,9170,9172,9174],{"class":1052,"line":1628},[1050,9160,9161],{"class":1060},"            image_upload ",[1050,9163,1302],{"class":1064},[1050,9165,3678],{"class":1060},[1050,9167,1065],{"class":1064},[1050,9169,1618],{"class":1274},[1050,9171,1065],{"class":1064},[1050,9173,1623],{"class":1315},[1050,9175,1519],{"class":1064},[1050,9177,9178,9180,9182,9184,9186,9188],{"class":1052,"line":1645},[1050,9179,7089],{"class":1631},[1050,9181,1302],{"class":1064},[1050,9183,1243],{"class":1315},[1050,9185,1065],{"class":1064},[1050,9187,1539],{"class":1274},[1050,9189,1567],{"class":1064},[1050,9191,9192,9195,9197,9199,9201,9203,9205,9207,9209,9211,9214,9216,9218,9221],{"class":1052,"line":1658},[1050,9193,9194],{"class":1631},"                title",[1050,9196,1302],{"class":1064},[1050,9198,1243],{"class":1315},[1050,9200,1065],{"class":1064},[1050,9202,1287],{"class":1309},[1050,9204,1065],{"class":1064},[1050,9206,1316],{"class":1315},[1050,9208,1239],{"class":1064},[1050,9210,1290],{"class":1282},[1050,9212,9213],{"class":1286},"title",[1050,9215,1290],{"class":1282},[1050,9217,1077],{"class":1064},[1050,9219,9220],{"class":1282}," ''",[1050,9222,5252],{"class":1064},[1050,9224,9225,9228,9230,9233,9236,9238,9241,9243],{"class":1052,"line":1674},[1050,9226,9227],{"class":1631},"                image",[1050,9229,1302],{"class":1064},[1050,9231,9232],{"class":1315},"processed_images",[1050,9234,9235],{"class":1064},"[",[1050,9237,1290],{"class":1282},[1050,9239,9240],{"class":1286},"original",[1050,9242,1290],{"class":1282},[1050,9244,9245],{"class":1064},"],\n",[1050,9247,9248,9251,9253,9255,9257,9259,9261,9263],{"class":1052,"line":1690},[1050,9249,9250],{"class":1631},"                thumbnail",[1050,9252,1302],{"class":1064},[1050,9254,9232],{"class":1315},[1050,9256,9235],{"class":1064},[1050,9258,1290],{"class":1282},[1050,9260,4315],{"class":1286},[1050,9262,1290],{"class":1282},[1050,9264,9245],{"class":1064},[1050,9266,9267,9270,9272,9274,9276,9278,9280,9282],{"class":1052,"line":1705},[1050,9268,9269],{"class":1631},"                medium",[1050,9271,1302],{"class":1064},[1050,9273,9232],{"class":1315},[1050,9275,9235],{"class":1064},[1050,9277,1290],{"class":1282},[1050,9279,4324],{"class":1286},[1050,9281,1290],{"class":1282},[1050,9283,9245],{"class":1064},[1050,9285,9286,9289,9291,9293],{"class":1052,"line":1710},[1050,9287,9288],{"class":1631},"                width",[1050,9290,1302],{"class":1064},[1050,9292,4218],{"class":1315},[1050,9294,1567],{"class":1064},[1050,9296,9297,9300,9302,9304],{"class":1052,"line":1715},[1050,9298,9299],{"class":1631},"                height",[1050,9301,1302],{"class":1064},[1050,9303,4227],{"class":1315},[1050,9305,1567],{"class":1064},[1050,9307,9308,9311,9313,9315,9317,9319,9321,9323,9325,9327,9330,9332,9334,9336],{"class":1052,"line":1753},[1050,9309,9310],{"class":1631},"                alt_text",[1050,9312,1302],{"class":1064},[1050,9314,1243],{"class":1315},[1050,9316,1065],{"class":1064},[1050,9318,1287],{"class":1309},[1050,9320,1065],{"class":1064},[1050,9322,1316],{"class":1315},[1050,9324,1239],{"class":1064},[1050,9326,1290],{"class":1282},[1050,9328,9329],{"class":1286},"alt_text",[1050,9331,1290],{"class":1282},[1050,9333,1077],{"class":1064},[1050,9335,9220],{"class":1282},[1050,9337,1328],{"class":1064},[1050,9339,9340],{"class":1052,"line":1788},[1050,9341,5578],{"class":1064},[1050,9343,9344],{"class":1052,"line":1794},[1050,9345,4241],{"class":1060},[1050,9347,9348,9350,9352],{"class":1052,"line":1816},[1050,9349,1380],{"class":1056},[1050,9351,6274],{"class":1315},[1050,9353,6360],{"class":1064},[1050,9355,9356,9358,9360,9362,9364,9366],{"class":1052,"line":1821},[1050,9357,5874],{"class":1282},[1050,9359,1723],{"class":1286},[1050,9361,1290],{"class":1282},[1050,9363,1441],{"class":1064},[1050,9365,6644],{"class":3229},[1050,9367,1567],{"class":1064},[1050,9369,9370,9372,9375,9377,9379,9382,9384,9386],{"class":1052,"line":1835},[1050,9371,5874],{"class":1282},[1050,9373,9374],{"class":1286},"image_id",[1050,9376,1290],{"class":1282},[1050,9378,1441],{"class":1064},[1050,9380,9381],{"class":1315}," image_upload",[1050,9383,1065],{"class":1064},[1050,9385,1544],{"class":1274},[1050,9387,1567],{"class":1064},[1050,9389,9390,9392,9395,9397,9399,9401,9403,9405,9407,9409],{"class":1052,"line":1845},[1050,9391,5874],{"class":1282},[1050,9393,9394],{"class":1286},"original_url",[1050,9396,1290],{"class":1282},[1050,9398,1441],{"class":1064},[1050,9400,9381],{"class":1315},[1050,9402,1065],{"class":1064},[1050,9404,4153],{"class":1274},[1050,9406,1065],{"class":1064},[1050,9408,6727],{"class":1274},[1050,9410,1567],{"class":1064},[1050,9412,9413,9415,9418,9420,9422,9424,9426,9428,9430,9432],{"class":1052,"line":1866},[1050,9414,5874],{"class":1282},[1050,9416,9417],{"class":1286},"thumbnail_url",[1050,9419,1290],{"class":1282},[1050,9421,1441],{"class":1064},[1050,9423,9381],{"class":1315},[1050,9425,1065],{"class":1064},[1050,9427,4315],{"class":1274},[1050,9429,1065],{"class":1064},[1050,9431,6727],{"class":1274},[1050,9433,1567],{"class":1064},[1050,9435,9436,9438,9441,9443,9445,9447,9449,9451,9453,9455],{"class":1052,"line":1895},[1050,9437,5874],{"class":1282},[1050,9439,9440],{"class":1286},"medium_url",[1050,9442,1290],{"class":1282},[1050,9444,1441],{"class":1064},[1050,9446,9381],{"class":1315},[1050,9448,1065],{"class":1064},[1050,9450,4324],{"class":1274},[1050,9452,1065],{"class":1064},[1050,9454,6727],{"class":1274},[1050,9456,1567],{"class":1064},[1050,9458,9459,9461,9464,9466,9468,9470,9472,9474,9476,9478,9481,9483,9485,9487],{"class":1052,"line":1900},[1050,9460,5874],{"class":1282},[1050,9462,9463],{"class":1286},"dimensions",[1050,9465,1290],{"class":1282},[1050,9467,1441],{"class":1064},[1050,9469,1732],{"class":1232},[1050,9471,1290],{"class":1286},[1050,9473,1532],{"class":1531},[1050,9475,4218],{"class":1315},[1050,9477,1547],{"class":1531},[1050,9479,9480],{"class":1286},"x",[1050,9482,1532],{"class":1531},[1050,9484,4227],{"class":1315},[1050,9486,1547],{"class":1531},[1050,9488,2847],{"class":1286},[1050,9490,9491],{"class":1052,"line":1912},[1050,9492,7222],{"class":1064},[1050,9494,9495],{"class":1052,"line":1936},[1050,9496,4241],{"class":1060},[1050,9498,9499,9501,9503,9505,9507],{"class":1052,"line":1958},[1050,9500,7231],{"class":1056},[1050,9502,2435],{"class":2434},[1050,9504,2438],{"class":1056},[1050,9506,2441],{"class":1060},[1050,9508,1293],{"class":1064},[1050,9510,9511,9513,9515,9517,9519,9521,9523,9525,9527,9530,9532,9534,9536,9538,9540,9542,9544,9546,9548,9550,9552],{"class":1052,"line":1963},[1050,9512,1380],{"class":1056},[1050,9514,6274],{"class":1315},[1050,9516,6277],{"class":1064},[1050,9518,1290],{"class":1282},[1050,9520,1359],{"class":1286},[1050,9522,1290],{"class":1282},[1050,9524,1441],{"class":1064},[1050,9526,1732],{"class":1232},[1050,9528,9529],{"class":1286},"'Error processing image: ",[1050,9531,1532],{"class":1531},[1050,9533,2477],{"class":2434},[1050,9535,1239],{"class":1064},[1050,9537,2482],{"class":1315},[1050,9539,2485],{"class":1064},[1050,9541,1547],{"class":1531},[1050,9543,1290],{"class":1286},[1050,9545,6295],{"class":1064},[1050,9547,6298],{"class":1631},[1050,9549,1302],{"class":1064},[1050,9551,6826],{"class":1427},[1050,9553,1328],{"class":1064},[1050,9555,9556],{"class":1052,"line":1974},[1050,9557,1791],{"class":1060},[1050,9559,9560,9562,9564,9566,9568,9570,9572,9575,9577],{"class":1052,"line":1984},[1050,9561,1797],{"class":1056},[1050,9563,1074],{"class":1315},[1050,9565,1239],{"class":1064},[1050,9567,1243],{"class":1315},[1050,9569,1077],{"class":1064},[1050,9571,1283],{"class":1282},[1050,9573,9574],{"class":1286},"uploads/image_form.html",[1050,9576,1290],{"class":1282},[1050,9578,1328],{"class":1064},[1050,9580,9581],{"class":1052,"line":1989},[1050,9582,1216],{"emptyLinePlaceholder":1215},[1050,9584,9585,9587,9589,9591,9593,9595,9597],{"class":1052,"line":2005},[1050,9586,1233],{"class":1232},[1050,9588,9133],{"class":1225},[1050,9590,1239],{"class":1064},[1050,9592,4153],{"class":1242},[1050,9594,1077],{"class":1064},[1050,9596,2757],{"class":1242},[1050,9598,1246],{"class":1064},[1050,9600,9601,9603,9606],{"class":1052,"line":2013},[1050,9602,1253],{"class":1252},[1050,9604,9605],{"class":1256},"Create multiple variants of uploaded image",[1050,9607,1260],{"class":1252},[1050,9609,9610,9613,9615],{"class":1052,"line":2019},[1050,9611,9612],{"class":1060},"    variants ",[1050,9614,1302],{"class":1064},[1050,9616,9617],{"class":1064}," {}\n",[1050,9619,9620],{"class":1052,"line":2049},[1050,9621,1791],{"class":1060},[1050,9623,9624],{"class":1052,"line":2082},[1050,9625,9626],{"class":1408},"    # Convert to RGB if necessary\n",[1050,9628,9629,9631,9633,9635,9638,9640,9642,9644,9647,9649,9651,9653,9656,9658,9660,9662,9665,9667],{"class":1052,"line":2088},[1050,9630,1266],{"class":1056},[1050,9632,8902],{"class":1060},[1050,9634,1065],{"class":1064},[1050,9636,9637],{"class":1274},"mode",[1050,9639,2162],{"class":1278},[1050,9641,6386],{"class":1064},[1050,9643,1290],{"class":1282},[1050,9645,9646],{"class":1286},"RGBA",[1050,9648,1290],{"class":1282},[1050,9650,1077],{"class":1064},[1050,9652,1283],{"class":1282},[1050,9654,9655],{"class":1286},"LA",[1050,9657,1290],{"class":1282},[1050,9659,1077],{"class":1064},[1050,9661,1283],{"class":1282},[1050,9663,9664],{"class":1286},"P",[1050,9666,1290],{"class":1282},[1050,9668,1246],{"class":1064},[1050,9670,9671,9673,9675,9677,9679,9682,9684,9686,9689,9691],{"class":1052,"line":2094},[1050,9672,4456],{"class":1060},[1050,9674,1302],{"class":1064},[1050,9676,8902],{"class":1060},[1050,9678,1065],{"class":1064},[1050,9680,9681],{"class":1315},"convert",[1050,9683,1239],{"class":1064},[1050,9685,1290],{"class":1282},[1050,9687,9688],{"class":1286},"RGB",[1050,9690,1290],{"class":1282},[1050,9692,1328],{"class":1064},[1050,9694,9695],{"class":1052,"line":2100},[1050,9696,1791],{"class":1060},[1050,9698,9699],{"class":1052,"line":2148},[1050,9700,9701],{"class":1408},"    # Original (optimized)\n",[1050,9703,9704,9707,9709,9711,9713,9715],{"class":1052,"line":2170},[1050,9705,9706],{"class":1060},"    original_io ",[1050,9708,1302],{"class":1064},[1050,9710,4541],{"class":1060},[1050,9712,1065],{"class":1064},[1050,9714,4546],{"class":1315},[1050,9716,3181],{"class":1064},[1050,9718,9719,9722,9724,9726,9728,9731,9733,9735,9737,9739,9741,9743,9745,9747,9749,9751,9753,9756,9758,9760],{"class":1052,"line":2200},[1050,9720,9721],{"class":1060},"    image",[1050,9723,1065],{"class":1064},[1050,9725,1516],{"class":1315},[1050,9727,1239],{"class":1064},[1050,9729,9730],{"class":1315},"original_io",[1050,9732,1077],{"class":1064},[1050,9734,4567],{"class":1631},[1050,9736,1302],{"class":1064},[1050,9738,1290],{"class":1282},[1050,9740,4574],{"class":1286},[1050,9742,1290],{"class":1282},[1050,9744,1077],{"class":1064},[1050,9746,4581],{"class":1631},[1050,9748,1302],{"class":1064},[1050,9750,5014],{"class":1427},[1050,9752,1077],{"class":1064},[1050,9754,9755],{"class":1631}," optimize",[1050,9757,1302],{"class":1064},[1050,9759,3230],{"class":3229},[1050,9761,1328],{"class":1064},[1050,9763,9764,9767,9769,9771,9773,9775],{"class":1052,"line":2205},[1050,9765,9766],{"class":1060},"    original_io",[1050,9768,1065],{"class":1064},[1050,9770,4599],{"class":1315},[1050,9772,1239],{"class":1064},[1050,9774,3338],{"class":1427},[1050,9776,1328],{"class":1064},[1050,9778,9779],{"class":1052,"line":2210},[1050,9780,1791],{"class":1060},[1050,9782,9783,9786,9788,9790,9793,9795,9797,9799],{"class":1052,"line":2216},[1050,9784,9785],{"class":1060},"    original_name ",[1050,9787,1302],{"class":1064},[1050,9789,1732],{"class":1232},[1050,9791,9792],{"class":1286},"\"original_",[1050,9794,1532],{"class":1531},[1050,9796,2876],{"class":1060},[1050,9798,1547],{"class":1531},[1050,9800,3637],{"class":1286},[1050,9802,9803,9805,9807,9809,9811,9813,9815,9817,9819,9822,9824,9826,9828,9830,9832,9834],{"class":1052,"line":2232},[1050,9804,9785],{"class":1060},[1050,9806,1302],{"class":1064},[1050,9808,3429],{"class":1060},[1050,9810,1065],{"class":1064},[1050,9812,3434],{"class":1274},[1050,9814,1065],{"class":1064},[1050,9816,3439],{"class":1315},[1050,9818,1239],{"class":1064},[1050,9820,9821],{"class":1315},"original_name",[1050,9823,2798],{"class":1064},[1050,9825,3338],{"class":1427},[1050,9827,4690],{"class":1064},[1050,9829,4693],{"class":1278},[1050,9831,1283],{"class":1282},[1050,9833,4698],{"class":1286},[1050,9835,2847],{"class":1282},[1050,9837,9838,9841,9843,9845,9847,9849,9851,9853,9855,9857,9859,9861,9863,9866,9869,9871,9873],{"class":1052,"line":2270},[1050,9839,9840],{"class":1060},"    variants",[1050,9842,9235],{"class":1064},[1050,9844,1290],{"class":1282},[1050,9846,9240],{"class":1286},[1050,9848,1290],{"class":1282},[1050,9850,4690],{"class":1064},[1050,9852,3119],{"class":1064},[1050,9854,8486],{"class":1315},[1050,9856,1239],{"class":1064},[1050,9858,9730],{"class":1315},[1050,9860,1065],{"class":1064},[1050,9862,1582],{"class":1315},[1050,9864,9865],{"class":1064},"(),",[1050,9867,9868],{"class":1631}," name",[1050,9870,1302],{"class":1064},[1050,9872,9821],{"class":1315},[1050,9874,1328],{"class":1064},[1050,9876,9877],{"class":1052,"line":2286},[1050,9878,1791],{"class":1060},[1050,9880,9881],{"class":1052,"line":2292},[1050,9882,9883],{"class":1408},"    # Thumbnail (150x150, cropped)\n",[1050,9885,9886,9889,9891,9893,9895,9898,9900,9902,9904,9906,9908,9910,9912,9915,9917,9919,9921,9923,9925],{"class":1052,"line":2297},[1050,9887,9888],{"class":1060},"    thumb_image ",[1050,9890,1302],{"class":1064},[1050,9892,8700],{"class":1060},[1050,9894,1065],{"class":1064},[1050,9896,9897],{"class":1315},"fit",[1050,9899,1239],{"class":1064},[1050,9901,4153],{"class":1315},[1050,9903,1077],{"class":1064},[1050,9905,6386],{"class":1064},[1050,9907,4356],{"class":1427},[1050,9909,1077],{"class":1064},[1050,9911,4361],{"class":1427},[1050,9913,9914],{"class":1064},"),",[1050,9916,4182],{"class":1315},[1050,9918,1065],{"class":1064},[1050,9920,4512],{"class":1274},[1050,9922,1065],{"class":1064},[1050,9924,4517],{"class":1309},[1050,9926,1328],{"class":1064},[1050,9928,9929,9932,9934,9936,9938,9940],{"class":1052,"line":2303},[1050,9930,9931],{"class":1060},"    thumb_io ",[1050,9933,1302],{"class":1064},[1050,9935,4541],{"class":1060},[1050,9937,1065],{"class":1064},[1050,9939,4546],{"class":1315},[1050,9941,3181],{"class":1064},[1050,9943,9944,9947,9949,9951,9953,9955,9957,9959,9961,9963,9965,9967,9969,9971,9973,9975],{"class":1052,"line":2323},[1050,9945,9946],{"class":1060},"    thumb_image",[1050,9948,1065],{"class":1064},[1050,9950,1516],{"class":1315},[1050,9952,1239],{"class":1064},[1050,9954,4562],{"class":1315},[1050,9956,1077],{"class":1064},[1050,9958,4567],{"class":1631},[1050,9960,1302],{"class":1064},[1050,9962,1290],{"class":1282},[1050,9964,4574],{"class":1286},[1050,9966,1290],{"class":1282},[1050,9968,1077],{"class":1064},[1050,9970,4581],{"class":1631},[1050,9972,1302],{"class":1064},[1050,9974,4586],{"class":1427},[1050,9976,1328],{"class":1064},[1050,9978,9979,9982,9984,9986,9988,9990],{"class":1052,"line":2339},[1050,9980,9981],{"class":1060},"    thumb_io",[1050,9983,1065],{"class":1064},[1050,9985,4599],{"class":1315},[1050,9987,1239],{"class":1064},[1050,9989,3338],{"class":1427},[1050,9991,1328],{"class":1064},[1050,9993,9994],{"class":1052,"line":2351},[1050,9995,1791],{"class":1060},[1050,9997,9998,10001,10003,10005,10007,10009,10011,10013],{"class":1052,"line":2367},[1050,9999,10000],{"class":1060},"    thumb_name ",[1050,10002,1302],{"class":1064},[1050,10004,1732],{"class":1232},[1050,10006,4629],{"class":1286},[1050,10008,1532],{"class":1531},[1050,10010,2876],{"class":1060},[1050,10012,1547],{"class":1531},[1050,10014,3637],{"class":1286},[1050,10016,10017,10019,10021,10023,10025,10027,10029,10031,10033,10035,10037,10039,10041,10043,10045,10047],{"class":1052,"line":2383},[1050,10018,10000],{"class":1060},[1050,10020,1302],{"class":1064},[1050,10022,3429],{"class":1060},[1050,10024,1065],{"class":1064},[1050,10026,3434],{"class":1274},[1050,10028,1065],{"class":1064},[1050,10030,3439],{"class":1315},[1050,10032,1239],{"class":1064},[1050,10034,4683],{"class":1315},[1050,10036,2798],{"class":1064},[1050,10038,3338],{"class":1427},[1050,10040,4690],{"class":1064},[1050,10042,4693],{"class":1278},[1050,10044,1283],{"class":1282},[1050,10046,4698],{"class":1286},[1050,10048,2847],{"class":1282},[1050,10050,10051,10053,10055,10057,10059,10061,10063,10065,10067,10069,10071,10073,10075,10077,10079,10081,10083],{"class":1052,"line":2397},[1050,10052,9840],{"class":1060},[1050,10054,9235],{"class":1064},[1050,10056,1290],{"class":1282},[1050,10058,4315],{"class":1286},[1050,10060,1290],{"class":1282},[1050,10062,4690],{"class":1064},[1050,10064,3119],{"class":1064},[1050,10066,8486],{"class":1315},[1050,10068,1239],{"class":1064},[1050,10070,4562],{"class":1315},[1050,10072,1065],{"class":1064},[1050,10074,1582],{"class":1315},[1050,10076,9865],{"class":1064},[1050,10078,9868],{"class":1631},[1050,10080,1302],{"class":1064},[1050,10082,4683],{"class":1315},[1050,10084,1328],{"class":1064},[1050,10086,10087],{"class":1052,"line":2402},[1050,10088,1791],{"class":1060},[1050,10090,10091],{"class":1052,"line":2407},[1050,10092,10093],{"class":1408},"    # Medium (800x600, maintain aspect ratio)\n",[1050,10095,10096,10099,10101,10103,10105,10108],{"class":1052,"line":2423},[1050,10097,10098],{"class":1060},"    medium_image ",[1050,10100,1302],{"class":1064},[1050,10102,8902],{"class":1060},[1050,10104,1065],{"class":1064},[1050,10106,10107],{"class":1315},"copy",[1050,10109,3181],{"class":1064},[1050,10111,10112,10115,10117,10119,10122,10124,10126,10128,10130,10132,10134,10136,10138,10140],{"class":1052,"line":2428},[1050,10113,10114],{"class":1060},"    medium_image",[1050,10116,1065],{"class":1064},[1050,10118,4315],{"class":1315},[1050,10120,10121],{"class":1064},"((",[1050,10123,4795],{"class":1427},[1050,10125,1077],{"class":1064},[1050,10127,4800],{"class":1427},[1050,10129,9914],{"class":1064},[1050,10131,4182],{"class":1315},[1050,10133,1065],{"class":1064},[1050,10135,4512],{"class":1274},[1050,10137,1065],{"class":1064},[1050,10139,4517],{"class":1309},[1050,10141,1328],{"class":1064},[1050,10143,10144,10147,10149,10151,10153,10155],{"class":1052,"line":2446},[1050,10145,10146],{"class":1060},"    medium_io ",[1050,10148,1302],{"class":1064},[1050,10150,4541],{"class":1060},[1050,10152,1065],{"class":1064},[1050,10154,4546],{"class":1315},[1050,10156,3181],{"class":1064},[1050,10158,10159,10161,10163,10165,10167,10169,10171,10173,10175,10177,10179,10181,10183,10185,10187,10189],{"class":1052,"line":2494},[1050,10160,10114],{"class":1060},[1050,10162,1065],{"class":1064},[1050,10164,1516],{"class":1315},[1050,10166,1239],{"class":1064},[1050,10168,4993],{"class":1315},[1050,10170,1077],{"class":1064},[1050,10172,4567],{"class":1631},[1050,10174,1302],{"class":1064},[1050,10176,1290],{"class":1282},[1050,10178,4574],{"class":1286},[1050,10180,1290],{"class":1282},[1050,10182,1077],{"class":1064},[1050,10184,4581],{"class":1631},[1050,10186,1302],{"class":1064},[1050,10188,4586],{"class":1427},[1050,10190,1328],{"class":1064},[1050,10192,10193,10196,10198,10200,10202,10204],{"class":1052,"line":2499},[1050,10194,10195],{"class":1060},"    medium_io",[1050,10197,1065],{"class":1064},[1050,10199,4599],{"class":1315},[1050,10201,1239],{"class":1064},[1050,10203,3338],{"class":1427},[1050,10205,1328],{"class":1064},[1050,10207,10208],{"class":1052,"line":2505},[1050,10209,1791],{"class":1060},[1050,10211,10212,10215,10217,10219,10221,10223,10225,10227],{"class":1052,"line":2515},[1050,10213,10214],{"class":1060},"    medium_name ",[1050,10216,1302],{"class":1064},[1050,10218,1732],{"class":1232},[1050,10220,5055],{"class":1286},[1050,10222,1532],{"class":1531},[1050,10224,2876],{"class":1060},[1050,10226,1547],{"class":1531},[1050,10228,3637],{"class":1286},[1050,10230,10231,10233,10235,10237,10239,10241,10243,10245,10247,10249,10251,10253,10255,10257,10259,10261],{"class":1052,"line":2554},[1050,10232,10214],{"class":1060},[1050,10234,1302],{"class":1064},[1050,10236,3429],{"class":1060},[1050,10238,1065],{"class":1064},[1050,10240,3434],{"class":1274},[1050,10242,1065],{"class":1064},[1050,10244,3439],{"class":1315},[1050,10246,1239],{"class":1064},[1050,10248,5107],{"class":1315},[1050,10250,2798],{"class":1064},[1050,10252,3338],{"class":1427},[1050,10254,4690],{"class":1064},[1050,10256,4693],{"class":1278},[1050,10258,1283],{"class":1282},[1050,10260,4698],{"class":1286},[1050,10262,2847],{"class":1282},[1050,10264,10265,10267,10269,10271,10273,10275,10277,10279,10281,10283,10285,10287,10289,10291,10293,10295,10297],{"class":1052,"line":2559},[1050,10266,9840],{"class":1060},[1050,10268,9235],{"class":1064},[1050,10270,1290],{"class":1282},[1050,10272,4324],{"class":1286},[1050,10274,1290],{"class":1282},[1050,10276,4690],{"class":1064},[1050,10278,3119],{"class":1064},[1050,10280,8486],{"class":1315},[1050,10282,1239],{"class":1064},[1050,10284,4993],{"class":1315},[1050,10286,1065],{"class":1064},[1050,10288,1582],{"class":1315},[1050,10290,9865],{"class":1064},[1050,10292,9868],{"class":1631},[1050,10294,1302],{"class":1064},[1050,10296,5107],{"class":1315},[1050,10298,1328],{"class":1064},[1050,10300,10301],{"class":1052,"line":2574},[1050,10302,1791],{"class":1060},[1050,10304,10305,10307],{"class":1052,"line":2594},[1050,10306,1797],{"class":1056},[1050,10308,10309],{"class":1060}," variants\n",[1050,10311,10312],{"class":1052,"line":2599},[1050,10313,1216],{"emptyLinePlaceholder":1215},[1050,10315,10316,10318,10321,10323,10325,10327,10330],{"class":1052,"line":2608},[1050,10317,1233],{"class":1232},[1050,10319,10320],{"class":1225}," apply_image_filters",[1050,10322,1239],{"class":1064},[1050,10324,1243],{"class":1242},[1050,10326,1077],{"class":1064},[1050,10328,10329],{"class":1242}," image_id",[1050,10331,1246],{"class":1064},[1050,10333,10334,10336,10339],{"class":1052,"line":2626},[1050,10335,1253],{"class":1252},[1050,10337,10338],{"class":1256},"Apply filters to uploaded image",[1050,10340,1260],{"class":1252},[1050,10342,10343,10346,10348,10351,10353,10356,10358,10361,10363,10365,10367,10370,10372,10374,10376,10378],{"class":1052,"line":2631},[1050,10344,10345],{"class":1060},"    image_upload ",[1050,10347,1302],{"class":1064},[1050,10349,10350],{"class":1315}," get_object_or_404",[1050,10352,1239],{"class":1064},[1050,10354,10355],{"class":1315},"ImageUpload",[1050,10357,1077],{"class":1064},[1050,10359,10360],{"class":1631}," id",[1050,10362,1302],{"class":1064},[1050,10364,9374],{"class":1315},[1050,10366,1077],{"class":1064},[1050,10368,10369],{"class":1631}," user",[1050,10371,1302],{"class":1064},[1050,10373,1243],{"class":1315},[1050,10375,1065],{"class":1064},[1050,10377,1539],{"class":1274},[1050,10379,1328],{"class":1064},[1050,10381,10382],{"class":1052,"line":4410},[1050,10383,1791],{"class":1060},[1050,10385,10386,10388,10390,10392,10394,10396,10398,10400,10402],{"class":1052,"line":4419},[1050,10387,1266],{"class":1056},[1050,10389,1269],{"class":1060},[1050,10391,1065],{"class":1064},[1050,10393,1275],{"class":1274},[1050,10395,1279],{"class":1278},[1050,10397,1283],{"class":1282},[1050,10399,1287],{"class":1286},[1050,10401,1290],{"class":1282},[1050,10403,1293],{"class":1064},[1050,10405,10406,10409,10411,10413,10415,10417,10419,10421,10423,10425,10428,10430],{"class":1052,"line":4442},[1050,10407,10408],{"class":1060},"        filter_type ",[1050,10410,1302],{"class":1064},[1050,10412,1269],{"class":1060},[1050,10414,1065],{"class":1064},[1050,10416,1287],{"class":1309},[1050,10418,1065],{"class":1064},[1050,10420,1316],{"class":1315},[1050,10422,1239],{"class":1064},[1050,10424,1290],{"class":1282},[1050,10426,10427],{"class":1286},"filter",[1050,10429,1290],{"class":1282},[1050,10431,1328],{"class":1064},[1050,10433,10434],{"class":1052,"line":4447},[1050,10435,1334],{"class":1060},[1050,10437,10438],{"class":1052,"line":4453},[1050,10439,10440],{"class":1408},"        # Open original image\n",[1050,10442,10443,10445,10447,10449,10451,10453,10455,10458,10460,10462,10464,10466],{"class":1052,"line":4481},[1050,10444,4456],{"class":1060},[1050,10446,1302],{"class":1064},[1050,10448,4182],{"class":1060},[1050,10450,1065],{"class":1064},[1050,10452,4187],{"class":1315},[1050,10454,1239],{"class":1064},[1050,10456,10457],{"class":1315},"image_upload",[1050,10459,1065],{"class":1064},[1050,10461,4153],{"class":1274},[1050,10463,1065],{"class":1064},[1050,10465,3434],{"class":1274},[1050,10467,1328],{"class":1064},[1050,10469,10470],{"class":1052,"line":4486},[1050,10471,1334],{"class":1060},[1050,10473,10474],{"class":1052,"line":4492},[1050,10475,10476],{"class":1408},"        # Apply filter\n",[1050,10478,10479,10481,10484,10487,10489,10492,10494],{"class":1052,"line":4522},[1050,10480,1340],{"class":1056},[1050,10482,10483],{"class":1060}," filter_type ",[1050,10485,10486],{"class":1278},"==",[1050,10488,1283],{"class":1282},[1050,10490,10491],{"class":1286},"blur",[1050,10493,1290],{"class":1282},[1050,10495,1293],{"class":1064},[1050,10497,10498,10501,10503,10505,10507,10509,10511,10514,10516,10519],{"class":1052,"line":4527},[1050,10499,10500],{"class":1060},"            filtered_image ",[1050,10502,1302],{"class":1064},[1050,10504,8902],{"class":1060},[1050,10506,1065],{"class":1064},[1050,10508,10427],{"class":1315},[1050,10510,1239],{"class":1064},[1050,10512,10513],{"class":1315},"ImageFilter",[1050,10515,1065],{"class":1064},[1050,10517,10518],{"class":1309},"BLUR",[1050,10520,1328],{"class":1064},[1050,10522,10523,10526,10528,10530,10532,10535,10537],{"class":1052,"line":4533},[1050,10524,10525],{"class":1056},"        elif",[1050,10527,10483],{"class":1060},[1050,10529,10486],{"class":1278},[1050,10531,1283],{"class":1282},[1050,10533,10534],{"class":1286},"sharpen",[1050,10536,1290],{"class":1282},[1050,10538,1293],{"class":1064},[1050,10540,10541,10543,10545,10547,10549,10551,10553,10555,10557,10560],{"class":1052,"line":4551},[1050,10542,10500],{"class":1060},[1050,10544,1302],{"class":1064},[1050,10546,8902],{"class":1060},[1050,10548,1065],{"class":1064},[1050,10550,10427],{"class":1315},[1050,10552,1239],{"class":1064},[1050,10554,10513],{"class":1315},[1050,10556,1065],{"class":1064},[1050,10558,10559],{"class":1309},"SHARPEN",[1050,10561,1328],{"class":1064},[1050,10563,10564,10566,10568,10570,10572,10575,10577],{"class":1052,"line":4591},[1050,10565,10525],{"class":1056},[1050,10567,10483],{"class":1060},[1050,10569,10486],{"class":1278},[1050,10571,1283],{"class":1282},[1050,10573,10574],{"class":1286},"grayscale",[1050,10576,1290],{"class":1282},[1050,10578,1293],{"class":1064},[1050,10580,10581,10583,10585,10587,10589,10591,10593,10595,10598,10600,10603,10605,10607,10609,10611,10613],{"class":1052,"line":4608},[1050,10582,10500],{"class":1060},[1050,10584,1302],{"class":1064},[1050,10586,8902],{"class":1060},[1050,10588,1065],{"class":1064},[1050,10590,9681],{"class":1315},[1050,10592,1239],{"class":1064},[1050,10594,1290],{"class":1282},[1050,10596,10597],{"class":1286},"L",[1050,10599,1290],{"class":1282},[1050,10601,10602],{"class":1064},").",[1050,10604,9681],{"class":1315},[1050,10606,1239],{"class":1064},[1050,10608,1290],{"class":1282},[1050,10610,9688],{"class":1286},[1050,10612,1290],{"class":1282},[1050,10614,1328],{"class":1064},[1050,10616,10617,10619,10621,10623,10625,10628,10630],{"class":1052,"line":4613},[1050,10618,10525],{"class":1056},[1050,10620,10483],{"class":1060},[1050,10622,10486],{"class":1278},[1050,10624,1283],{"class":1282},[1050,10626,10627],{"class":1286},"sepia",[1050,10629,1290],{"class":1282},[1050,10631,1293],{"class":1064},[1050,10633,10634,10636,10638,10641,10643,10645],{"class":1052,"line":4619},[1050,10635,10500],{"class":1060},[1050,10637,1302],{"class":1064},[1050,10639,10640],{"class":1315}," apply_sepia_filter",[1050,10642,1239],{"class":1064},[1050,10644,4153],{"class":1315},[1050,10646,1328],{"class":1064},[1050,10648,10649,10652],{"class":1052,"line":4664},[1050,10650,10651],{"class":1056},"        else",[1050,10653,1293],{"class":1064},[1050,10655,10656,10658,10660,10662,10664,10666,10668,10670,10672,10675,10677,10679,10681,10683,10685],{"class":1052,"line":4703},[1050,10657,1380],{"class":1056},[1050,10659,6274],{"class":1315},[1050,10661,6277],{"class":1064},[1050,10663,1290],{"class":1282},[1050,10665,1359],{"class":1286},[1050,10667,1290],{"class":1282},[1050,10669,1441],{"class":1064},[1050,10671,1283],{"class":1282},[1050,10673,10674],{"class":1286},"Invalid filter type",[1050,10676,1290],{"class":1282},[1050,10678,6295],{"class":1064},[1050,10680,6298],{"class":1631},[1050,10682,1302],{"class":1064},[1050,10684,6303],{"class":1427},[1050,10686,1328],{"class":1064},[1050,10688,10689],{"class":1052,"line":4708},[1050,10690,1334],{"class":1060},[1050,10692,10693],{"class":1052,"line":4714},[1050,10694,10695],{"class":1408},"        # Save filtered image\n",[1050,10697,10698,10701,10703,10705,10707,10709],{"class":1052,"line":4730},[1050,10699,10700],{"class":1060},"        filtered_io ",[1050,10702,1302],{"class":1064},[1050,10704,4541],{"class":1060},[1050,10706,1065],{"class":1064},[1050,10708,4546],{"class":1315},[1050,10710,3181],{"class":1064},[1050,10712,10713,10716,10718,10720,10722,10725,10727,10729,10731,10733,10735,10737,10739,10741,10743,10745],{"class":1052,"line":4738},[1050,10714,10715],{"class":1060},"        filtered_image",[1050,10717,1065],{"class":1064},[1050,10719,1516],{"class":1315},[1050,10721,1239],{"class":1064},[1050,10723,10724],{"class":1315},"filtered_io",[1050,10726,1077],{"class":1064},[1050,10728,4567],{"class":1631},[1050,10730,1302],{"class":1064},[1050,10732,1290],{"class":1282},[1050,10734,4574],{"class":1286},[1050,10736,1290],{"class":1282},[1050,10738,1077],{"class":1064},[1050,10740,4581],{"class":1631},[1050,10742,1302],{"class":1064},[1050,10744,5014],{"class":1427},[1050,10746,1328],{"class":1064},[1050,10748,10749,10752,10754,10756,10758,10760],{"class":1052,"line":4754},[1050,10750,10751],{"class":1060},"        filtered_io",[1050,10753,1065],{"class":1064},[1050,10755,4599],{"class":1315},[1050,10757,1239],{"class":1064},[1050,10759,3338],{"class":1427},[1050,10761,1328],{"class":1064},[1050,10763,10764],{"class":1052,"line":4765},[1050,10765,1334],{"class":1060},[1050,10767,10768,10771,10773,10775,10778,10780,10783,10785,10788,10790,10792,10794,10796,10798,10800,10802,10804,10806,10808,10810,10812,10814,10816],{"class":1052,"line":4770},[1050,10769,10770],{"class":1060},"        filtered_name ",[1050,10772,1302],{"class":1064},[1050,10774,1732],{"class":1232},[1050,10776,10777],{"class":1286},"\"filtered_",[1050,10779,1532],{"class":1531},[1050,10781,10782],{"class":1060},"filter_type",[1050,10784,1547],{"class":1531},[1050,10786,10787],{"class":1286},"_",[1050,10789,1532],{"class":1531},[1050,10791,4634],{"class":1060},[1050,10793,1065],{"class":1064},[1050,10795,3434],{"class":1274},[1050,10797,1065],{"class":1064},[1050,10799,4643],{"class":1315},[1050,10801,1239],{"class":1064},[1050,10803,10457],{"class":1315},[1050,10805,1065],{"class":1064},[1050,10807,4153],{"class":1274},[1050,10809,1065],{"class":1064},[1050,10811,1560],{"class":1274},[1050,10813,2485],{"class":1064},[1050,10815,1547],{"class":1531},[1050,10817,3637],{"class":1286},[1050,10819,10820],{"class":1052,"line":4775},[1050,10821,1334],{"class":1060},[1050,10823,10824],{"class":1052,"line":4805},[1050,10825,10826],{"class":1408},"        # Create new image record\n",[1050,10828,10829,10832,10834,10836,10838,10840,10842,10844],{"class":1052,"line":4815},[1050,10830,10831],{"class":1060},"        filtered_upload ",[1050,10833,1302],{"class":1064},[1050,10835,3678],{"class":1060},[1050,10837,1065],{"class":1064},[1050,10839,1618],{"class":1274},[1050,10841,1065],{"class":1064},[1050,10843,1623],{"class":1315},[1050,10845,1519],{"class":1064},[1050,10847,10848,10850,10852,10854,10856,10858],{"class":1052,"line":4830},[1050,10849,1632],{"class":1631},[1050,10851,1302],{"class":1064},[1050,10853,1243],{"class":1315},[1050,10855,1065],{"class":1064},[1050,10857,1539],{"class":1274},[1050,10859,1567],{"class":1064},[1050,10861,10862,10865,10867,10869,10871,10873,10875,10877,10879,10881,10883,10885,10887,10889,10892],{"class":1052,"line":4835},[1050,10863,10864],{"class":1631},"            title",[1050,10866,1302],{"class":1064},[1050,10868,2062],{"class":1232},[1050,10870,3617],{"class":1286},[1050,10872,1532],{"class":1531},[1050,10874,10457],{"class":1315},[1050,10876,1065],{"class":1064},[1050,10878,9213],{"class":1274},[1050,10880,1547],{"class":1531},[1050,10882,6386],{"class":1286},[1050,10884,1532],{"class":1531},[1050,10886,10782],{"class":1315},[1050,10888,1547],{"class":1531},[1050,10890,10891],{"class":1286},")\"",[1050,10893,1567],{"class":1064},[1050,10895,10896,10899,10901,10904,10906,10908,10910,10912,10914,10916,10918,10921],{"class":1052,"line":4840},[1050,10897,10898],{"class":1631},"            image",[1050,10900,1302],{"class":1064},[1050,10902,10903],{"class":1315},"ContentFile",[1050,10905,1239],{"class":1064},[1050,10907,10724],{"class":1315},[1050,10909,1065],{"class":1064},[1050,10911,1582],{"class":1315},[1050,10913,9865],{"class":1064},[1050,10915,9868],{"class":1631},[1050,10917,1302],{"class":1064},[1050,10919,10920],{"class":1315},"filtered_name",[1050,10922,5252],{"class":1064},[1050,10924,10925,10928,10930,10932,10934],{"class":1052,"line":4851},[1050,10926,10927],{"class":1631},"            alt_text",[1050,10929,1302],{"class":1064},[1050,10931,10457],{"class":1315},[1050,10933,1065],{"class":1064},[1050,10935,10936],{"class":1274},"alt_text\n",[1050,10938,10939],{"class":1052,"line":4858},[1050,10940,1591],{"class":1064},[1050,10942,10943],{"class":1052,"line":4881},[1050,10944,1334],{"class":1060},[1050,10946,10947,10949,10951],{"class":1052,"line":4886},[1050,10948,1756],{"class":1056},[1050,10950,6274],{"class":1315},[1050,10952,6360],{"class":1064},[1050,10954,10955,10957,10959,10961,10963,10965],{"class":1052,"line":4891},[1050,10956,6635],{"class":1282},[1050,10958,1723],{"class":1286},[1050,10960,1290],{"class":1282},[1050,10962,1441],{"class":1064},[1050,10964,6644],{"class":3229},[1050,10966,1567],{"class":1064},[1050,10968,10969,10971,10974,10976,10978,10981,10983,10985],{"class":1052,"line":4918},[1050,10970,6635],{"class":1282},[1050,10972,10973],{"class":1286},"filtered_image_id",[1050,10975,1290],{"class":1282},[1050,10977,1441],{"class":1064},[1050,10979,10980],{"class":1315}," filtered_upload",[1050,10982,1065],{"class":1064},[1050,10984,1544],{"class":1274},[1050,10986,1567],{"class":1064},[1050,10988,10989,10991,10994,10996,10998,11000,11002,11004,11006],{"class":1052,"line":4923},[1050,10990,6635],{"class":1282},[1050,10992,10993],{"class":1286},"filtered_url",[1050,10995,1290],{"class":1282},[1050,10997,1441],{"class":1064},[1050,10999,10980],{"class":1315},[1050,11001,1065],{"class":1064},[1050,11003,4153],{"class":1274},[1050,11005,1065],{"class":1064},[1050,11007,7953],{"class":1274},[1050,11009,11010],{"class":1052,"line":4929},[1050,11011,6776],{"class":1064},[1050,11013,11014],{"class":1052,"line":4956},[1050,11015,1791],{"class":1060},[1050,11017,11018,11020,11022,11024,11026,11028,11030,11033,11035,11037,11039,11041,11043,11045,11047,11049],{"class":1052,"line":4961},[1050,11019,1797],{"class":1056},[1050,11021,1074],{"class":1315},[1050,11023,1239],{"class":1064},[1050,11025,1243],{"class":1315},[1050,11027,1077],{"class":1064},[1050,11029,1283],{"class":1282},[1050,11031,11032],{"class":1286},"uploads/image_filters.html",[1050,11034,1290],{"class":1282},[1050,11036,1077],{"class":1064},[1050,11038,3629],{"class":1064},[1050,11040,1290],{"class":1282},[1050,11042,4153],{"class":1286},[1050,11044,1290],{"class":1282},[1050,11046,1441],{"class":1064},[1050,11048,9381],{"class":1315},[1050,11050,11051],{"class":1064},"})\n",[1050,11053,11054],{"class":1052,"line":4966},[1050,11055,1216],{"emptyLinePlaceholder":1215},[1050,11057,11058,11060,11062,11064,11066],{"class":1052,"line":4982},[1050,11059,1233],{"class":1232},[1050,11061,10640],{"class":1225},[1050,11063,1239],{"class":1064},[1050,11065,4153],{"class":1242},[1050,11067,1246],{"class":1064},[1050,11069,11070,11072,11075],{"class":1052,"line":5019},[1050,11071,1253],{"class":1252},[1050,11073,11074],{"class":1256},"Apply sepia tone filter",[1050,11076,1260],{"class":1252},[1050,11078,11079,11082,11084,11086,11088,11091],{"class":1052,"line":5035},[1050,11080,11081],{"class":1060},"    pixels ",[1050,11083,1302],{"class":1064},[1050,11085,8902],{"class":1060},[1050,11087,1065],{"class":1064},[1050,11089,11090],{"class":1315},"load",[1050,11092,3181],{"class":1064},[1050,11094,11095,11098,11100,11102,11104,11106,11108],{"class":1052,"line":5040},[1050,11096,11097],{"class":1060},"    width",[1050,11099,1077],{"class":1064},[1050,11101,8991],{"class":1060},[1050,11103,1302],{"class":1064},[1050,11105,8902],{"class":1060},[1050,11107,1065],{"class":1064},[1050,11109,4236],{"class":1274},[1050,11111,11112],{"class":1052,"line":5045},[1050,11113,1791],{"class":1060},[1050,11115,11116,11119,11122,11124,11127,11129,11131],{"class":1052,"line":5088},[1050,11117,11118],{"class":1056},"    for",[1050,11120,11121],{"class":1060}," y ",[1050,11123,1998],{"class":1056},[1050,11125,11126],{"class":2536}," range",[1050,11128,1239],{"class":1064},[1050,11130,4227],{"class":1315},[1050,11132,1246],{"class":1064},[1050,11134,11135,11137,11140,11142,11144,11146,11148],{"class":1052,"line":5124},[1050,11136,1992],{"class":1056},[1050,11138,11139],{"class":1060}," x ",[1050,11141,1998],{"class":1056},[1050,11143,11126],{"class":2536},[1050,11145,1239],{"class":1064},[1050,11147,4218],{"class":1315},[1050,11149,1246],{"class":1064},[1050,11151,11152,11155,11157,11160,11162,11165,11167,11170,11172,11174,11176,11179],{"class":1052,"line":5129},[1050,11153,11154],{"class":1060},"            r",[1050,11156,1077],{"class":1064},[1050,11158,11159],{"class":1060}," g",[1050,11161,1077],{"class":1064},[1050,11163,11164],{"class":1060}," b ",[1050,11166,1302],{"class":1064},[1050,11168,11169],{"class":1060}," pixels",[1050,11171,9235],{"class":1064},[1050,11173,9480],{"class":1060},[1050,11175,1077],{"class":1064},[1050,11177,11178],{"class":1060}," y",[1050,11180,2145],{"class":1064},[1050,11182,11183],{"class":1052,"line":5134},[1050,11184,4241],{"class":1060},[1050,11186,11187],{"class":1052,"line":5149},[1050,11188,11189],{"class":1408},"            # Sepia formula\n",[1050,11191,11192,11195,11197,11199,11201,11204,11206,11209,11211,11214,11216,11219,11221,11224,11226,11229],{"class":1052,"line":5157},[1050,11193,11194],{"class":1060},"            tr ",[1050,11196,1302],{"class":1064},[1050,11198,7449],{"class":2434},[1050,11200,1239],{"class":1064},[1050,11202,11203],{"class":1427},"0.393",[1050,11205,1431],{"class":1278},[1050,11207,11208],{"class":1315}," r ",[1050,11210,7201],{"class":1278},[1050,11212,11213],{"class":1427}," 0.769",[1050,11215,1431],{"class":1278},[1050,11217,11218],{"class":1315}," g ",[1050,11220,7201],{"class":1278},[1050,11222,11223],{"class":1427}," 0.189",[1050,11225,1431],{"class":1278},[1050,11227,11228],{"class":1315}," b",[1050,11230,1328],{"class":1064},[1050,11232,11233,11236,11238,11240,11242,11245,11247,11249,11251,11254,11256,11258,11260,11263,11265,11267],{"class":1052,"line":5172},[1050,11234,11235],{"class":1060},"            tg ",[1050,11237,1302],{"class":1064},[1050,11239,7449],{"class":2434},[1050,11241,1239],{"class":1064},[1050,11243,11244],{"class":1427},"0.349",[1050,11246,1431],{"class":1278},[1050,11248,11208],{"class":1315},[1050,11250,7201],{"class":1278},[1050,11252,11253],{"class":1427}," 0.686",[1050,11255,1431],{"class":1278},[1050,11257,11218],{"class":1315},[1050,11259,7201],{"class":1278},[1050,11261,11262],{"class":1427}," 0.168",[1050,11264,1431],{"class":1278},[1050,11266,11228],{"class":1315},[1050,11268,1328],{"class":1064},[1050,11270,11271,11274,11276,11278,11280,11283,11285,11287,11289,11292,11294,11296,11298,11301,11303,11305],{"class":1052,"line":5181},[1050,11272,11273],{"class":1060},"            tb ",[1050,11275,1302],{"class":1064},[1050,11277,7449],{"class":2434},[1050,11279,1239],{"class":1064},[1050,11281,11282],{"class":1427},"0.272",[1050,11284,1431],{"class":1278},[1050,11286,11208],{"class":1315},[1050,11288,7201],{"class":1278},[1050,11290,11291],{"class":1427}," 0.534",[1050,11293,1431],{"class":1278},[1050,11295,11218],{"class":1315},[1050,11297,7201],{"class":1278},[1050,11299,11300],{"class":1427}," 0.131",[1050,11302,1431],{"class":1278},[1050,11304,11228],{"class":1315},[1050,11306,1328],{"class":1064},[1050,11308,11309],{"class":1052,"line":5186},[1050,11310,4241],{"class":1060},[1050,11312,11313],{"class":1052,"line":5191},[1050,11314,11315],{"class":1408},"            # Clamp values\n",[1050,11317,11318,11321,11323,11325,11327,11329,11331,11333,11335,11338,11340,11342,11344,11347,11349,11352,11354,11356,11358,11361,11363,11365,11367,11369,11371,11374],{"class":1052,"line":5209},[1050,11319,11320],{"class":1060},"            pixels",[1050,11322,9235],{"class":1064},[1050,11324,9480],{"class":1060},[1050,11326,1077],{"class":1064},[1050,11328,11178],{"class":1060},[1050,11330,4690],{"class":1064},[1050,11332,3119],{"class":1064},[1050,11334,6386],{"class":1064},[1050,11336,11337],{"class":2536},"min",[1050,11339,1239],{"class":1064},[1050,11341,3162],{"class":1427},[1050,11343,1077],{"class":1064},[1050,11345,11346],{"class":1315}," tr",[1050,11348,9914],{"class":1064},[1050,11350,11351],{"class":2536}," min",[1050,11353,1239],{"class":1064},[1050,11355,3162],{"class":1427},[1050,11357,1077],{"class":1064},[1050,11359,11360],{"class":1315}," tg",[1050,11362,9914],{"class":1064},[1050,11364,11351],{"class":2536},[1050,11366,1239],{"class":1064},[1050,11368,3162],{"class":1427},[1050,11370,1077],{"class":1064},[1050,11372,11373],{"class":1315}," tb",[1050,11375,7473],{"class":1064},[1050,11377,11378],{"class":1052,"line":5219},[1050,11379,1791],{"class":1060},[1050,11381,11382,11384],{"class":1052,"line":5230},[1050,11383,1797],{"class":1056},[1050,11385,11386],{"class":1060}," image\n",[1030,11388,11390],{"id":11389},"file-upload-security","File Upload Security",[1035,11392,11394],{"id":11393},"validation-and-sanitization","Validation and Sanitization",[1040,11396,11398],{"className":1042,"code":11397,"language":1044,"meta":1045,"style":1045},"import magic\nfrom django.core.exceptions import ValidationError\nfrom django.core.files.uploadedfile import UploadedFile\n\ndef validate_file_type(uploaded_file):\n    \"\"\"Validate file type using python-magic\"\"\"\n    # Read file content to determine actual type\n    file_content = uploaded_file.read()\n    uploaded_file.seek(0)  # Reset file pointer\n    \n    # Use python-magic to detect file type\n    file_type = magic.from_buffer(file_content, mime=True)\n    \n    # Define allowed types\n    allowed_types = {\n        'image/jpeg': ['.jpg', '.jpeg'],\n        'image/png': ['.png'],\n        'image/gif': ['.gif'],\n        'application/pdf': ['.pdf'],\n        'text/plain': ['.txt'],\n        'application/msword': ['.doc'],\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],\n    }\n    \n    # Check if detected type is allowed\n    if file_type not in allowed_types:\n        raise ValidationError(f'File type {file_type} is not allowed')\n    \n    # Check if file extension matches detected type\n    file_ext = os.path.splitext(uploaded_file.name)[1].lower()\n    if file_ext not in allowed_types[file_type]:\n        raise ValidationError(f'File extension {file_ext} does not match file type {file_type}')\n    \n    return True\n\ndef sanitize_filename(filename):\n    \"\"\"Sanitize uploaded filename\"\"\"\n    import re\n    \n    # Remove path components\n    filename = os.path.basename(filename)\n    \n    # Remove or replace dangerous characters\n    filename = re.sub(r'[^\\w\\s.-]', '', filename)\n    \n    # Replace spaces with underscores\n    filename = re.sub(r'\\s+', '_', filename)\n    \n    # Limit length\n    name, ext = os.path.splitext(filename)\n    if len(name) > 100:\n        name = name[:100]\n    \n    return f\"{name}{ext}\"\n\ndef scan_file_for_malware(uploaded_file):\n    \"\"\"Basic malware scanning (placeholder)\"\"\"\n    # In production, integrate with antivirus service\n    # This is a simplified example\n    \n    suspicious_patterns = [\n        b'\u003Cscript',\n        b'javascript:',\n        b'vbscript:',\n        b'\u003C?php',\n        b'\u003C%',\n    ]\n    \n    # Read file content\n    content = uploaded_file.read()\n    uploaded_file.seek(0)\n    \n    # Check for suspicious patterns\n    for pattern in suspicious_patterns:\n        if pattern in content.lower():\n            raise ValidationError('File contains suspicious content')\n    \n    return True\n\n@login_required\ndef secure_file_upload(request):\n    \"\"\"Secure file upload with comprehensive validation\"\"\"\n    if request.method == 'POST':\n        uploaded_file = request.FILES.get('file')\n        \n        if not uploaded_file:\n            messages.error(request, 'No file selected.')\n            return render(request, 'uploads/secure_form.html')\n        \n        try:\n            # File size validation\n            max_size = 10 * 1024 * 1024  # 10MB\n            if uploaded_file.size > max_size:\n                raise ValidationError(f'File size exceeds {max_size // (1024*1024)}MB limit')\n            \n            # File type validation\n            validate_file_type(uploaded_file)\n            \n            # Malware scanning\n            scan_file_for_malware(uploaded_file)\n            \n            # Sanitize filename\n            safe_filename = sanitize_filename(uploaded_file.name)\n            \n            # Generate unique filename to prevent conflicts\n            unique_filename = f\"{uuid.uuid4().hex}_{safe_filename}\"\n            \n            # Save file with secure path\n            file_path = f'secure_uploads/{request.user.id}/{unique_filename}'\n            saved_path = default_storage.save(file_path, uploaded_file)\n            \n            # Create database record\n            secure_file = SecureFile.objects.create(\n                user=request.user,\n                file=saved_path,\n                original_filename=uploaded_file.name,\n                safe_filename=safe_filename,\n                file_size=uploaded_file.size,\n                content_type=uploaded_file.content_type,\n                checksum=calculate_file_checksum(uploaded_file)\n            )\n            \n            messages.success(request, 'File uploaded successfully!')\n            return redirect('uploads:secure_file_detail', pk=secure_file.pk)\n            \n        except ValidationError as e:\n            messages.error(request, str(e))\n        except Exception as e:\n            messages.error(request, f'Upload failed: {str(e)}')\n    \n    return render(request, 'uploads/secure_form.html')\n\ndef calculate_file_checksum(uploaded_file):\n    \"\"\"Calculate SHA-256 checksum of uploaded file\"\"\"\n    import hashlib\n    \n    sha256_hash = hashlib.sha256()\n    \n    # Read file in chunks to handle large files\n    uploaded_file.seek(0)\n    for chunk in iter(lambda: uploaded_file.read(4096), b\"\"):\n        sha256_hash.update(chunk)\n    \n    uploaded_file.seek(0)\n    return sha256_hash.hexdigest()\n",[1047,11399,11400,11407,11427,11451,11455,11468,11477,11482,11497,11515,11519,11524,11555,11559,11564,11573,11603,11624,11645,11665,11686,11707,11728,11733,11737,11742,11758,11785,11789,11794,11829,11848,11881,11885,11892,11896,11909,11918,11925,11929,11934,11956,11960,11965,12014,12018,12023,12063,12067,12072,12100,12118,12134,12138,12158,12162,12175,12184,12189,12194,12198,12207,12221,12234,12247,12260,12273,12277,12281,12286,12301,12315,12319,12324,12338,12356,12374,12378,12384,12388,12394,12407,12416,12436,12462,12466,12476,12498,12519,12523,12529,12534,12553,12569,12606,12610,12615,12626,12630,12635,12646,12650,12655,12674,12678,12683,12719,12723,12728,12765,12788,12792,12796,12816,12830,12842,12857,12868,12882,12897,12913,12917,12921,12944,12974,12978,12992,13014,13026,13061,13065,13085,13089,13102,13111,13118,13122,13139,13143,13148,13162,13201,13217,13221,13235],{"__ignoreMap":1045},[1050,11401,11402,11404],{"class":1052,"line":1053},[1050,11403,1071],{"class":1056},[1050,11405,11406],{"class":1060}," magic\n",[1050,11408,11409,11411,11413,11415,11417,11419,11422,11424],{"class":1052,"line":1083},[1050,11410,1057],{"class":1056},[1050,11412,1061],{"class":1060},[1050,11414,1065],{"class":1064},[1050,11416,1136],{"class":1060},[1050,11418,1065],{"class":1064},[1050,11420,11421],{"class":1060},"exceptions ",[1050,11423,1071],{"class":1056},[1050,11425,11426],{"class":1060}," ValidationError\n",[1050,11428,11429,11431,11433,11435,11437,11439,11441,11443,11446,11448],{"class":1052,"line":1100},[1050,11430,1057],{"class":1056},[1050,11432,1061],{"class":1060},[1050,11434,1065],{"class":1064},[1050,11436,1136],{"class":1060},[1050,11438,1065],{"class":1064},[1050,11440,1141],{"class":1060},[1050,11442,1065],{"class":1064},[1050,11444,11445],{"class":1060},"uploadedfile ",[1050,11447,1071],{"class":1056},[1050,11449,11450],{"class":1060}," UploadedFile\n",[1050,11452,11453],{"class":1052,"line":1127},[1050,11454,1216],{"emptyLinePlaceholder":1215},[1050,11456,11457,11459,11462,11464,11466],{"class":1052,"line":1154},[1050,11458,1233],{"class":1232},[1050,11460,11461],{"class":1225}," validate_file_type",[1050,11463,1239],{"class":1064},[1050,11465,1555],{"class":1242},[1050,11467,1246],{"class":1064},[1050,11469,11470,11472,11475],{"class":1052,"line":1179},[1050,11471,1253],{"class":1252},[1050,11473,11474],{"class":1256},"Validate file type using python-magic",[1050,11476,1260],{"class":1252},[1050,11478,11479],{"class":1052,"line":1196},[1050,11480,11481],{"class":1408},"    # Read file content to determine actual type\n",[1050,11483,11484,11487,11489,11491,11493,11495],{"class":1052,"line":1204},[1050,11485,11486],{"class":1060},"    file_content ",[1050,11488,1302],{"class":1064},[1050,11490,1346],{"class":1060},[1050,11492,1065],{"class":1064},[1050,11494,1582],{"class":1315},[1050,11496,3181],{"class":1064},[1050,11498,11499,11502,11504,11506,11508,11510,11512],{"class":1052,"line":1212},[1050,11500,11501],{"class":1060},"    uploaded_file",[1050,11503,1065],{"class":1064},[1050,11505,4599],{"class":1315},[1050,11507,1239],{"class":1064},[1050,11509,3338],{"class":1427},[1050,11511,2485],{"class":1064},[1050,11513,11514],{"class":1408},"  # Reset file pointer\n",[1050,11516,11517],{"class":1052,"line":1219},[1050,11518,1791],{"class":1060},[1050,11520,11521],{"class":1052,"line":1229},[1050,11522,11523],{"class":1408},"    # Use python-magic to detect file type\n",[1050,11525,11526,11529,11531,11534,11536,11539,11541,11544,11546,11549,11551,11553],{"class":1052,"line":1249},[1050,11527,11528],{"class":1060},"    file_type ",[1050,11530,1302],{"class":1064},[1050,11532,11533],{"class":1060}," magic",[1050,11535,1065],{"class":1064},[1050,11537,11538],{"class":1315},"from_buffer",[1050,11540,1239],{"class":1064},[1050,11542,11543],{"class":1315},"file_content",[1050,11545,1077],{"class":1064},[1050,11547,11548],{"class":1631}," mime",[1050,11550,1302],{"class":1064},[1050,11552,3230],{"class":3229},[1050,11554,1328],{"class":1064},[1050,11556,11557],{"class":1052,"line":1263},[1050,11558,1791],{"class":1060},[1050,11560,11561],{"class":1052,"line":1296},[1050,11562,11563],{"class":1408},"    # Define allowed types\n",[1050,11565,11566,11569,11571],{"class":1052,"line":1331},[1050,11567,11568],{"class":1060},"    allowed_types ",[1050,11570,1302],{"class":1064},[1050,11572,5868],{"class":1064},[1050,11574,11575,11578,11580,11582,11584,11586,11588,11590,11592,11594,11596,11599,11601],{"class":1052,"line":1337},[1050,11576,11577],{"class":1282},"        '",[1050,11579,2113],{"class":1286},[1050,11581,1290],{"class":1282},[1050,11583,1441],{"class":1064},[1050,11585,2108],{"class":1064},[1050,11587,1290],{"class":1282},[1050,11589,4698],{"class":1286},[1050,11591,1290],{"class":1282},[1050,11593,1077],{"class":1064},[1050,11595,1283],{"class":1282},[1050,11597,11598],{"class":1286},".jpeg",[1050,11600,1290],{"class":1282},[1050,11602,9245],{"class":1064},[1050,11604,11605,11607,11609,11611,11613,11615,11617,11620,11622],{"class":1052,"line":1351},[1050,11606,11577],{"class":1282},[1050,11608,2122],{"class":1286},[1050,11610,1290],{"class":1282},[1050,11612,1441],{"class":1064},[1050,11614,2108],{"class":1064},[1050,11616,1290],{"class":1282},[1050,11618,11619],{"class":1286},".png",[1050,11621,1290],{"class":1282},[1050,11623,9245],{"class":1064},[1050,11625,11626,11628,11630,11632,11634,11636,11638,11641,11643],{"class":1052,"line":1377},[1050,11627,11577],{"class":1282},[1050,11629,2131],{"class":1286},[1050,11631,1290],{"class":1282},[1050,11633,1441],{"class":1064},[1050,11635,2108],{"class":1064},[1050,11637,1290],{"class":1282},[1050,11639,11640],{"class":1286},".gif",[1050,11642,1290],{"class":1282},[1050,11644,9245],{"class":1064},[1050,11646,11647,11649,11651,11653,11655,11657,11659,11661,11663],{"class":1052,"line":1400},[1050,11648,11577],{"class":1282},[1050,11650,2140],{"class":1286},[1050,11652,1290],{"class":1282},[1050,11654,1441],{"class":1064},[1050,11656,2108],{"class":1064},[1050,11658,1290],{"class":1282},[1050,11660,5877],{"class":1286},[1050,11662,1290],{"class":1282},[1050,11664,9245],{"class":1064},[1050,11666,11667,11669,11672,11674,11676,11678,11680,11682,11684],{"class":1052,"line":1405},[1050,11668,11577],{"class":1282},[1050,11670,11671],{"class":1286},"text/plain",[1050,11673,1290],{"class":1282},[1050,11675,1441],{"class":1064},[1050,11677,2108],{"class":1064},[1050,11679,1290],{"class":1282},[1050,11681,6008],{"class":1286},[1050,11683,1290],{"class":1282},[1050,11685,9245],{"class":1064},[1050,11687,11688,11690,11693,11695,11697,11699,11701,11703,11705],{"class":1052,"line":1412},[1050,11689,11577],{"class":1282},[1050,11691,11692],{"class":1286},"application/msword",[1050,11694,1290],{"class":1282},[1050,11696,1441],{"class":1064},[1050,11698,2108],{"class":1064},[1050,11700,1290],{"class":1282},[1050,11702,5897],{"class":1286},[1050,11704,1290],{"class":1282},[1050,11706,9245],{"class":1064},[1050,11708,11709,11711,11714,11716,11718,11720,11722,11724,11726],{"class":1052,"line":1447},[1050,11710,11577],{"class":1282},[1050,11712,11713],{"class":1286},"application/vnd.openxmlformats-officedocument.wordprocessingml.document",[1050,11715,1290],{"class":1282},[1050,11717,1441],{"class":1064},[1050,11719,2108],{"class":1064},[1050,11721,1290],{"class":1282},[1050,11723,5914],{"class":1286},[1050,11725,1290],{"class":1282},[1050,11727,9245],{"class":1064},[1050,11729,11730],{"class":1052,"line":1471},[1050,11731,11732],{"class":1064},"    }\n",[1050,11734,11735],{"class":1052,"line":1492},[1050,11736,1791],{"class":1060},[1050,11738,11739],{"class":1052,"line":1497},[1050,11740,11741],{"class":1408},"    # Check if detected type is allowed\n",[1050,11743,11744,11746,11749,11752,11754,11756],{"class":1052,"line":1503},[1050,11745,1266],{"class":1056},[1050,11747,11748],{"class":1060}," file_type ",[1050,11750,11751],{"class":1278},"not",[1050,11753,2162],{"class":1278},[1050,11755,2165],{"class":1060},[1050,11757,1293],{"class":1064},[1050,11759,11760,11763,11766,11768,11770,11773,11775,11778,11780,11783],{"class":1052,"line":1522},[1050,11761,11762],{"class":1056},"        raise",[1050,11764,11765],{"class":1315}," ValidationError",[1050,11767,1239],{"class":1064},[1050,11769,2062],{"class":1232},[1050,11771,11772],{"class":1286},"'File type ",[1050,11774,1532],{"class":1531},[1050,11776,11777],{"class":1315},"file_type",[1050,11779,1547],{"class":1531},[1050,11781,11782],{"class":1286}," is not allowed'",[1050,11784,1328],{"class":1064},[1050,11786,11787],{"class":1052,"line":1570},[1050,11788,1791],{"class":1060},[1050,11790,11791],{"class":1052,"line":1588},[1050,11792,11793],{"class":1408},"    # Check if file extension matches detected type\n",[1050,11795,11796,11799,11801,11803,11805,11807,11809,11811,11813,11815,11817,11819,11821,11823,11825,11827],{"class":1052,"line":1594},[1050,11797,11798],{"class":1060},"    file_ext ",[1050,11800,1302],{"class":1064},[1050,11802,3429],{"class":1060},[1050,11804,1065],{"class":1064},[1050,11806,3434],{"class":1274},[1050,11808,1065],{"class":1064},[1050,11810,3439],{"class":1315},[1050,11812,1239],{"class":1064},[1050,11814,1555],{"class":1315},[1050,11816,1065],{"class":1064},[1050,11818,1560],{"class":1274},[1050,11820,2798],{"class":1064},[1050,11822,2804],{"class":1427},[1050,11824,3455],{"class":1064},[1050,11826,3458],{"class":1315},[1050,11828,3181],{"class":1064},[1050,11830,11831,11833,11836,11838,11840,11842,11844,11846],{"class":1052,"line":1599},[1050,11832,1266],{"class":1056},[1050,11834,11835],{"class":1060}," file_ext ",[1050,11837,11751],{"class":1278},[1050,11839,2162],{"class":1278},[1050,11841,2165],{"class":1060},[1050,11843,9235],{"class":1064},[1050,11845,11777],{"class":1060},[1050,11847,3592],{"class":1064},[1050,11849,11850,11852,11854,11856,11858,11861,11863,11866,11868,11871,11873,11875,11877,11879],{"class":1052,"line":1605},[1050,11851,11762],{"class":1056},[1050,11853,11765],{"class":1315},[1050,11855,1239],{"class":1064},[1050,11857,2062],{"class":1232},[1050,11859,11860],{"class":1286},"'File extension ",[1050,11862,1532],{"class":1531},[1050,11864,11865],{"class":1315},"file_ext",[1050,11867,1547],{"class":1531},[1050,11869,11870],{"class":1286}," does not match file type ",[1050,11872,1532],{"class":1531},[1050,11874,11777],{"class":1315},[1050,11876,1547],{"class":1531},[1050,11878,1290],{"class":1286},[1050,11880,1328],{"class":1064},[1050,11882,11883],{"class":1052,"line":1628},[1050,11884,1791],{"class":1060},[1050,11886,11887,11889],{"class":1052,"line":1645},[1050,11888,1797],{"class":1056},[1050,11890,11891],{"class":3229}," True\n",[1050,11893,11894],{"class":1052,"line":1658},[1050,11895,1216],{"emptyLinePlaceholder":1215},[1050,11897,11898,11900,11903,11905,11907],{"class":1052,"line":1674},[1050,11899,1233],{"class":1232},[1050,11901,11902],{"class":1225}," sanitize_filename",[1050,11904,1239],{"class":1064},[1050,11906,2876],{"class":1242},[1050,11908,1246],{"class":1064},[1050,11910,11911,11913,11916],{"class":1052,"line":1690},[1050,11912,1253],{"class":1252},[1050,11914,11915],{"class":1256},"Sanitize uploaded filename",[1050,11917,1260],{"class":1252},[1050,11919,11920,11922],{"class":1052,"line":1705},[1050,11921,8202],{"class":1056},[1050,11923,11924],{"class":1060}," re\n",[1050,11926,11927],{"class":1052,"line":1710},[1050,11928,1791],{"class":1060},[1050,11930,11931],{"class":1052,"line":1715},[1050,11932,11933],{"class":1408},"    # Remove path components\n",[1050,11935,11936,11938,11940,11942,11944,11946,11948,11950,11952,11954],{"class":1052,"line":1753},[1050,11937,2811],{"class":1060},[1050,11939,1302],{"class":1064},[1050,11941,3429],{"class":1060},[1050,11943,1065],{"class":1064},[1050,11945,3434],{"class":1274},[1050,11947,1065],{"class":1064},[1050,11949,4643],{"class":1315},[1050,11951,1239],{"class":1064},[1050,11953,2876],{"class":1315},[1050,11955,1328],{"class":1064},[1050,11957,11958],{"class":1052,"line":1788},[1050,11959,1791],{"class":1060},[1050,11961,11962],{"class":1052,"line":1794},[1050,11963,11964],{"class":1408},"    # Remove or replace dangerous characters\n",[1050,11966,11967,11969,11971,11974,11976,11979,11981,11984,11986,11989,11992,11996,12000,12002,12004,12006,12008,12010,12012],{"class":1052,"line":1816},[1050,11968,2811],{"class":1060},[1050,11970,1302],{"class":1064},[1050,11972,11973],{"class":1060}," re",[1050,11975,1065],{"class":1064},[1050,11977,11978],{"class":1315},"sub",[1050,11980,1239],{"class":1064},[1050,11982,11983],{"class":1232},"r",[1050,11985,1290],{"class":1282},[1050,11987,9235],{"class":11988},"sETVe",[1050,11990,11991],{"class":1278},"^",[1050,11993,11995],{"class":11994},"sRJPX","\\w\\s",[1050,11997,11999],{"class":11998},"sz9Cv",".-",[1050,12001,4690],{"class":11988},[1050,12003,1290],{"class":1282},[1050,12005,1077],{"class":1064},[1050,12007,9220],{"class":1282},[1050,12009,1077],{"class":1064},[1050,12011,2757],{"class":1315},[1050,12013,1328],{"class":1064},[1050,12015,12016],{"class":1052,"line":1821},[1050,12017,1791],{"class":1060},[1050,12019,12020],{"class":1052,"line":1835},[1050,12021,12022],{"class":1408},"    # Replace spaces with underscores\n",[1050,12024,12025,12027,12029,12031,12033,12035,12037,12039,12041,12044,12047,12049,12051,12053,12055,12057,12059,12061],{"class":1052,"line":1845},[1050,12026,2811],{"class":1060},[1050,12028,1302],{"class":1064},[1050,12030,11973],{"class":1060},[1050,12032,1065],{"class":1064},[1050,12034,11978],{"class":1315},[1050,12036,1239],{"class":1064},[1050,12038,11983],{"class":1232},[1050,12040,1290],{"class":1282},[1050,12042,12043],{"class":11994},"\\s",[1050,12045,7201],{"class":12046},"sGuSu",[1050,12048,1290],{"class":1282},[1050,12050,1077],{"class":1064},[1050,12052,1283],{"class":1282},[1050,12054,10787],{"class":1286},[1050,12056,1290],{"class":1282},[1050,12058,1077],{"class":1064},[1050,12060,2757],{"class":1315},[1050,12062,1328],{"class":1064},[1050,12064,12065],{"class":1052,"line":1866},[1050,12066,1791],{"class":1060},[1050,12068,12069],{"class":1052,"line":1895},[1050,12070,12071],{"class":1408},"    # Limit length\n",[1050,12073,12074,12077,12079,12082,12084,12086,12088,12090,12092,12094,12096,12098],{"class":1052,"line":1900},[1050,12075,12076],{"class":1060},"    name",[1050,12078,1077],{"class":1064},[1050,12080,12081],{"class":1060}," ext ",[1050,12083,1302],{"class":1064},[1050,12085,3429],{"class":1060},[1050,12087,1065],{"class":1064},[1050,12089,3434],{"class":1274},[1050,12091,1065],{"class":1064},[1050,12093,3439],{"class":1315},[1050,12095,1239],{"class":1064},[1050,12097,2876],{"class":1315},[1050,12099,1328],{"class":1064},[1050,12101,12102,12104,12106,12108,12110,12112,12114,12116],{"class":1052,"line":1912},[1050,12103,1266],{"class":1056},[1050,12105,7704],{"class":2536},[1050,12107,1239],{"class":1064},[1050,12109,1560],{"class":1315},[1050,12111,2485],{"class":1064},[1050,12113,1424],{"class":1278},[1050,12115,9071],{"class":1427},[1050,12117,1293],{"class":1064},[1050,12119,12120,12123,12125,12127,12130,12132],{"class":1052,"line":1936},[1050,12121,12122],{"class":1060},"        name ",[1050,12124,1302],{"class":1064},[1050,12126,9868],{"class":1060},[1050,12128,12129],{"class":1064},"[:",[1050,12131,3203],{"class":1427},[1050,12133,2145],{"class":1064},[1050,12135,12136],{"class":1052,"line":1958},[1050,12137,1791],{"class":1060},[1050,12139,12140,12142,12144,12146,12148,12150,12152,12154,12156],{"class":1052,"line":1963},[1050,12141,1797],{"class":1056},[1050,12143,1732],{"class":1232},[1050,12145,3617],{"class":1286},[1050,12147,1532],{"class":1531},[1050,12149,1560],{"class":1060},[1050,12151,8654],{"class":1531},[1050,12153,2842],{"class":1060},[1050,12155,1547],{"class":1531},[1050,12157,3637],{"class":1286},[1050,12159,12160],{"class":1052,"line":1974},[1050,12161,1216],{"emptyLinePlaceholder":1215},[1050,12163,12164,12166,12169,12171,12173],{"class":1052,"line":1984},[1050,12165,1233],{"class":1232},[1050,12167,12168],{"class":1225}," scan_file_for_malware",[1050,12170,1239],{"class":1064},[1050,12172,1555],{"class":1242},[1050,12174,1246],{"class":1064},[1050,12176,12177,12179,12182],{"class":1052,"line":1989},[1050,12178,1253],{"class":1252},[1050,12180,12181],{"class":1256},"Basic malware scanning (placeholder)",[1050,12183,1260],{"class":1252},[1050,12185,12186],{"class":1052,"line":2005},[1050,12187,12188],{"class":1408},"    # In production, integrate with antivirus service\n",[1050,12190,12191],{"class":1052,"line":2013},[1050,12192,12193],{"class":1408},"    # This is a simplified example\n",[1050,12195,12196],{"class":1052,"line":2019},[1050,12197,1791],{"class":1060},[1050,12199,12200,12203,12205],{"class":1052,"line":2049},[1050,12201,12202],{"class":1060},"    suspicious_patterns ",[1050,12204,1302],{"class":1064},[1050,12206,5227],{"class":1064},[1050,12208,12209,12212,12214,12217,12219],{"class":1052,"line":2082},[1050,12210,12211],{"class":1232},"        b",[1050,12213,1290],{"class":1282},[1050,12215,12216],{"class":1286},"\u003Cscript",[1050,12218,1290],{"class":1282},[1050,12220,1567],{"class":1064},[1050,12222,12223,12225,12227,12230,12232],{"class":1052,"line":2088},[1050,12224,12211],{"class":1232},[1050,12226,1290],{"class":1282},[1050,12228,12229],{"class":1286},"javascript:",[1050,12231,1290],{"class":1282},[1050,12233,1567],{"class":1064},[1050,12235,12236,12238,12240,12243,12245],{"class":1052,"line":2094},[1050,12237,12211],{"class":1232},[1050,12239,1290],{"class":1282},[1050,12241,12242],{"class":1286},"vbscript:",[1050,12244,1290],{"class":1282},[1050,12246,1567],{"class":1064},[1050,12248,12249,12251,12253,12256,12258],{"class":1052,"line":2100},[1050,12250,12211],{"class":1232},[1050,12252,1290],{"class":1282},[1050,12254,12255],{"class":1286},"\u003C?php",[1050,12257,1290],{"class":1282},[1050,12259,1567],{"class":1064},[1050,12261,12262,12264,12266,12269,12271],{"class":1052,"line":2148},[1050,12263,12211],{"class":1232},[1050,12265,1290],{"class":1282},[1050,12267,12268],{"class":1286},"\u003C%",[1050,12270,1290],{"class":1282},[1050,12272,1567],{"class":1064},[1050,12274,12275],{"class":1052,"line":2170},[1050,12276,5350],{"class":1064},[1050,12278,12279],{"class":1052,"line":2200},[1050,12280,1791],{"class":1060},[1050,12282,12283],{"class":1052,"line":2205},[1050,12284,12285],{"class":1408},"    # Read file content\n",[1050,12287,12288,12291,12293,12295,12297,12299],{"class":1052,"line":2210},[1050,12289,12290],{"class":1060},"    content ",[1050,12292,1302],{"class":1064},[1050,12294,1346],{"class":1060},[1050,12296,1065],{"class":1064},[1050,12298,1582],{"class":1315},[1050,12300,3181],{"class":1064},[1050,12302,12303,12305,12307,12309,12311,12313],{"class":1052,"line":2216},[1050,12304,11501],{"class":1060},[1050,12306,1065],{"class":1064},[1050,12308,4599],{"class":1315},[1050,12310,1239],{"class":1064},[1050,12312,3338],{"class":1427},[1050,12314,1328],{"class":1064},[1050,12316,12317],{"class":1052,"line":2232},[1050,12318,1791],{"class":1060},[1050,12320,12321],{"class":1052,"line":2270},[1050,12322,12323],{"class":1408},"    # Check for suspicious patterns\n",[1050,12325,12326,12328,12331,12333,12336],{"class":1052,"line":2286},[1050,12327,11118],{"class":1056},[1050,12329,12330],{"class":1060}," pattern ",[1050,12332,1998],{"class":1056},[1050,12334,12335],{"class":1060}," suspicious_patterns",[1050,12337,1293],{"class":1064},[1050,12339,12340,12342,12344,12346,12349,12351,12353],{"class":1052,"line":2292},[1050,12341,1340],{"class":1056},[1050,12343,12330],{"class":1060},[1050,12345,1998],{"class":1278},[1050,12347,12348],{"class":1060}," content",[1050,12350,1065],{"class":1064},[1050,12352,3458],{"class":1315},[1050,12354,12355],{"class":1064},"():\n",[1050,12357,12358,12361,12363,12365,12367,12370,12372],{"class":1052,"line":2297},[1050,12359,12360],{"class":1056},"            raise",[1050,12362,11765],{"class":1315},[1050,12364,1239],{"class":1064},[1050,12366,1290],{"class":1282},[1050,12368,12369],{"class":1286},"File contains suspicious content",[1050,12371,1290],{"class":1282},[1050,12373,1328],{"class":1064},[1050,12375,12376],{"class":1052,"line":2303},[1050,12377,1791],{"class":1060},[1050,12379,12380,12382],{"class":1052,"line":2323},[1050,12381,1797],{"class":1056},[1050,12383,11891],{"class":3229},[1050,12385,12386],{"class":1052,"line":2339},[1050,12387,1216],{"emptyLinePlaceholder":1215},[1050,12389,12390,12392],{"class":1052,"line":2351},[1050,12391,1222],{"class":1064},[1050,12393,1226],{"class":1225},[1050,12395,12396,12398,12401,12403,12405],{"class":1052,"line":2367},[1050,12397,1233],{"class":1232},[1050,12399,12400],{"class":1225}," secure_file_upload",[1050,12402,1239],{"class":1064},[1050,12404,1243],{"class":1242},[1050,12406,1246],{"class":1064},[1050,12408,12409,12411,12414],{"class":1052,"line":2383},[1050,12410,1253],{"class":1252},[1050,12412,12413],{"class":1256},"Secure file upload with comprehensive validation",[1050,12415,1260],{"class":1252},[1050,12417,12418,12420,12422,12424,12426,12428,12430,12432,12434],{"class":1052,"line":2397},[1050,12419,1266],{"class":1056},[1050,12421,1269],{"class":1060},[1050,12423,1065],{"class":1064},[1050,12425,1275],{"class":1274},[1050,12427,1279],{"class":1278},[1050,12429,1283],{"class":1282},[1050,12431,1287],{"class":1286},[1050,12433,1290],{"class":1282},[1050,12435,1293],{"class":1064},[1050,12437,12438,12440,12442,12444,12446,12448,12450,12452,12454,12456,12458,12460],{"class":1052,"line":2402},[1050,12439,1299],{"class":1060},[1050,12441,1302],{"class":1064},[1050,12443,1269],{"class":1060},[1050,12445,1065],{"class":1064},[1050,12447,1310],{"class":1309},[1050,12449,1065],{"class":1064},[1050,12451,1316],{"class":1315},[1050,12453,1239],{"class":1064},[1050,12455,1290],{"class":1282},[1050,12457,1323],{"class":1286},[1050,12459,1290],{"class":1282},[1050,12461,1328],{"class":1064},[1050,12463,12464],{"class":1052,"line":2407},[1050,12465,1334],{"class":1060},[1050,12467,12468,12470,12472,12474],{"class":1052,"line":2423},[1050,12469,1340],{"class":1056},[1050,12471,1343],{"class":1278},[1050,12473,1346],{"class":1060},[1050,12475,1293],{"class":1064},[1050,12477,12478,12480,12482,12484,12486,12488,12490,12492,12494,12496],{"class":1052,"line":2428},[1050,12479,1354],{"class":1060},[1050,12481,1065],{"class":1064},[1050,12483,1359],{"class":1315},[1050,12485,1239],{"class":1064},[1050,12487,1243],{"class":1315},[1050,12489,1077],{"class":1064},[1050,12491,1283],{"class":1282},[1050,12493,1370],{"class":1286},[1050,12495,1290],{"class":1282},[1050,12497,1328],{"class":1064},[1050,12499,12500,12502,12504,12506,12508,12510,12512,12515,12517],{"class":1052,"line":2446},[1050,12501,1380],{"class":1056},[1050,12503,1074],{"class":1315},[1050,12505,1239],{"class":1064},[1050,12507,1243],{"class":1315},[1050,12509,1077],{"class":1064},[1050,12511,1283],{"class":1282},[1050,12513,12514],{"class":1286},"uploads/secure_form.html",[1050,12516,1290],{"class":1282},[1050,12518,1328],{"class":1064},[1050,12520,12521],{"class":1052,"line":2494},[1050,12522,1334],{"class":1060},[1050,12524,12525,12527],{"class":1052,"line":2499},[1050,12526,6885],{"class":1056},[1050,12528,1293],{"class":1064},[1050,12530,12531],{"class":1052,"line":2505},[1050,12532,12533],{"class":1408},"            # File size validation\n",[1050,12535,12536,12539,12541,12543,12545,12547,12549,12551],{"class":1052,"line":2515},[1050,12537,12538],{"class":1060},"            max_size ",[1050,12540,1302],{"class":1064},[1050,12542,2033],{"class":1427},[1050,12544,1431],{"class":1278},[1050,12546,1434],{"class":1427},[1050,12548,1431],{"class":1278},[1050,12550,1434],{"class":1427},[1050,12552,6334],{"class":1408},[1050,12554,12555,12557,12559,12561,12563,12565,12567],{"class":1052,"line":2554},[1050,12556,3597],{"class":1056},[1050,12558,1346],{"class":1060},[1050,12560,1065],{"class":1064},[1050,12562,1421],{"class":1274},[1050,12564,1424],{"class":1278},[1050,12566,6349],{"class":1060},[1050,12568,1293],{"class":1064},[1050,12570,12571,12574,12576,12578,12580,12583,12585,12587,12589,12591,12593,12595,12597,12599,12601,12604],{"class":1052,"line":2559},[1050,12572,12573],{"class":1056},"                raise",[1050,12575,11765],{"class":1315},[1050,12577,1239],{"class":1064},[1050,12579,2062],{"class":1232},[1050,12581,12582],{"class":1286},"'File size exceeds ",[1050,12584,1532],{"class":1531},[1050,12586,6380],{"class":1315},[1050,12588,6383],{"class":1278},[1050,12590,6386],{"class":1064},[1050,12592,6389],{"class":1427},[1050,12594,4128],{"class":1278},[1050,12596,6389],{"class":1427},[1050,12598,2485],{"class":1064},[1050,12600,1547],{"class":1531},[1050,12602,12603],{"class":1286},"MB limit'",[1050,12605,1328],{"class":1064},[1050,12607,12608],{"class":1052,"line":2574},[1050,12609,4241],{"class":1060},[1050,12611,12612],{"class":1052,"line":2594},[1050,12613,12614],{"class":1408},"            # File type validation\n",[1050,12616,12617,12620,12622,12624],{"class":1052,"line":2599},[1050,12618,12619],{"class":1315},"            validate_file_type",[1050,12621,1239],{"class":1064},[1050,12623,1555],{"class":1315},[1050,12625,1328],{"class":1064},[1050,12627,12628],{"class":1052,"line":2608},[1050,12629,4241],{"class":1060},[1050,12631,12632],{"class":1052,"line":2626},[1050,12633,12634],{"class":1408},"            # Malware scanning\n",[1050,12636,12637,12640,12642,12644],{"class":1052,"line":2631},[1050,12638,12639],{"class":1315},"            scan_file_for_malware",[1050,12641,1239],{"class":1064},[1050,12643,1555],{"class":1315},[1050,12645,1328],{"class":1064},[1050,12647,12648],{"class":1052,"line":4410},[1050,12649,4241],{"class":1060},[1050,12651,12652],{"class":1052,"line":4419},[1050,12653,12654],{"class":1408},"            # Sanitize filename\n",[1050,12656,12657,12660,12662,12664,12666,12668,12670,12672],{"class":1052,"line":4442},[1050,12658,12659],{"class":1060},"            safe_filename ",[1050,12661,1302],{"class":1064},[1050,12663,11902],{"class":1315},[1050,12665,1239],{"class":1064},[1050,12667,1555],{"class":1315},[1050,12669,1065],{"class":1064},[1050,12671,1560],{"class":1274},[1050,12673,1328],{"class":1064},[1050,12675,12676],{"class":1052,"line":4447},[1050,12677,4241],{"class":1060},[1050,12679,12680],{"class":1052,"line":4453},[1050,12681,12682],{"class":1408},"            # Generate unique filename to prevent conflicts\n",[1050,12684,12685,12688,12690,12692,12694,12696,12698,12700,12702,12704,12706,12708,12710,12712,12715,12717],{"class":1052,"line":4481},[1050,12686,12687],{"class":1060},"            unique_filename ",[1050,12689,1302],{"class":1064},[1050,12691,1732],{"class":1232},[1050,12693,3617],{"class":1286},[1050,12695,1532],{"class":1531},[1050,12697,2822],{"class":1060},[1050,12699,1065],{"class":1064},[1050,12701,2827],{"class":1315},[1050,12703,2830],{"class":1064},[1050,12705,2833],{"class":1274},[1050,12707,1547],{"class":1531},[1050,12709,10787],{"class":1286},[1050,12711,1532],{"class":1531},[1050,12713,12714],{"class":1060},"safe_filename",[1050,12716,1547],{"class":1531},[1050,12718,3637],{"class":1286},[1050,12720,12721],{"class":1052,"line":4486},[1050,12722,4241],{"class":1060},[1050,12724,12725],{"class":1052,"line":4492},[1050,12726,12727],{"class":1408},"            # Save file with secure path\n",[1050,12729,12730,12733,12735,12737,12740,12742,12744,12746,12748,12750,12752,12754,12756,12758,12761,12763],{"class":1052,"line":4522},[1050,12731,12732],{"class":1060},"            file_path ",[1050,12734,1302],{"class":1064},[1050,12736,1732],{"class":1232},[1050,12738,12739],{"class":1286},"'secure_uploads/",[1050,12741,1532],{"class":1531},[1050,12743,1243],{"class":1060},[1050,12745,1065],{"class":1064},[1050,12747,1539],{"class":1274},[1050,12749,1065],{"class":1064},[1050,12751,1544],{"class":1274},[1050,12753,1547],{"class":1531},[1050,12755,1550],{"class":1286},[1050,12757,1532],{"class":1531},[1050,12759,12760],{"class":1060},"unique_filename",[1050,12762,1547],{"class":1531},[1050,12764,2847],{"class":1286},[1050,12766,12767,12770,12772,12774,12776,12778,12780,12782,12784,12786],{"class":1052,"line":4527},[1050,12768,12769],{"class":1060},"            saved_path ",[1050,12771,1302],{"class":1064},[1050,12773,1511],{"class":1060},[1050,12775,1065],{"class":1064},[1050,12777,1516],{"class":1315},[1050,12779,1239],{"class":1064},[1050,12781,1653],{"class":1315},[1050,12783,1077],{"class":1064},[1050,12785,1346],{"class":1315},[1050,12787,1328],{"class":1064},[1050,12789,12790],{"class":1052,"line":4533},[1050,12791,4241],{"class":1060},[1050,12793,12794],{"class":1052,"line":4551},[1050,12795,9156],{"class":1408},[1050,12797,12798,12801,12803,12806,12808,12810,12812,12814],{"class":1052,"line":4591},[1050,12799,12800],{"class":1060},"            secure_file ",[1050,12802,1302],{"class":1064},[1050,12804,12805],{"class":1060}," SecureFile",[1050,12807,1065],{"class":1064},[1050,12809,1618],{"class":1274},[1050,12811,1065],{"class":1064},[1050,12813,1623],{"class":1315},[1050,12815,1519],{"class":1064},[1050,12817,12818,12820,12822,12824,12826,12828],{"class":1052,"line":4608},[1050,12819,7089],{"class":1631},[1050,12821,1302],{"class":1064},[1050,12823,1243],{"class":1315},[1050,12825,1065],{"class":1064},[1050,12827,1539],{"class":1274},[1050,12829,1567],{"class":1064},[1050,12831,12832,12835,12837,12840],{"class":1052,"line":4613},[1050,12833,12834],{"class":1631},"                file",[1050,12836,1302],{"class":1064},[1050,12838,12839],{"class":1315},"saved_path",[1050,12841,1567],{"class":1064},[1050,12843,12844,12847,12849,12851,12853,12855],{"class":1052,"line":4619},[1050,12845,12846],{"class":1631},"                original_filename",[1050,12848,1302],{"class":1064},[1050,12850,1555],{"class":1315},[1050,12852,1065],{"class":1064},[1050,12854,1560],{"class":1274},[1050,12856,1567],{"class":1064},[1050,12858,12859,12862,12864,12866],{"class":1052,"line":4664},[1050,12860,12861],{"class":1631},"                safe_filename",[1050,12863,1302],{"class":1064},[1050,12865,12714],{"class":1315},[1050,12867,1567],{"class":1064},[1050,12869,12870,12872,12874,12876,12878,12880],{"class":1052,"line":4703},[1050,12871,7115],{"class":1631},[1050,12873,1302],{"class":1064},[1050,12875,1555],{"class":1315},[1050,12877,1065],{"class":1064},[1050,12879,1421],{"class":1274},[1050,12881,1567],{"class":1064},[1050,12883,12884,12887,12889,12891,12893,12895],{"class":1052,"line":4708},[1050,12885,12886],{"class":1631},"                content_type",[1050,12888,1302],{"class":1064},[1050,12890,1555],{"class":1315},[1050,12892,1065],{"class":1064},[1050,12894,2157],{"class":1274},[1050,12896,1567],{"class":1064},[1050,12898,12899,12902,12904,12907,12909,12911],{"class":1052,"line":4714},[1050,12900,12901],{"class":1631},"                checksum",[1050,12903,1302],{"class":1064},[1050,12905,12906],{"class":1315},"calculate_file_checksum",[1050,12908,1239],{"class":1064},[1050,12910,1555],{"class":1315},[1050,12912,1328],{"class":1064},[1050,12914,12915],{"class":1052,"line":4730},[1050,12916,5578],{"class":1064},[1050,12918,12919],{"class":1052,"line":4738},[1050,12920,4241],{"class":1060},[1050,12922,12923,12925,12927,12929,12931,12933,12935,12937,12940,12942],{"class":1052,"line":4754},[1050,12924,1354],{"class":1060},[1050,12926,1065],{"class":1064},[1050,12928,1723],{"class":1315},[1050,12930,1239],{"class":1064},[1050,12932,1243],{"class":1315},[1050,12934,1077],{"class":1064},[1050,12936,1283],{"class":1282},[1050,12938,12939],{"class":1286},"File uploaded successfully!",[1050,12941,1290],{"class":1282},[1050,12943,1328],{"class":1064},[1050,12945,12946,12948,12950,12952,12954,12957,12959,12961,12963,12965,12968,12970,12972],{"class":1052,"line":4765},[1050,12947,1380],{"class":1056},[1050,12949,1759],{"class":1315},[1050,12951,1239],{"class":1064},[1050,12953,1290],{"class":1282},[1050,12955,12956],{"class":1286},"uploads:secure_file_detail",[1050,12958,1290],{"class":1282},[1050,12960,1077],{"class":1064},[1050,12962,1773],{"class":1631},[1050,12964,1302],{"class":1064},[1050,12966,12967],{"class":1315},"secure_file",[1050,12969,1065],{"class":1064},[1050,12971,1783],{"class":1274},[1050,12973,1328],{"class":1064},[1050,12975,12976],{"class":1052,"line":4770},[1050,12977,4241],{"class":1060},[1050,12979,12980,12982,12985,12988,12990],{"class":1052,"line":4775},[1050,12981,7231],{"class":1056},[1050,12983,12984],{"class":1060}," ValidationError ",[1050,12986,12987],{"class":1056},"as",[1050,12989,2441],{"class":1060},[1050,12991,1293],{"class":1064},[1050,12993,12994,12996,12998,13000,13002,13004,13006,13008,13010,13012],{"class":1052,"line":4805},[1050,12995,1354],{"class":1060},[1050,12997,1065],{"class":1064},[1050,12999,1359],{"class":1315},[1050,13001,1239],{"class":1064},[1050,13003,1243],{"class":1315},[1050,13005,1077],{"class":1064},[1050,13007,6812],{"class":2434},[1050,13009,1239],{"class":1064},[1050,13011,2482],{"class":1315},[1050,13013,7473],{"class":1064},[1050,13015,13016,13018,13020,13022,13024],{"class":1052,"line":4815},[1050,13017,7231],{"class":1056},[1050,13019,2435],{"class":2434},[1050,13021,2438],{"class":1056},[1050,13023,2441],{"class":1060},[1050,13025,1293],{"class":1064},[1050,13027,13028,13030,13032,13034,13036,13038,13040,13042,13045,13047,13049,13051,13053,13055,13057,13059],{"class":1052,"line":4830},[1050,13029,1354],{"class":1060},[1050,13031,1065],{"class":1064},[1050,13033,1359],{"class":1315},[1050,13035,1239],{"class":1064},[1050,13037,1243],{"class":1315},[1050,13039,1077],{"class":1064},[1050,13041,1732],{"class":1232},[1050,13043,13044],{"class":1286},"'Upload failed: ",[1050,13046,1532],{"class":1531},[1050,13048,2477],{"class":2434},[1050,13050,1239],{"class":1064},[1050,13052,2482],{"class":1315},[1050,13054,2485],{"class":1064},[1050,13056,1547],{"class":1531},[1050,13058,1290],{"class":1286},[1050,13060,1328],{"class":1064},[1050,13062,13063],{"class":1052,"line":4835},[1050,13064,1791],{"class":1060},[1050,13066,13067,13069,13071,13073,13075,13077,13079,13081,13083],{"class":1052,"line":4840},[1050,13068,1797],{"class":1056},[1050,13070,1074],{"class":1315},[1050,13072,1239],{"class":1064},[1050,13074,1243],{"class":1315},[1050,13076,1077],{"class":1064},[1050,13078,1283],{"class":1282},[1050,13080,12514],{"class":1286},[1050,13082,1290],{"class":1282},[1050,13084,1328],{"class":1064},[1050,13086,13087],{"class":1052,"line":4851},[1050,13088,1216],{"emptyLinePlaceholder":1215},[1050,13090,13091,13093,13096,13098,13100],{"class":1052,"line":4858},[1050,13092,1233],{"class":1232},[1050,13094,13095],{"class":1225}," calculate_file_checksum",[1050,13097,1239],{"class":1064},[1050,13099,1555],{"class":1242},[1050,13101,1246],{"class":1064},[1050,13103,13104,13106,13109],{"class":1052,"line":4881},[1050,13105,1253],{"class":1252},[1050,13107,13108],{"class":1256},"Calculate SHA-256 checksum of uploaded file",[1050,13110,1260],{"class":1252},[1050,13112,13113,13115],{"class":1052,"line":4886},[1050,13114,8202],{"class":1056},[1050,13116,13117],{"class":1060}," hashlib\n",[1050,13119,13120],{"class":1052,"line":4891},[1050,13121,1791],{"class":1060},[1050,13123,13124,13127,13129,13132,13134,13137],{"class":1052,"line":4918},[1050,13125,13126],{"class":1060},"    sha256_hash ",[1050,13128,1302],{"class":1064},[1050,13130,13131],{"class":1060}," hashlib",[1050,13133,1065],{"class":1064},[1050,13135,13136],{"class":1315},"sha256",[1050,13138,3181],{"class":1064},[1050,13140,13141],{"class":1052,"line":4923},[1050,13142,1791],{"class":1060},[1050,13144,13145],{"class":1052,"line":4929},[1050,13146,13147],{"class":1408},"    # Read file in chunks to handle large files\n",[1050,13149,13150,13152,13154,13156,13158,13160],{"class":1052,"line":4956},[1050,13151,11501],{"class":1060},[1050,13153,1065],{"class":1064},[1050,13155,4599],{"class":1315},[1050,13157,1239],{"class":1064},[1050,13159,3338],{"class":1427},[1050,13161,1328],{"class":1064},[1050,13163,13164,13166,13169,13171,13174,13176,13179,13181,13183,13185,13187,13189,13192,13194,13196,13199],{"class":1052,"line":4961},[1050,13165,11118],{"class":1056},[1050,13167,13168],{"class":1060}," chunk ",[1050,13170,1998],{"class":1056},[1050,13172,13173],{"class":2536}," iter",[1050,13175,1239],{"class":1064},[1050,13177,13178],{"class":1232},"lambda",[1050,13180,1441],{"class":1064},[1050,13182,1346],{"class":1315},[1050,13184,1065],{"class":1064},[1050,13186,1582],{"class":1315},[1050,13188,1239],{"class":1064},[1050,13190,13191],{"class":1427},"4096",[1050,13193,9914],{"class":1064},[1050,13195,11228],{"class":1232},[1050,13197,13198],{"class":1282},"\"\"",[1050,13200,1246],{"class":1064},[1050,13202,13203,13206,13208,13211,13213,13215],{"class":1052,"line":4966},[1050,13204,13205],{"class":1060},"        sha256_hash",[1050,13207,1065],{"class":1064},[1050,13209,13210],{"class":1315},"update",[1050,13212,1239],{"class":1064},[1050,13214,7497],{"class":1315},[1050,13216,1328],{"class":1064},[1050,13218,13219],{"class":1052,"line":4982},[1050,13220,1791],{"class":1060},[1050,13222,13223,13225,13227,13229,13231,13233],{"class":1052,"line":5019},[1050,13224,11501],{"class":1060},[1050,13226,1065],{"class":1064},[1050,13228,4599],{"class":1315},[1050,13230,1239],{"class":1064},[1050,13232,3338],{"class":1427},[1050,13234,1328],{"class":1064},[1050,13236,13237,13239,13242,13244,13247],{"class":1052,"line":5035},[1050,13238,1797],{"class":1056},[1050,13240,13241],{"class":1060}," sha256_hash",[1050,13243,1065],{"class":1064},[1050,13245,13246],{"class":1315},"hexdigest",[1050,13248,3181],{"class":1064},[1035,13250,13252],{"id":13251},"access-control-and-download","Access Control and Download",[1040,13254,13256],{"className":1042,"code":13255,"language":1044,"meta":1045,"style":1045},"from django.http import Http404, HttpResponse, FileResponse\nfrom django.contrib.auth.decorators import login_required\n\n@login_required\ndef secure_file_download(request, file_id):\n    \"\"\"Secure file download with access control\"\"\"\n    try:\n        user_file = UserFile.objects.get(id=file_id)\n        \n        # Check access permissions\n        if not can_access_file(request.user, user_file):\n            raise Http404(\"File not found\")\n        \n        # Get file path\n        file_path = user_file.file.path\n        \n        if not os.path.exists(file_path):\n            raise Http404(\"File not found on disk\")\n        \n        # Increment download counter\n        user_file.download_count += 1\n        user_file.save(update_fields=['download_count'])\n        \n        # Log download\n        FileDownloadLog.objects.create(\n            file=user_file,\n            user=request.user,\n            ip_address=request.META.get('REMOTE_ADDR'),\n            user_agent=request.META.get('HTTP_USER_AGENT', '')\n        )\n        \n        # Serve file\n        response = FileResponse(\n            open(file_path, 'rb'),\n            content_type=user_file.content_type,\n            as_attachment=True,\n            filename=user_file.original_filename\n        )\n        \n        # Add security headers\n        response['X-Content-Type-Options'] = 'nosniff'\n        response['X-Frame-Options'] = 'DENY'\n        \n        return response\n        \n    except UserFile.DoesNotExist:\n        raise Http404(\"File not found\")\n\ndef can_access_file(user, user_file):\n    \"\"\"Check if user can access the file\"\"\"\n    # Owner can always access\n    if user_file.user == user:\n        return True\n    \n    # Public files can be accessed by anyone\n    if user_file.is_public:\n        return True\n    \n    # Check if user is in allowed users list\n    if hasattr(user_file, 'allowed_users') and user in user_file.allowed_users.all():\n        return True\n    \n    # Staff can access all files\n    if user.is_staff:\n        return True\n    \n    return False\n\ndef serve_protected_media(request, path):\n    \"\"\"Serve protected media files through Django\"\"\"\n    # This view should be used with internal redirects (X-Accel-Redirect for Nginx)\n    \n    # Reconstruct full file path\n    full_path = os.path.join(settings.MEDIA_ROOT, path)\n    \n    if not os.path.exists(full_path):\n        raise Http404(\"File not found\")\n    \n    # Extract file ID from path to check permissions\n    # This assumes your file paths contain the file ID\n    try:\n        file_id = extract_file_id_from_path(path)\n        user_file = UserFile.objects.get(id=file_id)\n        \n        if not can_access_file(request.user, user_file):\n            raise Http404(\"File not found\")\n        \n    except (UserFile.DoesNotExist, ValueError):\n        raise Http404(\"File not found\")\n    \n    # For production with Nginx, use X-Accel-Redirect\n    if settings.USE_X_ACCEL_REDIRECT:\n        response = HttpResponse()\n        response['X-Accel-Redirect'] = f'/protected/{path}'\n        response['Content-Type'] = user_file.content_type\n        return response\n    \n    # For development, serve directly\n    return FileResponse(\n        open(full_path, 'rb'),\n        content_type=user_file.content_type\n    )\n\ndef extract_file_id_from_path(path):\n    \"\"\"Extract file ID from file path\"\"\"\n    # Example: uploads/123/filename.jpg -> 123\n    parts = path.split('/')\n    if len(parts) >= 2:\n        return int(parts[1])\n    raise ValueError(\"Cannot extract file ID from path\")\n",[1047,13257,13258,13283,13305,13309,13315,13333,13342,13348,13374,13378,13383,13406,13423,13427,13432,13449,13453,13476,13493,13497,13502,13518,13540,13544,13549,13564,13574,13588,13617,13649,13653,13657,13662,13674,13693,13707,13718,13731,13735,13739,13744,13769,13793,13797,13804,13808,13820,13836,13840,13856,13865,13870,13886,13892,13896,13901,13914,13920,13924,13929,13972,13978,13982,13987,14000,14006,14010,14017,14021,14039,14048,14053,14057,14062,14096,14100,14123,14139,14143,14148,14153,14159,14175,14201,14205,14227,14243,14247,14267,14283,14287,14292,14306,14316,14346,14369,14375,14379,14384,14392,14411,14424,14428,14432,14444,14453,14458,14481,14502,14518],{"__ignoreMap":1045},[1050,13259,13260,13262,13264,13266,13268,13270,13273,13275,13278,13280],{"class":1052,"line":1053},[1050,13261,1057],{"class":1056},[1050,13263,1061],{"class":1060},[1050,13265,1065],{"class":1064},[1050,13267,1188],{"class":1060},[1050,13269,1071],{"class":1056},[1050,13271,13272],{"class":1060}," Http404",[1050,13274,1077],{"class":1064},[1050,13276,13277],{"class":1060}," HttpResponse",[1050,13279,1077],{"class":1064},[1050,13281,13282],{"class":1060}," FileResponse\n",[1050,13284,13285,13287,13289,13291,13293,13295,13297,13299,13301,13303],{"class":1052,"line":1083},[1050,13286,1057],{"class":1056},[1050,13288,1061],{"class":1060},[1050,13290,1065],{"class":1064},[1050,13292,1109],{"class":1060},[1050,13294,1065],{"class":1064},[1050,13296,1114],{"class":1060},[1050,13298,1065],{"class":1064},[1050,13300,1119],{"class":1060},[1050,13302,1071],{"class":1056},[1050,13304,1124],{"class":1060},[1050,13306,13307],{"class":1052,"line":1100},[1050,13308,1216],{"emptyLinePlaceholder":1215},[1050,13310,13311,13313],{"class":1052,"line":1127},[1050,13312,1222],{"class":1064},[1050,13314,1226],{"class":1225},[1050,13316,13317,13319,13322,13324,13326,13328,13331],{"class":1052,"line":1154},[1050,13318,1233],{"class":1232},[1050,13320,13321],{"class":1225}," secure_file_download",[1050,13323,1239],{"class":1064},[1050,13325,1243],{"class":1242},[1050,13327,1077],{"class":1064},[1050,13329,13330],{"class":1242}," file_id",[1050,13332,1246],{"class":1064},[1050,13334,13335,13337,13340],{"class":1052,"line":1179},[1050,13336,1253],{"class":1252},[1050,13338,13339],{"class":1256},"Secure file download with access control",[1050,13341,1260],{"class":1252},[1050,13343,13344,13346],{"class":1052,"line":1196},[1050,13345,6225],{"class":1056},[1050,13347,1293],{"class":1064},[1050,13349,13350,13352,13354,13356,13358,13360,13362,13364,13366,13368,13370,13372],{"class":1052,"line":1204},[1050,13351,1608],{"class":1060},[1050,13353,1302],{"class":1064},[1050,13355,1613],{"class":1060},[1050,13357,1065],{"class":1064},[1050,13359,1618],{"class":1274},[1050,13361,1065],{"class":1064},[1050,13363,1316],{"class":1315},[1050,13365,1239],{"class":1064},[1050,13367,1544],{"class":1631},[1050,13369,1302],{"class":1064},[1050,13371,6653],{"class":1315},[1050,13373,1328],{"class":1064},[1050,13375,13376],{"class":1052,"line":1212},[1050,13377,1334],{"class":1060},[1050,13379,13380],{"class":1052,"line":1219},[1050,13381,13382],{"class":1408},"        # Check access permissions\n",[1050,13384,13385,13387,13389,13392,13394,13396,13398,13400,13402,13404],{"class":1052,"line":1229},[1050,13386,1340],{"class":1056},[1050,13388,1343],{"class":1278},[1050,13390,13391],{"class":1315}," can_access_file",[1050,13393,1239],{"class":1064},[1050,13395,1243],{"class":1315},[1050,13397,1065],{"class":1064},[1050,13399,1539],{"class":1274},[1050,13401,1077],{"class":1064},[1050,13403,6660],{"class":1315},[1050,13405,1246],{"class":1064},[1050,13407,13408,13410,13412,13414,13416,13419,13421],{"class":1052,"line":1249},[1050,13409,12360],{"class":1056},[1050,13411,13272],{"class":1315},[1050,13413,1239],{"class":1064},[1050,13415,3617],{"class":1282},[1050,13417,13418],{"class":1286},"File not found",[1050,13420,3617],{"class":1282},[1050,13422,1328],{"class":1064},[1050,13424,13425],{"class":1052,"line":1263},[1050,13426,1334],{"class":1060},[1050,13428,13429],{"class":1052,"line":1296},[1050,13430,13431],{"class":1408},"        # Get file path\n",[1050,13433,13434,13436,13438,13440,13442,13444,13446],{"class":1052,"line":1331},[1050,13435,1506],{"class":1060},[1050,13437,1302],{"class":1064},[1050,13439,6660],{"class":1060},[1050,13441,1065],{"class":1064},[1050,13443,1323],{"class":1274},[1050,13445,1065],{"class":1064},[1050,13447,13448],{"class":1274},"path\n",[1050,13450,13451],{"class":1052,"line":1337},[1050,13452,1334],{"class":1060},[1050,13454,13455,13457,13459,13461,13463,13465,13467,13470,13472,13474],{"class":1052,"line":1351},[1050,13456,1340],{"class":1056},[1050,13458,1343],{"class":1278},[1050,13460,3429],{"class":1060},[1050,13462,1065],{"class":1064},[1050,13464,3434],{"class":1274},[1050,13466,1065],{"class":1064},[1050,13468,13469],{"class":1315},"exists",[1050,13471,1239],{"class":1064},[1050,13473,1653],{"class":1315},[1050,13475,1246],{"class":1064},[1050,13477,13478,13480,13482,13484,13486,13489,13491],{"class":1052,"line":1377},[1050,13479,12360],{"class":1056},[1050,13481,13272],{"class":1315},[1050,13483,1239],{"class":1064},[1050,13485,3617],{"class":1282},[1050,13487,13488],{"class":1286},"File not found on disk",[1050,13490,3617],{"class":1282},[1050,13492,1328],{"class":1064},[1050,13494,13495],{"class":1052,"line":1400},[1050,13496,1334],{"class":1060},[1050,13498,13499],{"class":1052,"line":1405},[1050,13500,13501],{"class":1408},"        # Increment download counter\n",[1050,13503,13504,13507,13509,13512,13515],{"class":1052,"line":1412},[1050,13505,13506],{"class":1060},"        user_file",[1050,13508,1065],{"class":1064},[1050,13510,13511],{"class":1274},"download_count",[1050,13513,13514],{"class":1064}," +=",[1050,13516,13517],{"class":1427}," 1\n",[1050,13519,13520,13522,13524,13526,13528,13530,13532,13534,13536,13538],{"class":1052,"line":1447},[1050,13521,13506],{"class":1060},[1050,13523,1065],{"class":1064},[1050,13525,1516],{"class":1315},[1050,13527,1239],{"class":1064},[1050,13529,4292],{"class":1631},[1050,13531,3805],{"class":1064},[1050,13533,1290],{"class":1282},[1050,13535,13511],{"class":1286},[1050,13537,1290],{"class":1282},[1050,13539,4329],{"class":1064},[1050,13541,13542],{"class":1052,"line":1471},[1050,13543,1334],{"class":1060},[1050,13545,13546],{"class":1052,"line":1492},[1050,13547,13548],{"class":1408},"        # Log download\n",[1050,13550,13551,13554,13556,13558,13560,13562],{"class":1052,"line":1497},[1050,13552,13553],{"class":1060},"        FileDownloadLog",[1050,13555,1065],{"class":1064},[1050,13557,1618],{"class":1274},[1050,13559,1065],{"class":1064},[1050,13561,1623],{"class":1315},[1050,13563,1519],{"class":1064},[1050,13565,13566,13568,13570,13572],{"class":1052,"line":1503},[1050,13567,1648],{"class":1631},[1050,13569,1302],{"class":1064},[1050,13571,1778],{"class":1315},[1050,13573,1567],{"class":1064},[1050,13575,13576,13578,13580,13582,13584,13586],{"class":1052,"line":1522},[1050,13577,1632],{"class":1631},[1050,13579,1302],{"class":1064},[1050,13581,1243],{"class":1315},[1050,13583,1065],{"class":1064},[1050,13585,1539],{"class":1274},[1050,13587,1567],{"class":1064},[1050,13589,13590,13593,13595,13597,13599,13602,13604,13606,13608,13610,13613,13615],{"class":1052,"line":1570},[1050,13591,13592],{"class":1631},"            ip_address",[1050,13594,1302],{"class":1064},[1050,13596,1243],{"class":1315},[1050,13598,1065],{"class":1064},[1050,13600,13601],{"class":1309},"META",[1050,13603,1065],{"class":1064},[1050,13605,1316],{"class":1315},[1050,13607,1239],{"class":1064},[1050,13609,1290],{"class":1282},[1050,13611,13612],{"class":1286},"REMOTE_ADDR",[1050,13614,1290],{"class":1282},[1050,13616,5252],{"class":1064},[1050,13618,13619,13622,13624,13626,13628,13630,13632,13634,13636,13638,13641,13643,13645,13647],{"class":1052,"line":1588},[1050,13620,13621],{"class":1631},"            user_agent",[1050,13623,1302],{"class":1064},[1050,13625,1243],{"class":1315},[1050,13627,1065],{"class":1064},[1050,13629,13601],{"class":1309},[1050,13631,1065],{"class":1064},[1050,13633,1316],{"class":1315},[1050,13635,1239],{"class":1064},[1050,13637,1290],{"class":1282},[1050,13639,13640],{"class":1286},"HTTP_USER_AGENT",[1050,13642,1290],{"class":1282},[1050,13644,1077],{"class":1064},[1050,13646,9220],{"class":1282},[1050,13648,1328],{"class":1064},[1050,13650,13651],{"class":1052,"line":1594},[1050,13652,1591],{"class":1064},[1050,13654,13655],{"class":1052,"line":1599},[1050,13656,1334],{"class":1060},[1050,13658,13659],{"class":1052,"line":1605},[1050,13660,13661],{"class":1408},"        # Serve file\n",[1050,13663,13664,13667,13669,13672],{"class":1052,"line":1628},[1050,13665,13666],{"class":1060},"        response ",[1050,13668,1302],{"class":1064},[1050,13670,13671],{"class":1315}," FileResponse",[1050,13673,1519],{"class":1064},[1050,13675,13676,13679,13681,13683,13685,13687,13689,13691],{"class":1052,"line":1645},[1050,13677,13678],{"class":2536},"            open",[1050,13680,1239],{"class":1064},[1050,13682,1653],{"class":1315},[1050,13684,1077],{"class":1064},[1050,13686,1283],{"class":1282},[1050,13688,8332],{"class":1286},[1050,13690,1290],{"class":1282},[1050,13692,5252],{"class":1064},[1050,13694,13695,13697,13699,13701,13703,13705],{"class":1052,"line":1658},[1050,13696,1693],{"class":1631},[1050,13698,1302],{"class":1064},[1050,13700,1778],{"class":1315},[1050,13702,1065],{"class":1064},[1050,13704,2157],{"class":1274},[1050,13706,1567],{"class":1064},[1050,13708,13709,13712,13714,13716],{"class":1052,"line":1674},[1050,13710,13711],{"class":1631},"            as_attachment",[1050,13713,1302],{"class":1064},[1050,13715,3230],{"class":3229},[1050,13717,1567],{"class":1064},[1050,13719,13720,13723,13725,13727,13729],{"class":1052,"line":1690},[1050,13721,13722],{"class":1631},"            filename",[1050,13724,1302],{"class":1064},[1050,13726,1778],{"class":1315},[1050,13728,1065],{"class":1064},[1050,13730,3405],{"class":1274},[1050,13732,13733],{"class":1052,"line":1705},[1050,13734,1591],{"class":1064},[1050,13736,13737],{"class":1052,"line":1710},[1050,13738,1334],{"class":1060},[1050,13740,13741],{"class":1052,"line":1715},[1050,13742,13743],{"class":1408},"        # Add security headers\n",[1050,13745,13746,13749,13751,13753,13756,13758,13760,13762,13764,13767],{"class":1052,"line":1753},[1050,13747,13748],{"class":1060},"        response",[1050,13750,9235],{"class":1064},[1050,13752,1290],{"class":1282},[1050,13754,13755],{"class":1286},"X-Content-Type-Options",[1050,13757,1290],{"class":1282},[1050,13759,4690],{"class":1064},[1050,13761,3119],{"class":1064},[1050,13763,1283],{"class":1282},[1050,13765,13766],{"class":1286},"nosniff",[1050,13768,2847],{"class":1282},[1050,13770,13771,13773,13775,13777,13780,13782,13784,13786,13788,13791],{"class":1052,"line":1788},[1050,13772,13748],{"class":1060},[1050,13774,9235],{"class":1064},[1050,13776,1290],{"class":1282},[1050,13778,13779],{"class":1286},"X-Frame-Options",[1050,13781,1290],{"class":1282},[1050,13783,4690],{"class":1064},[1050,13785,3119],{"class":1064},[1050,13787,1283],{"class":1282},[1050,13789,13790],{"class":1286},"DENY",[1050,13792,2847],{"class":1282},[1050,13794,13795],{"class":1052,"line":1794},[1050,13796,1334],{"class":1060},[1050,13798,13799,13801],{"class":1052,"line":1816},[1050,13800,1756],{"class":1056},[1050,13802,13803],{"class":1060}," response\n",[1050,13805,13806],{"class":1052,"line":1821},[1050,13807,1334],{"class":1060},[1050,13809,13810,13812,13814,13816,13818],{"class":1052,"line":1835},[1050,13811,6785],{"class":1056},[1050,13813,1613],{"class":1060},[1050,13815,1065],{"class":1064},[1050,13817,8056],{"class":1274},[1050,13819,1293],{"class":1064},[1050,13821,13822,13824,13826,13828,13830,13832,13834],{"class":1052,"line":1845},[1050,13823,11762],{"class":1056},[1050,13825,13272],{"class":1315},[1050,13827,1239],{"class":1064},[1050,13829,3617],{"class":1282},[1050,13831,13418],{"class":1286},[1050,13833,3617],{"class":1282},[1050,13835,1328],{"class":1064},[1050,13837,13838],{"class":1052,"line":1866},[1050,13839,1216],{"emptyLinePlaceholder":1215},[1050,13841,13842,13844,13846,13848,13850,13852,13854],{"class":1052,"line":1895},[1050,13843,1233],{"class":1232},[1050,13845,13391],{"class":1225},[1050,13847,1239],{"class":1064},[1050,13849,1539],{"class":1242},[1050,13851,1077],{"class":1064},[1050,13853,6660],{"class":1242},[1050,13855,1246],{"class":1064},[1050,13857,13858,13860,13863],{"class":1052,"line":1900},[1050,13859,1253],{"class":1252},[1050,13861,13862],{"class":1256},"Check if user can access the file",[1050,13864,1260],{"class":1252},[1050,13866,13867],{"class":1052,"line":1912},[1050,13868,13869],{"class":1408},"    # Owner can always access\n",[1050,13871,13872,13874,13876,13878,13880,13882,13884],{"class":1052,"line":1936},[1050,13873,1266],{"class":1056},[1050,13875,6660],{"class":1060},[1050,13877,1065],{"class":1064},[1050,13879,1539],{"class":1274},[1050,13881,1279],{"class":1278},[1050,13883,10369],{"class":1060},[1050,13885,1293],{"class":1064},[1050,13887,13888,13890],{"class":1052,"line":1958},[1050,13889,1756],{"class":1056},[1050,13891,11891],{"class":3229},[1050,13893,13894],{"class":1052,"line":1963},[1050,13895,1791],{"class":1060},[1050,13897,13898],{"class":1052,"line":1974},[1050,13899,13900],{"class":1408},"    # Public files can be accessed by anyone\n",[1050,13902,13903,13905,13907,13909,13912],{"class":1052,"line":1984},[1050,13904,1266],{"class":1056},[1050,13906,6660],{"class":1060},[1050,13908,1065],{"class":1064},[1050,13910,13911],{"class":1274},"is_public",[1050,13913,1293],{"class":1064},[1050,13915,13916,13918],{"class":1052,"line":1989},[1050,13917,1756],{"class":1056},[1050,13919,11891],{"class":3229},[1050,13921,13922],{"class":1052,"line":2005},[1050,13923,1791],{"class":1060},[1050,13925,13926],{"class":1052,"line":2013},[1050,13927,13928],{"class":1408},"    # Check if user is in allowed users list\n",[1050,13930,13931,13933,13936,13938,13940,13942,13944,13947,13949,13951,13954,13957,13959,13961,13963,13965,13967,13970],{"class":1052,"line":2019},[1050,13932,1266],{"class":1056},[1050,13934,13935],{"class":2536}," hasattr",[1050,13937,1239],{"class":1064},[1050,13939,1778],{"class":1315},[1050,13941,1077],{"class":1064},[1050,13943,1283],{"class":1282},[1050,13945,13946],{"class":1286},"allowed_users",[1050,13948,1290],{"class":1282},[1050,13950,2485],{"class":1064},[1050,13952,13953],{"class":1278}," and",[1050,13955,13956],{"class":1060}," user ",[1050,13958,1998],{"class":1278},[1050,13960,6660],{"class":1060},[1050,13962,1065],{"class":1064},[1050,13964,13946],{"class":1274},[1050,13966,1065],{"class":1064},[1050,13968,13969],{"class":1315},"all",[1050,13971,12355],{"class":1064},[1050,13973,13974,13976],{"class":1052,"line":2049},[1050,13975,1756],{"class":1056},[1050,13977,11891],{"class":3229},[1050,13979,13980],{"class":1052,"line":2082},[1050,13981,1791],{"class":1060},[1050,13983,13984],{"class":1052,"line":2088},[1050,13985,13986],{"class":1408},"    # Staff can access all files\n",[1050,13988,13989,13991,13993,13995,13998],{"class":1052,"line":2094},[1050,13990,1266],{"class":1056},[1050,13992,10369],{"class":1060},[1050,13994,1065],{"class":1064},[1050,13996,13997],{"class":1274},"is_staff",[1050,13999,1293],{"class":1064},[1050,14001,14002,14004],{"class":1052,"line":2100},[1050,14003,1756],{"class":1056},[1050,14005,11891],{"class":3229},[1050,14007,14008],{"class":1052,"line":2148},[1050,14009,1791],{"class":1060},[1050,14011,14012,14014],{"class":1052,"line":2170},[1050,14013,1797],{"class":1056},[1050,14015,14016],{"class":3229}," False\n",[1050,14018,14019],{"class":1052,"line":2200},[1050,14020,1216],{"emptyLinePlaceholder":1215},[1050,14022,14023,14025,14028,14030,14032,14034,14037],{"class":1052,"line":2205},[1050,14024,1233],{"class":1232},[1050,14026,14027],{"class":1225}," serve_protected_media",[1050,14029,1239],{"class":1064},[1050,14031,1243],{"class":1242},[1050,14033,1077],{"class":1064},[1050,14035,14036],{"class":1242}," path",[1050,14038,1246],{"class":1064},[1050,14040,14041,14043,14046],{"class":1052,"line":2210},[1050,14042,1253],{"class":1252},[1050,14044,14045],{"class":1256},"Serve protected media files through Django",[1050,14047,1260],{"class":1252},[1050,14049,14050],{"class":1052,"line":2216},[1050,14051,14052],{"class":1408},"    # This view should be used with internal redirects (X-Accel-Redirect for Nginx)\n",[1050,14054,14055],{"class":1052,"line":2232},[1050,14056,1791],{"class":1060},[1050,14058,14059],{"class":1052,"line":2270},[1050,14060,14061],{"class":1408},"    # Reconstruct full file path\n",[1050,14063,14064,14067,14069,14071,14073,14075,14077,14080,14082,14085,14087,14090,14092,14094],{"class":1052,"line":2286},[1050,14065,14066],{"class":1060},"    full_path ",[1050,14068,1302],{"class":1064},[1050,14070,3429],{"class":1060},[1050,14072,1065],{"class":1064},[1050,14074,3434],{"class":1274},[1050,14076,1065],{"class":1064},[1050,14078,14079],{"class":1315},"join",[1050,14081,1239],{"class":1064},[1050,14083,14084],{"class":1315},"settings",[1050,14086,1065],{"class":1064},[1050,14088,14089],{"class":1309},"MEDIA_ROOT",[1050,14091,1077],{"class":1064},[1050,14093,14036],{"class":1315},[1050,14095,1328],{"class":1064},[1050,14097,14098],{"class":1052,"line":2292},[1050,14099,1791],{"class":1060},[1050,14101,14102,14104,14106,14108,14110,14112,14114,14116,14118,14121],{"class":1052,"line":2297},[1050,14103,1266],{"class":1056},[1050,14105,1343],{"class":1278},[1050,14107,3429],{"class":1060},[1050,14109,1065],{"class":1064},[1050,14111,3434],{"class":1274},[1050,14113,1065],{"class":1064},[1050,14115,13469],{"class":1315},[1050,14117,1239],{"class":1064},[1050,14119,14120],{"class":1315},"full_path",[1050,14122,1246],{"class":1064},[1050,14124,14125,14127,14129,14131,14133,14135,14137],{"class":1052,"line":2303},[1050,14126,11762],{"class":1056},[1050,14128,13272],{"class":1315},[1050,14130,1239],{"class":1064},[1050,14132,3617],{"class":1282},[1050,14134,13418],{"class":1286},[1050,14136,3617],{"class":1282},[1050,14138,1328],{"class":1064},[1050,14140,14141],{"class":1052,"line":2323},[1050,14142,1791],{"class":1060},[1050,14144,14145],{"class":1052,"line":2339},[1050,14146,14147],{"class":1408},"    # Extract file ID from path to check permissions\n",[1050,14149,14150],{"class":1052,"line":2351},[1050,14151,14152],{"class":1408},"    # This assumes your file paths contain the file ID\n",[1050,14154,14155,14157],{"class":1052,"line":2367},[1050,14156,6225],{"class":1056},[1050,14158,1293],{"class":1064},[1050,14160,14161,14164,14166,14169,14171,14173],{"class":1052,"line":2383},[1050,14162,14163],{"class":1060},"        file_id ",[1050,14165,1302],{"class":1064},[1050,14167,14168],{"class":1315}," extract_file_id_from_path",[1050,14170,1239],{"class":1064},[1050,14172,3434],{"class":1315},[1050,14174,1328],{"class":1064},[1050,14176,14177,14179,14181,14183,14185,14187,14189,14191,14193,14195,14197,14199],{"class":1052,"line":2397},[1050,14178,1608],{"class":1060},[1050,14180,1302],{"class":1064},[1050,14182,1613],{"class":1060},[1050,14184,1065],{"class":1064},[1050,14186,1618],{"class":1274},[1050,14188,1065],{"class":1064},[1050,14190,1316],{"class":1315},[1050,14192,1239],{"class":1064},[1050,14194,1544],{"class":1631},[1050,14196,1302],{"class":1064},[1050,14198,6653],{"class":1315},[1050,14200,1328],{"class":1064},[1050,14202,14203],{"class":1052,"line":2402},[1050,14204,1334],{"class":1060},[1050,14206,14207,14209,14211,14213,14215,14217,14219,14221,14223,14225],{"class":1052,"line":2407},[1050,14208,1340],{"class":1056},[1050,14210,1343],{"class":1278},[1050,14212,13391],{"class":1315},[1050,14214,1239],{"class":1064},[1050,14216,1243],{"class":1315},[1050,14218,1065],{"class":1064},[1050,14220,1539],{"class":1274},[1050,14222,1077],{"class":1064},[1050,14224,6660],{"class":1315},[1050,14226,1246],{"class":1064},[1050,14228,14229,14231,14233,14235,14237,14239,14241],{"class":1052,"line":2423},[1050,14230,12360],{"class":1056},[1050,14232,13272],{"class":1315},[1050,14234,1239],{"class":1064},[1050,14236,3617],{"class":1282},[1050,14238,13418],{"class":1286},[1050,14240,3617],{"class":1282},[1050,14242,1328],{"class":1064},[1050,14244,14245],{"class":1052,"line":2428},[1050,14246,1334],{"class":1060},[1050,14248,14249,14251,14253,14256,14258,14260,14262,14265],{"class":1052,"line":2446},[1050,14250,6785],{"class":1056},[1050,14252,6386],{"class":1064},[1050,14254,14255],{"class":1060},"UserFile",[1050,14257,1065],{"class":1064},[1050,14259,8056],{"class":1274},[1050,14261,1077],{"class":1064},[1050,14263,14264],{"class":2434}," ValueError",[1050,14266,1246],{"class":1064},[1050,14268,14269,14271,14273,14275,14277,14279,14281],{"class":1052,"line":2494},[1050,14270,11762],{"class":1056},[1050,14272,13272],{"class":1315},[1050,14274,1239],{"class":1064},[1050,14276,3617],{"class":1282},[1050,14278,13418],{"class":1286},[1050,14280,3617],{"class":1282},[1050,14282,1328],{"class":1064},[1050,14284,14285],{"class":1052,"line":2499},[1050,14286,1791],{"class":1060},[1050,14288,14289],{"class":1052,"line":2505},[1050,14290,14291],{"class":1408},"    # For production with Nginx, use X-Accel-Redirect\n",[1050,14293,14294,14296,14299,14301,14304],{"class":1052,"line":2515},[1050,14295,1266],{"class":1056},[1050,14297,14298],{"class":1060}," settings",[1050,14300,1065],{"class":1064},[1050,14302,14303],{"class":1309},"USE_X_ACCEL_REDIRECT",[1050,14305,1293],{"class":1064},[1050,14307,14308,14310,14312,14314],{"class":1052,"line":2554},[1050,14309,13666],{"class":1060},[1050,14311,1302],{"class":1064},[1050,14313,13277],{"class":1315},[1050,14315,3181],{"class":1064},[1050,14317,14318,14320,14322,14324,14327,14329,14331,14333,14335,14338,14340,14342,14344],{"class":1052,"line":2559},[1050,14319,13748],{"class":1060},[1050,14321,9235],{"class":1064},[1050,14323,1290],{"class":1282},[1050,14325,14326],{"class":1286},"X-Accel-Redirect",[1050,14328,1290],{"class":1282},[1050,14330,4690],{"class":1064},[1050,14332,3119],{"class":1064},[1050,14334,1732],{"class":1232},[1050,14336,14337],{"class":1286},"'/protected/",[1050,14339,1532],{"class":1531},[1050,14341,3434],{"class":1060},[1050,14343,1547],{"class":1531},[1050,14345,2847],{"class":1286},[1050,14347,14348,14350,14352,14354,14357,14359,14361,14363,14365,14367],{"class":1052,"line":2574},[1050,14349,13748],{"class":1060},[1050,14351,9235],{"class":1064},[1050,14353,1290],{"class":1282},[1050,14355,14356],{"class":1286},"Content-Type",[1050,14358,1290],{"class":1282},[1050,14360,4690],{"class":1064},[1050,14362,3119],{"class":1064},[1050,14364,6660],{"class":1060},[1050,14366,1065],{"class":1064},[1050,14368,1702],{"class":1274},[1050,14370,14371,14373],{"class":1052,"line":2594},[1050,14372,1756],{"class":1056},[1050,14374,13803],{"class":1060},[1050,14376,14377],{"class":1052,"line":2599},[1050,14378,1791],{"class":1060},[1050,14380,14381],{"class":1052,"line":2608},[1050,14382,14383],{"class":1408},"    # For development, serve directly\n",[1050,14385,14386,14388,14390],{"class":1052,"line":2626},[1050,14387,1797],{"class":1056},[1050,14389,13671],{"class":1315},[1050,14391,1519],{"class":1064},[1050,14393,14394,14397,14399,14401,14403,14405,14407,14409],{"class":1052,"line":2631},[1050,14395,14396],{"class":2536},"        open",[1050,14398,1239],{"class":1064},[1050,14400,14120],{"class":1315},[1050,14402,1077],{"class":1064},[1050,14404,1283],{"class":1282},[1050,14406,8332],{"class":1286},[1050,14408,1290],{"class":1282},[1050,14410,5252],{"class":1064},[1050,14412,14413,14416,14418,14420,14422],{"class":1052,"line":4410},[1050,14414,14415],{"class":1631},"        content_type",[1050,14417,1302],{"class":1064},[1050,14419,1778],{"class":1315},[1050,14421,1065],{"class":1064},[1050,14423,1702],{"class":1274},[1050,14425,14426],{"class":1052,"line":4419},[1050,14427,3857],{"class":1064},[1050,14429,14430],{"class":1052,"line":4442},[1050,14431,1216],{"emptyLinePlaceholder":1215},[1050,14433,14434,14436,14438,14440,14442],{"class":1052,"line":4447},[1050,14435,1233],{"class":1232},[1050,14437,14168],{"class":1225},[1050,14439,1239],{"class":1064},[1050,14441,3434],{"class":1242},[1050,14443,1246],{"class":1064},[1050,14445,14446,14448,14451],{"class":1052,"line":4453},[1050,14447,1253],{"class":1252},[1050,14449,14450],{"class":1256},"Extract file ID from file path",[1050,14452,1260],{"class":1252},[1050,14454,14455],{"class":1052,"line":4481},[1050,14456,14457],{"class":1408},"    # Example: uploads/123/filename.jpg -> 123\n",[1050,14459,14460,14463,14465,14467,14469,14471,14473,14475,14477,14479],{"class":1052,"line":4486},[1050,14461,14462],{"class":1060},"    parts ",[1050,14464,1302],{"class":1064},[1050,14466,14036],{"class":1060},[1050,14468,1065],{"class":1064},[1050,14470,2787],{"class":1315},[1050,14472,1239],{"class":1064},[1050,14474,1290],{"class":1282},[1050,14476,1550],{"class":1286},[1050,14478,1290],{"class":1282},[1050,14480,1328],{"class":1064},[1050,14482,14483,14485,14487,14489,14492,14494,14497,14500],{"class":1052,"line":4492},[1050,14484,1266],{"class":1056},[1050,14486,7704],{"class":2536},[1050,14488,1239],{"class":1064},[1050,14490,14491],{"class":1315},"parts",[1050,14493,2485],{"class":1064},[1050,14495,14496],{"class":1278}," >=",[1050,14498,14499],{"class":1427}," 2",[1050,14501,1293],{"class":1064},[1050,14503,14504,14506,14508,14510,14512,14514,14516],{"class":1052,"line":4522},[1050,14505,1756],{"class":1056},[1050,14507,7449],{"class":2434},[1050,14509,1239],{"class":1064},[1050,14511,14491],{"class":1315},[1050,14513,9235],{"class":1064},[1050,14515,2804],{"class":1427},[1050,14517,4329],{"class":1064},[1050,14519,14520,14523,14525,14527,14529,14532,14534],{"class":1052,"line":4527},[1050,14521,14522],{"class":1056},"    raise",[1050,14524,14264],{"class":2434},[1050,14526,1239],{"class":1064},[1050,14528,3617],{"class":1282},[1050,14530,14531],{"class":1286},"Cannot extract file ID from path",[1050,14533,3617],{"class":1282},[1050,14535,1328],{"class":1064},[1035,14537,14539],{"id":14538},"testing-file-uploads","Testing File Uploads",[1040,14541,14543],{"className":1042,"code":14542,"language":1044,"meta":1045,"style":1045},"# tests/test_file_uploads.py\nfrom django.test import TestCase, Client\nfrom django.core.files.uploadedfile import SimpleUploadedFile\nfrom django.contrib.auth.models import User\nimport tempfile\nimport os\n\nclass FileUploadTests(TestCase):\n    def setUp(self):\n        self.client = Client()\n        self.user = User.objects.create_user(\n            username='testuser',\n            email='test@example.com',\n            password='testpass'\n        )\n        self.client.login(username='testuser', password='testpass')\n    \n    def test_simple_file_upload(self):\n        \"\"\"Test basic file upload\"\"\"\n        # Create test file\n        test_file = SimpleUploadedFile(\n            \"test.txt\",\n            b\"Test file content\",\n            content_type=\"text/plain\"\n        )\n        \n        response = self.client.post('/uploads/simple/', {\n            'file': test_file\n        })\n        \n        self.assertEqual(response.status_code, 302)  # Redirect after success\n        \n        # Check file was created\n        user_file = UserFile.objects.get(user=self.user)\n        self.assertEqual(user_file.original_filename, 'test.txt')\n        self.assertEqual(user_file.file_size, 17)\n    \n    def test_file_size_validation(self):\n        \"\"\"Test file size limits\"\"\"\n        # Create large file\n        large_content = b\"x\" * (6 * 1024 * 1024)  # 6MB\n        large_file = SimpleUploadedFile(\n            \"large.txt\",\n            large_content,\n            content_type=\"text/plain\"\n        )\n        \n        response = self.client.post('/uploads/simple/', {\n            'file': large_file\n        })\n        \n        # Should show error message\n        self.assertContains(response, 'File size must be less than 5MB')\n    \n    def test_multiple_file_upload(self):\n        \"\"\"Test multiple file upload\"\"\"\n        file1 = SimpleUploadedFile(\"test1.txt\", b\"Content 1\", content_type=\"text/plain\")\n        file2 = SimpleUploadedFile(\"test2.txt\", b\"Content 2\", content_type=\"text/plain\")\n        \n        response = self.client.post('/uploads/multiple/', {\n            'files': [file1, file2]\n        })\n        \n        self.assertEqual(response.status_code, 302)\n        self.assertEqual(UserFile.objects.filter(user=self.user).count(), 2)\n    \n    def test_ajax_file_upload(self):\n        \"\"\"Test AJAX file upload\"\"\"\n        test_file = SimpleUploadedFile(\n            \"ajax_test.txt\",\n            b\"AJAX test content\",\n            content_type=\"text/plain\"\n        )\n        \n        response = self.client.post('/uploads/ajax/', {\n            'file': test_file\n        }, HTTP_X_REQUESTED_WITH='XMLHttpRequest')\n        \n        self.assertEqual(response.status_code, 200)\n        \n        data = response.json()\n        self.assertTrue(data['success'])\n        self.assertEqual(data['filename'], 'ajax_test.txt')\n    \n    def test_image_upload_processing(self):\n        \"\"\"Test image upload with processing\"\"\"\n        # Create test image\n        from PIL import Image\n        import io\n        \n        image = Image.new('RGB', (200, 200), color='red')\n        image_io = io.BytesIO()\n        image.save(image_io, format='JPEG')\n        image_io.seek(0)\n        \n        test_image = SimpleUploadedFile(\n            \"test_image.jpg\",\n            image_io.read(),\n            content_type=\"image/jpeg\"\n        )\n        \n        response = self.client.post('/uploads/image/', {\n            'image': test_image,\n            'title': 'Test Image'\n        })\n        \n        self.assertEqual(response.status_code, 200)\n        \n        data = response.json()\n        self.assertTrue(data['success'])\n        self.assertIn('thumbnail_url', data)\n        self.assertIn('medium_url', data)\n    \n    def test_secure_file_download(self):\n        \"\"\"Test secure file download\"\"\"\n        # Create test file\n        user_file = UserFile.objects.create(\n            user=self.user,\n            file=SimpleUploadedFile(\"download_test.txt\", b\"Download content\"),\n            original_filename=\"download_test.txt\",\n            file_size=16,\n            content_type=\"text/plain\"\n        )\n        \n        response = self.client.get(f'/uploads/download/{user_file.id}/')\n        \n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response['Content-Type'], 'text/plain')\n        self.assertIn('attachment', response['Content-Disposition'])\n    \n    def test_unauthorized_file_access(self):\n        \"\"\"Test that users cannot access other users' files\"\"\"\n        other_user = User.objects.create_user(\n            username='otheruser',\n            email='other@example.com',\n            password='otherpass'\n        )\n        \n        # Create file for other user\n        other_file = UserFile.objects.create(\n            user=other_user,\n            file=SimpleUploadedFile(\"private.txt\", b\"Private content\"),\n            original_filename=\"private.txt\",\n            file_size=15,\n            content_type=\"text/plain\"\n        )\n        \n        # Try to access as current user\n        response = self.client.get(f'/uploads/download/{other_file.id}/')\n        \n        self.assertEqual(response.status_code, 404)  # Should not be found\n",[1047,14544,14545,14550,14571,14594,14616,14622,14628,14632,14646,14659,14675,14699,14715,14731,14745,14749,14790,14794,14807,14816,14821,14833,14845,14859,14871,14875,14879,14909,14922,14926,14930,14959,14963,14968,14998,15024,15047,15051,15064,15073,15078,15113,15124,15135,15142,15154,15158,15162,15190,15203,15207,15211,15216,15240,15244,15257,15266,15310,15353,15357,15386,15408,15412,15416,15438,15481,15485,15498,15507,15517,15528,15541,15553,15557,15561,15590,15602,15621,15625,15648,15652,15669,15693,15724,15728,15741,15750,15755,15765,15771,15775,15822,15837,15864,15879,15883,15894,15905,15916,15928,15932,15936,15965,15980,15997,16001,16005,16027,16031,16045,16067,16090,16112,16116,16129,16138,16142,16160,16174,16205,16219,16230,16242,16246,16250,16288,16292,16314,16344,16376,16380,16393,16402,16421,16436,16451,16464,16468,16472,16477,16496,16507,16537,16551,16562,16574,16578,16582,16587,16624,16628],{"__ignoreMap":1045},[1050,14546,14547],{"class":1052,"line":1053},[1050,14548,14549],{"class":1408},"# tests/test_file_uploads.py\n",[1050,14551,14552,14554,14556,14558,14561,14563,14566,14568],{"class":1052,"line":1083},[1050,14553,1057],{"class":1056},[1050,14555,1061],{"class":1060},[1050,14557,1065],{"class":1064},[1050,14559,14560],{"class":1060},"test ",[1050,14562,1071],{"class":1056},[1050,14564,14565],{"class":1060}," TestCase",[1050,14567,1077],{"class":1064},[1050,14569,14570],{"class":1060}," Client\n",[1050,14572,14573,14575,14577,14579,14581,14583,14585,14587,14589,14591],{"class":1052,"line":1100},[1050,14574,1057],{"class":1056},[1050,14576,1061],{"class":1060},[1050,14578,1065],{"class":1064},[1050,14580,1136],{"class":1060},[1050,14582,1065],{"class":1064},[1050,14584,1141],{"class":1060},[1050,14586,1065],{"class":1064},[1050,14588,11445],{"class":1060},[1050,14590,1071],{"class":1056},[1050,14592,14593],{"class":1060}," SimpleUploadedFile\n",[1050,14595,14596,14598,14600,14602,14604,14606,14608,14610,14612,14614],{"class":1052,"line":1127},[1050,14597,1057],{"class":1056},[1050,14599,1061],{"class":1060},[1050,14601,1065],{"class":1064},[1050,14603,1109],{"class":1060},[1050,14605,1065],{"class":1064},[1050,14607,1114],{"class":1060},[1050,14609,1065],{"class":1064},[1050,14611,2698],{"class":1060},[1050,14613,1071],{"class":1056},[1050,14615,2703],{"class":1060},[1050,14617,14618,14620],{"class":1052,"line":1154},[1050,14619,1071],{"class":1056},[1050,14621,8205],{"class":1060},[1050,14623,14624,14626],{"class":1052,"line":1179},[1050,14625,1071],{"class":1056},[1050,14627,1201],{"class":1060},[1050,14629,14630],{"class":1052,"line":1196},[1050,14631,1216],{"emptyLinePlaceholder":1215},[1050,14633,14634,14636,14639,14641,14644],{"class":1052,"line":1204},[1050,14635,3036],{"class":1232},[1050,14637,14638],{"class":3039}," FileUploadTests",[1050,14640,1239],{"class":1064},[1050,14642,14643],{"class":3044},"TestCase",[1050,14645,1246],{"class":1064},[1050,14647,14648,14650,14653,14655,14657],{"class":1052,"line":1212},[1050,14649,3381],{"class":1232},[1050,14651,14652],{"class":1225}," setUp",[1050,14654,1239],{"class":1064},[1050,14656,3390],{"class":3389},[1050,14658,1246],{"class":1064},[1050,14660,14661,14663,14665,14668,14670,14673],{"class":1052,"line":1219},[1050,14662,4717],{"class":3399},[1050,14664,1065],{"class":1064},[1050,14666,14667],{"class":1274},"client",[1050,14669,3119],{"class":1064},[1050,14671,14672],{"class":1315}," Client",[1050,14674,3181],{"class":1064},[1050,14676,14677,14679,14681,14683,14685,14688,14690,14692,14694,14697],{"class":1052,"line":1229},[1050,14678,4717],{"class":3399},[1050,14680,1065],{"class":1064},[1050,14682,1539],{"class":1274},[1050,14684,3119],{"class":1064},[1050,14686,14687],{"class":1060}," User",[1050,14689,1065],{"class":1064},[1050,14691,1618],{"class":1274},[1050,14693,1065],{"class":1064},[1050,14695,14696],{"class":1315},"create_user",[1050,14698,1519],{"class":1064},[1050,14700,14701,14704,14706,14708,14711,14713],{"class":1052,"line":1249},[1050,14702,14703],{"class":1631},"            username",[1050,14705,1302],{"class":1064},[1050,14707,1290],{"class":1282},[1050,14709,14710],{"class":1286},"testuser",[1050,14712,1290],{"class":1282},[1050,14714,1567],{"class":1064},[1050,14716,14717,14720,14722,14724,14727,14729],{"class":1052,"line":1263},[1050,14718,14719],{"class":1631},"            email",[1050,14721,1302],{"class":1064},[1050,14723,1290],{"class":1282},[1050,14725,14726],{"class":1286},"test@example.com",[1050,14728,1290],{"class":1282},[1050,14730,1567],{"class":1064},[1050,14732,14733,14736,14738,14740,14743],{"class":1052,"line":1296},[1050,14734,14735],{"class":1631},"            password",[1050,14737,1302],{"class":1064},[1050,14739,1290],{"class":1282},[1050,14741,14742],{"class":1286},"testpass",[1050,14744,2847],{"class":1282},[1050,14746,14747],{"class":1052,"line":1331},[1050,14748,1591],{"class":1064},[1050,14750,14751,14753,14755,14757,14759,14762,14764,14767,14769,14771,14773,14775,14777,14780,14782,14784,14786,14788],{"class":1052,"line":1337},[1050,14752,4717],{"class":3399},[1050,14754,1065],{"class":1064},[1050,14756,14667],{"class":1274},[1050,14758,1065],{"class":1064},[1050,14760,14761],{"class":1315},"login",[1050,14763,1239],{"class":1064},[1050,14765,14766],{"class":1631},"username",[1050,14768,1302],{"class":1064},[1050,14770,1290],{"class":1282},[1050,14772,14710],{"class":1286},[1050,14774,1290],{"class":1282},[1050,14776,1077],{"class":1064},[1050,14778,14779],{"class":1631}," password",[1050,14781,1302],{"class":1064},[1050,14783,1290],{"class":1282},[1050,14785,14742],{"class":1286},[1050,14787,1290],{"class":1282},[1050,14789,1328],{"class":1064},[1050,14791,14792],{"class":1052,"line":1351},[1050,14793,1791],{"class":1060},[1050,14795,14796,14798,14801,14803,14805],{"class":1052,"line":1377},[1050,14797,3381],{"class":1232},[1050,14799,14800],{"class":1225}," test_simple_file_upload",[1050,14802,1239],{"class":1064},[1050,14804,3390],{"class":3389},[1050,14806,1246],{"class":1064},[1050,14808,14809,14811,14814],{"class":1052,"line":1400},[1050,14810,3525],{"class":1252},[1050,14812,14813],{"class":1256},"Test basic file upload",[1050,14815,1260],{"class":1252},[1050,14817,14818],{"class":1052,"line":1405},[1050,14819,14820],{"class":1408},"        # Create test file\n",[1050,14822,14823,14826,14828,14831],{"class":1052,"line":1412},[1050,14824,14825],{"class":1060},"        test_file ",[1050,14827,1302],{"class":1064},[1050,14829,14830],{"class":1315}," SimpleUploadedFile",[1050,14832,1519],{"class":1064},[1050,14834,14835,14838,14841,14843],{"class":1052,"line":1447},[1050,14836,14837],{"class":1282},"            \"",[1050,14839,14840],{"class":1286},"test.txt",[1050,14842,3617],{"class":1282},[1050,14844,1567],{"class":1064},[1050,14846,14847,14850,14852,14855,14857],{"class":1052,"line":1471},[1050,14848,14849],{"class":1232},"            b",[1050,14851,3617],{"class":1282},[1050,14853,14854],{"class":1286},"Test file content",[1050,14856,3617],{"class":1282},[1050,14858,1567],{"class":1064},[1050,14860,14861,14863,14865,14867,14869],{"class":1052,"line":1492},[1050,14862,1693],{"class":1631},[1050,14864,1302],{"class":1064},[1050,14866,3617],{"class":1282},[1050,14868,11671],{"class":1286},[1050,14870,3637],{"class":1282},[1050,14872,14873],{"class":1052,"line":1497},[1050,14874,1591],{"class":1064},[1050,14876,14877],{"class":1052,"line":1503},[1050,14878,1334],{"class":1060},[1050,14880,14881,14883,14885,14887,14889,14891,14893,14896,14898,14900,14903,14905,14907],{"class":1052,"line":1522},[1050,14882,13666],{"class":1060},[1050,14884,1302],{"class":1064},[1050,14886,3400],{"class":3399},[1050,14888,1065],{"class":1064},[1050,14890,14667],{"class":1274},[1050,14892,1065],{"class":1064},[1050,14894,14895],{"class":1315},"post",[1050,14897,1239],{"class":1064},[1050,14899,1290],{"class":1282},[1050,14901,14902],{"class":1286},"/uploads/simple/",[1050,14904,1290],{"class":1282},[1050,14906,1077],{"class":1064},[1050,14908,5868],{"class":1064},[1050,14910,14911,14913,14915,14917,14919],{"class":1052,"line":1570},[1050,14912,6635],{"class":1282},[1050,14914,1323],{"class":1286},[1050,14916,1290],{"class":1282},[1050,14918,1441],{"class":1064},[1050,14920,14921],{"class":1315}," test_file\n",[1050,14923,14924],{"class":1052,"line":1588},[1050,14925,6776],{"class":1064},[1050,14927,14928],{"class":1052,"line":1594},[1050,14929,1334],{"class":1060},[1050,14931,14932,14934,14936,14939,14941,14944,14946,14949,14951,14954,14956],{"class":1052,"line":1599},[1050,14933,4717],{"class":3399},[1050,14935,1065],{"class":1064},[1050,14937,14938],{"class":1315},"assertEqual",[1050,14940,1239],{"class":1064},[1050,14942,14943],{"class":1315},"response",[1050,14945,1065],{"class":1064},[1050,14947,14948],{"class":1274},"status_code",[1050,14950,1077],{"class":1064},[1050,14952,14953],{"class":1427}," 302",[1050,14955,2485],{"class":1064},[1050,14957,14958],{"class":1408},"  # Redirect after success\n",[1050,14960,14961],{"class":1052,"line":1605},[1050,14962,1334],{"class":1060},[1050,14964,14965],{"class":1052,"line":1628},[1050,14966,14967],{"class":1408},"        # Check file was created\n",[1050,14969,14970,14972,14974,14976,14978,14980,14982,14984,14986,14988,14990,14992,14994,14996],{"class":1052,"line":1645},[1050,14971,1608],{"class":1060},[1050,14973,1302],{"class":1064},[1050,14975,1613],{"class":1060},[1050,14977,1065],{"class":1064},[1050,14979,1618],{"class":1274},[1050,14981,1065],{"class":1064},[1050,14983,1316],{"class":1315},[1050,14985,1239],{"class":1064},[1050,14987,1539],{"class":1631},[1050,14989,1302],{"class":1064},[1050,14991,3390],{"class":3399},[1050,14993,1065],{"class":1064},[1050,14995,1539],{"class":1274},[1050,14997,1328],{"class":1064},[1050,14999,15000,15002,15004,15006,15008,15010,15012,15014,15016,15018,15020,15022],{"class":1052,"line":1658},[1050,15001,4717],{"class":3399},[1050,15003,1065],{"class":1064},[1050,15005,14938],{"class":1315},[1050,15007,1239],{"class":1064},[1050,15009,1778],{"class":1315},[1050,15011,1065],{"class":1064},[1050,15013,3448],{"class":1274},[1050,15015,1077],{"class":1064},[1050,15017,1283],{"class":1282},[1050,15019,14840],{"class":1286},[1050,15021,1290],{"class":1282},[1050,15023,1328],{"class":1064},[1050,15025,15026,15028,15030,15032,15034,15036,15038,15040,15042,15045],{"class":1052,"line":1674},[1050,15027,4717],{"class":3399},[1050,15029,1065],{"class":1064},[1050,15031,14938],{"class":1315},[1050,15033,1239],{"class":1064},[1050,15035,1778],{"class":1315},[1050,15037,1065],{"class":1064},[1050,15039,6691],{"class":1274},[1050,15041,1077],{"class":1064},[1050,15043,15044],{"class":1427}," 17",[1050,15046,1328],{"class":1064},[1050,15048,15049],{"class":1052,"line":1690},[1050,15050,1791],{"class":1060},[1050,15052,15053,15055,15058,15060,15062],{"class":1052,"line":1705},[1050,15054,3381],{"class":1232},[1050,15056,15057],{"class":1225}," test_file_size_validation",[1050,15059,1239],{"class":1064},[1050,15061,3390],{"class":3389},[1050,15063,1246],{"class":1064},[1050,15065,15066,15068,15071],{"class":1052,"line":1710},[1050,15067,3525],{"class":1252},[1050,15069,15070],{"class":1256},"Test file size limits",[1050,15072,1260],{"class":1252},[1050,15074,15075],{"class":1052,"line":1715},[1050,15076,15077],{"class":1408},"        # Create large file\n",[1050,15079,15080,15083,15085,15087,15089,15091,15093,15095,15097,15100,15102,15104,15106,15108,15110],{"class":1052,"line":1753},[1050,15081,15082],{"class":1060},"        large_content ",[1050,15084,1302],{"class":1064},[1050,15086,11228],{"class":1232},[1050,15088,3617],{"class":1282},[1050,15090,9480],{"class":1286},[1050,15092,3617],{"class":1282},[1050,15094,1431],{"class":1278},[1050,15096,6386],{"class":1064},[1050,15098,15099],{"class":1427},"6",[1050,15101,1431],{"class":1278},[1050,15103,1434],{"class":1427},[1050,15105,1431],{"class":1278},[1050,15107,1434],{"class":1427},[1050,15109,2485],{"class":1064},[1050,15111,15112],{"class":1408},"  # 6MB\n",[1050,15114,15115,15118,15120,15122],{"class":1052,"line":1788},[1050,15116,15117],{"class":1060},"        large_file ",[1050,15119,1302],{"class":1064},[1050,15121,14830],{"class":1315},[1050,15123,1519],{"class":1064},[1050,15125,15126,15128,15131,15133],{"class":1052,"line":1794},[1050,15127,14837],{"class":1282},[1050,15129,15130],{"class":1286},"large.txt",[1050,15132,3617],{"class":1282},[1050,15134,1567],{"class":1064},[1050,15136,15137,15140],{"class":1052,"line":1816},[1050,15138,15139],{"class":1315},"            large_content",[1050,15141,1567],{"class":1064},[1050,15143,15144,15146,15148,15150,15152],{"class":1052,"line":1821},[1050,15145,1693],{"class":1631},[1050,15147,1302],{"class":1064},[1050,15149,3617],{"class":1282},[1050,15151,11671],{"class":1286},[1050,15153,3637],{"class":1282},[1050,15155,15156],{"class":1052,"line":1835},[1050,15157,1591],{"class":1064},[1050,15159,15160],{"class":1052,"line":1845},[1050,15161,1334],{"class":1060},[1050,15163,15164,15166,15168,15170,15172,15174,15176,15178,15180,15182,15184,15186,15188],{"class":1052,"line":1866},[1050,15165,13666],{"class":1060},[1050,15167,1302],{"class":1064},[1050,15169,3400],{"class":3399},[1050,15171,1065],{"class":1064},[1050,15173,14667],{"class":1274},[1050,15175,1065],{"class":1064},[1050,15177,14895],{"class":1315},[1050,15179,1239],{"class":1064},[1050,15181,1290],{"class":1282},[1050,15183,14902],{"class":1286},[1050,15185,1290],{"class":1282},[1050,15187,1077],{"class":1064},[1050,15189,5868],{"class":1064},[1050,15191,15192,15194,15196,15198,15200],{"class":1052,"line":1895},[1050,15193,6635],{"class":1282},[1050,15195,1323],{"class":1286},[1050,15197,1290],{"class":1282},[1050,15199,1441],{"class":1064},[1050,15201,15202],{"class":1315}," large_file\n",[1050,15204,15205],{"class":1052,"line":1900},[1050,15206,6776],{"class":1064},[1050,15208,15209],{"class":1052,"line":1912},[1050,15210,1334],{"class":1060},[1050,15212,15213],{"class":1052,"line":1936},[1050,15214,15215],{"class":1408},"        # Should show error message\n",[1050,15217,15218,15220,15222,15225,15227,15229,15231,15233,15236,15238],{"class":1052,"line":1958},[1050,15219,4717],{"class":3399},[1050,15221,1065],{"class":1064},[1050,15223,15224],{"class":1315},"assertContains",[1050,15226,1239],{"class":1064},[1050,15228,14943],{"class":1315},[1050,15230,1077],{"class":1064},[1050,15232,1283],{"class":1282},[1050,15234,15235],{"class":1286},"File size must be less than 5MB",[1050,15237,1290],{"class":1282},[1050,15239,1328],{"class":1064},[1050,15241,15242],{"class":1052,"line":1963},[1050,15243,1791],{"class":1060},[1050,15245,15246,15248,15251,15253,15255],{"class":1052,"line":1974},[1050,15247,3381],{"class":1232},[1050,15249,15250],{"class":1225}," test_multiple_file_upload",[1050,15252,1239],{"class":1064},[1050,15254,3390],{"class":3389},[1050,15256,1246],{"class":1064},[1050,15258,15259,15261,15264],{"class":1052,"line":1984},[1050,15260,3525],{"class":1252},[1050,15262,15263],{"class":1256},"Test multiple file upload",[1050,15265,1260],{"class":1252},[1050,15267,15268,15271,15273,15275,15277,15279,15282,15284,15286,15288,15290,15293,15295,15297,15300,15302,15304,15306,15308],{"class":1052,"line":1989},[1050,15269,15270],{"class":1060},"        file1 ",[1050,15272,1302],{"class":1064},[1050,15274,14830],{"class":1315},[1050,15276,1239],{"class":1064},[1050,15278,3617],{"class":1282},[1050,15280,15281],{"class":1286},"test1.txt",[1050,15283,3617],{"class":1282},[1050,15285,1077],{"class":1064},[1050,15287,11228],{"class":1232},[1050,15289,3617],{"class":1282},[1050,15291,15292],{"class":1286},"Content 1",[1050,15294,3617],{"class":1282},[1050,15296,1077],{"class":1064},[1050,15298,15299],{"class":1631}," content_type",[1050,15301,1302],{"class":1064},[1050,15303,3617],{"class":1282},[1050,15305,11671],{"class":1286},[1050,15307,3617],{"class":1282},[1050,15309,1328],{"class":1064},[1050,15311,15312,15315,15317,15319,15321,15323,15326,15328,15330,15332,15334,15337,15339,15341,15343,15345,15347,15349,15351],{"class":1052,"line":2005},[1050,15313,15314],{"class":1060},"        file2 ",[1050,15316,1302],{"class":1064},[1050,15318,14830],{"class":1315},[1050,15320,1239],{"class":1064},[1050,15322,3617],{"class":1282},[1050,15324,15325],{"class":1286},"test2.txt",[1050,15327,3617],{"class":1282},[1050,15329,1077],{"class":1064},[1050,15331,11228],{"class":1232},[1050,15333,3617],{"class":1282},[1050,15335,15336],{"class":1286},"Content 2",[1050,15338,3617],{"class":1282},[1050,15340,1077],{"class":1064},[1050,15342,15299],{"class":1631},[1050,15344,1302],{"class":1064},[1050,15346,3617],{"class":1282},[1050,15348,11671],{"class":1286},[1050,15350,3617],{"class":1282},[1050,15352,1328],{"class":1064},[1050,15354,15355],{"class":1052,"line":2013},[1050,15356,1334],{"class":1060},[1050,15358,15359,15361,15363,15365,15367,15369,15371,15373,15375,15377,15380,15382,15384],{"class":1052,"line":2019},[1050,15360,13666],{"class":1060},[1050,15362,1302],{"class":1064},[1050,15364,3400],{"class":3399},[1050,15366,1065],{"class":1064},[1050,15368,14667],{"class":1274},[1050,15370,1065],{"class":1064},[1050,15372,14895],{"class":1315},[1050,15374,1239],{"class":1064},[1050,15376,1290],{"class":1282},[1050,15378,15379],{"class":1286},"/uploads/multiple/",[1050,15381,1290],{"class":1282},[1050,15383,1077],{"class":1064},[1050,15385,5868],{"class":1064},[1050,15387,15388,15390,15392,15394,15396,15398,15401,15403,15406],{"class":1052,"line":2049},[1050,15389,6635],{"class":1282},[1050,15391,1141],{"class":1286},[1050,15393,1290],{"class":1282},[1050,15395,1441],{"class":1064},[1050,15397,2108],{"class":1064},[1050,15399,15400],{"class":1315},"file1",[1050,15402,1077],{"class":1064},[1050,15404,15405],{"class":1315}," file2",[1050,15407,2145],{"class":1064},[1050,15409,15410],{"class":1052,"line":2082},[1050,15411,6776],{"class":1064},[1050,15413,15414],{"class":1052,"line":2088},[1050,15415,1334],{"class":1060},[1050,15417,15418,15420,15422,15424,15426,15428,15430,15432,15434,15436],{"class":1052,"line":2094},[1050,15419,4717],{"class":3399},[1050,15421,1065],{"class":1064},[1050,15423,14938],{"class":1315},[1050,15425,1239],{"class":1064},[1050,15427,14943],{"class":1315},[1050,15429,1065],{"class":1064},[1050,15431,14948],{"class":1274},[1050,15433,1077],{"class":1064},[1050,15435,14953],{"class":1427},[1050,15437,1328],{"class":1064},[1050,15439,15440,15442,15444,15446,15448,15450,15452,15454,15456,15458,15460,15462,15464,15466,15468,15470,15472,15475,15477,15479],{"class":1052,"line":2100},[1050,15441,4717],{"class":3399},[1050,15443,1065],{"class":1064},[1050,15445,14938],{"class":1315},[1050,15447,1239],{"class":1064},[1050,15449,14255],{"class":1315},[1050,15451,1065],{"class":1064},[1050,15453,1618],{"class":1274},[1050,15455,1065],{"class":1064},[1050,15457,10427],{"class":1315},[1050,15459,1239],{"class":1064},[1050,15461,1539],{"class":1631},[1050,15463,1302],{"class":1064},[1050,15465,3390],{"class":3399},[1050,15467,1065],{"class":1064},[1050,15469,1539],{"class":1274},[1050,15471,10602],{"class":1064},[1050,15473,15474],{"class":1315},"count",[1050,15476,9865],{"class":1064},[1050,15478,14499],{"class":1427},[1050,15480,1328],{"class":1064},[1050,15482,15483],{"class":1052,"line":2148},[1050,15484,1791],{"class":1060},[1050,15486,15487,15489,15492,15494,15496],{"class":1052,"line":2170},[1050,15488,3381],{"class":1232},[1050,15490,15491],{"class":1225}," test_ajax_file_upload",[1050,15493,1239],{"class":1064},[1050,15495,3390],{"class":3389},[1050,15497,1246],{"class":1064},[1050,15499,15500,15502,15505],{"class":1052,"line":2200},[1050,15501,3525],{"class":1252},[1050,15503,15504],{"class":1256},"Test AJAX file upload",[1050,15506,1260],{"class":1252},[1050,15508,15509,15511,15513,15515],{"class":1052,"line":2205},[1050,15510,14825],{"class":1060},[1050,15512,1302],{"class":1064},[1050,15514,14830],{"class":1315},[1050,15516,1519],{"class":1064},[1050,15518,15519,15521,15524,15526],{"class":1052,"line":2210},[1050,15520,14837],{"class":1282},[1050,15522,15523],{"class":1286},"ajax_test.txt",[1050,15525,3617],{"class":1282},[1050,15527,1567],{"class":1064},[1050,15529,15530,15532,15534,15537,15539],{"class":1052,"line":2216},[1050,15531,14849],{"class":1232},[1050,15533,3617],{"class":1282},[1050,15535,15536],{"class":1286},"AJAX test content",[1050,15538,3617],{"class":1282},[1050,15540,1567],{"class":1064},[1050,15542,15543,15545,15547,15549,15551],{"class":1052,"line":2232},[1050,15544,1693],{"class":1631},[1050,15546,1302],{"class":1064},[1050,15548,3617],{"class":1282},[1050,15550,11671],{"class":1286},[1050,15552,3637],{"class":1282},[1050,15554,15555],{"class":1052,"line":2270},[1050,15556,1591],{"class":1064},[1050,15558,15559],{"class":1052,"line":2286},[1050,15560,1334],{"class":1060},[1050,15562,15563,15565,15567,15569,15571,15573,15575,15577,15579,15581,15584,15586,15588],{"class":1052,"line":2292},[1050,15564,13666],{"class":1060},[1050,15566,1302],{"class":1064},[1050,15568,3400],{"class":3399},[1050,15570,1065],{"class":1064},[1050,15572,14667],{"class":1274},[1050,15574,1065],{"class":1064},[1050,15576,14895],{"class":1315},[1050,15578,1239],{"class":1064},[1050,15580,1290],{"class":1282},[1050,15582,15583],{"class":1286},"/uploads/ajax/",[1050,15585,1290],{"class":1282},[1050,15587,1077],{"class":1064},[1050,15589,5868],{"class":1064},[1050,15591,15592,15594,15596,15598,15600],{"class":1052,"line":2297},[1050,15593,6635],{"class":1282},[1050,15595,1323],{"class":1286},[1050,15597,1290],{"class":1282},[1050,15599,1441],{"class":1064},[1050,15601,14921],{"class":1315},[1050,15603,15604,15607,15610,15612,15614,15617,15619],{"class":1052,"line":2303},[1050,15605,15606],{"class":1064},"        },",[1050,15608,15609],{"class":1631}," HTTP_X_REQUESTED_WITH",[1050,15611,1302],{"class":1064},[1050,15613,1290],{"class":1282},[1050,15615,15616],{"class":1286},"XMLHttpRequest",[1050,15618,1290],{"class":1282},[1050,15620,1328],{"class":1064},[1050,15622,15623],{"class":1052,"line":2323},[1050,15624,1334],{"class":1060},[1050,15626,15627,15629,15631,15633,15635,15637,15639,15641,15643,15646],{"class":1052,"line":2339},[1050,15628,4717],{"class":3399},[1050,15630,1065],{"class":1064},[1050,15632,14938],{"class":1315},[1050,15634,1239],{"class":1064},[1050,15636,14943],{"class":1315},[1050,15638,1065],{"class":1064},[1050,15640,14948],{"class":1274},[1050,15642,1077],{"class":1064},[1050,15644,15645],{"class":1427}," 200",[1050,15647,1328],{"class":1064},[1050,15649,15650],{"class":1052,"line":2351},[1050,15651,1334],{"class":1060},[1050,15653,15654,15657,15659,15662,15664,15667],{"class":1052,"line":2367},[1050,15655,15656],{"class":1060},"        data ",[1050,15658,1302],{"class":1064},[1050,15660,15661],{"class":1060}," response",[1050,15663,1065],{"class":1064},[1050,15665,15666],{"class":1315},"json",[1050,15668,3181],{"class":1064},[1050,15670,15671,15673,15675,15678,15680,15683,15685,15687,15689,15691],{"class":1052,"line":2383},[1050,15672,4717],{"class":3399},[1050,15674,1065],{"class":1064},[1050,15676,15677],{"class":1315},"assertTrue",[1050,15679,1239],{"class":1064},[1050,15681,15682],{"class":1315},"data",[1050,15684,9235],{"class":1064},[1050,15686,1290],{"class":1282},[1050,15688,1723],{"class":1286},[1050,15690,1290],{"class":1282},[1050,15692,4329],{"class":1064},[1050,15694,15695,15697,15699,15701,15703,15705,15707,15709,15711,15713,15716,15718,15720,15722],{"class":1052,"line":2397},[1050,15696,4717],{"class":3399},[1050,15698,1065],{"class":1064},[1050,15700,14938],{"class":1315},[1050,15702,1239],{"class":1064},[1050,15704,15682],{"class":1315},[1050,15706,9235],{"class":1064},[1050,15708,1290],{"class":1282},[1050,15710,2876],{"class":1286},[1050,15712,1290],{"class":1282},[1050,15714,15715],{"class":1064},"],",[1050,15717,1283],{"class":1282},[1050,15719,15523],{"class":1286},[1050,15721,1290],{"class":1282},[1050,15723,1328],{"class":1064},[1050,15725,15726],{"class":1052,"line":2402},[1050,15727,1791],{"class":1060},[1050,15729,15730,15732,15735,15737,15739],{"class":1052,"line":2407},[1050,15731,3381],{"class":1232},[1050,15733,15734],{"class":1225}," test_image_upload_processing",[1050,15736,1239],{"class":1064},[1050,15738,3390],{"class":3389},[1050,15740,1246],{"class":1064},[1050,15742,15743,15745,15748],{"class":1052,"line":2423},[1050,15744,3525],{"class":1252},[1050,15746,15747],{"class":1256},"Test image upload with processing",[1050,15749,1260],{"class":1252},[1050,15751,15752],{"class":1052,"line":2428},[1050,15753,15754],{"class":1408},"        # Create test image\n",[1050,15756,15757,15759,15761,15763],{"class":1052,"line":2446},[1050,15758,4401],{"class":1056},[1050,15760,4168],{"class":3399},[1050,15762,4171],{"class":1056},[1050,15764,4174],{"class":1060},[1050,15766,15767,15769],{"class":1052,"line":2494},[1050,15768,4413],{"class":1056},[1050,15770,4416],{"class":1060},[1050,15772,15773],{"class":1052,"line":2499},[1050,15774,1334],{"class":1060},[1050,15776,15777,15779,15781,15783,15785,15788,15790,15792,15794,15796,15798,15800,15802,15804,15806,15808,15811,15813,15815,15818,15820],{"class":1052,"line":2505},[1050,15778,4456],{"class":1060},[1050,15780,1302],{"class":1064},[1050,15782,4182],{"class":1060},[1050,15784,1065],{"class":1064},[1050,15786,15787],{"class":1315},"new",[1050,15789,1239],{"class":1064},[1050,15791,1290],{"class":1282},[1050,15793,9688],{"class":1286},[1050,15795,1290],{"class":1282},[1050,15797,1077],{"class":1064},[1050,15799,6386],{"class":1064},[1050,15801,3749],{"class":1427},[1050,15803,1077],{"class":1064},[1050,15805,15645],{"class":1427},[1050,15807,9914],{"class":1064},[1050,15809,15810],{"class":1631}," color",[1050,15812,1302],{"class":1064},[1050,15814,1290],{"class":1282},[1050,15816,15817],{"class":1286},"red",[1050,15819,1290],{"class":1282},[1050,15821,1328],{"class":1064},[1050,15823,15824,15827,15829,15831,15833,15835],{"class":1052,"line":2515},[1050,15825,15826],{"class":1060},"        image_io ",[1050,15828,1302],{"class":1064},[1050,15830,4541],{"class":1060},[1050,15832,1065],{"class":1064},[1050,15834,4546],{"class":1315},[1050,15836,3181],{"class":1064},[1050,15838,15839,15841,15843,15845,15847,15850,15852,15854,15856,15858,15860,15862],{"class":1052,"line":2554},[1050,15840,4495],{"class":1060},[1050,15842,1065],{"class":1064},[1050,15844,1516],{"class":1315},[1050,15846,1239],{"class":1064},[1050,15848,15849],{"class":1315},"image_io",[1050,15851,1077],{"class":1064},[1050,15853,4567],{"class":1631},[1050,15855,1302],{"class":1064},[1050,15857,1290],{"class":1282},[1050,15859,4574],{"class":1286},[1050,15861,1290],{"class":1282},[1050,15863,1328],{"class":1064},[1050,15865,15866,15869,15871,15873,15875,15877],{"class":1052,"line":2559},[1050,15867,15868],{"class":1060},"        image_io",[1050,15870,1065],{"class":1064},[1050,15872,4599],{"class":1315},[1050,15874,1239],{"class":1064},[1050,15876,3338],{"class":1427},[1050,15878,1328],{"class":1064},[1050,15880,15881],{"class":1052,"line":2574},[1050,15882,1334],{"class":1060},[1050,15884,15885,15888,15890,15892],{"class":1052,"line":2594},[1050,15886,15887],{"class":1060},"        test_image ",[1050,15889,1302],{"class":1064},[1050,15891,14830],{"class":1315},[1050,15893,1519],{"class":1064},[1050,15895,15896,15898,15901,15903],{"class":1052,"line":2599},[1050,15897,14837],{"class":1282},[1050,15899,15900],{"class":1286},"test_image.jpg",[1050,15902,3617],{"class":1282},[1050,15904,1567],{"class":1064},[1050,15906,15907,15910,15912,15914],{"class":1052,"line":2608},[1050,15908,15909],{"class":1315},"            image_io",[1050,15911,1065],{"class":1064},[1050,15913,1582],{"class":1315},[1050,15915,6705],{"class":1064},[1050,15917,15918,15920,15922,15924,15926],{"class":1052,"line":2626},[1050,15919,1693],{"class":1631},[1050,15921,1302],{"class":1064},[1050,15923,3617],{"class":1282},[1050,15925,2113],{"class":1286},[1050,15927,3637],{"class":1282},[1050,15929,15930],{"class":1052,"line":2631},[1050,15931,1591],{"class":1064},[1050,15933,15934],{"class":1052,"line":4410},[1050,15935,1334],{"class":1060},[1050,15937,15938,15940,15942,15944,15946,15948,15950,15952,15954,15956,15959,15961,15963],{"class":1052,"line":4419},[1050,15939,13666],{"class":1060},[1050,15941,1302],{"class":1064},[1050,15943,3400],{"class":3399},[1050,15945,1065],{"class":1064},[1050,15947,14667],{"class":1274},[1050,15949,1065],{"class":1064},[1050,15951,14895],{"class":1315},[1050,15953,1239],{"class":1064},[1050,15955,1290],{"class":1282},[1050,15957,15958],{"class":1286},"/uploads/image/",[1050,15960,1290],{"class":1282},[1050,15962,1077],{"class":1064},[1050,15964,5868],{"class":1064},[1050,15966,15967,15969,15971,15973,15975,15978],{"class":1052,"line":4442},[1050,15968,6635],{"class":1282},[1050,15970,4153],{"class":1286},[1050,15972,1290],{"class":1282},[1050,15974,1441],{"class":1064},[1050,15976,15977],{"class":1315}," test_image",[1050,15979,1567],{"class":1064},[1050,15981,15982,15984,15986,15988,15990,15992,15995],{"class":1052,"line":4447},[1050,15983,6635],{"class":1282},[1050,15985,9213],{"class":1286},[1050,15987,1290],{"class":1282},[1050,15989,1441],{"class":1064},[1050,15991,1283],{"class":1282},[1050,15993,15994],{"class":1286},"Test Image",[1050,15996,2847],{"class":1282},[1050,15998,15999],{"class":1052,"line":4453},[1050,16000,6776],{"class":1064},[1050,16002,16003],{"class":1052,"line":4481},[1050,16004,1334],{"class":1060},[1050,16006,16007,16009,16011,16013,16015,16017,16019,16021,16023,16025],{"class":1052,"line":4486},[1050,16008,4717],{"class":3399},[1050,16010,1065],{"class":1064},[1050,16012,14938],{"class":1315},[1050,16014,1239],{"class":1064},[1050,16016,14943],{"class":1315},[1050,16018,1065],{"class":1064},[1050,16020,14948],{"class":1274},[1050,16022,1077],{"class":1064},[1050,16024,15645],{"class":1427},[1050,16026,1328],{"class":1064},[1050,16028,16029],{"class":1052,"line":4492},[1050,16030,1334],{"class":1060},[1050,16032,16033,16035,16037,16039,16041,16043],{"class":1052,"line":4522},[1050,16034,15656],{"class":1060},[1050,16036,1302],{"class":1064},[1050,16038,15661],{"class":1060},[1050,16040,1065],{"class":1064},[1050,16042,15666],{"class":1315},[1050,16044,3181],{"class":1064},[1050,16046,16047,16049,16051,16053,16055,16057,16059,16061,16063,16065],{"class":1052,"line":4527},[1050,16048,4717],{"class":3399},[1050,16050,1065],{"class":1064},[1050,16052,15677],{"class":1315},[1050,16054,1239],{"class":1064},[1050,16056,15682],{"class":1315},[1050,16058,9235],{"class":1064},[1050,16060,1290],{"class":1282},[1050,16062,1723],{"class":1286},[1050,16064,1290],{"class":1282},[1050,16066,4329],{"class":1064},[1050,16068,16069,16071,16073,16076,16078,16080,16082,16084,16086,16088],{"class":1052,"line":4533},[1050,16070,4717],{"class":3399},[1050,16072,1065],{"class":1064},[1050,16074,16075],{"class":1315},"assertIn",[1050,16077,1239],{"class":1064},[1050,16079,1290],{"class":1282},[1050,16081,9417],{"class":1286},[1050,16083,1290],{"class":1282},[1050,16085,1077],{"class":1064},[1050,16087,6927],{"class":1315},[1050,16089,1328],{"class":1064},[1050,16091,16092,16094,16096,16098,16100,16102,16104,16106,16108,16110],{"class":1052,"line":4551},[1050,16093,4717],{"class":3399},[1050,16095,1065],{"class":1064},[1050,16097,16075],{"class":1315},[1050,16099,1239],{"class":1064},[1050,16101,1290],{"class":1282},[1050,16103,9440],{"class":1286},[1050,16105,1290],{"class":1282},[1050,16107,1077],{"class":1064},[1050,16109,6927],{"class":1315},[1050,16111,1328],{"class":1064},[1050,16113,16114],{"class":1052,"line":4591},[1050,16115,1791],{"class":1060},[1050,16117,16118,16120,16123,16125,16127],{"class":1052,"line":4608},[1050,16119,3381],{"class":1232},[1050,16121,16122],{"class":1225}," test_secure_file_download",[1050,16124,1239],{"class":1064},[1050,16126,3390],{"class":3389},[1050,16128,1246],{"class":1064},[1050,16130,16131,16133,16136],{"class":1052,"line":4613},[1050,16132,3525],{"class":1252},[1050,16134,16135],{"class":1256},"Test secure file download",[1050,16137,1260],{"class":1252},[1050,16139,16140],{"class":1052,"line":4619},[1050,16141,14820],{"class":1408},[1050,16143,16144,16146,16148,16150,16152,16154,16156,16158],{"class":1052,"line":4664},[1050,16145,1608],{"class":1060},[1050,16147,1302],{"class":1064},[1050,16149,1613],{"class":1060},[1050,16151,1065],{"class":1064},[1050,16153,1618],{"class":1274},[1050,16155,1065],{"class":1064},[1050,16157,1623],{"class":1315},[1050,16159,1519],{"class":1064},[1050,16161,16162,16164,16166,16168,16170,16172],{"class":1052,"line":4703},[1050,16163,1632],{"class":1631},[1050,16165,1302],{"class":1064},[1050,16167,3390],{"class":3399},[1050,16169,1065],{"class":1064},[1050,16171,1539],{"class":1274},[1050,16173,1567],{"class":1064},[1050,16175,16176,16178,16180,16183,16185,16187,16190,16192,16194,16196,16198,16201,16203],{"class":1052,"line":4708},[1050,16177,1648],{"class":1631},[1050,16179,1302],{"class":1064},[1050,16181,16182],{"class":1315},"SimpleUploadedFile",[1050,16184,1239],{"class":1064},[1050,16186,3617],{"class":1282},[1050,16188,16189],{"class":1286},"download_test.txt",[1050,16191,3617],{"class":1282},[1050,16193,1077],{"class":1064},[1050,16195,11228],{"class":1232},[1050,16197,3617],{"class":1282},[1050,16199,16200],{"class":1286},"Download content",[1050,16202,3617],{"class":1282},[1050,16204,5252],{"class":1064},[1050,16206,16207,16209,16211,16213,16215,16217],{"class":1052,"line":4714},[1050,16208,1661],{"class":1631},[1050,16210,1302],{"class":1064},[1050,16212,3617],{"class":1282},[1050,16214,16189],{"class":1286},[1050,16216,3617],{"class":1282},[1050,16218,1567],{"class":1064},[1050,16220,16221,16223,16225,16228],{"class":1052,"line":4730},[1050,16222,1677],{"class":1631},[1050,16224,1302],{"class":1064},[1050,16226,16227],{"class":1427},"16",[1050,16229,1567],{"class":1064},[1050,16231,16232,16234,16236,16238,16240],{"class":1052,"line":4738},[1050,16233,1693],{"class":1631},[1050,16235,1302],{"class":1064},[1050,16237,3617],{"class":1282},[1050,16239,11671],{"class":1286},[1050,16241,3637],{"class":1282},[1050,16243,16244],{"class":1052,"line":4754},[1050,16245,1591],{"class":1064},[1050,16247,16248],{"class":1052,"line":4765},[1050,16249,1334],{"class":1060},[1050,16251,16252,16254,16256,16258,16260,16262,16264,16266,16268,16270,16273,16275,16277,16279,16281,16283,16286],{"class":1052,"line":4770},[1050,16253,13666],{"class":1060},[1050,16255,1302],{"class":1064},[1050,16257,3400],{"class":3399},[1050,16259,1065],{"class":1064},[1050,16261,14667],{"class":1274},[1050,16263,1065],{"class":1064},[1050,16265,1316],{"class":1315},[1050,16267,1239],{"class":1064},[1050,16269,2062],{"class":1232},[1050,16271,16272],{"class":1286},"'/uploads/download/",[1050,16274,1532],{"class":1531},[1050,16276,1778],{"class":1315},[1050,16278,1065],{"class":1064},[1050,16280,1544],{"class":1274},[1050,16282,1547],{"class":1531},[1050,16284,16285],{"class":1286},"/'",[1050,16287,1328],{"class":1064},[1050,16289,16290],{"class":1052,"line":4775},[1050,16291,1334],{"class":1060},[1050,16293,16294,16296,16298,16300,16302,16304,16306,16308,16310,16312],{"class":1052,"line":4805},[1050,16295,4717],{"class":3399},[1050,16297,1065],{"class":1064},[1050,16299,14938],{"class":1315},[1050,16301,1239],{"class":1064},[1050,16303,14943],{"class":1315},[1050,16305,1065],{"class":1064},[1050,16307,14948],{"class":1274},[1050,16309,1077],{"class":1064},[1050,16311,15645],{"class":1427},[1050,16313,1328],{"class":1064},[1050,16315,16316,16318,16320,16322,16324,16326,16328,16330,16332,16334,16336,16338,16340,16342],{"class":1052,"line":4815},[1050,16317,4717],{"class":3399},[1050,16319,1065],{"class":1064},[1050,16321,14938],{"class":1315},[1050,16323,1239],{"class":1064},[1050,16325,14943],{"class":1315},[1050,16327,9235],{"class":1064},[1050,16329,1290],{"class":1282},[1050,16331,14356],{"class":1286},[1050,16333,1290],{"class":1282},[1050,16335,15715],{"class":1064},[1050,16337,1283],{"class":1282},[1050,16339,11671],{"class":1286},[1050,16341,1290],{"class":1282},[1050,16343,1328],{"class":1064},[1050,16345,16346,16348,16350,16352,16354,16356,16359,16361,16363,16365,16367,16369,16372,16374],{"class":1052,"line":4830},[1050,16347,4717],{"class":3399},[1050,16349,1065],{"class":1064},[1050,16351,16075],{"class":1315},[1050,16353,1239],{"class":1064},[1050,16355,1290],{"class":1282},[1050,16357,16358],{"class":1286},"attachment",[1050,16360,1290],{"class":1282},[1050,16362,1077],{"class":1064},[1050,16364,15661],{"class":1315},[1050,16366,9235],{"class":1064},[1050,16368,1290],{"class":1282},[1050,16370,16371],{"class":1286},"Content-Disposition",[1050,16373,1290],{"class":1282},[1050,16375,4329],{"class":1064},[1050,16377,16378],{"class":1052,"line":4835},[1050,16379,1791],{"class":1060},[1050,16381,16382,16384,16387,16389,16391],{"class":1052,"line":4840},[1050,16383,3381],{"class":1232},[1050,16385,16386],{"class":1225}," test_unauthorized_file_access",[1050,16388,1239],{"class":1064},[1050,16390,3390],{"class":3389},[1050,16392,1246],{"class":1064},[1050,16394,16395,16397,16400],{"class":1052,"line":4851},[1050,16396,3525],{"class":1252},[1050,16398,16399],{"class":1256},"Test that users cannot access other users' files",[1050,16401,1260],{"class":1252},[1050,16403,16404,16407,16409,16411,16413,16415,16417,16419],{"class":1052,"line":4858},[1050,16405,16406],{"class":1060},"        other_user ",[1050,16408,1302],{"class":1064},[1050,16410,14687],{"class":1060},[1050,16412,1065],{"class":1064},[1050,16414,1618],{"class":1274},[1050,16416,1065],{"class":1064},[1050,16418,14696],{"class":1315},[1050,16420,1519],{"class":1064},[1050,16422,16423,16425,16427,16429,16432,16434],{"class":1052,"line":4881},[1050,16424,14703],{"class":1631},[1050,16426,1302],{"class":1064},[1050,16428,1290],{"class":1282},[1050,16430,16431],{"class":1286},"otheruser",[1050,16433,1290],{"class":1282},[1050,16435,1567],{"class":1064},[1050,16437,16438,16440,16442,16444,16447,16449],{"class":1052,"line":4886},[1050,16439,14719],{"class":1631},[1050,16441,1302],{"class":1064},[1050,16443,1290],{"class":1282},[1050,16445,16446],{"class":1286},"other@example.com",[1050,16448,1290],{"class":1282},[1050,16450,1567],{"class":1064},[1050,16452,16453,16455,16457,16459,16462],{"class":1052,"line":4891},[1050,16454,14735],{"class":1631},[1050,16456,1302],{"class":1064},[1050,16458,1290],{"class":1282},[1050,16460,16461],{"class":1286},"otherpass",[1050,16463,2847],{"class":1282},[1050,16465,16466],{"class":1052,"line":4918},[1050,16467,1591],{"class":1064},[1050,16469,16470],{"class":1052,"line":4923},[1050,16471,1334],{"class":1060},[1050,16473,16474],{"class":1052,"line":4929},[1050,16475,16476],{"class":1408},"        # Create file for other user\n",[1050,16478,16479,16482,16484,16486,16488,16490,16492,16494],{"class":1052,"line":4956},[1050,16480,16481],{"class":1060},"        other_file ",[1050,16483,1302],{"class":1064},[1050,16485,1613],{"class":1060},[1050,16487,1065],{"class":1064},[1050,16489,1618],{"class":1274},[1050,16491,1065],{"class":1064},[1050,16493,1623],{"class":1315},[1050,16495,1519],{"class":1064},[1050,16497,16498,16500,16502,16505],{"class":1052,"line":4961},[1050,16499,1632],{"class":1631},[1050,16501,1302],{"class":1064},[1050,16503,16504],{"class":1315},"other_user",[1050,16506,1567],{"class":1064},[1050,16508,16509,16511,16513,16515,16517,16519,16522,16524,16526,16528,16530,16533,16535],{"class":1052,"line":4966},[1050,16510,1648],{"class":1631},[1050,16512,1302],{"class":1064},[1050,16514,16182],{"class":1315},[1050,16516,1239],{"class":1064},[1050,16518,3617],{"class":1282},[1050,16520,16521],{"class":1286},"private.txt",[1050,16523,3617],{"class":1282},[1050,16525,1077],{"class":1064},[1050,16527,11228],{"class":1232},[1050,16529,3617],{"class":1282},[1050,16531,16532],{"class":1286},"Private content",[1050,16534,3617],{"class":1282},[1050,16536,5252],{"class":1064},[1050,16538,16539,16541,16543,16545,16547,16549],{"class":1052,"line":4982},[1050,16540,1661],{"class":1631},[1050,16542,1302],{"class":1064},[1050,16544,3617],{"class":1282},[1050,16546,16521],{"class":1286},[1050,16548,3617],{"class":1282},[1050,16550,1567],{"class":1064},[1050,16552,16553,16555,16557,16560],{"class":1052,"line":5019},[1050,16554,1677],{"class":1631},[1050,16556,1302],{"class":1064},[1050,16558,16559],{"class":1427},"15",[1050,16561,1567],{"class":1064},[1050,16563,16564,16566,16568,16570,16572],{"class":1052,"line":5035},[1050,16565,1693],{"class":1631},[1050,16567,1302],{"class":1064},[1050,16569,3617],{"class":1282},[1050,16571,11671],{"class":1286},[1050,16573,3637],{"class":1282},[1050,16575,16576],{"class":1052,"line":5040},[1050,16577,1591],{"class":1064},[1050,16579,16580],{"class":1052,"line":5045},[1050,16581,1334],{"class":1060},[1050,16583,16584],{"class":1052,"line":5088},[1050,16585,16586],{"class":1408},"        # Try to access as current user\n",[1050,16588,16589,16591,16593,16595,16597,16599,16601,16603,16605,16607,16609,16611,16614,16616,16618,16620,16622],{"class":1052,"line":5124},[1050,16590,13666],{"class":1060},[1050,16592,1302],{"class":1064},[1050,16594,3400],{"class":3399},[1050,16596,1065],{"class":1064},[1050,16598,14667],{"class":1274},[1050,16600,1065],{"class":1064},[1050,16602,1316],{"class":1315},[1050,16604,1239],{"class":1064},[1050,16606,2062],{"class":1232},[1050,16608,16272],{"class":1286},[1050,16610,1532],{"class":1531},[1050,16612,16613],{"class":1315},"other_file",[1050,16615,1065],{"class":1064},[1050,16617,1544],{"class":1274},[1050,16619,1547],{"class":1531},[1050,16621,16285],{"class":1286},[1050,16623,1328],{"class":1064},[1050,16625,16626],{"class":1052,"line":5129},[1050,16627,1334],{"class":1060},[1050,16629,16630,16632,16634,16636,16638,16640,16642,16644,16646,16649,16651],{"class":1052,"line":5134},[1050,16631,4717],{"class":3399},[1050,16633,1065],{"class":1064},[1050,16635,14938],{"class":1315},[1050,16637,1239],{"class":1064},[1050,16639,14943],{"class":1315},[1050,16641,1065],{"class":1064},[1050,16643,14948],{"class":1274},[1050,16645,1077],{"class":1064},[1050,16647,16648],{"class":1427}," 404",[1050,16650,2485],{"class":1064},[1050,16652,16653],{"class":1408},"  # Should not be found\n",[1026,16655,16656],{},"File uploads require careful handling of security, validation, and user experience. Implementing proper validation, processing, and access control ensures your Django application can handle file uploads safely and efficiently while providing a good user experience.",[16658,16659,16660],"style",{},"html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sETVe, html code.shiki .sETVe{--shiki-light:#39ADB5;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}",{"title":1045,"searchDepth":1053,"depth":1083,"links":16662},[16663,16667,16671],{"id":1032,"depth":1083,"text":1033,"children":16664},[16665,16666],{"id":1037,"depth":1100,"text":1038},{"id":2652,"depth":1100,"text":2653},{"id":6090,"depth":1083,"text":6091,"children":16668},[16669,16670],{"id":6094,"depth":1100,"text":6095},{"id":8679,"depth":1100,"text":8680},{"id":11389,"depth":1083,"text":11390,"children":16672},[16673,16674,16675],{"id":11393,"depth":1100,"text":11394},{"id":13251,"depth":1100,"text":13252},{"id":14538,"depth":1100,"text":14539},"md",null,{},{"title":158,"description":1028},"teTMlkXgD81FwNk1ChRVnDtrXKHnTZTyoiDMW9D5M8c",[16682,16684],{"title":154,"path":155,"stem":156,"description":16683,"children":-1},"Conditional view processing allows Django to handle HTTP conditional requests efficiently, reducing bandwidth and improving performance by serving cached content when appropriate. This includes ETags, Last-Modified headers, and conditional GET/HEAD requests.",{"title":162,"path":163,"stem":164,"description":16685,"children":-1},"Django provides several shortcut functions that simplify common view patterns and reduce boilerplate code. These functions handle frequent operations like rendering templates, retrieving objects, and managing redirects efficiently.",1772474909373]