Ë
    ¹ûàgPH ã                   óô   — d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ  G d„ d edd«      «      Z G d„ d«      Z y)é    N)ÚdefaultdictÚ
namedtuple)ÚEnum)ÚTopologicalSorter)Úchain)Úsettings)Úmodels)Ú
operations)Ú	Migration)ÚAlterModelOptions)ÚMigrationOptimizer)ÚMigrationQuestioner)ÚCOMPILED_REGEX_TYPEÚRegexObjectÚresolve_relation)Úcached_propertyc                   óB   — e Zd Z G d„ de«      Zed„ «       Zed„ «       Zy)ÚOperationDependencyc                   ó    — e Zd ZdZdZdZdZdZy)úOperationDependency.Typer   é   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚCREATEÚREMOVEÚALTERÚREMOVE_ORDER_WRTÚALTER_FOO_TOGETHER© ó    ú_/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/django/db/migrations/autodetector.pyÚTyper      s   „ ØˆØˆØˆØÐØÑr$   r&   c                 ó6   — | j                   j                  «       S ©N)Ú
model_nameÚlower©Úselfs    r%   Úmodel_name_lowerz$OperationDependency.model_name_lower!   ó   € à�‰×$Ñ$Ó&Ð&r$   c                 ó6   — | j                   j                  «       S r(   )Ú
field_namer*   r+   s    r%   Úfield_name_lowerz$OperationDependency.field_name_lower%   r.   r$   N)r   r   r   r   r&   r   r-   r1   r#   r$   r%   r   r      s6   „ ôˆtô ð ñ'ó ð'ð ñ'ó ñ'r$   r   z$app_label model_name field_name typec                   ó`  — e Zd ZdZd4d„Zd5d„Zd„ Zd„ Zd6d„Zd„ Z	d	„ Z
ed
„ «       Zd4d„Zd„ Zd„ Zd„ Zd7d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%ed$„ «       Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d4d1„Z3d2„ Z4e5d3„ «       Z6y)8ÚMigrationAutodetectora  
    Take a pair of ProjectStates and compare them to see what the first would
    need doing to make it match the second (the second usually being the
    project's current state).

    Note that this naturally operates on entire projects at a time,
    as it's likely that changes interact (for example, you can't
    add a ForeignKey without having a migration to add the table it
    depends on first). A user interface may offer single-app usage
    if it wishes, with the caveat that it may not always be possible.
    Nc                 óš   — || _         || _        |xs
 t        «       | _        |j                  D ��ch c]  \  }}|’Œ	 c}}| _        y c c}}w r(   )Ú
from_stateÚto_stater   Ú
questionerr	   Úexisting_apps)r,   r5   r6   r7   ÚappÚmodels         r%   Ú__init__zMigrationAutodetector.__init__7   s@   € Ø$ˆŒØ ˆŒØ$Ò=Ô(;Ó(=ˆŒØ4>×4EÑ4E×F¡j c¨5šcÓFˆÕùÓFs   ±Ac                 óx   — | j                  ||«      }| j                  |||«      }|r| j                  ||«      }|S )zÌ
        Main entry point to produce a list of applicable changes.
        Take a graph to base names on and an optional set of apps
        to try and restrict to (restriction is not guaranteed)
        )Ú_detect_changesÚarrange_for_graphÚ_trim_to_apps)r,   ÚgraphÚtrim_to_appsÚconvert_appsÚmigration_nameÚchangess         r%   rD   zMigrationAutodetector.changes=   sD   € ð ×&Ñ& |°UÓ;ˆØ×(Ñ(¨°%¸ÓHˆÙØ×(Ñ(¨°,Ó?ˆGØˆr$   c           
      ó˜  ‡ — t        |t        «      r|D �cg c]  }‰ j                  |«      ‘Œ c}S t        |t        «      rt        ˆ fd„|D «       «      S t        |t        «      r3|j                  «       D ��ci c]  \  }}|‰ j                  |«      “Œ c}}S t        |t        j                  «      rA|j                  ‰ j                  |j                  «      ‰ j                  |j                  «      fS t        |t        «      rt        |«      S t        |t        «      r|S t        |d«      rˆ|j                  «       }t        |t         j"                  «      r|dd }|\  }}}||D �cg c]  }‰ j                  |«      ‘Œ c}|j                  «       D ��ci c]  \  }}|‰ j                  |«      “Œ c}}fS |S c c}w c c}}w c c}w c c}}w )zÈ
        Recursive deconstruction for a field and its arguments.
        Used for full comparison for rename/alter; sometimes a single-level
        deconstruction will not compare correctly.
        c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr(   )Údeep_deconstruct)Ú.0Úvaluer,   s     €r%   ú	<genexpr>z9MigrationAutodetector.deep_deconstruct.<locals>.<genexpr>R   s   øè ø€ ÒG¸%˜×.Ñ.¨u×5ÑGùs   ƒÚdeconstructr   N)Ú
isinstanceÚlistrG   ÚtupleÚdictÚitemsÚ	functoolsÚpartialÚfuncÚargsÚkeywordsr   r   ÚtypeÚhasattrrK   r	   ÚField)r,   ÚobjrI   ÚkeyÚdeconstructedÚpathrT   Úkwargss   `       r%   rG   z&MigrationAutodetector.deep_deconstructI   s�  ø€ ô �cœ4Ô Ø>AÖB°U�D×)Ñ)¨%Õ0ÒBÐBÜ˜œUÔ#ÜÓGÀ3ÔGÓGÐGÜ˜œTÔ"ØHKÏ	É	Ë×T¹*¸#¸u�C˜×.Ñ.¨uÓ5Ñ5ÓTÐTÜ˜œY×.Ñ.Ô/à—‘Ø×%Ñ% c§h¡hÓ/Ø×%Ñ% c§l¡lÓ3ðð ô
 ˜Ô0Ô1Ü˜sÓ#Ð#Ü˜œTÔ"ð ˆJÜ�S˜-Ô(ØŸO™OÓ-ˆMÜ˜#œvŸ|™|Ô,à -¨a¨bÐ 1�Ø!.ÑˆD�$˜àØ;?Ö@°%�×&Ñ& uÕ-Ò@ØEKÇ\Á\Ã^×T±z°s¸E��d×+Ñ+¨EÓ2Ñ2ÓTðð ð ˆJùò; Cùó Uùò* AùÛTs   –F6Á8F;Å&GÆG
c                 óþ   — g }t        |j                  «       «      D ]^  \  }}| j                  |«      }|j                  r+|j                  j                  r|d   j                  dd«       |j                  |«       Œ` |S )zÒ
        Return a definition of the fields that ignores field names and
        what related fields actually relate to. Used for detecting renames (as
        the related fields change during renames).
        r   ÚtoN)ÚsortedrP   rG   Úremote_fieldr:   ÚpopÚappend)r,   ÚfieldsÚ
fields_defÚnameÚfieldÚdeconstructions         r%   Úonly_relation_agnostic_fieldsz3MigrationAutodetector.only_relation_agnostic_fieldso   sy   € ð ˆ
Ü! &§,¡,£.Ó1ò 	.‰KˆD�%Ø!×2Ñ2°5Ó9ˆNØ×!Ò! e×&8Ñ&8×&>Ò&>Ø˜qÑ!×%Ñ% d¨DÔ1Ø×Ñ˜nÕ-ð		.ð
 Ðr$   c                 ó~  — i | _         i | _        i | _        i | _        t	        «       | _        t	        «       | _        t	        «       | _        t	        «       | _        t	        «       | _	        t	        «       | _
        | j                  j                  j                  «       D ]±  \  \  }}}|j                  j                  dd«      s| j                  j!                  ||f«       ŒC|| j                  j"                  vsŒ\|j                  j                  d«      r| j                  j!                  ||f«       Œ•| j
                  j!                  ||f«       Œ³ | j$                  j                  j                  «       D ]¸  \  \  }}}|j                  j                  dd«      s| j                  j!                  ||f«       ŒC|| j                  j"                  vs|sŒ^||v sŒc|j                  j                  d«      r| j                  j!                  ||f«       Œœ| j                  j!                  ||f«       Œº | j                  j'                  «        | j$                  j'                  «        | j)                  «        | j+                  «        | j-                  «        | j/                  «        | j1                  «        | j3                  «        | j5                  «        | j7                  «        | j9                  «        | j;                  «        | j=                  «        | j?                  «        | jA                  «        | jC                  «        | jE                  «        | jG                  «        | jI                  «        | jK                  «        | jM                  «        | jO                  «        | jQ                  «        | jS                  «        | jU                  «        | jW                  «        | jY                  «        | j[                  «        | j]                  «        | j_                  |«       | ja                  «        | jb                  S )aX  
        Return a dict of migration plans which will achieve the
        change from from_state to to_state. The dict has app labels
        as keys and a list of migrations as values.

        The resulting migrations aren't specially named, but the names
        do matter for dependencies inside the set.

        convert_apps is the list of apps to convert to use migrations
        (i.e. to make initial migrations for, in the usual case)

        graph is an optional argument that, if provided, can help improve
        dependency generation and avoid potential circular dependencies.
        ÚmanagedTÚproxy)2Úgenerated_operationsÚaltered_indexesÚaltered_constraintsÚrenamed_fieldsÚsetÚold_model_keysÚold_proxy_keysÚold_unmanaged_keysÚnew_model_keysÚnew_proxy_keysÚnew_unmanaged_keysr5   r	   rP   ÚoptionsÚgetÚaddÚ	real_appsr6   Úresolve_fields_and_relationsÚgenerate_renamed_modelsÚ_prepare_field_listsÚ_generate_through_model_mapÚgenerate_deleted_modelsÚgenerate_created_modelsÚgenerate_deleted_proxiesÚgenerate_created_proxiesÚgenerate_altered_optionsÚgenerate_altered_managersÚ!generate_altered_db_table_commentÚcreate_renamed_fieldsÚcreate_altered_indexesÚcreate_altered_constraintsÚgenerate_removed_constraintsÚgenerate_removed_indexesÚgenerate_renamed_fieldsÚgenerate_renamed_indexesÚ(generate_removed_altered_unique_togetherÚgenerate_removed_fieldsÚgenerate_added_fieldsÚgenerate_altered_fieldsÚ&generate_altered_order_with_respect_toÚ generate_altered_unique_togetherÚgenerate_added_indexesÚgenerate_added_constraintsÚgenerate_altered_db_tableÚ_sort_migrationsÚ_build_migration_listÚ_optimize_migrationsÚ
migrations)r,   rB   r@   Ú	app_labelr)   Úmodel_states         r%   r=   z%MigrationAutodetector._detect_changes}   sl  € ð& %'ˆÔ!Ø!ˆÔØ#%ˆÔ Ø ˆÔô "›eˆÔÜ!›eˆÔÜ"%£%ˆÔÜ!›eˆÔÜ!›eˆÔÜ"%£%ˆÔØ48·O±O×4JÑ4J×4PÑ4PÓ4Rò 	EÑ0Ñ#ˆY˜
 [Ø×&Ñ&×*Ñ*¨9°dÔ;Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDØ $§/¡/×";Ñ";Ò;Ø×&Ñ&×*Ñ*¨7Ô3Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDà×'Ñ'×+Ñ+¨Y¸
Ð,CÕDð	Eð 59·M±M×4HÑ4H×4NÑ4NÓ4Pò 		EÑ0Ñ#ˆY˜
 [Ø×&Ñ&×*Ñ*¨9°dÔ;Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDØ $§/¡/×";Ñ";Ñ;Ú ¨lÒ!:à×&Ñ&×*Ñ*¨7Ô3Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDà×'Ñ'×+Ñ+¨Y¸
Ð,CÕDð		Eð 	�‰×4Ñ4Ô6Ø�‰×2Ñ2Ô4ð 	×$Ñ$Ô&ð 	×!Ñ!Ô#Ø×(Ñ(Ô*ð 	×$Ñ$Ô&Ø×$Ñ$Ô&Ø×%Ñ%Ô'Ø×%Ñ%Ô'Ø×%Ñ%Ô'Ø×&Ñ&Ô(Ø×.Ñ.Ô0ð 	×"Ñ"Ô$ð 	×#Ñ#Ô%Ø×'Ñ'Ô)à×)Ñ)Ô+Ø×%Ñ%Ô'à×$Ñ$Ô&Ø×%Ñ%Ô'à×5Ñ5Ô7à×$Ñ$Ô&Ø×"Ñ"Ô$Ø×$Ñ$Ô&Ø×3Ñ3Ô5Ø×-Ñ-Ô/Ø×#Ñ#Ô%Ø×'Ñ'Ô)Ø×&Ñ&Ô(à×ÑÔØ×"Ñ" 5Ô)Ø×!Ñ!Ô#à�‰Ðr$   c                 óf  — | j                   | j                  z  | _        | j                  | j                  z  | _        | j                  | j                  z  | _        i | _	        | j                  D ���ch c]P  \  }}| j                  j                  || j                  j                  ||f|«      f   j                  D ]  }|||f’Œ	 ŒR c}}}| _        | j                  D ���ch c]4  \  }}| j                   j                  ||f   j                  D ]  }|||f’Œ	 Œ6 c}}}| _        yc c}}}w c c}}}w )zÏ
        Prepare field lists and a list of the fields that used through models
        in the old state so dependencies can be made from the through model
        deletion to the field that uses it.
        N)rr   ru   Úkept_model_keysrs   rv   Úkept_proxy_keysrt   rw   Úkept_unmanaged_keysÚthrough_usersr5   r	   Úrenamed_modelsry   rd   Úold_field_keysr6   Únew_field_keys©r,   r›   r)   r0   s       r%   r~   z*MigrationAutodetector._prepare_field_listsæ   s?  € ð  $×2Ñ2°T×5HÑ5HÑHˆÔØ#×2Ñ2°T×5HÑ5HÑHˆÔØ#'×#:Ñ#:¸T×=TÑ=TÑ#TˆÔ ØˆÔð *.×)=Ñ)=÷
ð 
á%�	˜:Ø"Ÿo™o×4Ñ4Ø˜4×.Ñ.×2Ñ2°I¸zÐ3JÈJÓWÐWñç‰fò
ð ð ˜
 JÒ/ð
Ø/ô
ˆÔð *.×)=Ñ)=÷
ð 
á%�	˜:Ø"Ÿm™m×2Ñ2°9¸jÐ3HÑI×PÑPò
ð ð ˜
 JÒ/ð
Ø/ô
ˆÕùô
ùô
s   Á2AD%Ã!9D,c                 ó¤  — t        | j                  «      D ]¸  \  }}| j                  j                  ||f|«      }| j                  j
                  ||f   }|j                  j                  «       D ]]  \  }}t        |d«      sŒt        |j                  dd«      sŒ+t        |j                  j                  ||«      }|||f| j                  |<   Œ_ Œº y)zThrough model map generation.ra   ÚthroughN)r`   rr   r¢   ry   r5   r	   rd   rP   rW   Úgetattrra   r   r§   r¡   )r,   r›   r)   Úold_model_nameÚold_model_stater0   rg   Úthrough_keys           r%   r   z1MigrationAutodetector._generate_through_model_mapý   sÙ   € ä%+¨D×,?Ñ,?Ó%@ò 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ%4×%;Ñ%;×%AÑ%AÓ%Cò Ñ!�
˜EÜ˜5 .Õ1´gØ×&Ñ&¨	°4õ7ô #3Ø×*Ñ*×2Ñ2°I¸zó#�Kð "Ø&Ø"ð7�D×&Ñ& {Ò3ññ	r$   c                 óä   — | j                   dk7  r| dfS t        t        | j                  «      j	                  d«      \  }}t        ||j                  «       | j                  | j                  «      dfS )zp
        Return the resolved dependency and a boolean denoting whether or not
        it was swappable.
        Ú__setting__Fú.T)	r›   r¨   r   r)   Úsplitr   r*   r0   rV   )Ú
dependencyÚresolved_app_labelÚresolved_object_names      r%   Ú_resolve_dependencyz)MigrationAutodetector._resolve_dependency  s|   € ð ×Ñ =Ò0Ø˜uÐ$Ð$Ü3:Ü�j×+Ñ+ó4
ç
‰%�‹*ñ 	1ÐÐ0ô  Ø"Ø$×*Ñ*Ó,Ø×%Ñ%Ø—‘ó	ð ð
ð 	
r$   c           
      ó¶  — i | _         t        d„ | j                  j                  «       D «       «      }d}|�r#t	        | j                  «      D �]·  }g }t        «       }t        | j                  |   «      D �]¶  }d}t        «       }	|j                  D �]a  }
|
}| j                  |
«      \  }
}|
j                  |k7  sŒ*| j                  j                  |
j                  g «      D ]  }| j                  ||
«      sŒd} n |s nö|r(|	j                  |j                  |j                  f«       Œ™|
j                  | j                   v rB|	j                  |
j                  | j                   |
j                     d   j                  f«       Œó|rk|rJ|j                  |
j                  «      r/|	j                  |j                  |
j                  «      d   «       �ŒA|	j                  |
j                  df«       �Œ`d}�Œd |r4|j!                  |«       |j#                  |	«       | j                  |   d= �Œ· n |s|s�Œè| j                  |   r|r t%        dt&        fg g dœ«      } |d	t)        | j                   j                  |g «      «      d
z   z  |«      }t        |«      |_        ||_        || j.                  v|_        | j                   j3                  |g «      j!                  |«       d}�Œ™|| j                  |   z   | j                  |<   �Œº t        d„ | j                  j                  «       D «       «      }||k(  r|sd}nt5        d| j                  z  «      ‚|}|r�Œ"yy)ag  
        Chop the lists of operations up into migrations with dependencies on
        each other. Do this by going through an app's list of operations until
        one is found that has an outgoing dependency that isn't in another
        app's migration yet (hasn't been chopped off its list). Then chop off
        the operations before it into a migration and move onto the next app.
        If the loops completes without doing anything, there's a circular
        dependency (which _should_ be impossible as the operations are
        all split at this point so they can't depend and be depended on).
        c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr(   ©Úlen©rH   Úxs     r%   rJ   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>2  s   è ø€ ÒI ”c˜!—fÑIùó   ‚FTéÿÿÿÿr   Ú	__first__r   )r
   Údependencieszauto_%ir   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr(   r¶   r¸   s     r%   rJ   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>“  s   è ø€ ÒQ¨œc !ŸfÑQùrº   z)Cannot resolve operation dependencies: %rN)rš   Úsumrm   Úvaluesr`   rq   rM   Ú
_auto_depsr³   r›   ry   Úcheck_dependencyrz   r)   rf   Ú
leaf_nodesrc   ÚupdaterV   r   r·   r½   r
   r8   ÚinitialÚ
setdefaultÚ
ValueError)r,   r@   Únum_opsÚ	chop_moder›   Úchoppedr½   Ú	operationÚdeps_satisfiedÚoperation_dependenciesÚdepÚoriginal_depÚis_swappable_depÚother_operationÚsubclassÚinstanceÚnew_num_opss                    r%   r˜   z+MigrationAutodetector._build_migration_list&  sV  € ð ˆŒÜÑI d×&?Ñ&?×&FÑ&FÓ&HÔIÓIˆØˆ	Úô $ D×$=Ñ$=Ó>ó W�	Ø�Ü"›u�Ü!% d×&?Ñ&?À	Ñ&JÓ!Kó ?�IØ%)�NÜ-0«UÐ*Ø(×3Ñ3ó 6?˜ð
 (+˜Ø04×0HÑ0HÈÓ0MÑ-˜Ð-ØŸ=™=¨IÓ5ð 48×3LÑ3L×3PÑ3PØ #§¡¨ró4ò * ð $(×#8Ñ#8¸È#Õ#NØ5: NÙ$)ð*ñ $2Ù %á#3Ø$:×$>Ñ$>à,8×,BÑ,BØ,8×,CÑ,Cð)*õ%&ð &)§]¡]°d·o±oÑ%EØ$:×$>Ñ$>à,/¯M©MØ,0¯O©O¸C¿M¹MÑ,JÈ2Ñ,N×,SÑ,Sð)*õ%&ñ (1ñ ,1°U×5EÑ5EÀcÇmÁmÔ5TØ,B×,FÑ,FØ05×0@Ñ0@ÀÇÁÓ0OÐPQÑ0Rö-.ð -C×,FÑ,FØ14·±ÀÐ0Lö-.ð :?ªðm6?ñn &ØŸ™ yÔ1Ø$×+Ñ+Ð,BÔCØ ×5Ñ5°iÑ@ÀÒCáð?ñB  £7Ø×4Ñ4°YÒ?Á9Ü#'Ø'Ü&˜LØ+-¸rÑBó$˜ñ
 $,Ø%¬¨T¯_©_×-@Ñ-@ÀÈBÓ-OÓ)PÐSTÑ)TÑUØ%ó$˜ô 15°\Ó0B˜Ô-Ø.5˜Ô+Ø+4¸D×<NÑ<NÐ+N˜Ô(ØŸ™×2Ñ2°9¸bÓA×HÑHÈÔRØ$)š	ð $ d×&?Ñ&?À	Ñ&JÑJð ×1Ñ1°)Ó<ðkWôp ÑQ¨d×.GÑ.G×.NÑ.NÓ.PÔQÓQˆKØ˜gÒ%Ù Ø $‘Iä$ØCØ×3Ñ3ñ4óð ð "ˆGõQ r$   c                 ó’  ‡ ‡— t        ‰ j                  j                  «       «      D ]Ÿ  \  }}t        «       }|D ]e  }|j	                  |«       |j
                  D ]C  Š‰ j                  ‰«      d   Š‰j                  |k7  rŒ' |j                  |gˆˆ fd„|D «       ¢­Ž  ŒE Œg t        |j                  «       «      ‰ j                  |<   Œ¡ y)z{
        Reorder to make things possible. Reordering may be needed so FKs work
        nicely inside the same app.
        r   c              3   óH   •K  — | ]  }‰j                  |‰«      sŒ|–— Œ y ­wr(   )rÂ   )rH   r¹   rÎ   r,   s     €€r%   rJ   z9MigrationAutodetector._sort_migrations.<locals>.<genexpr>­  s    øè ø€ Ò Q q°4×3HÑ3HÈÈCÕ3P¤Ñ Qùs   ƒ"›"N)
r`   rm   rP   r   rz   rÁ   r³   r›   rM   Ústatic_order)r,   r›   ÚopsÚtsÚoprÎ   s   `    @r%   r—   z&MigrationAutodetector._sort_migrationsž  sÄ   ù€ ô
 % T×%>Ñ%>×%DÑ%DÓ%FÓGò 	K‰NˆI�sÜ"Ó$ˆBØò S�Ø—‘�r”
ØŸ=™=ò S�Cð ×2Ñ2°3Ó7¸Ñ:�CØ—}‘}¨	Ò1Ø Ø�B—F‘F˜2ÐRÔ Q¨CÔ QÔRñSðSô 48¸¿¹Ó8IÓ3JˆD×%Ñ% iÒ0ñ	Kr$   c                 óú  — | j                   j                  «       D ]C  \  }}t        ||dd  «      D ],  \  }}|j                  j	                  ||j
                  f«       Œ. ŒE | j                   j                  «       D ],  }|D ]%  }t        t        |j                  «      «      |_        Œ' Œ. | j                   j                  «       D ]5  \  }}|D ]+  }t        «       j                  |j                  |«      |_        Œ- Œ7 y )Nr   )rš   rP   Úzipr½   rc   rf   rÀ   rM   rq   r   Úoptimizer
   )r,   r›   rš   Úm1Úm2Ú	migrations         r%   r™   z*MigrationAutodetector._optimize_migrations°  sú   € à%)§_¡_×%:Ñ%:Ó%<ò 	=Ñ!ˆI�zÜ˜j¨*°Q°R¨.Ó9ò =‘��BØ—‘×&Ñ&¨	°2·7±7Ð';Õ<ñ=ð	=ð
 Ÿ/™/×0Ñ0Ó2ò 	KˆJØ'ò K�	Ü)-¬c°)×2HÑ2HÓ.IÓ)J�	Õ&ñKð	Kð
 &*§_¡_×%:Ñ%:Ó%<ò 	Ñ!ˆI�zØ'ò �	Ü'9Ó';×'DÑ'DØ×(Ñ(¨)ó(�	Õ$ññ	r$   c                 óš  ‡— ‰j                   €\‰j                  t        j                  j                  k(  r5t        |t        j                  «      xr |j                  ‰j                  k(  S ‰j                   �Î‰j                  t        j                  j                  k(  r§t        |t        j                  «      xr9 |j                  ‰j                  k(  xr t        ˆfd„|j                  D «       «      xsP t        |t        j                  «      xr4 |j                  ‰j                  k(  xr |j                  ‰j                  k(  S ‰j                   �w‰j                  t        j                  j                  k(  rPt        |t        j                  «      xr4 |j                  ‰j                  k(  xr |j                  ‰j                  k(  S ‰j                   €\‰j                  t        j                  j                  k(  r5t        |t        j                   «      xr |j                  ‰j                  k(  S ‰j                   �w‰j                  t        j                  j"                  k(  rPt        |t        j$                  «      xr4 |j                  ‰j                  k(  xr |j                  ‰j                  k(  S ‰j                   �‰‰j                  t        j                  j&                  k(  rbt        |t        j(                  «      xrF |j                  ‰j                  k(  xr+ |j*                  xs dj-                  «       ‰j                  k7  S ‰j                   �l‰j                  t        j                  j.                  k(  rEt        |t        j0                  t        j2                  f«      xr |j                  ‰j                  k(  S t5        d‰›�«      ‚)zn
        Return True if the given operation depends on the given dependency,
        False otherwise.
        c              3   óB   •K  — | ]  \  }}‰j                   |k(  –— Œ y ­wr(   )r0   )rH   r¹   Úyr°   s      €r%   rJ   z9MigrationAutodetector.check_dependency.<locals>.<genexpr>Ø  s    øè ø€ ÒP±t°q¸!˜
×-Ñ-°Õ2ÑPùs   ƒÚ zCan't handle dependency )r0   rV   r   r&   r   rL   r
   ÚCreateModelÚ
name_lowerr-   Úanyrd   ÚAddFieldr1   r   ÚRemoveFieldÚDeleteModelr    Ú
AlterFieldr!   ÚAlterOrderWithRespectToÚorder_with_respect_tor*   r"   ÚAlterUniqueTogetherÚAlterIndexTogetherrÇ   )r,   rË   r°   s     `r%   rÂ   z&MigrationAutodetector.check_dependencyÂ  sN  ø€ ð ×!Ñ!Ð)Ø—‘Ô#6×#;Ñ#;×#BÑ#BÒBô ˜9¤j×&<Ñ&<Ó=ò HØ×(Ñ(¨J×,GÑ,GÑGðð ×!Ñ!Ð-Ø—‘Ô#6×#;Ñ#;×#BÑ#BÒBô ˜9¤j×&<Ñ&<Ó=ò QØ×(Ñ(¨J×,GÑ,GÑGòQäÓP¸y×?OÑ?OÔPÓPòô
 ˜9¤j×&9Ñ&9Ó:ò HØ×.Ñ.°*×2MÑ2MÑMòHà×(Ñ(¨J×,GÑ,GÑGðð ×!Ñ!Ð-Ø—‘Ô#6×#;Ñ#;×#BÑ#BÒBô ˜9¤j×&<Ñ&<Ó=ò HØ×.Ñ.°*×2MÑ2MÑMòHà×(Ñ(¨J×,GÑ,GÑGðð ×!Ñ!Ð)Ø—‘Ô#6×#;Ñ#;×#BÑ#BÒBô ˜9¤j×&<Ñ&<Ó=ò HØ×(Ñ(¨J×,GÑ,GÑGðð ×!Ñ!Ð-Ø—‘Ô#6×#;Ñ#;×#AÑ#AÒAô ˜9¤j×&;Ñ&;Ó<ò HØ×.Ñ.°*×2MÑ2MÑMòHà×(Ñ(¨J×,GÑ,GÑGðð ×!Ñ!Ð-Ø—‘Ô#6×#;Ñ#;×#LÑ#LÒLô ˜9¤j×&HÑ&HÓIò /Ø×(Ñ(¨J×,GÑ,GÑGò/à×4Ñ4Ò:¸×AÑAÓCØ×.Ñ.ñ/ðð ×!Ñ!Ð-Ø—‘Ô#6×#;Ñ#;×#NÑ#NÒNô ØÜ×3Ñ3´Z×5RÑ5RÐSóò Hð ×(Ñ(¨J×,GÑ,GÑGðõ ¹ZÐIÓJÐJr$   c                 óÎ   — |xs g |_         |r-| j                  j                  |g «      j                  d|«       y | j                  j                  |g «      j	                  |«       y )Nr   )rÁ   rm   rÆ   Úinsertrc   )r,   r›   rË   r½   Ú	beginnings        r%   Úadd_operationz#MigrationAutodetector.add_operation  sX   € ð  ,Ò1¨rˆ	ÔÙØ×%Ñ%×0Ñ0°¸BÓ?×FÑFÀqÈ)ÕTà×%Ñ%×0Ñ0°¸BÓ?×FÑFÀyÕQr$   c                 ó®  — 	 | j                   j                  |   }|j                  D �ch c]   }t        |t        «      r|n|j
                  ’Œ" }}|d   ›d|d   ›�}|j                  j                  d«      s7d|v s3d|v s/t        j                  j                  «       |j                  «       k(  rd|d   z   d|d   z   fS 	 |S c c}w # t        $ r Y |S w xY w)z|
        Place potential swappable models first in lists of created models (only
        real way to solve #22783).
        r   r®   r   Ú	swappableÚAbstractUserÚAbstractBaseUserÚ___)r6   r	   ÚbasesrL   Ústrr   rx   ry   r   ÚAUTH_USER_MODELr*   ÚLookupError)r,   Úitemrœ   ÚbaseÚ
base_namesÚstring_versions         r%   Úswappable_first_keyz)MigrationAutodetector.swappable_first_key  sð   € ð
	ØŸ-™-×.Ñ.¨tÑ4ˆKð (×-Ñ-öàô # 4¬Ô-‘°4·=±=Ñ@ðˆJð ð )-¨Q«°°a²Ð9ˆNà×#Ñ#×'Ñ'¨Ô4Ø! ZÑ/Ø%¨Ñ3Ü×+Ñ+×1Ñ1Ó3°~×7KÑ7KÓ7MÒMà  Q¡™¨°°a±©Ð9Ð9ð Nð
 ˆùòøô ò 	ØØˆð	ús#   ‚'C ©%CÁA0C ÃC Ã	CÃCc                 ó  — i | _         i | _        | j                  | j                  z
  }t	        |«      D �]K  \  }}| j
                  j                  ||f   }| j                  |j                  «      }| j                  | j                  z
  }|D �]ð  \  }}||k(  sŒ| j                  j                  ||f   }	| j                  |	j                  «      }
||
k(  sŒI| j                  j                  |	|«      sŒfg }t        |j                  j                  «       «      | j
                  j                  ||f   j                  «       D ��cg c]#  }|j                  «       D ]  }|j                  ‘Œ Œ% c}}z   }|D ]<  }|j                   sŒ|j#                  | j%                  |||| j
                  «      «       Œ> | j'                  |t)        j*                  |	j,                  |j,                  ¬«      |¬«       || j                   ||f<   |	j.                  ›d|	j0                  ›�}|j.                  ›d|j0                  ›�| j                  |<   | j                  j3                  ||f«       | j                  j5                  ||f«        �ŒK �ŒN yc c}}w )z¼
        Find any renamed models, generate the operations for them, and remove
        the old entry from the model lists. Must be run before other
        model-level generation.
        )Úold_nameÚnew_name©r½   r®   N)r¢   Úrenamed_models_relru   rr   r`   r6   r	   ri   rd   r5   r7   Úask_rename_modelrM   rÀ   Ú	relationsra   Úis_relationÚextendÚ!_get_dependencies_for_foreign_keyró   r
   ÚRenameModelrf   r›   ræ   Úremoverz   )r,   Úadded_modelsr›   r)   rœ   Úmodel_fields_defÚremoved_modelsÚrem_app_labelÚrem_model_nameÚrem_model_stateÚrem_model_fields_defr½   r  rg   rd   Úrenamed_models_rel_keys                   r%   r}   z-MigrationAutodetector.generate_renamed_models6  s   € ð !ˆÔØ"$ˆÔØ×*Ñ*¨T×-@Ñ-@Ñ@ˆÜ%+¨LÓ%9ó 9	"Ñ!ˆI�zØŸ-™-×.Ñ.¨y¸*Ð/DÑEˆKØ#×AÑAÀ+×BTÑBTÓUÐà!×0Ñ0°4×3FÑ3FÑFˆNØ1?ó 4"Ñ-�˜~Ø  IÓ-Ø&*§o¡o×&<Ñ&<Ø% ~Ð5ñ'�Oð ,0×+MÑ+MØ'×.Ñ.ó,Ð(ð (Ð+?Ó?ØŸ?™?×;Ñ;Ø+¨[õð ,.˜LÜ%)¨+×*<Ñ*<×*CÑ*CÓ*EÓ%Fà15·±×1HÑ1HØ$-¨zÐ$9ñ2"ç"(¡&£(÷	Jà$-ð .7×-=Ñ-=Ó-?òJð
 %*ð	 !&× 2Ó 2ðJØ 2óJñ &˜Fð *0ò 	& Ø#(×#4Ó#4Ø$0×$7Ñ$7Ø(,×(NÑ(NØ,5Ø,6Ø,1Ø,0¯M©Mó	)*õ%&ð	&ð !×.Ñ.Ø )Ü *× 6Ñ 6Ø-<×-AÑ-AØ-8×-=Ñ-=ô!"ð .:ð /ô ð JX˜D×/Ñ/°	¸:Ð0EÑFà /× 9Ó 9Ø /× :Ò :ð6Ð2ð %0×$9Ó$9Ø$/×$:Ò$:ð!"ð !×3Ñ3Ð4JÑKð !×/Ñ/×6Ñ6¸À~Ð7VÔWØ ×/Ñ/×3Ñ3°YÀ
Ð4KÔLÚ!òi4"ñ9	"ùó$Js   Å(Jc                 ó  — | j                   | j                  z  }| j                  |z
  }| j                  |z
  }t	        t        || j                  d¬«      t        || j                  d¬«      «      }|D �]�  \  }}| j                  j                  ||f   }i }d}	|j                  j                  «       D ]ƒ  \  }
}|j                  sŒ|j                  j                  r>|j                  r|j                  j                  }	n|j                  j                  s|||
<   t        |j                  dd«      sŒ|||
<   Œ… |j                   j#                  d«      }|j                   j#                  d«      }|j                   j#                  dd«      }|j                   j#                  dd«      }t%        ||dt$        j&                  j(                  «      g}|j*                  D �]:  }t-        |t.        «      sŒd	|v sŒ|j1                  d	d
«      \  }}|j3                  t%        ||dt$        j&                  j4                  «      «       | j6                  j                  j9                  ||f«      }| j                  j                  j9                  ||f«      }|sŒµ|sŒ¸t;        |j                  «      j=                  |j                  «      j?                  |j                  «      }|D ]7  }|j3                  t%        |||t$        j&                  j(                  «      «       Œ9 �Œ= |	rA|j3                  t%        g tA        |	||«      ¢d‘t$        j&                  j4                  ‘­Ž «       | jC                  |tE        jF                  |jH                  |j                  j                  «       D �cg c]  }|d   |vr|‘Œ c}|j                   |j*                  |jJ                  ¬«      |d¬«       |j                   j9                  dd«      s�Œˆt        |j                  «       «      D ]”  \  }}| jM                  |||| j                  «      }|j3                  t%        ||dt$        j&                  j4                  «      «       | jC                  |tE        jN                  |||¬«      tQ        t;        |«      «      ¬«       Œ– |rs| jC                  |tE        jR                  ||¬«      t%        |||t$        j&                  j4                  «      t%        ||dt$        j&                  j4                  «      g¬«       t        |«      D �cg c](  }t%        |||t$        j&                  j4                  «      ‘Œ* }}|j3                  t%        ||dt$        j&                  j4                  «      «       |D ]+  }| jC                  |tE        jT                  ||¬«      |¬«       Œ- |D ]+  }| jC                  |tE        jV                  ||¬«      |¬«       Œ- |r)| jC                  |tE        jX                  ||¬«      |¬«       | j                  jZ                  }||f| j\                  v s�ŒÑ|||f   j                  «       D ]™  \  }}| j                  j                  |   }|j                  «       D ]h  \  } }!| jC                  |j^                  tE        j`                  |jH                  | |!¬«      t%        ||dt$        j&                  j4                  «      g¬«       Œj Œ› �Œ„ yc c}w c c}w )ar  
        Find all new models (both managed and unmanaged) and make create
        operations for them as well as separate operations to create any
        foreign key or M2M relationships (these are optimized later, if
        possible).

        Defer any model options that refer to collections of fields that might
        be deferred (e.g. unique_together).
        T)rZ   ÚreverseNr§   ÚindexesÚconstraintsÚunique_togetherrí   r®   r   r   ©rf   rd   rx   rù   Úmanagers)r½   rò   rk   ©r)   rf   rg   r  ©rf   rí   ©r)   Úindex©r)   Ú
constraint©rf   r  )1rr   rt   ru   rw   r   r`   r  r6   r	   rd   rP   ra   r:   Úprimary_keyÚparent_linkr¨   rx   rb   r   r&   r   rù   rL   rú   r¯   rc   r   r5   ry   rq   Ú
differenceÚintersectionr   ró   r
   rå   rf   r  r  rè   rM   rì   ÚAddIndexÚAddConstraintrî   r  rs   r›   rë   )"r,   Úold_keysr  Úadded_unmanaged_modelsÚall_added_modelsr›   r)   rœ   Úrelated_fieldsÚprimary_key_relr0   rg   r  r  r  rí   r½   rþ   Úbase_app_labelÚ	base_nameÚold_base_model_stateÚnew_base_model_stateÚremoved_base_fieldsÚremoved_base_fieldÚdrf   Úrelated_dependenciesr   r"  r  Úrelated_model_keyÚrelated_model_stateÚrelated_field_nameÚrelated_fields"                                     r%   r�   z-MigrationAutodetector.generate_created_modelsz  s  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×*Ñ*¨XÑ5ˆØ!%×!8Ñ!8¸8Ñ!CÐÜ Ü�< T×%=Ñ%=ÀtÔLÜÐ)¨t×/GÑ/GÐQUÔVó
Ðð &6ó J	Ñ!ˆI�zØŸ-™-×.Ñ.¨y¸*Ð/DÑEˆKàˆNØ"ˆOØ%0×%7Ñ%7×%=Ñ%=Ó%?ò ;Ñ!�
˜EØ×%Ó%Ø×)Ñ)×/Ò/Ø ×,Ò,Ø.3×.@Ñ.@×.FÑ.F™OØ!&×!3Ñ!3×!?Ò!?Ø9>˜N¨:Ñ6Ü˜u×1Ñ1°9¸dÕCØ5:˜ zÒ2ð;ð "×)Ñ)×-Ñ-¨iÓ8ˆGØ%×-Ñ-×1Ñ1°-Ó@ˆKØ)×1Ñ1×5Ñ5Ð6GÈÓNˆOØ$/×$7Ñ$7×$;Ñ$;Ø'¨ó%Ð!ô
 $Ø˜z¨4Ô1D×1IÑ1I×1PÑ1PóðˆLð $×)Ñ)ó #�Ü˜d¤CÕ(¨S°Dª[Ø04·
±
¸3ÀÓ0BÑ-�N IØ ×'Ñ'Ü+Ø*Ø%Ø Ü/×4Ñ4×;Ñ;ó	ôð ,0¯?©?×+AÑ+A×+EÑ+EØ'¨Ð3ó,Ð(ð ,0¯=©=×+?Ñ+?×+CÑ+CØ'¨Ð3ó,Ð(ò ,Ò0DäÐ 4× ;Ñ ;Ó<ß'™ZØ 4× ;Ñ ;ó÷ *™\¨+×*<Ñ*<Ó=ð ,ð 3Fò Ð.Ø(×/Ñ/Ü 3Ø$2Ø$-Ø$6Ü$7×$<Ñ$<×$CÑ$Có	!"õòð7#ñJ Ø×#Ñ#Ü'ð Ü)¨/¸9ÀjÓQðàðô ,×0Ñ0×7Ñ7òôð ×ÑØÜ×&Ñ&Ø$×)Ñ)ð "-×!3Ñ!3×!9Ñ!9Ó!;öàØ˜Q™4 ~Ñ5ò òð
 (×/Ñ/Ø%×+Ñ+Ø(×1Ñ1ô
ð *Øð ô ð$ ×&Ñ&×*Ñ*¨9°dÔ;Ùô  & n×&:Ñ&:Ó&<Ó=ò ‘��eØ#×EÑEØØØØ—M‘Mó	 �ð ×#Ñ#Ü'Ø! :¨tÔ5H×5MÑ5M×5TÑ5Tóôð ×"Ñ"ØÜ×'Ñ'Ø#-Ø!Ø#ôô
 "&¤c¨,Ó&7Ó!8ð #õ ðñ0 %Ø×"Ñ"ØÜ×6Ñ6Ø'Ø.Côô
 ,Ø%Ø&Ø1Ü/×4Ñ4×;Ñ;ó	ô ,Ø% z°4Ô9L×9QÑ9Q×9XÑ9Xóð
"ð #ô ô, # >Ó2ö	$ð ô $Ø˜z¨4Ô1D×1IÑ1I×1PÑ1Põð$Ð ð $ð !×'Ñ'Ü#Ø˜z¨4Ô1D×1IÑ1I×1PÑ1Póôð
 !ò �Ø×"Ñ"ØÜ×'Ñ'Ø#-Ø#ôð "6ð #õ ðð *ò �
Ø×"Ñ"ØÜ×,Ñ,Ø#-Ø#-ôð "6ð #õ ðñ Ø×"Ñ"ØÜ×2Ñ2Ø'Ø(7ôð "6ð #ô ð Ÿ™×/Ñ/ˆIØ˜:Ð&¨$×*=Ñ*=Ó=Ø9BØ˜zÐ)ñ:ç‘%“'òÑ5Ð% ~ð +/¯-©-×*>Ñ*>Ð?PÑ*QÐ'Ø=K×=QÑ=QÓ=Sò Ñ9Ð*¨MØ×*Ñ*Ø/×9Ñ9Ü&×1Ñ1Ø+>×+CÑ+CØ%7Ø&3ôô !4Ø$-Ø$.Ø$(Ü$7×$<Ñ$<×$CÑ$Có	!"ð*ð +õ ñò	ñmJ	ùò^ùòz$s   Î[8Ô,-[=c                 ó¨  — | j                   | j                  z
  }t        |«      D �]*  \  }}| j                  j                  ||f   }|j
                  j                  d«      sJ ‚t        ||dt        j                  j                  «      g}|j                  D ]b  }t        |t        «      sŒd|v sŒ|j                  dd«      \  }}|j                  t        ||dt        j                  j                  «      «       Œd | j!                  |t#        j$                  |j&                  g |j
                  |j                  |j(                  ¬«      |¬«       �Œ- y)zó
        Make CreateModel statements for proxy models. Use the same statements
        as that way there's less code duplication, but for proxy models it's
        safe to skip all the pointless field stuff and chuck out an operation.
        rl   Nr®   r   r  r  )rv   rs   r`   r6   r	   rx   ry   r   r&   r   rù   rL   rú   r¯   rc   r   ró   r
   rå   rf   r  )	r,   Úaddedr›   r)   rœ   r½   rþ   r/  r0  s	            r%   rƒ   z.MigrationAutodetector.generate_created_proxiesW  sH  € ð ×#Ñ# d×&9Ñ&9Ñ9ˆÜ%+¨E£]ó !	Ñ!ˆI�zØŸ-™-×.Ñ.¨y¸*Ð/DÑEˆKØ×&Ñ&×*Ñ*¨7Ô3Ð3Ð3ô $Ø˜z¨4Ô1D×1IÑ1I×1PÑ1PóðˆLð $×)Ñ)ò 
�Ü˜d¤CÕ(¨S°Dª[Ø04·
±
¸3ÀÓ0BÑ-�N IØ ×'Ñ'Ü+Ø*Ø%Ø Ü/×4Ñ4×;Ñ;ó	õð
ð ×ÑØÜ×&Ñ&Ø$×)Ñ)ØØ'×/Ñ/Ø%×+Ñ+Ø(×1Ñ1ôð *ð ö ñ-!	r$   c                 ó   — | j                   | j                  z  }| j                  |z
  }| j                  |z
  }t	        t        |«      t        |«      «      }|D �]³  \  }}| j                  j                  ||f   }i }|j                  j                  «       D ]J  \  }	}
|
j                  sŒ|
j                  j                  r|
||	<   t        |
j                  dd«      sŒF|
||	<   ŒL |j                  j                  dd«      }|r'| j                  |t!        j"                  |d¬«      «       t        |«      D ])  }| j                  |t!        j$                  ||¬«      «       Œ+ g }| j                  j&                  }|||f   j                  «       D ]—  \  \  }}}|j                  «       D ]|  \  }	}
|j)                  t+        |||	t*        j,                  j.                  «      «       |
j0                  rŒH|j)                  t+        |||	t*        j,                  j2                  «      «       Œ~ Œ™ t        |«      D ]7  }|j)                  t+        |||t*        j,                  j.                  «      «       Œ9 | j4                  j7                  ||j8                  f«      }|r4|j)                  t+        g |¢t*        j,                  j.                  ‘­Ž «       | j                  |t!        j:                  |j<                  ¬«      t?        tA        |«      «      ¬«       �Œ¶ y)a†  
        Find all deleted models (managed and unmanaged) and make delete
        operations for them as well as separate operations to delete any
        foreign key or M2M relationships (these are optimized later, if
        possible).

        Also bring forward removal of any model options that refer to
        collections of fields - the inverse of generate_created_models().
        r§   Nr  r#  ©r)   rf   ©rf   r  )!ru   rw   rr   rt   r   r`   r5   r	   rd   rP   ra   r:   r¨   rx   rb   ró   r
   rî   ré   r  rc   r   r&   r   Úmany_to_manyr    r¡   ry   ræ   rê   rf   rM   rq   )r,   Únew_keysÚdeleted_modelsÚdeleted_unmanaged_modelsÚall_deleted_modelsr›   r)   rœ   r-  r0   rg   r  rf   r½   r  Úrelated_object_app_labelÚobject_nameÚrelation_related_fieldsÚthrough_users                      r%   r€   z-MigrationAutodetector.generate_deleted_models�  s  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×,Ñ,¨xÑ7ˆØ#'×#:Ñ#:¸XÑ#EÐ Ü"Ü�>Ó"¤FÐ+CÓ$Dó
Ðð &8ó M	Ñ!ˆI�zØŸ/™/×0Ñ0°¸JÐ1FÑGˆKàˆNØ%0×%7Ñ%7×%=Ñ%=Ó%?ò ;Ñ!�
˜EØ×%Ó%Ø×)Ñ)×/Ò/Ø5:˜ zÑ2Ü˜u×1Ñ1°9¸dÕCØ5:˜ zÒ2ð;ð *×1Ñ1×5Ñ5Ð6GÈÓNˆOÙØ×"Ñ"ØÜ×2Ñ2Ø'Ø(,ôôô ˜~Ó.ò �Ø×"Ñ"ØÜ×*Ñ*Ø#-Ø!ôõðð ˆLØŸ™×1Ñ1ˆIð +4°I¸zÐ4IÑ*J×*PÑ*PÓ*Ròñ 'ñ Ø(ØØ&Ø)@×)FÑ)FÓ)Hò Ñ%�J Ø ×'Ñ'Ü+Ø4Ø'Ø&Ü/×4Ñ4×;Ñ;ó	ôð !×-Ó-Ø$×+Ñ+Ü/Ø 8Ø +Ø *Ü 3× 8Ñ 8× >Ñ >ó	õñð	ô. ˜~Ó.ò �Ø×#Ñ#Ü'Ø! :¨tÔ5H×5MÑ5M×5TÑ5Tóõðð  ×-Ñ-×1Ñ1°9¸k×>TÑ>TÐ2UÓVˆLÙØ×#Ñ#Ü'ÐW¨ÐWÔ7J×7OÑ7O×7VÑ7VÒWôð ×ÑØÜ×&Ñ&Ø$×)Ñ)ôô "¤# lÓ"3Ó4ð ö ñOM	r$   c                 ó,  — | j                   | j                  z
  }t        |«      D ]m  \  }}| j                  j                  ||f   }|j
                  j                  d«      sJ ‚| j                  |t        j                  |j                  ¬«      «       Œo y)z*Make DeleteModel options for proxy models.rl   r?  N)rs   rv   r`   r5   r	   rx   ry   ró   r
   rê   rf   )r,   Údeletedr›   r)   rœ   s        r%   r‚   z.MigrationAutodetector.generate_deleted_proxiesà  s‹   € à×%Ñ%¨×(;Ñ(;Ñ;ˆÜ%+¨G£_ò 	Ñ!ˆI�zØŸ/™/×0Ñ0°¸JÐ1FÑGˆKØ×&Ñ&×*Ñ*¨7Ô3Ð3Ð3Ø×ÑØÜ×&Ñ&Ø$×)Ñ)ôõñ	r$   c                 óh  — g | _         | j                  j                  «       }t        | j                  |z
  «      D �]õ  \  }}}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |«      }| j                  |«      }	t        || j                  z
  «      D �]\  \  }
}}|
|k(  sŒ||k(  sŒ|j                  |«      }| j                  |«      }|j                  rH|j                  j                  r2d|d   v r+|d   d   }|| j                  v r| j                  |   |d   d<   |j                  |«       |j!                  «       d   }||	k(  s#|dd |	dd k(  sŒ¿t#        |d   |¬«      |	d   k(  sŒÖ| j$                  j'                  ||||«      sŒõ| j                   j)                  |
||j*                  |||||f«       |j-                  |
||f«       |j/                  |||f«       || j0                  |||f<    �Œõ �Œø y)zWork out renamed fields.r_   r   r   r   )Ú	db_columnN)Úrenamed_operationsr£   Úcopyr`   r¤   r¢   ry   r5   r	   r6   Ú	get_fieldrG   ra   r:   r  Úset_attributes_from_nameÚget_attname_columnrO   r7   Ú
ask_renamerc   rL  r  rz   rp   )r,   r£   r›   r)   r0   r©   rª   Únew_model_staterg   Ú	field_decr  r  Úrem_field_nameÚ	old_fieldÚold_field_decÚ
old_rel_toÚold_db_columns                    r%   r‡   z+MigrationAutodetector.create_renamed_fieldsí  sv  € à"$ˆÔØ×,Ñ,×1Ñ1Ó3ˆÜ17Ø×Ñ .Ñ0ó2
ó 8	"Ñ-ˆI�z :ð "×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOØ#×-Ñ-¨jÓ9ˆEà×-Ñ-¨eÓ4ˆIÜAGØ ×!4Ñ!4Ñ4óBó -"Ñ=�˜~¨~ð ! IÓ-°.ÀJÓ2NØ /× 9Ñ 9¸.Ó I�IØ$(×$9Ñ$9¸)Ó$D�Mà×*Ò*Ø!×.Ñ.×4Ò4Ø  M°!Ñ$4Ñ4à%2°1Ñ%5°dÑ%;˜
Ø%¨×)@Ñ)@Ñ@Ø59×5LÑ5LÈZÑ5X˜M¨!Ñ,¨TÑ2Ø×6Ñ6°~ÔFØ$-×$@Ñ$@Ó$BÀ1Ñ$E�MØ$¨	Ò1ð & a¨Ð*¨i¸¸!¨nÓ<Ü  ¨qÑ!1¸]ÔKØ$ Q™<ó(ð  Ÿ?™?×5Ñ5Ø&¨¸
ÀEõð !×3Ñ3×:Ñ:à$1Ø$2Ø$-×$7Ñ$7Ø$2Ø$-Ø$.Ø$)Ø$.ð	!"ôð +×1Ñ1Ø!.°ÀÐ Oôð +×.Ñ.°	¸:ÀzÐ/RÔSà .ð !×/Ñ/°	¸:ÀzÐ0QÑRò "ò[-"ñ8	"r$   c           	      óœ  — | j                   D ]½  \  }}}}}}}}||j                  k7  r?|j                  «       }	||	_        | j	                  |t        j                  |||	¬«      «       | j	                  |t        j                  |||¬«      «       | j                  j                  |||f«       | j                  j                  |||f«       Œ¿ y)z Generate RenameField operations.r  )r)   r  r  N)rM  rL  Úclonerf   ró   r
   rë   ÚRenameFieldr£   r  rz   )
r,   r  r  Úrem_db_columnrU  r›   r)   rg   r0   Úaltered_fields
             r%   rŒ   z-MigrationAutodetector.generate_renamed_fields+  sâ   € ð ×$Ñ$ò!	Iñ 	
ØØØØØØØØð
  §¡Ò/Ø %§¡£�Ø%3�Ô"Ø×"Ñ"ØÜ×)Ñ)Ø#-Ø+Ø+ôôð ×ÑØÜ×&Ñ&Ø)Ø+Ø'ôôð ×Ñ×&Ñ&¨°~À~Ð'VÔWØ×Ñ×#Ñ# Y°
¸JÐ$GÕHñC!	Ir$   c                 ó€   — t        | j                  | j                  z
  «      D ]  \  }}}| j                  |||«       Œ y)zMake AddField operations.N)r`   r¤   r£   Ú_generate_added_fieldr¥   s       r%   r�   z+MigrationAutodetector.generate_added_fieldsP  sG   € ä17Ø×Ñ $×"5Ñ"5Ñ5ó2
ò 	JÑ-ˆI�z :ð ×&Ñ& y°*¸jÕIñ	Jr$   c           	      óà  — | j                   j                  ||f   j                  |«      }t        |||t        j                  j
                  «      g}|j                  rC|j                  j                  r-|j                  | j                  |||| j                   «      «       |j                  r |j                  | j                  |«      «       t        j                  t        j                  t        j                  f}|j                  xst |j!                  «       xsb |j"                  t        j$                  uxsD |j&                  xs6 |j(                  xr |j*                  xs t-        ||«      xr |j.                  }|sk|j1                  «       }t-        ||«      r.|j2                  r"| j4                  j7                  ||«      |_        n!| j4                  j;                  ||«      |_        |j<                  rM|j8                  t        j$                  ur1t?        |j8                  «      r| j4                  jA                  ||«       | jC                  |tE        jF                  ||||¬«      |¬«       y )N©r)   rf   rg   Úpreserve_defaultr  )$r6   r	   rO  r   r&   r   ra   r:   r
  r  Ú	generatedÚ%_get_dependencies_for_generated_fieldÚ	DateFieldÚDateTimeFieldÚ	TimeFieldÚnullÚhas_defaultÚ
db_defaultÚNOT_PROVIDEDr@  ÚblankÚempty_strings_allowedrL   Úauto_nowr[  Úauto_now_addr7   Úask_auto_now_add_additionÚdefaultÚask_not_null_additionÚuniqueÚcallableÚ$ask_unique_callable_default_additionró   r
   rè   )r,   r›   r)   r0   rg   r½   Útime_fieldsrc  s           r%   r`  z+MigrationAutodetector._generate_added_fieldW  s  € Ø—‘×$Ñ$ Y°
Ð%:Ñ;×EÑEÀjÓQˆô  Ø˜: zÔ3F×3KÑ3K×3RÑ3Róð
ˆð ×Ò %×"4Ñ"4×":Ò":Ø×ÑØ×6Ñ6ØØØØ—M‘Mó	ôð �?Š?Ø×Ñ × JÑ JÈ5Ó QÔRô ×'Ñ'¬×)=Ñ)=¼v×?OÑ?OÐPˆà�J‰Jò CØ× Ñ Ó"òCà×Ñ¤v×':Ñ':Ð:òCð ×!Ñ!òCð —‘Ò; × ;Ñ ;ò	Cô
 ˜5 +Ó.ÒA°5·>±>ð 	ñ  Ø—K‘K“MˆEÜ˜% Ô-°%×2DÒ2DØ $§¡× IÑ IØ 
ó!�•ð !%§¡× EÑ EØ 
ó!�”ð �LŠLØ—‘¤V×%8Ñ%8Ñ8Ü˜Ÿ™Ô'à�O‰O×@Ñ@ÀÈZÔXØ×ÑØÜ×ÑØ%ØØØ!1ô	ð &ð 	õ 		
r$   c                 ó€   — t        | j                  | j                  z
  «      D ]  \  }}}| j                  |||«       Œ y)zMake RemoveField operations.N)r`   r£   r¤   Ú_generate_removed_fieldr¥   s       r%   r�   z-MigrationAutodetector.generate_removed_fields‘  sG   € ä17Ø×Ñ $×"5Ñ"5Ñ5ó2
ò 	LÑ-ˆI�z :ð ×(Ñ(¨°JÀ
ÕKñ	Lr$   c                 óê   — | j                  |t        j                  ||¬«      t        |||t        j                  j
                  «      t        |||t        j                  j                  «      g¬«       y )Nr>  r  )ró   r
   ré   r   r&   r!   r"   r¥   s       r%   ry  z-MigrationAutodetector._generate_removed_field˜  su   € Ø×ÑØÜ×"Ñ"Ø%Øôô $ØØØÜ'×,Ñ,×=Ñ=ó	ô $ØØØÜ'×,Ñ,×?Ñ?ó	ðð 	õ 	
r$   c           
      ó	  — t        | j                  | j                  z  «      D �]U  \  }}}| j                  j	                  ||f|«      }| j
                  j	                  |||f|«      }| j                  j                  ||f   j                  |«      }| j                  j                  ||f   j                  |«      }g }t        |d«      �rÞt        |j                  dd«      �rÆt        |j                  j                  ||«      }	|	| j                  v r%|j                  j                  |j                  _        t        |j                  dd«      }
|
r^|	|
fz   }|| j
                  v rJ|j                  j                  |j                  _        |j                  j                  |j                  _        t        |dd«      }|r¿||f}t!        |D �cg c]"  }| j
                  j	                  ||fz   |«      ‘Œ$ c}«      |_        t!        |j$                  D �cg c]"  }| j
                  j	                  |	|fz   |«      ‘Œ$ c}«      |_        t        |dd«      x}r*t!        |«      |_        t!        |j$                  «      |_        |j'                  | j)                  |||| j                  «      «       t        |d«      rkt        |j                  dd«      rTt        |j                  j*                  ||«      }	|	| j                  v r%|j                  j*                  |j                  _        | j-                  |«      }| j-                  |«      }||k7  s�Œ&||k(  s�Œ-|j.                  xr |j.                  }|j.                   xr |j.                   }|s|rÉd}|j0                  rŒ|j0                  s€|j3                  «       sp|j4                  t        j6                  u rT|j.                  sH|j9                  «       }| j:                  j=                  ||«      }|t        j6                  ur||_        d}n|}| jA                  |tC        jD                  ||||¬	«      |¬
«       �Œ0| jG                  |||«       | jI                  |||«       �ŒX yc c}w c c}w )zp
        Make AlterField operations, or possibly RemovedField/AddField if alter
        isn't possible.
        ra   r:   Nr0   Úfrom_fieldsr§   TFrb  r  )%r`   r£   r¤   r¢   ry   rp   r5   r	   rO  r6   rW   r¨   ra   r   r:   r0   rN   r|  Ú	to_fieldsr
  r  r§   rG   r@  ri  rj  rk  rl  r[  r7   Úask_not_null_alterationrr  ró   r
   rë   ry  r`  )r,   r›   r)   r0   r©   Úold_field_namerV  Ú	new_fieldr½   Ú
rename_keyÚremote_field_nameÚto_field_rename_keyr|  Úfrom_rename_keyÚ
from_fieldÚto_fieldÚold_from_fieldsrW  Únew_field_decÚboth_m2mÚneither_m2mrc  rg   Únew_defaults                           r%   r‘   z-MigrationAutodetector.generate_altered_fields²  su  € ô
 28Ø×Ñ $×"5Ñ"5Ñ5ó2
ó t	RÑ-ˆI�z :ð "×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð "×0Ñ0×4Ñ4Ø˜J¨
Ð3°ZóˆNð Ÿ™×.Ñ.¨y¸.Ð/HÑI×SÑSØóˆIð Ÿ™×,Ñ,¨Y¸
Ð-BÑC×MÑMØóˆIð ˆLô �y .Õ1´gØ×&Ñ&¨°õ7ô .Ø×*Ñ*×0Ñ0°)¸Zó�
ð  ×!4Ñ!4Ñ4Ø3<×3IÑ3I×3OÑ3O�I×*Ñ*Ô0ä$+¨I×,BÑ,BÀLÐRVÓ$WÐ!Ù$Ø*4Ð8IÐ7KÑ*KÐ'Ø*¨d×.AÑ.AÑAð 8A×7MÑ7M×7SÑ7S˜	×.Ñ.Ô4à%×2Ñ2×=Ñ=ð "×.Ñ.Ô9ô & i°ÀÓE�ÙØ'0°*Ð&=�OÜ,1ð
 /:ö	ð !+ð !×/Ñ/×3Ñ3Ø /°:°-Ñ ?Àõòó-�IÔ)ô +0ð -6×,?Ñ,?öà (ð !×/Ñ/×3Ñ3°JÀ(ÀÑ4LÈhÕWòó+�IÔ'ô +2°)¸]ÈDÓ*QÐQ�ÐQÜ05°oÓ0F˜	Ô-Ü.3°I×4GÑ4GÓ.H˜	Ô+Ø×#Ñ#Ø×:Ñ:Ø!Ø"Ø!ØŸ™ó	ôô �y .Ô1´gØ×&Ñ&¨	°4ô7ô .Ø×*Ñ*×2Ñ2°I¸zó�
ð  ×!4Ñ!4Ñ4Ø5>×5KÑ5K×5SÑ5S�I×*Ñ*Ô2Ø ×1Ñ1°)Ó<ˆMØ ×1Ñ1°)Ó<ˆMð  Ô-°.ÀJÔ2NØ$×1Ñ1ÒL°i×6LÑ6L�Ø"+×"8Ñ"8Ð8ÒWÀ×AWÑAWÐ=W�Ù™{à'+Ð$à!ŸšØ )§¢Ø )× 5Ñ 5Ô 7Ø%×0Ñ0´F×4GÑ4GÑGØ )× 6Ò 6à )§¡Ó 1˜Ø&*§o¡o×&MÑ&MØ&¨
ó'˜ð '¬f×.AÑ.AÑAØ,7˜EœMØ/4Ñ,à )˜Ø×&Ñ&Ø!Ü"×-Ñ-Ø'1Ø!+Ø"'Ø-=ô	ð &2ð 'ö 	ð ×0Ñ0°¸JÈ
ÔSØ×.Ñ.¨y¸*ÀjÖQñit	RùòXùòs   Ç
'Q=
È'R
c                 óö  — t         j                  j                  }t        t        «      | _        t        | j                  «      D �]ž  \  }}| j                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |   }|j                  |   }|D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	g }g }g }|
D ]“  }|j                  «       }|d   j                  d«      }|D ]h  }|j                  «       }|d   j                  d«      }||k(  sŒ-||k7  sŒ3|j!                  ||d f«       |j!                  |«       |j!                  |«       Œj Œ• | j#                  t         j$                  j                  «      D ]é  \  }}}}}||k7  s||k7  rŒ|j'                  |«      }|D ]À  }g }|
D ]T  }|j                  «       \  }}}|rŒ|j(                  t	        |«      k(  sŒ3t+        |«      ddhk(  sŒD|j!                  |«       ŒV t-        |«      dk(  sŒm|d   } |j!                  | «       |j!                  d | j.                  |f«       | j
                  ||f   j!                  |«       ŒÂ Œë |
D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	| j0                  j3                  ||f|
||dœi«       �Œ¡ y c c}	w c c}	w c c}	w c c}	w )Nr   rf   rd   r   r   )Úadded_indexesÚremoved_indexesÚrenamed_indexes)r
   r(  Úoption_namer   rM   Úrenamed_index_together_valuesr`   rž   r¢   ry   r5   r	   r6   rx   rK   rb   rc   Ú$_get_altered_foo_together_operationsrï   r&  rd   rq   r·   rf   rn   rÄ   )!r,   r�  r›   r)   r©   rª   rS  Úold_indexesÚnew_indexesÚidxr�  rŽ  r�  Úremove_from_addedÚremove_from_removedÚ	new_indexÚnew_index_decÚnew_index_nameÚ	old_indexÚold_index_decÚold_index_nameÚ	old_valueÚ	new_valueÚindex_together_app_labelÚindex_together_model_namer½   Úremoved_valuesÚremoved_index_togetherÚrenamed_index_together_indexesÚ_rT   r]   Úrenamed_indexs!                                    r%   rˆ   z,MigrationAutodetector.create_altered_indexes-  ss  € Ü ×)Ñ)×5Ñ5ˆÜ-8¼Ó->ˆÔ*ä%+¨D×,@Ñ,@Ó%Aó S	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOà)×1Ñ1°+Ñ>ˆKØ)×1Ñ1°+Ñ>ˆKØ,7ÖR S¸3ÀkÒ;QšSÐRˆMÐRØ.9ÖT s¸SÈÒ=SšsÐTˆOÐTØ ˆOà "ÐØ"$ÐØ*ò >�	Ø )× 5Ñ 5Ó 7�Ø!.¨qÑ!1×!5Ñ!5°fÓ!=�Ø!0ò 
>�IØ$-×$9Ñ$9Ó$;�MØ%2°1Ñ%5×%9Ñ%9¸&Ó%A�Nð &¨Ó6Ø*¨nÓ<à'×.Ñ.°ÀÐPTÐ/UÔVØ)×0Ñ0°Ô;Ø+×2Ñ2°9Õ=ñ
>ð>ð* ×:Ñ:Ü×-Ñ-×9Ñ9óò#9ñ ØØØ(Ø)Øð
 Ð!9Ò9Ø!Ð%>Ò>àØ!*×!5Ñ!5°iÓ!@�Ø.<ò 9Ð*Ø57Ð2Ø%2ò M˜	Ø*3×*?Ñ*?Ó*A™˜˜4 ò !%Ø )× 0Ñ 0´DÐ9OÓ4PÓ PÜ # F£°¸Ð/AÓ Aà:×AÑAÀ)ÕLðMô Ð9Ó:¸aÓ?Ø(FÀqÑ(I˜Ø)×0Ñ0°Ô?Ø'×.Ñ.Ø! =×#5Ñ#5Ð7MÐNôð ×:Ñ:Ø4Ð6OÐOñç ™&Ð!7Õ8ñ)9ð#9ðN  -öØ°Ð;LÒ0L’ðˆMð ð  /öØ°#Ð=PÒ2P’ðˆOð ð × Ñ ×'Ñ'à 
Ð+Ø)6Ø+:Ø+:ñ.ðöñWS	ùò SùÚTùòtùòs0   Ã	K'ÃK'Ã	K,ÃK,Ê	K1Ê&K1Ê0	K6Ê:K6c           	      óØ   — | j                   j                  «       D ]M  \  \  }}}| j                  ||«      }|d   D ]+  }| j                  |t	        j
                  ||¬«      |¬«       Œ- ŒO y )Nr�  r  r  )rn   rP   Ú_get_dependencies_for_modelró   r
   r(  )r,   r›   r)   Úalt_indexesr½   r   s         r%   r”   z,MigrationAutodetector.generate_added_indexes†  s   € Ø48×4HÑ4H×4NÑ4NÓ4Pò 
	Ñ0Ñ#ˆY˜
 [Ø×;Ñ;¸IÀzÓRˆLØ$ _Ñ5ò �Ø×"Ñ"ØÜ×'Ñ'Ø#-Ø#ôð ".ð #õ ññ
	r$   c           	      óÄ   — | j                   j                  «       D ]C  \  \  }}}|d   D ]3  }| j                  |t        j                  ||j
                  ¬«      «       Œ5 ŒE y )NrŽ  r>  )rn   rP   ró   r
   ÚRemoveIndexrf   )r,   r›   r)   r©  r   s        r%   r‹   z.MigrationAutodetector.generate_removed_indexes“  sh   € Ø48×4HÑ4H×4NÑ4NÓ4Pò 	Ñ0Ñ#ˆY˜
 [Ø$Ð%6Ñ7ò �Ø×"Ñ"ØÜ×*Ñ*Ø#-Ø"ŸZ™Zôõññ	r$   c                 ó¼   — | j                   j                  «       D ]?  \  \  }}}|d   D ]/  \  }}}| j                  |t        j                  ||||¬«      «       Œ1 ŒA y )Nr�  )r)   r  r  Ú
old_fields)rn   rP   ró   r
   ÚRenameIndex)r,   r›   r)   r©  r�  rš  r­  s          r%   r�   z.MigrationAutodetector.generate_renamed_indexesž  su   € Ø48×4HÑ4H×4NÑ4NÓ4Pò 	Ñ0Ñ#ˆY˜
 [Ø>IØ!ñ?ò Ñ:� °
ð ×"Ñ"ØÜ×*Ñ*Ø#-Ø!/Ø!/Ø#-ô	õññ	r$   c                 óþ  — t         j                  j                  }t        | j                  «      D ]Á  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |   }|j                  |   }|D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	| j                  j                  ||f|
|dœi«       ŒÃ y c c}	w c c}	w )N)Úadded_constraintsÚremoved_constraints)r
   r)  r�  r`   rž   r¢   ry   r5   r	   r6   rx   ro   rÄ   )r,   r�  r›   r)   r©   rª   rS  Úold_constraintsÚnew_constraintsÚcÚadd_constraintsÚrem_constraintss               r%   r‰   z0MigrationAutodetector.create_altered_constraints­  s  € Ü ×.Ñ.×:Ñ:ˆÜ%+¨D×,@Ñ,@Ó%Aò 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOà-×5Ñ5°kÑBˆOØ-×5Ñ5°kÑBˆOØ*9ÖV Q¸QÀoÒ=UšqÐVˆOÐVØ*9ÖV Q¸QÀoÒ=UšqÐVˆOÐVà×$Ñ$×+Ñ+à 
Ð+Ø-<Ø/>ñ.ðõñ	ùò WùÚVs   Â,	C5Â6C5Ã 	C:Ã
C:c           	      óØ   — | j                   j                  «       D ]M  \  \  }}}| j                  ||«      }|d   D ]+  }| j                  |t	        j
                  ||¬«      |¬«       Œ- ŒO y )Nr°  r!  r  )ro   rP   r¨  ró   r
   r)  )r,   r›   r)   Úalt_constraintsr½   r"  s         r%   r•   z0MigrationAutodetector.generate_added_constraintsÄ  s‰   € ð #×6Ñ6×<Ñ<Ó>ò	ñ ñ 
ØØØØ×;Ñ;¸IÀzÓRˆLØ-Ð.AÑBò �
Ø×"Ñ"ØÜ×,Ñ,Ø#-Ø#-ôð ".ð #õ ññ	r$   c           	      óÄ   — | j                   j                  «       D ]C  \  \  }}}|d   D ]3  }| j                  |t        j                  ||j
                  ¬«      «       Œ5 ŒE y )Nr±  r>  )ro   rP   ró   r
   ÚRemoveConstraintrf   )r,   r›   r)   r¸  r"  s        r%   rŠ   z2MigrationAutodetector.generate_removed_constraintsÔ  sq   € ð #×6Ñ6×<Ñ<Ó>ò	ñ ñ 
ØØØØ-Ð.CÑDò �
Ø×"Ñ"ØÜ×/Ñ/Ø#-Ø'Ÿ_™_ôõññ		r$   c                 óŠ  ‡— d }t        ‰j                  d«      r‰j                  j                  }nW|j                  | |f   }|j	                  «       D ]3  \  \  }}}t        ˆfd„|j                  «       D «       «      sŒ,|› d|› �} n t        ‰dd «      }	|	�d}
|	}nt        || |«      \  }
}t        |
|d t        j                  j                  «      g}t        ‰j                  dd «      rYt        ‰j                  j                  | |«      \  }}|j                  t        ||d t        j                  j                  «      «       |S )Nr:   c              3   ó<   •K  — | ]  }‰|j                   k(  –— Œ y ­wr(   )ra   )rH   r:  rg   s     €r%   rJ   zJMigrationAutodetector._get_dependencies_for_foreign_key.<locals>.<genexpr>ê  s$   øè ø€ ò à%ð ˜]×7Ñ7Õ7ñùs   ƒr®   Úswappable_settingr­   r§   )rW   ra   r:   r  rP   rç   rÀ   r¨   r   r   r&   r   r§   rc   )r›   r)   rg   Úproject_stateÚremote_field_modelr  Úremote_app_labelÚremote_model_namerd   r½  Údep_app_labelÚdep_object_namer½   Úthrough_app_labelÚthrough_object_names     `            r%   r  z7MigrationAutodetector._get_dependencies_for_foreign_keyâ  si  ø€ à!ÐÜ�5×%Ñ% wÔ/Ø!&×!3Ñ!3×!9Ñ!9Ñà%×/Ñ/°	¸:Ð0EÑFˆIØAJÇÁÓARò Ñ=Ñ5Ð!Ð#4°vÜó à)/¯©«ôõ ð -=Ð+=¸QÐ?PÐ>QÐ)RÐ&Ùðô $ EÐ+>ÀÓEÐØÐ(Ø)ˆMØ/‰Oä-=Ø"ØØó.Ñ*ˆM˜?ô  Ø˜°Ô6I×6NÑ6N×6UÑ6Uóð
ˆô
 �5×%Ñ% y°$Ô7Ü5EØ×"Ñ"×*Ñ*ØØó6Ñ2ÐÐ2ð
 ×ÑÜ#Ø%Ø'ØÜ'×,Ñ,×3Ñ3ó	ôð Ðr$   c           	      óê  — g }t        j                  |j                  «      j                  }t	        | j
                  | j                  z
  «      }|D ]   \  }}}| j                  j                   ||f   j                  |«      }|j                  r|j                  j                  s|j                  |v sŒb|j                  t        |||j                  t        j                  j                  «      «       Œ¢ |S r(   )r	   ÚQÚ
expressionÚreferenced_base_fieldsr`   r¤   r£   r6   rO  ra   r:   rf   rc   r   r&   r   )	r,   rg   r½   rÉ  Únewly_added_fieldsr›   r)   Úadded_field_nameÚadded_fields	            r%   re  z;MigrationAutodetector._get_dependencies_for_generated_field  sà   € ØˆÜ!'§¡¨%×*:Ñ*:Ó!;×!RÑ!RÐÜ# D×$7Ñ$7¸$×:MÑ:MÑ$MÓNÐØ7Iò 	Ñ3ˆI�zÐ#3ØŸ-™-×.Ñ.¨y¸*Ð/DÑE×OÑOØ óˆKð ×(Ò(¨[×-EÑ-E×-KÒ-KØ×!Ñ!Ð%;Ò;Ø×#Ñ#Ü'Ø!Ø"Ø#×(Ñ(Ü+×0Ñ0×7Ñ7ó	õð	ð Ðr$   c           	      óò   — g }| j                   j                  ||f   }|j                  j                  «       D ]<  }|j                  sŒ|j                  | j                  |||| j                   «      «       Œ> |S )z3Return foreign key dependencies of the given model.)r6   r	   rd   rÀ   r	  r
  r  )r,   r›   r)   r½   rœ   rg   s         r%   r¨  z1MigrationAutodetector._get_dependencies_for_model%  s{   € àˆØ—m‘m×*Ñ*¨9°jÐ+@ÑAˆØ ×'Ñ'×.Ñ.Ó0ò 		ˆEØ× Ó Ø×#Ñ#Ø×:Ñ:Ø!Ø"ØØŸ™ó	õð		ð Ðr$   c              #   óþ  ‡ ‡‡K  — t        ‰ j                  «      D �]X  \  ŠŠ‰ j                  j                  ‰‰f‰«      }‰ j                  j
                  ‰|f   }‰ j                  j
                  ‰‰f   }|j                  j                  |«      }|r$|D �ch c]  }t        ˆˆˆ fd„|D «       «      ’Œ c}n	t        «       }|j                  j                  |«      }|rt        |«      n	t        «       }||k7  sŒÞg }|D ]k  }	|	D ]d  }
|j                  |
«      }|j                  sŒ!|j                  j                  sŒ8|j                  ‰ j                  ‰‰|‰ j                  «      «       Œf Œm ||‰‰|f–— �Œ[ y c c}w ­w)Nc              3   ó\   •K  — | ]#  }‰j                   j                  ‰‰|f|«      –— Œ% y ­wr(   )rp   ry   )rH   Únr›   r)   r,   s     €€€r%   rJ   zMMigrationAutodetector._get_altered_foo_together_operations.<locals>.<genexpr>A  s3   øè ø€ ò àð ×+Ñ+×/Ñ/°¸JÈÐ0JÈA×Nñùs   ƒ),)r`   rž   r¢   ry   r5   r	   r6   rx   rN   rq   rO  ra   r:   r
  r  )r,   r�  r©   rª   rS  rž  rt  rŸ  r½   Úfoo_togethersr0   rg   r›   r)   s   `           @@r%   r’  z:MigrationAutodetector._get_altered_foo_together_operations5  s•  úè ø€ Ü%+¨D×,@Ñ,@Ó%Aó ,	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOð (×/Ñ/×3Ñ3°KÓ@ˆIñ ð #,öð
 ô	 õ à!'ôõ óô “Uð ð (×/Ñ/×3Ñ3°KÓ@ˆIÙ*3œ˜Iœ¼»ˆIà˜IÓ%Ø!�Ø%.ò �MØ&3ò 
˜
Ø /× 9Ñ 9¸*Ó E˜Ø ×-Ó-°%×2DÑ2D×2JÓ2JØ(×/Ñ/Ø $× FÑ FØ$-Ø$.Ø$)Ø$(§M¡Mó	!"õñ
ðð ØØØØ ðô ñM,	ùòùs&   …BE=ÂE8Â4AE=Ã9)E=Ä#E=Ä:AE=c           
      ó@  — | j                  |j                  «      D ]{  \  }}}}}|t        j                  k(  r"|D �ch c]  }|| j                  ||f   vr|’Œ }}|j                  |«      }|s|sŒT| j                  | |dd|i|j                  |i¤Ž|¬«       Œ} y c c}w ©Nrf   r  r#   )r’  r�  r
   rï   r‘  r'  ró   )	r,   rË   rž  rŸ  r›   r)   r½   rI   Úremoval_values	            r%   Ú&_generate_removed_altered_foo_togetherz<MigrationAutodetector._generate_removed_altered_foo_togetherd  sÙ   € ð ×6Ñ6°y×7LÑ7LÓMò	ñ 
ØØØØØàœJ×9Ñ9Ò9ð "+öàØØ×=Ñ=¸iÈÐ>SÑTñUò ð�	ð ð &×2Ñ2°9Ó=ˆMÙ¢	Ø×"Ñ"ØÙñ Ø'ðØ,5×,AÑ,AÀ=Ð+Qñð ".ð #õ ñ!	ùòs   ¼Bc                 óB   — | j                  t        j                  «       y r(   )rÕ  r
   rî   r+   s    r%   rŽ   z>MigrationAutodetector.generate_removed_altered_unique_together}  s   € Ø×3Ñ3´J×4RÑ4RÕSr$   c           
      óÎ   — | j                  |j                  «      D ]G  \  }}}}}|j                  |«      }||k7  sŒ | j                  | |dd|i|j                  |i¤Ž|¬«       ŒI y rÓ  )r’  r�  r'  ró   )r,   rË   rž  rŸ  r›   r)   r½   rÔ  s           r%   Ú_generate_altered_foo_togetherz4MigrationAutodetector._generate_altered_foo_together€  s‚   € ð ×6Ñ6°y×7LÑ7LÓMò	ñ 
ØØØØØà%×2Ñ2°9Ó=ˆMØ˜MÓ)Ø×"Ñ"ØÙÑT :ÐT°)×2GÑ2GÈÐ1SÑTØ!-ð #õ ñ	r$   c                 óB   — | j                  t        j                  «       y r(   )rØ  r
   rî   r+   s    r%   r“   z6MigrationAutodetector.generate_altered_unique_together�  s   € Ø×+Ñ+¬J×,JÑ,JÕKr$   c                 óø  — | j                   j                  | j                  | j                  «      }t	        |«      D ]¼  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  j                  d«      }|j                  j                  d«      }||k7  sŒ–| j                  |t        j                  ||¬«      «       Œ¾ y )NÚdb_table)rf   Útable)rž   ÚunionrŸ   r    r`   r¢   ry   r5   r	   r6   rx   ró   r
   ÚAlterModelTable)	r,   Úmodels_to_checkr›   r)   r©   rª   rS  Úold_db_table_nameÚnew_db_table_names	            r%   r–   z/MigrationAutodetector.generate_altered_db_table“  sô   € Ø×.Ñ.×4Ñ4Ø× Ñ  $×":Ñ":ó
ˆô &,¨OÓ%<ò 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOØ /× 7Ñ 7× ;Ñ ;¸JÓ GÐØ /× 7Ñ 7× ;Ñ ;¸JÓ GÐØ Ð$5Ó5Ø×"Ñ"ØÜ×.Ñ.Ø'Ø/ôõñ	r$   c                 óø  — | j                   j                  | j                  | j                  «      }t	        |«      D ]¼  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  j                  d«      }|j                  j                  d«      }||k7  sŒ–| j                  |t        j                  ||¬«      «       Œ¾ y )NÚdb_table_comment)rf   Útable_comment)rž   rÝ  rŸ   r    r`   r¢   ry   r5   r	   r6   rx   ró   r
   ÚAlterModelTableComment)	r,   rß  r›   r)   r©   rª   rS  Úold_db_table_commentÚnew_db_table_comments	            r%   r†   z7MigrationAutodetector.generate_altered_db_table_comment¨  sö   € Ø×.Ñ.×4Ñ4Ø× Ñ  $×":Ñ":ó
ˆô &,¨OÓ%<ò 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOà#2×#:Ñ#:×#>Ñ#>Ð?QÓ#RÐ Ø#2×#:Ñ#:×#>Ñ#>Ð?QÓ#RÐ Ø#Ð';Ó;Ø×"Ñ"ØÜ×5Ñ5Ø'Ø&:ôõñ	r$   c                 ó  — | j                   j                  | j                  | j                  | j                  | j
                  z  | j                  | j                  z  «      }t        |«      D �]  \  }}| j                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  j                  «       D ��ci c]  \  }}|t         j"                  v r||“Œ }	}}|j                  j                  «       D ��ci c]  \  }}|t         j"                  v r||“Œ }
}}|	|
k7  sŒß| j%                  |t'        j                   ||
¬«      «       �Œ yc c}}w c c}}w )zÄ
        Work out if any non-schema-affecting options have changed and make an
        operation to represent them in state changes (in case Python code in
        migrations needs them).
        )rf   rx   N)rž   rÝ  rŸ   r    rt   ru   rr   rw   r`   r¢   ry   r5   r	   r6   rx   rP   r   ÚALTER_OPTION_KEYSró   r
   )r,   rß  r›   r)   r©   rª   rS  rZ   rI   Úold_optionsÚnew_optionss              r%   r„   z.MigrationAutodetector.generate_altered_options¾  s†  € ð ×.Ñ.×4Ñ4Ø× Ñ Ø×$Ñ$à×#Ñ# d×&9Ñ&9Ñ9à×Ñ $×"9Ñ"9Ñ9ó
ˆô &,¨OÓ%<ó 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOð #2×"9Ñ"9×"?Ñ"?Ó"A÷á�C˜ØÔ+×=Ñ=Ñ=ð �U‘
ðˆKñ ð #2×"9Ñ"9×"?Ñ"?Ó"A÷á�C˜ØÔ+×=Ñ=Ñ=ð �U‘
ðˆKñ ð
 ˜kÓ)Ø×"Ñ"ØÜ×0Ñ0Ø'Ø +ôöñ#	ùóùó
s   Ã$E6Ä#E<c           
      óœ  — t        | j                  «      D �]3  \  }}| j                  j                  ||f|«      }| j                  j
                  ||f   }| j                  j
                  ||f   }|j                  j                  d«      |j                  j                  d«      k7  sŒ“g }|j                  j                  d«      rB|j                  t        |||j                  d   t        j                  j                  «      «       | j                  |t        j                  ||j                  j                  d«      ¬«      |¬«       �Œ6 y )Nrí   r  r  )r`   rž   r¢   ry   r5   r	   r6   rx   rc   r   r&   r   ró   r
   rì   )r,   r›   r)   r©   rª   rS  r½   s          r%   r’   z<MigrationAutodetector.generate_altered_order_with_respect_toæ  sB  € Ü%+¨D×,@Ñ,@Ó%Aó 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOØ×&Ñ&×*Ñ*Ø'óà ×(Ñ(×,Ñ,Ð-DÓEóFð
  "�Ø"×*Ñ*×.Ñ.Ð/FÔGØ ×'Ñ'Ü+Ø%Ø&Ø+×3Ñ3Ð4KÑLÜ/×4Ñ4×;Ñ;ó	ôð ×"Ñ"ØÜ×6Ñ6Ø'Ø.=×.EÑ.E×.IÑ.IØ3ó/ôð ".ð #ö 	ñ-	r$   c                 ó|  — t        | j                  «      D ]¤  \  }}| j                  j                  ||f|«      }| j                  j
                  ||f   }| j                  j
                  ||f   }|j                  |j                  k7  sŒt| j                  |t        j                  ||j                  ¬«      «       Œ¦ y )N)rf   r  )r`   rž   r¢   ry   r5   r	   r6   r  ró   r
   ÚAlterModelManagers)r,   r›   r)   r©   rª   rS  s         r%   r…   z/MigrationAutodetector.generate_altered_managers  s´   € Ü%+¨D×,@Ñ,@Ó%Aò 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOØ×'Ñ'¨?×+CÑ+CÓCØ×"Ñ"ØÜ×1Ñ1Ø'Ø!0×!9Ñ!9ôõñ	r$   c           	      ój  — |j                  «       }i }t        |j                  «       «      D �]3  \  }}|sŒ
d}|D ]  }	|	d   |k(  sŒ|	} n |€9| j                  j	                  |«      s|D ]  }
|df|||
j
                  f<   Œ ||= ŒZ|€d}n| j                  |d   «      xs ddz   }t        |«      D ]¬  \  }}
|dk(  r|r|
j                  j                  |«       d|z  g}|r|j                  |«       n;|dk(  r|s|j                  d«       n"|j                  |
j                  «       dd «       dj                  |«      }||f|||
j
                  f<   |dz  }||
_        Œ® �Œ6 |j                  «       D ]8  }|D ]1  }
|
j                  D �cg c]  }|j                  ||«      ‘Œ c}|
_        Œ3 Œ: |S c c}w )	zÁ
        Take a result from changes() and a MigrationGraph, and fix the names
        and dependencies of the changes so they extend the graph from the leaf
        nodes for each app.
        Nr   r¼   r   z%04irÅ   éd   r¥  )rÃ   rM   rP   r7   Úask_initialrf   Úparse_numberÚ	enumerater½   rc   Úsuggest_nameÚjoinrÀ   ry   )r,   rD   r@   rC   ÚleavesÚname_mapr›   rš   Úapp_leafÚleafrà   Únext_numberÚiÚnew_name_partsr  r5  s                   r%   r>   z'MigrationAutodetector.arrange_for_graph  sö  € ð ×!Ñ!Ó#ˆØˆÜ%)¨'¯-©-«/Ó%:ó #	*Ñ!ˆI�zÙØàˆHØò �Ø˜‘7˜iÓ'Ø#�HÙðð
 Ð¨¯©×(CÑ(CÀIÔ(Nà!+ò U�IØ=FÈÐ<T�H˜i¨¯©Ð8Ò9ðUà˜IÐ&ØàÐØ‘à#×0Ñ0°¸!±Ó=ÒBÀÀaÑG�ä )¨*Ó 5ò *‘��9Ø˜’6™hØ×*Ñ*×1Ñ1°(Ô;Ø"(¨;Ñ"6Ð!7�Ù!Ø"×)Ñ)¨.Õ9Ø˜!’V¡HØ"×)Ñ)¨)Õ4à"×)Ñ)¨)×*@Ñ*@Ó*BÀ4ÀCÐ*HÔIØŸ8™8 NÓ3�Ø9BÀHÐ8M�˜) Y§^¡^Ð4Ñ5Ø˜qÑ �Ø!)�	•ò*ð-#	*ðJ "Ÿ.™.Ó*ò 	ˆJØ'ò �	à09×0FÑ0Fö*Ø+,�H—L‘L  AÕ&ò*�	Õ&ñð	ð
 ˆùò*s   Æ	F0c           	      óœ  — i }|j                  «       D ]I  \  }}|D ]?  }|j                  D ].  \  }}|j                  |t        «       «      j	                  |«       Œ0 ŒA ŒK t        |«      }	d}
|
|	k7  r>t        |	«      }
 |	j
                  |	D �cg c]  }|j                  |d«      ‘Œ c}Ž  |
|	k7  rŒ>t        |«      D ]
  }||	vsŒ||= Œ |S c c}w )a1  
        Take changes from arrange_for_graph() and set of app labels, and return
        a modified set of changes which trims out as many migrations that are
        not in app_labels as possible. Note that some other migrations may
        still be present as they may be required dependencies.
        Nr#   )rP   r½   rÆ   rq   rz   rÄ   ry   rM   )r,   rD   Ú
app_labelsÚapp_dependenciesr›   rš   rà   rÂ  rf   Úrequired_appsÚold_required_appss              r%   r?   z#MigrationAutodetector._trim_to_appsL  sü   € ð ÐØ%,§]¡]£_ò 	UÑ!ˆI�zØ'ò U�	Ø+4×+AÑ+Aò UÑ'�M 4Ø$×/Ñ/°	¼3»5ÓA×EÑEÀmÕTñUñUð	Uô ˜J›ˆà ÐØ =Ò0Ü # MÓ 2ÐØ ˆM× Ñ ØGTÖU¸)Ð"×&Ñ& y°"Õ5ÒUñð   =Ó0ô ˜g›ò 	'ˆIØ Ò-Ø˜IÑ&ð	'ð ˆùò Vs   ÂC	c                 óœ   — t        j                  d|«      x}rt        |d   «      S t        j                  d|«      }|rt        |d   «      S y)uã   
        Given a migration name, try to extract a number from the beginning of
        it. For a squashed migration such as '0001_squashed_0004â€¦', return the
        second number. If no number is found, return None.
        z.*_squashed_(\d+)r   z^\d+r   N)ÚreÚsearchÚintÚmatch)Úclsrf   Úsquashed_matchr  s       r%   rò  z"MigrationAutodetector.parse_numberg  sO   € ô  ŸY™YÐ';¸TÓBÐBˆ>ÐBÜ�~ aÑ(Ó)Ð)Ü—‘˜ $Ó'ˆÙÜ�u˜Q‘x“=Ð Ør$   r(   )NNN)NN)NF)7r   r   r   Ú__doc__r;   rD   rG   ri   r=   r~   r   Ústaticmethodr³   r˜   r—   r™   rÂ   ró   r  r}   r�   rƒ   r€   r‚   r‡   rŒ   r�   r`  r�   ry  r‘   rˆ   r”   r‹   r�   r‰   r•   rŠ   r  re  r¨  r’  rÕ  rŽ   rØ  r“   r–   r†   r„   r’   r…   r>   r?   Úclassmethodrò  r#   r$   r%   r3   r3   *   sM  „ ñ
óGó
ò$òLógòR
ò.ð( ñ
ó ð
ó(v"òpKò$ò$RKóhRòò.B"òH[òz(òT]ò~ò<"ò|#IòJJò8
òtLò
ò4yRòvWòrò	òòò.ò ð ñ+ó ð+òZò*ò -ò^ò2Tòò Lòò*ò,&òP òDó 2òhð6 ñó ñr$   r3   )!rQ   r  Úcollectionsr   r   Úenumr   Úgraphlibr   Ú	itertoolsr   Údjango.confr   Ú	django.dbr	   Údjango.db.migrationsr
   Údjango.db.migrations.migrationr   Ú&django.db.migrations.operations.modelsr   Údjango.db.migrations.optimizerr   Údjango.db.migrations.questionerr   Údjango.db.migrations.utilsr   r   r   Údjango.utils.functionalr   r   r3   r#   r$   r%   ú<module>r     s]   ðÛ Û 	ß /Ý Ý &Ý å  Ý Ý +Ý 4Ý DÝ =Ý ?÷ñ õ
 4ô'ÙÐ$Ð&LÓMô'÷&Iò Ir$   