simdref 0.0.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.
@@ -0,0 +1,680 @@
1
+ :root {
2
+ --bg: #f6f7fb;
3
+ --bg-elevated: #eef1f7;
4
+ --surface: #ffffff;
5
+ --surface-hover: #f1f3f5;
6
+ --input-bg: #ffffff;
7
+ --text: #1a1a2e;
8
+ --text-secondary: #475569;
9
+ --text-muted: #94a3b8;
10
+ --border: #e2e8f0;
11
+ --border-strong: #cbd5e1;
12
+ --accent: #2563eb;
13
+ --accent-soft: #eff6ff;
14
+ --accent-glow: rgba(37, 99, 235, 0.18);
15
+ --intrinsic-color: #0d7377;
16
+ --intrinsic-bg: #e0f2f1;
17
+ --instruction-color: #92400e;
18
+ --instruction-bg: #fef3c7;
19
+ --code-bg: #f1f5f9;
20
+ --radius: 6px;
21
+ --radius-lg: 10px;
22
+ --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04);
23
+ --shadow-md: 0 2px 8px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
24
+ --font-mono: "Iosevka Web", "JetBrains Mono", "SF Mono", "Cascadia Code", monospace;
25
+ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
26
+ }
27
+
28
+ [data-theme="dark"] {
29
+ --bg: #0b1220;
30
+ --bg-elevated: #111a2e;
31
+ --surface: #131c30;
32
+ --surface-hover: #1e293b;
33
+ --input-bg: #0f1830;
34
+ --text: #e2e8f0;
35
+ --text-secondary: #cbd5e1;
36
+ --text-muted: #7b8aa5;
37
+ --border: #263349;
38
+ --border-strong: #37465f;
39
+ --accent: #60a5fa;
40
+ --accent-soft: #1b2b4a;
41
+ --accent-glow: rgba(96, 165, 250, 0.25);
42
+ --intrinsic-color: #5eead4;
43
+ --intrinsic-bg: #134e4a;
44
+ --instruction-color: #fbbf24;
45
+ --instruction-bg: #78350f;
46
+ --code-bg: #172238;
47
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
48
+ --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.3);
49
+ }
50
+
51
+ @media (prefers-color-scheme: dark) {
52
+ :root:not([data-theme="light"]) {
53
+ --bg: #0b1220;
54
+ --bg-elevated: #111a2e;
55
+ --surface: #131c30;
56
+ --surface-hover: #1e293b;
57
+ --input-bg: #0f1830;
58
+ --text: #e2e8f0;
59
+ --text-secondary: #cbd5e1;
60
+ --text-muted: #7b8aa5;
61
+ --border: #263349;
62
+ --border-strong: #37465f;
63
+ --accent: #60a5fa;
64
+ --accent-soft: #1b2b4a;
65
+ --accent-glow: rgba(96, 165, 250, 0.25);
66
+ --intrinsic-color: #5eead4;
67
+ --intrinsic-bg: #134e4a;
68
+ --instruction-color: #fbbf24;
69
+ --instruction-bg: #78350f;
70
+ --code-bg: #172238;
71
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
72
+ --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.3);
73
+ }
74
+ }
75
+
76
+ * { box-sizing: border-box; margin: 0; padding: 0; }
77
+
78
+ body {
79
+ background: var(--bg);
80
+ color: var(--text);
81
+ font-family: var(--font-body);
82
+ font-size: 14px;
83
+ line-height: 1.5;
84
+ }
85
+
86
+ /* Header */
87
+ .header {
88
+ display: flex;
89
+ align-items: center;
90
+ justify-content: space-between;
91
+ padding: 0.55rem 1.1rem;
92
+ border-bottom: 1px solid var(--border);
93
+ background: linear-gradient(180deg, var(--surface) 0%, var(--bg-elevated) 100%);
94
+ box-shadow: var(--shadow-sm);
95
+ position: relative;
96
+ z-index: 2;
97
+ }
98
+ .header-left { display: flex; align-items: center; gap: 0.75rem; }
99
+ .header-right { display: flex; align-items: center; gap: 1rem; }
100
+ .logo {
101
+ font-family: var(--font-mono);
102
+ font-size: 1.1rem;
103
+ font-weight: 700;
104
+ color: var(--accent);
105
+ letter-spacing: -0.02em;
106
+ }
107
+ .meta {
108
+ color: var(--text-muted);
109
+ font-size: 0.8rem;
110
+ padding: 2px 8px;
111
+ border: 1px solid var(--border);
112
+ border-radius: var(--radius);
113
+ font-family: ui-monospace, monospace;
114
+ }
115
+ .meta.stale { border-color: var(--accent); color: var(--accent); }
116
+ .kind-bar {
117
+ display: flex;
118
+ gap: 8px;
119
+ align-items: center;
120
+ padding: 4px 16px;
121
+ font-size: 0.85rem;
122
+ }
123
+ .kind-label { color: var(--text-muted); margin-right: 4px; }
124
+ .chip-count {
125
+ color: var(--text-muted);
126
+ margin-left: 6px;
127
+ font-size: 0.75em;
128
+ }
129
+ .icon-btn {
130
+ background: none;
131
+ border: 1px solid var(--border);
132
+ border-radius: var(--radius);
133
+ color: var(--text-secondary);
134
+ cursor: pointer;
135
+ padding: 0.35rem;
136
+ display: flex;
137
+ align-items: center;
138
+ }
139
+ .icon-btn:hover { background: var(--surface-hover); color: var(--text); }
140
+
141
+ /* Search bar */
142
+ .search-bar {
143
+ display: flex;
144
+ gap: 0.55rem;
145
+ padding: 0.7rem 1.1rem;
146
+ border-bottom: 1px solid var(--border);
147
+ background: var(--bg-elevated);
148
+ align-items: center;
149
+ }
150
+ .search-wrap {
151
+ flex: 1 1 auto;
152
+ min-width: 0;
153
+ position: relative;
154
+ display: flex;
155
+ align-items: center;
156
+ }
157
+ .search-icon {
158
+ position: absolute;
159
+ left: 0.75rem;
160
+ color: var(--text-muted);
161
+ pointer-events: none;
162
+ transition: color 0.15s ease;
163
+ }
164
+ .search-wrap input {
165
+ width: 100%;
166
+ height: 2.4rem;
167
+ padding: 0 3rem 0 2.35rem;
168
+ border: 1px solid var(--border);
169
+ border-radius: var(--radius-lg);
170
+ background: var(--input-bg);
171
+ color: var(--text);
172
+ font-family: var(--font-mono);
173
+ font-size: 0.92rem;
174
+ outline: none;
175
+ box-shadow: var(--shadow-sm);
176
+ transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
177
+ }
178
+ .search-wrap input::placeholder { color: var(--text-muted); }
179
+ .search-wrap input:hover { border-color: var(--border-strong); }
180
+ .search-wrap input:focus {
181
+ border-color: var(--accent);
182
+ box-shadow: 0 0 0 3px var(--accent-glow);
183
+ background: var(--surface);
184
+ }
185
+ .search-wrap:focus-within .search-icon { color: var(--accent); }
186
+ .search-wrap input::-webkit-search-cancel-button { -webkit-appearance: none; }
187
+ .search-hint {
188
+ position: absolute;
189
+ right: 0.6rem;
190
+ top: 50%;
191
+ transform: translateY(-50%);
192
+ font-family: var(--font-mono);
193
+ font-size: 0.7rem;
194
+ color: var(--text-muted);
195
+ border: 1px solid var(--border);
196
+ background: var(--surface);
197
+ border-radius: 4px;
198
+ padding: 0.12rem 0.4rem;
199
+ pointer-events: none;
200
+ box-shadow: 0 1px 0 var(--border);
201
+ }
202
+ .search-wrap:focus-within .search-hint { display: none; }
203
+
204
+ /* ISA toggle button */
205
+ .isa-toggle-btn {
206
+ display: inline-flex;
207
+ align-items: center;
208
+ gap: 0.4rem;
209
+ height: 2.4rem;
210
+ padding: 0 0.8rem;
211
+ border: 1px solid var(--border);
212
+ border-radius: var(--radius-lg);
213
+ background: var(--input-bg);
214
+ color: var(--text-secondary);
215
+ cursor: pointer;
216
+ font: inherit;
217
+ font-size: 0.82rem;
218
+ white-space: nowrap;
219
+ box-shadow: var(--shadow-sm);
220
+ transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
221
+ }
222
+ .isa-toggle-btn:hover {
223
+ background: var(--surface);
224
+ border-color: var(--border-strong);
225
+ color: var(--text);
226
+ }
227
+ .isa-toggle-btn[aria-expanded="true"],
228
+ .isa-toggle-btn.open {
229
+ border-color: var(--accent);
230
+ color: var(--accent);
231
+ background: var(--accent-soft);
232
+ }
233
+
234
+ /* ISA filter panel */
235
+ .isa-panel {
236
+ padding: 0.5rem 1rem;
237
+ border-bottom: 1px solid var(--border);
238
+ background: var(--surface);
239
+ }
240
+ .isa-panel.hidden { display: none; }
241
+ .isa-toolbar {
242
+ display: flex;
243
+ align-items: flex-start;
244
+ justify-content: space-between;
245
+ gap: 0.75rem;
246
+ margin-bottom: 0.5rem;
247
+ }
248
+ .isa-family-chips {
249
+ display: flex;
250
+ flex-wrap: wrap;
251
+ gap: 0.25rem;
252
+ min-width: 0;
253
+ flex: 1 1 auto;
254
+ }
255
+ .isa-presets {
256
+ display: flex;
257
+ gap: 0.4rem;
258
+ flex: 0 0 auto;
259
+ }
260
+ .preset-btn {
261
+ padding: 0.25rem 0.6rem;
262
+ border: 1px solid var(--border);
263
+ border-radius: var(--radius);
264
+ background: var(--bg);
265
+ color: var(--text-secondary);
266
+ cursor: pointer;
267
+ font: inherit;
268
+ font-size: 0.8rem;
269
+ }
270
+ .preset-btn:hover { background: var(--surface-hover); color: var(--text); }
271
+ .isa-groups {
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: 0.45rem;
275
+ }
276
+ .isa-group {
277
+ display: grid;
278
+ grid-template-columns: 5.5rem minmax(0, 1fr);
279
+ align-items: start;
280
+ column-gap: 0.5rem;
281
+ row-gap: 0.2rem;
282
+ }
283
+ .isa-group-label {
284
+ font-size: 0.7rem;
285
+ font-weight: 600;
286
+ text-transform: uppercase;
287
+ letter-spacing: 0.05em;
288
+ color: var(--text-muted);
289
+ cursor: pointer;
290
+ border: 0;
291
+ background: transparent;
292
+ padding: 0;
293
+ text-align: left;
294
+ white-space: nowrap;
295
+ }
296
+ .isa-group-label:hover { color: var(--text-secondary); }
297
+ .isa-group-label.family-active { color: var(--accent); }
298
+ .isa-group-items {
299
+ display: flex;
300
+ flex-wrap: wrap;
301
+ gap: 0.25rem;
302
+ min-width: 0;
303
+ }
304
+ .isa-chip {
305
+ display: inline-flex;
306
+ align-items: center;
307
+ gap: 0.2rem;
308
+ padding: 0.15rem 0.45rem;
309
+ border: 1px solid var(--border);
310
+ border-radius: var(--radius);
311
+ font-size: 0.75rem;
312
+ cursor: pointer;
313
+ user-select: none;
314
+ color: var(--text-secondary);
315
+ background: var(--bg);
316
+ }
317
+ .isa-chip.active {
318
+ background: var(--accent-soft);
319
+ border-color: var(--accent);
320
+ color: var(--accent);
321
+ }
322
+ .isa-chip:hover { border-color: var(--accent); }
323
+ .isa-chip input { display: none; }
324
+
325
+ /* Layout */
326
+ .layout {
327
+ display: grid;
328
+ grid-template-columns: minmax(260px, 340px) minmax(0, 1fr);
329
+ height: calc(100vh - 90px);
330
+ overflow: hidden;
331
+ }
332
+
333
+ /* Results panel */
334
+ .results-panel {
335
+ border-right: 1px solid var(--border);
336
+ background: var(--surface);
337
+ display: flex;
338
+ flex-direction: column;
339
+ overflow: hidden;
340
+ }
341
+ .results-header {
342
+ padding: 0.4rem 0.75rem;
343
+ border-bottom: 1px solid var(--border);
344
+ font-size: 0.8rem;
345
+ color: var(--text-muted);
346
+ flex-shrink: 0;
347
+ }
348
+ .results-list {
349
+ overflow-y: auto;
350
+ flex: 1;
351
+ outline: none;
352
+ }
353
+ .result {
354
+ padding: 0.5rem 0.75rem;
355
+ border-left: 3px solid transparent;
356
+ cursor: pointer;
357
+ border-bottom: 1px solid var(--border);
358
+ /* Fixed height enables O(1) viewport virtualisation (see app.js). */
359
+ box-sizing: border-box;
360
+ height: 88px;
361
+ overflow: hidden;
362
+ contain: layout paint style;
363
+ /* Skip layout + paint for rows outside the viewport. The fixed
364
+ * 88px intrinsic-size tells the browser not to reflow the page
365
+ * when a row enters/leaves view. */
366
+ content-visibility: auto;
367
+ contain-intrinsic-size: 88px;
368
+ }
369
+ .results-virtual {
370
+ position: relative;
371
+ width: 100%;
372
+ }
373
+ .results-virtual > .result {
374
+ position: absolute;
375
+ left: 0;
376
+ right: 0;
377
+ }
378
+ .result:hover { background: var(--surface-hover); }
379
+ .result.active {
380
+ border-left-color: var(--accent);
381
+ background: var(--accent-soft);
382
+ }
383
+ .result.focused {
384
+ outline: 2px solid var(--accent);
385
+ outline-offset: -2px;
386
+ }
387
+ .result-kind {
388
+ display: inline-block;
389
+ font-size: 0.65rem;
390
+ font-weight: 700;
391
+ text-transform: uppercase;
392
+ letter-spacing: 0.04em;
393
+ padding: 0.1rem 0.4rem;
394
+ border-radius: 3px;
395
+ }
396
+ .result-kind.intrinsic { color: var(--intrinsic-color); background: var(--intrinsic-bg); }
397
+ .result-kind.instruction { color: var(--instruction-color); background: var(--instruction-bg); }
398
+ .result-top {
399
+ display: flex;
400
+ align-items: center;
401
+ justify-content: space-between;
402
+ gap: 0.3rem;
403
+ }
404
+ .result-isa {
405
+ font-family: var(--font-mono);
406
+ font-size: 0.6rem;
407
+ font-weight: 700;
408
+ letter-spacing: 0.03em;
409
+ color: #7c3aed;
410
+ background: #ede9fe;
411
+ padding: 0.1rem 0.4rem;
412
+ border-radius: 3px;
413
+ overflow: hidden;
414
+ text-overflow: ellipsis;
415
+ white-space: nowrap;
416
+ max-width: 50%;
417
+ text-align: right;
418
+ }
419
+ [data-theme="dark"] .result-isa,
420
+ :root:not([data-theme="light"]) .result-isa {
421
+ color: #c4b5fd;
422
+ background: #2e1065;
423
+ }
424
+ .result-title {
425
+ font-family: var(--font-mono);
426
+ font-size: 0.85rem;
427
+ margin-top: 0.2rem;
428
+ word-break: break-word;
429
+ line-height: 1.3;
430
+ }
431
+ .result-meta {
432
+ display: flex;
433
+ gap: 0.4rem;
434
+ margin-top: 0.15rem;
435
+ }
436
+ .result-perf {
437
+ font-family: var(--font-mono);
438
+ font-size: 0.65rem;
439
+ color: var(--accent);
440
+ background: var(--accent-soft);
441
+ padding: 0.05rem 0.35rem;
442
+ border-radius: 3px;
443
+ font-weight: 600;
444
+ }
445
+ .result.intrinsic-kind .result-title { color: var(--intrinsic-color); }
446
+ .result.instruction-kind .result-title { color: var(--instruction-color); }
447
+ .result-summary {
448
+ color: var(--text-muted);
449
+ font-size: 0.75rem;
450
+ font-style: italic;
451
+ margin-top: 0.15rem;
452
+ overflow: hidden;
453
+ text-overflow: ellipsis;
454
+ white-space: nowrap;
455
+ }
456
+
457
+ /* Detail panel */
458
+ .detail-panel {
459
+ overflow-y: auto;
460
+ padding: 1rem;
461
+ outline: none;
462
+ }
463
+ .detail-empty {
464
+ color: var(--text-muted);
465
+ padding: 2rem 0;
466
+ text-align: center;
467
+ }
468
+
469
+ /* Detail header */
470
+ .detail-head {
471
+ padding-bottom: 0.75rem;
472
+ border-bottom: 1px solid var(--border);
473
+ margin-bottom: 0.75rem;
474
+ }
475
+ .detail-head h2 {
476
+ font-family: var(--font-mono);
477
+ font-size: 1.3rem;
478
+ line-height: 1.2;
479
+ margin-top: 0.3rem;
480
+ word-break: break-word;
481
+ }
482
+ .copy-btn {
483
+ display: inline-flex;
484
+ align-items: center;
485
+ justify-content: center;
486
+ background: none;
487
+ border: 1px solid var(--border);
488
+ border-radius: var(--radius);
489
+ color: var(--text-muted);
490
+ cursor: pointer;
491
+ font-size: 0.75rem;
492
+ padding: 0.15rem 0.35rem;
493
+ vertical-align: middle;
494
+ opacity: 0;
495
+ transition: opacity 0.15s;
496
+ }
497
+ .detail-head:hover .copy-btn,
498
+ .copy-btn:focus { opacity: 1; }
499
+ .copy-btn:hover { background: var(--surface-hover); color: var(--text); }
500
+ .detail-sub {
501
+ font-family: var(--font-mono);
502
+ color: var(--text-secondary);
503
+ font-size: 0.85rem;
504
+ margin-top: 0.25rem;
505
+ word-break: break-word;
506
+ }
507
+ .chips {
508
+ display: flex;
509
+ flex-wrap: wrap;
510
+ gap: 0.35rem;
511
+ margin-top: 0.4rem;
512
+ }
513
+ .chip {
514
+ border: 1px solid var(--border);
515
+ border-radius: var(--radius);
516
+ padding: 0.15rem 0.5rem;
517
+ font-size: 0.75rem;
518
+ background: var(--code-bg);
519
+ color: var(--text-secondary);
520
+ }
521
+
522
+ /* Sections */
523
+ .section { margin-top: 0.75rem; }
524
+ .section h3 {
525
+ font-size: 0.75rem;
526
+ text-transform: uppercase;
527
+ letter-spacing: 0.06em;
528
+ color: var(--text-muted);
529
+ margin-bottom: 0.4rem;
530
+ }
531
+ .kv {
532
+ display: grid;
533
+ grid-template-columns: 7rem 1fr;
534
+ gap: 0.3rem 0.75rem;
535
+ font-size: 0.85rem;
536
+ }
537
+ .kv dt { color: var(--text-muted); font-weight: 600; }
538
+ .kv dd { word-break: break-word; }
539
+
540
+ /* Tables */
541
+ table {
542
+ width: 100%;
543
+ border-collapse: collapse;
544
+ font-size: 0.82rem;
545
+ border: 1px solid var(--border);
546
+ border-radius: var(--radius);
547
+ overflow: hidden;
548
+ }
549
+ th, td {
550
+ text-align: left;
551
+ padding: 0.4rem 0.6rem;
552
+ border-bottom: 1px solid var(--border);
553
+ vertical-align: top;
554
+ }
555
+ th {
556
+ color: var(--text-muted);
557
+ font-size: 0.7rem;
558
+ text-transform: uppercase;
559
+ letter-spacing: 0.05em;
560
+ background: var(--code-bg);
561
+ font-weight: 600;
562
+ }
563
+ tr:last-child td { border-bottom: 0; }
564
+ td.mono { font-family: var(--font-mono); }
565
+ td.highlight { font-weight: 600; color: var(--accent); }
566
+
567
+ /* Measurement groups */
568
+ .meas-group { margin-bottom: 0.5rem; }
569
+ .meas-group summary {
570
+ font-size: 0.8rem;
571
+ font-weight: 600;
572
+ color: var(--text-secondary);
573
+ cursor: pointer;
574
+ padding: 0.3rem 0;
575
+ }
576
+ .meas-group summary:hover { color: var(--text); }
577
+
578
+ /* Cross-reference links */
579
+ a.xref {
580
+ color: var(--accent);
581
+ text-decoration: none;
582
+ font-family: var(--font-mono);
583
+ font-size: 0.82rem;
584
+ }
585
+ a.xref:hover { text-decoration: underline; }
586
+
587
+ /* Generic links */
588
+ a { color: var(--accent); text-decoration: none; }
589
+ a:hover { text-decoration: underline; }
590
+
591
+ /* Overlay */
592
+ .overlay {
593
+ position: fixed;
594
+ inset: 0;
595
+ background: rgba(0, 0, 0, 0.5);
596
+ display: flex;
597
+ align-items: center;
598
+ justify-content: center;
599
+ z-index: 100;
600
+ }
601
+ .overlay.hidden { display: none; }
602
+ .overlay-content {
603
+ background: var(--surface);
604
+ border: 1px solid var(--border);
605
+ border-radius: 8px;
606
+ padding: 1.25rem;
607
+ max-width: 400px;
608
+ width: 90%;
609
+ }
610
+ .overlay-content h3 {
611
+ font-size: 1rem;
612
+ margin-bottom: 0.75rem;
613
+ }
614
+ .shortcuts-table {
615
+ border: none;
616
+ width: 100%;
617
+ margin-bottom: 0.75rem;
618
+ }
619
+ .shortcuts-table td {
620
+ border-bottom: none;
621
+ padding: 0.25rem 0.5rem;
622
+ }
623
+ .shortcuts-table kbd {
624
+ font-family: var(--font-mono);
625
+ font-size: 0.75rem;
626
+ padding: 0.15rem 0.4rem;
627
+ border: 1px solid var(--border);
628
+ border-radius: 3px;
629
+ background: var(--code-bg);
630
+ }
631
+
632
+ /* Description sections */
633
+ .desc-section { margin-bottom: 0.5rem; }
634
+ .desc-section summary {
635
+ font-size: 0.8rem;
636
+ font-weight: 600;
637
+ color: var(--text-secondary);
638
+ cursor: pointer;
639
+ padding: 0.3rem 0;
640
+ }
641
+ .desc-section summary:hover { color: var(--text); }
642
+ .desc-body {
643
+ font-size: 0.82rem;
644
+ line-height: 1.6;
645
+ padding: 0.5rem 0;
646
+ white-space: pre-wrap;
647
+ }
648
+ .desc-code {
649
+ font-family: var(--font-mono);
650
+ font-size: 0.78rem;
651
+ line-height: 1.5;
652
+ padding: 0.5rem 0.75rem;
653
+ background: var(--code-bg);
654
+ border: 1px solid var(--border);
655
+ border-radius: var(--radius);
656
+ overflow-x: auto;
657
+ white-space: pre;
658
+ }
659
+
660
+ .results-panel.collapsed { display: none; }
661
+
662
+ /* Responsive */
663
+ @media (max-width: 768px) {
664
+ .isa-toolbar {
665
+ flex-direction: column;
666
+ align-items: stretch;
667
+ }
668
+ .isa-presets {
669
+ justify-content: flex-start;
670
+ }
671
+ .isa-group {
672
+ grid-template-columns: 1fr;
673
+ }
674
+ .layout {
675
+ grid-template-columns: 1fr;
676
+ grid-template-rows: 300px 1fr;
677
+ }
678
+ .results-panel { border-right: none; border-bottom: 1px solid var(--border); }
679
+ .kv { grid-template-columns: 1fr; gap: 0.15rem; }
680
+ }