
    1~hb                        d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZ  e j$                  d      Z e j$                  d	      Z e j$                  d
      Z e j$                  d      Z e j$                  d      Z e j$                  d      Z e j$                  d      Z e
d      Zeee   ee   eeef   f   Z G d d      Z G d de      Zy)    N)OrderedDict)Any
CollectionListOptionalSequenceTypeVarUnion   )	Generator)OrderedDictType)choices_distributionchoices_distribution_unique#%z\$!@z\?z\^Tc                      e Zd ZU dZdZee   ed<   dZi ddddd	d
dddddddddddddddddddddddd d!dd"di d#d$d%d&d'd(d)dd*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d1d=d>d?d@dAdBi dCddDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdci dddedfd>dgdhdiddjddkd>dldmdnd5dodpdqddrddsdtdudvdwdxdydzd{d|d}d(i d~dddmddddddddddpddddddddddddddddddddi dd>ddddddddddadddddddddd5dddddddd1ddddi dddddddddddddddd5ddÓddœddǓddɓdd˓dd͓ddÓddddi dd(ddӓdddd1ddדddٓdd;ddܓddޓddddddddddddddddai ddדddÓddddddddddddddddddddddddd d;ddddi ddddddd	dǓd
dhdd-dddd[dddddddd1dddd7ddMddדddddddddWddMdmdddd Z	d!e
d"dfd#Zd"efd$Zd"efd%ZdKd&ed'ed(ed"efd)Zd"efd*Zd"efd+Zd"efd,Zd"eeef   fd-Zd"eeef   fd.ZdLd/ee   d0ed"efd1Zd"efd2ZdMd3ed"ee   fd4Zd"efd5Zd"efd6Z	 	 	 	 dNd7ee   d3ee   d8ed9ee   d"ee   f
d:Z	 	 dOd7ee   d3ee   d"ee   fd;Z dPd7ee   d"efd<Z!	 dOd7ee   d3ee   d"ee   fd=Z"	 	 	 	 	 dQd>ed?ed@ed&ee   d'ee   d"efdAZ#dRdBed"efdCZ$dDe%jL                  fdBedEed"efdFZ'dGe%jL                  fdBedEed"efdHZ(dSdBedIed"efdJZ)y(T  BaseProviderbaseN__lang__Faa)DJERETaf)ZAak)GHam)r   an)ESapn)INar)AEBHr   DZEGEHr   ILr%   IQJOKMKWLBLYMAMROMPSQASASDSOSSSYTDTNYEasastayc)PEaz)AZr%   be)BYbem)ZMber)r)   r3   bg)BGbhbbhobn)BDr%   bo)CNr%   br)FRbrxbs)BAbyn)r   ca)ADr#   rT   ITce)RUckb)r-   cmn)TWcrh)UAcs)CZcsb)PLcvcy)GBda)DKde)ATBECHDELILUdoidv)MVdz)BTel)GRCYen)AGAUrP   BWCArk   ri   HKIEr%   NGNZPHPKSGUSr   rI   ZWeo)r   es)ARBOCLCOCRCUDOECr#   GTHNMXNIPArC   PRPYSVr   UYVEet)EEeu)r#   rT   fa)IRff)SNfi)FIfil)r   fo)FOfr)r   ro   rT   rr   fur)r[   fy)NLrp   ga)r   gdgez)r   r   glgugvha)r   hakhe)r,   hihnehr)HRhsb)rp   ht)HThu)HUhy)AMiaid)IDigik)r   is)ISit)ro   r[   iuiwja)JPka)GEkk)KZkl)GLkm)KHknko)KRkokksku)TRkwky)KGlb)rr   lg)UGli)rn   r   lijln)CDlo)LAlt)LTlv)LVlzhmagmaimg)MGmhrmi)r   mk)MKmlmn)MNmnimrms)MYmt)MTmy)MMnannb)NOnds)rp   r   ne)NPnhn)r   niu)NUr   nl)AWrn   r   nnnrnsoocom)r   KEorospa)r%   r   pap)ANr
  CWplps)AFpt)BRPTquzrajro)ROru)r]   rb   rw)RWsasatscsdseshssi)LKsidsk)SKsl)SIso)r   r   r  r:   sq)ALMLsr)MERSssstsv)r   SEsw)r  TZszlta)r%   r+  tcytetg)TJth)THthetitigtk)TMtltntr)rz   r   tsttug)rR   ukunmuruz)UZ)VN)rn   )ro   )r   )rR   r   r   r`   )veviwawaewalwoxhyiyoyuezhzu	generatorreturnc                     || _         y)zc
        Base class for fake data providers
        :param generator: `Generator` instance
        N)rc  )selfrc  s     a/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/faker/providers/__init__.py__init__zBaseProvider.__init__  s    
 #    c                 r    | j                         }|dz   | j                  t        j                  |         z   S )z<Generate a random underscored i18n locale code (e.g. en_US)._)language_coderandom_elementr   language_locale_codes)rf  rl  s     rg  localezBaseProvider.locale$  sC     **,!!22=A	
ri  c                 \    | j                  t        j                  j                               S )z/Generate a random i18n language code (e.g. en).)rm  r   rn  keysrf  s    rg  rl  zBaseProvider.language_code0  s$     ""<#E#E#J#J#LMMri  minmaxstepc                 V    | j                   j                  j                  ||dz   |      S )aZ  Generate a random integer between two integers ``min`` and ``max`` inclusive
        while observing the provided ``step`` value.

        This method is functionally equivalent to randomly sampling an integer
        from the sequence ``range(min, max + 1, step)``.

        :sample: min=0, max=15
        :sample: min=0, max=15, step=3
           )rc  random	randrange)rf  rs  rt  ru  s       rg  
random_intzBaseProvider.random_int5  s'     ~~$$..sC!GTBBri  c                 N    | j                   j                  j                  dd      S )z!Generate a random digit (0 to 9).r   	   rc  rx  randintrr  s    rg  random_digitzBaseProvider.random_digitA  !     ~~$$,,Q22ri  c                 N    | j                   j                  j                  dd      S )z*Generate a random non-zero digit (1 to 9).rw  r|  r}  rr  s    rg  random_digit_not_nullz"BaseProvider.random_digit_not_nullF  r  ri  c                 N    | j                   j                  j                  dd      S )z1Generate a random digit above value two (2 to 9).r   r|  r}  rr  s    rg  random_digit_above_twoz#BaseProvider.random_digit_above_twoK  r  ri  c                     | j                   j                  j                  dd      r&| j                   j                  j                  dd      S y)zGenerate a random digit (0 to 9) or an empty string.

        This method will return an empty string 50% of the time,
        and each digit has a 1/20 chance of being generated.
        r   rw  r|   r}  rr  s    rg  random_digit_or_emptyz"BaseProvider.random_digit_or_emptyP  >     >>  ((A.>>((00A66ri  c                     | j                   j                  j                  dd      r&| j                   j                  j                  dd      S y)zGenerate a random non-zero digit (1 to 9) or an empty string.

        This method will return an empty string 50% of the time,
        and each digit has a 1/18 chance of being generated.
        r   rw  r|  r  r}  rr  s    rg  random_digit_not_null_or_emptyz+BaseProvider.random_digit_not_null_or_empty\  r  ri  digitsfix_lenc                 P   || j                         }|dk  rt        d      |rP|dkD  r@| j                  j                  j	                  t        d|dz
        t        d|      dz
        S t        d      | j                  j                  j	                  dt        d|      dz
        S )aX  Generate a random integer according to the following rules:

        - If ``digits`` is ``None`` (default), its value will be set to a random
          integer from 1 to 9.
        - If ``fix_len`` is ``False`` (default), all integers that do not exceed
          the number of ``digits`` can be generated.
        - If ``fix_len`` is ``True``, only integers with the exact number of
          ``digits`` can be generated.

        :sample: fix_len=False
        :sample: fix_len=True
        :sample: digits=3
        :sample: digits=3, fix_len=False
        :sample: digits=3, fix_len=True
        r   z7The digit parameter must be greater than or equal to 0.
   rw  z=A number of fixed length cannot have less than 1 digit in it.)r  
ValueErrorrc  rx  r~  pow)rf  r  r  s      rg  random_numberzBaseProvider.random_numberh  s      >//1FA:VWWz~~,,44SVaZ5H#bRX/\]J]^^ !`aa>>((00CFOa4GHHri  c                     | j                   j                  j                  t        t        dt        j
                              S )z-Generate a random ASCII letter (a-z and A-Z).letters)rc  rx  choicegetattrstringascii_lettersrr  s    rg  random_letterzBaseProvider.random_letter  s.     ~~$$++GFIvG[G[,\]]ri  lengthc                 b    | j                  t        t        dt        j                        |      S )zwGenerate a list of random ASCII letters (a-z and A-Z) of the specified ``length``.

        :sample: length=10
        r  r  )random_choicesr  r  r  )rf  r  s     rg  random_letterszBaseProvider.random_letters  s1    
 ""FIv';';< # 
 	
ri  c                 h    | j                   j                  j                  t        j                        S )z/Generate a random lowercase ASCII letter (a-z).)rc  rx  r  r  ascii_lowercaserr  s    rg  random_lowercase_letterz$BaseProvider.random_lowercase_letter  %     ~~$$++F,B,BCCri  c                 h    | j                   j                  j                  t        j                        S )z/Generate a random uppercase ASCII letter (A-Z).)rc  rx  r  r  ascii_uppercaserr  s    rg  random_uppercase_letterz$BaseProvider.random_uppercase_letter  r  ri  elementsuniqueuse_weightingc                    ||n| j                   }t        |t              rt        |t              st	        d      |rt
        nt        }|/| j                  j                  j                  dt        |            }|r|t        |      kD  rt	        d      t        |t              rTt        |d      st        |j                               |_        |j                  }|rt        |j                               nd}n,|r&| j                  j                  j!                  ||      S |}d} |t        |      || j                  j                  |      S )a	  Generate a list of randomly sampled objects from ``elements``.

        Set ``unique`` to ``False`` for random sampling with replacement, and set ``unique`` to
        ``True`` for random sampling without replacement.

        If ``length`` is set to ``None`` or is omitted, ``length`` will be set to a random
        integer from 1 to the size of ``elements``.

        The value of ``length`` cannot be greater than the number of objects
        in ``elements`` if ``unique`` is set to ``True``.

        The value of ``elements`` can be any sequence type (``list``, ``tuple``, ``set``,
        ``string``, etc) or an ``OrderedDict`` type. If it is the latter, the keys will be
        used as the objects for sampling, and the values will be used as weighted probabilities
        if ``unique`` is set to ``False``. For example:

        .. code-block:: python

            # Random sampling with replacement
            fake.random_elements(
                elements=OrderedDict([
                    ("variable_1", 0.5),        # Generates "variable_1" 50% of the time
                    ("variable_2", 0.2),        # Generates "variable_2" 20% of the time
                    ("variable_3", 0.2),        # Generates "variable_3" 20% of the time
                    ("variable_4": 0.1),        # Generates "variable_4" 10% of the time
                ]), unique=False
            )

            # Random sampling without replacement (defaults to uniform distribution)
            fake.random_elements(
                elements=OrderedDict([
                    ("variable_1", 0.5),
                    ("variable_2", 0.2),
                    ("variable_3", 0.2),
                    ("variable_4": 0.1),
                ]), unique=True
            )

        :sample: elements=('a', 'b', 'c', 'd'), unique=False
        :sample: elements=('a', 'b', 'c', 'd'), unique=True
        :sample: elements=('a', 'b', 'c', 'd'), length=10, unique=False
        :sample: elements=('a', 'b', 'c', 'd'), length=4, unique=True
        :sample: elements=OrderedDict([
                        ("a", 0.45),
                        ("b", 0.35),
                       ("c", 0.15),
                       ("d", 0.05),
                   ]), length=20, unique=False
        :sample: elements=OrderedDict([
                       ("a", 0.45),
                       ("b", 0.35),
                       ("c", 0.15),
                       ("d", 0.05),
                   ]), unique=True
        NzFUse OrderedDict only to avoid dependency on PYTHONHASHSEED (See #363).rw  zOSample length cannot be longer than the number of unique elements to pick from.
_key_cacher  )__use_weighting__
isinstancedictr   r  r   r   rc  rx  r~  lenhasattrtuplerq  r  valuessample)rf  r  r  r  r  fnchoicesprobabilitiess           rg  random_elementszBaseProvider.random_elements  s   | *7)BH^H^h%j;.Oeff,2(8L>^^**221c(mDFfs8},nooh%8\2&+HMMO&<#))G8EE(//"344M~~,,33HfEEG M'NNN!!	
 	
ri  c                 *    | j                  ||d      S )a\  Generate a list of objects randomly sampled from ``elements`` with replacement.

        For information on the ``elements`` and ``length`` arguments, please refer to
        :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which
        is used under the hood with the ``unique`` argument explicitly set to ``False``.

        :sample: elements=('a', 'b', 'c', 'd')
        :sample: elements=('a', 'b', 'c', 'd'), length=10
        :sample: elements=OrderedDict([
                     ("a", 0.45),
                     ("b", 0.35),
                     ("c", 0.15),
                     ("d", 0.05),
                 ])
        :sample: elements=OrderedDict([
                     ("a", 0.45),
                     ("b", 0.35),
                     ("c", 0.15),
                     ("d", 0.05),
                 ]), length=20
        Fr  r  rf  r  r  s      rg  r  zBaseProvider.random_choices  s    4 ##HfU#CCri  c                 .    | j                  |d      d   S )aW  Generate a randomly sampled object from ``elements``.

        For information on the ``elements`` argument, please refer to
        :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which
        is used under the hood with the ``unique`` argument set to ``False`` and the
        ``length`` argument set to ``1``.

        :sample: elements=('a', 'b', 'c', 'd')
        :sample size=10: elements=OrderedDict([
                     ("a", 0.45),
                     ("b", 0.35),
                     ("c", 0.15),
                     ("d", 0.05),
                 ])
        rw  r  r   r  )rf  r  s     rg  rm  zBaseProvider.random_element  s    " ##HQ#7::ri  c                 *    | j                  ||d      S )a  Generate a list of objects randomly sampled from ``elements`` without replacement.

        For information on the ``elements`` and ``length`` arguments, please refer to
        :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which
        is used under the hood with the ``unique`` argument explicitly set to ``True``.

        :sample: elements=('a', 'b', 'c', 'd', 'e', 'f')
        :sample: elements=('a', 'b', 'c', 'd', 'e', 'f'), length=3
        Tr  r  r  s      rg  random_samplezBaseProvider.random_sample+  s     ##HfT#BBri  numberlegec                     |r|r|S |rdnd}|rdnd}t        || j                  j                  j                  ||      z  dz        }|||k  r|}|||kD  r|}|S )a1  Generate a random integer near ``number`` according to the following rules:

        - If ``le`` is ``False`` (default), allow generation up to 140% of ``number``.
          If ``True``, upper bound generation is capped at 100%.
        - If ``ge`` is ``False`` (default), allow generation down to 60% of ``number``.
          If ``True``, lower bound generation is capped at 100%.
        - If a numerical value for ``min`` is provided, generated values less than ``min``
          will be clamped at ``min``.
        - If a numerical value for ``max`` is provided, generated values greater than
          ``max`` will be clamped at ``max``.
        - If both ``le`` and ``ge`` are ``True``, the value of ``number`` will automatically
          be returned, regardless of the values supplied for ``min`` and ``max``.

        :sample: number=100
        :sample: number=100, ge=True
        :sample: number=100, ge=True, min=120
        :sample: number=100, le=True
        :sample: number=100, le=True, max=80
        :sample: number=79, le=True, ge=True, min=80
        d   <      )intrc  rx  r~  )	rf  r  r  r  rs  rt  _min_maxr  s	            rg  randomize_nb_elementsz"BaseProvider.randomize_nb_elements9  sp    8 "Msbsc$..//77dCCcIJ?rCxB?rCxB	ri  textc                     t         j                   fd|      }t        j                   fd|      }t        j                   fd|      }t        j                   fd|      }t
        j                   fd|      }|S )aJ  Generate a string with each placeholder in ``text`` replaced according
        to the following rules:

        - Number signs ('#') are replaced with a random digit (0 to 9).
        - Percent signs ('%') are replaced with a random non-zero digit (1 to 9).
        - Dollar signs ('$') are replaced with a random digit above two (2 to 9).
        - Exclamation marks ('!') are replaced with a random digit or an empty string.
        - At symbols ('@') are replaced with a random non-zero digit or an empty string.

        Under the hood, this method uses :meth:`random_digit() <faker.providers.BaseProvider.random_digit>`,
        :meth:`random_digit_not_null() <faker.providers.BaseProvider.random_digit_not_null>`,
        :meth:`random_digit_or_empty() <faker.providers.BaseProvider.random_digit_or_empty>`,
        and :meth:`random_digit_not_null_or_empty() <faker.providers.BaseProvider.random_digit_not_null_or_empty>`
        to generate the random values.

        :sample: text='Intel Core i%-%%##K vs AMD Ryzen % %%##X'
        :sample: text='!!! !!@ !@! !@@ @!! @!@ @@! @@@'
        c                 6    t        j                               S N)strr  xrf  s    rg  <lambda>z'BaseProvider.numerify.<locals>.<lambda>s  s    c$*;*;*=&> ri  c                 6    t        j                               S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>t      c$*D*D*F&G ri  c                 6    t        j                               S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>u  s    S)D)D)F%G ri  c                 6    t        j                               S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>v  r  ri  c                 6    t        j                               S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>w  s    C(K(K(M$N ri  )_re_hashsub_re_perc_re_dol_re_excl_re_at)rf  r  s   ` rg  numerifyzBaseProvider.numerify`  s`    & ||>E||GN{{GN||GNzzNPTUri  z????r  c                 :     t         j                   fd|      S )aS  Generate a string with each question mark ('?') in ``text``
        replaced with a random character from ``letters``.

        By default, ``letters`` contains all ASCII letters, uppercase and lowercase.

        :sample: text='Random Identifier: ??????????'
        :sample: text='Random Identifier: ??????????', letters='ABCDE'
        c                 &    j                        S r  rm  r  r  rf  s    rg  r  z%BaseProvider.lexify.<locals>.<lambda>  s    D$7$7$@ ri  )_re_qmr  rf  r  r  s   ` `rg  lexifyzBaseProvider.lexifyz  s     zz@$GGri  z## ??c                 F    | j                  | j                  |      |      S )a  Generate a string with each placeholder in ``text`` replaced according to the following rules:

        - Number signs ('#') are replaced with a random digit (0 to 9).
        - Question marks ('?') are replaced with a random character from ``letters``.

        By default, ``letters`` contains all ASCII letters, uppercase and lowercase.

        Under the hood, this method uses :meth:`numerify() <faker.providers.BaseProvider.numerify>` and
        and :meth:`lexify() <faker.providers.BaseProvider.lexify>` to generate random values for number
        signs and question marks respectively.

        :sample: letters='ABCDE'
        :sample: text='Product Number: ????-########'
        :sample: text='Product Number: ????-########', letters='ABCDE'
        )r  )r  r  r  s      rg  bothifyzBaseProvider.bothify  s       {{4==.{@@ri  upperc                      t         j                  dd |rj                         t        j	                   fd|      S )a  Generate a string with each circumflex ('^') in ``text``
        replaced with a random hexadecimal character.

        By default, ``upper`` is set to False. If set to ``True``, output
        will be formatted using uppercase hexadecimal characters.

        :sample: text='MAC Address: ^^:^^:^^:^^:^^:^^'
        :sample: text='MAC Address: ^^:^^:^^:^^:^^:^^', upper=True
        Nic                 &    j                        S r  r  r  s    rg  r  z%BaseProvider.hexify.<locals>.<lambda>  s    T%8%8%A ri  )r  	hexdigitsr  _re_cirr  )rf  r  r  r  s   `  @rg  hexifyzBaseProvider.hexify  s7     ""3B'mmoG{{A4HHri  )r   i'  rw  )NF)   )abcNFN)r  N)r  )r  FFNN)z###)z^^^^F)*__name__
__module____qualname____provider__r   r   r  __annotations__r  rn  r   rh  ro  rl  r  rz  r  r  r  r
   r  r  boolr  r  r   r  r  r  ElementsTyper   r  r  rm  r  r  r  r  r  r  r  r   ri  rg  r   r      s
   L"Hhsm"~ ~g~ 	g~ 	g	~
 	g~ 	w~ 	 
~J 	gK~L 	wM~N 	wO~P 	lQ~R 	gS~T 	wU~V 	|W~X 	gY~Z 	w[~\ 	w]~^ 	l_~` 	la~b 	gc~d 	we~f 	gg~h 	wi~j 	&k~l 	gm~n 	wo~p 	wq~r 	ws~t 	gu~v 	ww~x 	gy~z 	g{~| 	g}~~ 	2~@ 	wA~B 	gC~D 	gE~F 	lG~H 	 
I~r 	gs~t 	 
u~b 	gc~d 	le~f 	gg~h 	gi~j 	gk~l 	wm~n 	go~p 	&q~r 	ws~t 	lu~v 	gw~x 	gy~z 	|{~| 	g}~~ 	g~@ 	gA~B 	gC~D 	wE~F 	gG~H 	gI~J 	wK~L 	gM~N 	wO~P 	gQ~R 	gS~T 	gU~V 	gW~X 	gY~Z 	g[~\ 	g]~^ 	g_~` 	la~b 	gc~d 	ge~f 	gg~h 	gi~j 	gk~l 	gm~n 	go~p 	gq~r 	gs~t 	wu~v 	gw~x 	gy~z 	g{~| 	g}~~ 	g~@ 	gA~B 	lC~D 	wE~F 	gG~H 	gI~J 	gK~L 	gM~N 	wO~P 	wQ~R 	wS~T 	gU~V 	wW~X 	gY~Z 	g[~\ 	g]~^ 	g_~` 	wa~b 	gc~d 	ge~f 	gg~h 	gi~j 	wk~l 	gm~n 	|o~p 	gq~r 	ws~t 	|u~v 	 w~x 	gy~z 	g{~| 	w}~~ 	g~@ 	lA~B 	gC~D 	gE~F 	lG~H 	!I~J 	gK~L 	gM~N 	lO~P 	wQ~R 	wS~T 	gU~V 	lW~X 	gY~Z 	g[~\ 	w]~^ 	g_~` 	la~b 	gc~d 	we~f 	gg~h 	wi~j 	gk~l 	gm~n 	&o~p 	lq~r 	ls~t 	gu~v 	gw~x 	ly~z 	l{~| 	w}~~ 	l~@ 	wA~B 	gC~D 	gE~F 	gG~H 	wI~J 	lK~L 	wM~N 	gO~P 	gQ~R 	gS~T 	lU~V 	gW~X 	gY~Z 	g[~\ 	g]~^ 	w_~` 	la~b 	gc~d &{~@## #$ #

 

Ns N

Cc 
CC 
Cc 
C# 
C3c 3
3s 3
3 3

uS#X 

c3h 
IHSM I4 ITW I8^s ^

S 
(3- 
D D
D D %4 $(,]
q/]
 ]
 	]

  ~]
 
!]
B %4 $Dq/D D 
!	D8;|A ;Q ;( TXC$QCCKC=C	!C  !!%% % 	%
 c]% c]% 
%NS S 4 "(8L8L 	H3 	H# 	HQT 	H #*&:N:N AC AC ASV A$I3 I I Iri  r   c                   `     e Zd Z	 	 ddedee   dee   f fdZdeddfdZdd	e	defd
Z
 xZS )DynamicProviderNprovider_namer  rc  c                     |s
t               }t        | 	  |       |j                  d      rt	        d      || _        g | _        |r|| _        t        | || j                         y)a  
        A faker Provider capable of getting a list of elements to randomly select from,
        instead of using the predefined list of elements which exist in the default providers in faker.

        :param provider_name: Name of provider, which would translate into the function name e.g. faker.my_fun().
        :param elements: List of values to randomly select from
        :param generator: Generator object. If missing, the default Generator is used.

        :example:
        >>>from faker import Faker
        >>>from faker.providers import DynamicProvider

        >>>medical_professions_provider = DynamicProvider(
        >>>     provider_name="medical_profession",
        >>>     elements=["dr.", "doctor", "nurse", "surgeon", "clerk"],
        >>>)
        >>>fake = Faker()
        >>>fake.add_provider(medical_professions_provider)

        >>>fake.medical_profession()
        "dr."

        __zBProvider name cannot start with __ as it would be ignored by FakerN)	r   superrh  
startswithr  r  r  setattrget_random_value)rf  r  r  rc  	__class__s       rg  rh  zDynamicProvider.__init__  sa    < !I###D)abb*$DMmT%:%:;ri  elementrd  c                 :    | j                   j                  |       y)zAdd new element.N)r  append)rf  r  s     rg  add_elementzDynamicProvider.add_element  s    W%ri  r  c                     | j                   rt        | j                         dk(  rt        d      | j                  | j                   d|      d   S )zReturns a random value for this provider.

        :param use_weighting: boolean option to use weighting. Defaults to True
        r   z=Elements should be a list of values the provider samples fromrw  )r  r  )r  r  r  r  )rf  r  s     rg  r   z DynamicProvider.get_random_value  sI    
 }}DMM 2a 7\]]##DMM!=#YZ[\\ri  )NN)T)r  r  r  r  r   r   r   rh  r  r  r   __classcell__)r  s   @rg  r  r    s^     $(#'	*<*< 4.*< C=	*<X&3 &4 &]d ]c ]ri  r  ) rer  collectionsr   typingr   r   r   r   r   r	   r
   rc  r   r   utils.distributionr   r   compiler  r  r  r  r  r  r  r   r  floatr  r   r  r  ri  rg  <module>r     s    	  # L L L ! $ R2::d2::d
"**U
2::d	D		E	
"**U
CLZ_jm_QX5NNOM
I M
I`9]l 9]ri  