sqil-core 0.1.0__py3-none-any.whl → 1.1.0__py3-none-any.whl

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 (36) hide show
  1. sqil_core/__init__.py +1 -0
  2. sqil_core/config_log.py +42 -0
  3. sqil_core/experiment/__init__.py +11 -0
  4. sqil_core/experiment/_analysis.py +125 -0
  5. sqil_core/experiment/_events.py +25 -0
  6. sqil_core/experiment/_experiment.py +553 -0
  7. sqil_core/experiment/data/plottr.py +778 -0
  8. sqil_core/experiment/helpers/_function_override_handler.py +111 -0
  9. sqil_core/experiment/helpers/_labone_wrappers.py +12 -0
  10. sqil_core/experiment/instruments/__init__.py +2 -0
  11. sqil_core/experiment/instruments/_instrument.py +190 -0
  12. sqil_core/experiment/instruments/drivers/SignalCore_SC5511A.py +515 -0
  13. sqil_core/experiment/instruments/local_oscillator.py +205 -0
  14. sqil_core/experiment/instruments/server.py +175 -0
  15. sqil_core/experiment/instruments/setup.yaml +21 -0
  16. sqil_core/experiment/instruments/zurich_instruments.py +55 -0
  17. sqil_core/fit/__init__.py +23 -0
  18. sqil_core/fit/_core.py +179 -31
  19. sqil_core/fit/_fit.py +544 -94
  20. sqil_core/fit/_guess.py +304 -0
  21. sqil_core/fit/_models.py +50 -1
  22. sqil_core/fit/_quality.py +266 -0
  23. sqil_core/resonator/__init__.py +2 -0
  24. sqil_core/resonator/_resonator.py +256 -74
  25. sqil_core/utils/__init__.py +40 -13
  26. sqil_core/utils/_analysis.py +226 -0
  27. sqil_core/utils/_const.py +83 -18
  28. sqil_core/utils/_formatter.py +127 -55
  29. sqil_core/utils/_plot.py +272 -6
  30. sqil_core/utils/_read.py +178 -95
  31. sqil_core/utils/_utils.py +147 -0
  32. {sqil_core-0.1.0.dist-info → sqil_core-1.1.0.dist-info}/METADATA +9 -1
  33. sqil_core-1.1.0.dist-info/RECORD +36 -0
  34. {sqil_core-0.1.0.dist-info → sqil_core-1.1.0.dist-info}/WHEEL +1 -1
  35. sqil_core-0.1.0.dist-info/RECORD +0 -19
  36. {sqil_core-0.1.0.dist-info → sqil_core-1.1.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,515 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Fri Mar 19 14:11:31 2021
4
+
5
+ @author: Chao Zhou
6
+
7
+ A simple driver for SignalCore SC5511A to be used with QCoDes, transferred from the one written by Erick Brindock
8
+ """
9
+
10
+ import ctypes
11
+ import logging
12
+ from typing import Any, Dict, Optional
13
+
14
+ import yaml
15
+
16
+ # from helpers.customized_drivers.sc5511a import * #is this actually required?
17
+ from qcodes import Instrument
18
+ from qcodes.utils.validators import Enum, Numbers
19
+
20
+ # from Hatlab_QCoDes_Drivers import DLLPATH
21
+ # import Hatlab_QCoDes_Drivers
22
+
23
+ # ChainedSigCores = yaml.safe_load(open(Hatlab_QCoDes_Drivers.__path__[0]+"\\..\\DeviceInfo\\ChainedSigCores.yaml"))
24
+ DLLPATH = r"C:\Program Files\SignalCore\SC5511A\api\c\x64"
25
+
26
+
27
+ def search_5511(max_connection=20):
28
+ """
29
+ param max_connection: maximum number of connected device
30
+ """
31
+ dll_5511 = ctypes.CDLL(DLLPATH + "//sc5511a.dll")
32
+ sn_buffers = [
33
+ ctypes.create_string_buffer(8) for i in range(max_connection)
34
+ ] # buffer to store list of serial numbers
35
+ pointers = (ctypes.c_char_p * max_connection)(
36
+ *map(ctypes.addressof, sn_buffers)
37
+ ) # pointer list for the buffers
38
+ n_5511 = dll_5511.sc5511a_search_devices(ctypes.byref(pointers))
39
+ pointer_list = []
40
+ if n_5511 == 0:
41
+ print("No SC5511A 20GHz-SigCire is connected")
42
+ else:
43
+ print("Following SC5511A 20GHz-SigCores are connected:")
44
+ for i in range(n_5511):
45
+ print(pointers[i])
46
+ pointer_list.append(pointers[i].decode("utf-8"))
47
+ return pointer_list
48
+
49
+
50
+ class Device_rf_params_t(ctypes.Structure):
51
+ _fields_ = [
52
+ ("rf1_freq", ctypes.c_ulonglong),
53
+ ("start_freq", ctypes.c_ulonglong),
54
+ ("stop_freq", ctypes.c_ulonglong),
55
+ ("step_freq", ctypes.c_ulonglong),
56
+ ("sweep_dwell_time", ctypes.c_uint),
57
+ ("sweep_cycles", ctypes.c_uint),
58
+ ("buffer_time", ctypes.c_uint),
59
+ ("rf_level", ctypes.c_float),
60
+ ("rf2_freq", ctypes.c_short),
61
+ ]
62
+
63
+
64
+ class Device_temperature_t(ctypes.Structure):
65
+ _fields_ = [("device_temp", ctypes.c_float)]
66
+
67
+
68
+ class Operate_status_t(ctypes.Structure):
69
+ _fields_ = [
70
+ ("rf1_lock_mode", ctypes.c_ubyte),
71
+ ("rf1_loop_gain", ctypes.c_ubyte),
72
+ ("device_access", ctypes.c_ubyte),
73
+ ("rf2_standby", ctypes.c_ubyte),
74
+ ("rf1_standby", ctypes.c_ubyte),
75
+ ("auto_pwr_disable", ctypes.c_ubyte),
76
+ ("alc_mode", ctypes.c_ubyte),
77
+ ("rf1_out_enable", ctypes.c_ubyte),
78
+ ("ext_ref_lock_enable", ctypes.c_ubyte),
79
+ ("ext_ref_detect", ctypes.c_ubyte),
80
+ ("ref_out_select", ctypes.c_ubyte),
81
+ ("list_mode_running", ctypes.c_ubyte),
82
+ ("rf1_mode", ctypes.c_ubyte),
83
+ ("harmonic_ss", ctypes.c_ubyte),
84
+ ("over_temp", ctypes.c_ubyte),
85
+ ]
86
+
87
+
88
+ class Pll_status_t(ctypes.Structure):
89
+ _fields_ = [
90
+ ("sum_pll_ld", ctypes.c_ubyte),
91
+ ("crs_pll_ld", ctypes.c_ubyte),
92
+ ("fine_pll_ld", ctypes.c_ubyte),
93
+ ("crs_ref_pll_ld", ctypes.c_ubyte),
94
+ ("crs_aux_pll_ld", ctypes.c_ubyte),
95
+ ("ref_100_pll_ld", ctypes.c_ubyte),
96
+ ("ref_10_pll_ld", ctypes.c_ubyte),
97
+ ("rf2_pll_ld", ctypes.c_ubyte),
98
+ ]
99
+
100
+
101
+ class List_mode_t(ctypes.Structure):
102
+ _fields_ = [
103
+ ("sss_mode", ctypes.c_ubyte),
104
+ ("sweep_dir", ctypes.c_ubyte),
105
+ ("tri_waveform", ctypes.c_ubyte),
106
+ ("hw_trigger", ctypes.c_ubyte),
107
+ ("step_on_hw_trig", ctypes.c_ubyte),
108
+ ("return_to_start", ctypes.c_ubyte),
109
+ ("trig_out_enable", ctypes.c_ubyte),
110
+ ("trig_out_on_cycle", ctypes.c_ubyte),
111
+ ]
112
+
113
+
114
+ class Device_status_t(ctypes.Structure):
115
+ _fields_ = [
116
+ ("list_mode", List_mode_t),
117
+ ("operate_status_t", Operate_status_t),
118
+ ("pll_status_t", Pll_status_t),
119
+ ]
120
+
121
+
122
+ class Device_info_t(ctypes.Structure):
123
+ _fields_ = [
124
+ ("serial_number", ctypes.c_uint32),
125
+ ("hardware_revision", ctypes.c_float),
126
+ ("firmware_revision", ctypes.c_float),
127
+ ("manufacture_date", ctypes.c_uint32),
128
+ ]
129
+
130
+
131
+ # End of Structures------------------------------------------------------------
132
+ class SignalCore_SC5511A(Instrument):
133
+ def __init__(
134
+ self, name: str, serial_number: str, dll=None, debug=False, **kwargs: Any
135
+ ):
136
+ super().__init__(name, **kwargs)
137
+ logging.info(
138
+ __name__
139
+ + f" : Initializing instrument SignalCore generator {serial_number}"
140
+ )
141
+ if dll is not None:
142
+ self._dll = dll
143
+ else:
144
+ self._dll = ctypes.CDLL(DLLPATH + "//sc5511a.dll")
145
+
146
+ if debug:
147
+ print(self._dll)
148
+
149
+ self._dll.sc5511a_open_device.restype = ctypes.c_uint64
150
+ self._handle = ctypes.c_void_p(
151
+ self._dll.sc5511a_open_device(
152
+ ctypes.c_char_p(bytes(serial_number, "utf-8"))
153
+ )
154
+ )
155
+ self._serial_number = ctypes.c_char_p(bytes(serial_number, "utf-8"))
156
+ self._rf_params = Device_rf_params_t(0, 0, 0, 0, 0, 0, 0, 0, 0)
157
+ self._status = Operate_status_t(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
158
+ self._open = False
159
+ self._temperature = Device_temperature_t(0)
160
+
161
+ self._pll_status = Pll_status_t()
162
+ self._list_mode = List_mode_t()
163
+ self._device_status = Device_status_t(
164
+ self._list_mode, self._status, self._pll_status
165
+ )
166
+ if debug:
167
+ print(serial_number, self._handle)
168
+ self._dll.sc5511a_get_device_status(
169
+ self._handle, ctypes.byref(self._device_status)
170
+ )
171
+ status = self._device_status.operate_status_t.rf1_out_enable
172
+ print("check status", status)
173
+
174
+ self._dll.sc5511a_close_device(self._handle)
175
+ self._device_info = Device_info_t(0, 0, 0, 0)
176
+ self.get_idn()
177
+ self.do_set_auto_level_disable(
178
+ 0
179
+ ) # setting this to 1 will lead to unstable output power
180
+
181
+ # self.do_set_ref_out_freq(10)
182
+ # if serial_number in ChainedSigCores["Modified_Ref_In"]:
183
+ # self.do_set_ref_out_freq(100)
184
+ # elif serial_number in ChainedSigCores["Origional_Ref_In"]:
185
+ # self.do_set_ref_out_freq(10)
186
+
187
+ self.add_parameter(
188
+ "power",
189
+ label="power",
190
+ get_cmd=self.do_get_power,
191
+ get_parser=float,
192
+ set_cmd=self.do_set_power,
193
+ set_parser=float,
194
+ unit="dBm",
195
+ vals=Numbers(min_value=-144, max_value=19),
196
+ )
197
+
198
+ self.add_parameter(
199
+ "output_status",
200
+ label="output_status",
201
+ get_cmd=self.do_get_output_status,
202
+ get_parser=int,
203
+ set_cmd=self.do_set_output_status,
204
+ set_parser=int,
205
+ vals=Numbers(min_value=0, max_value=1),
206
+ )
207
+
208
+ self.add_parameter(
209
+ "frequency",
210
+ label="frequency",
211
+ get_cmd=self.do_get_frequency,
212
+ get_parser=float,
213
+ set_cmd=self.do_set_frequency,
214
+ set_parser=float,
215
+ unit="Hz",
216
+ vals=Numbers(min_value=0, max_value=20e9),
217
+ )
218
+
219
+ self.add_parameter(
220
+ "reference_source",
221
+ label="reference_source",
222
+ get_cmd=self.do_get_reference_source,
223
+ get_parser=int,
224
+ set_cmd=self.do_set_reference_source,
225
+ set_parser=int,
226
+ vals=Numbers(min_value=0, max_value=1),
227
+ )
228
+
229
+ self.add_parameter(
230
+ "auto_level_disable",
231
+ label="0 = power is leveled on frequency change",
232
+ get_cmd=self.do_get_auto_level_disable,
233
+ get_parser=int,
234
+ set_cmd=self.do_set_auto_level_disable,
235
+ set_parser=int,
236
+ vals=Numbers(min_value=0, max_value=1),
237
+ )
238
+
239
+ self.add_parameter(
240
+ "ref_out_freq",
241
+ label="reference out frequency in MHz",
242
+ get_cmd=self.do_get_ref_out_freq,
243
+ get_parser=int,
244
+ set_cmd=self.do_set_ref_out_freq,
245
+ set_parser=int,
246
+ vals=Enum(10, 100),
247
+ )
248
+
249
+ self.add_parameter(
250
+ "temperature",
251
+ label="temperature",
252
+ get_cmd=self.do_get_device_temp,
253
+ get_parser=float,
254
+ unit="C",
255
+ vals=Numbers(min_value=0, max_value=200),
256
+ )
257
+
258
+ if self._device_status.operate_status_t.ext_ref_lock_enable == 0:
259
+ self.do_set_reference_source(1)
260
+
261
+ def set_open(self, open):
262
+ if open and not self._open:
263
+ self._handle = ctypes.c_void_p(
264
+ self._dll.sc5511a_open_device(self._serial_number)
265
+ )
266
+ self._open = True
267
+ elif not open and self._open:
268
+ self._dll.sc5511a_close_device(self._handle)
269
+ self._open = False
270
+ return True
271
+
272
+ def close(self):
273
+ self.set_open(0)
274
+
275
+ def get_device_status(self):
276
+ self._handle = ctypes.c_void_p(
277
+ self._dll.sc5511a_open_device(self._serial_number)
278
+ )
279
+ self._dll.sc5511a_get_device_status(
280
+ self._handle, ctypes.byref(self._device_status)
281
+ )
282
+ self._dll.sc5511a_close_device(self._handle)
283
+ return self._device_status
284
+
285
+ def do_set_output_status(self, enable):
286
+ """
287
+ Turns the output of RF1 on or off.
288
+ Input:
289
+ enable (int) = OFF = 0 ; ON = 1
290
+ """
291
+ logging.info(__name__ + " : Setting output to %s" % enable)
292
+ c_enable = ctypes.c_ubyte(enable)
293
+ self._handle = ctypes.c_void_p(
294
+ self._dll.sc5511a_open_device(self._serial_number)
295
+ )
296
+ completed = self._dll.sc5511a_set_output(self._handle, c_enable)
297
+ self._dll.sc5511a_close_device(self._handle)
298
+ return completed
299
+
300
+ def do_get_output_status(self):
301
+ """
302
+ Reads the output status of RF1
303
+ Output:
304
+ status (int) : OFF = 0 ; ON = 1
305
+ """
306
+ logging.info(__name__ + " : Getting output")
307
+ self._handle = ctypes.c_void_p(
308
+ self._dll.sc5511a_open_device(self._serial_number)
309
+ )
310
+ self._dll.sc5511a_get_device_status(
311
+ self._handle, ctypes.byref(self._device_status)
312
+ )
313
+ status = self._device_status.operate_status_t.rf1_out_enable
314
+ self._dll.sc5511a_close_device(self._handle)
315
+ return status
316
+
317
+ def do_set_frequency(self, frequency):
318
+ """
319
+ Sets RF1 frequency. Valid between 100MHz and 20GHz
320
+ Args:
321
+ frequency (int) = frequency in Hz
322
+ """
323
+ c_freq = ctypes.c_ulonglong(int(frequency))
324
+ logging.info(__name__ + " : Setting frequency to %s" % frequency)
325
+ close = False
326
+ if not self._open:
327
+ self._handle = ctypes.c_void_p(
328
+ self._dll.sc5511a_open_device(self._serial_number)
329
+ )
330
+ close = True
331
+ if_set = self._dll.sc5511a_set_freq(self._handle, c_freq)
332
+ if close:
333
+ self._dll.sc5511a_close_device(self._handle)
334
+ return if_set
335
+
336
+ def do_get_frequency(self):
337
+ logging.info(__name__ + " : Getting frequency")
338
+ self._handle = ctypes.c_void_p(
339
+ self._dll.sc5511a_open_device(self._serial_number)
340
+ )
341
+ self._dll.sc5511a_get_rf_parameters(self._handle, ctypes.byref(self._rf_params))
342
+ frequency = self._rf_params.rf1_freq
343
+ self._dll.sc5511a_close_device(self._handle)
344
+ return frequency
345
+
346
+ def do_set_reference_source(self, lock_to_external):
347
+ logging.info(__name__ + " : Setting reference source to %s" % lock_to_external)
348
+ ref_out_freq = self.do_get_ref_out_freq()
349
+ ref_out_sel = ctypes.c_ubyte(0 if ref_out_freq == 10 else 1)
350
+ lock = ctypes.c_ubyte(lock_to_external)
351
+ self._handle = ctypes.c_void_p(
352
+ self._dll.sc5511a_open_device(self._serial_number)
353
+ )
354
+ # source = self._dll.sc5511a_set_clock_reference(self._handle, ref_out_sel, lock) #does not work for firmware > 3.6
355
+ source = self._dll.sc5511a_set_clock_reference(
356
+ self._handle, ref_out_sel, ref_out_sel, lock, lock
357
+ )
358
+ self._dll.sc5511a_close_device(self._handle)
359
+ return source
360
+
361
+ def do_set_standby(self, enable=False):
362
+ self._handle = ctypes.c_void_p(
363
+ self._dll.sc5511a_open_device(self._serial_number)
364
+ )
365
+ error_code = self._dll.sc5511a_set_standby(self._handle, enable)
366
+ self._dll.sc5511a_close_device(self._handle)
367
+ return error_code, enable
368
+
369
+ def do_get_reference_source(self):
370
+ logging.info(__name__ + " : Getting reference source")
371
+ self._handle = ctypes.c_void_p(
372
+ self._dll.sc5511a_open_device(self._serial_number)
373
+ )
374
+ self._dll.sc5511a_get_device_status(
375
+ self._handle, ctypes.byref(self._device_status)
376
+ )
377
+ enabled = (
378
+ self._device_status.operate_status_t.ext_ref_lock_enable
379
+ and self._device_status.operate_status_t.ext_ref_detect
380
+ )
381
+ self._dll.sc5511a_close_device(self._handle)
382
+ return enabled
383
+
384
+ def do_set_ref_out_freq(self, freq):
385
+ logging.info(__name__ + " : Setting reference out freq to %s" % freq)
386
+ if freq == 10:
387
+ ref_out_sel = 0
388
+ elif freq == 100:
389
+ ref_out_sel = 1
390
+
391
+ ref_out_sel = ctypes.c_ubyte(ref_out_sel)
392
+ lock = ctypes.c_ubyte(self.do_get_reference_source())
393
+ self._handle = ctypes.c_void_p(
394
+ self._dll.sc5511a_open_device(self._serial_number)
395
+ )
396
+ source = self._dll.sc5511a_set_clock_reference(self._handle, ref_out_sel, lock)
397
+ self._dll.sc5511a_close_device(self._handle)
398
+ return source
399
+
400
+ def do_get_ref_out_freq(self):
401
+ logging.info(__name__ + " : Getting reference source")
402
+ self._handle = ctypes.c_void_p(
403
+ self._dll.sc5511a_open_device(self._serial_number)
404
+ )
405
+ self._dll.sc5511a_get_device_status(
406
+ self._handle, ctypes.byref(self._device_status)
407
+ )
408
+ ref_out_sel = self._device_status.operate_status_t.ref_out_select
409
+ freq = 100 if ref_out_sel else 10
410
+ self._dll.sc5511a_close_device(self._handle)
411
+ return freq
412
+
413
+ def do_set_power(self, power):
414
+ logging.info(__name__ + " : Setting power to %s" % power)
415
+ c_power = ctypes.c_float(power)
416
+ close = False
417
+ if not self._open:
418
+ self._handle = ctypes.c_void_p(
419
+ self._dll.sc5511a_open_device(self._serial_number)
420
+ )
421
+ close = True
422
+ completed = self._dll.sc5511a_set_level(self._handle, c_power)
423
+ if close:
424
+ self._dll.sc5511a_close_device(self._handle)
425
+ return completed
426
+
427
+ def do_get_power(self):
428
+ logging.info(__name__ + " : Getting Power")
429
+ self._handle = ctypes.c_void_p(
430
+ self._dll.sc5511a_open_device(self._serial_number)
431
+ )
432
+ self._dll.sc5511a_get_rf_parameters(self._handle, ctypes.byref(self._rf_params))
433
+ rf_level = self._rf_params.rf_level
434
+ self._dll.sc5511a_close_device(self._handle)
435
+ return rf_level
436
+
437
+ def get_ext_ref_lock():
438
+ # prints whether or not an external reference is detected
439
+ error_code, OPERATE = SC1.get_operate_status()
440
+ if OPERATE["ext_ref_detect"] == 0:
441
+ print("There is no external reference detected")
442
+ if OPERATE["ext_ref_detect"] == 1:
443
+ print("An external reference has been detected")
444
+ _error_handler(error_code)
445
+ return OPERATE["ext_ref_detect"]
446
+
447
+ def do_set_auto_level_disable(self, enable):
448
+ logging.info(__name__ + " : Settingalc auto to %s" % enable)
449
+ if enable == 1:
450
+ enable = 0
451
+ elif enable == 0:
452
+ enable = 1
453
+ c_enable = ctypes.c_ubyte(enable)
454
+ self._handle = ctypes.c_void_p(
455
+ self._dll.sc5511a_open_device(self._serial_number)
456
+ )
457
+ completed = self._dll.sc5511a_set_auto_level_disable(self._handle, c_enable)
458
+ self._dll.sc5511a_close_device(self._handle)
459
+ return completed
460
+
461
+ def do_get_auto_level_disable(self):
462
+ logging.info(__name__ + " : Getting alc auto status")
463
+ self._handle = ctypes.c_void_p(
464
+ self._dll.sc5511a_open_device(self._serial_number)
465
+ )
466
+ self._dll.sc5511a_get_device_status(
467
+ self._handle, ctypes.byref(self._device_status)
468
+ )
469
+ enabled = self._device_status.operate_status_t.auto_pwr_disable
470
+ self._dll.sc5511a_close_device(self._handle)
471
+ if enabled == 1:
472
+ enabled = 0
473
+ elif enabled == 0:
474
+ enabled = 1
475
+ return enabled
476
+
477
+ def do_get_device_temp(self):
478
+ logging.info(__name__ + " : Getting device temperature")
479
+ self._handle = ctypes.c_void_p(
480
+ self._dll.sc5511a_open_device(self._serial_number)
481
+ )
482
+ self._dll.sc5511a_get_temperature(self._handle, ctypes.byref(self._temperature))
483
+ device_temp = self._temperature.device_temp
484
+ self._dll.sc5511a_close_device(self._handle)
485
+ return device_temp
486
+
487
+ def get_idn(self) -> Dict[str, Optional[str]]:
488
+ logging.info(__name__ + " : Getting device info")
489
+ self._handle = ctypes.c_void_p(
490
+ self._dll.sc5511a_open_device(self._serial_number)
491
+ )
492
+ self._dll.sc5511a_get_device_info(self._handle, ctypes.byref(self._device_info))
493
+ device_info = self._device_info
494
+ self._dll.sc5511a_close_device(self._handle)
495
+
496
+ def date_decode(date_int: int):
497
+ date_str = f"{date_int:032b}"
498
+ yr = f"20{int(date_str[:8],2)}"
499
+ month = f"{int(date_str[16:24],2)}"
500
+ day = f"{int(date_str[8:16],2)}"
501
+ return f"{month}/{day}/{yr}"
502
+
503
+ IDN: Dict[str, Optional[str]] = {
504
+ "vendor": "SignalCore",
505
+ "model": "SC5511A",
506
+ "serial_number": self._serial_number.value.decode("utf-8"),
507
+ "firmware_revision": device_info.firmware_revision,
508
+ "hardware_revision": device_info.hardware_revision,
509
+ "manufacture_date": date_decode(device_info.manufacture_date),
510
+ }
511
+ return IDN
512
+
513
+
514
+ if __name__ == "__main__":
515
+ SC3 = SignalCore_SC5511A("SC3", "10003C69")