@genspectrum/dashboard-components 0.17.0 → 0.18.0
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.
- package/custom-elements.json +47 -16
- package/dist/components.d.ts +21 -17
- package/dist/components.js +426 -3654
- package/dist/components.js.map +1 -1
- package/dist/style.css +2 -3375
- package/dist/util.d.ts +15 -15
- package/package.json +6 -5
- package/src/preact/aggregatedData/aggregate.tsx +3 -3
- package/src/preact/components/clearable-select.tsx +1 -1
- package/src/preact/components/color-scale-selector-dropdown.tsx +1 -1
- package/src/preact/components/confidence-interval-selector.tsx +1 -1
- package/src/preact/components/downshift-combobox.tsx +3 -3
- package/src/preact/components/fullscreen.tsx +6 -2
- package/src/preact/components/info.tsx +1 -1
- package/src/preact/components/mutation-type-selector.tsx +1 -1
- package/src/preact/components/percent-intput.tsx +3 -3
- package/src/preact/components/proportion-selector-dropdown.tsx +1 -1
- package/src/preact/components/scaling-selector.tsx +1 -1
- package/src/preact/components/select.tsx +1 -1
- package/src/preact/components/tabs.tsx +1 -1
- package/src/preact/dateRangeFilter/date-picker.tsx +1 -1
- package/src/preact/dateRangeFilter/date-range-filter.tsx +4 -4
- package/src/preact/mutationComparison/mutation-comparison.tsx +1 -1
- package/src/preact/mutations/mutations.tsx +2 -2
- package/src/preact/mutationsOverTime/mutations-over-time-grid.tsx +133 -84
- package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +46 -16
- package/src/preact/mutationsOverTime/mutations-over-time.tsx +4 -1
- package/src/preact/numberSequencesOverTime/number-sequences-over-time.tsx +1 -1
- package/src/preact/prevalenceOverTime/prevalence-over-time.tsx +1 -1
- package/src/preact/sequencesByLocation/sequences-by-location-map.tsx +1 -1
- package/src/preact/sequencesByLocation/sequences-by-location.tsx +3 -7
- package/src/preact/shared/tanstackTable/pagination.tsx +132 -0
- package/src/preact/shared/tanstackTable/tanstackTable.tsx +43 -0
- package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.stories.tsx +2 -1
- package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.tsx +3 -5
- package/src/styles/tailwind.css +14 -3
- package/src/web-components/input/gs-date-range-filter.stories.ts +2 -2
- package/src/web-components/input/gs-lineage-filter.stories.ts +1 -1
- package/src/web-components/input/gs-location-filter.stories.ts +1 -1
- package/src/web-components/input/gs-mutation-filter.stories.ts +1 -1
- package/src/web-components/input/gs-text-filter.stories.ts +1 -1
- package/src/web-components/visualization/gs-mutations-over-time.spec-d.ts +39 -0
- package/src/web-components/visualization/gs-mutations-over-time.stories.ts +4 -0
- package/src/web-components/visualization/gs-mutations-over-time.tsx +8 -31
- package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.spec-d.ts +24 -0
- package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.stories.ts +3 -3
- package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.tsx +5 -36
- package/standalone-bundle/dashboard-components.js +17318 -15507
- package/standalone-bundle/dashboard-components.js.map +1 -1
- package/standalone-bundle/style.css +1 -1
package/custom-elements.json
CHANGED
|
@@ -345,7 +345,7 @@
|
|
|
345
345
|
"type": {
|
|
346
346
|
"text": "StoryObj<Required<DateRangeFilterProps>>"
|
|
347
347
|
},
|
|
348
|
-
"default": "{ render: (args) => html` <gs-app lapis=\"${LAPIS_URL}\"> <div class=\"max-w-
|
|
348
|
+
"default": "{ render: (args) => html` <gs-app lapis=\"${LAPIS_URL}\"> <div class=\"max-w-(--breakpoint-lg)\"> <gs-date-range-filter .dateRangeOptions=${args.dateRangeOptions} .earliestDate=${args.earliestDate} .value=${args.value} .width=${args.width} .lapisDateField=${args.lapisDateField} .placeholder=${args.placeholder} ></gs-date-range-filter> </div> </gs-app>`, }"
|
|
349
349
|
},
|
|
350
350
|
{
|
|
351
351
|
"kind": "variable",
|
|
@@ -353,7 +353,7 @@
|
|
|
353
353
|
"type": {
|
|
354
354
|
"text": "StoryObj<Required<DateRangeFilterProps>>"
|
|
355
355
|
},
|
|
356
|
-
"default": "{ render: (args) => html` <gs-app lapis=\"${LAPIS_URL}\"> <div class=\"max-w-
|
|
356
|
+
"default": "{ render: (args) => html` <gs-app lapis=\"${LAPIS_URL}\"> <div class=\"max-w-(--breakpoint-lg)\"> <gs-date-range-filter .dateRangeOptions=${args.dateRangeOptions} earliestDate=\"${args.earliestDate}\" value=\"${args.value}\" width=\"${args.width}\" lapisDateField=\"${args.lapisDateField}\" placeholder=\"${args.placeholder}\" ></gs-date-range-filter> </div> </gs-app>`, play: async ({ canvasElement }) => { await waitFor(async () => { const canvas = await withinShadowRoot(canvasElement, 'gs-date-range-filter'); const placeholderOption = canvas.getByRole('combobox').querySelector('option:checked'); await expect(placeholderOption).toHaveTextContent('Last month'); }); }, argTypes: { value: { control: { type: 'text', }, }, }, }"
|
|
357
357
|
},
|
|
358
358
|
{
|
|
359
359
|
"kind": "variable",
|
|
@@ -1222,7 +1222,7 @@
|
|
|
1222
1222
|
"type": {
|
|
1223
1223
|
"text": "StoryObj<Required<TextFilterProps>>"
|
|
1224
1224
|
},
|
|
1225
|
-
"default": "{ render: (args) => { return html` <gs-app lapis=\"${LAPIS_URL}\"> <div class=\"max-w-
|
|
1225
|
+
"default": "{ render: (args) => { return html` <gs-app lapis=\"${LAPIS_URL}\"> <div class=\"max-w-(--breakpoint-lg)\"> <gs-text-filter .lapisField=${args.lapisField} .lapisFilter=${args.lapisFilter} .placeholderText=${args.placeholderText} .value=${args.value} .width=${args.width} ></gs-text-filter> </div> </gs-app>`; }, args: { lapisField: 'host', lapisFilter: { country: 'Germany' }, placeholderText: 'Enter host name', value: 'Homo sapiens', width: '100%', }, }"
|
|
1226
1226
|
},
|
|
1227
1227
|
{
|
|
1228
1228
|
"kind": "variable",
|
|
@@ -2063,6 +2063,12 @@
|
|
|
2063
2063
|
}
|
|
2064
2064
|
]
|
|
2065
2065
|
},
|
|
2066
|
+
{
|
|
2067
|
+
"kind": "javascript-module",
|
|
2068
|
+
"path": "src/web-components/visualization/gs-mutations-over-time.spec-d.ts",
|
|
2069
|
+
"declarations": [],
|
|
2070
|
+
"exports": []
|
|
2071
|
+
},
|
|
2066
2072
|
{
|
|
2067
2073
|
"kind": "javascript-module",
|
|
2068
2074
|
"path": "src/web-components/visualization/gs-mutations-over-time.stories.ts",
|
|
@@ -2073,7 +2079,7 @@
|
|
|
2073
2079
|
"type": {
|
|
2074
2080
|
"text": "Meta<Required<MutationsOverTimeProps>>"
|
|
2075
2081
|
},
|
|
2076
|
-
"default": "{ title: 'Visualization/Mutations over time', component: 'gs-mutations-over-time', argTypes: { lapisFilter: { control: 'object' }, sequenceType: { options: ['nucleotide', 'amino acid'], control: { type: 'radio' }, }, views: { options: ['grid'], control: { type: 'check' }, }, width: { control: 'text' }, height: { control: 'text' }, granularity: { options: ['day', 'week', 'month', 'year'], control: { type: 'radio' }, }, lapisDateField: { control: 'text' }, displayMutations: { control: 'object' }, initialMeanProportionInterval: { control: 'object' }, }, args: { lapisFilter: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-07-10' }, sequenceType: 'nucleotide', views: ['grid'], width: '100%', granularity: 'month', lapisDateField: 'date', initialMeanProportionInterval: { min: 0.05, max: 0.9 }, }, parameters: withComponentDocs({ componentDocs: { opensShadowDom: true, expectsChildren: false, codeExample, }, fetchMock: {}, }), tags: ['autodocs'], }"
|
|
2082
|
+
"default": "{ title: 'Visualization/Mutations over time', component: 'gs-mutations-over-time', argTypes: { lapisFilter: { control: 'object' }, sequenceType: { options: ['nucleotide', 'amino acid'], control: { type: 'radio' }, }, views: { options: ['grid'], control: { type: 'check' }, }, width: { control: 'text' }, height: { control: 'text' }, granularity: { options: ['day', 'week', 'month', 'year'], control: { type: 'radio' }, }, lapisDateField: { control: 'text' }, displayMutations: { control: 'object' }, initialMeanProportionInterval: { control: 'object' }, pageSizes: { control: 'object' }, }, args: { lapisFilter: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-07-10' }, sequenceType: 'nucleotide', views: ['grid'], width: '100%', granularity: 'month', lapisDateField: 'date', initialMeanProportionInterval: { min: 0.05, max: 0.9 }, pageSizes: [10, 20, 30, 40, 50], }, parameters: withComponentDocs({ componentDocs: { opensShadowDom: true, expectsChildren: false, codeExample, }, fetchMock: {}, }), tags: ['autodocs'], }"
|
|
2077
2083
|
},
|
|
2078
2084
|
{
|
|
2079
2085
|
"kind": "variable",
|
|
@@ -2281,6 +2287,16 @@
|
|
|
2281
2287
|
"default": "{ min: 0.05, max: 0.9 }",
|
|
2282
2288
|
"description": "The initial proportion interval for the grid view.\nThe values must be between 0 and 1, inclusive.",
|
|
2283
2289
|
"attribute": "initialMeanProportionInterval"
|
|
2290
|
+
},
|
|
2291
|
+
{
|
|
2292
|
+
"kind": "field",
|
|
2293
|
+
"name": "pageSizes",
|
|
2294
|
+
"type": {
|
|
2295
|
+
"text": "number[] | number"
|
|
2296
|
+
},
|
|
2297
|
+
"default": "[10, 20, 30, 40, 50]",
|
|
2298
|
+
"description": "The number of rows per page, which can be selected by the user.",
|
|
2299
|
+
"attribute": "pageSizes"
|
|
2284
2300
|
}
|
|
2285
2301
|
],
|
|
2286
2302
|
"attributes": [
|
|
@@ -2364,6 +2380,15 @@
|
|
|
2364
2380
|
"default": "{ min: 0.05, max: 0.9 }",
|
|
2365
2381
|
"description": "The initial proportion interval for the grid view.\nThe values must be between 0 and 1, inclusive.",
|
|
2366
2382
|
"fieldName": "initialMeanProportionInterval"
|
|
2383
|
+
},
|
|
2384
|
+
{
|
|
2385
|
+
"name": "pageSizes",
|
|
2386
|
+
"type": {
|
|
2387
|
+
"text": "number[] | number"
|
|
2388
|
+
},
|
|
2389
|
+
"default": "[10, 20, 30, 40, 50]",
|
|
2390
|
+
"description": "The number of rows per page, which can be selected by the user.",
|
|
2391
|
+
"fieldName": "pageSizes"
|
|
2367
2392
|
}
|
|
2368
2393
|
],
|
|
2369
2394
|
"superclass": {
|
|
@@ -4219,6 +4244,12 @@
|
|
|
4219
4244
|
}
|
|
4220
4245
|
]
|
|
4221
4246
|
},
|
|
4247
|
+
{
|
|
4248
|
+
"kind": "javascript-module",
|
|
4249
|
+
"path": "src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.spec-d.ts",
|
|
4250
|
+
"declarations": [],
|
|
4251
|
+
"exports": []
|
|
4252
|
+
},
|
|
4222
4253
|
{
|
|
4223
4254
|
"kind": "javascript-module",
|
|
4224
4255
|
"path": "src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.stories.ts",
|
|
@@ -4229,7 +4260,7 @@
|
|
|
4229
4260
|
"type": {
|
|
4230
4261
|
"text": "Meta<WastewaterMutationsOverTimeProps & { infoText: string }>"
|
|
4231
4262
|
},
|
|
4232
|
-
"default": "{ title: 'Wastewater visualization/Wastewater mutations over time', component: 'gs-wastewater-mutations-over-time', argTypes: { lapisFilter: { control: 'object' }, sequenceType: { options: ['nucleotide', 'amino acid'], control: { type: 'radio' }, }, width: { control: 'text' }, height: { control: 'text' }, }, args: { lapisFilter: { versionStatus: 'LATEST_VERSION', isRevocation: false }, sequenceType: 'nucleotide', width: '100%', height: undefined, infoText: 'Some info text',
|
|
4263
|
+
"default": "{ title: 'Wastewater visualization/Wastewater mutations over time', component: 'gs-wastewater-mutations-over-time', argTypes: { lapisFilter: { control: 'object' }, sequenceType: { options: ['nucleotide', 'amino acid'], control: { type: 'radio' }, }, width: { control: 'text' }, height: { control: 'text' }, }, args: { lapisFilter: { versionStatus: 'LATEST_VERSION', isRevocation: false }, sequenceType: 'nucleotide', width: '100%', height: undefined, infoText: 'Some info text', pageSizes: [10, 20, 30, 40, 50], }, parameters: withComponentDocs({ componentDocs: { opensShadowDom: true, expectsChildren: false, codeExample, }, fetchMock: {}, }), tags: ['autodocs'], }"
|
|
4233
4264
|
},
|
|
4234
4265
|
{
|
|
4235
4266
|
"kind": "variable",
|
|
@@ -4237,7 +4268,7 @@
|
|
|
4237
4268
|
"type": {
|
|
4238
4269
|
"text": "StoryObj<WastewaterMutationsOverTimeProps & { infoText: string }>"
|
|
4239
4270
|
},
|
|
4240
|
-
"default": "{ render: (args) => html` <gs-app lapis=\"${WISE_LAPIS_URL}\" .mutationAnnotations=${mutationAnnotations}> <gs-wastewater-mutations-over-time .lapisFilter=${args.lapisFilter} .sequenceType=${args.sequenceType} .width=${args.width} .height=${args.height} .
|
|
4271
|
+
"default": "{ render: (args) => html` <gs-app lapis=\"${WISE_LAPIS_URL}\" .mutationAnnotations=${mutationAnnotations}> <gs-wastewater-mutations-over-time .lapisFilter=${args.lapisFilter} .sequenceType=${args.sequenceType} .width=${args.width} .height=${args.height} .pageSizes=${args.pageSizes} > <span slot=\"infoText\">${args.infoText}</span> </gs-wastewater-mutations-over-time> </gs-app> `, parameters: { fetchMock: { mocks: [ { matcher: { name: 'details', url: WISE_DETAILS_ENDPOINT, body: { fields: ['date', 'location', 'nucleotideMutationFrequency', 'aminoAcidMutationFrequency'], versionStatus: 'LATEST_VERSION', isRevocation: false, }, }, response: { status: 200, body: details, }, }, ], }, }, }"
|
|
4241
4272
|
},
|
|
4242
4273
|
{
|
|
4243
4274
|
"kind": "variable",
|
|
@@ -4332,13 +4363,13 @@
|
|
|
4332
4363
|
},
|
|
4333
4364
|
{
|
|
4334
4365
|
"kind": "field",
|
|
4335
|
-
"name": "
|
|
4366
|
+
"name": "pageSizes",
|
|
4336
4367
|
"type": {
|
|
4337
|
-
"text": "number"
|
|
4368
|
+
"text": "number[] | number"
|
|
4338
4369
|
},
|
|
4339
|
-
"default": "
|
|
4340
|
-
"description": "The
|
|
4341
|
-
"attribute": "
|
|
4370
|
+
"default": "[10, 20, 30, 40, 50]",
|
|
4371
|
+
"description": "The number of rows per page, which can be selected by the user.",
|
|
4372
|
+
"attribute": "pageSizes"
|
|
4342
4373
|
}
|
|
4343
4374
|
],
|
|
4344
4375
|
"attributes": [
|
|
@@ -4379,13 +4410,13 @@
|
|
|
4379
4410
|
"fieldName": "height"
|
|
4380
4411
|
},
|
|
4381
4412
|
{
|
|
4382
|
-
"name": "
|
|
4413
|
+
"name": "pageSizes",
|
|
4383
4414
|
"type": {
|
|
4384
|
-
"text": "number"
|
|
4415
|
+
"text": "number[] | number"
|
|
4385
4416
|
},
|
|
4386
|
-
"default": "
|
|
4387
|
-
"description": "The
|
|
4388
|
-
"fieldName": "
|
|
4417
|
+
"default": "[10, 20, 30, 40, 50]",
|
|
4418
|
+
"description": "The number of rows per page, which can be selected by the user.",
|
|
4419
|
+
"fieldName": "pageSizes"
|
|
4389
4420
|
}
|
|
4390
4421
|
],
|
|
4391
4422
|
"superclass": {
|
package/dist/components.d.ts
CHANGED
|
@@ -703,6 +703,10 @@ export declare class MutationsOverTimeComponent extends PreactLitAdapterWithGrid
|
|
|
703
703
|
min: number;
|
|
704
704
|
max: number;
|
|
705
705
|
};
|
|
706
|
+
/**
|
|
707
|
+
* The number of rows per page, which can be selected by the user.
|
|
708
|
+
*/
|
|
709
|
+
pageSizes: number[] | number;
|
|
706
710
|
/* Excluded from this release type: mutationAnnotations */
|
|
707
711
|
render(): JSX_2.Element;
|
|
708
712
|
}
|
|
@@ -1375,9 +1379,9 @@ export declare class WastewaterMutationsOverTimeComponent extends PreactLitAdapt
|
|
|
1375
1379
|
*/
|
|
1376
1380
|
height: string | undefined;
|
|
1377
1381
|
/**
|
|
1378
|
-
* The
|
|
1382
|
+
* The number of rows per page, which can be selected by the user.
|
|
1379
1383
|
*/
|
|
1380
|
-
|
|
1384
|
+
pageSizes: number[] | number;
|
|
1381
1385
|
/* Excluded from this release type: mutationAnnotations */
|
|
1382
1386
|
render(): JSX_2.Element;
|
|
1383
1387
|
}
|
|
@@ -1426,7 +1430,7 @@ declare global {
|
|
|
1426
1430
|
|
|
1427
1431
|
declare global {
|
|
1428
1432
|
interface HTMLElementTagNameMap {
|
|
1429
|
-
'gs-
|
|
1433
|
+
'gs-prevalence-over-time': PrevalenceOverTimeComponent;
|
|
1430
1434
|
}
|
|
1431
1435
|
}
|
|
1432
1436
|
|
|
@@ -1434,7 +1438,7 @@ declare global {
|
|
|
1434
1438
|
declare global {
|
|
1435
1439
|
namespace JSX {
|
|
1436
1440
|
interface IntrinsicElements {
|
|
1437
|
-
'gs-
|
|
1441
|
+
'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1438
1442
|
}
|
|
1439
1443
|
}
|
|
1440
1444
|
}
|
|
@@ -1442,7 +1446,7 @@ declare global {
|
|
|
1442
1446
|
|
|
1443
1447
|
declare global {
|
|
1444
1448
|
interface HTMLElementTagNameMap {
|
|
1445
|
-
'gs-
|
|
1449
|
+
'gs-mutations-component': MutationsComponent;
|
|
1446
1450
|
}
|
|
1447
1451
|
}
|
|
1448
1452
|
|
|
@@ -1450,7 +1454,7 @@ declare global {
|
|
|
1450
1454
|
declare global {
|
|
1451
1455
|
namespace JSX {
|
|
1452
1456
|
interface IntrinsicElements {
|
|
1453
|
-
'gs-
|
|
1457
|
+
'gs-mutations-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1454
1458
|
}
|
|
1455
1459
|
}
|
|
1456
1460
|
}
|
|
@@ -1554,11 +1558,7 @@ declare global {
|
|
|
1554
1558
|
|
|
1555
1559
|
declare global {
|
|
1556
1560
|
interface HTMLElementTagNameMap {
|
|
1557
|
-
'gs-
|
|
1558
|
-
}
|
|
1559
|
-
interface HTMLElementEventMap {
|
|
1560
|
-
'gs-date-range-filter-changed': CustomEvent<Record<string, string>>;
|
|
1561
|
-
'gs-date-range-option-changed': DateRangeOptionChangedEvent;
|
|
1561
|
+
'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
|
|
1562
1562
|
}
|
|
1563
1563
|
}
|
|
1564
1564
|
|
|
@@ -1566,7 +1566,7 @@ declare global {
|
|
|
1566
1566
|
declare global {
|
|
1567
1567
|
namespace JSX {
|
|
1568
1568
|
interface IntrinsicElements {
|
|
1569
|
-
'gs-
|
|
1569
|
+
'gs-wastewater-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1570
1570
|
}
|
|
1571
1571
|
}
|
|
1572
1572
|
}
|
|
@@ -1574,7 +1574,10 @@ declare global {
|
|
|
1574
1574
|
|
|
1575
1575
|
declare global {
|
|
1576
1576
|
interface HTMLElementTagNameMap {
|
|
1577
|
-
'gs-
|
|
1577
|
+
'gs-location-filter': LocationFilterComponent;
|
|
1578
|
+
}
|
|
1579
|
+
interface HTMLElementEventMap {
|
|
1580
|
+
'gs-location-changed': LocationChangedEvent;
|
|
1578
1581
|
}
|
|
1579
1582
|
}
|
|
1580
1583
|
|
|
@@ -1582,7 +1585,7 @@ declare global {
|
|
|
1582
1585
|
declare global {
|
|
1583
1586
|
namespace JSX {
|
|
1584
1587
|
interface IntrinsicElements {
|
|
1585
|
-
'gs-
|
|
1588
|
+
'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1586
1589
|
}
|
|
1587
1590
|
}
|
|
1588
1591
|
}
|
|
@@ -1590,10 +1593,11 @@ declare global {
|
|
|
1590
1593
|
|
|
1591
1594
|
declare global {
|
|
1592
1595
|
interface HTMLElementTagNameMap {
|
|
1593
|
-
'gs-
|
|
1596
|
+
'gs-date-range-filter': DateRangeFilterComponent;
|
|
1594
1597
|
}
|
|
1595
1598
|
interface HTMLElementEventMap {
|
|
1596
|
-
'gs-
|
|
1599
|
+
'gs-date-range-filter-changed': CustomEvent<Record<string, string>>;
|
|
1600
|
+
'gs-date-range-option-changed': DateRangeOptionChangedEvent;
|
|
1597
1601
|
}
|
|
1598
1602
|
}
|
|
1599
1603
|
|
|
@@ -1601,7 +1605,7 @@ declare global {
|
|
|
1601
1605
|
declare global {
|
|
1602
1606
|
namespace JSX {
|
|
1603
1607
|
interface IntrinsicElements {
|
|
1604
|
-
'gs-
|
|
1608
|
+
'gs-date-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
1605
1609
|
}
|
|
1606
1610
|
}
|
|
1607
1611
|
}
|