Update README.md
Browse files
README.md
CHANGED
|
@@ -3,20 +3,196 @@ base_model: unsloth/gemma-2-9b-it-bnb-4bit
|
|
| 3 |
tags:
|
| 4 |
- text-generation-inference
|
| 5 |
- transformers
|
| 6 |
-
- unsloth
|
| 7 |
- gemma2
|
| 8 |
- trl
|
| 9 |
-
license:
|
| 10 |
language:
|
| 11 |
-
-
|
| 12 |
---
|
| 13 |
|
| 14 |
-
#
|
| 15 |
|
| 16 |
-
|
| 17 |
-
- **License:** apache-2.0
|
| 18 |
-
- **Finetuned from model :** unsloth/gemma-2-9b-it-bnb-4bit
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
-
[<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)
|
|
|
|
| 3 |
tags:
|
| 4 |
- text-generation-inference
|
| 5 |
- transformers
|
|
|
|
| 6 |
- gemma2
|
| 7 |
- trl
|
| 8 |
+
license: creativeml-openrail-m
|
| 9 |
language:
|
| 10 |
+
- ko
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# QCR + GEN for Conversational RAG Chatbot
|
| 14 |
|
| 15 |
+
## κ°μ
|
|
|
|
|
|
|
| 16 |
|
| 17 |
+
μ΄ λͺ¨λΈμ **QCR**(Query Context Rewriter)κ³Ό **GEN**(Generator) κΈ°λ₯μ λμμ μννλ νλμ LoRA μ΄λν° λͺ¨λΈμ
λλ€. κ²μ κΈ°λ° μ±λ΄μ΄λ RAG(Retrieval-Augmented Generation) μμ€ν
μμ νμ©ν μ μλλ‘ μ€κ³λμμ΅λλ€.
|
| 18 |
+
|
| 19 |
+
- **QCR κΈ°λ₯**: μ¬μ©μμ μ
λ ₯μ λΆμνμ¬ κ²μμ νμν 쿼리λ₯Ό μμ±νκ±°λ, νμνμ§ μμ κ²½μ° λΉ λ¬Έμμ΄μ λ°νν©λλ€.
|
| 20 |
+
- **GEN κΈ°λ₯**: κ²μλ λ¬Έμ μ²ν¬(λλ 컨ν
μ€νΈ)λ₯Ό νμ©νμ¬ μμ°μ€λ¬μ΄ λ΅λ³μ μμ±ν©λλ€.
|
| 21 |
+
|
| 22 |
+
μ΄ λͺ¨λΈμ 4bit μμνλ λ²μ κ³Ό μΌλ° λ²μ λͺ¨λ μ§μνλ―λ‘, μνλ νκ²½μμ μ¬μ©ν μ μμ΅λλ€.
|
| 23 |
+
|
| 24 |
+
## λ°μ΄ν°μ
λ° νμ΅ νΉμ§
|
| 25 |
+
|
| 26 |
+
- **10κ° μ£Όμ ν ν½**(κ°μ‘±/μ£Όκ±°, μ€ν¬μΈ , μΌν, λ―Έμ©/κ±΄κ° λ±)μ λν λ°μ΄ν°λ₯Ό μ¦κ°νμ¬ μ μ.
|
| 27 |
+
- **μ½ 18,000κ°μ QCR + GEN μν** ν¬ν¨.
|
| 28 |
+
- **QCR λ°μ΄ν°**
|
| 29 |
+
- μΌλ° λν(μΈμ¬, λλ΄ λ±)λ **λΉ λ¬Έμμ΄**(`""`)μ λ°ννμ¬ κ²μμ μλ΅νκ³ μ¦μ λ΅λ³ κ°λ₯.
|
| 30 |
+
- **GEN λ°μ΄ν°**
|
| 31 |
+
- κ²μλ λ¬Έμ μ²ν¬(μ΅λ 5κ°, κ° 512 ν ν° μ΄ν)λ₯Ό νμ©νμ¬ λ΅λ³ μμ±.
|
| 32 |
+
- **6κ°μ§ λ€μν λ°μ΄ν° ꡬμ±**:
|
| 33 |
+
1. κ΄λ ¨ μ λ³΄κ° μλ λ΅λ³
|
| 34 |
+
2. κ΄λ ¨ μ λ³΄κ° μλ λ΅λ³
|
| 35 |
+
3. κ΄λ ¨μ±μ΄ νΌμ¬λ μν©
|
| 36 |
+
4. κ²μ μ²ν¬κ° μ ν μλ κ²½μ° λ±
|
| 37 |
+
|
| 38 |
+
μ΄λ¬ν λ°μ΄ν° ꡬμ±μ ν΅ν΄ **λ μμ°μ€λ¬μ΄ λν**λ₯Ό ꡬνν μ μλλ‘ νμ΅λμμ΅λλ€.
|
| 39 |
+
|
| 40 |
+
## λͺ¨λΈ μ¬μ© λ°©μ
|
| 41 |
+
|
| 42 |
+
1. **QCRμ ν΅ν΄ κ²μ 쿼리 μμ±** β κ²μ μμ§μ ν΅ν΄ λ¬Έμ κ²μ β **GENμΌλ‘ λ΅λ³ μμ±**
|
| 43 |
+
2. λΆνμν κ²μ λ°©μ§(QCRμ΄ λΉ λ¬Έμμ΄ λ°ν) β μΈμ¬, μ‘λ΄ λ±μ μ§μ μλ΅ κ°λ₯.
|
| 44 |
+
3. 4bit μμν λͺ¨λΈ μ¬μ© κ°λ₯ β λ©λͺ¨λ¦¬ μ κ° λ° κ³ μ μΆλ‘ κ°λ₯.
|
| 45 |
+
|
| 46 |
+
## ν둬ννΈ ν
νλ¦Ώ
|
| 47 |
+
|
| 48 |
+
### Query Context Rewriter (QCR)
|
| 49 |
+
```
|
| 50 |
+
# Query Rewriter
|
| 51 |
+
|
| 52 |
+
### Instruction:
|
| 53 |
+
λ€μμ λν κΈ°λ‘(Context)μ μ¬μ©μμ μ§λ¬Έ(Input)μ
λλ€.
|
| 54 |
+
μ¬μ©μμ μ§λ¬Έμ λ΅μ μ 곡νκΈ° μν΄ νμν λ¨μΌ λ¬Έμμ΄ κ²μ 쿼리λ₯Ό μμ±νμΈμ.
|
| 55 |
+
κ²μμ΄ νμνμ§ μκ±°λ μΏΌλ¦¬κ° λΆνμν κ²½μ°(μΈμ¬, μ‘λ΄ λ±)μλ λΉ λ¬Έμμ΄μ λ°ννμΈμ.
|
| 56 |
+
|
| 57 |
+
μ΅μ’
μΆλ ₯ νμμ {'search': '<κ²μ 쿼리>'}μ
λλ€.
|
| 58 |
+
|
| 59 |
+
### Conversation:
|
| 60 |
+
{λν λ§₯λ½}
|
| 61 |
+
|
| 62 |
+
### Input:
|
| 63 |
+
{μ¬μ©μ μ§λ¬Έ}
|
| 64 |
+
|
| 65 |
+
### Response:
|
| 66 |
+
{'search': '{μμ±λ κ²μ 쿼리 λλ λΉ λ¬Έμμ΄}'}
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
### Generator (GEN)
|
| 70 |
+
```
|
| 71 |
+
# Generator
|
| 72 |
+
|
| 73 |
+
### Instruction:
|
| 74 |
+
λΉμ μ μΈλΆκ²μμ μ΄μ©νμ¬ μ¬μ©μμκ² λμμ μ£Όλ μΈκ³΅μ§λ₯ μ‘°μμ
λλ€.
|
| 75 |
+
|
| 76 |
+
- Contextλ μΈλΆκ²μμ ν΅ν΄ λ°νλ μ¬μ©μ μμ²κ³Ό κ΄λ ¨λ μ 보λ€μ
λλ€.
|
| 77 |
+
- Contextλ₯Ό νμ©ν λ λ¬Έμ₯ λμ μ¬μ©ν λ¬Έμ μ‘°κ°μ [Index]λ₯Ό λΆμ΄κ³ μμ°μ€λ¬μ΄ λ΅λ³μ μμ±νμΈμ. (e.g. [1])
|
| 78 |
+
- Contextμ μ λ³΄κ° μ¬μ©μ μμ²κ³Ό κ΄λ ¨μ΄ μκ±°λ λμμ΄ μλ μ μμ΅λλ€. κ΄λ ¨μλ μ λ³΄λ§ νμ©νκ³ , μλ μ 보λ₯Ό μ λ μ§μ΄λ΄μ§ λ§μΈμ.
|
| 79 |
+
- λλλ‘μ΄λ©΄ μΌλ° μ§μμΌλ‘ λ΅λ³νμ§ λ§κ³ , μ΅λν Contextλ₯Ό ν΅ν΄ λ΅λ³μ νλ €κ³ νμΈμ.
|
| 80 |
+
- Contextμ μμ κ²½μ°μλ μ΄ μ μ μΈκΈνλ©° μ¬μ£νκ³ λ€λ₯Έ μ£Όμ λ μ§λ¬Έμ μΆμ²ν΄μ£ΌμΈμ.
|
| 81 |
+
- μ¬μ©μ μμ²μ μλ§λ μμ°μ€λ¬μ΄ λνλ₯Ό νμΈμ.
|
| 82 |
+
- νμ μ‘΄λλ§λ‘ λ΅λ³νμΈμ.
|
| 83 |
+
|
| 84 |
+
### Conversation:
|
| 85 |
+
{λν λ§₯λ½}
|
| 86 |
+
|
| 87 |
+
### Context:
|
| 88 |
+
{κ²μλ λ¬Έμ μ²ν¬}
|
| 89 |
+
|
| 90 |
+
### Input:
|
| 91 |
+
{μ¬μ©μ μ§λ¬Έ}
|
| 92 |
+
|
| 93 |
+
### Response:
|
| 94 |
+
{λͺ¨λΈμ΄ μμ±ν μλ΅}
|
| 95 |
+
```
|
| 96 |
+
|
| 97 |
+
# μμ λν μν
|
| 98 |
+
|
| 99 |
+
## 1. κ²μμ΄ νμ μλ κ²½μ°
|
| 100 |
+
### μμ 1: μΈμ¬ λ° μΌλ°μ μΈ λν
|
| 101 |
+
```
|
| 102 |
+
User> μλ
? λ λꡬλ?
|
| 103 |
+
|
| 104 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 105 |
+
{'search': ''} β κ²μ λΆνμλ‘ νλ¨.
|
| 106 |
+
|
| 107 |
+
[λ΅λ³ μμ± μ€]...
|
| 108 |
+
Assistant> μλ
νμΈμ! μ λ μΈλΆκ²μμ ν΅ν΄ λ€μν μ 보λ₯Ό νμ©νμ¬ μ¬μ©μλκ» λμμ μ£Όλ μΈκ³΅μ§λ₯ μ‘°μμ
λλ€. μ΄λ€ μ£Όμ λ μ§λ¬Έμ΄λ νΈνκ² λ§μν΄ μ£ΌμΈμ. μ€λ νλ£¨κ° μ΄λ μ
¨λμ?
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
## 2. κ²μμ΄ νμν κ²½μ°
|
| 112 |
+
### μμ 2: μν μΆμ² μμ²
|
| 113 |
+
```
|
| 114 |
+
User> λ·νλ¦μ€μμ λ³Όλ§ν μν μΆμ²ν΄μ€.
|
| 115 |
+
|
| 116 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 117 |
+
{'search': 'λ·νλ¦μ€ μΆμ² μν λͺ©λ‘'} β κ²μ νμ.
|
| 118 |
+
|
| 119 |
+
[κ²μλ λ¬Έμ νμ© ν λ΅λ³ μμ±]
|
| 120 |
+
Assistant> λ·νλ¦μ€μμ μΈκΈ° μλ μν λͺ©λ‘μ λ€μκ³Ό κ°μ΅λλ€.
|
| 121 |
+
1. 'λΈλ λ―Έλ¬: λ°΄λμ€λ΄μΉ'
|
| 122 |
+
2. 'λ 룩 μ
'
|
| 123 |
+
3. 'μ΅μ€νΈλμ
'
|
| 124 |
+
λ κΆκΈν οΏ½οΏ½μ΄ μμΌμλ©΄ λ§μν΄μ£ΌμΈμ!
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
### μμ 3: νΉμ μ 보 μμ² (μ€ν¬μΈ κ·μΉ)
|
| 128 |
+
```
|
| 129 |
+
User> 볡μ±μ λ£°μ΄ μ΄λ»κ² λλμ?
|
| 130 |
+
|
| 131 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 132 |
+
{'search': 'λ³΅μ± λ£° μ€λͺ
'} β κ²μ νμ.
|
| 133 |
+
|
| 134 |
+
[κ²μλ λ¬Έμ νμ© ν λ΅λ³ μμ±]
|
| 135 |
+
Assistant> λ³΅μ± κ²½κΈ°μ κΈ°λ³Έ λ£°μ λ€μκ³Ό κ°μ΅λλ€.
|
| 136 |
+
- κ° λΌμ΄λλ 3λΆ μ§νλλ©°, 1λΆμ ν΄μμ΄ μ£Όμ΄μ§λλ€.
|
| 137 |
+
- κΈλ¬λΈ μ°©μ©μ νμμ΄λ©°, λ€μ΄λ μ μλ 10μ΄ μμ μΌμ΄λμΌ ν©λλ€.
|
| 138 |
+
- μ£Όμ ν격 κΈ°μ λ‘λ μ€νΈλ μ΄νΈ, ν
, μ΄νΌμ»· λ±μ΄ μμ΅λλ€.
|
| 139 |
+
λ κΆκΈν μ¬νμ΄ μμΌμλ©΄ μ§λ¬Έν΄μ£ΌμΈμ!
|
| 140 |
+
```
|
| 141 |
+
|
| 142 |
+
## 3. κ³Όκ±° λν κΈ°λ° μ§λ¬Έ
|
| 143 |
+
### μμ 4: λ¬Έλ§₯μ μ μ§ν μ§λ¬Έ
|
| 144 |
+
```
|
| 145 |
+
User> λ·νλ¦μ€ μν μΆμ²ν΄μ€.
|
| 146 |
+
|
| 147 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 148 |
+
{'search': 'λ·νλ¦μ€ μΆμ² μν λͺ©λ‘'} β κ²μ νμ.
|
| 149 |
+
|
| 150 |
+
[κ²μλ λ¬Έμ νμ© ν λ΅λ³ μμ±]
|
| 151 |
+
Assistant> λ·νλ¦μ€μμ μΈκΈ° μλ μν λͺ©λ‘μ λ€μκ³Ό κ°μ΅λλ€.
|
| 152 |
+
1. 'λΈλ λ―Έλ¬: λ°΄λμ€λ΄μΉ'
|
| 153 |
+
2. 'λ 룩 μ
'
|
| 154 |
+
3. 'μ΅μ€νΈλμ
'
|
| 155 |
+
|
| 156 |
+
User> μ€μ§μ΄ κ²μμ μ΄λ?
|
| 157 |
+
|
| 158 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 159 |
+
{'search': 'μ€μ§μ΄ κ²μ μ 보'} β κ²μ νμ.
|
| 160 |
+
|
| 161 |
+
[κ²μλ λ¬Έμ νμ© ν λ΅λ³ μμ±]
|
| 162 |
+
Assistant> 'μ€μ§μ΄ κ²μ'μ λ·νλ¦μ€μμ λ°©μλ μΈκΈ° μλ°μ΄λ² λλΌλ§λ‘, 456μ΅ μμ μκΈμ 건 μμ‘΄ κ²μμ λ€λ£Ήλλ€. κ²μμλ '무κΆνκ½μ΄ νΌμμ΅λλ€', 'λ¬κ³ λ λ½κΈ°' λ±μ νκ΅ μ ν΅ λμ΄κ° ν¬ν¨λμ΄ μμ΅λλ€. μμ¦ 2 μ μμ΄ νμ λμμΌλ©°, 2024λ
λ°©μ μμ μ
λλ€. λ μμΈν μ λ³΄κ° νμνμλ©΄ μλ €μ£ΌμΈμ!
|
| 163 |
+
```
|
| 164 |
+
|
| 165 |
+
## 4. κ°μμ€λ¬μ΄ ν ν½ λ³κ²½
|
| 166 |
+
### μμ 5: κ²μ μ€κ°μ μ£Όμ μ ν
|
| 167 |
+
```
|
| 168 |
+
User> λ·νλ¦μ€μμ λ³Όλ§ν μν μΆμ²ν΄μ€.
|
| 169 |
+
|
| 170 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 171 |
+
{'search': 'λ·νλ¦μ€ μΆμ² μν λͺ©λ‘'} β κ²μ νμ.
|
| 172 |
+
|
| 173 |
+
User> κ·Όλ° λ μ¬λ§ κ·μΉμ μ΄λ»κ² λΌ?
|
| 174 |
+
|
| 175 |
+
[QCR λ¨κ³] κ²μ 쿼리 μμ±...
|
| 176 |
+
{'search': 'λ μ¬λ§ κ·μΉ μ€λͺ
'} β κ²μ νμ.
|
| 177 |
+
|
| 178 |
+
[κ²μλ λ¬Έμ νμ© ν λ΅λ³ μμ±]
|
| 179 |
+
Assistant> λ μ¬λ§μ λμ§κΈ°, μ°λ¬λ¨λ¦¬κΈ°, κΊΎκΈ° λ±μ κΈ°μ μ μ΄μ©νμ¬ μλλ₯Ό μ μνλ μ€ν¬μΈ μ
λλ€. κ²½κΈ° λ°©μμ μ¬λ¦Όν½ μ€νμΌμΈ 'κ·Έλ μ½λ‘λ§ν'κ³Ό 'μμ ν'μΌλ‘ λλ©λλ€. νΉμ κ·μΉμ΄ κΆκΈνμλ€λ©΄ μΆκ°λ‘ μ§λ¬Έν΄μ£ΌμΈμ!
|
| 180 |
+
```
|
| 181 |
+
|
| 182 |
+
μ΄λ¬ν μμλ€μ μ°Έκ³ νμ¬ κ²μ κΈ°λ° λͺ¨λΈμ ν¨κ³Όμ μΌλ‘ νμ©ν μ μμ΅λλ€.
|
| 183 |
+
|
| 184 |
+
## ν
μ€νΈ λ
ΈνΈλΆ (Colab)
|
| 185 |
+
|
| 186 |
+
κ°λ¨ν μ½λλ₯Ό μ€νν΄λ³΄λ €λ©΄ [test_run.ipynb](https://huggingface.co/Austin9/gemma-2-9b-it-Ko-RAG/blob/main/test_run.ipynb) νμΌμ Google Colabμμ λ°λ‘ μ΄μ΄λ³΄μΈμ.
|
| 187 |
+
- **λ°νμ μ ν**μμ GPUλ₯Ό **T4**λ‘ μ ννμΈμ.
|
| 188 |
+
- μ΄ν, **μ
μ μμλλ‘ μ€ν**νλ©° νμν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉνκ³ λͺ¨λΈ λ° FAISS μΈλ±μ€λ₯Ό λ‘λν©λλ€.
|
| 189 |
+
- μμ±λ RAG κΈ°λ° μ±λ΄ μμ μ½λλ₯Ό 체νν μ μμ΅λλ€
|
| 190 |
+
|
| 191 |
+
## μ£Όμμ¬ν
|
| 192 |
+
- κ²μ μμ§κ³Ό ν¨κ» μ¬μ©ν κ²½μ° **QCRμ λ¨Όμ μ€ννμ¬ κ²μ 쿼리λ₯Ό μμ±**ν ν, κ²μλ λ¬Έμ μ²ν¬λ₯Ό λ°νμΌλ‘ **GENμ μ€ν**ν΄μΌ ν©λλ€.
|
| 193 |
+
- κ²μλ μ²ν¬λ μ΅λ **512 ν ν°** κΈΈμ΄μ΄λ©°, νμ΅ κ³Όμ μμ **μ΅λ 5κ°μ μ²ν¬**λ₯Ό λ°μνμμΌλ―λ‘ μ΄μ λ§μΆ° νμ©νλ κ²μ΄ μ€μν©λλ€.
|
| 194 |
+
- QCRμ **ν둬ννΈ νμμ λ°λμ μ§μΌμΌ** κ²μ 쿼리 μμ±μ΄ μ¬λ°λ₯΄κ² μ΄λ£¨μ΄μ§λλ€.
|
| 195 |
+
- GENμ λ΅λ³μμλ κ²μλ λ¬Έμ μΆμ²(Index)λ₯Ό μ νν κΈ°μ¬ν΄μΌ νλ©°, κ΄λ ¨μ±μ΄ μμΌλ©΄ μλλλ‘ μλ΄ν΄μΌ ν©λλ€.
|
| 196 |
+
|
| 197 |
+
μ΄ λͺ¨λΈμ ν΅ν΄ λ³΄λ€ **ν¨μ¨μ μΈ κ²μ + μ νν λ΅λ³**μ μ 곡νλ AI μμ€ν
μ ꡬμΆν μ μμ΅λλ€.
|
| 198 |
|
|
|