net.dreditor.audio.fmod 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.attestation.p7m +0 -0
  2. package/AudioVisualizerThreeDFMOD.cs +285 -285
  3. package/AudioVisualizerThreeDFMOD.cs.meta +11 -11
  4. package/AudioVisualizerTwoDFMOD.cs +58 -58
  5. package/AudioVisualizerTwoDFMOD.cs.meta +11 -11
  6. package/CreditsMusicFMOD.cs +22 -22
  7. package/CreditsMusicFMOD.cs.meta +11 -11
  8. package/DREditor.Audio.FMOD.asmdef +20 -20
  9. package/DREditor.Audio.FMOD.asmdef.meta +7 -7
  10. package/PlaylistFMODEditor.cs +357 -357
  11. package/PlaylistFMODEditor.cs.meta +11 -11
  12. package/{Samples → Samples~}/Audio_Visualizer_FMOD.prefab +658 -658
  13. package/{Samples → Samples~}/Audio_Visualizer_FMOD.prefab.meta +7 -7
  14. package/{Samples → Samples~}/Credits_Music_FMOD.prefab +66 -66
  15. package/{Samples → Samples~}/Credits_Music_FMOD.prefab.meta +7 -7
  16. package/{Samples → Samples~}/Environment_SFX_Manager_FMOD.prefab +163 -163
  17. package/{Samples → Samples~}/Environment_SFX_Manager_FMOD.prefab.meta +7 -7
  18. package/{Samples → Samples~}/Environment_Source_FMOD.prefab +101 -101
  19. package/{Samples → Samples~}/Environment_Source_FMOD.prefab.meta +7 -7
  20. package/{Samples → Samples~}/Music_Manager_FMOD.prefab +186 -186
  21. package/{Samples → Samples~}/Music_Manager_FMOD.prefab.meta +7 -7
  22. package/{Samples → Samples~}/On_Voice_Line_Setting_Changed_FMOD.prefab +76 -76
  23. package/{Samples → Samples~}/On_Voice_Line_Setting_Changed_FMOD.prefab.meta +7 -7
  24. package/{Samples → Samples~}/Pop_Up_Emitter_FMOD.prefab +57 -57
  25. package/{Samples → Samples~}/Pop_Up_Emitter_FMOD.prefab.meta +7 -7
  26. package/{Samples → Samples~}/SFX_Manager_FMOD.prefab +501 -501
  27. package/{Samples → Samples~}/SFX_Manager_FMOD.prefab.meta +7 -7
  28. package/{Samples → Samples~}/SFX_Source_FMOD.prefab +101 -101
  29. package/{Samples → Samples~}/SFX_Source_FMOD.prefab.meta +7 -7
  30. package/{Samples → Samples~}/Sound_Manager_FMOD_ETemplate.prefab +515 -515
  31. package/{Samples → Samples~}/Sound_Manager_FMOD_ETemplate.prefab.meta +7 -7
  32. package/{Samples → Samples~}/Sound_Player_DRE_FMOD.prefab +47 -47
  33. package/{Samples → Samples~}/Sound_Player_DRE_FMOD.prefab.meta +7 -7
  34. package/{Samples → Samples~}/UI_Cancel_Source_FMOD.prefab +101 -101
  35. package/{Samples → Samples~}/UI_Cancel_Source_FMOD.prefab.meta +7 -7
  36. package/{Samples → Samples~}/UI_Select_Source_FMOD.prefab +101 -101
  37. package/{Samples → Samples~}/UI_Select_Source_FMOD.prefab.meta +7 -7
  38. package/{Samples → Samples~}/UI_Submit_Source_FMOD.prefab +101 -101
  39. package/{Samples → Samples~}/UI_Submit_Source_FMOD.prefab.meta +7 -7
  40. package/{Samples → Samples~}/Voice_SFX_Manager_FMOD.prefab +163 -163
  41. package/{Samples → Samples~}/Voice_SFX_Manager_FMOD.prefab.meta +7 -7
  42. package/{Samples → Samples~}/Voice_Source_FMOD.prefab +57 -57
  43. package/{Samples → Samples~}/Voice_Source_FMOD.prefab.meta +7 -7
  44. package/SoundPlayerDREFMOD.cs +42 -42
  45. package/SoundPlayerDREFMOD.cs.meta +11 -11
  46. package/package.json +41 -36
  47. package/package.json.meta +7 -7
  48. package/Samples.meta +0 -8
@@ -1,358 +1,358 @@
1
- //Music Playlist script originally Author: SeleniumSoul for DREditor
2
- // Edited by Sweden for FMOD Usage.
3
-
4
- #if UNITY_EDITOR
5
-
6
- using UnityEditor;
7
- using UnityEngine;
8
-
9
- namespace DREditor.Audio.FMOD
10
- {
11
- /// <summary>
12
- ///
13
- /// </summary>
14
- [CustomEditor(typeof(PlaylistFMOD))]
15
- public class PlaylistFMODEditor : UnityEditor.Editor
16
- {
17
- /// <summary>
18
- ///
19
- /// </summary>
20
- protected PlaylistFMOD playlist;
21
-
22
- /// <summary>
23
- ///
24
- /// </summary>
25
- protected SerializedProperty musicLines;
26
-
27
-
28
- /// <summary>
29
- ///
30
- /// </summary>
31
- public virtual void OnEnable()
32
- {
33
- playlist = (PlaylistFMOD)target;
34
-
35
- musicLines = serializedObject.FindProperty("Musics");
36
- }
37
-
38
- /// <inheritdoc/>
39
- public override void OnInspectorGUI()
40
- {
41
- CreateForm();
42
-
43
- SetDataDirty();
44
- }
45
-
46
- /// <summary>
47
- ///
48
- /// </summary>
49
- protected virtual void CreateForm()
50
- {
51
- if (playlist.Musics.Count != 0)
52
- CreateMusicForm();
53
- else if (AddMusicButton())
54
- return;
55
- }
56
-
57
- /// <summary>
58
- ///
59
- /// </summary>
60
- protected virtual void CreateMusicForm()
61
- {
62
- EditorGUILayout.BeginVertical("Box");
63
-
64
- CreateFormTitle();
65
-
66
- DisplayAllMusicUI();
67
-
68
- EditorGUILayout.EndVertical();
69
- }
70
-
71
- /// <summary>
72
- ///
73
- /// </summary>
74
- protected virtual void CreateFormTitle()
75
- {
76
- EditorGUILayout.BeginHorizontal();
77
-
78
- EditorGUILayout.LabelField("Soundtrack Jukebox", GetFormTitleGUIStyle());
79
-
80
- EditorGUILayout.EndHorizontal();
81
-
82
-
83
- EditorStyles.textArea.wordWrap = true;
84
-
85
- EditorStyles.textField.wordWrap = true;
86
- }
87
-
88
- /// <summary>
89
- ///
90
- /// </summary>
91
- /// <returns></returns>
92
- protected virtual GUIStyle GetFormTitleGUIStyle()
93
- {
94
- return new()
95
- {
96
- fontSize = 25,
97
- fontStyle = FontStyle.Bold,
98
- alignment = TextAnchor.MiddleCenter,
99
- wordWrap = true
100
- };
101
- }
102
-
103
- /// <summary>
104
- ///
105
- /// </summary>
106
- protected virtual void DisplayAllMusicUI()
107
- {
108
- for (int i = 0; i < musicLines.arraySize; i++)
109
- CreateMusicInstanceGUI(i);
110
- }
111
-
112
- /// <summary>
113
- ///
114
- /// </summary>
115
- /// <param name="i"></param>
116
- protected virtual void CreateMusicInstanceGUI(int i)
117
- {
118
- EditorGUILayout.BeginVertical("Box");
119
-
120
- EditorGUILayout.BeginHorizontal();
121
-
122
- DisplayTrackNumberTitle(i);
123
-
124
-
125
- EditorGUILayout.BeginVertical();
126
-
127
- DisplayPlaylistData(i);
128
-
129
- if (DisplayInstanceUtilityButtons(i))
130
- return;
131
-
132
- EditorGUILayout.EndVertical();
133
-
134
-
135
- EditorGUILayout.EndHorizontal();
136
-
137
- EditorGUILayout.EndVertical();
138
- }
139
-
140
- /// <summary>
141
- ///
142
- /// </summary>
143
- /// <param name="i"></param>
144
- protected virtual void DisplayTrackNumberTitle(int i)
145
- {
146
- EditorGUILayout.BeginVertical();
147
-
148
- GUILayout.FlexibleSpace();
149
-
150
- EditorGUILayout.LabelField(i.ToString(), GetTrackNumberGUIStyle(), GUILayout.Width(50));
151
-
152
- GUILayout.FlexibleSpace();
153
-
154
- EditorGUILayout.EndVertical();
155
- }
156
-
157
- /// <summary>
158
- ///
159
- /// </summary>
160
- /// <param name="i"></param>
161
- protected virtual void DisplayPlaylistData(int i)
162
- {
163
- // Display Track UI Title
164
- playlist.Musics[i].Title = EditorGUILayout.TextField("Title", playlist.Musics[i].Title);
165
-
166
- EvaluateAudioField(i);
167
- }
168
-
169
- /// <summary>
170
- ///
171
- /// </summary>
172
- /// <param name="i"></param>
173
- protected virtual void EvaluateAudioField(int i)
174
- {
175
- if (i < playlist.Musics.Count)
176
- if (musicLines.arraySize > i && musicLines.GetArrayElementAtIndex(i) != null)
177
- DisplayAudioField(i);
178
- }
179
-
180
- /// <summary>
181
- ///
182
- /// </summary>
183
- /// <param name="i"></param>
184
- protected virtual void DisplayAudioField(int i)
185
- {
186
- var sfxListProperty = musicLines.GetArrayElementAtIndex(i).FindPropertyRelative("BGM");
187
-
188
- EditorGUIUtility.labelWidth = 1;
189
-
190
- EditorGUILayout.PropertyField(sfxListProperty, new GUIContent(""), GUILayout.MinWidth(270));
191
- }
192
-
193
- /// <summary>
194
- ///
195
- /// </summary>
196
- /// <param name="i"></param>
197
- /// <returns></returns>
198
- protected virtual bool DisplayInstanceUtilityButtons(int i)
199
- {
200
- EditorGUILayout.BeginHorizontal();
201
-
202
- bool utilityButtonClicked =
203
- RemoveMusicInstanceButton(i) ||
204
- MoveUpButton(i) ||
205
- MoveDownButton(i) ||
206
- InsertMusicInstanceButton(i);
207
-
208
- EditorGUILayout.EndHorizontal();
209
-
210
- return utilityButtonClicked;
211
- }
212
-
213
- /// <summary>
214
- ///
215
- /// </summary>
216
- /// <param name="i"></param>
217
- /// <returns></returns>
218
- protected virtual bool RemoveMusicInstanceButton(int i)
219
- {
220
- if (GUILayout.Button("-"))
221
- {
222
- playlist.Musics.Remove(playlist.Musics[i]);
223
-
224
- musicLines.serializedObject.Update();
225
-
226
- return true;
227
- }
228
- else
229
- return false;
230
- }
231
-
232
- /// <summary>
233
- ///
234
- /// </summary>
235
- /// <param name="i"></param>
236
- /// <returns></returns>
237
- protected virtual bool MoveUpButton(int i)
238
- {
239
- if (i > 0)
240
- {
241
- GUI.enabled = true;
242
-
243
- if (GUILayout.Button("ʌ") && i > 0)
244
- {
245
- (playlist.Musics[i], playlist.Musics[i - 1]) = (playlist.Musics[i - 1], playlist.Musics[i]);
246
-
247
- musicLines.serializedObject.Update();
248
-
249
- return true;
250
- }
251
- }
252
- else
253
- {
254
- GUI.enabled = false;
255
-
256
- GUILayout.Button("ʌ");
257
- }
258
-
259
- GUI.enabled = true;
260
-
261
- return false;
262
- }
263
-
264
- /// <summary>
265
- ///
266
- /// </summary>
267
- /// <param name="i"></param>
268
- /// <returns></returns>
269
- protected virtual bool MoveDownButton(int i)
270
- {
271
- if (i < playlist.Musics.Count - 1)
272
- {
273
- GUI.enabled = true;
274
-
275
- if (GUILayout.Button("v"))
276
- {
277
- (playlist.Musics[i], playlist.Musics[i + 1]) = (playlist.Musics[i + 1], playlist.Musics[i]);
278
-
279
- musicLines.serializedObject.Update();
280
-
281
- return true;
282
- }
283
- }
284
- else
285
- {
286
- GUI.enabled = false;
287
-
288
- GUILayout.Button("v");
289
- }
290
-
291
- GUI.enabled = true;
292
-
293
- return false;
294
- }
295
-
296
- /// <summary>
297
- ///
298
- /// </summary>
299
- /// <returns></returns>
300
- protected virtual GUIStyle GetTrackNumberGUIStyle()
301
- {
302
- return new()
303
- {
304
- fontSize = 25,
305
- fontStyle = FontStyle.Bold,
306
- alignment = TextAnchor.MiddleCenter
307
- };
308
- }
309
-
310
- /// <summary>
311
- ///
312
- /// </summary>
313
- /// <param name="i"></param>
314
- /// <returns></returns>
315
- protected virtual bool InsertMusicInstanceButton(int i)
316
- {
317
- if (GUILayout.Button("+"))
318
- {
319
- playlist.Musics.Insert(i + 1, new MusicFMOD());
320
-
321
- musicLines.serializedObject.Update();
322
-
323
- return true;
324
- }
325
- else
326
- return false;
327
- }
328
-
329
- /// <summary>
330
- ///
331
- /// </summary>
332
- /// <returns></returns>
333
- protected virtual bool AddMusicButton()
334
- {
335
- if (GUILayout.Button("Add Music"))
336
- {
337
- playlist.Musics.Add(new MusicFMOD());
338
-
339
- musicLines.serializedObject.Update();
340
-
341
- return true;
342
- }
343
- else
344
- return false;
345
- }
346
-
347
- /// <summary>
348
- ///
349
- /// </summary>
350
- protected virtual void SetDataDirty()
351
- {
352
- EditorUtility.SetDirty(playlist);
353
-
354
- musicLines.serializedObject.ApplyModifiedProperties();
355
- }
356
- }
357
- }
1
+ //Music Playlist script originally Author: SeleniumSoul for DREditor
2
+ // Edited by Sweden for FMOD Usage.
3
+
4
+ #if UNITY_EDITOR
5
+
6
+ using UnityEditor;
7
+ using UnityEngine;
8
+
9
+ namespace DREditor.Audio.FMOD
10
+ {
11
+ /// <summary>
12
+ ///
13
+ /// </summary>
14
+ [CustomEditor(typeof(PlaylistFMOD))]
15
+ public class PlaylistFMODEditor : UnityEditor.Editor
16
+ {
17
+ /// <summary>
18
+ ///
19
+ /// </summary>
20
+ protected PlaylistFMOD playlist;
21
+
22
+ /// <summary>
23
+ ///
24
+ /// </summary>
25
+ protected SerializedProperty musicLines;
26
+
27
+
28
+ /// <summary>
29
+ ///
30
+ /// </summary>
31
+ public virtual void OnEnable()
32
+ {
33
+ playlist = (PlaylistFMOD)target;
34
+
35
+ musicLines = serializedObject.FindProperty("Musics");
36
+ }
37
+
38
+ /// <inheritdoc/>
39
+ public override void OnInspectorGUI()
40
+ {
41
+ CreateForm();
42
+
43
+ SetDataDirty();
44
+ }
45
+
46
+ /// <summary>
47
+ ///
48
+ /// </summary>
49
+ protected virtual void CreateForm()
50
+ {
51
+ if (playlist.Musics.Count != 0)
52
+ CreateMusicForm();
53
+ else if (AddMusicButton())
54
+ return;
55
+ }
56
+
57
+ /// <summary>
58
+ ///
59
+ /// </summary>
60
+ protected virtual void CreateMusicForm()
61
+ {
62
+ EditorGUILayout.BeginVertical("Box");
63
+
64
+ CreateFormTitle();
65
+
66
+ DisplayAllMusicUI();
67
+
68
+ EditorGUILayout.EndVertical();
69
+ }
70
+
71
+ /// <summary>
72
+ ///
73
+ /// </summary>
74
+ protected virtual void CreateFormTitle()
75
+ {
76
+ EditorGUILayout.BeginHorizontal();
77
+
78
+ EditorGUILayout.LabelField("Soundtrack Jukebox", GetFormTitleGUIStyle());
79
+
80
+ EditorGUILayout.EndHorizontal();
81
+
82
+
83
+ EditorStyles.textArea.wordWrap = true;
84
+
85
+ EditorStyles.textField.wordWrap = true;
86
+ }
87
+
88
+ /// <summary>
89
+ ///
90
+ /// </summary>
91
+ /// <returns></returns>
92
+ protected virtual GUIStyle GetFormTitleGUIStyle()
93
+ {
94
+ return new()
95
+ {
96
+ fontSize = 25,
97
+ fontStyle = FontStyle.Bold,
98
+ alignment = TextAnchor.MiddleCenter,
99
+ wordWrap = true
100
+ };
101
+ }
102
+
103
+ /// <summary>
104
+ ///
105
+ /// </summary>
106
+ protected virtual void DisplayAllMusicUI()
107
+ {
108
+ for (int i = 0; i < musicLines.arraySize; i++)
109
+ CreateMusicInstanceGUI(i);
110
+ }
111
+
112
+ /// <summary>
113
+ ///
114
+ /// </summary>
115
+ /// <param name="i"></param>
116
+ protected virtual void CreateMusicInstanceGUI(int i)
117
+ {
118
+ EditorGUILayout.BeginVertical("Box");
119
+
120
+ EditorGUILayout.BeginHorizontal();
121
+
122
+ DisplayTrackNumberTitle(i);
123
+
124
+
125
+ EditorGUILayout.BeginVertical();
126
+
127
+ DisplayPlaylistData(i);
128
+
129
+ if (DisplayInstanceUtilityButtons(i))
130
+ return;
131
+
132
+ EditorGUILayout.EndVertical();
133
+
134
+
135
+ EditorGUILayout.EndHorizontal();
136
+
137
+ EditorGUILayout.EndVertical();
138
+ }
139
+
140
+ /// <summary>
141
+ ///
142
+ /// </summary>
143
+ /// <param name="i"></param>
144
+ protected virtual void DisplayTrackNumberTitle(int i)
145
+ {
146
+ EditorGUILayout.BeginVertical();
147
+
148
+ GUILayout.FlexibleSpace();
149
+
150
+ EditorGUILayout.LabelField(i.ToString(), GetTrackNumberGUIStyle(), GUILayout.Width(50));
151
+
152
+ GUILayout.FlexibleSpace();
153
+
154
+ EditorGUILayout.EndVertical();
155
+ }
156
+
157
+ /// <summary>
158
+ ///
159
+ /// </summary>
160
+ /// <param name="i"></param>
161
+ protected virtual void DisplayPlaylistData(int i)
162
+ {
163
+ // Display Track UI Title
164
+ playlist.Musics[i].Title = EditorGUILayout.TextField("Title", playlist.Musics[i].Title);
165
+
166
+ EvaluateAudioField(i);
167
+ }
168
+
169
+ /// <summary>
170
+ ///
171
+ /// </summary>
172
+ /// <param name="i"></param>
173
+ protected virtual void EvaluateAudioField(int i)
174
+ {
175
+ if (i < playlist.Musics.Count)
176
+ if (musicLines.arraySize > i && musicLines.GetArrayElementAtIndex(i) != null)
177
+ DisplayAudioField(i);
178
+ }
179
+
180
+ /// <summary>
181
+ ///
182
+ /// </summary>
183
+ /// <param name="i"></param>
184
+ protected virtual void DisplayAudioField(int i)
185
+ {
186
+ var sfxListProperty = musicLines.GetArrayElementAtIndex(i).FindPropertyRelative("BGM");
187
+
188
+ EditorGUIUtility.labelWidth = 1;
189
+
190
+ EditorGUILayout.PropertyField(sfxListProperty, new GUIContent(""), GUILayout.MinWidth(270));
191
+ }
192
+
193
+ /// <summary>
194
+ ///
195
+ /// </summary>
196
+ /// <param name="i"></param>
197
+ /// <returns></returns>
198
+ protected virtual bool DisplayInstanceUtilityButtons(int i)
199
+ {
200
+ EditorGUILayout.BeginHorizontal();
201
+
202
+ bool utilityButtonClicked =
203
+ RemoveMusicInstanceButton(i) ||
204
+ MoveUpButton(i) ||
205
+ MoveDownButton(i) ||
206
+ InsertMusicInstanceButton(i);
207
+
208
+ EditorGUILayout.EndHorizontal();
209
+
210
+ return utilityButtonClicked;
211
+ }
212
+
213
+ /// <summary>
214
+ ///
215
+ /// </summary>
216
+ /// <param name="i"></param>
217
+ /// <returns></returns>
218
+ protected virtual bool RemoveMusicInstanceButton(int i)
219
+ {
220
+ if (GUILayout.Button("-"))
221
+ {
222
+ playlist.Musics.Remove(playlist.Musics[i]);
223
+
224
+ musicLines.serializedObject.Update();
225
+
226
+ return true;
227
+ }
228
+ else
229
+ return false;
230
+ }
231
+
232
+ /// <summary>
233
+ ///
234
+ /// </summary>
235
+ /// <param name="i"></param>
236
+ /// <returns></returns>
237
+ protected virtual bool MoveUpButton(int i)
238
+ {
239
+ if (i > 0)
240
+ {
241
+ GUI.enabled = true;
242
+
243
+ if (GUILayout.Button("ʌ") && i > 0)
244
+ {
245
+ (playlist.Musics[i], playlist.Musics[i - 1]) = (playlist.Musics[i - 1], playlist.Musics[i]);
246
+
247
+ musicLines.serializedObject.Update();
248
+
249
+ return true;
250
+ }
251
+ }
252
+ else
253
+ {
254
+ GUI.enabled = false;
255
+
256
+ GUILayout.Button("ʌ");
257
+ }
258
+
259
+ GUI.enabled = true;
260
+
261
+ return false;
262
+ }
263
+
264
+ /// <summary>
265
+ ///
266
+ /// </summary>
267
+ /// <param name="i"></param>
268
+ /// <returns></returns>
269
+ protected virtual bool MoveDownButton(int i)
270
+ {
271
+ if (i < playlist.Musics.Count - 1)
272
+ {
273
+ GUI.enabled = true;
274
+
275
+ if (GUILayout.Button("v"))
276
+ {
277
+ (playlist.Musics[i], playlist.Musics[i + 1]) = (playlist.Musics[i + 1], playlist.Musics[i]);
278
+
279
+ musicLines.serializedObject.Update();
280
+
281
+ return true;
282
+ }
283
+ }
284
+ else
285
+ {
286
+ GUI.enabled = false;
287
+
288
+ GUILayout.Button("v");
289
+ }
290
+
291
+ GUI.enabled = true;
292
+
293
+ return false;
294
+ }
295
+
296
+ /// <summary>
297
+ ///
298
+ /// </summary>
299
+ /// <returns></returns>
300
+ protected virtual GUIStyle GetTrackNumberGUIStyle()
301
+ {
302
+ return new()
303
+ {
304
+ fontSize = 25,
305
+ fontStyle = FontStyle.Bold,
306
+ alignment = TextAnchor.MiddleCenter
307
+ };
308
+ }
309
+
310
+ /// <summary>
311
+ ///
312
+ /// </summary>
313
+ /// <param name="i"></param>
314
+ /// <returns></returns>
315
+ protected virtual bool InsertMusicInstanceButton(int i)
316
+ {
317
+ if (GUILayout.Button("+"))
318
+ {
319
+ playlist.Musics.Insert(i + 1, new MusicFMOD());
320
+
321
+ musicLines.serializedObject.Update();
322
+
323
+ return true;
324
+ }
325
+ else
326
+ return false;
327
+ }
328
+
329
+ /// <summary>
330
+ ///
331
+ /// </summary>
332
+ /// <returns></returns>
333
+ protected virtual bool AddMusicButton()
334
+ {
335
+ if (GUILayout.Button("Add Music"))
336
+ {
337
+ playlist.Musics.Add(new MusicFMOD());
338
+
339
+ musicLines.serializedObject.Update();
340
+
341
+ return true;
342
+ }
343
+ else
344
+ return false;
345
+ }
346
+
347
+ /// <summary>
348
+ ///
349
+ /// </summary>
350
+ protected virtual void SetDataDirty()
351
+ {
352
+ EditorUtility.SetDirty(playlist);
353
+
354
+ musicLines.serializedObject.ApplyModifiedProperties();
355
+ }
356
+ }
357
+ }
358
358
  #endif