We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
getting a parameters original choices
* Cookiecutter version: 2.1.1
* Template project url: github.com/kjaymiller/cookiecutter_relecloud
* Python version: Python 3.11.0
* Operating System: MacOS Ventura - 13.4.1 (22F82)

### Description:

If my cookiecutter.json has:

```json
{
    "cc_options": [1, 2, 3, 4]
}
```
is there a way to get all of the options.

### What I've run:

```jinja
{{cookiecutter.json}}
```

```jinja
{{cookiecutter.cc_options}}
```

### Expected outcome

I would like some attibute that would give me my original options.  Perhaps if you call the value with an underscore in front.

```jinja
{{cookiecutter._cc_options}} >>> [1,2,3,4]
```

another option could be to have the original values preserved in a variable

```jinja
{{cookiecutter.source_values.cc_options}} >>> [1,2,3,4]
```

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `cookiecutter/main.py`
Content:
```
1 """
2 Main entry point for the `cookiecutter` command.
3 
4 The code in this module is also a good example of how to use Cookiecutter as a
5 library rather than a script.
6 """
7 import logging
8 import os
9 import re
10 import sys
11 from copy import copy
12 
13 from cookiecutter.config import get_user_config
14 from cookiecutter.exceptions import InvalidModeException
15 from cookiecutter.generate import generate_context, generate_files
16 from cookiecutter.prompt import prompt_for_config
17 from cookiecutter.replay import dump, load
18 from cookiecutter.repository import determine_repo_dir
19 from cookiecutter.utils import rmtree
20 
21 logger = logging.getLogger(__name__)
22 
23 
24 def cookiecutter(
25     template,
26     checkout=None,
27     no_input=False,
28     extra_context=None,
29     replay=None,
30     overwrite_if_exists=False,
31     output_dir='.',
32     config_file=None,
33     default_config=False,
34     password=None,
35     directory=None,
36     skip_if_file_exists=False,
37     accept_hooks=True,
38     keep_project_on_failure=False,
39 ):
40     """
41     Run Cookiecutter just as if using it from the command line.
42 
43     :param template: A directory containing a project template directory,
44         or a URL to a git repository.
45     :param checkout: The branch, tag or commit ID to checkout after clone.
46     :param no_input: Do not prompt for user input.
47         Use default values for template parameters taken from `cookiecutter.json`, user
48         config and `extra_dict`. Force a refresh of cached resources.
49     :param extra_context: A dictionary of context that overrides default
50         and user configuration.
51     :param replay: Do not prompt for input, instead read from saved json. If
52         ``True`` read from the ``replay_dir``.
53         if it exists
54     :param output_dir: Where to output the generated project dir into.
55     :param config_file: User configuration file path.
56     :param default_config: Use default values rather than a config file.
57     :param password: The password to use when extracting the repository.
58     :param directory: Relative path to a cookiecutter template in a repository.
59     :param accept_hooks: Accept pre and post hooks if set to `True`.
60     :param keep_project_on_failure: If `True` keep generated project directory even when
61         generation fails
62     """
63     if replay and ((no_input is not False) or (extra_context is not None)):
64         err_msg = (
65             "You can not use both replay and no_input or extra_context "
66             "at the same time."
67         )
68         raise InvalidModeException(err_msg)
69 
70     config_dict = get_user_config(
71         config_file=config_file,
72         default_config=default_config,
73     )
74 
75     repo_dir, cleanup = determine_repo_dir(
76         template=template,
77         abbreviations=config_dict['abbreviations'],
78         clone_to_dir=config_dict['cookiecutters_dir'],
79         checkout=checkout,
80         no_input=no_input,
81         password=password,
82         directory=directory,
83     )
84     import_patch = _patch_import_path_for_repo(repo_dir)
85 
86     template_name = os.path.basename(os.path.abspath(repo_dir))
87 
88     if replay:
89         with import_patch:
90             if isinstance(replay, bool):
91                 context = load(config_dict['replay_dir'], template_name)
92             else:
93                 path, template_name = os.path.split(os.path.splitext(replay)[0])
94                 context = load(path, template_name)
95     else:
96         context_file = os.path.join(repo_dir, 'cookiecutter.json')
97         logger.debug('context_file is %s', context_file)
98 
99         context = generate_context(
100             context_file=context_file,
101             default_context=config_dict['default_context'],
102             extra_context=extra_context,
103         )
104 
105         # prompt the user to manually configure at the command line.
106         # except when 'no-input' flag is set
107         with import_patch:
108             context['cookiecutter'] = prompt_for_config(context, no_input)
109 
110         if "template" in context["cookiecutter"]:
111             nested_template = re.search(
112                 r'\((.*?)\)', context["cookiecutter"]["template"]
113             ).group(1)
114             return cookiecutter(
115                 template=os.path.join(template, nested_template),
116                 checkout=checkout,
117                 no_input=no_input,
118                 extra_context=extra_context,
119                 replay=replay,
120                 overwrite_if_exists=overwrite_if_exists,
121                 output_dir=output_dir,
122                 config_file=config_file,
123                 default_config=default_config,
124                 password=password,
125                 directory=directory,
126                 skip_if_file_exists=skip_if_file_exists,
127                 accept_hooks=accept_hooks,
128                 keep_project_on_failure=keep_project_on_failure,
129             )
130 
131         # include template dir or url in the context dict
132         context['cookiecutter']['_template'] = template
133 
134         # include repo dir or url in the context dict
135         context['cookiecutter']['_repo_dir'] = repo_dir
136 
137         # include output+dir in the context dict
138         context['cookiecutter']['_output_dir'] = os.path.abspath(output_dir)
139 
140         dump(config_dict['replay_dir'], template_name, context)
141 
142     # Create project from local context and project template.
143     with import_patch:
144         result = generate_files(
145             repo_dir=repo_dir,
146             context=context,
147             overwrite_if_exists=overwrite_if_exists,
148             skip_if_file_exists=skip_if_file_exists,
149             output_dir=output_dir,
150             accept_hooks=accept_hooks,
151             keep_project_on_failure=keep_project_on_failure,
152         )
153 
154     # Cleanup (if required)
155     if cleanup:
156         rmtree(repo_dir)
157 
158     return result
159 
160 
161 class _patch_import_path_for_repo:
162     def __init__(self, repo_dir):
163         self._repo_dir = repo_dir
164         self._path = None
165 
166     def __enter__(self):
167         self._path = copy(sys.path)
168         sys.path.append(self._repo_dir)
169 
170     def __exit__(self, type, value, traceback):
171         sys.path = self._path
172
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/cookiecutter/main.py b/cookiecutter/main.py
--- a/cookiecutter/main.py
+++ b/cookiecutter/main.py
@@ -102,6 +102,9 @@
             extra_context=extra_context,
         )
 
+        # preserve the original cookiecutter options
+        context['_cookiecutter'] = context['cookiecutter']
+
         # prompt the user to manually configure at the command line.
         # except when 'no-input' flag is set
         with import_patch:

{"golden_diff": "diff --git a/cookiecutter/main.py b/cookiecutter/main.py\n--- a/cookiecutter/main.py\n+++ b/cookiecutter/main.py\n@@ -102,6 +102,9 @@\n             extra_context=extra_context,\n         )\n \n+        # preserve the original cookiecutter options\n+        context['_cookiecutter'] = context['cookiecutter']\n+\n         # prompt the user to manually configure at the command line.\n         # except when 'no-input' flag is set\n         with import_patch:\n", "issue": "getting a parameters original choices\n* Cookiecutter version: 2.1.1\r\n* Template project url: github.com/kjaymiller/cookiecutter_relecloud\r\n* Python version: Python 3.11.0\r\n* Operating System: MacOS Ventura - 13.4.1 (22F82)\r\n\r\n### Description:\r\n\r\nIf my cookiecutter.json has:\r\n\r\n```json\r\n{\r\n    \"cc_options\": [1, 2, 3, 4]\r\n}\r\n```\r\nis there a way to get all of the options.\r\n\r\n### What I've run:\r\n\r\n```jinja\r\n{{cookiecutter.json}}\r\n```\r\n\r\n```jinja\r\n{{cookiecutter.cc_options}}\r\n```\r\n\r\n### Expected outcome\r\n\r\nI would like some attibute that would give me my original options.  Perhaps if you call the value with an underscore in front.\r\n\r\n```jinja\r\n{{cookiecutter._cc_options}} >>> [1,2,3,4]\r\n```\r\n\r\nanother option could be to have the original values preserved in a variable\r\n\r\n```jinja\r\n{{cookiecutter.source_values.cc_options}} >>> [1,2,3,4]\r\n```\n", "before_files": [{"content": "\"\"\"\nMain entry point for the `cookiecutter` command.\n\nThe code in this module is also a good example of how to use Cookiecutter as a\nlibrary rather than a script.\n\"\"\"\nimport logging\nimport os\nimport re\nimport sys\nfrom copy import copy\n\nfrom cookiecutter.config import get_user_config\nfrom cookiecutter.exceptions import InvalidModeException\nfrom cookiecutter.generate import generate_context, generate_files\nfrom cookiecutter.prompt import prompt_for_config\nfrom cookiecutter.replay import dump, load\nfrom cookiecutter.repository import determine_repo_dir\nfrom cookiecutter.utils import rmtree\n\nlogger = logging.getLogger(__name__)\n\n\ndef cookiecutter(\n    template,\n    checkout=None,\n    no_input=False,\n    extra_context=None,\n    replay=None,\n    overwrite_if_exists=False,\n    output_dir='.',\n    config_file=None,\n    default_config=False,\n    password=None,\n    directory=None,\n    skip_if_file_exists=False,\n    accept_hooks=True,\n    keep_project_on_failure=False,\n):\n    \"\"\"\n    Run Cookiecutter just as if using it from the command line.\n\n    :param template: A directory containing a project template directory,\n        or a URL to a git repository.\n    :param checkout: The branch, tag or commit ID to checkout after clone.\n    :param no_input: Do not prompt for user input.\n        Use default values for template parameters taken from `cookiecutter.json`, user\n        config and `extra_dict`. Force a refresh of cached resources.\n    :param extra_context: A dictionary of context that overrides default\n        and user configuration.\n    :param replay: Do not prompt for input, instead read from saved json. If\n        ``True`` read from the ``replay_dir``.\n        if it exists\n    :param output_dir: Where to output the generated project dir into.\n    :param config_file: User configuration file path.\n    :param default_config: Use default values rather than a config file.\n    :param password: The password to use when extracting the repository.\n    :param directory: Relative path to a cookiecutter template in a repository.\n    :param accept_hooks: Accept pre and post hooks if set to `True`.\n    :param keep_project_on_failure: If `True` keep generated project directory even when\n        generation fails\n    \"\"\"\n    if replay and ((no_input is not False) or (extra_context is not None)):\n        err_msg = (\n            \"You can not use both replay and no_input or extra_context \"\n            \"at the same time.\"\n        )\n        raise InvalidModeException(err_msg)\n\n    config_dict = get_user_config(\n        config_file=config_file,\n        default_config=default_config,\n    )\n\n    repo_dir, cleanup = determine_repo_dir(\n        template=template,\n        abbreviations=config_dict['abbreviations'],\n        clone_to_dir=config_dict['cookiecutters_dir'],\n        checkout=checkout,\n        no_input=no_input,\n        password=password,\n        directory=directory,\n    )\n    import_patch = _patch_import_path_for_repo(repo_dir)\n\n    template_name = os.path.basename(os.path.abspath(repo_dir))\n\n    if replay:\n        with import_patch:\n            if isinstance(replay, bool):\n                context = load(config_dict['replay_dir'], template_name)\n            else:\n                path, template_name = os.path.split(os.path.splitext(replay)[0])\n                context = load(path, template_name)\n    else:\n        context_file = os.path.join(repo_dir, 'cookiecutter.json')\n        logger.debug('context_file is %s', context_file)\n\n        context = generate_context(\n            context_file=context_file,\n            default_context=config_dict['default_context'],\n            extra_context=extra_context,\n        )\n\n        # prompt the user to manually configure at the command line.\n        # except when 'no-input' flag is set\n        with import_patch:\n            context['cookiecutter'] = prompt_for_config(context, no_input)\n\n        if \"template\" in context[\"cookiecutter\"]:\n            nested_template = re.search(\n                r'\\((.*?)\\)', context[\"cookiecutter\"][\"template\"]\n            ).group(1)\n            return cookiecutter(\n                template=os.path.join(template, nested_template),\n                checkout=checkout,\n                no_input=no_input,\n                extra_context=extra_context,\n                replay=replay,\n                overwrite_if_exists=overwrite_if_exists,\n                output_dir=output_dir,\n                config_file=config_file,\n                default_config=default_config,\n                password=password,\n                directory=directory,\n                skip_if_file_exists=skip_if_file_exists,\n                accept_hooks=accept_hooks,\n                keep_project_on_failure=keep_project_on_failure,\n            )\n\n        # include template dir or url in the context dict\n        context['cookiecutter']['_template'] = template\n\n        # include repo dir or url in the context dict\n        context['cookiecutter']['_repo_dir'] = repo_dir\n\n        # include output+dir in the context dict\n        context['cookiecutter']['_output_dir'] = os.path.abspath(output_dir)\n\n        dump(config_dict['replay_dir'], template_name, context)\n\n    # Create project from local context and project template.\n    with import_patch:\n        result = generate_files(\n            repo_dir=repo_dir,\n            context=context,\n            overwrite_if_exists=overwrite_if_exists,\n            skip_if_file_exists=skip_if_file_exists,\n            output_dir=output_dir,\n            accept_hooks=accept_hooks,\n            keep_project_on_failure=keep_project_on_failure,\n        )\n\n    # Cleanup (if required)\n    if cleanup:\n        rmtree(repo_dir)\n\n    return result\n\n\nclass _patch_import_path_for_repo:\n    def __init__(self, repo_dir):\n        self._repo_dir = repo_dir\n        self._path = None\n\n    def __enter__(self):\n        self._path = copy(sys.path)\n        sys.path.append(self._repo_dir)\n\n    def __exit__(self, type, value, traceback):\n        sys.path = self._path\n", "path": "cookiecutter/main.py"}], "after_files": [{"content": "\"\"\"\nMain entry point for the `cookiecutter` command.\n\nThe code in this module is also a good example of how to use Cookiecutter as a\nlibrary rather than a script.\n\"\"\"\nimport logging\nimport os\nimport re\nimport sys\nfrom copy import copy\n\nfrom cookiecutter.config import get_user_config\nfrom cookiecutter.exceptions import InvalidModeException\nfrom cookiecutter.generate import generate_context, generate_files\nfrom cookiecutter.prompt import prompt_for_config\nfrom cookiecutter.replay import dump, load\nfrom cookiecutter.repository import determine_repo_dir\nfrom cookiecutter.utils import rmtree\n\nlogger = logging.getLogger(__name__)\n\n\ndef cookiecutter(\n    template,\n    checkout=None,\n    no_input=False,\n    extra_context=None,\n    replay=None,\n    overwrite_if_exists=False,\n    output_dir='.',\n    config_file=None,\n    default_config=False,\n    password=None,\n    directory=None,\n    skip_if_file_exists=False,\n    accept_hooks=True,\n    keep_project_on_failure=False,\n):\n    \"\"\"\n    Run Cookiecutter just as if using it from the command line.\n\n    :param template: A directory containing a project template directory,\n        or a URL to a git repository.\n    :param checkout: The branch, tag or commit ID to checkout after clone.\n    :param no_input: Do not prompt for user input.\n        Use default values for template parameters taken from `cookiecutter.json`, user\n        config and `extra_dict`. Force a refresh of cached resources.\n    :param extra_context: A dictionary of context that overrides default\n        and user configuration.\n    :param replay: Do not prompt for input, instead read from saved json. If\n        ``True`` read from the ``replay_dir``.\n        if it exists\n    :param output_dir: Where to output the generated project dir into.\n    :param config_file: User configuration file path.\n    :param default_config: Use default values rather than a config file.\n    :param password: The password to use when extracting the repository.\n    :param directory: Relative path to a cookiecutter template in a repository.\n    :param accept_hooks: Accept pre and post hooks if set to `True`.\n    :param keep_project_on_failure: If `True` keep generated project directory even when\n        generation fails\n    \"\"\"\n    if replay and ((no_input is not False) or (extra_context is not None)):\n        err_msg = (\n            \"You can not use both replay and no_input or extra_context \"\n            \"at the same time.\"\n        )\n        raise InvalidModeException(err_msg)\n\n    config_dict = get_user_config(\n        config_file=config_file,\n        default_config=default_config,\n    )\n\n    repo_dir, cleanup = determine_repo_dir(\n        template=template,\n        abbreviations=config_dict['abbreviations'],\n        clone_to_dir=config_dict['cookiecutters_dir'],\n        checkout=checkout,\n        no_input=no_input,\n        password=password,\n        directory=directory,\n    )\n    import_patch = _patch_import_path_for_repo(repo_dir)\n\n    template_name = os.path.basename(os.path.abspath(repo_dir))\n\n    if replay:\n        with import_patch:\n            if isinstance(replay, bool):\n                context = load(config_dict['replay_dir'], template_name)\n            else:\n                path, template_name = os.path.split(os.path.splitext(replay)[0])\n                context = load(path, template_name)\n    else:\n        context_file = os.path.join(repo_dir, 'cookiecutter.json')\n        logger.debug('context_file is %s', context_file)\n\n        context = generate_context(\n            context_file=context_file,\n            default_context=config_dict['default_context'],\n            extra_context=extra_context,\n        )\n\n        # preserve the original cookiecutter options\n        context['_cookiecutter'] = context['cookiecutter']\n\n        # prompt the user to manually configure at the command line.\n        # except when 'no-input' flag is set\n        with import_patch:\n            context['cookiecutter'] = prompt_for_config(context, no_input)\n\n        if \"template\" in context[\"cookiecutter\"]:\n            nested_template = re.search(\n                r'\\((.*?)\\)', context[\"cookiecutter\"][\"template\"]\n            ).group(1)\n            return cookiecutter(\n                template=os.path.join(template, nested_template),\n                checkout=checkout,\n                no_input=no_input,\n                extra_context=extra_context,\n                replay=replay,\n                overwrite_if_exists=overwrite_if_exists,\n                output_dir=output_dir,\n                config_file=config_file,\n                default_config=default_config,\n                password=password,\n                directory=directory,\n                skip_if_file_exists=skip_if_file_exists,\n                accept_hooks=accept_hooks,\n                keep_project_on_failure=keep_project_on_failure,\n            )\n\n        # include template dir or url in the context dict\n        context['cookiecutter']['_template'] = template\n\n        # include repo dir or url in the context dict\n        context['cookiecutter']['_repo_dir'] = repo_dir\n\n        # include output+dir in the context dict\n        context['cookiecutter']['_output_dir'] = os.path.abspath(output_dir)\n\n        dump(config_dict['replay_dir'], template_name, context)\n\n    # Create project from local context and project template.\n    with import_patch:\n        result = generate_files(\n            repo_dir=repo_dir,\n            context=context,\n            overwrite_if_exists=overwrite_if_exists,\n            skip_if_file_exists=skip_if_file_exists,\n            output_dir=output_dir,\n            accept_hooks=accept_hooks,\n            keep_project_on_failure=keep_project_on_failure,\n        )\n\n    # Cleanup (if required)\n    if cleanup:\n        rmtree(repo_dir)\n\n    return result\n\n\nclass _patch_import_path_for_repo:\n    def __init__(self, repo_dir):\n        self._repo_dir = repo_dir\n        self._path = None\n\n    def __enter__(self):\n        self._path = copy(sys.path)\n        sys.path.append(self._repo_dir)\n\n    def __exit__(self, type, value, traceback):\n        sys.path = self._path\n", "path": "cookiecutter/main.py"}]}