SSON9 commited on
Commit
2754e05
·
verified ·
1 Parent(s): 7a9b40d

Add files using upload-large-folder tool

Browse files
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. README.md +127 -7
  3. Solar-Open-100B.png +0 -0
  4. chat_template.jinja +156 -0
  5. config.json +36 -0
  6. configuration_solar_open.py +235 -0
  7. generation_config.json +14 -0
  8. model-00001-of-00042.safetensors +3 -0
  9. model-00002-of-00042.safetensors +3 -0
  10. model-00003-of-00042.safetensors +3 -0
  11. model-00004-of-00042.safetensors +3 -0
  12. model-00006-of-00042.safetensors +3 -0
  13. model-00007-of-00042.safetensors +3 -0
  14. model-00008-of-00042.safetensors +3 -0
  15. model-00009-of-00042.safetensors +3 -0
  16. model-00011-of-00042.safetensors +3 -0
  17. model-00012-of-00042.safetensors +3 -0
  18. model-00013-of-00042.safetensors +3 -0
  19. model-00015-of-00042.safetensors +3 -0
  20. model-00016-of-00042.safetensors +3 -0
  21. model-00017-of-00042.safetensors +3 -0
  22. model-00018-of-00042.safetensors +3 -0
  23. model-00019-of-00042.safetensors +3 -0
  24. model-00021-of-00042.safetensors +3 -0
  25. model-00022-of-00042.safetensors +3 -0
  26. model-00023-of-00042.safetensors +3 -0
  27. model-00024-of-00042.safetensors +3 -0
  28. model-00025-of-00042.safetensors +3 -0
  29. model-00026-of-00042.safetensors +3 -0
  30. model-00029-of-00042.safetensors +3 -0
  31. model-00030-of-00042.safetensors +3 -0
  32. model-00031-of-00042.safetensors +3 -0
  33. model-00032-of-00042.safetensors +3 -0
  34. model-00033-of-00042.safetensors +3 -0
  35. model-00035-of-00042.safetensors +3 -0
  36. model-00036-of-00042.safetensors +3 -0
  37. model-00038-of-00042.safetensors +3 -0
  38. model-00039-of-00042.safetensors +3 -0
  39. model-00040-of-00042.safetensors +3 -0
  40. model-00041-of-00042.safetensors +3 -0
  41. model-00042-of-00042.safetensors +3 -0
  42. model.safetensors.index.json +0 -0
  43. modeling_solar_open.py +597 -0
  44. parallel_tool_call_logits_processor.py +104 -0
  45. solar_open_logits_processor.py +763 -0
  46. solar_open_reasoning_parser.py +351 -0
  47. solar_open_tool_parser.py +267 -0
  48. special_tokens_map.json +4006 -0
  49. tokenizer.json +3 -0
  50. tokenizer_config.json +0 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -12,15 +12,21 @@ tags:
12
  - llm
13
  ---
14
 
 
 
 
 
15
  # **Solar Open**
16
 
17
  **Solar Open** is Upstage's flagship **102B-parameter** large language model, trained **entirely from scratch** and released under the **Solar-Apache License 2.0** (see [LICENSE](./LICENSE)). As a **Mixture-of-Experts (MoE)** architecture, it delivers enterprise-grade performance in reasoning, instruction-following, and agentic capabilities—all while prioritizing transparency and customization for the open-source community.
18
 
19
  ## Highlights
 
20
  * **MoE Architecture (102B / 12B):** Built on a Mixture-of-Experts architecture with **102B total / 12B active parameters**. This design delivers the knowledge depth of a massive model with the inference speed and cost-efficiency of a much smaller model.
21
  * **Massive Training Scale:** Pre-trained on **19.7 trillion tokens**, ensuring broad knowledge coverage and robust reasoning capabilities across various domains.
22
 
23
  ## Model Overview
 
24
  * **Model Name:** Solar Open 100B
25
  * **Hugging Face ID:** Upstage/Solar-Open-100B
26
  * **Architecture:** Mixture-of-Experts (MoE)
@@ -31,20 +37,135 @@ tags:
31
  * **Context Length:** 128k
32
  * **Training Hardware:** NVIDIA B200 GPUs
33
  * **License:** **Solar-Apache License 2.0** (See [LICENSE](./LICENSE))
 
 
34
 
35
  ## Performance
36
- *Detailed benchmarks and performance metrics will be updated upon the official release on December 31, 2025.*
37
 
38
- ## Quickstart
39
- *Python code snippets and usage examples will be available upon the official release on December 31, 2025.*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
  ## Public API Access
42
- The official API service for Solar Open is scheduled to launch publicly on **December 31, 2025**.
43
- * **Access:** Upstage Console (Available starting Dec 31, 2025)
44
- * **Documentation:** Upstage Console (Available starting Dec 31, 2025)
 
 
45
 
46
  ## Citation
 
47
  If you use Solar Open in your research, please cite:
 
48
  ```bibtex
49
  @misc{solar-open-2025,
50
  title={Solar Open: Scaling Upstage's LLM Capabilities with MoE},
@@ -53,4 +174,3 @@ If you use Solar Open in your research, please cite:
53
  url={https://huggingface.co/Upstage/Solar-Open-100B}
54
  }
55
  ```
56
-
 
12
  - llm
13
  ---
14
 
15
+ <p align="center">
16
+ <img src="./Solar-Open-100B.png" alt="Solar Open Model" width="100%">
17
+ </p>
18
+
19
  # **Solar Open**
20
 
21
  **Solar Open** is Upstage's flagship **102B-parameter** large language model, trained **entirely from scratch** and released under the **Solar-Apache License 2.0** (see [LICENSE](./LICENSE)). As a **Mixture-of-Experts (MoE)** architecture, it delivers enterprise-grade performance in reasoning, instruction-following, and agentic capabilities—all while prioritizing transparency and customization for the open-source community.
22
 
23
  ## Highlights
24
+
25
  * **MoE Architecture (102B / 12B):** Built on a Mixture-of-Experts architecture with **102B total / 12B active parameters**. This design delivers the knowledge depth of a massive model with the inference speed and cost-efficiency of a much smaller model.
26
  * **Massive Training Scale:** Pre-trained on **19.7 trillion tokens**, ensuring broad knowledge coverage and robust reasoning capabilities across various domains.
27
 
28
  ## Model Overview
29
+
30
  * **Model Name:** Solar Open 100B
31
  * **Hugging Face ID:** Upstage/Solar-Open-100B
32
  * **Architecture:** Mixture-of-Experts (MoE)
 
37
  * **Context Length:** 128k
38
  * **Training Hardware:** NVIDIA B200 GPUs
39
  * **License:** **Solar-Apache License 2.0** (See [LICENSE](./LICENSE))
40
+ * **Hardware Requirements:**
41
+ * **Minimum:** 4x NVIDIA A100 (80GB)
42
 
43
  ## Performance
 
44
 
45
+ TBA
46
+
47
+ ## Inference Quickstart
48
+
49
+ We recommend using the following generation parameters:
50
+
51
+ ```
52
+ temperature=0.8
53
+ top_p=0.95
54
+ top_k=50
55
+ ```
56
+
57
+ ### Transformers
58
+
59
+ Install the required dependencies:
60
+
61
+ ```bash
62
+ pip install -U transformers kernels torch accelerate
63
+ ```
64
+
65
+ Run inference with the following code:
66
+
67
+ ```python
68
+ import torch
69
+ from transformers import AutoModelForCausalLM, AutoTokenizer
70
+
71
+ MODEL_ID = "upstage/Solar-Open-100B"
72
+
73
+ # Load model and tokenizer
74
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
75
+
76
+ model = AutoModelForCausalLM.from_pretrained(
77
+ pretrained_model_name_or_path=MODEL_ID,
78
+ torch_dtype=torch.bfloat16,
79
+ device_map="auto",
80
+ )
81
+
82
+ # Prepare input
83
+ messages = [{"role": "user", "content": "who are you?"}]
84
+ inputs = tokenizer.apply_chat_template(
85
+ messages,
86
+ tokenize=True,
87
+ add_generation_prompt=True,
88
+ return_dict=True,
89
+ return_tensors="pt",
90
+ )
91
+ inputs = inputs.to(model.device)
92
+
93
+ # Generate response
94
+ generated_ids = model.generate(
95
+ **inputs,
96
+ max_new_tokens=4096,
97
+ temperature=0.8,
98
+ top_p=0.95,
99
+ top_k=50,
100
+ do_sample=True,
101
+ trust_remote_code=True,
102
+ )
103
+ generated_text = tokenizer.decode(generated_ids[0][inputs.input_ids.shape[1] :])
104
+ print(generated_text)
105
+ ```
106
+
107
+ ### vLLM
108
+
109
+ #### Option 1: Using Docker (Highly Recommended)
110
+ Docker is the **recommended deployment method** for running `Solar-Open-100B`.
111
+
112
+ ```bash
113
+ # For 8 GPUs
114
+ docker run --gpus all \
115
+ --ipc=host \
116
+ -p 8000:8000 \
117
+ upstage/vllm-solar-open:latest \
118
+ upstage/Solar-Open-100B \
119
+ --trust-remote-code \
120
+ --enable-auto-tool-choice \
121
+ --tool-call-parser solar_open \
122
+ --reasoning-parser solar_open \
123
+ --logits-processors vllm.model_executor.models.parallel_tool_call_logits_processor:ParallelToolCallLogitsProcessor \
124
+ --logits-processors vllm.model_executor.models.solar_open_logits_processor:SolarOpenTemplateLogitsProcessor \
125
+ --tensor-parallel-size 8
126
+ ```
127
+
128
+ #### Option 2: Installing from Source
129
+ For development, debugging, custom modifications or offline inference, Solar Open can also be run
130
+ using a source installation of vLLM. We recommend using **[uv](https://docs.astral.sh/uv/)** for environment
131
+ management and dependency resolution.
132
+
133
+ Create and activate a Python virtual environment
134
+ ```bash
135
+ uv venv --python 3.12 --seed
136
+ source .venv/bin/activate
137
+ ```
138
+
139
+ Install Solar Open's optimized vLLM
140
+ ```bash
141
+ VLLM_PRECOMPILED_WHEEL_LOCATION="https://github.com/vllm-project/vllm/releases/download/v0.12.0/vllm-0.12.0-cp38-abi3-manylinux_2_31_x86_64.whl" \
142
+ VLLM_USE_PRECOMPILED=1 \
143
+ uv pip install git+https://github.com/UpstageAI/[email protected]
144
+ ```
145
+
146
+ Start the vLLM server (For 8 GPUs)
147
+ ```bash
148
+ vllm serve upstage/Solar-Open-100B \
149
+ --trust-remote-code \
150
+ --enable-auto-tool-choice \
151
+ --tool-call-parser solar_open \
152
+ --reasoning-parser solar_open \
153
+ --logits-processors vllm.model_executor.models.parallel_tool_call_logits_processor:ParallelToolCallLogitsProcessor \
154
+ --logits-processors vllm.model_executor.models.solar_open_logits_processor:SolarOpenTemplateLogitsProcessor \
155
+ --tensor-parallel-size 8
156
+ ```
157
 
158
  ## Public API Access
159
+
160
+ The official API service for Solar Open is scheduled to launch publicly on **January**.
161
+
162
+ * **Access:** Upstage Console (TBA)
163
+ * **Documentation:** Upstage Console (TBA)
164
 
165
  ## Citation
166
+
167
  If you use Solar Open in your research, please cite:
168
+
169
  ```bibtex
170
  @misc{solar-open-2025,
171
  title={Solar Open: Scaling Upstage's LLM Capabilities with MoE},
 
174
  url={https://huggingface.co/Upstage/Solar-Open-100B}
175
  }
176
  ```
 
Solar-Open-100B.png ADDED
chat_template.jinja ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {#- ======== Template Parameters ======== #}
2
+ {%- set add_generation_prompt = add_generation_prompt if add_generation_prompt is defined else true %}
3
+ {%- set default_system_prompt = default_system_prompt if default_system_prompt is defined else true %}
4
+ {%- set reasoning_effort = reasoning_effort if reasoning_effort is defined else "high" %}
5
+ {%- set think_render_option = think_render_option if think_render_option is defined else "lastthink" %}
6
+
7
+ {#- ======== System Block State ======== #}
8
+ {%- set sys_ns = namespace(is_first_block=true) -%}
9
+
10
+ {#- ======== Find last user message index ======== #}
11
+ {%- set last_user_idx = namespace(value=-1) -%}
12
+ {%- for message in messages -%}
13
+ {%- if message.role == 'user' -%}
14
+ {%- set last_user_idx.value = loop.index0 -%}
15
+ {%- endif -%}
16
+ {%- endfor -%}
17
+
18
+ {#- ======== System messages renderers ======== #}
19
+ {%- macro render_system_message(user_system_messages) %}
20
+ {%- if default_system_prompt %}
21
+ {%- if not sys_ns.is_first_block %}{{- "\n\n" }}{%- endif %}
22
+ {%- set sys_ns.is_first_block = false %}
23
+ {{- "## Provider System Prompt\n\nYou are Solar Open 100B, a large language model trained by Upstage AI, a Korean startup. Your knowledge cutoff is 2025-07. The current date is " + strftime_now("%Y-%m-%d") + "." }}
24
+ {%- endif -%}
25
+ {%- if user_system_messages %}
26
+ {%- if not sys_ns.is_first_block %}{{- "\n\n" }}{%- endif %}
27
+ {%- set sys_ns.is_first_block = false %}
28
+ {{- "## System Prompt" }}
29
+ {%- for system_message in user_system_messages %}
30
+ {{- "\n\n" }}
31
+ {{- system_message }}
32
+ {%- endfor %}
33
+ {%- endif -%}
34
+ {%- endmacro %}
35
+
36
+ {%- macro render_tool_instruction(tools) %}
37
+ {%- if not sys_ns.is_first_block %}{{- "\n\n" }}{%- endif %}
38
+ {%- set sys_ns.is_first_block = false %}
39
+ {{- "## Tools\n\n### Tool Call Instruction" }}
40
+ {{- "\nYou may invoke one or more tools to assist with the user's query. Available tools are provided in JSON Schema format: <|tools:begin|><|tool:begin|><tools-json-object><|tool:end|>...<|tools:end|>\n" }}
41
+ {{- "\n### Available Tools\n" }}
42
+ {{- "<|tools:begin|>" }}
43
+ {%- for tool in tools %}
44
+ {{- "<|tool:begin|>" }}
45
+ {{- tool.function | tojson }}
46
+ {{- "<|tool:end|>" }}
47
+ {%- endfor %}
48
+ {{- "<|tools:end|>\n" }}
49
+ {{- "\n### Tool Call Format\n" }}
50
+ {{- "For each tool call, return a JSON object with the following structure, enclosed within <|tool_call:begin|> and <|tool_call:end|> tags: \n<|tool_call:begin|><tool-call-id><|tool_call:name|><tool-name><|tool_call:args|><args-json-object><|tool_call:end|>\n" }}
51
+ {{- "- The <tool-call-id> must be a randomly generated string consisting of 10 lowercase letters (a-z) and/or digits (0-9) (e.g., a1b2c3d4e5)\n" }}
52
+ {{- "\n### Tool Response Format\n" }}
53
+ {{- "Each tool is responded by `tool` with the following structure:\n<|tool_response:id|><tool-call-id><|tool_response:name|><tool-name><|tool_response:result|><results><|tool_response:end|>\n" }}
54
+ {{- "- Ensure the <tool-call-id> matches the corresponding tool call" -}}
55
+ {%- endmacro %}
56
+
57
+ {%- macro render_json_response_format_instruction(response_format) %}
58
+ {%- if not sys_ns.is_first_block %}{{- "\n\n" }}{%- endif %}
59
+ {%- set sys_ns.is_first_block = false %}
60
+ {{- "## Output Format Constraint" }}
61
+ {{- "\n\nYour final response should follow the JSON schema: \n[Start of schema]" }}
62
+ {{- response_format }}
63
+ {{- "\n[End of schema]\nPlease ensure your answers adhere to this format and do not contain any unnecessary text." }}
64
+ {%- endmacro %}
65
+
66
+ {%- macro get_tool_name(messages, tool_call_id) %}
67
+ {%- for msg in messages -%}
68
+ {%- if msg.role == 'assistant' and msg.tool_calls -%}
69
+ {%- for tool_call in msg.tool_calls -%}
70
+ {%- if tool_call.id == tool_call_id -%}
71
+ {{- tool_call.function.name }}
72
+ {%- endif -%}
73
+ {%- endfor -%}
74
+ {%- endif -%}
75
+ {%- endfor -%}
76
+ {%- endmacro %}
77
+
78
+ {%- macro render_tool_arguments(tool_arguments) %}
79
+ {%- if tool_arguments is mapping -%}
80
+ {{- tool_arguments | tojson }}
81
+ {%- else -%}
82
+ {{- tool_arguments }}
83
+ {%- endif -%}
84
+ {%- endmacro %}
85
+
86
+ {#- ======== Render system message ======== #}
87
+ {%- set ns = namespace(system_messages=[]) -%}
88
+ {%- for message in messages -%}
89
+ {%- if message.role == 'system' -%}
90
+ {%- set ns.system_messages = ns.system_messages + [message.content] -%}
91
+ {%- endif -%}
92
+ {%- endfor -%}
93
+
94
+ {%- if ns.system_messages or default_system_prompt or tools or response_format -%}
95
+ {{- "<|begin|>system<|content|>" }}
96
+ {{- render_system_message(ns.system_messages) }}
97
+ {%- if tools -%}
98
+ {{- render_tool_instruction(tools) }}
99
+ {%- endif %}
100
+ {%- if response_format -%}
101
+ {{- render_json_response_format_instruction(response_format) }}
102
+ {%- endif %}
103
+ {{- "<|end|>" }}
104
+ {%- endif -%}
105
+
106
+ {#- ======== Render main messages ======== #}
107
+ {%- for message in messages -%}
108
+ {%- if message.role == 'user' -%}
109
+ {{- "<|begin|>user<|content|>" + message.content + "<|end|>" }}
110
+ {%- elif message.role == 'tool' -%}
111
+ {%- set prev_is_tool = loop.index0 > 0 and messages[loop.index0 - 1].role == 'tool' -%}
112
+ {%- set next_is_tool = loop.index0 < (messages | length - 1) and messages[loop.index0 + 1].role == 'tool' -%}
113
+ {%- if not prev_is_tool -%}
114
+ {{- "<|begin|>tool<|tool_response|>" }}
115
+ {%- endif -%}
116
+ {{- "<|tool_response:begin|>" + message.tool_call_id + "<|tool_response:name|>" }}
117
+ {{- get_tool_name(messages, message.tool_call_id) }}
118
+ {{- "<|tool_response:result|>" }}
119
+ {{- message.content }}
120
+ {{- "<|tool_response:end|>" }}
121
+ {%- if not next_is_tool -%}
122
+ {{- "<|end|>" }}
123
+ {%- endif -%}
124
+ {%- elif message.role == 'assistant' -%}
125
+ {#- ======== Assistant Thinking ======== #}
126
+ {%- if think_render_option == "all" -%}
127
+ {%- if message.reasoning -%}
128
+ {{- "<|begin|>assistant<|think|>" + message.reasoning + "<|end|>" }}
129
+ {%- endif -%}
130
+ {%- elif think_render_option == "lastthink" -%}
131
+ {%- if message.reasoning and loop.index0 > last_user_idx.value -%}
132
+ {{- "<|begin|>assistant<|think|>" + message.reasoning + "<|end|>" }}
133
+ {%- endif -%}
134
+ {%- endif -%}
135
+
136
+ {#- ======== Assistant Messages ======== #}
137
+ {%- if message.tool_calls -%}
138
+ {{- "<|begin|>assistant<|tool_calls|>" }}
139
+ {%- for tool_call in message.tool_calls -%}
140
+ {{- "<|tool_call:begin|>" + tool_call.id +"<|tool_call:name|>" + tool_call.function.name + "<|tool_call:args|>" }}
141
+ {{- render_tool_arguments(tool_call.function.arguments) }}
142
+ {{- "<|tool_call:end|>" }}
143
+ {%- endfor -%}
144
+ {{- "<|calls|>" }}
145
+ {%- else -%}
146
+ {{- "<|begin|>assistant<|content|>" + message.content + "<|end|>" }}
147
+ {%- endif -%}
148
+ {%- endif -%}
149
+ {%- endfor -%}
150
+
151
+ {%- if add_generation_prompt -%}
152
+ {%- if reasoning_effort in ["low", "minimal"] -%}
153
+ {{- "<|begin|>assistant<|think|><|end|>" }}
154
+ {%- endif -%}
155
+ {{- "<|begin|>assistant" }}
156
+ {%- endif -%}
config.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "solar_open",
3
+ "architectures": [
4
+ "SolarOpenForCausalLM"
5
+ ],
6
+ "auto_map": {
7
+ "AutoConfig": "configuration_solar_open.SolarOpenConfig",
8
+ "AutoModel": "modeling_solar_open.SolarOpenModel",
9
+ "AutoModelForCausalLM": "modeling_solar_open.SolarOpenForCausalLM"
10
+ },
11
+ "pad_token_id": 2,
12
+ "bos_token_id": 1,
13
+ "eos_token_id": 2,
14
+ "partial_rotary_factor": 1.0,
15
+ "hidden_size": 4096,
16
+ "num_hidden_layers": 48,
17
+ "num_attention_heads": 64,
18
+ "head_dim": 128,
19
+ "num_key_value_heads": 8,
20
+ "vocab_size": 196608,
21
+ "intermediate_size": 10240,
22
+ "moe_intermediate_size": 1280,
23
+ "rms_norm_eps": 1e-05,
24
+ "rope_theta": 1000000,
25
+ "max_position_embeddings": 131072,
26
+ "n_routed_experts": 128,
27
+ "n_shared_experts": 1,
28
+ "norm_topk_prob": true,
29
+ "routed_scaling_factor": 1.0,
30
+ "num_experts_per_tok": 8,
31
+ "tie_word_embeddings": false,
32
+ "torch_dtype": "bfloat16",
33
+ "first_k_dense_replace": 0,
34
+ "use_cache": true,
35
+ "transformers_version": "4.57.1"
36
+ }
configuration_solar_open.py ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2025 Upstage AI. All rights reserved.
3
+ #
4
+ # Licensed under the Solar-Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://huggingface.co/upstage/Solar-Open-100B/blob/main/LICENSE
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from transformers.configuration_utils import PretrainedConfig
17
+ from transformers.modeling_rope_utils import rope_config_validation
18
+
19
+
20
+ class SolarOpenConfig(PretrainedConfig):
21
+ r"""
22
+ This is the configuration class to store the configuration of a [`SolarOpenModel`]. It is used to instantiate a
23
+ SolarOpen model according to the specified arguments, defining the model architecture.
24
+
25
+ Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the
26
+ documentation from [`PretrainedConfig`] for more information.
27
+
28
+
29
+ Args:
30
+ vocab_size (`int`, *optional*, defaults to 196608):
31
+ Vocabulary size of the SolarOpen model. Defines the number of different tokens that can be represented by the
32
+ `inputs_ids` passed when calling [`SolarOpenModel`]
33
+ hidden_size (`int`, *optional*, defaults to 4096):
34
+ Dimension of the hidden representations.
35
+ intermediate_size (`int`, *optional*, defaults to 10240):
36
+ Dimension of the MLP representations.
37
+ num_hidden_layers (`int`, *optional*, defaults to 48):
38
+ Number of hidden layers in the Transformer encoder.
39
+ num_attention_heads (`int`, *optional*, defaults to 64):
40
+ Number of attention heads for each attention layer in the Transformer encoder.
41
+ partial_rotary_factor (`float`, *optional*, defaults to 1.0):
42
+ The factor of the partial rotary position.
43
+ num_key_value_heads (`int`, *optional*, defaults to 8):
44
+ This is the number of key_value heads that should be used to implement Grouped Query Attention. If
45
+ `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if
46
+ `num_key_value_heads=1` the model will use Multi Query Attention (MQA) otherwise GQA is used. When
47
+ converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed
48
+ by meanpooling all the original heads within that group. For more details, check out [this
49
+ paper](https://huggingface.co/papers/2305.13245). If it is not specified, will default to `32`.
50
+
51
+ hidden_act (`str` or `function`, *optional*, defaults to `"silu"`):
52
+ The non-linear activation function (function or string) in the decoder.
53
+ max_position_embeddings (`int`, *optional*, defaults to 131072):
54
+ The maximum sequence length that this model might ever be used with.
55
+ initializer_range (`float`, *optional*, defaults to 0.02):
56
+ The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
57
+ rms_norm_eps (`float`, *optional*, defaults to 1e-05):
58
+ The epsilon used by the rms normalization layers.
59
+ use_cache (`bool`, *optional*, defaults to `True`):
60
+ Whether or not the model should return the last key/values attentions (not used by all models). Only
61
+ relevant if `config.is_decoder=True`.
62
+ tie_word_embeddings (`bool`, *optional*, defaults to `False`):
63
+ Whether the model's input and output word embeddings should be tied.
64
+ rope_theta (`float`, *optional*, defaults to 1000000.0):
65
+ The base period of the RoPE embeddings.
66
+ rope_scaling (`Dict`, *optional*):
67
+ Dictionary containing the scaling configuration for the RoPE embeddings. NOTE: if you apply new rope type
68
+ and you expect the model to work on longer `max_position_embeddings`, we recommend you to update this value
69
+ accordingly.
70
+ Expected contents:
71
+ `rope_type` (`str`):
72
+ The sub-variant of RoPE to use. Can be one of ['default', 'linear', 'dynamic', 'yarn', 'longrope',
73
+ 'llama3'], with 'default' being the original RoPE implementation.
74
+ `factor` (`float`, *optional*):
75
+ Used with all rope types except 'default'. The scaling factor to apply to the RoPE embeddings. In
76
+ most scaling types, a `factor` of x will enable the model to handle sequences of length x *
77
+ original maximum pre-trained length.
78
+ `original_max_position_embeddings` (`int`, *optional*):
79
+ Used with 'dynamic', 'longrope' and 'llama3'. The original max position embeddings used during
80
+ pretraining.
81
+ `attention_factor` (`float`, *optional*):
82
+ Used with 'yarn' and 'longrope'. The scaling factor to be applied on the attention
83
+ computation. If unspecified, it defaults to value recommended by the implementation, using the
84
+ `factor` field to infer the suggested value.
85
+ `beta_fast` (`float`, *optional*):
86
+ Only used with 'yarn'. Parameter to set the boundary for extrapolation (only) in the linear
87
+ ramp function. If unspecified, it defaults to 32.
88
+ `beta_slow` (`float`, *optional*):
89
+ Only used with 'yarn'. Parameter to set the boundary for interpolation (only) in the linear
90
+ ramp function. If unspecified, it defaults to 1.
91
+ `short_factor` (`list[float]`, *optional*):
92
+ Only used with 'longrope'. The scaling factor to be applied to short contexts (<
93
+ `original_max_position_embeddings`). Must be a list of numbers with the same length as the hidden
94
+ size divided by the number of attention heads divided by 2
95
+ `long_factor` (`list[float]`, *optional*):
96
+ Only used with 'longrope'. The scaling factor to be applied to long contexts (<
97
+ `original_max_position_embeddings`). Must be a list of numbers with the same length as the hidden
98
+ size divided by the number of attention heads divided by 2
99
+ `low_freq_factor` (`float`, *optional*):
100
+ Only used with 'llama3'. Scaling factor applied to low frequency components of the RoPE
101
+ `high_freq_factor` (`float`, *optional*):
102
+ Only used with 'llama3'. Scaling factor applied to high frequency components of the RoPE
103
+ attention_bias (`bool`, defaults to `False`, *optional*, defaults to `False`):
104
+ Whether to use a bias in the query, key, value and output projection layers during self-attention.
105
+ attention_dropout (`float`, *optional*, defaults to 0.0):
106
+ The dropout ratio for the attention probabilities.
107
+ moe_intermediate_size (`int`, *optional*, defaults to 1280):
108
+ Intermediate size of the routed expert.
109
+ num_experts_per_tok (`int`, *optional*, defaults to 8):
110
+ number of experts per token.
111
+ n_shared_experts (`int`, *optional*, defaults to 1):
112
+ Number of shared experts.
113
+ n_routed_experts (`int`, *optional*, defaults to 128):
114
+ Number of routed experts.
115
+ routed_scaling_factor (`float`, *optional*, defaults to 1.0):
116
+ Scaling factor or routed experts.
117
+ n_group (`int`, *optional*, defaults to 1):
118
+ Number of groups for routed experts.
119
+ topk_group (`int`, *optional*, defaults to 1):
120
+ Number of selected groups for each token(for each token, ensuring the selected experts is only within `topk_group` groups).
121
+ first_k_dense_replace (`int`, *optional*, defaults to 0):
122
+ Number of dense layers in shallow layers(embed->dense->dense->...->dense->moe->moe...->lm_head).
123
+ \--k dense layers--/
124
+ norm_topk_prob (`bool`, *optional*, defaults to `True`):
125
+ Whether to normalize the topk probabilities.
126
+ use_qk_norm (`bool`, *optional*, defaults to `False`):
127
+ Whether to use query-key normalization in the attention
128
+ ```python
129
+ >>> from transformers import SolarOpenModel, SolarOpenConfig
130
+
131
+ >>> # Initializing a SolarOpen style configuration
132
+ >>> configuration = SolarOpenConfig()
133
+
134
+ >>> # Initializing a model from the SolarOpen style configuration
135
+ >>> model = SolarOpenModel(configuration)
136
+
137
+ >>> # Accessing the model configuration
138
+ >>> configuration = model.config
139
+ ```"""
140
+
141
+ model_type = "solar_open"
142
+ keys_to_ignore_at_inference = ["past_key_values"]
143
+
144
+ # Default tensor parallel plan for base model `SolarOpen`
145
+ base_model_tp_plan = {
146
+ "layers.*.self_attn.q_proj": "colwise",
147
+ "layers.*.self_attn.k_proj": "colwise",
148
+ "layers.*.self_attn.v_proj": "colwise",
149
+ "layers.*.self_attn.o_proj": "rowwise",
150
+ "layers.*.mlp.experts.*.gate_proj": "colwise",
151
+ "layers.*.mlp.experts.*.up_proj": "colwise",
152
+ "layers.*.mlp.experts.*.down_proj": "rowwise",
153
+ "layers.*.mlp.gate_proj": "colwise",
154
+ "layers.*.mlp.up_proj": "colwise",
155
+ "layers.*.mlp.down_proj": "rowwise",
156
+ }
157
+ base_model_pp_plan = {
158
+ "embed_tokens": (["input_ids"], ["inputs_embeds"]),
159
+ "layers": (["hidden_states", "attention_mask"], ["hidden_states"]),
160
+ "norm": (["hidden_states"], ["hidden_states"]),
161
+ }
162
+
163
+ def __init__(
164
+ self,
165
+ vocab_size=196608,
166
+ hidden_size=4096,
167
+ intermediate_size=10240,
168
+ num_hidden_layers=48,
169
+ num_attention_heads=64,
170
+ partial_rotary_factor=1.0,
171
+ num_key_value_heads=8,
172
+ hidden_act="silu",
173
+ max_position_embeddings=131072,
174
+ initializer_range=0.02,
175
+ rms_norm_eps=1e-5,
176
+ use_cache=True,
177
+ tie_word_embeddings=False,
178
+ rope_theta=1000000.0,
179
+ rope_scaling=None,
180
+ attention_bias=False,
181
+ attention_dropout=0.0,
182
+ moe_intermediate_size=1280,
183
+ num_experts_per_tok=8,
184
+ n_shared_experts=1,
185
+ n_routed_experts=128,
186
+ routed_scaling_factor=1.0,
187
+ n_group=1,
188
+ topk_group=1,
189
+ first_k_dense_replace=0,
190
+ norm_topk_prob=True,
191
+ use_qk_norm=False,
192
+ **kwargs,
193
+ ):
194
+ self.vocab_size = vocab_size
195
+ self.max_position_embeddings = max_position_embeddings
196
+ self.hidden_size = hidden_size
197
+ self.intermediate_size = intermediate_size
198
+ self.num_hidden_layers = num_hidden_layers
199
+ self.num_attention_heads = num_attention_heads
200
+ self.partial_rotary_factor = partial_rotary_factor
201
+
202
+ self.num_key_value_heads = num_key_value_heads
203
+ self.hidden_act = hidden_act
204
+ self.initializer_range = initializer_range
205
+ self.rms_norm_eps = rms_norm_eps
206
+ self.use_cache = use_cache
207
+ self.rope_theta = rope_theta
208
+ self.rope_scaling = rope_scaling
209
+ self.attention_bias = attention_bias
210
+ self.attention_dropout = attention_dropout
211
+ # Validate the correctness of rotary position embeddings parameters
212
+ # BC: if there is a 'type' field, move it to 'rope_type'.
213
+ if self.rope_scaling is not None and "type" in self.rope_scaling:
214
+ self.rope_scaling["rope_type"] = self.rope_scaling["type"]
215
+ rope_config_validation(self)
216
+
217
+ # MoE arguments
218
+ self.moe_intermediate_size = moe_intermediate_size
219
+ self.num_experts_per_tok = num_experts_per_tok
220
+ self.n_group = n_group
221
+ self.topk_group = topk_group
222
+ self.n_shared_experts = n_shared_experts
223
+ self.n_routed_experts = n_routed_experts
224
+ self.routed_scaling_factor = routed_scaling_factor
225
+ self.first_k_dense_replace = first_k_dense_replace
226
+ self.norm_topk_prob = norm_topk_prob
227
+ self.use_qk_norm = use_qk_norm
228
+
229
+ super().__init__(
230
+ tie_word_embeddings=tie_word_embeddings,
231
+ **kwargs,
232
+ )
233
+
234
+
235
+ __all__ = ["SolarOpenConfig"]
generation_config.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "bos_token_id": 1,
4
+ "eos_token_id": [
5
+ 2,
6
+ 24,
7
+ 25
8
+ ],
9
+ "pad_token_id": 2,
10
+ "transformers_version": "4.57.3",
11
+ "do_sample": true,
12
+ "temperature": 0.8,
13
+ "top_p": 0.95
14
+ }
model-00001-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4a98bd68b463f70940147dd8bb2c5a4d77030b03b2f6a49849e02759fba77258
3
+ size 4991260640
model-00002-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6fab47aa2ee1f1a044879966105994c828252a80dfdd4b4ed920b2733ac44b51
3
+ size 4996539840
model-00003-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1b17e454850b15338a5bbe4f261d1d7e3da42d0a604a111cb0aa553428e9c4b4
3
+ size 4991312808
model-00004-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a7dfe8c3397007b3b2a890abcbe964aebdb4220748b910149d27917fb3e1ccd5
3
+ size 4996539768
model-00006-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:265ff7268359d39fb9e2b35983d7e11310554a7c57550f3068fd2db581b67c12
3
+ size 4996539768
model-00007-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:19bc5d9bd6a5a2b543aa33649b0c4a0e122e8606c2f9b9abdd4b58740d90ee57
3
+ size 4996539824
model-00008-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6112861c099b0316419f15b07183561875245515e6a8031a5b80339b60657425
3
+ size 4991312840
model-00009-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7bb1beb35b5a0d9ea751aae97ecc1f6f832aac26cfe96894df93dbfcedb44744
3
+ size 4996539888
model-00011-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5e6abb9c376ad675b0a88375201764e508e28f982fd57a4f0a8b712c91896f72
3
+ size 4996540240
model-00012-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:855c7e66c00653968a54bf48fc01f7233e8f6fc0b75a3f6cd6187c0ce296a47b
3
+ size 4996540272
model-00013-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b212bb02f6d1a17487e923f58875f62144f7b0b032da8cdc52f10b85420d0080
3
+ size 4991313360
model-00015-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:992fd054fb80d3c4e987cfa6e477bc041905b19811effd293cc62e8da8262168
3
+ size 4996540240
model-00016-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0ecac230f37da8f0592c098bd78396a7c6902ead5f33d621dad721b255fb77c3
3
+ size 4996540240
model-00017-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:df70d3b2014e713eb6b693fabf9e0b09fd8ae6739816e3c9195a2ac86cbfa864
3
+ size 4996540240
model-00018-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:28ef75d0853bd7fe151d896ce376ee5ddbd4f58e06e5186a2d7955d115491c99
3
+ size 4996540312
model-00019-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52c48d73de1f4622588886fb176cee26e7d0611bf4d65fbcd584f4a45246a8fb
3
+ size 4991313280
model-00021-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:000be0d110f9120b3996041af1d88aef505e4b86c91adbcc51fd6cf746b2d5cc
3
+ size 4996540240
model-00022-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c697cc932f5407a194b6383e4353efa91053d755ee19cfd22f542b7cd73e8b59
3
+ size 4996540240
model-00023-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6589f63dac63abeaa54a235af875d394770ffb6b501e8fdb8f198fa8fd940fa1
3
+ size 4996540288
model-00024-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2f042e2c4f4ff8dbb811b6f7822b35866e622ba6d4ad2e2bca28cfe339b11031
3
+ size 4991313312
model-00025-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2bae7856b4da982f6098700f74ba56bdcedf728dcaa093db53800aad2ae43350
3
+ size 4996540232
model-00026-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:06d2415594afbbddb04752d6402affb69be6b5532ad11f8a74eeca0990bb555f
3
+ size 4996540240
model-00029-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f7ddf612c3b21c1ac0a30da4c36205f5f25373829ab80163b2f8dbb03f00f118
3
+ size 4966147928
model-00030-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3c030092be2eb02aa5557a6330a376abe01fe4af209e25009c4aa68fb64e891d
3
+ size 4990247992
model-00031-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8381350ff935fb54f7d0355a282b3a6f44fec04b27f1cad459b5d2c970e9d9ba
3
+ size 4996540240
model-00032-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:590223701b27e23047f439ee9411806017702a2decfff0369903232c5a006df7
3
+ size 4996540240
model-00033-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:15a52dcc93ff9d59e730b6a0175857ad6d9d539db93fa38771dafd9f5e79535b
3
+ size 4996540240
model-00035-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c2a024c8408367564ee6361f2a79d7b3d226dc8092cf0228350377d6574f4899
3
+ size 4991313288
model-00036-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0c76c59609ff49116ea7c6e840a436bb6ffca4aaef9a69147867284eccdbe3f6
3
+ size 4996540240
model-00038-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d5e8778d02d4ecc69dcddb89a67d037a4fe766bf8e275e7d7f849b7480d0c111
3
+ size 4996540240
model-00039-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5eeee9ba7ca105fb9dc3af07dcb6d935eae9c8d2c26d2f455e6e028c597abe78
3
+ size 4996540280
model-00040-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0bd671a588466b1eeaa9f46e3c8c0a0a352495cde12ff13b4d700cf663b8c88d
3
+ size 4991313336
model-00041-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6e5a3f37a74ac35ecce1a427ae4791820a168dec32016511d8d50344c4409f1d
3
+ size 3912309328
model-00042-of-00042.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9742b5e5f3945b0705b4e852072f39d4fd65aa6b3472dbc1a115f0778d160c1b
3
+ size 1610612864
model.safetensors.index.json ADDED
The diff for this file is too large to render. See raw diff
 
modeling_solar_open.py ADDED
@@ -0,0 +1,597 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2025 Upstage AI. All rights reserved.
3
+ #
4
+ # Licensed under the Solar-Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://huggingface.co/upstage/Solar-Open-100B/blob/main/LICENSE
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import Callable, Optional, Union
17
+
18
+ import torch
19
+ import torch.nn.functional as F
20
+ from torch import nn
21
+
22
+ from transformers.activations import ACT2FN
23
+ from transformers.cache_utils import Cache, DynamicCache
24
+ from transformers.generation import GenerationMixin
25
+ from transformers.integrations import use_kernel_forward_from_hub
26
+ from transformers.masking_utils import create_causal_mask
27
+ from transformers.modeling_flash_attention_utils import FlashAttentionKwargs
28
+ from transformers.modeling_layers import GradientCheckpointingLayer
29
+ from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast
30
+ from transformers.modeling_rope_utils import ROPE_INIT_FUNCTIONS, dynamic_rope_update
31
+ from transformers.modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel
32
+ from transformers.processing_utils import Unpack
33
+ from transformers.utils import TransformersKwargs, auto_docstring, can_return_tuple
34
+ from transformers.utils.deprecation import deprecate_kwarg
35
+ from transformers.utils.generic import check_model_inputs
36
+ from .configuration_solar_open import SolarOpenConfig
37
+
38
+
39
+ def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:
40
+ """
41
+ This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
42
+ num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
43
+ """
44
+ batch, num_key_value_heads, slen, head_dim = hidden_states.shape
45
+ if n_rep == 1:
46
+ return hidden_states
47
+ hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)
48
+ return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)
49
+
50
+
51
+ def eager_attention_forward(
52
+ module: nn.Module,
53
+ query: torch.Tensor,
54
+ key: torch.Tensor,
55
+ value: torch.Tensor,
56
+ attention_mask: Optional[torch.Tensor],
57
+ scaling: float,
58
+ dropout: float = 0.0,
59
+ **kwargs: Unpack[TransformersKwargs],
60
+ ):
61
+ key_states = repeat_kv(key, module.num_key_value_groups)
62
+ value_states = repeat_kv(value, module.num_key_value_groups)
63
+
64
+ attn_weights = torch.matmul(query, key_states.transpose(2, 3)) * scaling
65
+ if attention_mask is not None:
66
+ causal_mask = attention_mask[:, :, :, : key_states.shape[-2]]
67
+ attn_weights = attn_weights + causal_mask
68
+
69
+ attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query.dtype)
70
+ attn_weights = nn.functional.dropout(attn_weights, p=dropout, training=module.training)
71
+ attn_output = torch.matmul(attn_weights, value_states)
72
+ attn_output = attn_output.transpose(1, 2).contiguous()
73
+
74
+ return attn_output, attn_weights
75
+
76
+
77
+ def rotate_half(x):
78
+ """Rotates half the hidden dims of the input."""
79
+ x1 = x[..., : x.shape[-1] // 2]
80
+ x2 = x[..., x.shape[-1] // 2 :]
81
+ return torch.cat((-x2, x1), dim=-1)
82
+
83
+
84
+ def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):
85
+ """Applies Rotary Position Embedding to the query and key tensors.
86
+
87
+ Args:
88
+ q (`torch.Tensor`): The query tensor.
89
+ k (`torch.Tensor`): The key tensor.
90
+ cos (`torch.Tensor`): The cosine part of the rotary embedding.
91
+ sin (`torch.Tensor`): The sine part of the rotary embedding.
92
+ position_ids (`torch.Tensor`, *optional*):
93
+ Deprecated and unused.
94
+ unsqueeze_dim (`int`, *optional*, defaults to 1):
95
+ The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
96
+ sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
97
+ that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
98
+ k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
99
+ cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
100
+ the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
101
+ Returns:
102
+ `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
103
+ """
104
+ cos = cos.unsqueeze(unsqueeze_dim)
105
+ sin = sin.unsqueeze(unsqueeze_dim)
106
+
107
+ # Keep half or full tensor for later concatenation
108
+ rotary_dim = cos.shape[-1]
109
+ q_rot, q_pass = q[..., :rotary_dim], q[..., rotary_dim:]
110
+ k_rot, k_pass = k[..., :rotary_dim], k[..., rotary_dim:]
111
+
112
+ # Apply rotary embeddings on the first half or full tensor
113
+ q_embed = (q_rot * cos) + (rotate_half(q_rot) * sin)
114
+ k_embed = (k_rot * cos) + (rotate_half(k_rot) * sin)
115
+
116
+ # Concatenate back to full shape
117
+ q_embed = torch.cat([q_embed, q_pass], dim=-1)
118
+ k_embed = torch.cat([k_embed, k_pass], dim=-1)
119
+ return q_embed, k_embed
120
+
121
+
122
+ class SolarOpenAttention(nn.Module):
123
+ """Multi-headed attention from 'Attention Is All You Need' paper"""
124
+
125
+ def __init__(self, config: SolarOpenConfig, layer_idx: Optional[int] = None):
126
+ super().__init__()
127
+ self.config = config
128
+ self.layer_idx = layer_idx
129
+ self.head_dim = getattr(config, "head_dim", config.hidden_size // config.num_attention_heads)
130
+ self.num_key_value_groups = config.num_attention_heads // config.num_key_value_heads
131
+ self.scaling = self.head_dim**-0.5
132
+ self.rope_scaling = config.rope_scaling
133
+ self.attention_dropout = config.attention_dropout
134
+ self.is_causal = True
135
+
136
+ self.q_proj = nn.Linear(
137
+ config.hidden_size, config.num_attention_heads * self.head_dim, bias=config.attention_bias
138
+ )
139
+ self.k_proj = nn.Linear(
140
+ config.hidden_size, config.num_key_value_heads * self.head_dim, bias=config.attention_bias
141
+ )
142
+ self.v_proj = nn.Linear(
143
+ config.hidden_size, config.num_key_value_heads * self.head_dim, bias=config.attention_bias
144
+ )
145
+ self.o_proj = nn.Linear(config.num_attention_heads * self.head_dim, config.hidden_size, bias=False)
146
+ self.use_qk_norm = config.use_qk_norm
147
+ if self.use_qk_norm:
148
+ self.q_norm = SolarOpenRMSNorm(self.head_dim, eps=config.rms_norm_eps)
149
+ self.k_norm = SolarOpenRMSNorm(self.head_dim, eps=config.rms_norm_eps)
150
+
151
+ @deprecate_kwarg("past_key_value", new_name="past_key_values", version="4.58")
152
+ def forward(
153
+ self,
154
+ hidden_states: torch.Tensor,
155
+ position_embeddings: tuple[torch.Tensor, torch.Tensor],
156
+ attention_mask: Optional[torch.Tensor],
157
+ past_key_values: Optional[Cache] = None,
158
+ cache_position: Optional[torch.LongTensor] = None,
159
+ **kwargs: Unpack[FlashAttentionKwargs],
160
+ ) -> tuple[torch.Tensor, Optional[torch.Tensor]]:
161
+ input_shape = hidden_states.shape[:-1]
162
+ hidden_shape = (*input_shape, -1, self.head_dim)
163
+
164
+ query_states = self.q_proj(hidden_states).view(hidden_shape)
165
+ key_states = self.k_proj(hidden_states).view(hidden_shape)
166
+ value_states = self.v_proj(hidden_states).view(hidden_shape)
167
+
168
+ if self.use_qk_norm: # main diff from Llama
169
+ query_states = self.q_norm(query_states)
170
+ key_states = self.k_norm(key_states)
171
+
172
+ query_states = query_states.transpose(1, 2)
173
+ key_states = key_states.transpose(1, 2)
174
+ value_states = value_states.transpose(1, 2)
175
+
176
+ cos, sin = position_embeddings
177
+ query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)
178
+
179
+ if past_key_values is not None:
180
+ # sin and cos are specific to RoPE models; position_ids needed for the static cache
181
+ cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}
182
+ key_states, value_states = past_key_values.update(key_states, value_states, self.layer_idx, cache_kwargs)
183
+
184
+ attention_interface: Callable = eager_attention_forward
185
+ if self.config._attn_implementation != "eager":
186
+ attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation]
187
+
188
+ attn_output, attn_weights = attention_interface(
189
+ self,
190
+ query_states,
191
+ key_states,
192
+ value_states,
193
+ attention_mask,
194
+ dropout=0.0 if not self.training else self.attention_dropout,
195
+ scaling=self.scaling,
196
+ **kwargs,
197
+ )
198
+
199
+ attn_output = attn_output.reshape(*input_shape, -1).contiguous()
200
+ attn_output = self.o_proj(attn_output)
201
+ return attn_output, attn_weights
202
+
203
+
204
+ class SolarOpenMLP(nn.Module):
205
+ def __init__(self, config, hidden_size=None, intermediate_size=None):
206
+ super().__init__()
207
+ self.config = config
208
+ self.hidden_size = config.hidden_size if hidden_size is None else hidden_size
209
+ self.intermediate_size = config.intermediate_size if intermediate_size is None else intermediate_size
210
+
211
+ self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False)
212
+ self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False)
213
+ self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False)
214
+ self.act_fn = ACT2FN[config.hidden_act]
215
+
216
+ def forward(self, x):
217
+ down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
218
+ return down_proj
219
+
220
+
221
+ class SolarOpenTopkRouter(nn.Module):
222
+ def __init__(self, config: SolarOpenConfig):
223
+ super().__init__()
224
+ self.config = config
225
+ self.top_k = config.num_experts_per_tok
226
+ self.n_routed_experts = config.n_routed_experts
227
+ self.routed_scaling_factor = config.routed_scaling_factor
228
+ self.n_group = config.n_group
229
+ self.topk_group = config.topk_group
230
+ self.norm_topk_prob = config.norm_topk_prob
231
+
232
+ self.weight = nn.Parameter(torch.empty((self.n_routed_experts, config.hidden_size)))
233
+ self.e_score_correction_bias = nn.Parameter(
234
+ torch.zeros((self.n_routed_experts), dtype=torch.float32))
235
+
236
+ @torch.no_grad()
237
+ def get_topk_indices(self, scores):
238
+ scores_for_choice = scores.view(-1, self.n_routed_experts) + self.e_score_correction_bias.unsqueeze(0)
239
+ group_scores = (
240
+ scores_for_choice.view(-1, self.n_group, self.n_routed_experts // self.n_group)
241
+ .topk(2, dim=-1)[0]
242
+ .sum(dim=-1)
243
+ )
244
+ group_idx = torch.topk(group_scores, k=self.topk_group, dim=-1, sorted=False)[1]
245
+ group_mask = torch.zeros_like(group_scores)
246
+ group_mask.scatter_(1, group_idx, 1)
247
+ score_mask = (
248
+ group_mask.unsqueeze(-1)
249
+ .expand(-1, self.n_group, self.n_routed_experts // self.n_group)
250
+ .reshape(-1, self.n_routed_experts)
251
+ )
252
+ scores_for_choice = scores_for_choice.masked_fill(~score_mask.bool(), 0.0)
253
+ topk_indices = torch.topk(scores_for_choice, k=self.top_k, dim=-1, sorted=False)[1]
254
+ return topk_indices
255
+
256
+ def forward(self, hidden_states):
257
+ hidden_states = hidden_states.view(-1, self.config.hidden_size)
258
+ router_logits = F.linear(hidden_states.type(torch.float32), self.weight.type(torch.float32))
259
+ scores = router_logits.sigmoid()
260
+ topk_indices = self.get_topk_indices(scores)
261
+ topk_weights = scores.gather(1, topk_indices)
262
+ if self.norm_topk_prob:
263
+ denominator = topk_weights.sum(dim=-1, keepdim=True) + 1e-20
264
+ topk_weights /= denominator
265
+ topk_weights = topk_weights * self.routed_scaling_factor
266
+ return topk_indices, topk_weights
267
+
268
+
269
+ @use_kernel_forward_from_hub("RMSNorm")
270
+ class SolarOpenRMSNorm(nn.Module):
271
+ def __init__(self, hidden_size, eps=1e-6):
272
+ """
273
+ SolarOpenRMSNorm is equivalent to T5LayerNorm
274
+ """
275
+ super().__init__()
276
+ self.weight = nn.Parameter(torch.ones(hidden_size))
277
+ self.variance_epsilon = eps
278
+
279
+ def forward(self, hidden_states):
280
+ input_dtype = hidden_states.dtype
281
+ hidden_states = hidden_states.to(torch.float32)
282
+ variance = hidden_states.pow(2).mean(-1, keepdim=True)
283
+ hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
284
+ return self.weight * hidden_states.to(input_dtype)
285
+
286
+ def extra_repr(self):
287
+ return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"
288
+
289
+
290
+ class SolarOpenMoE(nn.Module):
291
+ """
292
+ A mixed expert module containing shared experts.
293
+ """
294
+
295
+ def __init__(self, config):
296
+ super().__init__()
297
+ self.config = config
298
+ self.experts = nn.ModuleList(
299
+ [
300
+ SolarOpenMLP(config, intermediate_size=config.moe_intermediate_size)
301
+ for _ in range(config.n_routed_experts)
302
+ ]
303
+ )
304
+ self.gate = SolarOpenTopkRouter(config)
305
+ self.shared_experts = SolarOpenMLP(
306
+ config=config, intermediate_size=config.moe_intermediate_size * config.n_shared_experts
307
+ )
308
+
309
+ @torch.compiler.disable()
310
+ def moe(self, hidden_states: torch.Tensor, topk_indices: torch.Tensor, topk_weights: torch.Tensor):
311
+ r"""
312
+ MoE forward pass that only executes selected experts.
313
+ Uses @torch.compiler.disable() to allow dynamic shape operations.
314
+ Requires --enforce-eager flag when serving with vLLM.
315
+ """
316
+ final_hidden_states = torch.zeros_like(hidden_states)
317
+
318
+ for expert_idx in range(len(self.experts)):
319
+ expert = self.experts[expert_idx]
320
+
321
+ # Find positions where this expert was selected
322
+ batch_idx, topk_pos = torch.where(topk_indices == expert_idx)
323
+
324
+ if batch_idx.numel() == 0:
325
+ continue
326
+
327
+ # Extract only the tokens routed to this expert
328
+ expert_input = hidden_states[batch_idx]
329
+ expert_output = expert(expert_input)
330
+
331
+ # Apply weights and accumulate results
332
+ weights = topk_weights[batch_idx, topk_pos].unsqueeze(-1)
333
+ final_hidden_states.index_add_(0, batch_idx, (expert_output * weights).to(hidden_states.dtype))
334
+
335
+ return final_hidden_states
336
+
337
+ def forward(self, hidden_states):
338
+ residuals = hidden_states
339
+ orig_shape = hidden_states.shape
340
+ topk_indices, topk_weights = self.gate(hidden_states)
341
+ hidden_states = hidden_states.view(-1, hidden_states.shape[-1])
342
+ hidden_states = self.moe(hidden_states, topk_indices, topk_weights).view(*orig_shape)
343
+ hidden_states = hidden_states + self.shared_experts(residuals)
344
+ return hidden_states
345
+
346
+
347
+ class SolarOpenDecoderLayer(GradientCheckpointingLayer):
348
+ def __init__(self, config: SolarOpenConfig, layer_idx: int):
349
+ super().__init__()
350
+ self.hidden_size = config.hidden_size
351
+
352
+ self.self_attn = SolarOpenAttention(config=config, layer_idx=layer_idx)
353
+
354
+ if layer_idx >= config.first_k_dense_replace:
355
+ self.mlp = SolarOpenMoE(config)
356
+ else:
357
+ self.mlp = SolarOpenMLP(config)
358
+
359
+ self.input_layernorm = SolarOpenRMSNorm(config.hidden_size, eps=config.rms_norm_eps)
360
+ self.post_attention_layernorm = SolarOpenRMSNorm(config.hidden_size, eps=config.rms_norm_eps)
361
+
362
+ @deprecate_kwarg("past_key_value", new_name="past_key_values", version="4.58")
363
+ def forward(
364
+ self,
365
+ hidden_states: torch.Tensor,
366
+ attention_mask: Optional[torch.Tensor] = None,
367
+ position_ids: Optional[torch.LongTensor] = None,
368
+ past_key_values: Optional[Cache] = None,
369
+ use_cache: Optional[bool] = False,
370
+ cache_position: Optional[torch.LongTensor] = None,
371
+ position_embeddings: Optional[tuple[torch.Tensor, torch.Tensor]] = None, # necessary, but kept here for BC
372
+ **kwargs: Unpack[TransformersKwargs],
373
+ ) -> torch.Tensor:
374
+ residual = hidden_states
375
+ hidden_states = self.input_layernorm(hidden_states)
376
+ # Self Attention
377
+ hidden_states, _ = self.self_attn(
378
+ hidden_states=hidden_states,
379
+ attention_mask=attention_mask,
380
+ position_ids=position_ids,
381
+ past_key_values=past_key_values,
382
+ use_cache=use_cache,
383
+ cache_position=cache_position,
384
+ position_embeddings=position_embeddings,
385
+ **kwargs,
386
+ )
387
+ hidden_states = residual + hidden_states
388
+
389
+ # Fully Connected
390
+ residual = hidden_states
391
+ hidden_states = self.post_attention_layernorm(hidden_states)
392
+ hidden_states = self.mlp(hidden_states)
393
+ hidden_states = residual + hidden_states
394
+ return hidden_states
395
+
396
+
397
+ @auto_docstring
398
+ class SolarOpenPreTrainedModel(PreTrainedModel):
399
+ config: SolarOpenConfig
400
+ base_model_prefix = "model"
401
+ supports_gradient_checkpointing = True
402
+ _no_split_modules = ["SolarOpenDecoderLayer"]
403
+ _skip_keys_device_placement = ["past_key_values"]
404
+ _supports_flash_attn = True
405
+ _supports_sdpa = True
406
+ _supports_flex_attn = True
407
+ _can_compile_fullgraph = False
408
+ _supports_attention_backend = True
409
+ _can_record_outputs = {
410
+ "hidden_states": SolarOpenDecoderLayer,
411
+ "attentions": SolarOpenAttention,
412
+ }
413
+
414
+ def _init_weights(self, module):
415
+ super()._init_weights(module)
416
+ if isinstance(module, SolarOpenTopkRouter):
417
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
418
+
419
+
420
+ class SolarOpenRotaryEmbedding(nn.Module):
421
+ inv_freq: torch.Tensor # fix linting for `register_buffer`
422
+
423
+ def __init__(self, config: SolarOpenConfig, device=None):
424
+ super().__init__()
425
+ # BC: "rope_type" was originally "type"
426
+ if hasattr(config, "rope_scaling") and isinstance(config.rope_scaling, dict):
427
+ self.rope_type = config.rope_scaling.get("rope_type", config.rope_scaling.get("type"))
428
+ else:
429
+ self.rope_type = "default"
430
+ self.max_seq_len_cached = config.max_position_embeddings
431
+ self.original_max_seq_len = config.max_position_embeddings
432
+
433
+ self.config = config
434
+ self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type]
435
+
436
+ inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device)
437
+ self.register_buffer("inv_freq", inv_freq, persistent=False)
438
+ self.original_inv_freq = self.inv_freq
439
+
440
+ @torch.no_grad()
441
+ @dynamic_rope_update # power user: used with advanced RoPE types (e.g. dynamic rope)
442
+ def forward(self, x, position_ids):
443
+ inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1).to(x.device)
444
+ position_ids_expanded = position_ids[:, None, :].float()
445
+
446
+ device_type = x.device.type if isinstance(x.device.type, str) and x.device.type != "mps" else "cpu"
447
+ with torch.autocast(device_type=device_type, enabled=False): # Force float32
448
+ freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)
449
+ emb = torch.cat((freqs, freqs), dim=-1)
450
+ cos = emb.cos() * self.attention_scaling
451
+ sin = emb.sin() * self.attention_scaling
452
+
453
+ return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype)
454
+
455
+
456
+ @auto_docstring
457
+ class SolarOpenModel(SolarOpenPreTrainedModel):
458
+ _keys_to_ignore_on_load_unexpected = [r"model\.layers\.92.*", r"model\.layers\.46.*"]
459
+
460
+ def __init__(self, config: SolarOpenConfig):
461
+ super().__init__(config)
462
+ self.padding_idx = config.pad_token_id
463
+ self.vocab_size = config.vocab_size
464
+
465
+ self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
466
+ self.layers = nn.ModuleList(
467
+ [SolarOpenDecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
468
+ )
469
+ self.norm = SolarOpenRMSNorm(config.hidden_size, eps=config.rms_norm_eps)
470
+ self.rotary_emb = SolarOpenRotaryEmbedding(config=config)
471
+ self.gradient_checkpointing = False
472
+
473
+ # Initialize weights and apply final processing
474
+ self.post_init()
475
+
476
+ @check_model_inputs()
477
+ @auto_docstring
478
+ def forward(
479
+ self,
480
+ input_ids: Optional[torch.LongTensor] = None,
481
+ attention_mask: Optional[torch.Tensor] = None,
482
+ position_ids: Optional[torch.LongTensor] = None,
483
+ past_key_values: Optional[Cache] = None,
484
+ inputs_embeds: Optional[torch.FloatTensor] = None,
485
+ cache_position: Optional[torch.LongTensor] = None,
486
+ use_cache: Optional[bool] = None,
487
+ **kwargs: Unpack[TransformersKwargs],
488
+ ) -> BaseModelOutputWithPast:
489
+ if (input_ids is None) ^ (inputs_embeds is not None):
490
+ raise ValueError("You must specify exactly one of input_ids or inputs_embeds")
491
+
492
+ if inputs_embeds is None:
493
+ inputs_embeds: torch.Tensor = self.embed_tokens(input_ids)
494
+
495
+ if use_cache and past_key_values is None:
496
+ past_key_values = DynamicCache(config=self.config)
497
+
498
+ if cache_position is None:
499
+ past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0
500
+ cache_position: torch.Tensor = torch.arange(
501
+ past_seen_tokens, past_seen_tokens + inputs_embeds.shape[1], device=inputs_embeds.device
502
+ )
503
+
504
+ if position_ids is None:
505
+ position_ids = cache_position.unsqueeze(0)
506
+
507
+ causal_mask = create_causal_mask(
508
+ config=self.config,
509
+ input_embeds=inputs_embeds,
510
+ attention_mask=attention_mask,
511
+ cache_position=cache_position,
512
+ past_key_values=past_key_values,
513
+ position_ids=position_ids,
514
+ )
515
+
516
+ hidden_states = inputs_embeds
517
+ position_embeddings = self.rotary_emb(hidden_states, position_ids)
518
+
519
+ for decoder_layer in self.layers[: self.config.num_hidden_layers]:
520
+ hidden_states = decoder_layer(
521
+ hidden_states,
522
+ attention_mask=causal_mask,
523
+ position_ids=position_ids,
524
+ past_key_values=past_key_values,
525
+ cache_position=cache_position,
526
+ position_embeddings=position_embeddings,
527
+ **kwargs,
528
+ )
529
+
530
+ hidden_states = self.norm(hidden_states)
531
+ return BaseModelOutputWithPast(
532
+ last_hidden_state=hidden_states,
533
+ past_key_values=past_key_values,
534
+ )
535
+
536
+
537
+ @auto_docstring
538
+ class SolarOpenForCausalLM(SolarOpenPreTrainedModel, GenerationMixin):
539
+ _tied_weights_keys = ["lm_head.weight"]
540
+ _tp_plan = {"lm_head": "colwise_rep"}
541
+ _pp_plan = {"lm_head": (["hidden_states"], ["logits"])}
542
+
543
+ def __init__(self, config):
544
+ super().__init__(config)
545
+ self.model = SolarOpenModel(config)
546
+ self.vocab_size = config.vocab_size
547
+ self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
548
+
549
+ # Initialize weights and apply final processing
550
+ self.post_init()
551
+
552
+ @can_return_tuple
553
+ @auto_docstring
554
+ def forward(
555
+ self,
556
+ input_ids: Optional[torch.LongTensor] = None,
557
+ attention_mask: Optional[torch.Tensor] = None,
558
+ position_ids: Optional[torch.LongTensor] = None,
559
+ past_key_values: Optional[Cache] = None,
560
+ inputs_embeds: Optional[torch.FloatTensor] = None,
561
+ labels: Optional[torch.LongTensor] = None,
562
+ use_cache: Optional[bool] = None,
563
+ cache_position: Optional[torch.LongTensor] = None,
564
+ logits_to_keep: Union[int, torch.Tensor] = 0,
565
+ **kwargs: Unpack[TransformersKwargs],
566
+ ) -> CausalLMOutputWithPast:
567
+
568
+ outputs: BaseModelOutputWithPast = self.model(
569
+ input_ids=input_ids,
570
+ attention_mask=attention_mask,
571
+ position_ids=position_ids,
572
+ past_key_values=past_key_values,
573
+ inputs_embeds=inputs_embeds,
574
+ use_cache=use_cache,
575
+ cache_position=cache_position,
576
+ **kwargs,
577
+ )
578
+
579
+ hidden_states = outputs.last_hidden_state
580
+ # Only compute necessary logits, and do not upcast them to float if we are not computing the loss
581
+ slice_indices = slice(-logits_to_keep, None) if isinstance(logits_to_keep, int) else logits_to_keep
582
+ logits = self.lm_head(hidden_states[:, slice_indices, :])
583
+
584
+ loss = None
585
+ if labels is not None:
586
+ loss = self.loss_function(logits=logits, labels=labels, vocab_size=self.config.vocab_size, **kwargs)
587
+
588
+ return CausalLMOutputWithPast(
589
+ loss=loss,
590
+ logits=logits,
591
+ past_key_values=outputs.past_key_values,
592
+ hidden_states=outputs.hidden_states,
593
+ attentions=outputs.attentions,
594
+ )
595
+
596
+
597
+ __all__ = ["SolarOpenPreTrainedModel", "SolarOpenModel", "SolarOpenForCausalLM"]
parallel_tool_call_logits_processor.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2025 Upstage AI. All rights reserved.
3
+ #
4
+ # Licensed under the Solar-Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://huggingface.co/upstage/Solar-Open-100B/blob/main/LICENSE
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import TYPE_CHECKING
17
+
18
+ import torch
19
+
20
+ from vllm.sampling_params import SamplingParams
21
+ from vllm.v1.sample.logits_processor import (
22
+ AdapterLogitsProcessor,
23
+ RequestLogitsProcessor,
24
+ )
25
+
26
+ if TYPE_CHECKING:
27
+ from vllm.config import VllmConfig
28
+
29
+ # Hardcoded token IDs for Solar tokenizer
30
+ TOOL_CALL_END_TOKEN_ID = 32 # <|tool_call:end|>
31
+ CALLS_TOKEN_ID = 25 # <|calls|>
32
+
33
+
34
+ class SingleToolCallEnforcer:
35
+ """Request-level logits processor that enforces single tool call.
36
+
37
+ When <|tool_call:end|> token is generated, forces the next token
38
+ to be <|calls|> (which is a stop token), preventing parallel tool calls.
39
+ """
40
+
41
+ def __init__(
42
+ self,
43
+ tool_call_end_token_id: int,
44
+ calls_token_id: int,
45
+ ):
46
+ self._tool_call_end_token_id = tool_call_end_token_id
47
+ self._calls_token_id = calls_token_id
48
+
49
+ def __call__(
50
+ self,
51
+ output_token_ids: list[int],
52
+ logits: torch.Tensor,
53
+ ) -> torch.Tensor:
54
+ # Check if last generated token is <|tool_call:end|>
55
+ if output_token_ids and output_token_ids[-1] == self._tool_call_end_token_id:
56
+ # Force next token to be <|calls|> by masking all other tokens
57
+ mask = torch.full_like(logits, -float("inf"))
58
+ mask[self._calls_token_id] = logits[self._calls_token_id]
59
+ return mask
60
+
61
+ return logits
62
+
63
+
64
+ class ParallelToolCallLogitsProcessor(AdapterLogitsProcessor):
65
+ """Logits processor that enforces single tool call when parallel_tool_calls=False.
66
+
67
+ When parallel_tool_calls is disabled in SamplingParams, this processor
68
+ ensures that after <|tool_call:end|> is generated, the next token is
69
+ forced to be <|calls|> (a stop token), preventing multiple tool calls.
70
+ """
71
+
72
+ def __init__(
73
+ self,
74
+ vllm_config: "VllmConfig",
75
+ device: torch.device,
76
+ is_pin_memory: bool,
77
+ ):
78
+ super().__init__(vllm_config, device, is_pin_memory)
79
+
80
+ def is_argmax_invariant(self) -> bool:
81
+ """This processor can change argmax result by forcing specific tokens."""
82
+ return False
83
+
84
+ def new_req_logits_processor(
85
+ self,
86
+ params: SamplingParams,
87
+ ) -> RequestLogitsProcessor | None:
88
+ """Return a request-level logits processor if parallel_tool_calls=False.
89
+
90
+ Args:
91
+ params: Request sampling params
92
+
93
+ Returns:
94
+ SingleToolCallEnforcer if parallel_tool_calls is False, otherwise None.
95
+ """
96
+ # Only apply when parallel_tool_calls is explicitly disabled
97
+ if params.parallel_tool_calls is False:
98
+ return SingleToolCallEnforcer(
99
+ tool_call_end_token_id=TOOL_CALL_END_TOKEN_ID,
100
+ calls_token_id=CALLS_TOKEN_ID,
101
+ )
102
+
103
+ return None
104
+
solar_open_logits_processor.py ADDED
@@ -0,0 +1,763 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2025 Upstage AI. All rights reserved.
3
+ #
4
+ # Licensed under the Solar-Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://huggingface.co/upstage/Solar-Open-100B/blob/main/LICENSE
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import os
17
+ from enum import Enum
18
+ from typing import TYPE_CHECKING
19
+
20
+ import torch
21
+
22
+ from vllm.sampling_params import SamplingParams
23
+ from vllm.v1.sample.logits_processor import (
24
+ AdapterLogitsProcessor,
25
+ RequestLogitsProcessor,
26
+ )
27
+
28
+ if TYPE_CHECKING:
29
+ from vllm.config import VllmConfig
30
+
31
+ # Hardcoded token IDs for Solar tokenizer
32
+
33
+ # Special token IDs for chat template
34
+ BEGIN_TOKEN_ID = 20 # <|begin|>
35
+ END_TOKEN_ID = 21 # <|end|>
36
+ THINK_TOKEN_ID = 22 # <|think|>
37
+ CONTENT_TOKEN_ID = 23 # <|content|>
38
+ FLUSH_TOKEN_ID = 24 # <|flush|> (eos token)
39
+ ASSISTANT_TOKEN_ID = 163444 # assistant
40
+ '''
41
+ 'assistant' is not a special token exactly, but is treated as one in the logits
42
+ processing.
43
+ '''
44
+
45
+ # Tool call related tokens
46
+ CALLS_TOKEN_ID = 25 # <|calls|> (eos token for tool calls)
47
+ TOOL_CALLS_TOKEN_ID = 30 # <|tool_calls|>
48
+ TOOL_CALL_BEGIN_TOKEN_ID = 31 # <|tool_call:begin|>
49
+ TOOL_CALL_END_TOKEN_ID = 32 # <|tool_call:end|>
50
+ TOOL_CALL_NAME_TOKEN_ID = 33 # <|tool_call:name|>
51
+ TOOL_CALL_ARGS_TOKEN_ID = 34 # <|tool_call:args|>
52
+
53
+ # =============================================================================
54
+ # Dynamic Reasoning Budget Configuration
55
+ # =============================================================================
56
+ # budget = min(max_budget, max(min_budget, max_tokens * ratio / 100))
57
+ # Priority: max_budget > min_budget > ratio
58
+ #
59
+ # Available environment variables:
60
+ # HIGH effort:
61
+ # SOLAR_REASONING_BUDGET_HIGH_MAX (default: 32768) - max_budget
62
+ # SOLAR_REASONING_BUDGET_HIGH_MIN (default: 8192) - min_budget
63
+ # SOLAR_REASONING_BUDGET_HIGH_RATIO (default: 60) - % of max_tokens
64
+ #
65
+ # MEDIUM effort:
66
+ # SOLAR_REASONING_BUDGET_MEDIUM_MAX (default: 16384) - max_budget
67
+ # SOLAR_REASONING_BUDGET_MEDIUM_MIN (default: 4096) - min_budget
68
+ # SOLAR_REASONING_BUDGET_MEDIUM_RATIO (default: 30) - % of max_tokens
69
+ #
70
+ # Tool call:
71
+ # SOLAR_TOOL_CALL_ID_BUDGET (default: 10) - Max tokens for tool call ID
72
+ # =============================================================================
73
+
74
+ DEFAULT_REASONING_EFFORT = "high"
75
+
76
+ # HIGH effort settings (1k = 1024 tokens)
77
+ DEFAULT_REASONING_BUDGET_HIGH_MAX = 32 * 1024
78
+ DEFAULT_REASONING_BUDGET_HIGH_MIN = 8 * 1024
79
+ DEFAULT_REASONING_BUDGET_HIGH_RATIO = 60
80
+
81
+ # MEDIUM effort settings
82
+ DEFAULT_REASONING_BUDGET_MEDIUM_MAX = 16 * 1024
83
+ DEFAULT_REASONING_BUDGET_MEDIUM_MIN = 4 * 1024
84
+ DEFAULT_REASONING_BUDGET_MEDIUM_RATIO = 30
85
+
86
+ # Tool call settings
87
+ DEFAULT_TOOL_CALL_ID_BUDGET = 10
88
+
89
+ # Pre-computed constant to avoid repeated string parsing
90
+ NEG_INF = float("-inf")
91
+
92
+
93
+ def is_reasoning_request(params: SamplingParams) -> bool:
94
+ """Check if the request is a reasoning request based on reasoning_effort."""
95
+ return (params.reasoning_effort is None) or (params.reasoning_effort in ("medium", "high"))
96
+
97
+
98
+ def is_structured_outputs(params: SamplingParams) -> bool:
99
+ """Check if the request has structured outputs constraints."""
100
+ return (
101
+ params.structured_outputs is not None
102
+ and not params.structured_outputs.all_constraints_none()
103
+ )
104
+
105
+
106
+ class GenerationState(Enum):
107
+ """Enum representing the current state of response generation."""
108
+
109
+ # Initial state - no tokens generated yet
110
+ INITIAL = "initial"
111
+
112
+ # New message states (after think_end)
113
+ NEW_MESSAGE_BEGIN = "new_message_begin" # <|begin|> token was just generated
114
+ NEW_MESSAGE_ASSISTANT = "new_message_assistant" # assistant token after <|begin|>
115
+
116
+ # Think mode states
117
+ THINK_BEGIN = "think_begin" # <|think|> token was just generated
118
+ THINK_IN_PROGRESS = "think_in_progress" # Generating think content
119
+ THINK_END = "think_end" # <|end|> after think content
120
+ THINK_FLUSH = "think_flush" # <|flush|> after think content
121
+
122
+ # Content states
123
+ CONTENT_BEGIN = "content_begin" # <|content|> token was just generated
124
+ CONTENT_IN_PROGRESS = "content_in_progress" # Generating content
125
+ CONTENT_END = "content_end" # <|end|> or <|flush|> after content
126
+ CONTENT_FLUSH = "content_flush" # <|flush|> after content
127
+
128
+ # Tool call states
129
+ # Flow: <|tool_calls|> -> (<|tool_call:begin|> -> id -> <|tool_call:name|> -> name -> <|tool_call:args|> -> args -> <|tool_call:end|>)+ -> <|calls|>
130
+ # Note: Think message can appear before <|tool_calls|>
131
+ TOOL_CALLS_BEGIN = "tool_calls_begin" # <|tool_calls|> token was just generated
132
+ TOOL_CALL_BEGIN = "tool_call_begin" # <|tool_call:begin|> token was just generated
133
+ TOOL_CALL_ID_IN_PROGRESS = "tool_call_id_in_progress" # Generating tool call ID
134
+ TOOL_CALL_NAME_BEGIN = "tool_call_name_begin" # <|tool_call:name|> token was just generated
135
+ TOOL_CALL_NAME_IN_PROGRESS = "tool_call_name_in_progress" # Generating tool name
136
+ TOOL_CALL_ARGS_BEGIN = "tool_call_args_begin" # <|tool_call:args|> token was just generated
137
+ TOOL_CALL_ARGS_IN_PROGRESS = "tool_call_args_in_progress" # Generating tool arguments (JSON)
138
+ TOOL_CALL_END = "tool_call_end" # <|tool_call:end|> token was just generated (can start another tool call or end)
139
+ CALLS = "calls" # <|calls|> token was just generated (eos token for tool calls)
140
+
141
+
142
+ def get_generation_state(
143
+ output_token_ids: list[int],
144
+ begin_token_id: int = BEGIN_TOKEN_ID,
145
+ end_token_id: int = END_TOKEN_ID,
146
+ flush_token_id: int = FLUSH_TOKEN_ID,
147
+ think_token_id: int = THINK_TOKEN_ID,
148
+ content_token_id: int = CONTENT_TOKEN_ID,
149
+ tool_calls_token_id: int = TOOL_CALLS_TOKEN_ID,
150
+ tool_call_begin_token_id: int = TOOL_CALL_BEGIN_TOKEN_ID,
151
+ tool_call_name_token_id: int = TOOL_CALL_NAME_TOKEN_ID,
152
+ tool_call_args_token_id: int = TOOL_CALL_ARGS_TOKEN_ID,
153
+ tool_call_end_token_id: int = TOOL_CALL_END_TOKEN_ID,
154
+ calls_token_id: int = CALLS_TOKEN_ID,
155
+ assistant_token_id: int = ASSISTANT_TOKEN_ID,
156
+ ) -> GenerationState:
157
+ """Determine the current generation state based on output token IDs.
158
+
159
+ Analyzes the sequence of generated tokens to determine which phase
160
+ of the chat template the generation is currently in.
161
+
162
+ Response format specs:
163
+ - think mode: <|think|>{{think-tokens}}<|end|><|begin|>assistant<|content|>{{content-tokens}}<|flush|>
164
+ - tool mode: <|begin|>assistant<|tool_calls|><|tool_call:begin|>{{id}}<|tool_call:name|>{{name}}<|tool_call:args|>{{args}}<|tool_call:end|><|calls|>
165
+ - tool mode (with think): <|think|>{{think-tokens}}<|end|><|begin|>assistant<|tool_calls|>...<|calls|>
166
+ - no-think mode: <|content|>{{content-tokens}}<|flush|>
167
+
168
+ Args:
169
+ output_token_ids: List of token IDs generated so far.
170
+ begin_token_id: Token ID for <|begin|>.
171
+ end_token_id: Token ID for <|end|>.
172
+ flush_token_id: Token ID for <|flush|> (eos).
173
+ think_token_id: Token ID for <|think|>.
174
+ content_token_id: Token ID for <|content|>.
175
+ tool_calls_token_id: Token ID for <|tool_calls|>.
176
+ tool_call_begin_token_id: Token ID for <|tool_call:begin|>.
177
+ tool_call_name_token_id: Token ID for <|tool_call:name|>.
178
+ tool_call_args_token_id: Token ID for <|tool_call:args|>.
179
+ tool_call_end_token_id: Token ID for <|tool_call:end|>.
180
+ calls_token_id: Token ID for <|calls|> (eos).
181
+ assistant_token_id: Token ID for assistant.
182
+
183
+ Returns:
184
+ GenerationState indicating the current phase of generation.
185
+ """
186
+ if not output_token_ids:
187
+ return GenerationState.INITIAL
188
+
189
+ # Track state by scanning through tokens
190
+ state = GenerationState.INITIAL
191
+ in_think = False
192
+ in_content = False
193
+
194
+ for token_id in output_token_ids:
195
+ if token_id == think_token_id:
196
+ state = GenerationState.THINK_BEGIN
197
+ in_think = True
198
+ in_content = False
199
+
200
+ elif token_id == content_token_id:
201
+ state = GenerationState.CONTENT_BEGIN
202
+ in_content = True
203
+ in_think = False
204
+
205
+ elif token_id == tool_calls_token_id:
206
+ state = GenerationState.TOOL_CALLS_BEGIN
207
+ in_think = False
208
+ in_content = False
209
+
210
+ elif token_id == tool_call_begin_token_id:
211
+ state = GenerationState.TOOL_CALL_BEGIN
212
+
213
+ elif token_id == tool_call_name_token_id:
214
+ state = GenerationState.TOOL_CALL_NAME_BEGIN
215
+
216
+ elif token_id == tool_call_args_token_id:
217
+ state = GenerationState.TOOL_CALL_ARGS_BEGIN
218
+
219
+ elif token_id == tool_call_end_token_id:
220
+ state = GenerationState.TOOL_CALL_END
221
+
222
+ elif token_id == calls_token_id:
223
+ state = GenerationState.CALLS
224
+
225
+ elif token_id == begin_token_id:
226
+ state = GenerationState.NEW_MESSAGE_BEGIN
227
+
228
+ elif token_id == assistant_token_id:
229
+ if state == GenerationState.NEW_MESSAGE_BEGIN:
230
+ state = GenerationState.NEW_MESSAGE_ASSISTANT
231
+
232
+ elif token_id == end_token_id:
233
+ if in_think:
234
+ state = GenerationState.THINK_END
235
+ in_think = False
236
+ elif in_content:
237
+ state = GenerationState.CONTENT_END
238
+ in_content = False
239
+
240
+ elif token_id == flush_token_id:
241
+ if in_think:
242
+ state = GenerationState.THINK_FLUSH
243
+ in_think = False
244
+ elif in_content:
245
+ state = GenerationState.CONTENT_FLUSH
246
+ in_content = False
247
+
248
+ else:
249
+ # Regular token - update state based on current context
250
+ if state == GenerationState.THINK_BEGIN:
251
+ state = GenerationState.THINK_IN_PROGRESS
252
+ elif state == GenerationState.THINK_IN_PROGRESS:
253
+ pass # Stay in think_in_progress
254
+ elif state == GenerationState.CONTENT_BEGIN:
255
+ state = GenerationState.CONTENT_IN_PROGRESS
256
+ elif state == GenerationState.CONTENT_IN_PROGRESS:
257
+ pass # Stay in content_in_progress
258
+ elif state == GenerationState.TOOL_CALL_BEGIN:
259
+ state = GenerationState.TOOL_CALL_ID_IN_PROGRESS
260
+ elif state == GenerationState.TOOL_CALL_ID_IN_PROGRESS:
261
+ pass # Stay in tool_call_id_in_progress
262
+ elif state == GenerationState.TOOL_CALL_NAME_BEGIN:
263
+ state = GenerationState.TOOL_CALL_NAME_IN_PROGRESS
264
+ elif state == GenerationState.TOOL_CALL_NAME_IN_PROGRESS:
265
+ pass # Stay in tool_call_name_in_progress
266
+ elif state == GenerationState.TOOL_CALL_ARGS_BEGIN:
267
+ state = GenerationState.TOOL_CALL_ARGS_IN_PROGRESS
268
+ elif state == GenerationState.TOOL_CALL_ARGS_IN_PROGRESS:
269
+ pass # Stay in tool_call_args_in_progress
270
+
271
+ return state
272
+
273
+
274
+ # Pre-computed list of all special token IDs for batch indexing
275
+ _ALL_SPECIAL_TOKEN_IDS = [
276
+ BEGIN_TOKEN_ID,
277
+ END_TOKEN_ID,
278
+ THINK_TOKEN_ID,
279
+ CONTENT_TOKEN_ID,
280
+ FLUSH_TOKEN_ID,
281
+ CALLS_TOKEN_ID,
282
+ TOOL_CALLS_TOKEN_ID,
283
+ TOOL_CALL_BEGIN_TOKEN_ID,
284
+ TOOL_CALL_END_TOKEN_ID,
285
+ TOOL_CALL_NAME_TOKEN_ID,
286
+ TOOL_CALL_ARGS_TOKEN_ID,
287
+ ]
288
+
289
+ # Pre-computed lists for state-specific batch indexing (excluding allowed tokens)
290
+ _SPECIAL_EXCEPT_END = [ # For THINK states (allow END)
291
+ BEGIN_TOKEN_ID, FLUSH_TOKEN_ID, THINK_TOKEN_ID, CONTENT_TOKEN_ID,
292
+ TOOL_CALLS_TOKEN_ID, CALLS_TOKEN_ID, TOOL_CALL_BEGIN_TOKEN_ID,
293
+ TOOL_CALL_END_TOKEN_ID, TOOL_CALL_NAME_TOKEN_ID, TOOL_CALL_ARGS_TOKEN_ID,
294
+ ]
295
+
296
+ _SPECIAL_EXCEPT_CONTENT_TOOLCALLS = [ # For NEW_MESSAGE_ASSISTANT (allow CONTENT, TOOL_CALLS)
297
+ THINK_TOKEN_ID, BEGIN_TOKEN_ID, END_TOKEN_ID, FLUSH_TOKEN_ID,
298
+ CALLS_TOKEN_ID, TOOL_CALL_BEGIN_TOKEN_ID, TOOL_CALL_END_TOKEN_ID,
299
+ TOOL_CALL_NAME_TOKEN_ID, TOOL_CALL_ARGS_TOKEN_ID,
300
+ ]
301
+
302
+ _SPECIAL_EXCEPT_FLUSH = [ # For CONTENT states (allow FLUSH)
303
+ BEGIN_TOKEN_ID, END_TOKEN_ID, THINK_TOKEN_ID, CONTENT_TOKEN_ID,
304
+ TOOL_CALLS_TOKEN_ID, CALLS_TOKEN_ID, TOOL_CALL_BEGIN_TOKEN_ID,
305
+ TOOL_CALL_END_TOKEN_ID, TOOL_CALL_NAME_TOKEN_ID, TOOL_CALL_ARGS_TOKEN_ID,
306
+ ]
307
+
308
+ _SPECIAL_EXCEPT_TOOLCALL_NAME = [ # For TOOL_CALL_ID_IN_PROGRESS (allow TOOL_CALL_NAME)
309
+ BEGIN_TOKEN_ID, END_TOKEN_ID, THINK_TOKEN_ID, CONTENT_TOKEN_ID,
310
+ FLUSH_TOKEN_ID, CALLS_TOKEN_ID, TOOL_CALLS_TOKEN_ID,
311
+ TOOL_CALL_BEGIN_TOKEN_ID, TOOL_CALL_END_TOKEN_ID, TOOL_CALL_ARGS_TOKEN_ID,
312
+ ]
313
+
314
+ _SPECIAL_EXCEPT_TOOLCALL_ARGS = [ # For TOOL_CALL_NAME_IN_PROGRESS (allow TOOL_CALL_ARGS)
315
+ BEGIN_TOKEN_ID, END_TOKEN_ID, THINK_TOKEN_ID, CONTENT_TOKEN_ID,
316
+ FLUSH_TOKEN_ID, CALLS_TOKEN_ID, TOOL_CALLS_TOKEN_ID,
317
+ TOOL_CALL_BEGIN_TOKEN_ID, TOOL_CALL_END_TOKEN_ID, TOOL_CALL_NAME_TOKEN_ID,
318
+ ]
319
+
320
+ _SPECIAL_EXCEPT_TOOLCALL_END = [ # For TOOL_CALL_ARGS_IN_PROGRESS (allow TOOL_CALL_END)
321
+ BEGIN_TOKEN_ID, END_TOKEN_ID, THINK_TOKEN_ID, CONTENT_TOKEN_ID,
322
+ FLUSH_TOKEN_ID, CALLS_TOKEN_ID, TOOL_CALLS_TOKEN_ID,
323
+ TOOL_CALL_BEGIN_TOKEN_ID, TOOL_CALL_NAME_TOKEN_ID, TOOL_CALL_ARGS_TOKEN_ID,
324
+ ]
325
+
326
+
327
+ def _forbid_all_special_tokens(logits: torch.Tensor) -> None:
328
+ """Set all special token logits to -inf."""
329
+ logits[_ALL_SPECIAL_TOKEN_IDS] = NEG_INF
330
+
331
+
332
+ class SolarOpenTemplateEnforcer:
333
+ """Request-level logits processor that enforces Solar Open chat template.
334
+
335
+ Enforces the following generation rules:
336
+ - think mode: <|think|>{{tokens}}<|end|><|begin|>assistant<|content|>{{tokens}}<|flush|>
337
+ - tool mode: <|tool_calls|><|tool_call:begin|>{{id}}<|tool_call:name|>{{name}}<|tool_call:args|>{{args}}<|tool_call:end|><|calls|>
338
+ - tool+think mode: <|think|>{{tokens}}<|end|><|begin|>assistant<|tool_calls|>...<|calls|>
339
+ - no-think mode: <|content|>{{tokens}}<|flush|>
340
+
341
+ Key constraints:
342
+ - Think message can only appear first
343
+ - Think message must be followed by another message
344
+ - Content and tool messages cannot coexist
345
+ - Maximum 2 messages (think + content/tool, or just content/tool)
346
+
347
+ Performance optimization:
348
+ - Uses incremental state tracking to avoid full token sequence scan on each call
349
+ - Maintains local counters for budget tracking
350
+ - Uses pre-computed constants to avoid repeated object creation
351
+ """
352
+
353
+ # Pre-computed frozenset for reasoning state check (avoids set creation per call)
354
+ _REASONING_STATES = frozenset({
355
+ GenerationState.INITIAL,
356
+ GenerationState.THINK_BEGIN,
357
+ GenerationState.THINK_IN_PROGRESS,
358
+ })
359
+
360
+ def __init__(
361
+ self,
362
+ is_reasoning_request: bool,
363
+ is_structured_outputs: bool,
364
+ reasoning_budget: int | None = None,
365
+ tool_call_id_budget: int = DEFAULT_TOOL_CALL_ID_BUDGET,
366
+ ):
367
+ self._is_reasoning_request = is_reasoning_request
368
+ self._is_structured_outputs = is_structured_outputs
369
+ self._reasoning_budget = reasoning_budget
370
+ self._tool_call_id_budget = tool_call_id_budget
371
+
372
+ # Incremental state tracking
373
+ self._state = GenerationState.INITIAL
374
+ self._last_processed_len = 0
375
+ self._in_think = False
376
+ self._in_content = False
377
+
378
+ # Budget counters
379
+ self._think_token_count = 0
380
+ self._tool_call_id_token_count = 0
381
+
382
+ def _reset_state(self) -> None:
383
+ """Reset all incremental state to initial values.
384
+
385
+ Called when defensive reprocessing is needed (e.g., token sequence inconsistency).
386
+ """
387
+ self._state = GenerationState.INITIAL
388
+ self._last_processed_len = 0
389
+ self._in_think = False
390
+ self._in_content = False
391
+ self._think_token_count = 0
392
+ self._tool_call_id_token_count = 0
393
+
394
+ def _process_token(self, token_id: int) -> None:
395
+ """Process a single token and update internal state incrementally.
396
+
397
+ Args:
398
+ token_id: The token ID to process.
399
+ """
400
+ if token_id == THINK_TOKEN_ID:
401
+ self._state = GenerationState.THINK_BEGIN
402
+ self._in_think = True
403
+ self._in_content = False
404
+ self._think_token_count = 0 # Reset counter for new think block
405
+
406
+ elif token_id == CONTENT_TOKEN_ID:
407
+ self._state = GenerationState.CONTENT_BEGIN
408
+ self._in_content = True
409
+ self._in_think = False
410
+
411
+ elif token_id == TOOL_CALLS_TOKEN_ID:
412
+ self._state = GenerationState.TOOL_CALLS_BEGIN
413
+ self._in_think = False
414
+ self._in_content = False
415
+
416
+ elif token_id == TOOL_CALL_BEGIN_TOKEN_ID:
417
+ self._state = GenerationState.TOOL_CALL_BEGIN
418
+ self._tool_call_id_token_count = 0 # Reset counter for new tool call
419
+
420
+ elif token_id == TOOL_CALL_NAME_TOKEN_ID:
421
+ self._state = GenerationState.TOOL_CALL_NAME_BEGIN
422
+
423
+ elif token_id == TOOL_CALL_ARGS_TOKEN_ID:
424
+ self._state = GenerationState.TOOL_CALL_ARGS_BEGIN
425
+
426
+ elif token_id == TOOL_CALL_END_TOKEN_ID:
427
+ self._state = GenerationState.TOOL_CALL_END
428
+
429
+ elif token_id == CALLS_TOKEN_ID:
430
+ self._state = GenerationState.CALLS
431
+
432
+ elif token_id == BEGIN_TOKEN_ID:
433
+ self._state = GenerationState.NEW_MESSAGE_BEGIN
434
+
435
+ elif token_id == ASSISTANT_TOKEN_ID:
436
+ if self._state == GenerationState.NEW_MESSAGE_BEGIN:
437
+ self._state = GenerationState.NEW_MESSAGE_ASSISTANT
438
+
439
+ elif token_id == END_TOKEN_ID:
440
+ if self._in_think:
441
+ self._state = GenerationState.THINK_END
442
+ self._in_think = False
443
+ elif self._in_content:
444
+ self._state = GenerationState.CONTENT_END
445
+ self._in_content = False
446
+
447
+ elif token_id == FLUSH_TOKEN_ID:
448
+ if self._in_think:
449
+ self._state = GenerationState.THINK_FLUSH
450
+ self._in_think = False
451
+ elif self._in_content:
452
+ self._state = GenerationState.CONTENT_FLUSH
453
+ self._in_content = False
454
+
455
+ else:
456
+ # Regular token - update state and counters based on current context
457
+ if self._state == GenerationState.THINK_BEGIN:
458
+ self._state = GenerationState.THINK_IN_PROGRESS
459
+ self._think_token_count += 1
460
+ elif self._state == GenerationState.THINK_IN_PROGRESS:
461
+ self._think_token_count += 1
462
+ elif self._state == GenerationState.CONTENT_BEGIN:
463
+ self._state = GenerationState.CONTENT_IN_PROGRESS
464
+ elif self._state == GenerationState.CONTENT_IN_PROGRESS:
465
+ pass # Stay in content_in_progress
466
+ elif self._state == GenerationState.TOOL_CALL_BEGIN:
467
+ self._state = GenerationState.TOOL_CALL_ID_IN_PROGRESS
468
+ self._tool_call_id_token_count += 1
469
+ elif self._state == GenerationState.TOOL_CALL_ID_IN_PROGRESS:
470
+ self._tool_call_id_token_count += 1
471
+ elif self._state == GenerationState.TOOL_CALL_NAME_BEGIN:
472
+ self._state = GenerationState.TOOL_CALL_NAME_IN_PROGRESS
473
+ elif self._state == GenerationState.TOOL_CALL_NAME_IN_PROGRESS:
474
+ pass # Stay in tool_call_name_in_progress
475
+ elif self._state == GenerationState.TOOL_CALL_ARGS_BEGIN:
476
+ self._state = GenerationState.TOOL_CALL_ARGS_IN_PROGRESS
477
+ elif self._state == GenerationState.TOOL_CALL_ARGS_IN_PROGRESS:
478
+ pass # Stay in tool_call_args_in_progress
479
+
480
+ def _update_state_incremental(self, output_token_ids: list[int]) -> None:
481
+ """Update internal state by processing only new tokens.
482
+
483
+ Args:
484
+ output_token_ids: Full list of output token IDs.
485
+ """
486
+ current_len = len(output_token_ids)
487
+
488
+ # Defensive check: if token sequence is shorter than expected, reset and reprocess
489
+ if current_len < self._last_processed_len:
490
+ self._reset_state()
491
+
492
+ # Process only new tokens
493
+ for i in range(self._last_processed_len, current_len):
494
+ self._process_token(output_token_ids[i])
495
+
496
+ self._last_processed_len = current_len
497
+
498
+ @staticmethod
499
+ def _count_think_tokens(output_token_ids: list[int]) -> int:
500
+ """Count the number of tokens generated after <|think|> token.
501
+
502
+ Returns 0 if <|think|> token is not found (defensive).
503
+ Note: This static method is kept for backward compatibility and testing.
504
+ The incremental version uses _think_token_count instead.
505
+ """
506
+ try:
507
+ think_index = output_token_ids.index(THINK_TOKEN_ID)
508
+ return len(output_token_ids) - think_index - 1
509
+ except ValueError:
510
+ return 0
511
+
512
+ @staticmethod
513
+ def _count_tool_call_id_tokens(output_token_ids: list[int]) -> int:
514
+ """Count the number of tokens generated after the last <|tool_call:begin|> token.
515
+
516
+ Returns 0 if <|tool_call:begin|> token is not found (defensive).
517
+ Note: This static method is kept for backward compatibility and testing.
518
+ The incremental version uses _tool_call_id_token_count instead.
519
+ """
520
+ # Find the last occurrence of <|tool_call:begin|> for multi-tool-call support
521
+ try:
522
+ # Reverse search for the last <|tool_call:begin|>
523
+ reversed_index = output_token_ids[::-1].index(TOOL_CALL_BEGIN_TOKEN_ID)
524
+ last_begin_index = len(output_token_ids) - 1 - reversed_index
525
+ return len(output_token_ids) - last_begin_index - 1
526
+ except ValueError:
527
+ return 0
528
+
529
+ def __call__(
530
+ self,
531
+ output_token_ids: list[int],
532
+ logits: torch.Tensor,
533
+ ) -> torch.Tensor:
534
+ # Update state incrementally (only process new tokens)
535
+ self._update_state_incremental(output_token_ids)
536
+ state = self._state
537
+
538
+ # Handle structured outputs mode
539
+ if self._is_structured_outputs:
540
+ if not self._is_reasoning_request:
541
+ # Non-reasoning request with structured outputs: no logit control
542
+ return logits
543
+ else:
544
+ # Reasoning request with structured outputs:
545
+ # Control logits only during reasoning phase
546
+ if state not in self._REASONING_STATES:
547
+ # Reasoning finished, let structured outputs handle it
548
+ return logits
549
+
550
+ if state == GenerationState.INITIAL:
551
+ if self._is_reasoning_request:
552
+ # Force: <|think|> only (reasoning request must start with think)
553
+ think_logit = logits[THINK_TOKEN_ID].clone()
554
+ logits.fill_(NEG_INF)
555
+ logits[THINK_TOKEN_ID] = think_logit
556
+ else:
557
+ # Allow: <|content|>, <|tool_calls|> only
558
+ content_logit = logits[CONTENT_TOKEN_ID].clone()
559
+ tool_calls_logit = logits[TOOL_CALLS_TOKEN_ID].clone()
560
+ logits.fill_(NEG_INF)
561
+ logits[CONTENT_TOKEN_ID] = content_logit
562
+ logits[TOOL_CALLS_TOKEN_ID] = tool_calls_logit
563
+
564
+ elif state in (GenerationState.THINK_BEGIN, GenerationState.THINK_IN_PROGRESS):
565
+ # Check if reasoning budget is exceeded (using incremental counter)
566
+ if (
567
+ self._reasoning_budget is not None
568
+ and state == GenerationState.THINK_IN_PROGRESS
569
+ ):
570
+ if self._think_token_count >= self._reasoning_budget:
571
+ # Force <|end|> token to terminate reasoning
572
+ logits.fill_(NEG_INF)
573
+ logits[END_TOKEN_ID] = 0.0
574
+ return logits
575
+
576
+ # Transform: <|flush|> -> <|end|>
577
+ # Think must be followed by another message, so prevent early termination
578
+ logits[END_TOKEN_ID] = torch.maximum(logits[END_TOKEN_ID], logits[FLUSH_TOKEN_ID])
579
+ # Forbid all special tokens except <|end|>
580
+ logits[_SPECIAL_EXCEPT_END] = NEG_INF
581
+
582
+ elif state == GenerationState.THINK_END:
583
+ # Force: <|begin|> only
584
+ # Think must be followed by another message
585
+ logits.fill_(NEG_INF)
586
+ logits[BEGIN_TOKEN_ID] = 0.0
587
+
588
+ elif state == GenerationState.NEW_MESSAGE_BEGIN:
589
+ # Force: assistant token only
590
+ logits.fill_(NEG_INF)
591
+ logits[ASSISTANT_TOKEN_ID] = 0.0
592
+
593
+ elif state == GenerationState.NEW_MESSAGE_ASSISTANT:
594
+ # Allow: <|content|>, <|tool_calls|>, regular tokens
595
+ # Forbid: all other special tokens
596
+ logits[_SPECIAL_EXCEPT_CONTENT_TOOLCALLS] = NEG_INF
597
+
598
+ elif state in (GenerationState.CONTENT_BEGIN, GenerationState.CONTENT_IN_PROGRESS):
599
+ # Transform: <|end|> -> <|flush|>
600
+ # Content cannot be followed by another message
601
+ logits[FLUSH_TOKEN_ID] = torch.maximum(logits[FLUSH_TOKEN_ID], logits[END_TOKEN_ID])
602
+ # Forbid all special tokens except <|flush|>
603
+ logits[_SPECIAL_EXCEPT_FLUSH] = NEG_INF
604
+
605
+ elif state == GenerationState.TOOL_CALLS_BEGIN:
606
+ # Force: <|tool_call:begin|> only
607
+ tool_call_begin_logit = logits[TOOL_CALL_BEGIN_TOKEN_ID].clone()
608
+ logits.fill_(NEG_INF)
609
+ logits[TOOL_CALL_BEGIN_TOKEN_ID] = tool_call_begin_logit
610
+
611
+ elif state == GenerationState.TOOL_CALL_BEGIN:
612
+ # Allow: regular tokens only (ID generation)
613
+ # Forbid: all special tokens
614
+ _forbid_all_special_tokens(logits)
615
+
616
+ elif state == GenerationState.TOOL_CALL_ID_IN_PROGRESS:
617
+ # Check if tool call ID budget is exceeded (using incremental counter)
618
+ if self._tool_call_id_token_count >= self._tool_call_id_budget:
619
+ # Force <|tool_call:name|> token to terminate ID generation
620
+ logits.fill_(NEG_INF)
621
+ logits[TOOL_CALL_NAME_TOKEN_ID] = 0.0
622
+ return logits
623
+
624
+ # Allow: <|tool_call:name|>, regular tokens
625
+ # Forbid: all other special tokens
626
+ logits[_SPECIAL_EXCEPT_TOOLCALL_NAME] = NEG_INF
627
+
628
+ elif state == GenerationState.TOOL_CALL_NAME_BEGIN:
629
+ # Allow: regular tokens only (function name generation)
630
+ # Forbid: all special tokens
631
+ _forbid_all_special_tokens(logits)
632
+
633
+ elif state == GenerationState.TOOL_CALL_NAME_IN_PROGRESS:
634
+ # Allow: <|tool_call:args|>, regular tokens
635
+ # Forbid: all other special tokens
636
+ logits[_SPECIAL_EXCEPT_TOOLCALL_ARGS] = NEG_INF
637
+
638
+ elif state == GenerationState.TOOL_CALL_ARGS_BEGIN:
639
+ # Allow: regular tokens only (JSON args generation)
640
+ # Forbid: all special tokens
641
+ _forbid_all_special_tokens(logits)
642
+
643
+ elif state == GenerationState.TOOL_CALL_ARGS_IN_PROGRESS:
644
+ # Allow: <|tool_call:end|>, regular tokens
645
+ # Forbid: all other special tokens
646
+ logits[_SPECIAL_EXCEPT_TOOLCALL_END] = NEG_INF
647
+
648
+ elif state == GenerationState.TOOL_CALL_END:
649
+ # Allow: <|tool_call:begin|> (next tool call), <|calls|> (end)
650
+ # Forbid: all other special tokens
651
+ tool_call_begin_logit = logits[TOOL_CALL_BEGIN_TOKEN_ID].clone()
652
+ calls_logit = logits[CALLS_TOKEN_ID].clone()
653
+ logits.fill_(NEG_INF)
654
+ logits[TOOL_CALL_BEGIN_TOKEN_ID] = tool_call_begin_logit
655
+ logits[CALLS_TOKEN_ID] = calls_logit
656
+
657
+ # CALLS state: no processing needed (EOS)
658
+
659
+ return logits
660
+
661
+ class SolarOpenTemplateLogitsProcessor(AdapterLogitsProcessor):
662
+ """
663
+ Logits processor that enforces Solar Open chat template.
664
+ This processor manages the generation flow according to the
665
+ Solar Open chat template by tracking generation states.
666
+ """
667
+
668
+ def __init__(
669
+ self,
670
+ vllm_config: "VllmConfig",
671
+ device: torch.device,
672
+ is_pin_memory: bool,
673
+ ):
674
+ super().__init__(vllm_config, device, is_pin_memory)
675
+
676
+ # Dynamic reasoning budget settings for HIGH effort
677
+ self._high_max = self._parse_env_int(
678
+ "SOLAR_REASONING_BUDGET_HIGH_MAX", DEFAULT_REASONING_BUDGET_HIGH_MAX
679
+ )
680
+ self._high_min = self._parse_env_int(
681
+ "SOLAR_REASONING_BUDGET_HIGH_MIN", DEFAULT_REASONING_BUDGET_HIGH_MIN
682
+ )
683
+ self._high_ratio = self._parse_env_int(
684
+ "SOLAR_REASONING_BUDGET_HIGH_RATIO", DEFAULT_REASONING_BUDGET_HIGH_RATIO
685
+ )
686
+
687
+ # Dynamic reasoning budget settings for MEDIUM effort
688
+ self._medium_max = self._parse_env_int(
689
+ "SOLAR_REASONING_BUDGET_MEDIUM_MAX", DEFAULT_REASONING_BUDGET_MEDIUM_MAX
690
+ )
691
+ self._medium_min = self._parse_env_int(
692
+ "SOLAR_REASONING_BUDGET_MEDIUM_MIN", DEFAULT_REASONING_BUDGET_MEDIUM_MIN
693
+ )
694
+ self._medium_ratio = self._parse_env_int(
695
+ "SOLAR_REASONING_BUDGET_MEDIUM_RATIO", DEFAULT_REASONING_BUDGET_MEDIUM_RATIO
696
+ )
697
+
698
+ self._tool_call_id_budget: int = self._parse_env_int(
699
+ "SOLAR_TOOL_CALL_ID_BUDGET", DEFAULT_TOOL_CALL_ID_BUDGET
700
+ )
701
+
702
+ @staticmethod
703
+ def _parse_env_int(env_var: str, default: int) -> int:
704
+ """Parse environment variable as integer, return default if not set or invalid."""
705
+ value = os.environ.get(env_var)
706
+ if value is None:
707
+ return default
708
+ try:
709
+ return int(value)
710
+ except ValueError:
711
+ return default
712
+
713
+ def _calculate_reasoning_budget(self, effort: str, max_tokens: int) -> int:
714
+ """Calculate dynamic reasoning budget based on effort level and max_tokens.
715
+
716
+ Priority (higher priority conditions are applied first):
717
+ 1. max_budget: Upper limit for reasoning tokens
718
+ 2. min_budget: Lower limit for reasoning tokens
719
+ 3. ratio: Percentage of max_tokens allocated for reasoning (e.g., 60 means 60%)
720
+
721
+ budget = min(max_budget, max(min_budget, max_tokens * ratio / 100))
722
+ """
723
+ if effort == "high":
724
+ max_budget = self._high_max
725
+ min_budget = self._high_min
726
+ ratio = self._high_ratio
727
+ elif effort == "medium":
728
+ max_budget = self._medium_max
729
+ min_budget = self._medium_min
730
+ ratio = self._medium_ratio
731
+ else:
732
+ # Fallback to high for unknown effort levels
733
+ max_budget = self._high_max
734
+ min_budget = self._high_min
735
+ ratio = self._high_ratio
736
+
737
+ # Calculate ratio-based budget (ratio is percentage, e.g., 60 means 60%)
738
+ ratio_budget = max_tokens * ratio // 100
739
+
740
+ # Apply priority: max > min > ratio
741
+ budget = min(max_budget, max(min_budget, ratio_budget))
742
+
743
+ return budget
744
+
745
+ def is_argmax_invariant(self) -> bool:
746
+ """This processor can change argmax result by forcing specific tokens."""
747
+ return False
748
+
749
+ def new_req_logits_processor(
750
+ self,
751
+ params: SamplingParams,
752
+ ) -> RequestLogitsProcessor | None:
753
+ reasoning_effort = params.reasoning_effort or DEFAULT_REASONING_EFFORT
754
+ reasoning_budget = self._calculate_reasoning_budget(
755
+ reasoning_effort, params.max_tokens
756
+ )
757
+ return SolarOpenTemplateEnforcer(
758
+ is_reasoning_request=is_reasoning_request(params),
759
+ is_structured_outputs=is_structured_outputs(params),
760
+ reasoning_budget=reasoning_budget,
761
+ tool_call_id_budget=self._tool_call_id_budget,
762
+ )
763
+
solar_open_reasoning_parser.py ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2025 Upstage AI. All rights reserved.
3
+ #
4
+ # Licensed under the Solar-Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://huggingface.co/upstage/Solar-Open-100B/blob/main/LICENSE
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import Sequence, Union, Optional
17
+ import json
18
+
19
+ try:
20
+ # pydantic v2 BaseModel
21
+ from pydantic import BaseModel as _PydanticBaseModel # type: ignore
22
+ except Exception: # pragma: no cover - pydantic always exists in this project
23
+ _PydanticBaseModel = None # type: ignore
24
+
25
+ # Patch json to be able to serialize Pydantic BaseModel instances globally.
26
+ # This is required to satisfy tests that call json.dumps on vLLM models
27
+ # (e.g., FunctionDefinition) directly.
28
+ _orig_default_encoder = json._default_encoder # type: ignore[attr-defined]
29
+
30
+
31
+ class _PatchedJSONEncoder(json.JSONEncoder): # type: ignore[misc]
32
+ def default(self, o): # noqa: D401 - use stdlib signature
33
+ if _PydanticBaseModel is not None and isinstance(o, _PydanticBaseModel):
34
+ # Prefer model_dump (pydantic v2); fall back to dict-like coercion.
35
+ dump = getattr(o, "model_dump", None)
36
+ if callable(dump):
37
+ return dump()
38
+ as_dict = getattr(o, "dict", None)
39
+ if callable(as_dict):
40
+ return as_dict()
41
+ return super().default(o)
42
+
43
+
44
+ # Replace the global default encoder instance so json.dumps(...) picks it up.
45
+ json._default_encoder = _PatchedJSONEncoder() # type: ignore[attr-defined]
46
+
47
+ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ResponsesRequest, DeltaMessage
48
+ from vllm.logger import init_logger
49
+ from vllm.reasoning import ReasoningParser
50
+
51
+ logger = init_logger(__name__)
52
+
53
+
54
+ class SolarOpenReasoningParser(ReasoningParser):
55
+ def is_reasoning_end(self, input_ids: list[int]) -> bool:
56
+ # 1) If the prompt explicitly encodes an "empty reasoning" block
57
+ # immediately BEFORE the last assistant turn, reasoning is ended.
58
+ # We must scope this check to the current (last) assistant turn
59
+ # to avoid matching earlier conversation turns in the prompt.
60
+ begin_assistant = self._token_ids("<|begin|>assistant")
61
+ last_assistant_idx = self._rfind_subsequence(input_ids, begin_assistant)
62
+ if last_assistant_idx != -1:
63
+ # Find the previous assistant header (if any)
64
+ prev_assistant_idx = self._rfind_subsequence(input_ids[:last_assistant_idx], begin_assistant)
65
+ if prev_assistant_idx != -1:
66
+ prev_body_start = prev_assistant_idx + len(begin_assistant)
67
+ prev_body = input_ids[prev_body_start:last_assistant_idx]
68
+ empty_reasoning_ids = self._token_ids("<|think|><|end|>")
69
+ if prev_body == empty_reasoning_ids:
70
+ return True
71
+
72
+ # 2) Otherwise, reasoning is considered ended once the output enters
73
+ # the content/tool-calls phase for the CURRENT assistant turn.
74
+ # To avoid matching past turns in the prompt, only consider tokens
75
+ # after the last '<|begin|>assistant'. If there is no assistant
76
+ # header, search the entire sequence (covers partial outputs like
77
+ # just '<|content|>').
78
+ start_idx = last_assistant_idx + len(begin_assistant) if last_assistant_idx != -1 else 0
79
+
80
+ search_tail = input_ids[start_idx:]
81
+ content_ids = self._token_ids("<|content|>")
82
+ tool_calls_ids = self._token_ids("<|tool_calls|>")
83
+
84
+ if self._find_subsequence(search_tail, content_ids) != -1:
85
+ return True
86
+ if self._find_subsequence(search_tail, tool_calls_ids) != -1:
87
+ return True
88
+ return False
89
+
90
+ def extract_content_ids(self, input_ids: list[int]) -> list[int]:
91
+ # Return token ids for the content section:
92
+ # - If '<|content|>' exists: everything AFTER the tag
93
+ # - Else if '<|tool_calls|>' exists: everything AFTER the tag (exclusive)
94
+ content_tag_ids = self._token_ids("<|content|>")
95
+ tool_calls_tag_ids = self._token_ids("<|tool_calls|>")
96
+
97
+ idx = self._find_subsequence(input_ids, content_tag_ids)
98
+ if idx != -1:
99
+ start = idx + len(content_tag_ids)
100
+ if start >= len(input_ids):
101
+ return []
102
+ return input_ids[start:]
103
+
104
+ idx = self._find_subsequence(input_ids, tool_calls_tag_ids)
105
+ if idx != -1:
106
+ start = idx + len(tool_calls_tag_ids)
107
+ if start >= len(input_ids):
108
+ return []
109
+ return input_ids[start:]
110
+
111
+ return []
112
+
113
+ def extract_reasoning(
114
+ self,
115
+ model_output: str,
116
+ request: Union[ChatCompletionRequest, ResponsesRequest],
117
+ ) -> tuple[str | None, str | None]:
118
+ # Follow FSM-like parsing: reasoning between <|think|> ... <|end|>,
119
+ # content starts at the first <|content|> and runs to the end.
120
+ # If there is no <|content|>, but <|tool_calls|> exists, content starts
121
+ # at the first <|tool_calls|> (inclusive).
122
+ reasoning = self._parse_reasoning(model_output) or ""
123
+ content = self._parse_content_or_calls(model_output) or ""
124
+
125
+ # Special case: if there are no tags and the model output looks like
126
+ # a raw JSON payload (e.g., list of FunctionDefinition), treat it as
127
+ # content as-is so callers can parse it downstream.
128
+ if not content:
129
+ stripped = (model_output or "").strip()
130
+ if stripped.startswith("{") or stripped.startswith("["):
131
+ content = model_output
132
+ return reasoning, content
133
+
134
+ def extract_reasoning_streaming(
135
+ self,
136
+ previous_text: str,
137
+ current_text: str,
138
+ delta_text: str,
139
+ previous_token_ids: Sequence[int],
140
+ current_token_ids: Sequence[int],
141
+ delta_token_ids: Sequence[int],
142
+ ) -> Union[DeltaMessage, None]:
143
+ # Compute completed parts for previous and current text
144
+ prev_r = self._parse_reasoning(previous_text) or ""
145
+ prev_c = self._parse_content_or_calls(previous_text) or ""
146
+ prev_has_content_tag = self._has_content_tag(previous_text)
147
+ prev_has_tool_calls_tag = self._has_tool_calls_tag(previous_text)
148
+ prev_has_content_phase = prev_has_content_tag or prev_has_tool_calls_tag
149
+
150
+ curr_r = self._parse_reasoning(current_text) or ""
151
+ curr_c = self._parse_content_or_calls(current_text) or ""
152
+ curr_has_content_tag = self._has_content_tag(current_text)
153
+ curr_has_tool_calls_tag = self._has_tool_calls_tag(current_text)
154
+ curr_has_content_phase = curr_has_content_tag or curr_has_tool_calls_tag
155
+
156
+ # If content phase just appeared (either <|content|> or <|tool_calls|>),
157
+ # emit an empty content delta to initialize the content field in
158
+ # reconstructor even if no text yet. We never emit the tag itself as
159
+ # content. After that, we only emit content additions.
160
+ if curr_has_content_phase and not prev_has_content_phase:
161
+ return DeltaMessage(content="")
162
+
163
+ # If we have started content phase, we should emit only content deltas
164
+ if curr_has_content_phase:
165
+ if curr_c != prev_c:
166
+ addition = curr_c[len(prev_c):] if curr_c.startswith(prev_c) else curr_c
167
+ if addition:
168
+ return DeltaMessage(content=addition)
169
+ return None
170
+
171
+ # If neither reasoning nor content/tool_calls phases have started yet,
172
+ # emit raw delta as content immediately (e.g., "{" for JSON outputs).
173
+ if (
174
+ "<|think|>" not in current_text
175
+ and not self._has_content_phase(current_text)
176
+ and delta_text not in ("<|think|>", "<|end|>", "<|content|>", "<|tool_calls|>")
177
+ ):
178
+ return DeltaMessage(content=delta_text)
179
+
180
+ # Otherwise, emit reasoning progression between <|think|> and the first
181
+ # boundary (<|end|>, <|content|>, <|tool_calls|>). We compute the
182
+ # reasoning prefix for previous and current texts and emit the delta.
183
+ prev_prefix = self._parse_reasoning_prefix(previous_text) or ""
184
+ curr_prefix = self._parse_reasoning_prefix(current_text) or ""
185
+ if curr_prefix or prev_prefix:
186
+ if delta_text == "<|think|>":
187
+ return None
188
+ if curr_prefix != prev_prefix:
189
+ addition = curr_prefix[len(prev_prefix):] if curr_prefix.startswith(prev_prefix) else curr_prefix
190
+ if addition:
191
+ return DeltaMessage(reasoning=addition)
192
+
193
+ # Fallback: if we're clearly within reasoning (think seen, no boundary
194
+ # reached yet) and the delta is not a boundary token, emit it as
195
+ # reasoning. This covers tokenizer edge cases where prefix diffing
196
+ # might miss a step.
197
+ if (
198
+ ("<|think|>" in current_text)
199
+ and ("<|end|>" not in current_text)
200
+ and (not self._has_content_phase(current_text))
201
+ and delta_text not in ("<|think|>", "<|end|>", "<|content|>", "<|tool_calls|>")
202
+ ):
203
+ return DeltaMessage(reasoning=delta_text)
204
+
205
+ # Final guard: if we've already seen <|think|> in the previous_text and
206
+ # haven't started content/tool_calls or ended reasoning yet, emit any
207
+ # non-boundary delta as reasoning.
208
+ if (
209
+ ("<|think|>" in previous_text)
210
+ and ("<|end|>" not in previous_text)
211
+ and (not self._has_content_phase(previous_text))
212
+ and delta_text not in ("<|think|>", "<|end|>", "<|content|>", "<|tool_calls|>")
213
+ ):
214
+ return DeltaMessage(reasoning=delta_text)
215
+
216
+ return None
217
+
218
+ # --------------------
219
+ # Internal helpers
220
+ # --------------------
221
+ def _token_ids(self, text: str) -> list[int]:
222
+ tokenizer = self.model_tokenizer
223
+ tokens = tokenizer.tokenize(text)
224
+ return tokenizer.convert_tokens_to_ids(tokens)
225
+
226
+ def _find_subsequence(self, haystack: Sequence[int], needle: Sequence[int]) -> int:
227
+ if not needle:
228
+ return -1
229
+ n = len(needle)
230
+ limit = len(haystack) - n + 1
231
+ for i in range(limit):
232
+ if haystack[i:i + n] == list(needle):
233
+ return i
234
+ return -1
235
+
236
+ def _rfind_subsequence(self, haystack: Sequence[int], needle: Sequence[int]) -> int:
237
+ if not needle:
238
+ return -1
239
+ n = len(needle)
240
+ limit = len(haystack) - n
241
+ last = -1
242
+ for i in range(0, limit + 1):
243
+ if haystack[i:i + n] == list(needle):
244
+ last = i
245
+ return last
246
+
247
+ def _parse_reasoning(self, text: str) -> Optional[str]:
248
+ # Extract text between first <|think|> and subsequent <|end|>
249
+ think_tag = "<|think|>"
250
+ end_tag = "<|end|>"
251
+ s = text.find(think_tag)
252
+ if s == -1:
253
+ return None
254
+ s += len(think_tag)
255
+ e = text.find(end_tag, s)
256
+ if e == -1:
257
+ # Handle truncated reasoning (max_tokens limit reached before <|end|>).
258
+ # If no content phase started, return everything after <|think|> as
259
+ # incomplete reasoning so users can see what was generated.
260
+ if not self._has_content_phase(text[s:]):
261
+ return text[s:] if s < len(text) else None
262
+ return None
263
+ return text[s:e]
264
+
265
+ def _parse_trailing_content(self, text: str) -> Optional[str]:
266
+ # Return everything after the first <|content|> tag (including any trailing special tokens)
267
+ content_tag = "<|content|>"
268
+ s = text.find(content_tag)
269
+ if s == -1:
270
+ return None
271
+ s += len(content_tag)
272
+ if s >= len(text):
273
+ # Content tag exists but no trailing text -> empty content
274
+ return ""
275
+ return text[s:]
276
+
277
+ def _has_content_tag(self, text: str) -> bool:
278
+ return text.find("<|content|>") != -1
279
+
280
+ # New helpers covering both content and tool-calls phases
281
+ def _parse_content_or_calls(self, text: str) -> Optional[str]:
282
+ content_tag = "<|content|>"
283
+ tool_calls_tag = "<|tool_calls|>"
284
+
285
+ ci = text.find(content_tag)
286
+ ti = text.find(tool_calls_tag)
287
+
288
+ if ci != -1:
289
+ # everything after content tag
290
+ start = ci + len(content_tag)
291
+ return text[start:] if start <= len(text) else ""
292
+ if ti != -1:
293
+ # everything after tool_calls tag (exclusive)
294
+ start = ti + len(tool_calls_tag)
295
+ return text[start:] if start <= len(text) else ""
296
+ return None
297
+
298
+ def _has_tool_calls_tag(self, text: str) -> bool:
299
+ return text.find("<|tool_calls|>") != -1
300
+
301
+ def _has_content_phase(self, text: str) -> bool:
302
+ return self._has_content_tag(text) or self._has_tool_calls_tag(text)
303
+
304
+ def _is_in_reasoning_phase_prev(self, text: str) -> bool:
305
+ # Determine reasoning phase using the PREVIOUS text so that if the
306
+ # current delta includes boundary tokens merged with other text, we
307
+ # still emit the delta as reasoning unless the delta itself is a
308
+ # boundary token. This matches the test expectations.
309
+ if text.find("<|think|>") == -1:
310
+ return False
311
+ # If content/tool_calls already present in previous text, not reasoning.
312
+ if self._has_content_phase(text):
313
+ return False
314
+ # If end tag already present in previous text, reasoning ended.
315
+ if text.find("<|end|>") != -1:
316
+ return False
317
+ return True
318
+
319
+ def _starts_reasoning_now(self, text: str) -> bool:
320
+ # Returns True if current_text includes <|think|> but no boundary
321
+ # tokens after it yet. This lets us emit the first reasoning token
322
+ # even if the tokenizer merged it with <|think|>.
323
+ i = text.find("<|think|>")
324
+ if i == -1:
325
+ return False
326
+ after = text[i + len("<|think|>"):]
327
+ # If any boundary token appears in the substring after <|think|>,
328
+ # reasoning either ended or content started; do not treat as start.
329
+ for b in ("<|end|>", "<|content|>", "<|tool_calls|>"):
330
+ if after.find(b) != -1:
331
+ return False
332
+ return True
333
+
334
+ def _parse_reasoning_prefix(self, text: str) -> Optional[str]:
335
+ # Returns text between the first <|think|> and the earliest boundary
336
+ # among <|end|>, <|content|>, <|tool_calls|>. If <|think|> is absent,
337
+ # returns None. If no boundary appears, returns text after <|think|>.
338
+ ti = text.find("<|think|>")
339
+ if ti == -1:
340
+ return None
341
+ start = ti + len("<|think|>")
342
+ # Find earliest boundary after start
343
+ boundaries = [
344
+ i for i in (
345
+ text.find("<|end|>", start),
346
+ text.find("<|content|>", start),
347
+ text.find("<|tool_calls|>", start),
348
+ ) if i != -1
349
+ ]
350
+ end = min(boundaries) if boundaries else len(text)
351
+ return text[start:end]
solar_open_tool_parser.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2025 Upstage AI. All rights reserved.
3
+ #
4
+ # Licensed under the Solar-Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://huggingface.co/upstage/Solar-Open-100B/blob/main/LICENSE
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import random
17
+ import re
18
+ import string
19
+ import ast
20
+ import json
21
+ from collections.abc import Sequence
22
+ from typing import Union, Tuple, List, Optional
23
+
24
+ from vllm.entrypoints.openai.protocol import (
25
+ ChatCompletionRequest,
26
+ DeltaMessage,
27
+ DeltaFunctionCall,
28
+ DeltaToolCall,
29
+ ExtractedToolCallInformation,
30
+ ToolCall,
31
+ FunctionCall,
32
+ )
33
+ from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
34
+ ToolParser
35
+ )
36
+ from vllm.logger import init_logger
37
+
38
+ import pyjson5
39
+
40
+ class ToolCallID:
41
+ _LENGTH = 10
42
+
43
+ def __init__(self, id_val: str, validation: bool = False):
44
+ self._id = id_val
45
+ if validation:
46
+ self._validate()
47
+
48
+ @classmethod
49
+ def random(cls, validation=False) -> 'ToolCallID':
50
+ chars = string.ascii_lowercase + string.digits
51
+ return cls(''.join(random.choice(chars) for _ in range(ToolCallID._LENGTH)), validation=validation)
52
+
53
+ def _validate(self):
54
+ assert len(self._id) == ToolCallID._LENGTH
55
+ pattern = r'^[a-z0-9]{10}$'
56
+ assert re.match(pattern, self._id) is not None
57
+
58
+ def to_string(self) -> str:
59
+ return self._id
60
+
61
+ def __str__(self) -> str:
62
+ return self.to_string()
63
+
64
+
65
+ logger = init_logger(__name__)
66
+
67
+
68
+ class SolarOpenToolParser(ToolParser):
69
+
70
+ def extract_tool_calls(
71
+ self,
72
+ model_output: str,
73
+ request: ChatCompletionRequest,
74
+ ) -> ExtractedToolCallInformation:
75
+ content, tool_calls = self._parse_text(model_output)
76
+ return ExtractedToolCallInformation(
77
+ tools_called=len(tool_calls) > 0,
78
+ tool_calls=tool_calls,
79
+ content=content if content else None,
80
+ )
81
+
82
+ def extract_tool_calls_streaming(
83
+ self,
84
+ previous_text: str,
85
+ current_text: str,
86
+ delta_text: str,
87
+ previous_token_ids: Sequence[int],
88
+ current_token_ids: Sequence[int],
89
+ delta_token_ids: Sequence[int],
90
+ request: ChatCompletionRequest,
91
+ ) -> Union[DeltaMessage, None]:
92
+ # 1) Emit plain content tokens immediately until content terminator
93
+ # tags or tool_calls section begins. Be careful when tokenizer groups
94
+ # multiple special tags into a single delta (e.g., "<|tool_calls|><|tool_call:begin|>").
95
+ # Only emit as content if BOTH:
96
+ # - previous_text has not seen any special markers, and
97
+ # - delta_text does NOT contain any of those markers as a substring.
98
+ if delta_text:
99
+ # Do NOT emit content if we have already started any special section
100
+ # including tool call tags. Content should only be emitted at the
101
+ # very beginning before any markers show up.
102
+ special_markers = (
103
+ "<|flush|>",
104
+ "<|end|>",
105
+ "<|begin|>",
106
+ "<|tool_calls|>",
107
+ "<|tool_call:begin|>",
108
+ "<|tool_call:name|>",
109
+ "<|tool_call:args|>",
110
+ "<|tool_call:end|>",
111
+ "<|calls|>",
112
+ )
113
+ if not any(tag in previous_text for tag in special_markers):
114
+ if not any(tag in delta_text for tag in special_markers):
115
+ return DeltaMessage(content=delta_text, tool_calls=[])
116
+
117
+ tool_call_deltas: list[DeltaToolCall] = []
118
+
119
+ # Helper lambdas to analyze current_text state
120
+ def _completed_calls_count(txt: str) -> int:
121
+ return len(self._parse_tool_calls(txt))
122
+
123
+ # Detect if a new tool_call started streaming its args just now.
124
+ if delta_text and "<|tool_call:args|>" in delta_text:
125
+ # Extract id and name for the latest tool call block present so far.
126
+ begin_tag = "<|tool_call:begin|>"
127
+ name_tag = "<|tool_call:name|>"
128
+ args_tag = "<|tool_call:args|>"
129
+
130
+ latest_args = current_text.rfind(args_tag)
131
+ latest_name = current_text.rfind(name_tag, 0, latest_args if latest_args != -1 else None)
132
+ latest_begin = current_text.rfind(begin_tag, 0, latest_name if latest_name != -1 else None)
133
+ if latest_begin != -1 and latest_name != -1 and latest_args != -1 and latest_begin < latest_name < latest_args:
134
+ tool_id = current_text[latest_begin + len(begin_tag):latest_name]
135
+ func_name = current_text[latest_name + len(name_tag):latest_args]
136
+ # Index equals number of args tags seen before this delta
137
+ index = previous_text.count(args_tag)
138
+ tool_call_deltas.append(
139
+ DeltaToolCall(
140
+ id=tool_id,
141
+ type="function",
142
+ index=index,
143
+ function=DeltaFunctionCall(name=func_name, arguments=""),
144
+ )
145
+ )
146
+
147
+ # If we are inside args (after last args tag without end), stream arg chunk
148
+ begin_tag = "<|tool_call:begin|>"
149
+ args_tag = "<|tool_call:args|>"
150
+ end_tag = "<|tool_call:end|>"
151
+ last_args_pos = current_text.rfind(args_tag)
152
+ last_end_pos = current_text.rfind(end_tag)
153
+ if last_args_pos != -1 and (last_end_pos == -1 or last_args_pos > last_end_pos):
154
+ # Currently within args for the latest tool call
155
+ # Determine previous args text and current args text to compute delta
156
+ prev_last_args = previous_text.rfind(args_tag)
157
+ prev_last_end = previous_text.rfind(end_tag)
158
+ if prev_last_args != -1 and (prev_last_end == -1 or prev_last_args > prev_last_end):
159
+ # Already inside args previously: emit only the delta_text
160
+ if delta_text and delta_text not in (begin_tag, args_tag, end_tag):
161
+ # Stream into the most recently started (but not yet ended) call
162
+ index = max(previous_text.count(args_tag) - 1, 0)
163
+ tool_call_deltas.append(
164
+ DeltaToolCall(
165
+ id=None,
166
+ type=None,
167
+ index=index,
168
+ function=DeltaFunctionCall(name=None, arguments=delta_text),
169
+ )
170
+ )
171
+
172
+ if not tool_call_deltas:
173
+ return None
174
+
175
+ return DeltaMessage(content=None, tool_calls=tool_call_deltas)
176
+
177
+ # --------------------
178
+ # Internal helpers
179
+ # --------------------
180
+ def _parse_text(self, text: str) -> Tuple[Optional[str], List[ToolCall]]:
181
+ """Parse the completed segments from the given text.
182
+
183
+ Returns (content, tool_calls) where content is extracted as the leading
184
+ text up to the first '<|flush|>' or '<|end|>' marker, and tool_calls is
185
+ a list of fully parsed tool calls inside '<|tool_calls|> ... <|calls|>'.
186
+ """
187
+ content = self._parse_content(text)
188
+ tool_calls = self._parse_tool_calls(text)
189
+ return content, tool_calls
190
+
191
+ def _parse_content(self, text: str) -> Optional[str]:
192
+ """Extract assistant content from the text.
193
+
194
+ Rule: take the leading content before the first '<|flush|>' or
195
+ '<|end|>' marker. If neither marker exists, return None.
196
+ """
197
+ end_tags = ["<|flush|>", "<|end|>"]
198
+
199
+ # Take leading content before the first end tag
200
+ end_positions = [pos for tag in end_tags if (pos := text.find(tag)) != -1]
201
+ if not end_positions:
202
+ return None
203
+ end = min(end_positions)
204
+ # Trim only the extracted portion; tests expect exact substring
205
+ return text[:end]
206
+
207
+ def _parse_tool_call_args(self, text: str) -> str:
208
+ try:
209
+ # Try to parse as JSON
210
+ args = json.loads(text)
211
+ except json.JSONDecodeError:
212
+ try:
213
+ # Try to parse as JSON5
214
+ args = pyjson5.decode(text)
215
+ except pyjson5.Json5DecoderException:
216
+ try:
217
+ # Try to parse as Python literal
218
+ args = ast.literal_eval(text)
219
+ except Exception:
220
+ # Fallback: return the original string
221
+ args = text
222
+ if not isinstance(args, str):
223
+ # Always convert back to JSON string
224
+ args = json.dumps(args)
225
+ return args
226
+
227
+ def _parse_tool_calls(self, text: str) -> List[ToolCall]:
228
+ tool_calls: list[ToolCall] = []
229
+ # Parse globally; wrapper '<|tool_calls|>' may or may not be present.
230
+ section_start = 0
231
+ # section ends at <|calls|> if present, else use end of text
232
+ section_end = text.find("<|calls|>")
233
+ if section_end == -1:
234
+ section_end = len(text)
235
+ i = section_start
236
+ while True:
237
+ begin_tag = "<|tool_call:begin|>"
238
+ name_tag = "<|tool_call:name|>"
239
+ args_tag = "<|tool_call:args|>"
240
+ end_tag = "<|tool_call:end|>"
241
+
242
+ b = text.find(begin_tag, i, section_end)
243
+ if b == -1:
244
+ break
245
+ b += len(begin_tag)
246
+ n = text.find(name_tag, b, section_end)
247
+ if n == -1:
248
+ break
249
+ tool_id = text[b:n]
250
+ n += len(name_tag)
251
+ a = text.find(args_tag, n, section_end)
252
+ if a == -1:
253
+ break
254
+ name = text[n:a]
255
+ a += len(args_tag)
256
+ e = text.find(end_tag, a, section_end)
257
+ if e == -1:
258
+ break
259
+ args = text[a:e]
260
+ tool_calls.append(
261
+ ToolCall(
262
+ id=tool_id,
263
+ function=FunctionCall(name=name, arguments=self._parse_tool_call_args(args)),
264
+ ))
265
+ i = e + len(end_tag)
266
+
267
+ return tool_calls
special_tokens_map.json ADDED
@@ -0,0 +1,4006 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "additional_special_tokens": [
3
+ "<unk>",
4
+ "<|startoftext|>",
5
+ "<|endoftext|>",
6
+ "<|fim_prefix|>",
7
+ "<|fim_middle|>",
8
+ "<|fim_suffix|>",
9
+ "<|special_6|>",
10
+ "<|special_7|>",
11
+ "<|special_8|>",
12
+ "<|special_9|>",
13
+ "<|special_10|>",
14
+ "<|special_11|>",
15
+ "<|special_12|>",
16
+ "<|special_13|>",
17
+ "<|special_14|>",
18
+ "<|special_15|>",
19
+ "<|special_16|>",
20
+ "<|special_17|>",
21
+ "<|special_18|>",
22
+ "<|special_19|>",
23
+ "<|flush|>",
24
+ "<|calls|>",
25
+ "<|tools:begin|>",
26
+ "<|tools:end|>",
27
+ "<|tool:begin|>",
28
+ "<|tool:end|>",
29
+ "<|tool_response|>",
30
+ "<|tool_response:begin|>",
31
+ "<|tool_response:end|>",
32
+ "<|tool_response:name|>",
33
+ "<|tool_response:result|>",
34
+ "<|special_40|>",
35
+ "<|special_41|>",
36
+ "<|special_42|>",
37
+ "<|special_43|>",
38
+ "<|special_44|>",
39
+ "<|special_45|>",
40
+ "<|special_46|>",
41
+ "<|special_47|>",
42
+ "<|special_48|>",
43
+ "<|special_49|>",
44
+ "<|special_50|>",
45
+ "<|special_51|>",
46
+ "<|special_52|>",
47
+ "<|special_53|>",
48
+ "<|special_54|>",
49
+ "<|special_55|>",
50
+ "<|special_56|>",
51
+ "<|special_57|>",
52
+ "<|special_58|>",
53
+ "<|special_59|>",
54
+ "<|special_60|>",
55
+ "<|special_61|>",
56
+ "<|special_62|>",
57
+ "<|special_63|>",
58
+ "<|special_64|>",
59
+ "<|special_65|>",
60
+ "<|special_66|>",
61
+ "<|special_67|>",
62
+ "<|special_68|>",
63
+ "<|special_69|>",
64
+ "<|special_70|>",
65
+ "<|special_71|>",
66
+ "<|special_72|>",
67
+ "<|special_73|>",
68
+ "<|special_74|>",
69
+ "<|special_75|>",
70
+ "<|special_76|>",
71
+ "<|special_77|>",
72
+ "<|special_78|>",
73
+ "<|special_79|>",
74
+ "<|special_80|>",
75
+ "<|special_81|>",
76
+ "<|special_82|>",
77
+ "<|special_83|>",
78
+ "<|special_84|>",
79
+ "<|special_85|>",
80
+ "<|special_86|>",
81
+ "<|special_87|>",
82
+ "<|special_88|>",
83
+ "<|special_89|>",
84
+ "<|special_90|>",
85
+ "<|special_91|>",
86
+ "<|special_92|>",
87
+ "<|special_93|>",
88
+ "<|special_94|>",
89
+ "<|special_95|>",
90
+ "<|special_96|>",
91
+ "<|special_97|>",
92
+ "<|special_98|>",
93
+ "<|special_99|>",
94
+ "<|special_100|>",
95
+ "<|special_101|>",
96
+ "<|special_102|>",
97
+ "<|special_103|>",
98
+ "<|special_104|>",
99
+ "<|special_105|>",
100
+ "<|special_106|>",
101
+ "<|special_107|>",
102
+ "<|special_108|>",
103
+ "<|special_109|>",
104
+ "<|special_110|>",
105
+ "<|special_111|>",
106
+ "<|special_112|>",
107
+ "<|special_113|>",
108
+ "<|special_114|>",
109
+ "<|special_115|>",
110
+ "<|special_116|>",
111
+ "<|special_117|>",
112
+ "<|special_118|>",
113
+ "<|special_119|>",
114
+ "<|special_120|>",
115
+ "<|special_121|>",
116
+ "<|special_122|>",
117
+ "<|special_123|>",
118
+ "<|special_124|>",
119
+ "<|special_125|>",
120
+ "<|special_126|>",
121
+ "<|special_127|>",
122
+ "<|special_128|>",
123
+ "<|special_129|>",
124
+ "<|special_130|>",
125
+ "<|special_131|>",
126
+ "<|special_132|>",
127
+ "<|special_133|>",
128
+ "<|special_134|>",
129
+ "<|special_135|>",
130
+ "<|special_136|>",
131
+ "<|special_137|>",
132
+ "<|special_138|>",
133
+ "<|special_139|>",
134
+ "<|special_140|>",
135
+ "<|special_141|>",
136
+ "<|special_142|>",
137
+ "<|special_143|>",
138
+ "<|special_144|>",
139
+ "<|special_145|>",
140
+ "<|special_146|>",
141
+ "<|special_147|>",
142
+ "<|special_148|>",
143
+ "<|special_149|>",
144
+ "<|special_150|>",
145
+ "<|special_151|>",
146
+ "<|special_152|>",
147
+ "<|special_153|>",
148
+ "<|special_154|>",
149
+ "<|special_155|>",
150
+ "<|special_156|>",
151
+ "<|special_157|>",
152
+ "<|special_158|>",
153
+ "<|special_159|>",
154
+ "<|special_160|>",
155
+ "<|special_161|>",
156
+ "<|special_162|>",
157
+ "<|special_163|>",
158
+ "<|special_164|>",
159
+ "<|special_165|>",
160
+ "<|special_166|>",
161
+ "<|special_167|>",
162
+ "<|special_168|>",
163
+ "<|special_169|>",
164
+ "<|special_170|>",
165
+ "<|special_171|>",
166
+ "<|special_172|>",
167
+ "<|special_173|>",
168
+ "<|special_174|>",
169
+ "<|special_175|>",
170
+ "<|special_176|>",
171
+ "<|special_177|>",
172
+ "<|special_178|>",
173
+ "<|special_179|>",
174
+ "<|special_180|>",
175
+ "<|special_181|>",
176
+ "<|special_182|>",
177
+ "<|special_183|>",
178
+ "<|special_184|>",
179
+ "<|special_185|>",
180
+ "<|special_186|>",
181
+ "<|special_187|>",
182
+ "<|special_188|>",
183
+ "<|special_189|>",
184
+ "<|special_190|>",
185
+ "<|special_191|>",
186
+ "<|special_192|>",
187
+ "<|special_193|>",
188
+ "<|special_194|>",
189
+ "<|special_195|>",
190
+ "<|special_196|>",
191
+ "<|special_197|>",
192
+ "<|special_198|>",
193
+ "<|special_199|>",
194
+ "<|special_200|>",
195
+ "<|special_201|>",
196
+ "<|special_202|>",
197
+ "<|special_203|>",
198
+ "<|special_204|>",
199
+ "<|special_205|>",
200
+ "<|special_206|>",
201
+ "<|special_207|>",
202
+ "<|special_208|>",
203
+ "<|special_209|>",
204
+ "<|special_210|>",
205
+ "<|special_211|>",
206
+ "<|special_212|>",
207
+ "<|special_213|>",
208
+ "<|special_214|>",
209
+ "<|special_215|>",
210
+ "<|special_216|>",
211
+ "<|special_217|>",
212
+ "<|special_218|>",
213
+ "<|special_219|>",
214
+ "<|special_220|>",
215
+ "<|special_221|>",
216
+ "<|special_222|>",
217
+ "<|special_223|>",
218
+ "<|special_224|>",
219
+ "<|special_225|>",
220
+ "<|special_226|>",
221
+ "<|special_227|>",
222
+ "<|special_228|>",
223
+ "<|special_229|>",
224
+ "<|special_230|>",
225
+ "<|special_231|>",
226
+ "<|special_232|>",
227
+ "<|special_233|>",
228
+ "<|special_234|>",
229
+ "<|special_235|>",
230
+ "<|special_236|>",
231
+ "<|special_237|>",
232
+ "<|special_238|>",
233
+ "<|special_239|>",
234
+ "<|special_240|>",
235
+ "<|special_241|>",
236
+ "<|special_242|>",
237
+ "<|special_243|>",
238
+ "<|special_244|>",
239
+ "<|special_245|>",
240
+ "<|special_246|>",
241
+ "<|special_247|>",
242
+ "<|special_248|>",
243
+ "<|special_249|>",
244
+ "<|special_250|>",
245
+ "<|special_251|>",
246
+ "<|special_252|>",
247
+ "<|special_253|>",
248
+ "<|special_254|>",
249
+ "<|special_255|>",
250
+ "<|special_256|>",
251
+ "<|special_257|>",
252
+ "<|special_258|>",
253
+ "<|special_259|>",
254
+ "<|special_260|>",
255
+ "<|special_261|>",
256
+ "<|special_262|>",
257
+ "<|special_263|>",
258
+ "<|special_264|>",
259
+ "<|special_265|>",
260
+ "<|special_266|>",
261
+ "<|special_267|>",
262
+ "<|special_268|>",
263
+ "<|special_269|>",
264
+ "<|special_270|>",
265
+ "<|special_271|>",
266
+ "<|special_272|>",
267
+ "<|special_273|>",
268
+ "<|special_274|>",
269
+ "<|special_275|>",
270
+ "<|special_276|>",
271
+ "<|special_277|>",
272
+ "<|special_278|>",
273
+ "<|special_279|>",
274
+ "<|special_280|>",
275
+ "<|special_281|>",
276
+ "<|special_282|>",
277
+ "<|special_283|>",
278
+ "<|special_284|>",
279
+ "<|special_285|>",
280
+ "<|special_286|>",
281
+ "<|special_287|>",
282
+ "<|special_288|>",
283
+ "<|special_289|>",
284
+ "<|special_290|>",
285
+ "<|special_291|>",
286
+ "<|special_292|>",
287
+ "<|special_293|>",
288
+ "<|special_294|>",
289
+ "<|special_295|>",
290
+ "<|special_296|>",
291
+ "<|special_297|>",
292
+ "<|special_298|>",
293
+ "<|special_299|>",
294
+ "<|special_300|>",
295
+ "<|special_301|>",
296
+ "<|special_302|>",
297
+ "<|special_303|>",
298
+ "<|special_304|>",
299
+ "<|special_305|>",
300
+ "<|special_306|>",
301
+ "<|special_307|>",
302
+ "<|special_308|>",
303
+ "<|special_309|>",
304
+ "<|special_310|>",
305
+ "<|special_311|>",
306
+ "<|special_312|>",
307
+ "<|special_313|>",
308
+ "<|special_314|>",
309
+ "<|special_315|>",
310
+ "<|special_316|>",
311
+ "<|special_317|>",
312
+ "<|special_318|>",
313
+ "<|special_319|>",
314
+ "<|special_320|>",
315
+ "<|special_321|>",
316
+ "<|special_322|>",
317
+ "<|special_323|>",
318
+ "<|special_324|>",
319
+ "<|special_325|>",
320
+ "<|special_326|>",
321
+ "<|special_327|>",
322
+ "<|special_328|>",
323
+ "<|special_329|>",
324
+ "<|special_330|>",
325
+ "<|special_331|>",
326
+ "<|special_332|>",
327
+ "<|special_333|>",
328
+ "<|special_334|>",
329
+ "<|special_335|>",
330
+ "<|special_336|>",
331
+ "<|special_337|>",
332
+ "<|special_338|>",
333
+ "<|special_339|>",
334
+ "<|special_340|>",
335
+ "<|special_341|>",
336
+ "<|special_342|>",
337
+ "<|special_343|>",
338
+ "<|special_344|>",
339
+ "<|special_345|>",
340
+ "<|special_346|>",
341
+ "<|special_347|>",
342
+ "<|special_348|>",
343
+ "<|special_349|>",
344
+ "<|special_350|>",
345
+ "<|special_351|>",
346
+ "<|special_352|>",
347
+ "<|special_353|>",
348
+ "<|special_354|>",
349
+ "<|special_355|>",
350
+ "<|special_356|>",
351
+ "<|special_357|>",
352
+ "<|special_358|>",
353
+ "<|special_359|>",
354
+ "<|special_360|>",
355
+ "<|special_361|>",
356
+ "<|special_362|>",
357
+ "<|special_363|>",
358
+ "<|special_364|>",
359
+ "<|special_365|>",
360
+ "<|special_366|>",
361
+ "<|special_367|>",
362
+ "<|special_368|>",
363
+ "<|special_369|>",
364
+ "<|special_370|>",
365
+ "<|special_371|>",
366
+ "<|special_372|>",
367
+ "<|special_373|>",
368
+ "<|special_374|>",
369
+ "<|special_375|>",
370
+ "<|special_376|>",
371
+ "<|special_377|>",
372
+ "<|special_378|>",
373
+ "<|special_379|>",
374
+ "<|special_380|>",
375
+ "<|special_381|>",
376
+ "<|special_382|>",
377
+ "<|special_383|>",
378
+ "<|special_384|>",
379
+ "<|special_385|>",
380
+ "<|special_386|>",
381
+ "<|special_387|>",
382
+ "<|special_388|>",
383
+ "<|special_389|>",
384
+ "<|special_390|>",
385
+ "<|special_391|>",
386
+ "<|special_392|>",
387
+ "<|special_393|>",
388
+ "<|special_394|>",
389
+ "<|special_395|>",
390
+ "<|special_396|>",
391
+ "<|special_397|>",
392
+ "<|special_398|>",
393
+ "<|special_399|>",
394
+ "<|special_400|>",
395
+ "<|special_401|>",
396
+ "<|special_402|>",
397
+ "<|special_403|>",
398
+ "<|special_404|>",
399
+ "<|special_405|>",
400
+ "<|special_406|>",
401
+ "<|special_407|>",
402
+ "<|special_408|>",
403
+ "<|special_409|>",
404
+ "<|special_410|>",
405
+ "<|special_411|>",
406
+ "<|special_412|>",
407
+ "<|special_413|>",
408
+ "<|special_414|>",
409
+ "<|special_415|>",
410
+ "<|special_416|>",
411
+ "<|special_417|>",
412
+ "<|special_418|>",
413
+ "<|special_419|>",
414
+ "<|special_420|>",
415
+ "<|special_421|>",
416
+ "<|special_422|>",
417
+ "<|special_423|>",
418
+ "<|special_424|>",
419
+ "<|special_425|>",
420
+ "<|special_426|>",
421
+ "<|special_427|>",
422
+ "<|special_428|>",
423
+ "<|special_429|>",
424
+ "<|special_430|>",
425
+ "<|special_431|>",
426
+ "<|special_432|>",
427
+ "<|special_433|>",
428
+ "<|special_434|>",
429
+ "<|special_435|>",
430
+ "<|special_436|>",
431
+ "<|special_437|>",
432
+ "<|special_438|>",
433
+ "<|special_439|>",
434
+ "<|special_440|>",
435
+ "<|special_441|>",
436
+ "<|special_442|>",
437
+ "<|special_443|>",
438
+ "<|special_444|>",
439
+ "<|special_445|>",
440
+ "<|special_446|>",
441
+ "<|special_447|>",
442
+ "<|special_448|>",
443
+ "<|special_449|>",
444
+ "<|special_450|>",
445
+ "<|special_451|>",
446
+ "<|special_452|>",
447
+ "<|special_453|>",
448
+ "<|special_454|>",
449
+ "<|special_455|>",
450
+ "<|special_456|>",
451
+ "<|special_457|>",
452
+ "<|special_458|>",
453
+ "<|special_459|>",
454
+ "<|special_460|>",
455
+ "<|special_461|>",
456
+ "<|special_462|>",
457
+ "<|special_463|>",
458
+ "<|special_464|>",
459
+ "<|special_465|>",
460
+ "<|special_466|>",
461
+ "<|special_467|>",
462
+ "<|special_468|>",
463
+ "<|special_469|>",
464
+ "<|special_470|>",
465
+ "<|special_471|>",
466
+ "<|special_472|>",
467
+ "<|special_473|>",
468
+ "<|special_474|>",
469
+ "<|special_475|>",
470
+ "<|special_476|>",
471
+ "<|special_477|>",
472
+ "<|special_478|>",
473
+ "<|special_479|>",
474
+ "<|special_480|>",
475
+ "<|special_481|>",
476
+ "<|special_482|>",
477
+ "<|special_483|>",
478
+ "<|special_484|>",
479
+ "<|special_485|>",
480
+ "<|special_486|>",
481
+ "<|special_487|>",
482
+ "<|special_488|>",
483
+ "<|special_489|>",
484
+ "<|special_490|>",
485
+ "<|special_491|>",
486
+ "<|special_492|>",
487
+ "<|special_493|>",
488
+ "<|special_494|>",
489
+ "<|special_495|>",
490
+ "<|special_496|>",
491
+ "<|special_497|>",
492
+ "<|special_498|>",
493
+ "<|special_499|>",
494
+ "<|special_500|>",
495
+ "<|special_501|>",
496
+ "<|special_502|>",
497
+ "<|special_503|>",
498
+ "<|special_504|>",
499
+ "<|special_505|>",
500
+ "<|special_506|>",
501
+ "<|special_507|>",
502
+ "<|special_508|>",
503
+ "<|special_509|>",
504
+ "<|special_510|>",
505
+ "<|special_511|>",
506
+ "<|special_625|>",
507
+ "<|special_626|>",
508
+ "<|special_627|>",
509
+ "<|special_628|>",
510
+ "<|special_629|>",
511
+ "<|special_630|>",
512
+ "<|special_631|>",
513
+ "<|special_632|>",
514
+ "<|special_633|>",
515
+ "<|special_634|>",
516
+ "<|special_635|>",
517
+ "<|special_636|>",
518
+ "<|special_637|>",
519
+ "<|special_638|>",
520
+ "<|special_639|>",
521
+ "<|special_640|>",
522
+ "<|special_641|>",
523
+ "<|special_642|>",
524
+ "<|special_643|>",
525
+ "<|special_644|>",
526
+ "<|special_645|>",
527
+ "<|special_646|>",
528
+ "<|special_647|>",
529
+ "<|special_648|>",
530
+ "<|special_649|>",
531
+ "<|special_650|>",
532
+ "<|special_651|>",
533
+ "<|special_652|>",
534
+ "<|special_653|>",
535
+ "<|special_654|>",
536
+ "<|special_655|>",
537
+ "<|special_656|>",
538
+ "<|special_657|>",
539
+ "<|special_658|>",
540
+ "<|special_659|>",
541
+ "<|special_660|>",
542
+ "<|special_661|>",
543
+ "<|special_662|>",
544
+ "<|special_663|>",
545
+ "<|special_664|>",
546
+ "<|special_665|>",
547
+ "<|special_666|>",
548
+ "<|special_667|>",
549
+ "<|special_668|>",
550
+ "<|special_669|>",
551
+ "<|special_670|>",
552
+ "<|special_671|>",
553
+ "<|special_672|>",
554
+ "<|special_673|>",
555
+ "<|special_674|>",
556
+ "<|special_675|>",
557
+ "<|special_676|>",
558
+ "<|special_677|>",
559
+ "<|special_678|>",
560
+ "<|special_679|>",
561
+ "<|special_680|>",
562
+ "<|special_681|>",
563
+ "<|special_682|>",
564
+ "<|special_683|>",
565
+ "<|special_684|>",
566
+ "<|special_685|>",
567
+ "<|special_686|>",
568
+ "<|special_687|>",
569
+ "<|special_688|>",
570
+ "<|special_689|>",
571
+ "<|special_690|>",
572
+ "<|special_691|>",
573
+ "<|special_692|>",
574
+ "<|special_693|>",
575
+ "<|special_694|>",
576
+ "<|special_695|>",
577
+ "<|special_696|>",
578
+ "<|special_697|>",
579
+ "<|special_698|>",
580
+ "<|special_699|>",
581
+ "<|special_700|>",
582
+ "<|special_701|>",
583
+ "<|special_702|>",
584
+ "<|special_703|>",
585
+ "<|special_704|>",
586
+ "<|special_705|>",
587
+ "<|special_706|>",
588
+ "<|special_707|>",
589
+ "<|special_708|>",
590
+ "<|special_709|>",
591
+ "<|special_710|>",
592
+ "<|special_711|>",
593
+ "<|special_712|>",
594
+ "<|special_713|>",
595
+ "<|special_714|>",
596
+ "<|special_715|>",
597
+ "<|special_716|>",
598
+ "<|special_717|>",
599
+ "<|special_718|>",
600
+ "<|special_719|>",
601
+ "<|special_720|>",
602
+ "<|special_721|>",
603
+ "<|special_722|>",
604
+ "<|special_723|>",
605
+ "<|special_724|>",
606
+ "<|special_725|>",
607
+ "<|special_726|>",
608
+ "<|special_727|>",
609
+ "<|special_728|>",
610
+ "<|special_729|>",
611
+ "<|special_730|>",
612
+ "<|special_731|>",
613
+ "<|special_732|>",
614
+ "<|special_733|>",
615
+ "<|special_734|>",
616
+ "<|special_735|>",
617
+ "<|special_736|>",
618
+ "<|special_737|>",
619
+ "<|special_738|>",
620
+ "<|special_739|>",
621
+ "<|special_740|>",
622
+ "<|special_741|>",
623
+ "<|special_742|>",
624
+ "<|special_743|>",
625
+ "<|special_744|>",
626
+ "<|special_745|>",
627
+ "<|special_746|>",
628
+ "<|special_747|>",
629
+ "<|special_748|>",
630
+ "<|special_749|>",
631
+ "<|special_750|>",
632
+ "<|special_751|>",
633
+ "<|special_752|>",
634
+ "<|special_753|>",
635
+ "<|special_754|>",
636
+ "<|special_755|>",
637
+ "<|special_756|>",
638
+ "<|special_757|>",
639
+ "<|special_758|>",
640
+ "<|special_759|>",
641
+ "<|special_760|>",
642
+ "<|special_761|>",
643
+ "<|special_762|>",
644
+ "<|special_763|>",
645
+ "<|special_764|>",
646
+ "<|special_765|>",
647
+ "<|special_766|>",
648
+ "<|special_767|>",
649
+ "<|special_768|>",
650
+ "<|special_769|>",
651
+ "<|special_770|>",
652
+ "<|special_771|>",
653
+ "<|special_772|>",
654
+ "<|special_773|>",
655
+ "<|special_774|>",
656
+ "<|special_775|>",
657
+ "<|special_776|>",
658
+ "<|special_777|>",
659
+ "<|special_778|>",
660
+ "<|special_779|>",
661
+ "<|special_780|>",
662
+ "<|special_781|>",
663
+ "<|special_782|>",
664
+ "<|special_783|>",
665
+ "<|special_784|>",
666
+ "<|special_785|>",
667
+ "<|special_786|>",
668
+ "<|special_787|>",
669
+ "<|special_788|>",
670
+ "<|special_789|>",
671
+ "<|special_790|>",
672
+ "<|special_791|>",
673
+ "<|special_792|>",
674
+ "<|special_793|>",
675
+ "<|special_794|>",
676
+ "<|special_795|>",
677
+ "<|special_796|>",
678
+ "<|special_797|>",
679
+ "<|special_798|>",
680
+ "<|special_799|>",
681
+ "<|special_800|>",
682
+ "<|special_801|>",
683
+ "<|special_802|>",
684
+ "<|special_803|>",
685
+ "<|special_804|>",
686
+ "<|special_805|>",
687
+ "<|special_806|>",
688
+ "<|special_807|>",
689
+ "<|special_808|>",
690
+ "<|special_809|>",
691
+ "<|special_810|>",
692
+ "<|special_811|>",
693
+ "<|special_812|>",
694
+ "<|special_813|>",
695
+ "<|special_814|>",
696
+ "<|special_815|>",
697
+ "<|special_816|>",
698
+ "<|special_817|>",
699
+ "<|special_818|>",
700
+ "<|special_819|>",
701
+ "<|special_820|>",
702
+ "<|special_821|>",
703
+ "<|special_822|>",
704
+ "<|special_823|>",
705
+ "<|special_824|>",
706
+ "<|special_825|>",
707
+ "<|special_826|>",
708
+ "<|special_827|>",
709
+ "<|special_828|>",
710
+ "<|special_829|>",
711
+ "<|special_830|>",
712
+ "<|special_831|>",
713
+ "<|special_832|>",
714
+ "<|special_833|>",
715
+ "<|special_834|>",
716
+ "<|special_835|>",
717
+ "<|special_836|>",
718
+ "<|special_837|>",
719
+ "<|special_838|>",
720
+ "<|special_839|>",
721
+ "<|special_840|>",
722
+ "<|special_841|>",
723
+ "<|special_842|>",
724
+ "<|special_843|>",
725
+ "<|special_844|>",
726
+ "<|special_845|>",
727
+ "<|special_846|>",
728
+ "<|special_847|>",
729
+ "<|special_848|>",
730
+ "<|special_849|>",
731
+ "<|special_850|>",
732
+ "<|special_851|>",
733
+ "<|special_852|>",
734
+ "<|special_853|>",
735
+ "<|special_854|>",
736
+ "<|special_855|>",
737
+ "<|special_856|>",
738
+ "<|special_857|>",
739
+ "<|special_858|>",
740
+ "<|special_859|>",
741
+ "<|special_860|>",
742
+ "<|special_861|>",
743
+ "<|special_862|>",
744
+ "<|special_863|>",
745
+ "<|special_864|>",
746
+ "<|special_865|>",
747
+ "<|special_866|>",
748
+ "<|special_867|>",
749
+ "<|special_868|>",
750
+ "<|special_869|>",
751
+ "<|special_870|>",
752
+ "<|special_871|>",
753
+ "<|special_872|>",
754
+ "<|special_873|>",
755
+ "<|special_874|>",
756
+ "<|special_875|>",
757
+ "<|special_876|>",
758
+ "<|special_877|>",
759
+ "<|special_878|>",
760
+ "<|special_879|>",
761
+ "<|special_880|>",
762
+ "<|special_881|>",
763
+ "<|special_882|>",
764
+ "<|special_883|>",
765
+ "<|special_884|>",
766
+ "<|special_885|>",
767
+ "<|special_886|>",
768
+ "<|special_887|>",
769
+ "<|special_888|>",
770
+ "<|special_889|>",
771
+ "<|special_890|>",
772
+ "<|special_891|>",
773
+ "<|special_892|>",
774
+ "<|special_893|>",
775
+ "<|special_894|>",
776
+ "<|special_895|>",
777
+ "<|special_896|>",
778
+ "<|special_897|>",
779
+ "<|special_898|>",
780
+ "<|special_899|>",
781
+ "<|special_900|>",
782
+ "<|special_901|>",
783
+ "<|special_902|>",
784
+ "<|special_903|>",
785
+ "<|special_904|>",
786
+ "<|special_905|>",
787
+ "<|special_906|>",
788
+ "<|special_907|>",
789
+ "<|special_908|>",
790
+ "<|special_909|>",
791
+ "<|special_910|>",
792
+ "<|special_911|>",
793
+ "<|special_912|>",
794
+ "<|special_913|>",
795
+ "<|special_914|>",
796
+ "<|special_915|>",
797
+ "<|special_916|>",
798
+ "<|special_917|>",
799
+ "<|special_918|>",
800
+ "<|special_919|>",
801
+ "<|special_920|>",
802
+ "<|special_921|>",
803
+ "<|special_922|>",
804
+ "<|special_923|>",
805
+ "<|special_924|>",
806
+ "<|special_925|>",
807
+ "<|special_926|>",
808
+ "<|special_927|>",
809
+ "<|special_928|>",
810
+ "<|special_929|>",
811
+ "<|special_930|>",
812
+ "<|special_931|>",
813
+ "<|special_932|>",
814
+ "<|special_933|>",
815
+ "<|special_934|>",
816
+ "<|special_935|>",
817
+ "<|special_936|>",
818
+ "<|special_937|>",
819
+ "<|special_938|>",
820
+ "<|special_939|>",
821
+ "<|special_940|>",
822
+ "<|special_941|>",
823
+ "<|special_942|>",
824
+ "<|special_943|>",
825
+ "<|special_944|>",
826
+ "<|special_945|>",
827
+ "<|special_946|>",
828
+ "<|special_947|>",
829
+ "<|special_948|>",
830
+ "<|special_949|>",
831
+ "<|special_950|>",
832
+ "<|special_951|>",
833
+ "<|special_952|>",
834
+ "<|special_953|>",
835
+ "<|special_954|>",
836
+ "<|special_955|>",
837
+ "<|special_956|>",
838
+ "<|special_957|>",
839
+ "<|special_958|>",
840
+ "<|special_959|>",
841
+ "<|special_960|>",
842
+ "<|special_961|>",
843
+ "<|special_962|>",
844
+ "<|special_963|>",
845
+ "<|special_964|>",
846
+ "<|special_965|>",
847
+ "<|special_966|>",
848
+ "<|special_967|>",
849
+ "<|special_968|>",
850
+ "<|special_969|>",
851
+ "<|special_970|>",
852
+ "<|special_971|>",
853
+ "<|special_972|>",
854
+ "<|special_973|>",
855
+ "<|special_974|>",
856
+ "<|special_975|>",
857
+ "<|special_976|>",
858
+ "<|special_977|>",
859
+ "<|special_978|>",
860
+ "<|special_979|>",
861
+ "<|special_980|>",
862
+ "<|special_981|>",
863
+ "<|special_982|>",
864
+ "<|special_983|>",
865
+ "<|special_984|>",
866
+ "<|special_985|>",
867
+ "<|special_986|>",
868
+ "<|special_987|>",
869
+ "<|special_988|>",
870
+ "<|special_989|>",
871
+ "<|special_990|>",
872
+ "<|special_991|>",
873
+ "<|special_992|>",
874
+ "<|special_993|>",
875
+ "<|special_994|>",
876
+ "<|special_995|>",
877
+ "<|special_996|>",
878
+ "<|special_997|>",
879
+ "<|special_998|>",
880
+ "<|special_999|>",
881
+ "<|special_1000|>",
882
+ "<|special_1001|>",
883
+ "<|special_1002|>",
884
+ "<|special_1003|>",
885
+ "<|special_1004|>",
886
+ "<|special_1005|>",
887
+ "<|special_1006|>",
888
+ "<|special_1007|>",
889
+ "<|special_1008|>",
890
+ "<|special_1009|>",
891
+ "<|special_1010|>",
892
+ "<|special_1011|>",
893
+ "<|special_1012|>",
894
+ "<|special_1013|>",
895
+ "<|special_1014|>",
896
+ "<|special_1015|>",
897
+ "<|special_1016|>",
898
+ "<|special_1017|>",
899
+ "<|special_1018|>",
900
+ "<|special_1019|>",
901
+ "<|special_1020|>",
902
+ "<|special_1021|>",
903
+ "<|special_1022|>",
904
+ "<|special_1023|>",
905
+ "<|special_1024|>",
906
+ "<|special_1025|>",
907
+ "<|special_1026|>",
908
+ "<|special_1027|>",
909
+ "<|special_1028|>",
910
+ "<|special_1029|>",
911
+ "<|special_1030|>",
912
+ "<|special_1031|>",
913
+ "<|special_1032|>",
914
+ "<|special_1033|>",
915
+ "<|special_1034|>",
916
+ "<|special_1035|>",
917
+ "<|special_1036|>",
918
+ "<|special_1037|>",
919
+ "<|special_1038|>",
920
+ "<|special_1039|>",
921
+ "<|special_1040|>",
922
+ "<|special_1041|>",
923
+ "<|special_1042|>",
924
+ "<|special_1043|>",
925
+ "<|special_1044|>",
926
+ "<|special_1045|>",
927
+ "<|special_1046|>",
928
+ "<|special_1047|>",
929
+ "<|special_1048|>",
930
+ "<|special_1049|>",
931
+ "<|special_1050|>",
932
+ "<|special_1051|>",
933
+ "<|special_1052|>",
934
+ "<|special_1053|>",
935
+ "<|special_1054|>",
936
+ "<|special_1055|>",
937
+ "<|special_1056|>",
938
+ "<|special_1057|>",
939
+ "<|special_1058|>",
940
+ "<|special_1059|>",
941
+ "<|special_1060|>",
942
+ "<|special_1061|>",
943
+ "<|special_1062|>",
944
+ "<|special_1063|>",
945
+ "<|special_1064|>",
946
+ "<|special_1065|>",
947
+ "<|special_1066|>",
948
+ "<|special_1067|>",
949
+ "<|special_1068|>",
950
+ "<|special_1069|>",
951
+ "<|special_1070|>",
952
+ "<|special_1071|>",
953
+ "<|special_1072|>",
954
+ "<|special_1073|>",
955
+ "<|special_1074|>",
956
+ "<|special_1075|>",
957
+ "<|special_1076|>",
958
+ "<|special_1077|>",
959
+ "<|special_1078|>",
960
+ "<|special_1079|>",
961
+ "<|special_1080|>",
962
+ "<|special_1081|>",
963
+ "<|special_1082|>",
964
+ "<|special_1083|>",
965
+ "<|special_1084|>",
966
+ "<|special_1085|>",
967
+ "<|special_1086|>",
968
+ "<|special_1087|>",
969
+ "<|special_1088|>",
970
+ "<|special_1089|>",
971
+ "<|special_1090|>",
972
+ "<|special_1091|>",
973
+ "<|special_1092|>",
974
+ "<|special_1093|>",
975
+ "<|special_1094|>",
976
+ "<|special_1095|>",
977
+ "<|special_1096|>",
978
+ "<|special_1097|>",
979
+ "<|special_1098|>",
980
+ "<|special_1099|>",
981
+ "<|special_1100|>",
982
+ "<|special_1101|>",
983
+ "<|special_1102|>",
984
+ "<|special_1103|>",
985
+ "<|special_1104|>",
986
+ "<|special_1105|>",
987
+ "<|special_1106|>",
988
+ "<|special_1107|>",
989
+ "<|special_1108|>",
990
+ "<|special_1109|>",
991
+ "<|special_1110|>",
992
+ "<|special_1111|>",
993
+ "<|special_1112|>",
994
+ "<|special_1113|>",
995
+ "<|special_1114|>",
996
+ "<|special_1115|>",
997
+ "<|special_1116|>",
998
+ "<|special_1117|>",
999
+ "<|special_1118|>",
1000
+ "<|special_1119|>",
1001
+ "<|special_1120|>",
1002
+ "<|special_1121|>",
1003
+ "<|special_1122|>",
1004
+ "<|special_1123|>",
1005
+ "<|special_1124|>",
1006
+ "<|special_1125|>",
1007
+ "<|special_1126|>",
1008
+ "<|special_1127|>",
1009
+ "<|special_1128|>",
1010
+ "<|special_1129|>",
1011
+ "<|special_1130|>",
1012
+ "<|special_1131|>",
1013
+ "<|special_1132|>",
1014
+ "<|special_1133|>",
1015
+ "<|special_1134|>",
1016
+ "<|special_1135|>",
1017
+ "<|special_1136|>",
1018
+ "<|special_1137|>",
1019
+ "<|special_1138|>",
1020
+ "<|special_1139|>",
1021
+ "<|special_1140|>",
1022
+ "<|special_1141|>",
1023
+ "<|special_1142|>",
1024
+ "<|special_1143|>",
1025
+ "<|special_1144|>",
1026
+ "<|special_1145|>",
1027
+ "<|special_1146|>",
1028
+ "<|special_1147|>",
1029
+ "<|special_1148|>",
1030
+ "<|special_1149|>",
1031
+ "<|special_1150|>",
1032
+ "<|special_1151|>",
1033
+ "<|special_1152|>",
1034
+ "<|special_1153|>",
1035
+ "<|special_1154|>",
1036
+ "<|special_1155|>",
1037
+ "<|special_1156|>",
1038
+ "<|special_1157|>",
1039
+ "<|special_1158|>",
1040
+ "<|special_1159|>",
1041
+ "<|special_1160|>",
1042
+ "<|special_1161|>",
1043
+ "<|special_1162|>",
1044
+ "<|special_1163|>",
1045
+ "<|special_1164|>",
1046
+ "<|special_1165|>",
1047
+ "<|special_1166|>",
1048
+ "<|special_1167|>",
1049
+ "<|special_1168|>",
1050
+ "<|special_1169|>",
1051
+ "<|special_1170|>",
1052
+ "<|special_1171|>",
1053
+ "<|special_1172|>",
1054
+ "<|special_1173|>",
1055
+ "<|special_1174|>",
1056
+ "<|special_1175|>",
1057
+ "<|special_1176|>",
1058
+ "<|special_1177|>",
1059
+ "<|special_1178|>",
1060
+ "<|special_1179|>",
1061
+ "<|special_1180|>",
1062
+ "<|special_1181|>",
1063
+ "<|special_1182|>",
1064
+ "<|special_1183|>",
1065
+ "<|special_1184|>",
1066
+ "<|special_1185|>",
1067
+ "<|special_1186|>",
1068
+ "<|special_1187|>",
1069
+ "<|special_1188|>",
1070
+ "<|special_1189|>",
1071
+ "<|special_1190|>",
1072
+ "<|special_1191|>",
1073
+ "<|special_1192|>",
1074
+ "<|special_1193|>",
1075
+ "<|special_1194|>",
1076
+ "<|special_1195|>",
1077
+ "<|special_1196|>",
1078
+ "<|special_1197|>",
1079
+ "<|special_1198|>",
1080
+ "<|special_1199|>",
1081
+ "<|special_1200|>",
1082
+ "<|special_1201|>",
1083
+ "<|special_1202|>",
1084
+ "<|special_1203|>",
1085
+ "<|special_1204|>",
1086
+ "<|special_1205|>",
1087
+ "<|special_1206|>",
1088
+ "<|special_1207|>",
1089
+ "<|special_1208|>",
1090
+ "<|special_1209|>",
1091
+ "<|special_1210|>",
1092
+ "<|special_1211|>",
1093
+ "<|special_1212|>",
1094
+ "<|special_1213|>",
1095
+ "<|special_1214|>",
1096
+ "<|special_1215|>",
1097
+ "<|special_1216|>",
1098
+ "<|special_1217|>",
1099
+ "<|special_1218|>",
1100
+ "<|special_1219|>",
1101
+ "<|special_1220|>",
1102
+ "<|special_1221|>",
1103
+ "<|special_1222|>",
1104
+ "<|special_1223|>",
1105
+ "<|special_1224|>",
1106
+ "<|special_1225|>",
1107
+ "<|special_1226|>",
1108
+ "<|special_1227|>",
1109
+ "<|special_1228|>",
1110
+ "<|special_1229|>",
1111
+ "<|special_1230|>",
1112
+ "<|special_1231|>",
1113
+ "<|special_1232|>",
1114
+ "<|special_1233|>",
1115
+ "<|special_1234|>",
1116
+ "<|special_1235|>",
1117
+ "<|special_1236|>",
1118
+ "<|special_1237|>",
1119
+ "<|special_1238|>",
1120
+ "<|special_1239|>",
1121
+ "<|special_1240|>",
1122
+ "<|special_1241|>",
1123
+ "<|special_1242|>",
1124
+ "<|special_1243|>",
1125
+ "<|special_1244|>",
1126
+ "<|special_1245|>",
1127
+ "<|special_1246|>",
1128
+ "<|special_1247|>",
1129
+ "<|special_1248|>",
1130
+ "<|special_1249|>",
1131
+ "<|special_1250|>",
1132
+ "<|special_1251|>",
1133
+ "<|special_1252|>",
1134
+ "<|special_1253|>",
1135
+ "<|special_1254|>",
1136
+ "<|special_1255|>",
1137
+ "<|special_1256|>",
1138
+ "<|special_1257|>",
1139
+ "<|special_1258|>",
1140
+ "<|special_1259|>",
1141
+ "<|special_1260|>",
1142
+ "<|special_1261|>",
1143
+ "<|special_1262|>",
1144
+ "<|special_1263|>",
1145
+ "<|special_1264|>",
1146
+ "<|special_1265|>",
1147
+ "<|special_1266|>",
1148
+ "<|special_1267|>",
1149
+ "<|special_1268|>",
1150
+ "<|special_1269|>",
1151
+ "<|special_1270|>",
1152
+ "<|special_1271|>",
1153
+ "<|special_1272|>",
1154
+ "<|special_1273|>",
1155
+ "<|special_1274|>",
1156
+ "<|special_1275|>",
1157
+ "<|special_1276|>",
1158
+ "<|special_1277|>",
1159
+ "<|special_1278|>",
1160
+ "<|special_1279|>",
1161
+ "<|special_1280|>",
1162
+ "<|special_1281|>",
1163
+ "<|special_1282|>",
1164
+ "<|special_1283|>",
1165
+ "<|special_1284|>",
1166
+ "<|special_1285|>",
1167
+ "<|special_1286|>",
1168
+ "<|special_1287|>",
1169
+ "<|special_1288|>",
1170
+ "<|special_1289|>",
1171
+ "<|special_1290|>",
1172
+ "<|special_1291|>",
1173
+ "<|special_1292|>",
1174
+ "<|special_1293|>",
1175
+ "<|special_1294|>",
1176
+ "<|special_1295|>",
1177
+ "<|special_1296|>",
1178
+ "<|special_1297|>",
1179
+ "<|special_1298|>",
1180
+ "<|special_1299|>",
1181
+ "<|special_1300|>",
1182
+ "<|special_1301|>",
1183
+ "<|special_1302|>",
1184
+ "<|special_1303|>",
1185
+ "<|special_1304|>",
1186
+ "<|special_1305|>",
1187
+ "<|special_1306|>",
1188
+ "<|special_1307|>",
1189
+ "<|special_1308|>",
1190
+ "<|special_1309|>",
1191
+ "<|special_1310|>",
1192
+ "<|special_1311|>",
1193
+ "<|special_1312|>",
1194
+ "<|special_1313|>",
1195
+ "<|special_1314|>",
1196
+ "<|special_1315|>",
1197
+ "<|special_1316|>",
1198
+ "<|special_1317|>",
1199
+ "<|special_1318|>",
1200
+ "<|special_1319|>",
1201
+ "<|special_1320|>",
1202
+ "<|special_1321|>",
1203
+ "<|special_1322|>",
1204
+ "<|special_1323|>",
1205
+ "<|special_1324|>",
1206
+ "<|special_1325|>",
1207
+ "<|special_1326|>",
1208
+ "<|special_1327|>",
1209
+ "<|special_1328|>",
1210
+ "<|special_1329|>",
1211
+ "<|special_1330|>",
1212
+ "<|special_1331|>",
1213
+ "<|special_1332|>",
1214
+ "<|special_1333|>",
1215
+ "<|special_1334|>",
1216
+ "<|special_1335|>",
1217
+ "<|special_1336|>",
1218
+ "<|special_1337|>",
1219
+ "<|special_1338|>",
1220
+ "<|special_1339|>",
1221
+ "<|special_1340|>",
1222
+ "<|special_1341|>",
1223
+ "<|special_1342|>",
1224
+ "<|special_1343|>",
1225
+ "<|special_1344|>",
1226
+ "<|special_1345|>",
1227
+ "<|special_1346|>",
1228
+ "<|special_1347|>",
1229
+ "<|special_1348|>",
1230
+ "<|special_1349|>",
1231
+ "<|special_1350|>",
1232
+ "<|special_1351|>",
1233
+ "<|special_1352|>",
1234
+ "<|special_1353|>",
1235
+ "<|special_1354|>",
1236
+ "<|special_1355|>",
1237
+ "<|special_1356|>",
1238
+ "<|special_1357|>",
1239
+ "<|special_1358|>",
1240
+ "<|special_1359|>",
1241
+ "<|special_1360|>",
1242
+ "<|special_1361|>",
1243
+ "<|special_1362|>",
1244
+ "<|special_1363|>",
1245
+ "<|special_1364|>",
1246
+ "<|special_1365|>",
1247
+ "<|special_1366|>",
1248
+ "<|special_1367|>",
1249
+ "<|special_1368|>",
1250
+ "<|special_1369|>",
1251
+ "<|special_1370|>",
1252
+ "<|special_1371|>",
1253
+ "<|special_1372|>",
1254
+ "<|special_1373|>",
1255
+ "<|special_1374|>",
1256
+ "<|special_1375|>",
1257
+ "<|special_1376|>",
1258
+ "<|special_1377|>",
1259
+ "<|special_1378|>",
1260
+ "<|special_1379|>",
1261
+ "<|special_1380|>",
1262
+ "<|special_1381|>",
1263
+ "<|special_1382|>",
1264
+ "<|special_1383|>",
1265
+ "<|special_1384|>",
1266
+ "<|special_1385|>",
1267
+ "<|special_1386|>",
1268
+ "<|special_1387|>",
1269
+ "<|special_1388|>",
1270
+ "<|special_1389|>",
1271
+ "<|special_1390|>",
1272
+ "<|special_1391|>",
1273
+ "<|special_1392|>",
1274
+ "<|special_1393|>",
1275
+ "<|special_1394|>",
1276
+ "<|special_1395|>",
1277
+ "<|special_1396|>",
1278
+ "<|special_1397|>",
1279
+ "<|special_1398|>",
1280
+ "<|special_1399|>",
1281
+ "<|special_1400|>",
1282
+ "<|special_1401|>",
1283
+ "<|special_1402|>",
1284
+ "<|special_1403|>",
1285
+ "<|special_1404|>",
1286
+ "<|special_1405|>",
1287
+ "<|special_1406|>",
1288
+ "<|special_1407|>",
1289
+ "<|special_1408|>",
1290
+ "<|special_1409|>",
1291
+ "<|special_1410|>",
1292
+ "<|special_1411|>",
1293
+ "<|special_1412|>",
1294
+ "<|special_1413|>",
1295
+ "<|special_1414|>",
1296
+ "<|special_1415|>",
1297
+ "<|special_1416|>",
1298
+ "<|special_1417|>",
1299
+ "<|special_1418|>",
1300
+ "<|special_1419|>",
1301
+ "<|special_1420|>",
1302
+ "<|special_1421|>",
1303
+ "<|special_1422|>",
1304
+ "<|special_1423|>",
1305
+ "<|special_1424|>",
1306
+ "<|special_1425|>",
1307
+ "<|special_1426|>",
1308
+ "<|special_1427|>",
1309
+ "<|special_1428|>",
1310
+ "<|special_1429|>",
1311
+ "<|special_1430|>",
1312
+ "<|special_1431|>",
1313
+ "<|special_1432|>",
1314
+ "<|special_1433|>",
1315
+ "<|special_1434|>",
1316
+ "<|special_1435|>",
1317
+ "<|special_1436|>",
1318
+ "<|special_1437|>",
1319
+ "<|special_1438|>",
1320
+ "<|special_1439|>",
1321
+ "<|special_1440|>",
1322
+ "<|special_1441|>",
1323
+ "<|special_1442|>",
1324
+ "<|special_1443|>",
1325
+ "<|special_1444|>",
1326
+ "<|special_1445|>",
1327
+ "<|special_1446|>",
1328
+ "<|special_1447|>",
1329
+ "<|special_1448|>",
1330
+ "<|special_1449|>",
1331
+ "<|special_1450|>",
1332
+ "<|special_1451|>",
1333
+ "<|special_1452|>",
1334
+ "<|special_1453|>",
1335
+ "<|special_1454|>",
1336
+ "<|special_1455|>",
1337
+ "<|special_1456|>",
1338
+ "<|special_1457|>",
1339
+ "<|special_1458|>",
1340
+ "<|special_1459|>",
1341
+ "<|special_1460|>",
1342
+ "<|special_1461|>",
1343
+ "<|special_1462|>",
1344
+ "<|special_1463|>",
1345
+ "<|special_1464|>",
1346
+ "<|special_1465|>",
1347
+ "<|special_1466|>",
1348
+ "<|special_1467|>",
1349
+ "<|special_1468|>",
1350
+ "<|special_1469|>",
1351
+ "<|special_1470|>",
1352
+ "<|special_1471|>",
1353
+ "<|special_1472|>",
1354
+ "<|special_1473|>",
1355
+ "<|special_1474|>",
1356
+ "<|special_1475|>",
1357
+ "<|special_1476|>",
1358
+ "<|special_1477|>",
1359
+ "<|special_1478|>",
1360
+ "<|special_1479|>",
1361
+ "<|special_1480|>",
1362
+ "<|special_1481|>",
1363
+ "<|special_1482|>",
1364
+ "<|special_1483|>",
1365
+ "<|special_1484|>",
1366
+ "<|special_1485|>",
1367
+ "<|special_1486|>",
1368
+ "<|special_1487|>",
1369
+ "<|special_1488|>",
1370
+ "<|special_1489|>",
1371
+ "<|special_1490|>",
1372
+ "<|special_1491|>",
1373
+ "<|special_1492|>",
1374
+ "<|special_1493|>",
1375
+ "<|special_1494|>",
1376
+ "<|special_1495|>",
1377
+ "<|special_1496|>",
1378
+ "<|special_1497|>",
1379
+ "<|special_1498|>",
1380
+ "<|special_1499|>",
1381
+ "<|special_1500|>",
1382
+ "<|special_1501|>",
1383
+ "<|special_1502|>",
1384
+ "<|special_1503|>",
1385
+ "<|special_1504|>",
1386
+ "<|special_1505|>",
1387
+ "<|special_1506|>",
1388
+ "<|special_1507|>",
1389
+ "<|special_1508|>",
1390
+ "<|special_1509|>",
1391
+ "<|special_1510|>",
1392
+ "<|special_1511|>",
1393
+ "<|special_1512|>",
1394
+ "<|special_1513|>",
1395
+ "<|special_1514|>",
1396
+ "<|special_1515|>",
1397
+ "<|special_1516|>",
1398
+ "<|special_1517|>",
1399
+ "<|special_1518|>",
1400
+ "<|special_1519|>",
1401
+ "<|special_1520|>",
1402
+ "<|special_1521|>",
1403
+ "<|special_1522|>",
1404
+ "<|special_1523|>",
1405
+ "<|special_1524|>",
1406
+ "<|special_1525|>",
1407
+ "<|special_1526|>",
1408
+ "<|special_1527|>",
1409
+ "<|special_1528|>",
1410
+ "<|special_1529|>",
1411
+ "<|special_1530|>",
1412
+ "<|special_1531|>",
1413
+ "<|special_1532|>",
1414
+ "<|special_1533|>",
1415
+ "<|special_1534|>",
1416
+ "<|special_1535|>",
1417
+ "<|special_1536|>",
1418
+ "<|special_1537|>",
1419
+ "<|special_1538|>",
1420
+ "<|special_1539|>",
1421
+ "<|special_1540|>",
1422
+ "<|special_1541|>",
1423
+ "<|special_1542|>",
1424
+ "<|special_1543|>",
1425
+ "<|special_1544|>",
1426
+ "<|special_1545|>",
1427
+ "<|special_1546|>",
1428
+ "<|special_1547|>",
1429
+ "<|special_1548|>",
1430
+ "<|special_1549|>",
1431
+ "<|special_1550|>",
1432
+ "<|special_1551|>",
1433
+ "<|special_1552|>",
1434
+ "<|special_1553|>",
1435
+ "<|special_1554|>",
1436
+ "<|special_1555|>",
1437
+ "<|special_1556|>",
1438
+ "<|special_1557|>",
1439
+ "<|special_1558|>",
1440
+ "<|special_1559|>",
1441
+ "<|special_1560|>",
1442
+ "<|special_1561|>",
1443
+ "<|special_1562|>",
1444
+ "<|special_1563|>",
1445
+ "<|special_1564|>",
1446
+ "<|special_1565|>",
1447
+ "<|special_1566|>",
1448
+ "<|special_1567|>",
1449
+ "<|special_1568|>",
1450
+ "<|special_1569|>",
1451
+ "<|special_1570|>",
1452
+ "<|special_1571|>",
1453
+ "<|special_1572|>",
1454
+ "<|special_1573|>",
1455
+ "<|special_1574|>",
1456
+ "<|special_1575|>",
1457
+ "<|special_1576|>",
1458
+ "<|special_1577|>",
1459
+ "<|special_1578|>",
1460
+ "<|special_1579|>",
1461
+ "<|special_1580|>",
1462
+ "<|special_1581|>",
1463
+ "<|special_1582|>",
1464
+ "<|special_1583|>",
1465
+ "<|special_1584|>",
1466
+ "<|special_1585|>",
1467
+ "<|special_1586|>",
1468
+ "<|special_1587|>",
1469
+ "<|special_1588|>",
1470
+ "<|special_1589|>",
1471
+ "<|special_1590|>",
1472
+ "<|special_1591|>",
1473
+ "<|special_1592|>",
1474
+ "<|special_1593|>",
1475
+ "<|special_1594|>",
1476
+ "<|special_1595|>",
1477
+ "<|special_1596|>",
1478
+ "<|special_1597|>",
1479
+ "<|special_1598|>",
1480
+ "<|special_1599|>",
1481
+ "<|special_1600|>",
1482
+ "<|special_1601|>",
1483
+ "<|special_1602|>",
1484
+ "<|special_1603|>",
1485
+ "<|special_1604|>",
1486
+ "<|special_1605|>",
1487
+ "<|special_1606|>",
1488
+ "<|special_1607|>",
1489
+ "<|special_1608|>",
1490
+ "<|special_1609|>",
1491
+ "<|special_1610|>",
1492
+ "<|special_1611|>",
1493
+ "<|special_1612|>",
1494
+ "<|special_1613|>",
1495
+ "<|special_1614|>",
1496
+ "<|special_1615|>",
1497
+ "<|special_1616|>",
1498
+ "<|special_1617|>",
1499
+ "<|special_1618|>",
1500
+ "<|special_1619|>",
1501
+ "<|special_1620|>",
1502
+ "<|special_1621|>",
1503
+ "<|special_1622|>",
1504
+ "<|special_1623|>",
1505
+ "<|special_1624|>",
1506
+ "<|special_1625|>",
1507
+ "<|special_1626|>",
1508
+ "<|special_1627|>",
1509
+ "<|special_1628|>",
1510
+ "<|special_1629|>",
1511
+ "<|special_1630|>",
1512
+ "<|special_1631|>",
1513
+ "<|special_1632|>",
1514
+ "<|special_1633|>",
1515
+ "<|special_1634|>",
1516
+ "<|special_1635|>",
1517
+ "<|special_1636|>",
1518
+ "<|special_1637|>",
1519
+ "<|special_1638|>",
1520
+ "<|special_1639|>",
1521
+ "<|special_1640|>",
1522
+ "<|special_1641|>",
1523
+ "<|special_1642|>",
1524
+ "<|special_1643|>",
1525
+ "<|special_1644|>",
1526
+ "<|special_1645|>",
1527
+ "<|special_1646|>",
1528
+ "<|special_1647|>",
1529
+ "<|special_1648|>",
1530
+ "<|special_1649|>",
1531
+ "<|special_1650|>",
1532
+ "<|special_1651|>",
1533
+ "<|special_1652|>",
1534
+ "<|special_1653|>",
1535
+ "<|special_1654|>",
1536
+ "<|special_1655|>",
1537
+ "<|special_1656|>",
1538
+ "<|special_1657|>",
1539
+ "<|special_1658|>",
1540
+ "<|special_1659|>",
1541
+ "<|special_1660|>",
1542
+ "<|special_1661|>",
1543
+ "<|special_1662|>",
1544
+ "<|special_1663|>",
1545
+ "<|special_1664|>",
1546
+ "<|special_1665|>",
1547
+ "<|special_1666|>",
1548
+ "<|special_1667|>",
1549
+ "<|special_1668|>",
1550
+ "<|special_1669|>",
1551
+ "<|special_1670|>",
1552
+ "<|special_1671|>",
1553
+ "<|special_1672|>",
1554
+ "<|special_1673|>",
1555
+ "<|special_1674|>",
1556
+ "<|special_1675|>",
1557
+ "<|special_1676|>",
1558
+ "<|special_1677|>",
1559
+ "<|special_1678|>",
1560
+ "<|special_1679|>",
1561
+ "<|special_1680|>",
1562
+ "<|special_1681|>",
1563
+ "<|special_1682|>",
1564
+ "<|special_1683|>",
1565
+ "<|special_1684|>",
1566
+ "<|special_1685|>",
1567
+ "<|special_1686|>",
1568
+ "<|special_1687|>",
1569
+ "<|special_1688|>",
1570
+ "<|special_1689|>",
1571
+ "<|special_1690|>",
1572
+ "<|special_1691|>",
1573
+ "<|special_1692|>",
1574
+ "<|special_1693|>",
1575
+ "<|special_1694|>",
1576
+ "<|special_1695|>",
1577
+ "<|special_1696|>",
1578
+ "<|special_1697|>",
1579
+ "<|special_1698|>",
1580
+ "<|special_1699|>",
1581
+ "<|special_1700|>",
1582
+ "<|special_1701|>",
1583
+ "<|special_1702|>",
1584
+ "<|special_1703|>",
1585
+ "<|special_1704|>",
1586
+ "<|special_1705|>",
1587
+ "<|special_1706|>",
1588
+ "<|special_1707|>",
1589
+ "<|special_1708|>",
1590
+ "<|special_1709|>",
1591
+ "<|special_1710|>",
1592
+ "<|special_1711|>",
1593
+ "<|special_1712|>",
1594
+ "<|special_1713|>",
1595
+ "<|special_1714|>",
1596
+ "<|special_1715|>",
1597
+ "<|special_1716|>",
1598
+ "<|special_1717|>",
1599
+ "<|special_1718|>",
1600
+ "<|special_1719|>",
1601
+ "<|special_1720|>",
1602
+ "<|special_1721|>",
1603
+ "<|special_1722|>",
1604
+ "<|special_1723|>",
1605
+ "<|special_1724|>",
1606
+ "<|special_1725|>",
1607
+ "<|special_1726|>",
1608
+ "<|special_1727|>",
1609
+ "<|special_1728|>",
1610
+ "<|special_1729|>",
1611
+ "<|special_1730|>",
1612
+ "<|special_1731|>",
1613
+ "<|special_1732|>",
1614
+ "<|special_1733|>",
1615
+ "<|special_1734|>",
1616
+ "<|special_1735|>",
1617
+ "<|special_1736|>",
1618
+ "<|special_1737|>",
1619
+ "<|special_1738|>",
1620
+ "<|special_1739|>",
1621
+ "<|special_1740|>",
1622
+ "<|special_1741|>",
1623
+ "<|special_1742|>",
1624
+ "<|special_1743|>",
1625
+ "<|special_1744|>",
1626
+ "<|special_1745|>",
1627
+ "<|special_1746|>",
1628
+ "<|special_1747|>",
1629
+ "<|special_1748|>",
1630
+ "<|special_1749|>",
1631
+ "<|special_1750|>",
1632
+ "<|special_1751|>",
1633
+ "<|special_1752|>",
1634
+ "<|special_1753|>",
1635
+ "<|special_1754|>",
1636
+ "<|special_1755|>",
1637
+ "<|special_1756|>",
1638
+ "<|special_1757|>",
1639
+ "<|special_1758|>",
1640
+ "<|special_1759|>",
1641
+ "<|special_1760|>",
1642
+ "<|special_1761|>",
1643
+ "<|special_1762|>",
1644
+ "<|special_1763|>",
1645
+ "<|special_1764|>",
1646
+ "<|special_1765|>",
1647
+ "<|special_1766|>",
1648
+ "<|special_1767|>",
1649
+ "<|special_1768|>",
1650
+ "<|special_1769|>",
1651
+ "<|special_1770|>",
1652
+ "<|special_1771|>",
1653
+ "<|special_1772|>",
1654
+ "<|special_1773|>",
1655
+ "<|special_1774|>",
1656
+ "<|special_1775|>",
1657
+ "<|special_1776|>",
1658
+ "<|special_1777|>",
1659
+ "<|special_1778|>",
1660
+ "<|special_1779|>",
1661
+ "<|special_1780|>",
1662
+ "<|special_1781|>",
1663
+ "<|special_1782|>",
1664
+ "<|special_1783|>",
1665
+ "<|special_1784|>",
1666
+ "<|special_1785|>",
1667
+ "<|special_1786|>",
1668
+ "<|special_1787|>",
1669
+ "<|special_1788|>",
1670
+ "<|special_1789|>",
1671
+ "<|special_1790|>",
1672
+ "<|special_1791|>",
1673
+ "<|special_1792|>",
1674
+ "<|special_1793|>",
1675
+ "<|special_1794|>",
1676
+ "<|special_1795|>",
1677
+ "<|special_1796|>",
1678
+ "<|special_1797|>",
1679
+ "<|special_1798|>",
1680
+ "<|special_1799|>",
1681
+ "<|special_1800|>",
1682
+ "<|special_1801|>",
1683
+ "<|special_1802|>",
1684
+ "<|special_1803|>",
1685
+ "<|special_1804|>",
1686
+ "<|special_1805|>",
1687
+ "<|special_1806|>",
1688
+ "<|special_1807|>",
1689
+ "<|special_1808|>",
1690
+ "<|special_1809|>",
1691
+ "<|special_1810|>",
1692
+ "<|special_1811|>",
1693
+ "<|special_1812|>",
1694
+ "<|special_1813|>",
1695
+ "<|special_1814|>",
1696
+ "<|special_1815|>",
1697
+ "<|special_1816|>",
1698
+ "<|special_1817|>",
1699
+ "<|special_1818|>",
1700
+ "<|special_1819|>",
1701
+ "<|special_1820|>",
1702
+ "<|special_1821|>",
1703
+ "<|special_1822|>",
1704
+ "<|special_1823|>",
1705
+ "<|special_1824|>",
1706
+ "<|special_1825|>",
1707
+ "<|special_1826|>",
1708
+ "<|special_1827|>",
1709
+ "<|special_1828|>",
1710
+ "<|special_1829|>",
1711
+ "<|special_1830|>",
1712
+ "<|special_1831|>",
1713
+ "<|special_1832|>",
1714
+ "<|special_1833|>",
1715
+ "<|special_1834|>",
1716
+ "<|special_1835|>",
1717
+ "<|special_1836|>",
1718
+ "<|special_1837|>",
1719
+ "<|special_1838|>",
1720
+ "<|special_1839|>",
1721
+ "<|special_1840|>",
1722
+ "<|special_1841|>",
1723
+ "<|special_1842|>",
1724
+ "<|special_1843|>",
1725
+ "<|special_1844|>",
1726
+ "<|special_1845|>",
1727
+ "<|special_1846|>",
1728
+ "<|special_1847|>",
1729
+ "<|special_1848|>",
1730
+ "<|special_1849|>",
1731
+ "<|special_1850|>",
1732
+ "<|special_1851|>",
1733
+ "<|special_1852|>",
1734
+ "<|special_1853|>",
1735
+ "<|special_1854|>",
1736
+ "<|special_1855|>",
1737
+ "<|special_1856|>",
1738
+ "<|special_1857|>",
1739
+ "<|special_1858|>",
1740
+ "<|special_1859|>",
1741
+ "<|special_1860|>",
1742
+ "<|special_1861|>",
1743
+ "<|special_1862|>",
1744
+ "<|special_1863|>",
1745
+ "<|special_1864|>",
1746
+ "<|special_1865|>",
1747
+ "<|special_1866|>",
1748
+ "<|special_1867|>",
1749
+ "<|special_1868|>",
1750
+ "<|special_1869|>",
1751
+ "<|special_1870|>",
1752
+ "<|special_1871|>",
1753
+ "<|special_1872|>",
1754
+ "<|special_1873|>",
1755
+ "<|special_1874|>",
1756
+ "<|special_1875|>",
1757
+ "<|special_1876|>",
1758
+ "<|special_1877|>",
1759
+ "<|special_1878|>",
1760
+ "<|special_1879|>",
1761
+ "<|special_1880|>",
1762
+ "<|special_1881|>",
1763
+ "<|special_1882|>",
1764
+ "<|special_1883|>",
1765
+ "<|special_1884|>",
1766
+ "<|special_1885|>",
1767
+ "<|special_1886|>",
1768
+ "<|special_1887|>",
1769
+ "<|special_1888|>",
1770
+ "<|special_1889|>",
1771
+ "<|special_1890|>",
1772
+ "<|special_1891|>",
1773
+ "<|special_1892|>",
1774
+ "<|special_1893|>",
1775
+ "<|special_1894|>",
1776
+ "<|special_1895|>",
1777
+ "<|special_1896|>",
1778
+ "<|special_1897|>",
1779
+ "<|special_1898|>",
1780
+ "<|special_1899|>",
1781
+ "<|special_1900|>",
1782
+ "<|special_1901|>",
1783
+ "<|special_1902|>",
1784
+ "<|special_1903|>",
1785
+ "<|special_1904|>",
1786
+ "<|special_1905|>",
1787
+ "<|special_1906|>",
1788
+ "<|special_1907|>",
1789
+ "<|special_1908|>",
1790
+ "<|special_1909|>",
1791
+ "<|special_1910|>",
1792
+ "<|special_1911|>",
1793
+ "<|special_1912|>",
1794
+ "<|special_1913|>",
1795
+ "<|special_1914|>",
1796
+ "<|special_1915|>",
1797
+ "<|special_1916|>",
1798
+ "<|special_1917|>",
1799
+ "<|special_1918|>",
1800
+ "<|special_1919|>",
1801
+ "<|special_1920|>",
1802
+ "<|special_1921|>",
1803
+ "<|special_1922|>",
1804
+ "<|special_1923|>",
1805
+ "<|special_1924|>",
1806
+ "<|special_1925|>",
1807
+ "<|special_1926|>",
1808
+ "<|special_1927|>",
1809
+ "<|special_1928|>",
1810
+ "<|special_1929|>",
1811
+ "<|special_1930|>",
1812
+ "<|special_1931|>",
1813
+ "<|special_1932|>",
1814
+ "<|special_1933|>",
1815
+ "<|special_1934|>",
1816
+ "<|special_1935|>",
1817
+ "<|special_1936|>",
1818
+ "<|special_1937|>",
1819
+ "<|special_1938|>",
1820
+ "<|special_1939|>",
1821
+ "<|special_1940|>",
1822
+ "<|special_1941|>",
1823
+ "<|special_1942|>",
1824
+ "<|special_1943|>",
1825
+ "<|special_1944|>",
1826
+ "<|special_1945|>",
1827
+ "<|special_1946|>",
1828
+ "<|special_1947|>",
1829
+ "<|special_1948|>",
1830
+ "<|special_1949|>",
1831
+ "<|special_1950|>",
1832
+ "<|special_1951|>",
1833
+ "<|special_1952|>",
1834
+ "<|special_1953|>",
1835
+ "<|special_1954|>",
1836
+ "<|special_1955|>",
1837
+ "<|special_1956|>",
1838
+ "<|special_1957|>",
1839
+ "<|special_1958|>",
1840
+ "<|special_1959|>",
1841
+ "<|special_1960|>",
1842
+ "<|special_1961|>",
1843
+ "<|special_1962|>",
1844
+ "<|special_1963|>",
1845
+ "<|special_1964|>",
1846
+ "<|special_1965|>",
1847
+ "<|special_1966|>",
1848
+ "<|special_1967|>",
1849
+ "<|special_1968|>",
1850
+ "<|special_1969|>",
1851
+ "<|special_1970|>",
1852
+ "<|special_1971|>",
1853
+ "<|special_1972|>",
1854
+ "<|special_1973|>",
1855
+ "<|special_1974|>",
1856
+ "<|special_1975|>",
1857
+ "<|special_1976|>",
1858
+ "<|special_1977|>",
1859
+ "<|special_1978|>",
1860
+ "<|special_1979|>",
1861
+ "<|special_1980|>",
1862
+ "<|special_1981|>",
1863
+ "<|special_1982|>",
1864
+ "<|special_1983|>",
1865
+ "<|special_1984|>",
1866
+ "<|special_1985|>",
1867
+ "<|special_1986|>",
1868
+ "<|special_1987|>",
1869
+ "<|special_1988|>",
1870
+ "<|special_1989|>",
1871
+ "<|special_1990|>",
1872
+ "<|special_1991|>",
1873
+ "<|special_1992|>",
1874
+ "<|special_1993|>",
1875
+ "<|special_1994|>",
1876
+ "<|special_1995|>",
1877
+ "<|special_1996|>",
1878
+ "<|special_1997|>",
1879
+ "<|special_1998|>",
1880
+ "<|special_1999|>",
1881
+ "<|special_2000|>",
1882
+ "<|special_2001|>",
1883
+ "<|special_2002|>",
1884
+ "<|special_2003|>",
1885
+ "<|special_2004|>",
1886
+ "<|special_2005|>",
1887
+ "<|special_2006|>",
1888
+ "<|special_2007|>",
1889
+ "<|special_2008|>",
1890
+ "<|special_2009|>",
1891
+ "<|special_2010|>",
1892
+ "<|special_2011|>",
1893
+ "<|special_2012|>",
1894
+ "<|special_2013|>",
1895
+ "<|special_2014|>",
1896
+ "<|special_2015|>",
1897
+ "<|special_2016|>",
1898
+ "<|special_2017|>",
1899
+ "<|special_2018|>",
1900
+ "<|special_2019|>",
1901
+ "<|special_2020|>",
1902
+ "<|special_2021|>",
1903
+ "<|special_2022|>",
1904
+ "<|special_2023|>",
1905
+ "<|special_2024|>",
1906
+ "<|special_2025|>",
1907
+ "<|special_2026|>",
1908
+ "<|special_2027|>",
1909
+ "<|special_2028|>",
1910
+ "<|special_2029|>",
1911
+ "<|special_2030|>",
1912
+ "<|special_2031|>",
1913
+ "<|special_2032|>",
1914
+ "<|special_2033|>",
1915
+ "<|special_2034|>",
1916
+ "<|special_2035|>",
1917
+ "<|special_2036|>",
1918
+ "<|special_2037|>",
1919
+ "<|special_2038|>",
1920
+ "<|special_2039|>",
1921
+ "<|special_2040|>",
1922
+ "<|special_2041|>",
1923
+ "<|special_2042|>",
1924
+ "<|special_2043|>",
1925
+ "<|special_2044|>",
1926
+ "<|special_2045|>",
1927
+ "<|special_2046|>",
1928
+ "<|special_2047|>",
1929
+ "<|special_2048|>",
1930
+ "<|special_2049|>",
1931
+ "<|special_2050|>",
1932
+ "<|special_2051|>",
1933
+ "<|special_2052|>",
1934
+ "<|special_2053|>",
1935
+ "<|special_2054|>",
1936
+ "<|special_2055|>",
1937
+ "<|special_2056|>",
1938
+ "<|special_2057|>",
1939
+ "<|special_2058|>",
1940
+ "<|special_2059|>",
1941
+ "<|special_2060|>",
1942
+ "<|special_2061|>",
1943
+ "<|special_2062|>",
1944
+ "<|special_2063|>",
1945
+ "<|special_2064|>",
1946
+ "<|special_2065|>",
1947
+ "<|special_2066|>",
1948
+ "<|special_2067|>",
1949
+ "<|special_2068|>",
1950
+ "<|special_2069|>",
1951
+ "<|special_2070|>",
1952
+ "<|special_2071|>",
1953
+ "<|special_2072|>",
1954
+ "<|special_2073|>",
1955
+ "<|special_2074|>",
1956
+ "<|special_2075|>",
1957
+ "<|special_2076|>",
1958
+ "<|special_2077|>",
1959
+ "<|special_2078|>",
1960
+ "<|special_2079|>",
1961
+ "<|special_2080|>",
1962
+ "<|special_2081|>",
1963
+ "<|special_2082|>",
1964
+ "<|special_2083|>",
1965
+ "<|special_2084|>",
1966
+ "<|special_2085|>",
1967
+ "<|special_2086|>",
1968
+ "<|special_2087|>",
1969
+ "<|special_2088|>",
1970
+ "<|special_2089|>",
1971
+ "<|special_2090|>",
1972
+ "<|special_2091|>",
1973
+ "<|special_2092|>",
1974
+ "<|special_2093|>",
1975
+ "<|special_2094|>",
1976
+ "<|special_2095|>",
1977
+ "<|special_2096|>",
1978
+ "<|special_2097|>",
1979
+ "<|special_2098|>",
1980
+ "<|special_2099|>",
1981
+ "<|special_2100|>",
1982
+ "<|special_2101|>",
1983
+ "<|special_2102|>",
1984
+ "<|special_2103|>",
1985
+ "<|special_2104|>",
1986
+ "<|special_2105|>",
1987
+ "<|special_2106|>",
1988
+ "<|special_2107|>",
1989
+ "<|special_2108|>",
1990
+ "<|special_2109|>",
1991
+ "<|special_2110|>",
1992
+ "<|special_2111|>",
1993
+ "<|special_2112|>",
1994
+ "<|special_2113|>",
1995
+ "<|special_2114|>",
1996
+ "<|special_2115|>",
1997
+ "<|special_2116|>",
1998
+ "<|special_2117|>",
1999
+ "<|special_2118|>",
2000
+ "<|special_2119|>",
2001
+ "<|special_2120|>",
2002
+ "<|special_2121|>",
2003
+ "<|special_2122|>",
2004
+ "<|special_2123|>",
2005
+ "<|special_2124|>",
2006
+ "<|special_2125|>",
2007
+ "<|special_2126|>",
2008
+ "<|special_2127|>",
2009
+ "<|special_2128|>",
2010
+ "<|special_2129|>",
2011
+ "<|special_2130|>",
2012
+ "<|special_2131|>",
2013
+ "<|special_2132|>",
2014
+ "<|special_2133|>",
2015
+ "<|special_2134|>",
2016
+ "<|special_2135|>",
2017
+ "<|special_2136|>",
2018
+ "<|special_2137|>",
2019
+ "<|special_2138|>",
2020
+ "<|special_2139|>",
2021
+ "<|special_2140|>",
2022
+ "<|special_2141|>",
2023
+ "<|special_2142|>",
2024
+ "<|special_2143|>",
2025
+ "<|special_2144|>",
2026
+ "<|special_2145|>",
2027
+ "<|special_2146|>",
2028
+ "<|special_2147|>",
2029
+ "<|special_2148|>",
2030
+ "<|special_2149|>",
2031
+ "<|special_2150|>",
2032
+ "<|special_2151|>",
2033
+ "<|special_2152|>",
2034
+ "<|special_2153|>",
2035
+ "<|special_2154|>",
2036
+ "<|special_2155|>",
2037
+ "<|special_2156|>",
2038
+ "<|special_2157|>",
2039
+ "<|special_2158|>",
2040
+ "<|special_2159|>",
2041
+ "<|special_2160|>",
2042
+ "<|special_2161|>",
2043
+ "<|special_2162|>",
2044
+ "<|special_2163|>",
2045
+ "<|special_2164|>",
2046
+ "<|special_2165|>",
2047
+ "<|special_2166|>",
2048
+ "<|special_2167|>",
2049
+ "<|special_2168|>",
2050
+ "<|special_2169|>",
2051
+ "<|special_2170|>",
2052
+ "<|special_2171|>",
2053
+ "<|special_2172|>",
2054
+ "<|special_2173|>",
2055
+ "<|special_2174|>",
2056
+ "<|special_2175|>",
2057
+ "<|special_2176|>",
2058
+ "<|special_2177|>",
2059
+ "<|special_2178|>",
2060
+ "<|special_2179|>",
2061
+ "<|special_2180|>",
2062
+ "<|special_2181|>",
2063
+ "<|special_2182|>",
2064
+ "<|special_2183|>",
2065
+ "<|special_2184|>",
2066
+ "<|special_2185|>",
2067
+ "<|special_2186|>",
2068
+ "<|special_2187|>",
2069
+ "<|special_2188|>",
2070
+ "<|special_2189|>",
2071
+ "<|special_2190|>",
2072
+ "<|special_2191|>",
2073
+ "<|special_2192|>",
2074
+ "<|special_2193|>",
2075
+ "<|special_2194|>",
2076
+ "<|special_2195|>",
2077
+ "<|special_2196|>",
2078
+ "<|special_2197|>",
2079
+ "<|special_2198|>",
2080
+ "<|special_2199|>",
2081
+ "<|special_2200|>",
2082
+ "<|special_2201|>",
2083
+ "<|special_2202|>",
2084
+ "<|special_2203|>",
2085
+ "<|special_2204|>",
2086
+ "<|special_2205|>",
2087
+ "<|special_2206|>",
2088
+ "<|special_2207|>",
2089
+ "<|special_2208|>",
2090
+ "<|special_2209|>",
2091
+ "<|special_2210|>",
2092
+ "<|special_2211|>",
2093
+ "<|special_2212|>",
2094
+ "<|special_2213|>",
2095
+ "<|special_2214|>",
2096
+ "<|special_2215|>",
2097
+ "<|special_2216|>",
2098
+ "<|special_2217|>",
2099
+ "<|special_2218|>",
2100
+ "<|special_2219|>",
2101
+ "<|special_2220|>",
2102
+ "<|special_2221|>",
2103
+ "<|special_2222|>",
2104
+ "<|special_2223|>",
2105
+ "<|special_2224|>",
2106
+ "<|special_2225|>",
2107
+ "<|special_2226|>",
2108
+ "<|special_2227|>",
2109
+ "<|special_2228|>",
2110
+ "<|special_2229|>",
2111
+ "<|special_2230|>",
2112
+ "<|special_2231|>",
2113
+ "<|special_2232|>",
2114
+ "<|special_2233|>",
2115
+ "<|special_2234|>",
2116
+ "<|special_2235|>",
2117
+ "<|special_2236|>",
2118
+ "<|special_2237|>",
2119
+ "<|special_2238|>",
2120
+ "<|special_2239|>",
2121
+ "<|special_2240|>",
2122
+ "<|special_2241|>",
2123
+ "<|special_2242|>",
2124
+ "<|special_2243|>",
2125
+ "<|special_2244|>",
2126
+ "<|special_2245|>",
2127
+ "<|special_2246|>",
2128
+ "<|special_2247|>",
2129
+ "<|special_2248|>",
2130
+ "<|special_2249|>",
2131
+ "<|special_2250|>",
2132
+ "<|special_2251|>",
2133
+ "<|special_2252|>",
2134
+ "<|special_2253|>",
2135
+ "<|special_2254|>",
2136
+ "<|special_2255|>",
2137
+ "<|special_2256|>",
2138
+ "<|special_2257|>",
2139
+ "<|special_2258|>",
2140
+ "<|special_2259|>",
2141
+ "<|special_2260|>",
2142
+ "<|special_2261|>",
2143
+ "<|special_2262|>",
2144
+ "<|special_2263|>",
2145
+ "<|special_2264|>",
2146
+ "<|special_2265|>",
2147
+ "<|special_2266|>",
2148
+ "<|special_2267|>",
2149
+ "<|special_2268|>",
2150
+ "<|special_2269|>",
2151
+ "<|special_2270|>",
2152
+ "<|special_2271|>",
2153
+ "<|special_2272|>",
2154
+ "<|special_2273|>",
2155
+ "<|special_2274|>",
2156
+ "<|special_2275|>",
2157
+ "<|special_2276|>",
2158
+ "<|special_2277|>",
2159
+ "<|special_2278|>",
2160
+ "<|special_2279|>",
2161
+ "<|special_2280|>",
2162
+ "<|special_2281|>",
2163
+ "<|special_2282|>",
2164
+ "<|special_2283|>",
2165
+ "<|special_2284|>",
2166
+ "<|special_2285|>",
2167
+ "<|special_2286|>",
2168
+ "<|special_2287|>",
2169
+ "<|special_2288|>",
2170
+ "<|special_2289|>",
2171
+ "<|special_2290|>",
2172
+ "<|special_2291|>",
2173
+ "<|special_2292|>",
2174
+ "<|special_2293|>",
2175
+ "<|special_2294|>",
2176
+ "<|special_2295|>",
2177
+ "<|special_2296|>",
2178
+ "<|special_2297|>",
2179
+ "<|special_2298|>",
2180
+ "<|special_2299|>",
2181
+ "<|special_2300|>",
2182
+ "<|special_2301|>",
2183
+ "<|special_2302|>",
2184
+ "<|special_2303|>",
2185
+ "<|special_2304|>",
2186
+ "<|special_2305|>",
2187
+ "<|special_2306|>",
2188
+ "<|special_2307|>",
2189
+ "<|special_2308|>",
2190
+ "<|special_2309|>",
2191
+ "<|special_2310|>",
2192
+ "<|special_2311|>",
2193
+ "<|special_2312|>",
2194
+ "<|special_2313|>",
2195
+ "<|special_2314|>",
2196
+ "<|special_2315|>",
2197
+ "<|special_2316|>",
2198
+ "<|special_2317|>",
2199
+ "<|special_2318|>",
2200
+ "<|special_2319|>",
2201
+ "<|special_2320|>",
2202
+ "<|special_2321|>",
2203
+ "<|special_2322|>",
2204
+ "<|special_2323|>",
2205
+ "<|special_2324|>",
2206
+ "<|special_2325|>",
2207
+ "<|special_2326|>",
2208
+ "<|special_2327|>",
2209
+ "<|special_2328|>",
2210
+ "<|special_2329|>",
2211
+ "<|special_2330|>",
2212
+ "<|special_2331|>",
2213
+ "<|special_2332|>",
2214
+ "<|special_2333|>",
2215
+ "<|special_2334|>",
2216
+ "<|special_2335|>",
2217
+ "<|special_2336|>",
2218
+ "<|special_2337|>",
2219
+ "<|special_2338|>",
2220
+ "<|special_2339|>",
2221
+ "<|special_2340|>",
2222
+ "<|special_2341|>",
2223
+ "<|special_2342|>",
2224
+ "<|special_2343|>",
2225
+ "<|special_2344|>",
2226
+ "<|special_2345|>",
2227
+ "<|special_2346|>",
2228
+ "<|special_2347|>",
2229
+ "<|special_2348|>",
2230
+ "<|special_2349|>",
2231
+ "<|special_2350|>",
2232
+ "<|special_2351|>",
2233
+ "<|special_2352|>",
2234
+ "<|special_2353|>",
2235
+ "<|special_2354|>",
2236
+ "<|special_2355|>",
2237
+ "<|special_2356|>",
2238
+ "<|special_2357|>",
2239
+ "<|special_2358|>",
2240
+ "<|special_2359|>",
2241
+ "<|special_2360|>",
2242
+ "<|special_2361|>",
2243
+ "<|special_2362|>",
2244
+ "<|special_2363|>",
2245
+ "<|special_2364|>",
2246
+ "<|special_2365|>",
2247
+ "<|special_2366|>",
2248
+ "<|special_2367|>",
2249
+ "<|special_2368|>",
2250
+ "<|special_2369|>",
2251
+ "<|special_2370|>",
2252
+ "<|special_2371|>",
2253
+ "<|special_2372|>",
2254
+ "<|special_2373|>",
2255
+ "<|special_2374|>",
2256
+ "<|special_2375|>",
2257
+ "<|special_2376|>",
2258
+ "<|special_2377|>",
2259
+ "<|special_2378|>",
2260
+ "<|special_2379|>",
2261
+ "<|special_2380|>",
2262
+ "<|special_2381|>",
2263
+ "<|special_2382|>",
2264
+ "<|special_2383|>",
2265
+ "<|special_2384|>",
2266
+ "<|special_2385|>",
2267
+ "<|special_2386|>",
2268
+ "<|special_2387|>",
2269
+ "<|special_2388|>",
2270
+ "<|special_2389|>",
2271
+ "<|special_2390|>",
2272
+ "<|special_2391|>",
2273
+ "<|special_2392|>",
2274
+ "<|special_2393|>",
2275
+ "<|special_2394|>",
2276
+ "<|special_2395|>",
2277
+ "<|special_2396|>",
2278
+ "<|special_2397|>",
2279
+ "<|special_2398|>",
2280
+ "<|special_2399|>",
2281
+ "<|special_2400|>",
2282
+ "<|special_2401|>",
2283
+ "<|special_2402|>",
2284
+ "<|special_2403|>",
2285
+ "<|special_2404|>",
2286
+ "<|special_2405|>",
2287
+ "<|special_2406|>",
2288
+ "<|special_2407|>",
2289
+ "<|special_2408|>",
2290
+ "<|special_2409|>",
2291
+ "<|special_2410|>",
2292
+ "<|special_2411|>",
2293
+ "<|special_2412|>",
2294
+ "<|special_2413|>",
2295
+ "<|special_2414|>",
2296
+ "<|special_2415|>",
2297
+ "<|special_2416|>",
2298
+ "<|special_2417|>",
2299
+ "<|special_2418|>",
2300
+ "<|special_2419|>",
2301
+ "<|special_2420|>",
2302
+ "<|special_2421|>",
2303
+ "<|special_2422|>",
2304
+ "<|special_2423|>",
2305
+ "<|special_2424|>",
2306
+ "<|special_2425|>",
2307
+ "<|special_2426|>",
2308
+ "<|special_2427|>",
2309
+ "<|special_2428|>",
2310
+ "<|special_2429|>",
2311
+ "<|special_2430|>",
2312
+ "<|special_2431|>",
2313
+ "<|special_2432|>",
2314
+ "<|special_2433|>",
2315
+ "<|special_2434|>",
2316
+ "<|special_2435|>",
2317
+ "<|special_2436|>",
2318
+ "<|special_2437|>",
2319
+ "<|special_2438|>",
2320
+ "<|special_2439|>",
2321
+ "<|special_2440|>",
2322
+ "<|special_2441|>",
2323
+ "<|special_2442|>",
2324
+ "<|special_2443|>",
2325
+ "<|special_2444|>",
2326
+ "<|special_2445|>",
2327
+ "<|special_2446|>",
2328
+ "<|special_2447|>",
2329
+ "<|special_2448|>",
2330
+ "<|special_2449|>",
2331
+ "<|special_2450|>",
2332
+ "<|special_2451|>",
2333
+ "<|special_2452|>",
2334
+ "<|special_2453|>",
2335
+ "<|special_2454|>",
2336
+ "<|special_2455|>",
2337
+ "<|special_2456|>",
2338
+ "<|special_2457|>",
2339
+ "<|special_2458|>",
2340
+ "<|special_2459|>",
2341
+ "<|special_2460|>",
2342
+ "<|special_2461|>",
2343
+ "<|special_2462|>",
2344
+ "<|special_2463|>",
2345
+ "<|special_2464|>",
2346
+ "<|special_2465|>",
2347
+ "<|special_2466|>",
2348
+ "<|special_2467|>",
2349
+ "<|special_2468|>",
2350
+ "<|special_2469|>",
2351
+ "<|special_2470|>",
2352
+ "<|special_2471|>",
2353
+ "<|special_2472|>",
2354
+ "<|special_2473|>",
2355
+ "<|special_2474|>",
2356
+ "<|special_2475|>",
2357
+ "<|special_2476|>",
2358
+ "<|special_2477|>",
2359
+ "<|special_2478|>",
2360
+ "<|special_2479|>",
2361
+ "<|special_2480|>",
2362
+ "<|special_2481|>",
2363
+ "<|special_2482|>",
2364
+ "<|special_2483|>",
2365
+ "<|special_2484|>",
2366
+ "<|special_2485|>",
2367
+ "<|special_2486|>",
2368
+ "<|special_2487|>",
2369
+ "<|special_2488|>",
2370
+ "<|special_2489|>",
2371
+ "<|special_2490|>",
2372
+ "<|special_2491|>",
2373
+ "<|special_2492|>",
2374
+ "<|special_2493|>",
2375
+ "<|special_2494|>",
2376
+ "<|special_2495|>",
2377
+ "<|special_2496|>",
2378
+ "<|special_2497|>",
2379
+ "<|special_2498|>",
2380
+ "<|special_2499|>",
2381
+ "<|special_2500|>",
2382
+ "<|special_2501|>",
2383
+ "<|special_2502|>",
2384
+ "<|special_2503|>",
2385
+ "<|special_2504|>",
2386
+ "<|special_2505|>",
2387
+ "<|special_2506|>",
2388
+ "<|special_2507|>",
2389
+ "<|special_2508|>",
2390
+ "<|special_2509|>",
2391
+ "<|special_2510|>",
2392
+ "<|special_2511|>",
2393
+ "<|special_2512|>",
2394
+ "<|special_2513|>",
2395
+ "<|special_2514|>",
2396
+ "<|special_2515|>",
2397
+ "<|special_2516|>",
2398
+ "<|special_2517|>",
2399
+ "<|special_2518|>",
2400
+ "<|special_2519|>",
2401
+ "<|special_2520|>",
2402
+ "<|special_2521|>",
2403
+ "<|special_2522|>",
2404
+ "<|special_2523|>",
2405
+ "<|special_2524|>",
2406
+ "<|special_2525|>",
2407
+ "<|special_2526|>",
2408
+ "<|special_2527|>",
2409
+ "<|special_2528|>",
2410
+ "<|special_2529|>",
2411
+ "<|special_2530|>",
2412
+ "<|special_2531|>",
2413
+ "<|special_2532|>",
2414
+ "<|special_2533|>",
2415
+ "<|special_2534|>",
2416
+ "<|special_2535|>",
2417
+ "<|special_2536|>",
2418
+ "<|special_2537|>",
2419
+ "<|special_2538|>",
2420
+ "<|special_2539|>",
2421
+ "<|special_2540|>",
2422
+ "<|special_2541|>",
2423
+ "<|special_2542|>",
2424
+ "<|special_2543|>",
2425
+ "<|special_2544|>",
2426
+ "<|special_2545|>",
2427
+ "<|special_2546|>",
2428
+ "<|special_2547|>",
2429
+ "<|special_2548|>",
2430
+ "<|special_2549|>",
2431
+ "<|special_2550|>",
2432
+ "<|special_2551|>",
2433
+ "<|special_2552|>",
2434
+ "<|special_2553|>",
2435
+ "<|special_2554|>",
2436
+ "<|special_2555|>",
2437
+ "<|special_2556|>",
2438
+ "<|special_2557|>",
2439
+ "<|special_2558|>",
2440
+ "<|special_2559|>",
2441
+ "<|special_2560|>",
2442
+ "<|special_2561|>",
2443
+ "<|special_2562|>",
2444
+ "<|special_2563|>",
2445
+ "<|special_2564|>",
2446
+ "<|special_2565|>",
2447
+ "<|special_2566|>",
2448
+ "<|special_2567|>",
2449
+ "<|special_2568|>",
2450
+ "<|special_2569|>",
2451
+ "<|special_2570|>",
2452
+ "<|special_2571|>",
2453
+ "<|special_2572|>",
2454
+ "<|special_2573|>",
2455
+ "<|special_2574|>",
2456
+ "<|special_2575|>",
2457
+ "<|special_2576|>",
2458
+ "<|special_2577|>",
2459
+ "<|special_2578|>",
2460
+ "<|special_2579|>",
2461
+ "<|special_2580|>",
2462
+ "<|special_2581|>",
2463
+ "<|special_2582|>",
2464
+ "<|special_2583|>",
2465
+ "<|special_2584|>",
2466
+ "<|special_2585|>",
2467
+ "<|special_2586|>",
2468
+ "<|special_2587|>",
2469
+ "<|special_2588|>",
2470
+ "<|special_2589|>",
2471
+ "<|special_2590|>",
2472
+ "<|special_2591|>",
2473
+ "<|special_2592|>",
2474
+ "<|special_2593|>",
2475
+ "<|special_2594|>",
2476
+ "<|special_2595|>",
2477
+ "<|special_2596|>",
2478
+ "<|special_2597|>",
2479
+ "<|special_2598|>",
2480
+ "<|special_2599|>",
2481
+ "<|special_2600|>",
2482
+ "<|special_2601|>",
2483
+ "<|special_2602|>",
2484
+ "<|special_2603|>",
2485
+ "<|special_2604|>",
2486
+ "<|special_2605|>",
2487
+ "<|special_2606|>",
2488
+ "<|special_2607|>",
2489
+ "<|special_2608|>",
2490
+ "<|special_2609|>",
2491
+ "<|special_2610|>",
2492
+ "<|special_2611|>",
2493
+ "<|special_2612|>",
2494
+ "<|special_2613|>",
2495
+ "<|special_2614|>",
2496
+ "<|special_2615|>",
2497
+ "<|special_2616|>",
2498
+ "<|special_2617|>",
2499
+ "<|special_2618|>",
2500
+ "<|special_2619|>",
2501
+ "<|special_2620|>",
2502
+ "<|special_2621|>",
2503
+ "<|special_2622|>",
2504
+ "<|special_2623|>",
2505
+ "<|special_2624|>",
2506
+ "<|special_2625|>",
2507
+ "<|special_2626|>",
2508
+ "<|special_2627|>",
2509
+ "<|special_2628|>",
2510
+ "<|special_2629|>",
2511
+ "<|special_2630|>",
2512
+ "<|special_2631|>",
2513
+ "<|special_2632|>",
2514
+ "<|special_2633|>",
2515
+ "<|special_2634|>",
2516
+ "<|special_2635|>",
2517
+ "<|special_2636|>",
2518
+ "<|special_2637|>",
2519
+ "<|special_2638|>",
2520
+ "<|special_2639|>",
2521
+ "<|special_2640|>",
2522
+ "<|special_2641|>",
2523
+ "<|special_2642|>",
2524
+ "<|special_2643|>",
2525
+ "<|special_2644|>",
2526
+ "<|special_2645|>",
2527
+ "<|special_2646|>",
2528
+ "<|special_2647|>",
2529
+ "<|special_2648|>",
2530
+ "<|special_2649|>",
2531
+ "<|special_2650|>",
2532
+ "<|special_2651|>",
2533
+ "<|special_2652|>",
2534
+ "<|special_2653|>",
2535
+ "<|special_2654|>",
2536
+ "<|special_2655|>",
2537
+ "<|special_2656|>",
2538
+ "<|special_2657|>",
2539
+ "<|special_2658|>",
2540
+ "<|special_2659|>",
2541
+ "<|special_2660|>",
2542
+ "<|special_2661|>",
2543
+ "<|special_2662|>",
2544
+ "<|special_2663|>",
2545
+ "<|special_2664|>",
2546
+ "<|special_2665|>",
2547
+ "<|special_2666|>",
2548
+ "<|special_2667|>",
2549
+ "<|special_2668|>",
2550
+ "<|special_2669|>",
2551
+ "<|special_2670|>",
2552
+ "<|special_2671|>",
2553
+ "<|special_2672|>",
2554
+ "<|special_2673|>",
2555
+ "<|special_2674|>",
2556
+ "<|special_2675|>",
2557
+ "<|special_2676|>",
2558
+ "<|special_2677|>",
2559
+ "<|special_2678|>",
2560
+ "<|special_2679|>",
2561
+ "<|special_2680|>",
2562
+ "<|special_2681|>",
2563
+ "<|special_2682|>",
2564
+ "<|special_2683|>",
2565
+ "<|special_2684|>",
2566
+ "<|special_2685|>",
2567
+ "<|special_2686|>",
2568
+ "<|special_2687|>",
2569
+ "<|special_2688|>",
2570
+ "<|special_2689|>",
2571
+ "<|special_2690|>",
2572
+ "<|special_2691|>",
2573
+ "<|special_2692|>",
2574
+ "<|special_2693|>",
2575
+ "<|special_2694|>",
2576
+ "<|special_2695|>",
2577
+ "<|special_2696|>",
2578
+ "<|special_2697|>",
2579
+ "<|special_2698|>",
2580
+ "<|special_2699|>",
2581
+ "<|special_2700|>",
2582
+ "<|special_2701|>",
2583
+ "<|special_2702|>",
2584
+ "<|special_2703|>",
2585
+ "<|special_2704|>",
2586
+ "<|special_2705|>",
2587
+ "<|special_2706|>",
2588
+ "<|special_2707|>",
2589
+ "<|special_2708|>",
2590
+ "<|special_2709|>",
2591
+ "<|special_2710|>",
2592
+ "<|special_2711|>",
2593
+ "<|special_2712|>",
2594
+ "<|special_2713|>",
2595
+ "<|special_2714|>",
2596
+ "<|special_2715|>",
2597
+ "<|special_2716|>",
2598
+ "<|special_2717|>",
2599
+ "<|special_2718|>",
2600
+ "<|special_2719|>",
2601
+ "<|special_2720|>",
2602
+ "<|special_2721|>",
2603
+ "<|special_2722|>",
2604
+ "<|special_2723|>",
2605
+ "<|special_2724|>",
2606
+ "<|special_2725|>",
2607
+ "<|special_2726|>",
2608
+ "<|special_2727|>",
2609
+ "<|special_2728|>",
2610
+ "<|special_2729|>",
2611
+ "<|special_2730|>",
2612
+ "<|special_2731|>",
2613
+ "<|special_2732|>",
2614
+ "<|special_2733|>",
2615
+ "<|special_2734|>",
2616
+ "<|special_2735|>",
2617
+ "<|special_2736|>",
2618
+ "<|special_2737|>",
2619
+ "<|special_2738|>",
2620
+ "<|special_2739|>",
2621
+ "<|special_2740|>",
2622
+ "<|special_2741|>",
2623
+ "<|special_2742|>",
2624
+ "<|special_2743|>",
2625
+ "<|special_2744|>",
2626
+ "<|special_2745|>",
2627
+ "<|special_2746|>",
2628
+ "<|special_2747|>",
2629
+ "<|special_2748|>",
2630
+ "<|special_2749|>",
2631
+ "<|special_2750|>",
2632
+ "<|special_2751|>",
2633
+ "<|special_2752|>",
2634
+ "<|special_2753|>",
2635
+ "<|special_2754|>",
2636
+ "<|special_2755|>",
2637
+ "<|special_2756|>",
2638
+ "<|special_2757|>",
2639
+ "<|special_2758|>",
2640
+ "<|special_2759|>",
2641
+ "<|special_2760|>",
2642
+ "<|special_2761|>",
2643
+ "<|special_2762|>",
2644
+ "<|special_2763|>",
2645
+ "<|special_2764|>",
2646
+ "<|special_2765|>",
2647
+ "<|special_2766|>",
2648
+ "<|special_2767|>",
2649
+ "<|special_2768|>",
2650
+ "<|special_2769|>",
2651
+ "<|special_2770|>",
2652
+ "<|special_2771|>",
2653
+ "<|special_2772|>",
2654
+ "<|special_2773|>",
2655
+ "<|special_2774|>",
2656
+ "<|special_2775|>",
2657
+ "<|special_2776|>",
2658
+ "<|special_2777|>",
2659
+ "<|special_2778|>",
2660
+ "<|special_2779|>",
2661
+ "<|special_2780|>",
2662
+ "<|special_2781|>",
2663
+ "<|special_2782|>",
2664
+ "<|special_2783|>",
2665
+ "<|special_2784|>",
2666
+ "<|special_2785|>",
2667
+ "<|special_2786|>",
2668
+ "<|special_2787|>",
2669
+ "<|special_2788|>",
2670
+ "<|special_2789|>",
2671
+ "<|special_2790|>",
2672
+ "<|special_2791|>",
2673
+ "<|special_2792|>",
2674
+ "<|special_2793|>",
2675
+ "<|special_2794|>",
2676
+ "<|special_2795|>",
2677
+ "<|special_2796|>",
2678
+ "<|special_2797|>",
2679
+ "<|special_2798|>",
2680
+ "<|special_2799|>",
2681
+ "<|special_2800|>",
2682
+ "<|special_2801|>",
2683
+ "<|special_2802|>",
2684
+ "<|special_2803|>",
2685
+ "<|special_2804|>",
2686
+ "<|special_2805|>",
2687
+ "<|special_2806|>",
2688
+ "<|special_2807|>",
2689
+ "<|special_2808|>",
2690
+ "<|special_2809|>",
2691
+ "<|special_2810|>",
2692
+ "<|special_2811|>",
2693
+ "<|special_2812|>",
2694
+ "<|special_2813|>",
2695
+ "<|special_2814|>",
2696
+ "<|special_2815|>",
2697
+ "<|special_2816|>",
2698
+ "<|special_2817|>",
2699
+ "<|special_2818|>",
2700
+ "<|special_2819|>",
2701
+ "<|special_2820|>",
2702
+ "<|special_2821|>",
2703
+ "<|special_2822|>",
2704
+ "<|special_2823|>",
2705
+ "<|special_2824|>",
2706
+ "<|special_2825|>",
2707
+ "<|special_2826|>",
2708
+ "<|special_2827|>",
2709
+ "<|special_2828|>",
2710
+ "<|special_2829|>",
2711
+ "<|special_2830|>",
2712
+ "<|special_2831|>",
2713
+ "<|special_2832|>",
2714
+ "<|special_2833|>",
2715
+ "<|special_2834|>",
2716
+ "<|special_2835|>",
2717
+ "<|special_2836|>",
2718
+ "<|special_2837|>",
2719
+ "<|special_2838|>",
2720
+ "<|special_2839|>",
2721
+ "<|special_2840|>",
2722
+ "<|special_2841|>",
2723
+ "<|special_2842|>",
2724
+ "<|special_2843|>",
2725
+ "<|special_2844|>",
2726
+ "<|special_2845|>",
2727
+ "<|special_2846|>",
2728
+ "<|special_2847|>",
2729
+ "<|special_2848|>",
2730
+ "<|special_2849|>",
2731
+ "<|special_2850|>",
2732
+ "<|special_2851|>",
2733
+ "<|special_2852|>",
2734
+ "<|special_2853|>",
2735
+ "<|special_2854|>",
2736
+ "<|special_2855|>",
2737
+ "<|special_2856|>",
2738
+ "<|special_2857|>",
2739
+ "<|special_2858|>",
2740
+ "<|special_2859|>",
2741
+ "<|special_2860|>",
2742
+ "<|special_2861|>",
2743
+ "<|special_2862|>",
2744
+ "<|special_2863|>",
2745
+ "<|special_2864|>",
2746
+ "<|special_2865|>",
2747
+ "<|special_2866|>",
2748
+ "<|special_2867|>",
2749
+ "<|special_2868|>",
2750
+ "<|special_2869|>",
2751
+ "<|special_2870|>",
2752
+ "<|special_2871|>",
2753
+ "<|special_2872|>",
2754
+ "<|special_2873|>",
2755
+ "<|special_2874|>",
2756
+ "<|special_2875|>",
2757
+ "<|special_2876|>",
2758
+ "<|special_2877|>",
2759
+ "<|special_2878|>",
2760
+ "<|special_2879|>",
2761
+ "<|special_2880|>",
2762
+ "<|special_2881|>",
2763
+ "<|special_2882|>",
2764
+ "<|special_2883|>",
2765
+ "<|special_2884|>",
2766
+ "<|special_2885|>",
2767
+ "<|special_2886|>",
2768
+ "<|special_2887|>",
2769
+ "<|special_2888|>",
2770
+ "<|special_2889|>",
2771
+ "<|special_2890|>",
2772
+ "<|special_2891|>",
2773
+ "<|special_2892|>",
2774
+ "<|special_2893|>",
2775
+ "<|special_2894|>",
2776
+ "<|special_2895|>",
2777
+ "<|special_2896|>",
2778
+ "<|special_2897|>",
2779
+ "<|special_2898|>",
2780
+ "<|special_2899|>",
2781
+ "<|special_2900|>",
2782
+ "<|special_2901|>",
2783
+ "<|special_2902|>",
2784
+ "<|special_2903|>",
2785
+ "<|special_2904|>",
2786
+ "<|special_2905|>",
2787
+ "<|special_2906|>",
2788
+ "<|special_2907|>",
2789
+ "<|special_2908|>",
2790
+ "<|special_2909|>",
2791
+ "<|special_2910|>",
2792
+ "<|special_2911|>",
2793
+ "<|special_2912|>",
2794
+ "<|special_2913|>",
2795
+ "<|special_2914|>",
2796
+ "<|special_2915|>",
2797
+ "<|special_2916|>",
2798
+ "<|special_2917|>",
2799
+ "<|special_2918|>",
2800
+ "<|special_2919|>",
2801
+ "<|special_2920|>",
2802
+ "<|special_2921|>",
2803
+ "<|special_2922|>",
2804
+ "<|special_2923|>",
2805
+ "<|special_2924|>",
2806
+ "<|special_2925|>",
2807
+ "<|special_2926|>",
2808
+ "<|special_2927|>",
2809
+ "<|special_2928|>",
2810
+ "<|special_2929|>",
2811
+ "<|special_2930|>",
2812
+ "<|special_2931|>",
2813
+ "<|special_2932|>",
2814
+ "<|special_2933|>",
2815
+ "<|special_2934|>",
2816
+ "<|special_2935|>",
2817
+ "<|special_2936|>",
2818
+ "<|special_2937|>",
2819
+ "<|special_2938|>",
2820
+ "<|special_2939|>",
2821
+ "<|special_2940|>",
2822
+ "<|special_2941|>",
2823
+ "<|special_2942|>",
2824
+ "<|special_2943|>",
2825
+ "<|special_2944|>",
2826
+ "<|special_2945|>",
2827
+ "<|special_2946|>",
2828
+ "<|special_2947|>",
2829
+ "<|special_2948|>",
2830
+ "<|special_2949|>",
2831
+ "<|special_2950|>",
2832
+ "<|special_2951|>",
2833
+ "<|special_2952|>",
2834
+ "<|special_2953|>",
2835
+ "<|special_2954|>",
2836
+ "<|special_2955|>",
2837
+ "<|special_2956|>",
2838
+ "<|special_2957|>",
2839
+ "<|special_2958|>",
2840
+ "<|special_2959|>",
2841
+ "<|special_2960|>",
2842
+ "<|special_2961|>",
2843
+ "<|special_2962|>",
2844
+ "<|special_2963|>",
2845
+ "<|special_2964|>",
2846
+ "<|special_2965|>",
2847
+ "<|special_2966|>",
2848
+ "<|special_2967|>",
2849
+ "<|special_2968|>",
2850
+ "<|special_2969|>",
2851
+ "<|special_2970|>",
2852
+ "<|special_2971|>",
2853
+ "<|special_2972|>",
2854
+ "<|special_2973|>",
2855
+ "<|special_2974|>",
2856
+ "<|special_2975|>",
2857
+ "<|special_2976|>",
2858
+ "<|special_2977|>",
2859
+ "<|special_2978|>",
2860
+ "<|special_2979|>",
2861
+ "<|special_2980|>",
2862
+ "<|special_2981|>",
2863
+ "<|special_2982|>",
2864
+ "<|special_2983|>",
2865
+ "<|special_2984|>",
2866
+ "<|special_2985|>",
2867
+ "<|special_2986|>",
2868
+ "<|special_2987|>",
2869
+ "<|special_2988|>",
2870
+ "<|special_2989|>",
2871
+ "<|special_2990|>",
2872
+ "<|special_2991|>",
2873
+ "<|special_2992|>",
2874
+ "<|special_2993|>",
2875
+ "<|special_2994|>",
2876
+ "<|special_2995|>",
2877
+ "<|special_2996|>",
2878
+ "<|special_2997|>",
2879
+ "<|special_2998|>",
2880
+ "<|special_2999|>",
2881
+ "<|special_3000|>",
2882
+ "<|special_3001|>",
2883
+ "<|special_3002|>",
2884
+ "<|special_3003|>",
2885
+ "<|special_3004|>",
2886
+ "<|special_3005|>",
2887
+ "<|special_3006|>",
2888
+ "<|special_3007|>",
2889
+ "<|special_3008|>",
2890
+ "<|special_3009|>",
2891
+ "<|special_3010|>",
2892
+ "<|special_3011|>",
2893
+ "<|special_3012|>",
2894
+ "<|special_3013|>",
2895
+ "<|special_3014|>",
2896
+ "<|special_3015|>",
2897
+ "<|special_3016|>",
2898
+ "<|special_3017|>",
2899
+ "<|special_3018|>",
2900
+ "<|special_3019|>",
2901
+ "<|special_3020|>",
2902
+ "<|special_3021|>",
2903
+ "<|special_3022|>",
2904
+ "<|special_3023|>",
2905
+ "<|special_3024|>",
2906
+ "<|special_3025|>",
2907
+ "<|special_3026|>",
2908
+ "<|special_3027|>",
2909
+ "<|special_3028|>",
2910
+ "<|special_3029|>",
2911
+ "<|special_3030|>",
2912
+ "<|special_3031|>",
2913
+ "<|special_3032|>",
2914
+ "<|special_3033|>",
2915
+ "<|special_3034|>",
2916
+ "<|special_3035|>",
2917
+ "<|special_3036|>",
2918
+ "<|special_3037|>",
2919
+ "<|special_3038|>",
2920
+ "<|special_3039|>",
2921
+ "<|special_3040|>",
2922
+ "<|special_3041|>",
2923
+ "<|special_3042|>",
2924
+ "<|special_3043|>",
2925
+ "<|special_3044|>",
2926
+ "<|special_3045|>",
2927
+ "<|special_3046|>",
2928
+ "<|special_3047|>",
2929
+ "<|special_3048|>",
2930
+ "<|special_3049|>",
2931
+ "<|special_3050|>",
2932
+ "<|special_3051|>",
2933
+ "<|special_3052|>",
2934
+ "<|special_3053|>",
2935
+ "<|special_3054|>",
2936
+ "<|special_3055|>",
2937
+ "<|special_3056|>",
2938
+ "<|special_3057|>",
2939
+ "<|special_3058|>",
2940
+ "<|special_3059|>",
2941
+ "<|special_3060|>",
2942
+ "<|special_3061|>",
2943
+ "<|special_3062|>",
2944
+ "<|special_3063|>",
2945
+ "<|special_3064|>",
2946
+ "<|special_3065|>",
2947
+ "<|special_3066|>",
2948
+ "<|special_3067|>",
2949
+ "<|special_3068|>",
2950
+ "<|special_3069|>",
2951
+ "<|special_3070|>",
2952
+ "<|special_3071|>",
2953
+ "<|special_3072|>",
2954
+ "<|special_3073|>",
2955
+ "<|special_3074|>",
2956
+ "<|special_3075|>",
2957
+ "<|special_3076|>",
2958
+ "<|special_3077|>",
2959
+ "<|special_3078|>",
2960
+ "<|special_3079|>",
2961
+ "<|special_3080|>",
2962
+ "<|special_3081|>",
2963
+ "<|special_3082|>",
2964
+ "<|special_3083|>",
2965
+ "<|special_3084|>",
2966
+ "<|special_3085|>",
2967
+ "<|special_3086|>",
2968
+ "<|special_3087|>",
2969
+ "<|special_3088|>",
2970
+ "<|special_3089|>",
2971
+ "<|special_3090|>",
2972
+ "<|special_3091|>",
2973
+ "<|special_3092|>",
2974
+ "<|special_3093|>",
2975
+ "<|special_3094|>",
2976
+ "<|special_3095|>",
2977
+ "<|special_3096|>",
2978
+ "<|special_3097|>",
2979
+ "<|special_3098|>",
2980
+ "<|special_3099|>",
2981
+ "<|special_3100|>",
2982
+ "<|special_3101|>",
2983
+ "<|special_3102|>",
2984
+ "<|special_3103|>",
2985
+ "<|special_3104|>",
2986
+ "<|special_3105|>",
2987
+ "<|special_3106|>",
2988
+ "<|special_3107|>",
2989
+ "<|special_3108|>",
2990
+ "<|special_3109|>",
2991
+ "<|special_3110|>",
2992
+ "<|special_3111|>",
2993
+ "<|special_3112|>",
2994
+ "<|special_3113|>",
2995
+ "<|special_3114|>",
2996
+ "<|special_3115|>",
2997
+ "<|special_3116|>",
2998
+ "<|special_3117|>",
2999
+ "<|special_3118|>",
3000
+ "<|special_3119|>",
3001
+ "<|special_3120|>",
3002
+ "<|special_3121|>",
3003
+ "<|special_3122|>",
3004
+ "<|special_3123|>",
3005
+ "<|special_3124|>",
3006
+ "<|special_3125|>",
3007
+ "<|special_3126|>",
3008
+ "<|special_3127|>",
3009
+ "<|special_3128|>",
3010
+ "<|special_3129|>",
3011
+ "<|special_3130|>",
3012
+ "<|special_3131|>",
3013
+ "<|special_3132|>",
3014
+ "<|special_3133|>",
3015
+ "<|special_3134|>",
3016
+ "<|special_3135|>",
3017
+ "<|special_3136|>",
3018
+ "<|special_3137|>",
3019
+ "<|special_3138|>",
3020
+ "<|special_3139|>",
3021
+ "<|special_3140|>",
3022
+ "<|special_3141|>",
3023
+ "<|special_3142|>",
3024
+ "<|special_3143|>",
3025
+ "<|special_3144|>",
3026
+ "<|special_3145|>",
3027
+ "<|special_3146|>",
3028
+ "<|special_3147|>",
3029
+ "<|special_3148|>",
3030
+ "<|special_3149|>",
3031
+ "<|special_3150|>",
3032
+ "<|special_3151|>",
3033
+ "<|special_3152|>",
3034
+ "<|special_3153|>",
3035
+ "<|special_3154|>",
3036
+ "<|special_3155|>",
3037
+ "<|special_3156|>",
3038
+ "<|special_3157|>",
3039
+ "<|special_3158|>",
3040
+ "<|special_3159|>",
3041
+ "<|special_3160|>",
3042
+ "<|special_3161|>",
3043
+ "<|special_3162|>",
3044
+ "<|special_3163|>",
3045
+ "<|special_3164|>",
3046
+ "<|special_3165|>",
3047
+ "<|special_3166|>",
3048
+ "<|special_3167|>",
3049
+ "<|special_3168|>",
3050
+ "<|special_3169|>",
3051
+ "<|special_3170|>",
3052
+ "<|special_3171|>",
3053
+ "<|special_3172|>",
3054
+ "<|special_3173|>",
3055
+ "<|special_3174|>",
3056
+ "<|special_3175|>",
3057
+ "<|special_3176|>",
3058
+ "<|special_3177|>",
3059
+ "<|special_3178|>",
3060
+ "<|special_3179|>",
3061
+ "<|special_3180|>",
3062
+ "<|special_3181|>",
3063
+ "<|special_3182|>",
3064
+ "<|special_3183|>",
3065
+ "<|special_3184|>",
3066
+ "<|special_3185|>",
3067
+ "<|special_3186|>",
3068
+ "<|special_3187|>",
3069
+ "<|special_3188|>",
3070
+ "<|special_3189|>",
3071
+ "<|special_3190|>",
3072
+ "<|special_3191|>",
3073
+ "<|special_3192|>",
3074
+ "<|special_3193|>",
3075
+ "<|special_3194|>",
3076
+ "<|special_3195|>",
3077
+ "<|special_3196|>",
3078
+ "<|special_3197|>",
3079
+ "<|special_3198|>",
3080
+ "<|special_3199|>",
3081
+ "<|special_3200|>",
3082
+ "<|special_3201|>",
3083
+ "<|special_3202|>",
3084
+ "<|special_3203|>",
3085
+ "<|special_3204|>",
3086
+ "<|special_3205|>",
3087
+ "<|special_3206|>",
3088
+ "<|special_3207|>",
3089
+ "<|special_3208|>",
3090
+ "<|special_3209|>",
3091
+ "<|special_3210|>",
3092
+ "<|special_3211|>",
3093
+ "<|special_3212|>",
3094
+ "<|special_3213|>",
3095
+ "<|special_3214|>",
3096
+ "<|special_3215|>",
3097
+ "<|special_3216|>",
3098
+ "<|special_3217|>",
3099
+ "<|special_3218|>",
3100
+ "<|special_3219|>",
3101
+ "<|special_3220|>",
3102
+ "<|special_3221|>",
3103
+ "<|special_3222|>",
3104
+ "<|special_3223|>",
3105
+ "<|special_3224|>",
3106
+ "<|special_3225|>",
3107
+ "<|special_3226|>",
3108
+ "<|special_3227|>",
3109
+ "<|special_3228|>",
3110
+ "<|special_3229|>",
3111
+ "<|special_3230|>",
3112
+ "<|special_3231|>",
3113
+ "<|special_3232|>",
3114
+ "<|special_3233|>",
3115
+ "<|special_3234|>",
3116
+ "<|special_3235|>",
3117
+ "<|special_3236|>",
3118
+ "<|special_3237|>",
3119
+ "<|special_3238|>",
3120
+ "<|special_3239|>",
3121
+ "<|special_3240|>",
3122
+ "<|special_3241|>",
3123
+ "<|special_3242|>",
3124
+ "<|special_3243|>",
3125
+ "<|special_3244|>",
3126
+ "<|special_3245|>",
3127
+ "<|special_3246|>",
3128
+ "<|special_3247|>",
3129
+ "<|special_3248|>",
3130
+ "<|special_3249|>",
3131
+ "<|special_3250|>",
3132
+ "<|special_3251|>",
3133
+ "<|special_3252|>",
3134
+ "<|special_3253|>",
3135
+ "<|special_3254|>",
3136
+ "<|special_3255|>",
3137
+ "<|special_3256|>",
3138
+ "<|special_3257|>",
3139
+ "<|special_3258|>",
3140
+ "<|special_3259|>",
3141
+ "<|special_3260|>",
3142
+ "<|special_3261|>",
3143
+ "<|special_3262|>",
3144
+ "<|special_3263|>",
3145
+ "<|special_3264|>",
3146
+ "<|special_3265|>",
3147
+ "<|special_3266|>",
3148
+ "<|special_3267|>",
3149
+ "<|special_3268|>",
3150
+ "<|special_3269|>",
3151
+ "<|special_3270|>",
3152
+ "<|special_3271|>",
3153
+ "<|special_3272|>",
3154
+ "<|special_3273|>",
3155
+ "<|special_3274|>",
3156
+ "<|special_3275|>",
3157
+ "<|special_3276|>",
3158
+ "<|special_3277|>",
3159
+ "<|special_3278|>",
3160
+ "<|special_3279|>",
3161
+ "<|special_3280|>",
3162
+ "<|special_3281|>",
3163
+ "<|special_3282|>",
3164
+ "<|special_3283|>",
3165
+ "<|special_3284|>",
3166
+ "<|special_3285|>",
3167
+ "<|special_3286|>",
3168
+ "<|special_3287|>",
3169
+ "<|special_3288|>",
3170
+ "<|special_3289|>",
3171
+ "<|special_3290|>",
3172
+ "<|special_3291|>",
3173
+ "<|special_3292|>",
3174
+ "<|special_3293|>",
3175
+ "<|special_3294|>",
3176
+ "<|special_3295|>",
3177
+ "<|special_3296|>",
3178
+ "<|special_3297|>",
3179
+ "<|special_3298|>",
3180
+ "<|special_3299|>",
3181
+ "<|special_3300|>",
3182
+ "<|special_3301|>",
3183
+ "<|special_3302|>",
3184
+ "<|special_3303|>",
3185
+ "<|special_3304|>",
3186
+ "<|special_3305|>",
3187
+ "<|special_3306|>",
3188
+ "<|special_3307|>",
3189
+ "<|special_3308|>",
3190
+ "<|special_3309|>",
3191
+ "<|special_3310|>",
3192
+ "<|special_3311|>",
3193
+ "<|special_3312|>",
3194
+ "<|special_3313|>",
3195
+ "<|special_3314|>",
3196
+ "<|special_3315|>",
3197
+ "<|special_3316|>",
3198
+ "<|special_3317|>",
3199
+ "<|special_3318|>",
3200
+ "<|special_3319|>",
3201
+ "<|special_3320|>",
3202
+ "<|special_3321|>",
3203
+ "<|special_3322|>",
3204
+ "<|special_3323|>",
3205
+ "<|special_3324|>",
3206
+ "<|special_3325|>",
3207
+ "<|special_3326|>",
3208
+ "<|special_3327|>",
3209
+ "<|special_3328|>",
3210
+ "<|special_3329|>",
3211
+ "<|special_3330|>",
3212
+ "<|special_3331|>",
3213
+ "<|special_3332|>",
3214
+ "<|special_3333|>",
3215
+ "<|special_3334|>",
3216
+ "<|special_3335|>",
3217
+ "<|special_3336|>",
3218
+ "<|special_3337|>",
3219
+ "<|special_3338|>",
3220
+ "<|special_3339|>",
3221
+ "<|special_3340|>",
3222
+ "<|special_3341|>",
3223
+ "<|special_3342|>",
3224
+ "<|special_3343|>",
3225
+ "<|special_3344|>",
3226
+ "<|special_3345|>",
3227
+ "<|special_3346|>",
3228
+ "<|special_3347|>",
3229
+ "<|special_3348|>",
3230
+ "<|special_3349|>",
3231
+ "<|special_3350|>",
3232
+ "<|special_3351|>",
3233
+ "<|special_3352|>",
3234
+ "<|special_3353|>",
3235
+ "<|special_3354|>",
3236
+ "<|special_3355|>",
3237
+ "<|special_3356|>",
3238
+ "<|special_3357|>",
3239
+ "<|special_3358|>",
3240
+ "<|special_3359|>",
3241
+ "<|special_3360|>",
3242
+ "<|special_3361|>",
3243
+ "<|special_3362|>",
3244
+ "<|special_3363|>",
3245
+ "<|special_3364|>",
3246
+ "<|special_3365|>",
3247
+ "<|special_3366|>",
3248
+ "<|special_3367|>",
3249
+ "<|special_3368|>",
3250
+ "<|special_3369|>",
3251
+ "<|special_3370|>",
3252
+ "<|special_3371|>",
3253
+ "<|special_3372|>",
3254
+ "<|special_3373|>",
3255
+ "<|special_3374|>",
3256
+ "<|special_3375|>",
3257
+ "<|special_3376|>",
3258
+ "<|special_3377|>",
3259
+ "<|special_3378|>",
3260
+ "<|special_3379|>",
3261
+ "<|special_3380|>",
3262
+ "<|special_3381|>",
3263
+ "<|special_3382|>",
3264
+ "<|special_3383|>",
3265
+ "<|special_3384|>",
3266
+ "<|special_3385|>",
3267
+ "<|special_3386|>",
3268
+ "<|special_3387|>",
3269
+ "<|special_3388|>",
3270
+ "<|special_3389|>",
3271
+ "<|special_3390|>",
3272
+ "<|special_3391|>",
3273
+ "<|special_3392|>",
3274
+ "<|special_3393|>",
3275
+ "<|special_3394|>",
3276
+ "<|special_3395|>",
3277
+ "<|special_3396|>",
3278
+ "<|special_3397|>",
3279
+ "<|special_3398|>",
3280
+ "<|special_3399|>",
3281
+ "<|special_3400|>",
3282
+ "<|special_3401|>",
3283
+ "<|special_3402|>",
3284
+ "<|special_3403|>",
3285
+ "<|special_3404|>",
3286
+ "<|special_3405|>",
3287
+ "<|special_3406|>",
3288
+ "<|special_3407|>",
3289
+ "<|special_3408|>",
3290
+ "<|special_3409|>",
3291
+ "<|special_3410|>",
3292
+ "<|special_3411|>",
3293
+ "<|special_3412|>",
3294
+ "<|special_3413|>",
3295
+ "<|special_3414|>",
3296
+ "<|special_3415|>",
3297
+ "<|special_3416|>",
3298
+ "<|special_3417|>",
3299
+ "<|special_3418|>",
3300
+ "<|special_3419|>",
3301
+ "<|special_3420|>",
3302
+ "<|special_3421|>",
3303
+ "<|special_3422|>",
3304
+ "<|special_3423|>",
3305
+ "<|special_3424|>",
3306
+ "<|special_3425|>",
3307
+ "<|special_3426|>",
3308
+ "<|special_3427|>",
3309
+ "<|special_3428|>",
3310
+ "<|special_3429|>",
3311
+ "<|special_3430|>",
3312
+ "<|special_3431|>",
3313
+ "<|special_3432|>",
3314
+ "<|special_3433|>",
3315
+ "<|special_3434|>",
3316
+ "<|special_3435|>",
3317
+ "<|special_3436|>",
3318
+ "<|special_3437|>",
3319
+ "<|special_3438|>",
3320
+ "<|special_3439|>",
3321
+ "<|special_3440|>",
3322
+ "<|special_3441|>",
3323
+ "<|special_3442|>",
3324
+ "<|special_3443|>",
3325
+ "<|special_3444|>",
3326
+ "<|special_3445|>",
3327
+ "<|special_3446|>",
3328
+ "<|special_3447|>",
3329
+ "<|special_3448|>",
3330
+ "<|special_3449|>",
3331
+ "<|special_3450|>",
3332
+ "<|special_3451|>",
3333
+ "<|special_3452|>",
3334
+ "<|special_3453|>",
3335
+ "<|special_3454|>",
3336
+ "<|special_3455|>",
3337
+ "<|special_3456|>",
3338
+ "<|special_3457|>",
3339
+ "<|special_3458|>",
3340
+ "<|special_3459|>",
3341
+ "<|special_3460|>",
3342
+ "<|special_3461|>",
3343
+ "<|special_3462|>",
3344
+ "<|special_3463|>",
3345
+ "<|special_3464|>",
3346
+ "<|special_3465|>",
3347
+ "<|special_3466|>",
3348
+ "<|special_3467|>",
3349
+ "<|special_3468|>",
3350
+ "<|special_3469|>",
3351
+ "<|special_3470|>",
3352
+ "<|special_3471|>",
3353
+ "<|special_3472|>",
3354
+ "<|special_3473|>",
3355
+ "<|special_3474|>",
3356
+ "<|special_3475|>",
3357
+ "<|special_3476|>",
3358
+ "<|special_3477|>",
3359
+ "<|special_3478|>",
3360
+ "<|special_3479|>",
3361
+ "<|special_3480|>",
3362
+ "<|special_3481|>",
3363
+ "<|special_3482|>",
3364
+ "<|special_3483|>",
3365
+ "<|special_3484|>",
3366
+ "<|special_3485|>",
3367
+ "<|special_3486|>",
3368
+ "<|special_3487|>",
3369
+ "<|special_3488|>",
3370
+ "<|special_3489|>",
3371
+ "<|special_3490|>",
3372
+ "<|special_3491|>",
3373
+ "<|special_3492|>",
3374
+ "<|special_3493|>",
3375
+ "<|special_3494|>",
3376
+ "<|special_3495|>",
3377
+ "<|special_3496|>",
3378
+ "<|special_3497|>",
3379
+ "<|special_3498|>",
3380
+ "<|special_3499|>",
3381
+ "<|special_3500|>",
3382
+ "<|special_3501|>",
3383
+ "<|special_3502|>",
3384
+ "<|special_3503|>",
3385
+ "<|special_3504|>",
3386
+ "<|special_3505|>",
3387
+ "<|special_3506|>",
3388
+ "<|special_3507|>",
3389
+ "<|special_3508|>",
3390
+ "<|special_3509|>",
3391
+ "<|special_3510|>",
3392
+ "<|special_3511|>",
3393
+ "<|special_3512|>",
3394
+ "<|special_3513|>",
3395
+ "<|special_3514|>",
3396
+ "<|special_3515|>",
3397
+ "<|special_3516|>",
3398
+ "<|special_3517|>",
3399
+ "<|special_3518|>",
3400
+ "<|special_3519|>",
3401
+ "<|special_3520|>",
3402
+ "<|special_3521|>",
3403
+ "<|special_3522|>",
3404
+ "<|special_3523|>",
3405
+ "<|special_3524|>",
3406
+ "<|special_3525|>",
3407
+ "<|special_3526|>",
3408
+ "<|special_3527|>",
3409
+ "<|special_3528|>",
3410
+ "<|special_3529|>",
3411
+ "<|special_3530|>",
3412
+ "<|special_3531|>",
3413
+ "<|special_3532|>",
3414
+ "<|special_3533|>",
3415
+ "<|special_3534|>",
3416
+ "<|special_3535|>",
3417
+ "<|special_3536|>",
3418
+ "<|special_3537|>",
3419
+ "<|special_3538|>",
3420
+ "<|special_3539|>",
3421
+ "<|special_3540|>",
3422
+ "<|special_3541|>",
3423
+ "<|special_3542|>",
3424
+ "<|special_3543|>",
3425
+ "<|special_3544|>",
3426
+ "<|special_3545|>",
3427
+ "<|special_3546|>",
3428
+ "<|special_3547|>",
3429
+ "<|special_3548|>",
3430
+ "<|special_3549|>",
3431
+ "<|special_3550|>",
3432
+ "<|special_3551|>",
3433
+ "<|special_3552|>",
3434
+ "<|special_3553|>",
3435
+ "<|special_3554|>",
3436
+ "<|special_3555|>",
3437
+ "<|special_3556|>",
3438
+ "<|special_3557|>",
3439
+ "<|special_3558|>",
3440
+ "<|special_3559|>",
3441
+ "<|special_3560|>",
3442
+ "<|special_3561|>",
3443
+ "<|special_3562|>",
3444
+ "<|special_3563|>",
3445
+ "<|special_3564|>",
3446
+ "<|special_3565|>",
3447
+ "<|special_3566|>",
3448
+ "<|special_3567|>",
3449
+ "<|special_3568|>",
3450
+ "<|special_3569|>",
3451
+ "<|special_3570|>",
3452
+ "<|special_3571|>",
3453
+ "<|special_3572|>",
3454
+ "<|special_3573|>",
3455
+ "<|special_3574|>",
3456
+ "<|special_3575|>",
3457
+ "<|special_3576|>",
3458
+ "<|special_3577|>",
3459
+ "<|special_3578|>",
3460
+ "<|special_3579|>",
3461
+ "<|special_3580|>",
3462
+ "<|special_3581|>",
3463
+ "<|special_3582|>",
3464
+ "<|special_3583|>",
3465
+ "<|special_3584|>",
3466
+ "<|special_3585|>",
3467
+ "<|special_3586|>",
3468
+ "<|special_3587|>",
3469
+ "<|special_3588|>",
3470
+ "<|special_3589|>",
3471
+ "<|special_3590|>",
3472
+ "<|special_3591|>",
3473
+ "<|special_3592|>",
3474
+ "<|special_3593|>",
3475
+ "<|special_3594|>",
3476
+ "<|special_3595|>",
3477
+ "<|special_3596|>",
3478
+ "<|special_3597|>",
3479
+ "<|special_3598|>",
3480
+ "<|special_3599|>",
3481
+ "<|special_3600|>",
3482
+ "<|special_3601|>",
3483
+ "<|special_3602|>",
3484
+ "<|special_3603|>",
3485
+ "<|special_3604|>",
3486
+ "<|special_3605|>",
3487
+ "<|special_3606|>",
3488
+ "<|special_3607|>",
3489
+ "<|special_3608|>",
3490
+ "<|special_3609|>",
3491
+ "<|special_3610|>",
3492
+ "<|special_3611|>",
3493
+ "<|special_3612|>",
3494
+ "<|special_3613|>",
3495
+ "<|special_3614|>",
3496
+ "<|special_3615|>",
3497
+ "<|special_3616|>",
3498
+ "<|special_3617|>",
3499
+ "<|special_3618|>",
3500
+ "<|special_3619|>",
3501
+ "<|special_3620|>",
3502
+ "<|special_3621|>",
3503
+ "<|special_3622|>",
3504
+ "<|special_3623|>",
3505
+ "<|special_3624|>",
3506
+ "<|special_3625|>",
3507
+ "<|special_3626|>",
3508
+ "<|special_3627|>",
3509
+ "<|special_3628|>",
3510
+ "<|special_3629|>",
3511
+ "<|special_3630|>",
3512
+ "<|special_3631|>",
3513
+ "<|special_3632|>",
3514
+ "<|special_3633|>",
3515
+ "<|special_3634|>",
3516
+ "<|special_3635|>",
3517
+ "<|special_3636|>",
3518
+ "<|special_3637|>",
3519
+ "<|special_3638|>",
3520
+ "<|special_3639|>",
3521
+ "<|special_3640|>",
3522
+ "<|special_3641|>",
3523
+ "<|special_3642|>",
3524
+ "<|special_3643|>",
3525
+ "<|special_3644|>",
3526
+ "<|special_3645|>",
3527
+ "<|special_3646|>",
3528
+ "<|special_3647|>",
3529
+ "<|special_3648|>",
3530
+ "<|special_3649|>",
3531
+ "<|special_3650|>",
3532
+ "<|special_3651|>",
3533
+ "<|special_3652|>",
3534
+ "<|special_3653|>",
3535
+ "<|special_3654|>",
3536
+ "<|special_3655|>",
3537
+ "<|special_3656|>",
3538
+ "<|special_3657|>",
3539
+ "<|special_3658|>",
3540
+ "<|special_3659|>",
3541
+ "<|special_3660|>",
3542
+ "<|special_3661|>",
3543
+ "<|special_3662|>",
3544
+ "<|special_3663|>",
3545
+ "<|special_3664|>",
3546
+ "<|special_3665|>",
3547
+ "<|special_3666|>",
3548
+ "<|special_3667|>",
3549
+ "<|special_3668|>",
3550
+ "<|special_3669|>",
3551
+ "<|special_3670|>",
3552
+ "<|special_3671|>",
3553
+ "<|special_3672|>",
3554
+ "<|special_3673|>",
3555
+ "<|special_3674|>",
3556
+ "<|special_3675|>",
3557
+ "<|special_3676|>",
3558
+ "<|special_3677|>",
3559
+ "<|special_3678|>",
3560
+ "<|special_3679|>",
3561
+ "<|special_3680|>",
3562
+ "<|special_3681|>",
3563
+ "<|special_3682|>",
3564
+ "<|special_3683|>",
3565
+ "<|special_3684|>",
3566
+ "<|special_3685|>",
3567
+ "<|special_3686|>",
3568
+ "<|special_3687|>",
3569
+ "<|special_3688|>",
3570
+ "<|special_3689|>",
3571
+ "<|special_3690|>",
3572
+ "<|special_3691|>",
3573
+ "<|special_3692|>",
3574
+ "<|special_3693|>",
3575
+ "<|special_3694|>",
3576
+ "<|special_3695|>",
3577
+ "<|special_3696|>",
3578
+ "<|special_3697|>",
3579
+ "<|special_3698|>",
3580
+ "<|special_3699|>",
3581
+ "<|special_3700|>",
3582
+ "<|special_3701|>",
3583
+ "<|special_3702|>",
3584
+ "<|special_3703|>",
3585
+ "<|special_3704|>",
3586
+ "<|special_3705|>",
3587
+ "<|special_3706|>",
3588
+ "<|special_3707|>",
3589
+ "<|special_3708|>",
3590
+ "<|special_3709|>",
3591
+ "<|special_3710|>",
3592
+ "<|special_3711|>",
3593
+ "<|special_3712|>",
3594
+ "<|special_3713|>",
3595
+ "<|special_3714|>",
3596
+ "<|special_3715|>",
3597
+ "<|special_3716|>",
3598
+ "<|special_3717|>",
3599
+ "<|special_3718|>",
3600
+ "<|special_3719|>",
3601
+ "<|special_3720|>",
3602
+ "<|special_3721|>",
3603
+ "<|special_3722|>",
3604
+ "<|special_3723|>",
3605
+ "<|special_3724|>",
3606
+ "<|special_3725|>",
3607
+ "<|special_3726|>",
3608
+ "<|special_3727|>",
3609
+ "<|special_3728|>",
3610
+ "<|special_3729|>",
3611
+ "<|special_3730|>",
3612
+ "<|special_3731|>",
3613
+ "<|special_3732|>",
3614
+ "<|special_3733|>",
3615
+ "<|special_3734|>",
3616
+ "<|special_3735|>",
3617
+ "<|special_3736|>",
3618
+ "<|special_3737|>",
3619
+ "<|special_3738|>",
3620
+ "<|special_3739|>",
3621
+ "<|special_3740|>",
3622
+ "<|special_3741|>",
3623
+ "<|special_3742|>",
3624
+ "<|special_3743|>",
3625
+ "<|special_3744|>",
3626
+ "<|special_3745|>",
3627
+ "<|special_3746|>",
3628
+ "<|special_3747|>",
3629
+ "<|special_3748|>",
3630
+ "<|special_3749|>",
3631
+ "<|special_3750|>",
3632
+ "<|special_3751|>",
3633
+ "<|special_3752|>",
3634
+ "<|special_3753|>",
3635
+ "<|special_3754|>",
3636
+ "<|special_3755|>",
3637
+ "<|special_3756|>",
3638
+ "<|special_3757|>",
3639
+ "<|special_3758|>",
3640
+ "<|special_3759|>",
3641
+ "<|special_3760|>",
3642
+ "<|special_3761|>",
3643
+ "<|special_3762|>",
3644
+ "<|special_3763|>",
3645
+ "<|special_3764|>",
3646
+ "<|special_3765|>",
3647
+ "<|special_3766|>",
3648
+ "<|special_3767|>",
3649
+ "<|special_3768|>",
3650
+ "<|special_3769|>",
3651
+ "<|special_3770|>",
3652
+ "<|special_3771|>",
3653
+ "<|special_3772|>",
3654
+ "<|special_3773|>",
3655
+ "<|special_3774|>",
3656
+ "<|special_3775|>",
3657
+ "<|special_3776|>",
3658
+ "<|special_3777|>",
3659
+ "<|special_3778|>",
3660
+ "<|special_3779|>",
3661
+ "<|special_3780|>",
3662
+ "<|special_3781|>",
3663
+ "<|special_3782|>",
3664
+ "<|special_3783|>",
3665
+ "<|special_3784|>",
3666
+ "<|special_3785|>",
3667
+ "<|special_3786|>",
3668
+ "<|special_3787|>",
3669
+ "<|special_3788|>",
3670
+ "<|special_3789|>",
3671
+ "<|special_3790|>",
3672
+ "<|special_3791|>",
3673
+ "<|special_3792|>",
3674
+ "<|special_3793|>",
3675
+ "<|special_3794|>",
3676
+ "<|special_3795|>",
3677
+ "<|special_3796|>",
3678
+ "<|special_3797|>",
3679
+ "<|special_3798|>",
3680
+ "<|special_3799|>",
3681
+ "<|special_3800|>",
3682
+ "<|special_3801|>",
3683
+ "<|special_3802|>",
3684
+ "<|special_3803|>",
3685
+ "<|special_3804|>",
3686
+ "<|special_3805|>",
3687
+ "<|special_3806|>",
3688
+ "<|special_3807|>",
3689
+ "<|special_3808|>",
3690
+ "<|special_3809|>",
3691
+ "<|special_3810|>",
3692
+ "<|special_3811|>",
3693
+ "<|special_3812|>",
3694
+ "<|special_3813|>",
3695
+ "<|special_3814|>",
3696
+ "<|special_3815|>",
3697
+ "<|special_3816|>",
3698
+ "<|special_3817|>",
3699
+ "<|special_3818|>",
3700
+ "<|special_3819|>",
3701
+ "<|special_3820|>",
3702
+ "<|special_3821|>",
3703
+ "<|special_3822|>",
3704
+ "<|special_3823|>",
3705
+ "<|special_3824|>",
3706
+ "<|special_3825|>",
3707
+ "<|special_3826|>",
3708
+ "<|special_3827|>",
3709
+ "<|special_3828|>",
3710
+ "<|special_3829|>",
3711
+ "<|special_3830|>",
3712
+ "<|special_3831|>",
3713
+ "<|special_3832|>",
3714
+ "<|special_3833|>",
3715
+ "<|special_3834|>",
3716
+ "<|special_3835|>",
3717
+ "<|special_3836|>",
3718
+ "<|special_3837|>",
3719
+ "<|special_3838|>",
3720
+ "<|special_3839|>",
3721
+ "<|special_3840|>",
3722
+ "<|special_3841|>",
3723
+ "<|special_3842|>",
3724
+ "<|special_3843|>",
3725
+ "<|special_3844|>",
3726
+ "<|special_3845|>",
3727
+ "<|special_3846|>",
3728
+ "<|special_3847|>",
3729
+ "<|special_3848|>",
3730
+ "<|special_3849|>",
3731
+ "<|special_3850|>",
3732
+ "<|special_3851|>",
3733
+ "<|special_3852|>",
3734
+ "<|special_3853|>",
3735
+ "<|special_3854|>",
3736
+ "<|special_3855|>",
3737
+ "<|special_3856|>",
3738
+ "<|special_3857|>",
3739
+ "<|special_3858|>",
3740
+ "<|special_3859|>",
3741
+ "<|special_3860|>",
3742
+ "<|special_3861|>",
3743
+ "<|special_3862|>",
3744
+ "<|special_3863|>",
3745
+ "<|special_3864|>",
3746
+ "<|special_3865|>",
3747
+ "<|special_3866|>",
3748
+ "<|special_3867|>",
3749
+ "<|special_3868|>",
3750
+ "<|special_3869|>",
3751
+ "<|special_3870|>",
3752
+ "<|special_3871|>",
3753
+ "<|special_3872|>",
3754
+ "<|special_3873|>",
3755
+ "<|special_3874|>",
3756
+ "<|special_3875|>",
3757
+ "<|special_3876|>",
3758
+ "<|special_3877|>",
3759
+ "<|special_3878|>",
3760
+ "<|special_3879|>",
3761
+ "<|special_3880|>",
3762
+ "<|special_3881|>",
3763
+ "<|special_3882|>",
3764
+ "<|special_3883|>",
3765
+ "<|special_3884|>",
3766
+ "<|special_3885|>",
3767
+ "<|special_3886|>",
3768
+ "<|special_3887|>",
3769
+ "<|special_3888|>",
3770
+ "<|special_3889|>",
3771
+ "<|special_3890|>",
3772
+ "<|special_3891|>",
3773
+ "<|special_3892|>",
3774
+ "<|special_3893|>",
3775
+ "<|special_3894|>",
3776
+ "<|special_3895|>",
3777
+ "<|special_3896|>",
3778
+ "<|special_3897|>",
3779
+ "<|special_3898|>",
3780
+ "<|special_3899|>",
3781
+ "<|special_3900|>",
3782
+ "<|special_3901|>",
3783
+ "<|special_3902|>",
3784
+ "<|special_3903|>",
3785
+ "<|special_3904|>",
3786
+ "<|special_3905|>",
3787
+ "<|special_3906|>",
3788
+ "<|special_3907|>",
3789
+ "<|special_3908|>",
3790
+ "<|special_3909|>",
3791
+ "<|special_3910|>",
3792
+ "<|special_3911|>",
3793
+ "<|special_3912|>",
3794
+ "<|special_3913|>",
3795
+ "<|special_3914|>",
3796
+ "<|special_3915|>",
3797
+ "<|special_3916|>",
3798
+ "<|special_3917|>",
3799
+ "<|special_3918|>",
3800
+ "<|special_3919|>",
3801
+ "<|special_3920|>",
3802
+ "<|special_3921|>",
3803
+ "<|special_3922|>",
3804
+ "<|special_3923|>",
3805
+ "<|special_3924|>",
3806
+ "<|special_3925|>",
3807
+ "<|special_3926|>",
3808
+ "<|special_3927|>",
3809
+ "<|special_3928|>",
3810
+ "<|special_3929|>",
3811
+ "<|special_3930|>",
3812
+ "<|special_3931|>",
3813
+ "<|special_3932|>",
3814
+ "<|special_3933|>",
3815
+ "<|special_3934|>",
3816
+ "<|special_3935|>",
3817
+ "<|special_3936|>",
3818
+ "<|special_3937|>",
3819
+ "<|special_3938|>",
3820
+ "<|special_3939|>",
3821
+ "<|special_3940|>",
3822
+ "<|special_3941|>",
3823
+ "<|special_3942|>",
3824
+ "<|special_3943|>",
3825
+ "<|special_3944|>",
3826
+ "<|special_3945|>",
3827
+ "<|special_3946|>",
3828
+ "<|special_3947|>",
3829
+ "<|special_3948|>",
3830
+ "<|special_3949|>",
3831
+ "<|special_3950|>",
3832
+ "<|special_3951|>",
3833
+ "<|special_3952|>",
3834
+ "<|special_3953|>",
3835
+ "<|special_3954|>",
3836
+ "<|special_3955|>",
3837
+ "<|special_3956|>",
3838
+ "<|special_3957|>",
3839
+ "<|special_3958|>",
3840
+ "<|special_3959|>",
3841
+ "<|special_3960|>",
3842
+ "<|special_3961|>",
3843
+ "<|special_3962|>",
3844
+ "<|special_3963|>",
3845
+ "<|special_3964|>",
3846
+ "<|special_3965|>",
3847
+ "<|special_3966|>",
3848
+ "<|special_3967|>",
3849
+ "<|special_3968|>",
3850
+ "<|special_3969|>",
3851
+ "<|special_3970|>",
3852
+ "<|special_3971|>",
3853
+ "<|special_3972|>",
3854
+ "<|special_3973|>",
3855
+ "<|special_3974|>",
3856
+ "<|special_3975|>",
3857
+ "<|special_3976|>",
3858
+ "<|special_3977|>",
3859
+ "<|special_3978|>",
3860
+ "<|special_3979|>",
3861
+ "<|special_3980|>",
3862
+ "<|special_3981|>",
3863
+ "<|special_3982|>",
3864
+ "<|special_3983|>",
3865
+ "<|special_3984|>",
3866
+ "<|special_3985|>",
3867
+ "<|special_3986|>",
3868
+ "<|special_3987|>",
3869
+ "<|special_3988|>",
3870
+ "<|special_3989|>",
3871
+ "<|special_3990|>",
3872
+ "<|special_3991|>",
3873
+ "<|special_3992|>",
3874
+ "<|special_3993|>",
3875
+ "<|special_3994|>",
3876
+ "<|special_3995|>",
3877
+ "<|special_3996|>",
3878
+ "<|special_3997|>",
3879
+ "<|special_3998|>",
3880
+ "<|special_3999|>",
3881
+ "<|special_4000|>",
3882
+ "<|special_4001|>",
3883
+ "<|special_4002|>",
3884
+ "<|special_4003|>",
3885
+ "<|special_4004|>",
3886
+ "<|special_4005|>",
3887
+ "<|special_4006|>",
3888
+ "<|special_4007|>",
3889
+ "<|special_4008|>",
3890
+ "<|special_4009|>",
3891
+ "<|special_4010|>",
3892
+ "<|special_4011|>",
3893
+ "<|special_4012|>",
3894
+ "<|special_4013|>",
3895
+ "<|special_4014|>",
3896
+ "<|special_4015|>",
3897
+ "<|special_4016|>",
3898
+ "<|special_4017|>",
3899
+ "<|special_4018|>",
3900
+ "<|special_4019|>",
3901
+ "<|special_4020|>",
3902
+ "<|special_4021|>",
3903
+ "<|special_4022|>",
3904
+ "<|special_4023|>",
3905
+ "<|special_4024|>",
3906
+ "<|special_4025|>",
3907
+ "<|special_4026|>",
3908
+ "<|special_4027|>",
3909
+ "<|special_4028|>",
3910
+ "<|special_4029|>",
3911
+ "<|special_4030|>",
3912
+ "<|special_4031|>",
3913
+ "<|special_4032|>",
3914
+ "<|special_4033|>",
3915
+ "<|special_4034|>",
3916
+ "<|special_4035|>",
3917
+ "<|special_4036|>",
3918
+ "<|special_4037|>",
3919
+ "<|special_4038|>",
3920
+ "<|special_4039|>",
3921
+ "<|special_4040|>",
3922
+ "<|special_4041|>",
3923
+ "<|special_4042|>",
3924
+ "<|special_4043|>",
3925
+ "<|special_4044|>",
3926
+ "<|special_4045|>",
3927
+ "<|special_4046|>",
3928
+ "<|special_4047|>",
3929
+ "<|special_4048|>",
3930
+ "<|special_4049|>",
3931
+ "<|special_4050|>",
3932
+ "<|special_4051|>",
3933
+ "<|special_4052|>",
3934
+ "<|special_4053|>",
3935
+ "<|special_4054|>",
3936
+ "<|special_4055|>",
3937
+ "<|special_4056|>",
3938
+ "<|special_4057|>",
3939
+ "<|special_4058|>",
3940
+ "<|special_4059|>",
3941
+ "<|special_4060|>",
3942
+ "<|special_4061|>",
3943
+ "<|special_4062|>",
3944
+ "<|special_4063|>",
3945
+ "<|special_4064|>",
3946
+ "<|special_4065|>",
3947
+ "<|special_4066|>",
3948
+ "<|special_4067|>",
3949
+ "<|special_4068|>",
3950
+ "<|special_4069|>",
3951
+ "<|special_4070|>",
3952
+ "<|special_4071|>",
3953
+ "<|special_4072|>",
3954
+ "<|special_4073|>",
3955
+ "<|special_4074|>",
3956
+ "<|special_4075|>",
3957
+ "<|special_4076|>",
3958
+ "<|special_4077|>",
3959
+ "<|special_4078|>",
3960
+ "<|special_4079|>",
3961
+ "<|special_4080|>",
3962
+ "<|special_4081|>",
3963
+ "<|special_4082|>",
3964
+ "<|special_4083|>",
3965
+ "<|special_4084|>",
3966
+ "<|special_4085|>",
3967
+ "<|special_4086|>",
3968
+ "<|special_4087|>",
3969
+ "<|special_4088|>",
3970
+ "<|special_4089|>",
3971
+ "<|special_4090|>",
3972
+ "<|special_4091|>",
3973
+ "<|special_4092|>",
3974
+ "<|special_4093|>",
3975
+ "<|special_4094|>",
3976
+ "<|special_4095|>"
3977
+ ],
3978
+ "bos_token": {
3979
+ "content": "<|startoftext|>",
3980
+ "lstrip": false,
3981
+ "normalized": false,
3982
+ "rstrip": false,
3983
+ "single_word": false
3984
+ },
3985
+ "eos_token": {
3986
+ "content": "<|endoftext|>",
3987
+ "lstrip": false,
3988
+ "normalized": false,
3989
+ "rstrip": false,
3990
+ "single_word": false
3991
+ },
3992
+ "pad_token": {
3993
+ "content": "<|endoftext|>",
3994
+ "lstrip": false,
3995
+ "normalized": false,
3996
+ "rstrip": false,
3997
+ "single_word": false
3998
+ },
3999
+ "unk_token": {
4000
+ "content": "<unk>",
4001
+ "lstrip": false,
4002
+ "normalized": false,
4003
+ "rstrip": false,
4004
+ "single_word": false
4005
+ }
4006
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7a8c81670e4651cc290fbe0ab397e0357abfa933964b9b6f56f508557c04c19
3
+ size 16473485
tokenizer_config.json ADDED
The diff for this file is too large to render. See raw diff