bromcom-ui 3.0.0-alpha.3 → 3.0.0-alpha.5
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/dist/bromcom-ui/bromcom-ui.css +1 -1
- package/dist/bromcom-ui/bromcom-ui.esm.js +1 -1
- package/dist/bromcom-ui/p-01eaca9a.entry.js +5 -0
- package/dist/bromcom-ui/{p-dc8b7bd5.entry.js → p-0b7de283.entry.js} +1 -1
- package/dist/bromcom-ui/{p-ff8adde6.entry.js → p-0e75f6ba.entry.js} +1 -1
- package/dist/bromcom-ui/{p-3a6e9576.entry.js → p-112b9a62.entry.js} +1 -1
- package/dist/bromcom-ui/{p-be96827e.js → p-1535f9b1.js} +1 -1
- package/dist/bromcom-ui/{p-ef839034.entry.js → p-32ce6cf6.entry.js} +1 -1
- package/dist/bromcom-ui/{p-33d97b3f.entry.js → p-33b2ed75.entry.js} +1 -1
- package/dist/bromcom-ui/p-3ddd3c83.entry.js +5 -0
- package/dist/bromcom-ui/{p-e115af8a.entry.js → p-4545a13d.entry.js} +1 -1
- package/dist/bromcom-ui/{p-f1de8ed5.entry.js → p-5532696c.entry.js} +1 -1
- package/dist/bromcom-ui/{p-f6e710ff.entry.js → p-69adb859.entry.js} +1 -1
- package/dist/bromcom-ui/{p-d0647951.js → p-6ce02d0a.js} +1 -1
- package/dist/bromcom-ui/p-7c08789d.entry.js +5 -0
- package/dist/bromcom-ui/{p-b7f449ff.entry.js → p-803739bc.entry.js} +1 -1
- package/dist/bromcom-ui/{p-3b988ad1.entry.js → p-8390dd02.entry.js} +1 -1
- package/dist/bromcom-ui/p-91197b04.js +5 -0
- package/dist/bromcom-ui/{p-b9b9d753.entry.js → p-a80e6310.entry.js} +1 -1
- package/dist/bromcom-ui/p-aa67918a.entry.js +5 -0
- package/dist/bromcom-ui/{p-91aa21af.entry.js → p-acab07ec.entry.js} +1 -1
- package/dist/bromcom-ui/{p-a53c3682.entry.js → p-b333a3d7.entry.js} +1 -1
- package/dist/bromcom-ui/{p-b386e9c9.entry.js → p-b7787c11.entry.js} +1 -1
- package/dist/bromcom-ui/{p-2e7ffc5a.entry.js → p-b7c56cbe.entry.js} +1 -1
- package/dist/bromcom-ui/{p-221095a9.entry.js → p-c36a7889.entry.js} +1 -1
- package/dist/bromcom-ui/p-ce0ab4e3.entry.js +5 -0
- package/dist/bromcom-ui/{p-ee75cd00.js → p-d3cf91a9.js} +1 -1
- package/dist/bromcom-ui/p-d5464577.entry.js +16 -0
- package/dist/bromcom-ui/{p-bd77f532.entry.js → p-d7a619c5.entry.js} +1 -1
- package/dist/bromcom-ui/{p-baa4193d.entry.js → p-e36b6b08.entry.js} +1 -1
- package/dist/bromcom-ui/{p-6c7fdf95.entry.js → p-f15c1d3d.entry.js} +1 -1
- package/dist/bromcom-ui/{p-8001040c.js → p-fc29c94d.js} +1 -1
- package/dist/cjs/bcm-accordion_69.cjs.entry.js +722 -66
- package/dist/cjs/bcm-attendance-actions-comment.cjs.entry.js +4 -4
- package/dist/cjs/bcm-attendance-actions-dropdown.cjs.entry.js +4 -4
- package/dist/cjs/bcm-breadcrumb.cjs.entry.js +2 -2
- package/dist/cjs/bcm-caption.cjs.entry.js +4 -4
- package/dist/cjs/bcm-card.cjs.entry.js +2 -2
- package/dist/cjs/bcm-date-picker.cjs.entry.js +2 -2
- package/dist/cjs/bcm-datetime-picker.cjs.entry.js +2 -2
- package/dist/cjs/bcm-default.cjs.entry.js +2 -2
- package/dist/cjs/bcm-file-upload.cjs.entry.js +578 -0
- package/dist/cjs/bcm-form-2.cjs.entry.js +3 -2
- package/dist/cjs/bcm-input-2.cjs.entry.js +2 -2
- package/dist/cjs/bcm-input-custom.cjs.entry.js +2 -2
- package/dist/cjs/bcm-input-dropdown.cjs.entry.js +4 -4
- package/dist/cjs/bcm-modal-2-footer.cjs.entry.js +4 -4
- package/dist/cjs/bcm-modal-2-header.cjs.entry.js +4 -4
- package/dist/cjs/bcm-modal-2.cjs.entry.js +4 -4
- package/dist/cjs/bcm-number-input.cjs.entry.js +12 -6
- package/dist/cjs/bcm-skeleton.cjs.entry.js +4 -4
- package/dist/cjs/bcm-table.cjs.entry.js +4 -4
- package/dist/cjs/bcm-tag.cjs.entry.js +3 -3
- package/dist/cjs/bcm-time-picker.cjs.entry.js +2 -2
- package/dist/cjs/bcm-toast.cjs.entry.js +17 -11
- package/dist/cjs/bromcom-ui.cjs.js +3 -3
- package/dist/cjs/{generate-554f54dc.js → generate-9d1bf6b3.js} +1 -1
- package/dist/cjs/{global-90b5dbce.js → global-d69a64ec.js} +1 -1
- package/dist/cjs/loader.cjs.js +3 -3
- package/dist/cjs/{number-helper-677e9c02.js → number-helper-ae28b255.js} +1 -1
- package/dist/cjs/old-bcm-popover-box.cjs.entry.js +3 -3
- package/dist/cjs/old-bcm-popover.cjs.entry.js +2 -2
- package/dist/cjs/{package-8445ccd4.js → package-6de220be.js} +1 -1
- package/dist/cjs/{validators-92f2f1ef.js → validators-3381bee2.js} +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/atoms/button/button.js +1 -1
- package/dist/collection/components/atoms/button/types.js +7 -0
- package/dist/collection/components/molecules/color-input/color-input.js +5 -22
- package/dist/collection/components/molecules/color-palette/color-palette.js +4 -4
- package/dist/collection/components/molecules/dropdown/dropdown.js +36 -1
- package/dist/collection/components/molecules/linked/linked-focus-manager.js +86 -0
- package/dist/collection/components/molecules/linked/linked.js +43 -1
- package/dist/collection/components/molecules/number-input/number-input.js +8 -2
- package/dist/collection/components/molecules/number-input/react-input.js +1 -1
- package/dist/collection/components/molecules/upload/file-upload.component.js +1060 -0
- package/dist/collection/components/molecules/upload/file-upload.style.js +201 -0
- package/dist/collection/components/organism/form/form.js +1 -0
- package/dist/collection/components/organism/form-2/bcm-form-components.js +1 -0
- package/dist/collection/components/organism/list/list-focus-manager.js +344 -0
- package/dist/collection/components/organism/list/list-key-control.js +9 -4
- package/dist/collection/components/organism/list/list.css +8 -3
- package/dist/collection/components/organism/list/list.js +227 -27
- package/dist/collection/components/other/toast/toast.js +15 -9
- package/dist/collection/components/other_deprecated/old-tag/old-tag.js +1 -1
- package/dist/collection/components/other_deprecated/tag/tag.js +1 -1
- package/dist/collection/templates/list-item-template.js +6 -5
- package/dist/collection/templates/list-template.js +2 -2
- package/dist/components/bcm-color-input.js +5 -22
- package/dist/components/bcm-dropdown.js +35 -0
- package/dist/components/bcm-file-upload.d.ts +11 -0
- package/dist/components/bcm-file-upload.js +625 -0
- package/dist/components/bcm-form-2.js +1 -0
- package/dist/components/bcm-number-input.js +8 -2
- package/dist/components/bcm-toast.js +15 -9
- package/dist/components/button.js +7 -0
- package/dist/components/color-palette.js +2 -2
- package/dist/components/form.js +1 -0
- package/dist/components/generate.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/linked.js +105 -2
- package/dist/components/list.js +567 -39
- package/dist/esm/bcm-accordion_69.entry.js +722 -66
- package/dist/esm/bcm-attendance-actions-comment.entry.js +4 -4
- package/dist/esm/bcm-attendance-actions-dropdown.entry.js +4 -4
- package/dist/esm/bcm-breadcrumb.entry.js +2 -2
- package/dist/esm/bcm-caption.entry.js +4 -4
- package/dist/esm/bcm-card.entry.js +2 -2
- package/dist/esm/bcm-date-picker.entry.js +2 -2
- package/dist/esm/bcm-datetime-picker.entry.js +2 -2
- package/dist/esm/bcm-default.entry.js +2 -2
- package/dist/esm/bcm-file-upload.entry.js +574 -0
- package/dist/esm/bcm-form-2.entry.js +3 -2
- package/dist/esm/bcm-input-2.entry.js +2 -2
- package/dist/esm/bcm-input-custom.entry.js +2 -2
- package/dist/esm/bcm-input-dropdown.entry.js +4 -4
- package/dist/esm/bcm-modal-2-footer.entry.js +4 -4
- package/dist/esm/bcm-modal-2-header.entry.js +4 -4
- package/dist/esm/bcm-modal-2.entry.js +4 -4
- package/dist/esm/bcm-number-input.entry.js +12 -6
- package/dist/esm/bcm-skeleton.entry.js +4 -4
- package/dist/esm/bcm-table.entry.js +4 -4
- package/dist/esm/bcm-tag.entry.js +3 -3
- package/dist/esm/bcm-time-picker.entry.js +2 -2
- package/dist/esm/bcm-toast.entry.js +17 -11
- package/dist/esm/bromcom-ui.js +3 -3
- package/dist/esm/{generate-8a394b83.js → generate-56d49b70.js} +1 -1
- package/dist/esm/{global-7919f57f.js → global-97c42a5f.js} +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/{number-helper-a86adc72.js → number-helper-455ab41e.js} +1 -1
- package/dist/esm/old-bcm-popover-box.entry.js +3 -3
- package/dist/esm/old-bcm-popover.entry.js +2 -2
- package/dist/esm/{package-278e08d9.js → package-edee14d5.js} +1 -1
- package/dist/esm/{validators-89e791a1.js → validators-cc882165.js} +1 -1
- package/dist/types/components/atoms/button/types.d.ts +8 -1
- package/dist/types/components/molecules/color-input/color-input.d.ts +1 -4
- package/dist/types/components/molecules/dropdown/dropdown.d.ts +7 -0
- package/dist/types/components/molecules/linked/linked-focus-manager.d.ts +13 -0
- package/dist/types/components/molecules/linked/linked.d.ts +3 -0
- package/dist/types/components/molecules/number-input/number-input.d.ts +1 -0
- package/dist/types/components/molecules/upload/file-upload.component.d.ts +233 -0
- package/dist/types/components/molecules/upload/file-upload.style.d.ts +548 -0
- package/dist/types/components/organism/list/list-focus-manager.d.ts +53 -0
- package/dist/types/components/organism/list/list-key-control.d.ts +1 -0
- package/dist/types/components/organism/list/list.d.ts +18 -1
- package/dist/types/components/other/toast/toast.d.ts +1 -0
- package/dist/types/components.d.ts +417 -1
- package/dist/types/templates/list-item-template.d.ts +2 -0
- package/dist/types/templates/list-template.d.ts +2 -0
- package/package.json +1 -1
- package/dist/bromcom-ui/p-16b8a312.entry.js +0 -16
- package/dist/bromcom-ui/p-839b6fd5.entry.js +0 -5
- package/dist/bromcom-ui/p-be8aa3b8.entry.js +0 -5
- package/dist/bromcom-ui/p-d0aa71e1.entry.js +0 -5
- package/dist/bromcom-ui/p-df92d838.js +0 -5
- package/dist/bromcom-ui/p-dfd73f7c.entry.js +0 -5
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { EventEmitter, ComponentInterface } from '../../../stencil-public-runtime';
|
|
2
|
+
export type BcmUploadStatus = 'uploading' | 'uploaded' | 'error';
|
|
3
|
+
export type BcmUploadPosition = 'vertical' | 'horizontal' | 'button';
|
|
4
|
+
export interface BcmUploadItem {
|
|
5
|
+
id: string;
|
|
6
|
+
file: File;
|
|
7
|
+
status: BcmUploadStatus;
|
|
8
|
+
progress?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface BcmUploadErrorMessages {
|
|
11
|
+
/**
|
|
12
|
+
* Error message shown when a file exceeds the maxSize limit.
|
|
13
|
+
*/
|
|
14
|
+
maxSize?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Error message shown when file type is not allowed by `accept`.
|
|
17
|
+
*/
|
|
18
|
+
type?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Error message shown when `maxFileCount` is exceeded.
|
|
21
|
+
*/
|
|
22
|
+
maxFileCount?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @component BcmFileUpload
|
|
26
|
+
* @description A fully featured drag-and-drop file uploader component.
|
|
27
|
+
* Supports form-associated behavior, validation, custom size limits,
|
|
28
|
+
* accepted file type filtering, multiple file selection, progress tracking,
|
|
29
|
+
* upload canceling, file removal, and accessibility events (focus/blur).
|
|
30
|
+
*
|
|
31
|
+
* Upload progress is currently simulated locally. The `uploadUrl` prop
|
|
32
|
+
* is reserved for future real HTTP upload integration and has no effect yet.
|
|
33
|
+
*
|
|
34
|
+
* @example Basic usage
|
|
35
|
+
* <bcm-file-upload name="report" label="Upload Report"></bcm-file-upload>
|
|
36
|
+
*
|
|
37
|
+
* @example Multiple files
|
|
38
|
+
* <bcm-file-upload name="attachments" multiple></bcm-file-upload>
|
|
39
|
+
*
|
|
40
|
+
* @example Custom max size and accepted formats
|
|
41
|
+
* <bcm-file-upload
|
|
42
|
+
* name="medicalFiles"
|
|
43
|
+
* accept=".pdf,.jpg"
|
|
44
|
+
* maxSize={5}
|
|
45
|
+
* ></bcm-file-upload>
|
|
46
|
+
*
|
|
47
|
+
* @prop {string} name
|
|
48
|
+
* The name of the form field used when the component is inside a `<form>`.
|
|
49
|
+
* Supports automatic FormData generation including:
|
|
50
|
+
* - single upload: name="file"
|
|
51
|
+
* - multiple upload: name="file[0], file[1], ..."
|
|
52
|
+
*
|
|
53
|
+
* @prop {string} label
|
|
54
|
+
* Optional label shown above the upload zone.
|
|
55
|
+
*
|
|
56
|
+
* @prop {string} caption
|
|
57
|
+
* Optional helper text rendered below the file list. Example: “Max size 5MB”.
|
|
58
|
+
*
|
|
59
|
+
* @prop {boolean} multiple
|
|
60
|
+
* Allows selecting and uploading multiple files at once.
|
|
61
|
+
*
|
|
62
|
+
* @prop {string} accept
|
|
63
|
+
* Comma-separated list of allowed file extensions.
|
|
64
|
+
* Example: ".pdf,.xls,.png".
|
|
65
|
+
*
|
|
66
|
+
* @prop {number} maxSize
|
|
67
|
+
* Maximum allowed size per file (in MB). If exceeded, an error alert appears.
|
|
68
|
+
*
|
|
69
|
+
* @prop {boolean} required
|
|
70
|
+
* Enables form validation — at least one file must be uploaded.
|
|
71
|
+
* Validation is applied by the surrounding `bcm-form-2` / `bcm-form`
|
|
72
|
+
* component, which reads `required` and `value` and sets the caption error.
|
|
73
|
+
*
|
|
74
|
+
* @prop {boolean} disabled
|
|
75
|
+
* Makes the uploader non-interactive: no clicking, no drag-and-drop.
|
|
76
|
+
*
|
|
77
|
+
* @prop {"medium" | "small"} size
|
|
78
|
+
* Controls spacing, typography, and visual density of the upload zone.
|
|
79
|
+
*
|
|
80
|
+
* @prop {string} uploadUrl
|
|
81
|
+
* Reserved for future backend upload integration.
|
|
82
|
+
* Currently has no effect and does not trigger any HTTP requests.
|
|
83
|
+
*
|
|
84
|
+
* @prop {number} maxFileCount
|
|
85
|
+
* Optional limit for how many files can be selected in total.
|
|
86
|
+
* Only applied when `multiple` is true.
|
|
87
|
+
* If exceeded, new files are ignored and a max-file-count error is shown.
|
|
88
|
+
*
|
|
89
|
+
* @prop {BcmUploadErrorMessages} customErrorMessages
|
|
90
|
+
* Optional override for all error messages:
|
|
91
|
+
* - maxSize: file too large
|
|
92
|
+
* - type: unsupported file type
|
|
93
|
+
* - maxFileCount: too many files selected
|
|
94
|
+
*
|
|
95
|
+
*
|
|
96
|
+
* @event {EventEmitter<File[]>} bcm-file-change
|
|
97
|
+
* Fired whenever the component's internal file list changes.
|
|
98
|
+
* Emits an array of the current File objects.
|
|
99
|
+
*
|
|
100
|
+
* @event {EventEmitter<BcmUploadItem>} bcm-file-removed
|
|
101
|
+
* Fired when the user removes a file from the list.
|
|
102
|
+
*
|
|
103
|
+
* @event {EventEmitter<BcmUploadItem>} bcm-upload-canceled
|
|
104
|
+
* Fired when an upload is canceled before completion.
|
|
105
|
+
*
|
|
106
|
+
* @event {EventEmitter<FocusEvent>} bcm-focus
|
|
107
|
+
* Fired when upload zone receives keyboard or mouse focus.
|
|
108
|
+
*
|
|
109
|
+
* @event {EventEmitter<FocusEvent>} bcm-blur
|
|
110
|
+
* Fired when upload zone loses focus.
|
|
111
|
+
*
|
|
112
|
+
*
|
|
113
|
+
* @csspart upload-zone
|
|
114
|
+
* The root clickable drop area for file selection or drag-and-drop.
|
|
115
|
+
*
|
|
116
|
+
* @csspart file-list
|
|
117
|
+
* The container wrapping rendered file rows.
|
|
118
|
+
*
|
|
119
|
+
* @csspart file-row
|
|
120
|
+
* A single file entry including its name, actions, and progress bar.
|
|
121
|
+
*
|
|
122
|
+
* @csspart remove-btn
|
|
123
|
+
* The remove action button inside uploaded file rows.
|
|
124
|
+
*
|
|
125
|
+
* @csspart cancel-btn
|
|
126
|
+
* The cancel upload button during uploading progress.
|
|
127
|
+
*
|
|
128
|
+
* @csspart download-btn
|
|
129
|
+
* The download button for already uploaded files.
|
|
130
|
+
*
|
|
131
|
+
* @csspart label
|
|
132
|
+
* The external label text displayed above the component.
|
|
133
|
+
*
|
|
134
|
+
* @csspart caption
|
|
135
|
+
* Helper or informative caption displayed below the uploaded list.
|
|
136
|
+
*/
|
|
137
|
+
export declare class BcmFileUpload implements ComponentInterface {
|
|
138
|
+
host: HTMLElement;
|
|
139
|
+
private inputId;
|
|
140
|
+
private labelId;
|
|
141
|
+
private fileInput?;
|
|
142
|
+
private uploadTimer?;
|
|
143
|
+
private uploadZoneRef?;
|
|
144
|
+
private uploadButtonRef?;
|
|
145
|
+
name: string;
|
|
146
|
+
label: string;
|
|
147
|
+
caption?: string;
|
|
148
|
+
noCaption: boolean;
|
|
149
|
+
multiple: boolean;
|
|
150
|
+
accept: string;
|
|
151
|
+
maxSize: number;
|
|
152
|
+
required: boolean;
|
|
153
|
+
disabled: boolean;
|
|
154
|
+
size: 'medium' | 'small';
|
|
155
|
+
position: BcmUploadPosition;
|
|
156
|
+
buttonLabel?: string;
|
|
157
|
+
showFileList: boolean;
|
|
158
|
+
fullWidth: boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Reserved for future backend upload integration.
|
|
161
|
+
* Currently does not affect component behavior.
|
|
162
|
+
*/
|
|
163
|
+
uploadUrl?: string;
|
|
164
|
+
/**
|
|
165
|
+
* Maximum number of files allowed in total.
|
|
166
|
+
* Only applied when `multiple` is true.
|
|
167
|
+
*/
|
|
168
|
+
maxFileCount?: number;
|
|
169
|
+
/**
|
|
170
|
+
* Allows consumers to override default error messages.
|
|
171
|
+
*/
|
|
172
|
+
customErrorMessages?: BcmUploadErrorMessages;
|
|
173
|
+
value: any;
|
|
174
|
+
captionError?: string;
|
|
175
|
+
captionType?: string;
|
|
176
|
+
private files;
|
|
177
|
+
private dragActive;
|
|
178
|
+
private zoneHovered;
|
|
179
|
+
private maxSizeError;
|
|
180
|
+
private typeError;
|
|
181
|
+
private maxFileCountError;
|
|
182
|
+
bcmFileChange: EventEmitter<File[]>;
|
|
183
|
+
bcmChange: EventEmitter<any>;
|
|
184
|
+
bcmFileRemoved: EventEmitter<BcmUploadItem>;
|
|
185
|
+
bcmUploadCanceled: EventEmitter<BcmUploadItem>;
|
|
186
|
+
bcmFocus: EventEmitter<FocusEvent>;
|
|
187
|
+
bcmBlur: EventEmitter<FocusEvent>;
|
|
188
|
+
private internalMaxSizeInBytes;
|
|
189
|
+
componentWillLoad(): void;
|
|
190
|
+
private get isButtonMode();
|
|
191
|
+
private get zoneError();
|
|
192
|
+
private getStyleProps;
|
|
193
|
+
disconnectedCallback(): void;
|
|
194
|
+
handleMaxSizeChange(): void;
|
|
195
|
+
/**
|
|
196
|
+
* Normalize and check a file against the `accept` attribute.
|
|
197
|
+
*/
|
|
198
|
+
private isFileAccepted;
|
|
199
|
+
private emitChange;
|
|
200
|
+
private normalizeSetDataToItems;
|
|
201
|
+
get(): Promise<any>;
|
|
202
|
+
set(data: any): Promise<void>;
|
|
203
|
+
setClear(): Promise<unknown>;
|
|
204
|
+
resetCaption(): Promise<unknown>;
|
|
205
|
+
/**
|
|
206
|
+
* Simulate upload progress. Replace with real upload logic if needed.
|
|
207
|
+
*/
|
|
208
|
+
private startFakeUpload;
|
|
209
|
+
/**
|
|
210
|
+
* Add files from input or drop.
|
|
211
|
+
*/
|
|
212
|
+
private addFiles;
|
|
213
|
+
private removeFile;
|
|
214
|
+
private cancelUpload;
|
|
215
|
+
private onFileInputChange;
|
|
216
|
+
private handleDrop;
|
|
217
|
+
private handleDragOver;
|
|
218
|
+
private handleDragLeave;
|
|
219
|
+
private openFileDialog;
|
|
220
|
+
setFocus(options?: FocusOptions): Promise<void>;
|
|
221
|
+
private handleZoneMouseEnter;
|
|
222
|
+
private handleZoneMouseLeave;
|
|
223
|
+
private handleZoneKeyDown;
|
|
224
|
+
private getMaxSizeLabel;
|
|
225
|
+
private handleFocus;
|
|
226
|
+
private handleBlur;
|
|
227
|
+
private renderErrors;
|
|
228
|
+
private renderUploadZone;
|
|
229
|
+
private renderUploadButton;
|
|
230
|
+
private renderHiddenInput;
|
|
231
|
+
private renderFileRow;
|
|
232
|
+
render(): any;
|
|
233
|
+
}
|