def curp(self) -> str:
        """
        See https://es.wikipedia.org/wiki/Clave_%C3%9Anica_de_Registro_de_Poblaci%C3%B3n.

        :return: a random Mexican CURP (Unique Population Registry Code)
        """
        birthday = self.generator.date_of_birth()

        first_surname = random.choice(ALPHABET) + random.choice(VOWELS)
        second_surname = random.choice(ALPHABET)
        given_name = random.choice(ALPHABET)
        name_initials = first_surname + second_surname + given_name

        birth_date = birthday.strftime("%y%m%d")
        gender = random.choice("HM")
        state = random.choice(STATES_RENAPO)
        first_surname_inside = random.choice(CONSONANTS)
        second_surname_inside = random.choice(CONSONANTS)
        given_name_inside = random.choice(ALPHABET)

        # This character is assigned to avoid duplicity
        # It's normally '0' for those born < 2000
        # and 'A' for those born >= 2000
        assigned_character = "0" if birthday.year < 2000 else "A"

        name_initials = FORBIDDEN_WORDS.get(name_initials, name_initials)

        random_curp = (
            name_initials
            + birth_date
            + gender
            + state
            + first_surname_inside
            + second_surname_inside
            + given_name_inside
            + assigned_character
        )

        random_curp += str(curp_checksum(random_curp))

        return random_curp

        See https://es.wikipedia.org/wiki/Clave_%C3%9Anica_de_Registro_de_Poblaci%C3%B3n.

        :return: a random Mexican CURP (Unique Population Registry Code)
        
faker/providers/ssn/es_MX/__init__.py