Ë
    ¦#ij_ ã                   óô   — 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dZy)úOperationDependency.Typer   é   é   é   é   é   N)	Ú__name__Ú
__module__Ú__qualname__ÚCREATEÚREMOVEÚALTERÚREMOVE_ORDER_WRTÚALTER_FOO_TOGETHERÚREMOVE_INDEX_OR_CONSTRAINT© ó    ú[/var/www/html/office/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&   r0   r&   N)r   r   r   r   r(   r   r/   r3   r%   r&   r'   r   r      s6   „ ô'ˆtô 'ð ñ'ó ð'ð ñ'ó ñ'r&   r   z$app_label model_name field_name typec                   ór  — e Zd ZdZd7d„Zd8d„Zd„ Zd„ Zd9d„Zd„ Z	d	„ Z
ed
„ «       Zd7d„Zd„ Zd„ Zd„ Zd: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$d#„ Z%d$„ Z&d%„ Z'ed&„ «       Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d1„ Z3d2„ Z4d3„ Z5d7d4„Z6d5„ Z7e8d6„ «       Z9y);Ú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.   r7   r8   r9   ÚappÚmodels         r'   Ú__init__zMigrationAutodetector.__init__8   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'   rF   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>S   s   øè ø€ ÒG¸%˜×.Ñ.¨u×5ÑGùs   ƒÚdeconstructr   N)Ú
isinstanceÚlistrI   ÚtupleÚdictÚitemsÚ	functoolsÚpartialÚfuncÚargsÚkeywordsr   r   ÚtypeÚhasattrrM   r	   ÚField)r.   ÚobjrK   ÚkeyÚdeconstructedÚpathrV   Úkwargss   `       r'   rI   z&MigrationAutodetector.deep_deconstructJ   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)ÚsortedrR   rI   Úremote_fieldr<   ÚpopÚappend)r.   ÚfieldsÚ
fields_defÚnameÚfieldÚdeconstructions         r'   Úonly_relation_agnostic_fieldsz3MigrationAutodetector.only_relation_agnostic_fieldsq   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                  |«       | jc                  «        | jd                  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)3Ú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_keysr7   r	   rR   ÚoptionsÚgetÚaddÚ	real_appsr8   Ú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_constraintsÚgenerate_altered_db_tableÚ_sort_migrationsÚ_build_migration_listÚ_optimize_migrationsÚ
migrations)r.   rD   rB   Ú	app_labelr+   Úmodel_states         r'   r?   z%MigrationAutodetector._detect_changes   sx  € ð& %'ˆÔ!Ø!ˆÔØ#%ˆÔ Ø ˆÔô "›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)rt   rw   Úkept_model_keysru   rx   Úkept_proxy_keysrv   ry   Úkept_unmanaged_keysÚthrough_usersr7   r	   Úrenamed_modelsr{   rf   Úold_field_keysr8   Únew_field_keys©r.   rž   r+   r2   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.rc   ÚthroughN)rb   rt   r¥   r{   r7   r	   rf   rR   rY   Úgetattrrc   r   rª   r¤   )r.   rž   r+   Úold_model_nameÚold_model_stater2   ri   Ú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,   r2   rX   )Ú
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©rJ   Úxs     r'   rL   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>5  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'   rL   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>–  s   è ø€ ÒQ¨œc !ŸfÑQùr½   z)Cannot resolve operation dependencies: %rN)r�   Úsumro   Úvaluesrb   rs   rO   Ú
_auto_depsr¶   rž   r{   Úcheck_dependencyr|   r+   rh   Ú
leaf_nodesre   ÚupdaterX   r   rº   rÀ   r
   r:   ÚinitialÚ
setdefaultÚ
ValueError)r.   rB   Ú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Å   )rJ   r¼   rÑ   r.   s     €€r'   rL   z9MigrationAutodetector._sort_migrations.<locals>.<genexpr>°  s    øè ø€ Ò Q q°4×3HÑ3HÈÈCÕ3P¤Ñ Qùs   ƒ"›"N)
rb   ro   rR   r   r|   rÄ   r¶   rž   rO   Ú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�   rR   ÚziprÀ   re   rh   rÃ   rO   rs   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 ‰j                   �l‰j                  t        j                  j4                  k(  rEt        |t        j6                  t        j8                  f«      xr |j                  ‰j                  k(  S t;        d‰›�«      ‚)zn
        Return True if the given operation depends on the given dependency,
        False otherwise.
        c              3   óB   •K  — | ]  \  }}‰j                   |k(  –— Œ y ­wr*   )r2   )rJ   r¼   Úyr³   s      €r'   rL   z9MigrationAutodetector.check_dependency.<locals>.<genexpr>Û  s    øè ø€ ÒP±t°q¸!˜
×-Ñ-°Õ2ÑPùs   ƒÚ zCan't handle dependency )r2   rX   r   r(   r   rN   r
   ÚCreateModelÚ
name_lowerr/   Úanyrf   ÚAddFieldr3   r    ÚRemoveFieldÚDeleteModelr!   Ú
AlterFieldr"   ÚAlterOrderWithRespectToÚorder_with_respect_tor,   r#   ÚAlterUniqueTogetherÚAlterIndexTogetherr$   ÚRemoveIndexÚRemoveConstraintrÊ   )r.   rÎ   r³   s     `r'   rÅ   z&MigrationAutodetector.check_dependencyÅ  s·  ø€ ð ×!Ñ!Ð)Ø—‘Ô#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ðð ×!Ñ!Ð-Ø—‘Ô#6×#;Ñ#;×#VÑ#VÒVô ØÜ×+Ñ+¬Z×-HÑ-HÐIóò Nð ×.Ñ.°*×2MÑ2MÑMðõ ¹ZÐIÓJÐJr&   c                 óÎ   — |xs g |_         |r-| j                  j                  |g «      j                  d|«       y | j                  j                  |g «      j	                  |«       y )Nr   )rÄ   ro   rÉ   Úinsertre   )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Ú___)r8   r	   ÚbasesrN   Ústrr   rz   r{   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_relrw   rt   rb   r8   r	   rk   rf   r7   r9   Úask_rename_modelrO   rÃ   Ú	relationsrc   Úis_relationÚextendÚ!_get_dependencies_for_foreign_keyrø   r
   ÚRenameModelrh   rž   ré   Úremover|   )r.   Úadded_modelsrž   r+   rŸ   Úmodel_fields_defÚremoved_modelsÚrem_app_labelÚrem_model_nameÚrem_model_stateÚrem_model_fields_defrÀ   r  ri   rf   Úrenamed_models_rel_keys                   r'   r   z-MigrationAutodetector.generate_renamed_modelsE  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)r\   ÚreverseNrª   ÚindexesÚconstraintsÚunique_togetherrð   r±   r   r   ©rh   rf   rz   rþ   Úmanagers)rÀ   r÷   rm   ©r+   rh   ri   r
  ©rh   rð   ©r+   Úindex©r+   Ú
constraint©rh   r  )1rt   rv   rw   ry   r   rb   r  r8   r	   rf   rR   rc   r<   Úprimary_keyÚparent_linkr«   rz   rd   r   r(   r    rþ   rN   rÿ   r²   re   r   r7   r{   rs   Ú
differenceÚintersectionr   rø   r
   rè   rh   r!  r  rë   rO   rï   ÚAddIndexÚAddConstraintrñ   r  ru   rž   rî   )"r.   Úold_keysr  Úadded_unmanaged_modelsÚall_added_modelsrž   r+   rŸ   Úrelated_fieldsÚprimary_key_relr2   ri   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Údrh   Úrelated_dependenciesr%  r'  r  Úrelated_model_keyÚrelated_model_stateÚrelated_field_nameÚrelated_fields"                                     r'   rƒ   z-MigrationAutodetector.generate_created_models‰  s  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×*Ñ*¨XÑ5ˆØ!%×!8Ñ!8¸8Ñ!CÐÜ Ü�< T×%=Ñ%=ÀtÔLÜÐ)¨t×/GÑ/GÐQUÔVó
Ðð &6ó K	Ñ!ˆ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ó	!"ð*ð +õ ñò	ñoK	ùò^ùò|$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.
        rn   Nr±   r   r   r
  )rx   ru   rb   r8   r	   rz   r{   r   r(   r    rþ   rN   rÿ   r²   re   r   rø   r
   rè   rh   r!  )	r.   Úaddedrž   r+   rŸ   rÀ   r  r4  r5  s	            r'   r…   z.MigrationAutodetector.generate_created_proxiesg  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¬«      «       |j                  j                  dd«      x}r8|D ]3  }| j                  |t!        j$                  ||j&                  ¬«      «       Œ5 |j                  j                  dd«      x}r8|D ]3  }| j                  |t!        j(                  ||j&                  ¬«      «       Œ5 t        |«      D ]P  }| j                  |t!        j*                  ||¬«      t-        |||t,        j.                  j0                  «      g¬«       ŒR g }| j                  j2                  }|||f   j                  «       D ]—  \  \  }}}|j                  «       D ]|  \  }	}
|j5                  t-        |||	t,        j.                  j6                  «      «       |
j8                  rŒH|j5                  t-        |||	t,        j.                  j:                  «      «       Œ~ Œ™ t        |«      D ]7  }|j5                  t-        |||t,        j.                  j6                  «      «       Œ9 | j<                  j?                  ||j@                  f«      }|r4|j5                  t-        g |¢t,        j.                  j6                  ‘­Ž «       | j                  |t!        jB                  |j&                  ¬	«      tE        tG        |«      «      ¬«       �Œ‰ 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  ©r+   rh   r  r
  ©rh   )$rw   ry   rt   rv   r   rb   r7   r	   rf   rR   rc   r<   r«   rz   rd   rø   r
   rñ   ró   rh   rô   rì   r   r(   r$   r  re   r    Úmany_to_manyr!   r¤   r{   ré   rí   rO   rs   )r.   Únew_keysÚdeleted_modelsÚdeleted_unmanaged_modelsÚall_deleted_modelsrž   r+   rŸ   r2  r2   ri   r  r  r%  r  r'  rh   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ó g	Ñ!ˆ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Ø'Ø(,ôôð &×-Ñ-×1Ñ1°)¸TÓBÐBˆwÐBØ$ò �EØ×&Ñ&Ø!Ü"×.Ñ.Ø'1Ø!&§¡ôõðð *×1Ñ1×5Ñ5°mÀTÓJÐJˆ{ÐJØ"-ò �JØ×&Ñ&Ø!Ü"×3Ñ3Ø'1Ø!+§¡ôõðô ˜~Ó.ò �Ø×"Ñ"ØÜ×*Ñ*Ø#-Ø!ôô
 ,Ø%Ø&Ø Ü/×4Ñ4×OÑOó	ð"ð #õ ðð( ˆ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ð ö ñCg	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.rn   rD  N)ru   rx   rb   r7   r	   rz   r{   rø   r
   rí   rh   )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.ra   r   r   r   )Ú	db_columnN)Úrenamed_operationsr¦   Úcopyrb   r§   r¥   r{   r7   r	   r8   Ú	get_fieldrI   rc   r<   r  Úset_attributes_from_nameÚget_attname_columnrQ   r9   Ú
ask_renamere   rQ  r  r|   rr   )r.   r¦   rž   r+   r2   r¬   r­   Únew_model_stateri   Ú	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)rR  rQ  Úclonerh   rø   r
   rî   ÚRenameFieldr¦   r  r|   )
r.   r  r  Úrem_db_columnrZ  rž   r+   ri   r2   Úaltered_fields
             r'   rŽ   z-MigrationAutodetector.generate_renamed_fieldsV  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)rb   r§   r¦   Ú_generate_added_fieldr¨   s       r'   r’   z+MigrationAutodetector.generate_added_fields{  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}t        j                  t        j                   t        j"                  f}|j$                  xsv |j'                  «       xsd |j)                  «       xsR |j*                  xsD |j,                  xr |j.                  xs( t1        ||«      xr |j2                  xs t1        ||«      }|sk|j5                  «       }t1        ||«      r.|j6                  r"| j8                  j;                  ||«      |_        n!| j8                  j?                  ||«      |_        |j@                  rA|j'                  «       r1tC        |j<                  «      r| j8                  jE                  ||«       | jG                  |tI        jJ                  ||||¬«      |¬«       y )N©r+   rh   ri   Úpreserve_defaultr
  )&r8   r	   rT  r   r(   r    rc   r<   r  r  Ú	generatedÚ%_get_dependencies_for_generated_fieldÚ	DateFieldÚDateTimeFieldÚ	TimeFieldÚ	AutoFieldÚSmallAutoFieldÚBigAutoFieldÚnullÚhas_defaultÚhas_db_defaultrE  ÚblankÚempty_strings_allowedrN   Úauto_nowr`  Úauto_now_addr9   Úask_auto_now_add_additionÚdefaultÚask_not_null_additionÚuniqueÚcallableÚ$ask_unique_callable_default_additionrø   r
   rë   )	r.   rž   r+   r2   ri   rÀ   Útime_fieldsÚauto_fieldsrh  s	            r'   re  z+MigrationAutodetector._generate_added_field‚  s6  € Ø—‘×$Ñ$ 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ˆÜ×'Ñ'¬×)>Ñ)>Ä×@SÑ@SÐTˆà�J‰Jò 0Ø× Ñ Ó"ò0à×#Ñ#Ó%ò0ð ×!Ñ!ò0ð —‘Ò; × ;Ñ ;ò	0ô
 ˜5 +Ó.ÒA°5·>±>ò0ô ˜5 +Ó.ð 	ñ  Ø—K‘K“MˆEÜ˜% Ô-°%×2DÒ2DØ $§¡× IÑ IØ 
ó!�•ð !%§¡× EÑ EØ 
ó!�”ð �<Š<˜E×-Ñ-Ô/´H¸U¿]¹]Ô4KØ�O‰O×@Ñ@ÀÈZÔXØ×ÑØÜ×ÑØ%ØØØ!1ô	ð &ð 	õ 		
r&   c                 ó€   — t        | j                  | j                  z
  «      D ]  \  }}}| j                  |||«       Œ y)zMake RemoveField operations.N)rb   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                 óZ  — | j                  |t        j                  ||¬«      t        |||t        j                  j
                  «      t        |||t        j                  j                  «      t        |||t        j                  j                  «      g| j                  |||«      ¢¬«       y )NrC  r
  )	rø   r
   rì   r   r(   r"   r#   r$   Ú3_get_generated_field_dependencies_for_removed_fieldr¨   s       r'   r�  z-MigrationAutodetector._generate_removed_fieldÁ  s³   € Ø×ÑØÜ×"Ñ"Ø%Øôô $ØØØÜ'×,Ñ,×=Ñ=ó	ô $ØØØÜ'×,Ñ,×?Ñ?ó	ô $ØØØÜ'×,Ñ,×GÑGó	ðð& ×IÑIØ˜z¨:óð'ð 	õ  	
r&   c           
      óü  — t        | j                  | j                  z  «      D �]L  \  }}}| 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_g |	¢|
‘­}|| j
                  v rJ|j                  j                  |j                  _        |j                  j                  |j                  _        t        |dd«      }|rÁ||f}t!        |D �cg c]#  }| j
                  j	                  g |¢|‘­|«      ‘Œ% c}«      |_        t!        |j$                  D �cg c]#  }| j
                  j	                  g |	¢|‘­|«      ‘Œ% 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�Œ0|j.                  xr |j.                  }|j.                   xr |j.                   }|s|r½d}|j0                  r€|j0                  st|j3                  «       sd|j5                  «       sT|j.                  sH|j7                  «       }| j8                  j;                  ||«      }|t        j<                  ur||_        d}n|}| jA                  |tC        jD                  ||||¬	«      |¬
«       �Œ'| jG                  |||«       | jI                  |||«       �ŒO yc c}w c c}w )zp
        Make AlterField operations, or possibly RemovedField/AddField if alter
        isn't possible.
        rc   r<   Nr2   Úfrom_fieldsrª   TFrg  r
  )%rb   r¦   r§   r¥   r{   rr   r7   r	   rT  r8   rY   r«   rc   r   r<   r2   rP   r…  Ú	to_fieldsr  r  rª   rI   rE  rq  rr  rs  r`  r9   Úask_not_null_alterationÚNOT_PROVIDEDry  rø   r
   rî   r�  re  )r.   rž   r+   r2   r¬   Úold_field_namer[  Ú	new_fieldrÀ   Ú
rename_keyÚremote_field_nameÚto_field_rename_keyr…  Úfrom_rename_keyÚ
from_fieldÚto_fieldÚold_from_fieldsr\  Únew_field_decÚboth_m2mÚneither_m2mrh  ri   Únew_defaults                           r'   r“   z-MigrationAutodetector.generate_altered_fieldsä  sv  € ô
 28Ø×Ñ $×"5Ñ"5Ñ5ó2
ó u	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Ð!Ù$Ø*J¨JÐ*JÐ8IÑ*JÐ'Ø*¨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Ð4K°jÐ4KÀ(Ñ4KÈXÕVòó+�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Ø )× 8Ñ 8Ô :Ø )× 6Ò 6à )§¡Ó 1˜Ø&*§o¡o×&MÑ&MØ&¨
ó'˜ð '¬f×.AÑ.AÑAØ,7˜EœMØ/4Ñ,à )˜Ø×&Ñ&Ø!Ü"×-Ñ-Ø'1Ø!+Ø"'Ø-=ô	ð &2ð 'ö 	ð ×0Ñ0°¸JÈ
ÔSØ×.Ñ.¨y¸*ÀjÖQñku	RùòZùòs   Ç(Q4
È(Q9
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   rh   rf   r   r   )Úadded_indexesÚremoved_indexesÚrenamed_indexes)r
   r-  Úoption_namer   rO   Úrenamed_index_together_valuesrb   r¡   r¥   r{   r7   r	   r8   rz   rM   rd   re   Ú$_get_altered_foo_together_operationsrò   r+  rf   rs   rº   rh   rp   rÇ   )!r.   rš  rž   r+   r¬   r­   rX  Ú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Ú_rV   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
  )rp   rR   Ú_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˜  rC  )rp   rR   rø   r
   ró   rh   )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)rp   rR   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           	      óê  — |j                  «       \  }}}|j                  «       \  }}}|j                  D ]  }	|j                  |	d «       Œ |j                  D ]  }	|j                  |	d «       Œ | j                  D ]]  \  }
}
}}}
}
}}|j                  sŒ||j                  k(  sŒ)|d   }	 |j                  |«      }t        |d | |fz   ||dz   d  z   «      |d<   Œ_ |||f|||fk7  S # t        $ r Y Œvw xY w)Nrf   r   )rM   Únon_db_attrsrd   rR  rQ  r%  rÊ   rP   )r.   Úold_constraintÚnew_constraintÚold_pathÚold_argsÚ
old_kwargsÚnew_pathÚnew_argsÚ
new_kwargsÚattrr¯  rb  rZ  ri   r2   Ú
new_fieldsÚnew_field_idxs                    r'   Ú+_constraint_should_be_dropped_and_recreatedzAMigrationAutodetector._constraint_should_be_dropped_and_recreatedà  sA  € ð *8×)CÑ)CÓ)EÑ&ˆ�(˜JØ)7×)CÑ)CÓ)EÑ&ˆ�(˜Jà"×/Ñ/ò 	'ˆDØ�N‰N˜4 Õ&ð	'à"×/Ñ/ò 	'ˆDØ�N‰N˜4 Õ&ð	'ð ×$Ñ$ò	ñ 	
ØØØØØØØØà�‹ =°E·O±OÓ#CØ'¨Ñ1�
ðØ$.×$4Ñ$4°ZÓ$@�Mô (-Ø˜~ Ð.Ø%Ð'ñ(à  °Ñ!2Ð!4Ð5ñ6ó(�
˜8Ò$ð!	ð, ˜( JÐ/°H¸hÈ
Ð3SÑSÐSøô "ò Ùðús   Â*C&Ã&	C2Ã1C2c                 óZ  — t         j                  j                  }t        | j                  «      D �]n  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |   }|j                  |   }g }	g }
|D ]ˆ  }|D ]�  }|j                  «       }|j                  «       }||k7  sŒ)|j                  |j                  k(  sŒC| j                  ||«      rŒV|	j                  |«       |
j                  |j                  «       Œƒ ŒŠ |D �cg c]  }||vr|j                  |
vr|‘Œ }}|D �cg c]  }||vr|j                  |
vr|‘Œ }}| j                  j!                  ||f|||	dœi«       �Œq y c c}w c c}w )N)Úadded_constraintsÚremoved_constraintsrq   )r
   r.  rš  rb   r¡   r¥   r{   r7   r	   r8   rz   rM   rh   rÅ  re   rq   rÇ   )r.   rš  rž   r+   r¬   r­   rX  Úold_constraintsÚnew_constraintsÚalt_constraintsÚalt_constraints_nameÚold_cÚnew_cÚ	old_c_decÚ	new_c_decÚ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à ˆOØ#%Ð à(ò @�Ø,ò @�EØ %× 1Ñ 1Ó 3�IØ %× 1Ñ 1Ó 3�Ià! YÓ.Ø!ŸJ™J¨%¯*©*Ó4Ø $× PÑ PØ! 5õ!ð (×.Ñ.¨uÔ5Ø,×3Ñ3°E·J±JÕ?ñ@ð@ð  )öàØ˜OÑ+°·±Ð>RÑ0Rò ðˆOð ð )öàØ˜OÑ+°·±Ð>RÑ0Rò ðˆOð ð ×$Ñ$×+Ñ+à 
Ð+Ø-<Ø/>Ø/>ñ.ðöñM.	ùò6ùò
s   Ä>F#ÅF(c           	      óØ   — | j                   j                  «       D ]M  \  \  }}}| j                  ||«      }|d   D ]+  }| j                  |t	        j
                  ||¬«      |¬«       Œ- ŒO y )NrÇ  r&  r
  )rq   rR   r²  rø   r
   r.  ©r.   rž   r+   rË  rÀ   r'  s         r'   r—   z0MigrationAutodetector.generate_added_constraints6  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È  rC  )rq   rR   rø   r
   rô   rh   )r.   rž   r+   rË  r'  s        r'   rŒ   z2MigrationAutodetector.generate_removed_constraintsF  sq   € ð #×6Ñ6×<Ñ<Ó>ò	ñ ñ 
ØØØØ-Ð.CÑDò �
Ø×"Ñ"ØÜ×/Ñ/Ø#-Ø'Ÿ_™_ôõññ		r&   c           
      óî   — | j                   j                  «       D ]X  \  \  }}}| j                  ||«      }|d   D ]6  }| j                  |t	        j
                  ||j                  |¬«      |¬«       Œ8 ŒZ y )Nrq   )r+   rh   r'  r
  )rq   rR   r²  rø   r
   ÚAlterConstraintrh   rÕ  s         r'   r˜   z2MigrationAutodetector.generate_altered_constraintsT  s�   € ð #×6Ñ6×<Ñ<Ó>ò	ñ ñ 
ØØØØ×;Ñ;¸IÀzÓRˆLØ-Ð.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*   )rc   )rJ   r?  ri   s     €r'   rL   zJMigrationAutodetector._get_dependencies_for_foreign_key.<locals>.<genexpr>m  s$   øè ø€ ò à%ð ˜]×7Ñ7Õ7ñùs   ƒr±   Úswappable_settingr°   rª   )rY   rc   r<   r  rR   rê   rÃ   r«   r   r   r(   r   rª   re   )rž   r+   ri   Úproject_stateÚremote_field_modelr  Úremote_app_labelÚremote_model_namerf   rÛ  Údep_app_labelÚdep_object_namerÀ   Úthrough_app_labelÚthrough_object_names     `            r'   r  z7MigrationAutodetector._get_dependencies_for_foreign_keye  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_fieldsrb   r§   r¦   r8   rT  rc   r<   rh   re   r   r(   r   )	r.   ri   rÀ   rç  Únewly_added_fieldsrž   r+   Úadded_field_nameÚadded_fields	            r'   rj  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   }d„ |j                  j                  «       D «       }|D ]}  }t	        ˆfd„t        j
                  j                  |j                  «      D «       «      sŒ?|j                  t        |||j                  t        j                  j                  «      «       Œ |S )Nc              3   ó:   K  — | ]  }|j                   sŒ|–— Œ y ­wr*   )ri  )rJ   Úfs     r'   rL   z\MigrationAutodetector._get_generated_field_dependencies_for_removed_field.<locals>.<genexpr>­  s   è ø€ ÒR !ÀaÇkÃkœAÑRùs   ‚”c              3   ó,   •K  — | ]  ^}}‰|k(  –— Œ y ­wr*   r%   )rJ   rh   r¯  r2   s      €r'   rL   z\MigrationAutodetector._get_generated_field_dependencies_for_removed_field.<locals>.<genexpr>¯  s"   øè ø€ ò à�D˜1ð ˜dÕ"ñùs   ƒ)r7   r	   rf   rÃ   rê   ÚModelÚ_get_expr_referencesræ  re   r   rh   r(   r    )r.   rž   r+   r2   rÀ   rŸ   Úgenerated_fieldsri   s      `    r'   rƒ  zIMigrationAutodetector._get_generated_field_dependencies_for_removed_field¨  s²   ø€ ð ˆØ—o‘o×,Ñ,¨Y¸
Ð-BÑCˆÙR {×'9Ñ'9×'@Ñ'@Ó'BÔRÐØ%ò 	ˆEÜó ä &§¡× AÑ AÀ%×BRÑBRÓ Sôõ ð ×#Ñ#Ü'Ø!Ø"ØŸ
™
Ü+×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.)r8   r	   rf   rÃ   r  r  r  )r.   rž   r+   rÀ   rŸ   ri   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*   )rr   r{   )rJ   Únrž   r+   r.   s     €€€r'   rL   zMMigrationAutodetector._get_altered_foo_together_operations.<locals>.<genexpr>Ú  s3   øè ø€ ò àð ×+Ñ+×/Ñ/°¸JÈÐ0JÈA×Nñùs   ƒ),)rb   r¡   r¥   r{   r7   r	   r8   rz   rP   rs   rT  rc   r<   r  r  )r.   rš  r¬   r­   rX  r¨  r{  r©  rÀ   Úfoo_togethersr2   ri   rž   r+   s   `           @@r'   rœ  z:MigrationAutodetector._get_altered_foo_together_operationsÍ  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ó	!"õñ
ðð ØØØØ ðô ñO-	ùòù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 ©Nrh   r
  r%   )rœ  rš  r
   rò   r›  r,  rø   )	r.   rÎ   r¨  r©  rž   r+   rÀ   rK   Úremoval_values	            r'   Ú&_generate_removed_altered_foo_togetherz<MigrationAutodetector._generate_removed_altered_foo_togetherý  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)rh   Útable)r¡   Úunionr¢   r£   rb   r¥   r{   r7   r	   r8   rz   rø   r
   ÚAlterModelTable)	r.   Úmodels_to_checkrž   r+   r¬   r­   rX  Ú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)rh   Útable_comment)r¡   r  r¢   r£   rb   r¥   r{   r7   r	   r8   rz   rø   r
   ÚAlterModelTableComment)	r.   r  rž   r+   r¬   r­   rX  Úold_db_table_commentÚnew_db_table_comments	            r'   rˆ   z7MigrationAutodetector.generate_altered_db_table_commentA  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).
        )rh   rz   N)r¡   r  r¢   r£   rv   rw   rt   ry   rb   r¥   r{   r7   r	   r8   rz   rR   r   ÚALTER_OPTION_KEYSrø   r
   )r.   r  rž   r+   r¬   r­   rX  r\   rK   Úold_optionsÚnew_optionss              r'   r†   z.MigrationAutodetector.generate_altered_optionsW  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
  )rb   r¡   r¥   r{   r7   r	   r8   rz   re   r   r(   r   rø   r
   rï   )r.   rž   r+   r¬   r­   rX  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)rh   r!  )rb   r¡   r¥   r{   r7   r	   r8   r!  rø   r
   ÚAlterModelManagers)r.   rž   r+   r¬   r­   rX  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Æ   rO   rR   r9   Úask_initialrh   Úparse_numberÚ	enumeraterÀ   re   Úsuggest_nameÚjoinrÃ   r{   )r.   rF   rB   rE   ÚleavesÚname_maprž   r�   Úapp_leafÚleafrã   Únext_numberÚiÚnew_name_partsr	  r:  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%   )rR   rÀ   rÉ   rs   r|   rÇ   r{   rO   )r.   rF   Ú
app_labelsÚapp_dependenciesrž   r�   rã   rà  rh   Úrequired_appsÚold_required_appss              r'   rA   z#MigrationAutodetector._trim_to_appså  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)Úclsrh   Úsquashed_matchr+  s       r'   r  z"MigrationAutodetector.parse_number   sO   € ô  ŸY™YÐ';¸TÓBÐBˆ>ÐBÜ�~ aÑ(Ó)Ð)Ü—‘˜ $Ó'ˆÙÜ�u˜Q‘x“=Ð Ør&   r*   )NNN)NN)NF):r   r   r   Ú__doc__r=   rF   rI   rk   r?   r€   r�   Ústaticmethodr¶   r›   rš   rœ   rÅ   rø   r  r   rƒ   r…   r‚   r„   r‰   rŽ   r’   re  r‘   r�  r“   rŠ   r–   r�   r�   rÅ  r‹   r—   rŒ   r˜   r  rj  rƒ  r²  rœ  rú  r�   rý  r•   r™   rˆ   r†   r”   r‡   r@   rA   Úclassmethodr  r%   r&   r'   r5   r5   +   s`  „ ñ
óGó
ò%òNóhòT
ò.ð( ñ
ó ð
ó(v"òpKò$ò$^Kó@Ròò.B"òH\ò|)òVwòrò<"ò|#IòJJò6
òpLò!
òFzRòxWòrò	òò"TòH0òdò òð" ñ+ó ð+òZò*ò*ò .ò`ò2Tòò Lòò*ò,&òP òDó 2òhð6 ñó ñr&   r5   )!rS   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   r5   r%   r&   r'   ú<module>r>     s]   ðÛ Û 	ß /Ý Ý &Ý å  Ý Ý +Ý 4Ý DÝ =Ý ?÷ñ õ
 4ô'ÙÐ$Ð&LÓMô'÷(aò ar&   