@archpublicwebsite/rangepicker 1.0.8 → 1.0.11
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/README.md +199 -89
- package/dist/Rangepicker.vue.d.ts +3 -28
- package/dist/Rangepicker.vue.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/rangepicker.js +193 -254
- package/dist/rangepicker.js.map +1 -1
- package/dist/rangepicker.umd.cjs +1 -1
- package/dist/rangepicker.umd.cjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types.d.ts +66 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -8
package/README.md
CHANGED
|
@@ -38,10 +38,47 @@ const dates = ref('')
|
|
|
38
38
|
</script>
|
|
39
39
|
|
|
40
40
|
<template>
|
|
41
|
-
<RangepickerInput
|
|
42
|
-
v-model="dates"
|
|
41
|
+
<RangepickerInput
|
|
42
|
+
v-model="dates"
|
|
43
|
+
primary-color="#3b82f6"
|
|
44
|
+
placeholder="Check in / Check out"
|
|
45
|
+
/>
|
|
46
|
+
</template>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### TypeScript Support
|
|
50
|
+
|
|
51
|
+
Full TypeScript support with exported types for type-safe development:
|
|
52
|
+
|
|
53
|
+
```vue
|
|
54
|
+
<script setup lang="ts">
|
|
55
|
+
import { ref } from 'vue'
|
|
56
|
+
import {
|
|
57
|
+
RangepickerInput,
|
|
58
|
+
type RangepickerProps,
|
|
59
|
+
type DateRange
|
|
60
|
+
} from '@archpublicwebsite/rangepicker'
|
|
61
|
+
import '@archpublicwebsite/rangepicker/style.css'
|
|
62
|
+
|
|
63
|
+
// Type-safe date range
|
|
64
|
+
const dates = ref<DateRange>({ startDate: '', endDate: '' })
|
|
65
|
+
|
|
66
|
+
// Type-safe props configuration
|
|
67
|
+
const pickerOptions: Partial<RangepickerProps> = {
|
|
68
|
+
format: 'DD/MM/YYYY',
|
|
69
|
+
autoApply: true,
|
|
70
|
+
minDays: 2,
|
|
71
|
+
maxDays: 30,
|
|
72
|
+
showTooltip: true
|
|
73
|
+
}
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<template>
|
|
77
|
+
<RangepickerInput
|
|
78
|
+
v-model="dates"
|
|
79
|
+
v-bind="pickerOptions"
|
|
43
80
|
primary-color="#3b82f6"
|
|
44
|
-
placeholder="Check in / Check out"
|
|
81
|
+
placeholder="Check in / Check out"
|
|
45
82
|
/>
|
|
46
83
|
</template>
|
|
47
84
|
```
|
|
@@ -161,6 +198,21 @@ const options = {
|
|
|
161
198
|
### Basic Usage
|
|
162
199
|
|
|
163
200
|
```vue
|
|
201
|
+
<script setup lang="ts">
|
|
202
|
+
import { ref, computed } from 'vue'
|
|
203
|
+
import { Rangepicker, type DateRange } from '@archpublicwebsite/rangepicker'
|
|
204
|
+
import '@archpublicwebsite/rangepicker/style.css'
|
|
205
|
+
|
|
206
|
+
const triggerRef = ref<HTMLElement | null>(null)
|
|
207
|
+
const isOpen = ref(false)
|
|
208
|
+
const dateRange = ref<DateRange>({ startDate: '', endDate: '' })
|
|
209
|
+
|
|
210
|
+
const dateRangeText = computed(() => {
|
|
211
|
+
if (!dateRange.value.startDate || !dateRange.value.endDate) return ''
|
|
212
|
+
return `${dateRange.value.startDate} - ${dateRange.value.endDate}`
|
|
213
|
+
})
|
|
214
|
+
</script>
|
|
215
|
+
|
|
164
216
|
<template>
|
|
165
217
|
<div>
|
|
166
218
|
<input
|
|
@@ -177,25 +229,10 @@ const options = {
|
|
|
177
229
|
v-model:is-open="isOpen"
|
|
178
230
|
:trigger-element="triggerRef"
|
|
179
231
|
:value-of-months="2"
|
|
180
|
-
|
|
232
|
+
format="DD MMM YYYY"
|
|
181
233
|
/>
|
|
182
234
|
</div>
|
|
183
235
|
</template>
|
|
184
|
-
|
|
185
|
-
<script setup lang="ts">
|
|
186
|
-
import { ref, computed } from 'vue'
|
|
187
|
-
import { Rangepicker } from '@archpublicwebsite/rangepicker'
|
|
188
|
-
import '@archpublicwebsite/rangepicker/style.css'
|
|
189
|
-
|
|
190
|
-
const triggerRef = ref<HTMLElement | null>(null)
|
|
191
|
-
const isOpen = ref(false)
|
|
192
|
-
const dateRange = ref({ startDate: '', endDate: '' })
|
|
193
|
-
|
|
194
|
-
const dateRangeText = computed(() => {
|
|
195
|
-
if (!dateRange.value.startDate || !dateRange.value.endDate) return ''
|
|
196
|
-
return `${dateRange.value.startDate} - ${dateRange.value.endDate}`
|
|
197
|
-
})
|
|
198
|
-
</script>
|
|
199
236
|
```
|
|
200
237
|
|
|
201
238
|
### Using the Composable
|
|
@@ -203,67 +240,43 @@ const dateRangeText = computed(() => {
|
|
|
203
240
|
```vue
|
|
204
241
|
<script setup lang="ts">
|
|
205
242
|
import { ref } from 'vue'
|
|
206
|
-
import {
|
|
243
|
+
import {
|
|
244
|
+
Rangepicker,
|
|
245
|
+
useRangepicker,
|
|
246
|
+
type RangepickerProps
|
|
247
|
+
} from '@archpublicwebsite/rangepicker'
|
|
207
248
|
import '@archpublicwebsite/rangepicker/style.css'
|
|
208
249
|
|
|
209
250
|
const triggerRef = ref<HTMLElement | null>(null)
|
|
210
|
-
|
|
251
|
+
|
|
252
|
+
// Type-safe composable options
|
|
253
|
+
const options: Partial<RangepickerProps> = {
|
|
211
254
|
valueOfMonths: 2,
|
|
212
255
|
format: 'DD MMM YYYY',
|
|
213
256
|
minDays: 1,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
```
|
|
257
|
+
autoApply: true
|
|
258
|
+
}
|
|
217
259
|
|
|
218
|
-
|
|
260
|
+
const { isOpen, dateRange, open, close, toggle } = useRangepicker(triggerRef, options)
|
|
261
|
+
</script>
|
|
219
262
|
|
|
220
|
-
```vue
|
|
221
263
|
<template>
|
|
222
264
|
<div>
|
|
223
|
-
<
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
readonly
|
|
229
|
-
@click="isBookingOpen = true"
|
|
230
|
-
/>
|
|
265
|
+
<button ref="triggerRef" @click="toggle">
|
|
266
|
+
{{ dateRange.startDate && dateRange.endDate
|
|
267
|
+
? `${dateRange.startDate} - ${dateRange.endDate}`
|
|
268
|
+
: 'Select dates' }}
|
|
269
|
+
</button>
|
|
231
270
|
|
|
232
271
|
<Rangepicker
|
|
233
|
-
v-model="
|
|
234
|
-
v-model:is-open="
|
|
235
|
-
:trigger-element="
|
|
236
|
-
|
|
237
|
-
:value-of-columns="2"
|
|
238
|
-
:min-days="1"
|
|
239
|
-
:format="'DD MMM YYYY'"
|
|
240
|
-
:show-tooltip="true"
|
|
241
|
-
:holidays="holidays"
|
|
242
|
-
:min-date="today"
|
|
243
|
-
variant="desktop"
|
|
272
|
+
v-model="dateRange"
|
|
273
|
+
v-model:is-open="isOpen"
|
|
274
|
+
:trigger-element="triggerRef"
|
|
275
|
+
v-bind="options"
|
|
244
276
|
/>
|
|
245
277
|
</div>
|
|
246
278
|
</template>
|
|
247
|
-
|
|
248
|
-
<script setup lang="ts">
|
|
249
|
-
import { ref, computed } from 'vue'
|
|
250
|
-
import { Rangepicker } from '@archpublicwebsite/rangepicker'
|
|
251
|
-
import '@archpublicwebsite/rangepicker/style.css'
|
|
252
|
-
import dayjs from 'dayjs'
|
|
253
|
-
|
|
254
|
-
const bookingInputRef = ref<HTMLElement | null>(null)
|
|
255
|
-
const isBookingOpen = ref(false)
|
|
256
|
-
const bookingDates = ref({ startDate: '', endDate: '' })
|
|
257
|
-
const today = dayjs().format('YYYY-MM-DD')
|
|
258
|
-
const holidays = ref(['2025-12-25', '2025-01-01'])
|
|
259
|
-
|
|
260
|
-
const bookingText = computed(() => {
|
|
261
|
-
if (!bookingDates.value.startDate || !bookingDates.value.endDate) return ''
|
|
262
|
-
return `${bookingDates.value.startDate} - ${bookingDates.value.endDate}`
|
|
263
|
-
})
|
|
264
|
-
</script>
|
|
265
279
|
```
|
|
266
|
-
|
|
267
280
|
## Props
|
|
268
281
|
|
|
269
282
|
| Prop | Type | Default | Description |
|
|
@@ -299,6 +312,128 @@ const bookingText = computed(() => {
|
|
|
299
312
|
| `dateSelected` | `Dayjs` | Emitted when a date is clicked |
|
|
300
313
|
| `rangeSelected` | `{ start: Dayjs, end: Dayjs }` | Emitted when range is complete |
|
|
301
314
|
|
|
315
|
+
## TypeScript Support
|
|
316
|
+
|
|
317
|
+
This package is built with TypeScript and provides full type definitions. All types are automatically exported for your convenience.
|
|
318
|
+
|
|
319
|
+
### Available Types
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
import type {
|
|
323
|
+
RangepickerProps, // Component props interface
|
|
324
|
+
RangepickerEmits, // Event emitter interface
|
|
325
|
+
DateRange, // Date range object type
|
|
326
|
+
CalendarDay, // Internal calendar day type
|
|
327
|
+
CalendarMonth // Internal calendar month type
|
|
328
|
+
} from '@archpublicwebsite/rangepicker'
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Type Definitions
|
|
332
|
+
|
|
333
|
+
#### `RangepickerProps`
|
|
334
|
+
Complete props interface with JSDoc documentation. All props are optional with sensible defaults:
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
interface RangepickerProps {
|
|
338
|
+
modelValue?: { startDate?: string | Date | Dayjs; endDate?: string | Date | Dayjs }
|
|
339
|
+
isOpen?: boolean
|
|
340
|
+
variant?: 'desktop' | 'mobile'
|
|
341
|
+
minDate?: string | Date | Dayjs
|
|
342
|
+
maxDate?: string | Date | Dayjs
|
|
343
|
+
minDays?: number
|
|
344
|
+
maxDays?: number
|
|
345
|
+
close?: boolean
|
|
346
|
+
valueOfMonths?: number // default: 2
|
|
347
|
+
valueOfColumns?: number // default: 2
|
|
348
|
+
disabledDates?: (string | Date)[]
|
|
349
|
+
holidays?: (string | Date)[]
|
|
350
|
+
format?: string // default: 'YYYY-MM-DD'
|
|
351
|
+
delimiter?: string // default: ' - '
|
|
352
|
+
placeholder?: string
|
|
353
|
+
label?: string
|
|
354
|
+
showTooltip?: boolean // default: true
|
|
355
|
+
autoApply?: boolean // default: false
|
|
356
|
+
position?: 'auto' | 'top' | 'bottom'
|
|
357
|
+
triggerElement?: HTMLElement | null
|
|
358
|
+
colorStyles?: Record<string, string>
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
#### `DateRange`
|
|
363
|
+
Type for the v-model binding:
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
interface DateRange {
|
|
367
|
+
startDate: string
|
|
368
|
+
endDate: string
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
#### `RangepickerEmits`
|
|
373
|
+
Event emitter types for type-safe event handling:
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
interface RangepickerEmits {
|
|
377
|
+
'update:modelValue': [value: { startDate: string; endDate: string }]
|
|
378
|
+
'update:isOpen': [value: boolean]
|
|
379
|
+
'dateSelected': [date: Dayjs]
|
|
380
|
+
'rangeSelected': [start: Dayjs, end: Dayjs]
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Usage Examples
|
|
385
|
+
|
|
386
|
+
#### Type-Safe Component Props
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
import type { RangepickerProps } from '@archpublicwebsite/rangepicker'
|
|
390
|
+
|
|
391
|
+
// Define props with autocomplete support
|
|
392
|
+
const config: Partial<RangepickerProps> = {
|
|
393
|
+
format: 'DD/MM/YYYY',
|
|
394
|
+
minDays: 2,
|
|
395
|
+
maxDays: 30,
|
|
396
|
+
autoApply: true,
|
|
397
|
+
showTooltip: true
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
#### Type-Safe Event Handlers
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
import type { Dayjs } from 'dayjs'
|
|
405
|
+
|
|
406
|
+
function handleDateSelected(date: Dayjs) {
|
|
407
|
+
console.log('Selected:', date.format('YYYY-MM-DD'))
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
function handleRangeSelected(start: Dayjs, end: Dayjs) {
|
|
411
|
+
const nights = end.diff(start, 'day')
|
|
412
|
+
console.log(`Booking: ${nights} nights`)
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
#### Type-Safe Refs
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
import { ref } from 'vue'
|
|
420
|
+
import type { DateRange } from '@archpublicwebsite/rangepicker'
|
|
421
|
+
|
|
422
|
+
const dateRange = ref<DateRange>({ startDate: '', endDate: '' })
|
|
423
|
+
const holidays = ref<string[]>(['2025-12-25', '2025-01-01'])
|
|
424
|
+
const disabledDates = ref<Date[]>([new Date('2025-12-24')])
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### IDE Support
|
|
428
|
+
|
|
429
|
+
With the exported types, you'll get:
|
|
430
|
+
|
|
431
|
+
- ✅ **Autocomplete** - IntelliSense for all props and events
|
|
432
|
+
- ✅ **Type Checking** - Compile-time error detection
|
|
433
|
+
- ✅ **Documentation** - Hover tooltips with prop descriptions and default values
|
|
434
|
+
- ✅ **Refactoring** - Safe rename and refactor operations
|
|
435
|
+
- ✅ **Error Prevention** - Catch typos and incorrect prop usage before runtime
|
|
436
|
+
|
|
302
437
|
## Development
|
|
303
438
|
|
|
304
439
|
```bash
|
|
@@ -318,31 +453,6 @@ pnpm type-check
|
|
|
318
453
|
pnpm preview
|
|
319
454
|
```
|
|
320
455
|
|
|
321
|
-
## Package Structure
|
|
322
|
-
|
|
323
|
-
```
|
|
324
|
-
packages/rangepicker/
|
|
325
|
-
├── dist/ # Built files (published to npm)
|
|
326
|
-
│ ├── rangepicker.js # ES module (39.91 KB, gzipped: 9.42 KB)
|
|
327
|
-
│ ├── rangepicker.umd.cjs # UMD module (20.18 KB, gzipped: 7.07 KB)
|
|
328
|
-
│ ├── style.css # Compiled styles with arch- prefix (48.69 KB, gzipped: 5.29 KB)
|
|
329
|
-
│ └── *.d.ts # TypeScript type definitions
|
|
330
|
-
├── src/
|
|
331
|
-
│ ├── index.ts # Main entry point
|
|
332
|
-
│ ├── Rangepicker.vue # Core calendar component
|
|
333
|
-
│ ├── RangepickerInput.vue # Input wrapper component
|
|
334
|
-
│ ├── types.ts # Type definitions
|
|
335
|
-
│ ├── utils/
|
|
336
|
-
│ │ ├── calendar.ts # Calendar generation logic
|
|
337
|
-
│ │ ├── date.ts # Dayjs utilities
|
|
338
|
-
│ │ └── position.ts # Smart positioning
|
|
339
|
-
│ └── styles/
|
|
340
|
-
│ └── rangepicker.scss # Tailwind CSS with arch- prefix
|
|
341
|
-
├── package.json
|
|
342
|
-
├── vite.config.ts
|
|
343
|
-
└── tailwind.config.js # With prefix: 'arch-'
|
|
344
|
-
```
|
|
345
|
-
|
|
346
456
|
## CSS Architecture
|
|
347
457
|
|
|
348
458
|
The component uses **Tailwind CSS with `arch-` prefix** to prevent conflicts with other frameworks:
|
|
@@ -1,31 +1,6 @@
|
|
|
1
1
|
import { Dayjs } from 'dayjs';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
startDate?: string | Date | Dayjs;
|
|
5
|
-
endDate?: string | Date | Dayjs;
|
|
6
|
-
};
|
|
7
|
-
isOpen?: boolean;
|
|
8
|
-
variant?: 'desktop' | 'mobile';
|
|
9
|
-
minDate?: string | Date | Dayjs;
|
|
10
|
-
maxDate?: string | Date | Dayjs;
|
|
11
|
-
minDays?: number;
|
|
12
|
-
maxDays?: number;
|
|
13
|
-
close?: boolean;
|
|
14
|
-
valueOfMonths?: number;
|
|
15
|
-
valueOfColumns?: number;
|
|
16
|
-
disabledDates?: (string | Date)[];
|
|
17
|
-
holidays?: (string | Date)[];
|
|
18
|
-
format?: string;
|
|
19
|
-
delimiter?: string;
|
|
20
|
-
placeholder?: string;
|
|
21
|
-
label?: string;
|
|
22
|
-
showTooltip?: boolean;
|
|
23
|
-
autoApply?: boolean;
|
|
24
|
-
position?: 'auto' | 'top' | 'bottom';
|
|
25
|
-
triggerElement?: HTMLElement | null;
|
|
26
|
-
colorStyles?: Record<string, string>;
|
|
27
|
-
}
|
|
28
|
-
declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
2
|
+
import { RangepickerProps } from './types';
|
|
3
|
+
declare const _default: import('vue').DefineComponent<RangepickerProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
29
4
|
"update:modelValue": (value: {
|
|
30
5
|
startDate: string;
|
|
31
6
|
endDate: string;
|
|
@@ -33,7 +8,7 @@ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, imp
|
|
|
33
8
|
"update:isOpen": (value: boolean) => any;
|
|
34
9
|
dateSelected: (date: Dayjs) => any;
|
|
35
10
|
rangeSelected: (start: Dayjs, end: Dayjs) => any;
|
|
36
|
-
}, string, import('vue').PublicProps, Readonly<
|
|
11
|
+
}, string, import('vue').PublicProps, Readonly<RangepickerProps> & Readonly<{
|
|
37
12
|
"onUpdate:modelValue"?: (value: {
|
|
38
13
|
startDate: string;
|
|
39
14
|
endDate: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rangepicker.vue.d.ts","sourceRoot":"","sources":["../src/Rangepicker.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Rangepicker.vue.d.ts","sourceRoot":"","sources":["../src/Rangepicker.vue"],"names":[],"mappings":"AA0jBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAInC,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,SAAS,CAAC;;;mBAejB,MAAM;iBAAW,MAAM;;;;;;;mBAAvB,MAAM;iBAAW,MAAM;;;;;;;;;;;;;;;;;;AA+lBnE,wBAUG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import './styles/rangepicker.scss';
|
|
2
2
|
import Rangepicker from './Rangepicker.vue';
|
|
3
3
|
import RangepickerInput from './RangepickerInput.vue';
|
|
4
|
-
import type { DateRange, RangepickerProps } from './types';
|
|
4
|
+
import type { DateRange, RangepickerProps, RangepickerEmits, CalendarDay, CalendarMonth } from './types';
|
|
5
5
|
export default RangepickerInput;
|
|
6
6
|
export { Rangepicker, RangepickerInput };
|
|
7
|
-
export type { RangepickerProps, DateRange };
|
|
7
|
+
export type { RangepickerProps, RangepickerEmits, DateRange, CalendarDay, CalendarMonth };
|
|
8
8
|
export declare function useRangepicker(triggerRef: any, options?: Partial<RangepickerProps>): {
|
|
9
9
|
isOpen: import("vue").Ref<boolean, boolean>;
|
|
10
10
|
dateRange: import("vue").Ref<{
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,2BAA2B,CAAA;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,2BAA2B,CAAA;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAGxG,eAAe,gBAAgB,CAAA;AAG/B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAA;AAGxC,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,CAAA;AAGzF,wBAAgB,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM;;;;;;;;;;;;;EAgBtF"}
|