bfg-common 1.3.591 → 1.3.593
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/assets/localization/local_be.json +82 -69
- package/assets/localization/local_en.json +82 -69
- package/assets/localization/local_hy.json +82 -69
- package/assets/localization/local_kk.json +82 -69
- package/assets/localization/local_ru.json +85 -69
- package/assets/localization/local_zh.json +82 -69
- package/components/atoms/TheIcon2.vue +1366 -1366
- package/components/atoms/table/dataGrid/DataGridPagination.vue +1 -1
- package/components/common/browse/Browse.vue +240 -240
- package/components/common/browse/blocks/Title.vue +91 -91
- package/components/common/browse/blocks/info/Date.vue +21 -21
- package/components/common/context/recursion/Recursion.vue +86 -86
- package/components/common/context/recursion/RecursionNew.vue +198 -198
- package/components/common/context/recursion/RecursionOld.vue +212 -212
- package/components/common/layout/theHeader/TheHeaderNew.vue +4 -5
- package/components/common/layout/theHeader/feedback/Feedback.vue +1 -1
- package/components/common/layout/theHeader/helpMenu/helpMenuNew/HelpMenuNew.vue +2 -37
- package/components/common/layout/theHeader/helpMenu/helpMenuNew/lib/config/dropMenu.ts +1 -4
- package/components/common/layout/theHeader/helpMenu/helpMenuOld/lib/config/dropMenu.ts +1 -1
- package/components/common/layout/theHeader/userMenu/modals/preferences/inventory/InventoryNew.vue +1 -1
- package/components/common/layout/theHeader/userMenu/modals/preferences/lib/config/preferencesTabs.ts +1 -1
- package/components/common/layout/theHeader/userMenu/userMenuNew/UserMenuNew.vue +2 -9
- package/components/common/monitor/advanced/Advanced.vue +4 -7
- package/components/common/monitor/advanced/tools/Tools.vue +4 -7
- package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +4 -19
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +2 -3
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +2 -3
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +12 -34
- package/components/common/pages/hardwareHealth/tableView/lib/config/systemLogTable.ts +1 -1
- package/components/common/shortcuts/Shortcuts.vue +1 -1
- package/components/common/split/horizontal/HorizontalNew.vue +321 -321
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +1 -1
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/CpuModel.vue +2 -2
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Hv.vue +1 -1
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Sa.vue +1 -1
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/tooltip/Tooltip.vue +1 -1
- package/components/common/wizards/datastore/add/Add.vue +437 -437
- package/components/common/wizards/datastore/add/nfs/configuration/Configuration.vue +2 -2
- package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +95 -95
- package/composables/productNameLocal.ts +41 -22
- package/lib/models/interfaces.ts +10 -3
- package/lib/models/types.ts +30 -13
- package/lib/utils/sendTask.ts +1 -1
- package/package.json +1 -1
- package/plugins/recursion.ts +293 -293
- package/store/tasks/mappers/recentTasks.ts +45 -45
|
@@ -97,7 +97,6 @@
|
|
|
97
97
|
:language="props.language"
|
|
98
98
|
:selected-counters-keys="props.selectedCountersKeys"
|
|
99
99
|
:selected-metric="props.selectedMetric"
|
|
100
|
-
:selected-metric-local="props.selectedMetricLocal"
|
|
101
100
|
:selected-chart-type="props.selectedChartType"
|
|
102
101
|
:selected-timespan-type="props.selectedTimespanType"
|
|
103
102
|
:units-count="props.unitsCount"
|
|
@@ -113,10 +112,9 @@
|
|
|
113
112
|
:selected-objects="props.selectedObjects"
|
|
114
113
|
:project="props.project"
|
|
115
114
|
:objects-loading="props.objectsLoading"
|
|
116
|
-
:objects-data="props.objectsData"
|
|
117
115
|
@hide="isShowModal = false"
|
|
118
116
|
@select-row="emits('select-row', $event)"
|
|
119
|
-
@select-metric
|
|
117
|
+
@select-metric="emits('select-metric', $event)"
|
|
120
118
|
@update-chart-type="emits('update-chart-type', $event)"
|
|
121
119
|
@update-timespan-type="emits('update-timespan-type', $event)"
|
|
122
120
|
@update-unit-count="emits('update-unit-count', $event)"
|
|
@@ -129,6 +127,7 @@
|
|
|
129
127
|
@update-custom-time-from="emits('update-custom-time-from', $event)"
|
|
130
128
|
@update-custom-time-to="emits('update-custom-time-to', $event)"
|
|
131
129
|
@submit-options="emits('submit-options', $event)"
|
|
130
|
+
@update-cores="emits('update-cores')"
|
|
132
131
|
/>
|
|
133
132
|
</template>
|
|
134
133
|
|
|
@@ -144,7 +143,6 @@ import type {
|
|
|
144
143
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/models/types'
|
|
145
144
|
import type { UI_I_OptionsForm } from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/models/interfaces'
|
|
146
145
|
import type { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/models/interfaces'
|
|
147
|
-
import type { UI_I_ObjectItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/models/interfaces'
|
|
148
146
|
import type { UI_T_Project } from '~/lib/models/types'
|
|
149
147
|
import { getValidDateByOptionFunc } from '~/components/common/monitor/lib/config/getValidDateByOption'
|
|
150
148
|
import {
|
|
@@ -162,7 +160,6 @@ const props = defineProps<{
|
|
|
162
160
|
language: string
|
|
163
161
|
selectedCountersKeys: number[]
|
|
164
162
|
selectedMetric: UI_T_ChartHost | UI_T_ChartVm
|
|
165
|
-
selectedMetricLocal: UI_T_ChartHost | UI_T_ChartVm
|
|
166
163
|
selectedChartType: string
|
|
167
164
|
selectedTimespanType: string
|
|
168
165
|
unitsCount: number
|
|
@@ -178,7 +175,6 @@ const props = defineProps<{
|
|
|
178
175
|
selectedObjects: string
|
|
179
176
|
project: UI_T_Project
|
|
180
177
|
objectsLoading: boolean
|
|
181
|
-
objectsData: UI_I_ObjectItem[]
|
|
182
178
|
disabledPeriod?: boolean
|
|
183
179
|
disabledView?: boolean
|
|
184
180
|
}>()
|
|
@@ -188,7 +184,7 @@ const emits = defineEmits<{
|
|
|
188
184
|
(event: 'exporting', value: string): void
|
|
189
185
|
(event: 'open-advanced-page'): void
|
|
190
186
|
(event: 'select-row', value: UI_I_AdvancedCounterItem[]): void
|
|
191
|
-
(event: 'select-metric
|
|
187
|
+
(event: 'select-metric', value: string): void
|
|
192
188
|
(event: 'update-chart-type', value: string): void
|
|
193
189
|
(event: 'update-timespan-type', value: string): void
|
|
194
190
|
(event: 'update-unit-count', value: number): void
|
|
@@ -201,6 +197,7 @@ const emits = defineEmits<{
|
|
|
201
197
|
(event: 'update-custom-time-to', value: string): void
|
|
202
198
|
(event: 'submit-options', value: UI_I_OptionsForm): void
|
|
203
199
|
(event: 'update:selected-timespan-type', value: string): void
|
|
200
|
+
(event: 'update-cores'): void
|
|
204
201
|
}>()
|
|
205
202
|
|
|
206
203
|
const routeType = '' + useRoute().params.type
|
|
@@ -49,7 +49,6 @@
|
|
|
49
49
|
:selected-metrics-keys="selectedMetricsKeys"
|
|
50
50
|
:selected-objects="props.selectedObjects"
|
|
51
51
|
:objects-loading="props.objectsLoading"
|
|
52
|
-
:objects-data="props.objectsData"
|
|
53
52
|
@select-row="selectedRows = $event"
|
|
54
53
|
@update-chart-type="selectedChartTypeLocal = $event"
|
|
55
54
|
@update-custom-time="localCustomTime = $event"
|
|
@@ -61,6 +60,7 @@
|
|
|
61
60
|
@update-custom-time-from="onUpdateCustomTimeFrom"
|
|
62
61
|
@update-custom-time-to="onUpdateCustomTimeTo"
|
|
63
62
|
@select-objects="localSelectedObjects = $event"
|
|
63
|
+
@update-cores="emits('update-cores')"
|
|
64
64
|
/>
|
|
65
65
|
</div>
|
|
66
66
|
</div>
|
|
@@ -79,7 +79,6 @@ import type {
|
|
|
79
79
|
UI_T_ChartVm,
|
|
80
80
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/models/types'
|
|
81
81
|
import type { UI_I_OptionsForm } from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/models/interfaces'
|
|
82
|
-
import type { UI_I_ObjectItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/models/interfaces'
|
|
83
82
|
import type { UI_T_Project } from '~/lib/models/types'
|
|
84
83
|
import { metricsFunc } from '~/components/common/monitor/advanced/tools/chartOptionsModal/metrics/lib/config/optionsMetrics'
|
|
85
84
|
import { getCurrentOptionsStorageFunc } from '~/components/common/monitor/advanced/tools/lib/config/advancedToolbar'
|
|
@@ -92,7 +91,6 @@ const props = defineProps<{
|
|
|
92
91
|
language: string
|
|
93
92
|
selectedCountersKeys: number[]
|
|
94
93
|
selectedMetric: UI_T_ChartHost | UI_T_ChartVm
|
|
95
|
-
selectedMetricLocal: UI_T_ChartHost | UI_T_ChartVm
|
|
96
94
|
selectedChartType: string
|
|
97
95
|
selectedTimespanType: string
|
|
98
96
|
unitsCount: number
|
|
@@ -108,13 +106,12 @@ const props = defineProps<{
|
|
|
108
106
|
selectedObjects: string
|
|
109
107
|
project: UI_T_Project
|
|
110
108
|
objectsLoading: boolean
|
|
111
|
-
objectsData: UI_I_ObjectItem[]
|
|
112
109
|
}>()
|
|
113
110
|
|
|
114
111
|
const emits = defineEmits<{
|
|
115
112
|
(event: 'hide'): void
|
|
116
113
|
(event: 'select-row', value: UI_I_AdvancedCounterItem[]): void
|
|
117
|
-
(event: 'select-metric
|
|
114
|
+
(event: 'select-metric', value: string): void
|
|
118
115
|
(event: 'update-chart-type', value: string): void
|
|
119
116
|
(event: 'update-timespan-type', value: string): void
|
|
120
117
|
(event: 'update-unit-count', value: number): void
|
|
@@ -128,6 +125,7 @@ const emits = defineEmits<{
|
|
|
128
125
|
(event: 'update-custom-time-to', value: string): void
|
|
129
126
|
(event: 'submit-options', value: UI_I_OptionsForm): void
|
|
130
127
|
(event: 'select-objects', value: string): void
|
|
128
|
+
(event: 'update-cores'): void
|
|
131
129
|
}>()
|
|
132
130
|
|
|
133
131
|
const routeType = '' + useRoute().params.type
|
|
@@ -239,12 +237,7 @@ const checkValidations = (): boolean => {
|
|
|
239
237
|
localCustomTimeTo.value
|
|
240
238
|
)
|
|
241
239
|
|
|
242
|
-
if (
|
|
243
|
-
(!selectedRows.value.length &&
|
|
244
|
-
!['disk', 'network'].includes(props.selectedMetricLocal)) ||
|
|
245
|
-
(!localSelectedObjects.value &&
|
|
246
|
-
['disk', 'network'].includes(props.selectedMetricLocal))
|
|
247
|
-
) {
|
|
240
|
+
if (!selectedRows.value.length) {
|
|
248
241
|
alerts.value = [localization.value.noCountersSelected]
|
|
249
242
|
isShowAlerts.value = true
|
|
250
243
|
return false
|
|
@@ -475,14 +468,6 @@ const isDisabledSubmit = computed<boolean>(() =>
|
|
|
475
468
|
)
|
|
476
469
|
)
|
|
477
470
|
|
|
478
|
-
watch(
|
|
479
|
-
selectedMetric,
|
|
480
|
-
(newValue) => {
|
|
481
|
-
emits('select-metric-local', newValue)
|
|
482
|
-
},
|
|
483
|
-
{ immediate: true }
|
|
484
|
-
)
|
|
485
|
-
|
|
486
471
|
onMounted(() => {
|
|
487
472
|
optionsNames.value = getCurrentOptionsStorageFunc(routeType, props.project)
|
|
488
473
|
})
|
|
@@ -27,7 +27,6 @@
|
|
|
27
27
|
:total-metric-items="totalMetricItems"
|
|
28
28
|
:selected-objects="props.selectedObjects"
|
|
29
29
|
:objects-loading="props.objectsLoading"
|
|
30
|
-
:objects-data="props.objectsData"
|
|
31
30
|
@update-chart-type="emits('update-chart-type', $event)"
|
|
32
31
|
@update-custom-time="emits('update-custom-time', $event)"
|
|
33
32
|
@update-timespan-type="emits('update-timespan-type', $event)"
|
|
@@ -38,6 +37,7 @@
|
|
|
38
37
|
@update-custom-time-from="emits('update-custom-time-from', $event)"
|
|
39
38
|
@update-custom-time-to="emits('update-custom-time-to', $event)"
|
|
40
39
|
@select-objects="emits('select-objects', $event)"
|
|
40
|
+
@update-cores="emits('update-cores')"
|
|
41
41
|
/>
|
|
42
42
|
</div>
|
|
43
43
|
</template>
|
|
@@ -49,7 +49,6 @@ import type {
|
|
|
49
49
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/models/types'
|
|
50
50
|
import type { UI_T_AdvancedType } from '~/components/common/monitor/advanced/lib/models/types'
|
|
51
51
|
import type { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/models/interfaces'
|
|
52
|
-
import type { UI_I_ObjectItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/models/interfaces'
|
|
53
52
|
|
|
54
53
|
const props = defineProps<{
|
|
55
54
|
language: string
|
|
@@ -70,7 +69,6 @@ const props = defineProps<{
|
|
|
70
69
|
selectedMetricsKeys: number[]
|
|
71
70
|
selectedObjects: string
|
|
72
71
|
objectsLoading: boolean
|
|
73
|
-
objectsData: UI_I_ObjectItem[]
|
|
74
72
|
}>()
|
|
75
73
|
|
|
76
74
|
const emits = defineEmits<{
|
|
@@ -85,6 +83,7 @@ const emits = defineEmits<{
|
|
|
85
83
|
(event: 'update-custom-time-from', value: string): void
|
|
86
84
|
(event: 'update-custom-time-to', value: string): void
|
|
87
85
|
(event: 'select-objects', value: string): void
|
|
86
|
+
(event: 'update-cores'): void
|
|
88
87
|
}>()
|
|
89
88
|
|
|
90
89
|
const totalMetricItems = ref<number>(0)
|
package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue
CHANGED
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
:total-metric-items="props.totalMetricItems"
|
|
31
31
|
:selected-objects="props.selectedObjects"
|
|
32
32
|
:loading="props.objectsLoading"
|
|
33
|
-
:current-items="props.objectsData"
|
|
34
33
|
@select-objects="emits('select-objects', $event)"
|
|
34
|
+
@update-cores="emits('update-cores')"
|
|
35
35
|
/>
|
|
36
36
|
</div>
|
|
37
37
|
</template>
|
|
@@ -42,7 +42,6 @@ import type {
|
|
|
42
42
|
UI_T_ChartHost,
|
|
43
43
|
UI_T_ChartVm,
|
|
44
44
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/lib/models/types'
|
|
45
|
-
import type { UI_I_ObjectItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/models/interfaces'
|
|
46
45
|
|
|
47
46
|
const props = defineProps<{
|
|
48
47
|
type: UI_T_AdvancedType
|
|
@@ -63,7 +62,6 @@ const props = defineProps<{
|
|
|
63
62
|
totalMetricItems: number
|
|
64
63
|
selectedObjects: string
|
|
65
64
|
objectsLoading: boolean
|
|
66
|
-
objectsData: UI_I_ObjectItem[]
|
|
67
65
|
}>()
|
|
68
66
|
|
|
69
67
|
const emits = defineEmits<{
|
|
@@ -78,6 +76,7 @@ const emits = defineEmits<{
|
|
|
78
76
|
(event: 'update-custom-time-from', value: string): void
|
|
79
77
|
(event: 'update-custom-time-to', value: string): void
|
|
80
78
|
(event: 'select-objects', value: string): void
|
|
79
|
+
(event: 'update-cores'): void
|
|
81
80
|
}>()
|
|
82
81
|
</script>
|
|
83
82
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
v-model:column-keys="columnItems"
|
|
11
11
|
v-model:page-size="pagination.pageSize"
|
|
12
12
|
v-model:page="pagination.page"
|
|
13
|
-
|
|
13
|
+
type="checkbox"
|
|
14
14
|
class="data-table"
|
|
15
15
|
test-id="object-table"
|
|
16
16
|
:loading="props.loading"
|
|
@@ -35,9 +35,7 @@ import type {
|
|
|
35
35
|
} from '~/components/atoms/table/dataGrid/lib/models/interfaces'
|
|
36
36
|
import type { UI_I_Localization } from '~/lib/models/interfaces'
|
|
37
37
|
import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
|
|
38
|
-
import type { UI_T_DataGridType } from '~/components/atoms/table/dataGrid/lib/models/types'
|
|
39
38
|
import type { UI_I_AdvancedTargetObject } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/models/interfaces'
|
|
40
|
-
import type { UI_I_ObjectItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/models/interfaces'
|
|
41
39
|
import * as table from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/lib/config/objectTable'
|
|
42
40
|
import type { UI_T_AdvancedType } from '~/components/common/monitor/advanced/lib/models/types'
|
|
43
41
|
import type {
|
|
@@ -54,20 +52,16 @@ const props = defineProps<{
|
|
|
54
52
|
totalMetricItems: number
|
|
55
53
|
selectedObjects: string
|
|
56
54
|
loading: boolean
|
|
57
|
-
currentItems: UI_I_ObjectItem[]
|
|
58
55
|
}>()
|
|
59
56
|
|
|
60
57
|
const emits = defineEmits<{
|
|
61
58
|
(event: 'select-objects', value: string): void
|
|
59
|
+
(event: 'update-cores'): void
|
|
62
60
|
}>()
|
|
63
61
|
|
|
64
62
|
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
65
63
|
|
|
66
|
-
const
|
|
67
|
-
['disk', 'network'].includes(props.chart) ? 'radio' : 'checkbox'
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
const selectedRow = ref<number[] | number>([])
|
|
64
|
+
const selectedRow = ref<number[]>([])
|
|
71
65
|
const pagination = ref<UI_I_Pagination>({
|
|
72
66
|
page: 1,
|
|
73
67
|
pageSize: 35,
|
|
@@ -107,7 +101,6 @@ watch(
|
|
|
107
101
|
props.totalCores,
|
|
108
102
|
props.hostId,
|
|
109
103
|
props.selectedMetricsKeys,
|
|
110
|
-
props.currentItems,
|
|
111
104
|
],
|
|
112
105
|
(newValue) => {
|
|
113
106
|
items = []
|
|
@@ -148,16 +141,10 @@ watch(
|
|
|
148
141
|
target_object: 'averageMHz',
|
|
149
142
|
})
|
|
150
143
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
['disk', 'network'].includes(newValue[1])
|
|
154
|
-
) {
|
|
155
|
-
items = props.currentItems
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
bodyItems.value = table.bodyItems(items)
|
|
144
|
+
bodyItems.value = table.bodyItems(items)
|
|
145
|
+
} else bodyItems.value = []
|
|
159
146
|
},
|
|
160
|
-
{ immediate: true
|
|
147
|
+
{ immediate: true }
|
|
161
148
|
)
|
|
162
149
|
|
|
163
150
|
watch(
|
|
@@ -165,12 +152,9 @@ watch(
|
|
|
165
152
|
(newValue) => {
|
|
166
153
|
const selectedItems: string[] = []
|
|
167
154
|
|
|
168
|
-
|
|
169
|
-
selectedItems.push(items[
|
|
170
|
-
}
|
|
171
|
-
newValue.forEach((key) => {
|
|
172
|
-
selectedItems.push(items[key].id)
|
|
173
|
-
})
|
|
155
|
+
newValue.forEach((key) => {
|
|
156
|
+
selectedItems.push(items[key].id)
|
|
157
|
+
})
|
|
174
158
|
|
|
175
159
|
const selectedNames =
|
|
176
160
|
items.length === newValue.length &&
|
|
@@ -201,19 +185,13 @@ watch(
|
|
|
201
185
|
})
|
|
202
186
|
selectedRow.value = selectedKeys
|
|
203
187
|
}
|
|
204
|
-
} else if (
|
|
205
|
-
props.type === 'host' &&
|
|
206
|
-
['disk', 'network'].includes(props.chart)
|
|
207
|
-
) {
|
|
208
|
-
if (selected) {
|
|
209
|
-
const selectedId = all.find((item) => item[0].text === selected)?.[0]
|
|
210
|
-
?.id
|
|
211
|
-
typeof selectedId === 'number' && (selectedRow.value = selectedId)
|
|
212
|
-
}
|
|
213
188
|
}
|
|
214
189
|
},
|
|
215
190
|
{ immediate: true }
|
|
216
191
|
)
|
|
192
|
+
onMounted(() => {
|
|
193
|
+
emits('update-cores')
|
|
194
|
+
})
|
|
217
195
|
</script>
|
|
218
196
|
|
|
219
197
|
<style scoped lang="scss">
|
|
@@ -16,7 +16,7 @@ const getItems = (
|
|
|
16
16
|
): [string, boolean, string, string][] => {
|
|
17
17
|
return [
|
|
18
18
|
[localization.time, true, '50%', hardwareHealthSystemLogTableKeys[0]],
|
|
19
|
-
[localization.events, true, '50%', hardwareHealthSystemLogTableKeys[1]],
|
|
19
|
+
[localization.mainNavigation.events, true, '50%', hardwareHealthSystemLogTableKeys[1]],
|
|
20
20
|
]
|
|
21
21
|
}
|
|
22
22
|
export const columnKeys = (
|