@vizejs/fresco 0.716.0 → 0.718.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.
Files changed (50) hide show
  1. package/dist/{accessibility-OEhyYUxd.d.mts → accessibility-DwzT925M.d.mts} +46 -5
  2. package/dist/accessibility-DwzT925M.d.mts.map +1 -0
  3. package/dist/{app-CIX6NAW-.mjs → app-C_wFlWSV.mjs} +443 -123
  4. package/dist/app-C_wFlWSV.mjs.map +1 -0
  5. package/dist/app-_QmZ-PoH.d.mts +270 -0
  6. package/dist/app-_QmZ-PoH.d.mts.map +1 -0
  7. package/dist/ascii-font/index.d.mts +60 -0
  8. package/dist/ascii-font/index.d.mts.map +1 -0
  9. package/dist/ascii-font/index.mjs +68 -0
  10. package/dist/ascii-font/index.mjs.map +1 -0
  11. package/dist/components/index.d.mts +2 -2
  12. package/dist/components/index.mjs +2 -2
  13. package/dist/components-DzkL-yHj.mjs +6165 -0
  14. package/dist/components-DzkL-yHj.mjs.map +1 -0
  15. package/dist/composables/index.d.mts +3 -3
  16. package/dist/composables/index.mjs +4 -4
  17. package/dist/{composables-DbJGVNSG.mjs → composables-BJeirPSH.mjs} +116 -55
  18. package/dist/composables-BJeirPSH.mjs.map +1 -0
  19. package/dist/{index-CWRginDz.d.mts → index-B3zQ6E-5.d.mts} +1099 -337
  20. package/dist/index-B3zQ6E-5.d.mts.map +1 -0
  21. package/dist/{index-Dikou9bu.d.mts → index-Ddp2Txtm.d.mts} +52 -4
  22. package/dist/index-Ddp2Txtm.d.mts.map +1 -0
  23. package/dist/index.d.mts +98 -7
  24. package/dist/index.d.mts.map +1 -0
  25. package/dist/index.mjs +262 -5
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/{protocol-D8xt3DG7.d.mts → protocol-DavoeNLn.d.mts} +14 -4
  28. package/dist/{protocol-D8xt3DG7.d.mts.map → protocol-DavoeNLn.d.mts.map} +1 -1
  29. package/dist/qr-code/index.d.mts +101 -0
  30. package/dist/qr-code/index.d.mts.map +1 -0
  31. package/dist/qr-code/index.mjs +88 -0
  32. package/dist/qr-code/index.mjs.map +1 -0
  33. package/dist/testing/index.d.mts +3 -3
  34. package/dist/testing/index.mjs +1 -1
  35. package/dist/{useApp-CVB2jNCO.d.mts → useApp-vIRJ5Th3.d.mts} +34 -8
  36. package/dist/useApp-vIRJ5Th3.d.mts.map +1 -0
  37. package/dist/{useVirtualViewport-pPZWmwUC.mjs → useBoxMetrics-lF5Myjc7.mjs} +66 -6
  38. package/dist/useBoxMetrics-lF5Myjc7.mjs.map +1 -0
  39. package/package.json +14 -6
  40. package/dist/accessibility-OEhyYUxd.d.mts.map +0 -1
  41. package/dist/app-CIX6NAW-.mjs.map +0 -1
  42. package/dist/app-CKsTWQuP.d.mts +0 -154
  43. package/dist/app-CKsTWQuP.d.mts.map +0 -1
  44. package/dist/components-D9SeB0Be.mjs +0 -3331
  45. package/dist/components-D9SeB0Be.mjs.map +0 -1
  46. package/dist/composables-DbJGVNSG.mjs.map +0 -1
  47. package/dist/index-CWRginDz.d.mts.map +0 -1
  48. package/dist/index-Dikou9bu.d.mts.map +0 -1
  49. package/dist/useApp-CVB2jNCO.d.mts.map +0 -1
  50. package/dist/useVirtualViewport-pPZWmwUC.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Dikou9bu.d.mts","names":[],"sources":["../src/composables/useInput.ts","../src/composables/usePaste.ts","../src/composables/useMouse.ts","../src/composables/useIme.ts","../src/composables/useStreams.ts","../src/composables/useWindowSize.ts","../src/composables/useCursor.ts","../src/composables/useAnimation.ts","../src/layoutMetrics.ts","../src/composables/useBoxMetrics.ts","../src/composables/useIsScreenReaderEnabled.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useApp-CVB2jNCO.d.mts","names":[],"sources":["../src/composables/useFocus.ts","../src/composables/useApp.ts"],"mappings":";;;UAkBiB,eAAA;EAQe;EAN9B,QAAA,aAAqB,GAAA;EAAA;EAErB,SAAA;EAEA;EAAA,EAAA;EAE2B;EAA3B,QAAA,mBAA2B,GAAG;AAAA;AAAA,UAGf,YAAA;EAAY;EAE3B,SAAA,EAAW,GAAA;EAAA;EAEX,QAAA,EAAU,QAAA,CAAS,GAAA;EAAT;EAEV,YAAA,EAAc,QAAA,CAAS,GAAA;EAAT;EAEd,SAAA,EAAW,GAAA;EAAG;EAEd,WAAA;EARA;EAUA,YAAA;EARA;EAUA,KAAA,GAAQ,EAAA;EAVW;EAYnB,SAAA;EAVc;EAYd,aAAA;EAVA;EAYA,QAAA,GACE,EAAA,UACA,OAAA;IAAY,QAAA;IAAoB,SAAA;IAAqB,QAAA;EAAA;EANvD;EASA,UAAA,GAAa,EAAA;EALb;EAOA,SAAA,GAAY,EAAA,UAAY,QAAA;EALV;EAOd,SAAA,GAAY,EAAA,UAAY,QAAA;EAP+B;EASvD,oBAAA,GAAuB,EAAA;AAAA;;;AAAU;iBA6JnB,QAAA,CAAS,OAAA,GAAS,eAAoB;;;;;;;;;;iBA2EtC,eAAA;;;;;;;;;;;;UC5RC,YAAA;EDkBe;EChB9B,KAAA,EAAO,GAAA;EDUc;ECRrB,MAAA,EAAQ,GAAA;EDYR;ECVA,SAAA,EAAW,GAAA;EDYgB;ECV3B,IAAA,GAAO,aAAA;EDUuB;ECR9B,MAAA;EDW2B;ECT3B,KAAA;EDWW;ECTX,oBAAA,QAA4B,OAAA;AAAA;;;;iBAwEd,MAAA,IAAU,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVirtualViewport-pPZWmwUC.mjs","names":["toRef"],"sources":["../src/composables/useIsScreenReaderEnabled.ts","../src/composables/usePaste.ts","../src/composables/useInput.ts","../src/composables/useMouse.ts","../src/composables/useVirtualViewport.ts"],"sourcesContent":["/**\n * useIsScreenReaderEnabled - screen reader mode flag.\n */\n\nimport { inject } from \"vue\";\nimport { SCREEN_READER_KEY, isScreenReaderEnabledByDefault } from \"../accessibility.js\";\n\nexport function useIsScreenReaderEnabled(): boolean {\n const enabled = inject(SCREEN_READER_KEY, null);\n return enabled?.value ?? isScreenReaderEnabledByDefault();\n}\n","/**\n * usePaste - bracketed paste handling.\n */\n\nimport { isRef, onUnmounted, ref, watch, type Ref } from \"vue\";\nimport { lastPasteEvent } from \"../app.js\";\nimport { useStreamsContext } from \"./useStreams.js\";\n\nlet activePasteHandlerCount = 0;\n\nexport interface UsePasteOptions {\n /** Whether the paste handler is active */\n isActive?: boolean | Ref<boolean>;\n}\n\nexport function hasActivePasteHandlers(): boolean {\n return activePasteHandlerCount > 0;\n}\n\nfunction toRef(value: boolean | Ref<boolean>): Ref<boolean> {\n return isRef(value) ? value : ref(value);\n}\n\nexport function usePaste(handler: (text: string) => void, options: UsePasteOptions = {}) {\n const isActive = toRef(options.isActive ?? true);\n const streams = useStreamsContext();\n let rawModeEnabled = false;\n let bracketedPasteEnabled = false;\n let pasteHandlerRegistered = false;\n\n const syncRawMode = (isEnabled: boolean) => {\n if (rawModeEnabled === isEnabled) return;\n streams.setRawMode(isEnabled);\n rawModeEnabled = isEnabled;\n };\n\n const syncBracketedPasteMode = (isEnabled: boolean) => {\n if (bracketedPasteEnabled === isEnabled) return;\n streams.setBracketedPasteMode(isEnabled);\n bracketedPasteEnabled = isEnabled;\n };\n\n const syncPasteRegistration = (isEnabled: boolean) => {\n if (pasteHandlerRegistered === isEnabled) return;\n activePasteHandlerCount += isEnabled ? 1 : -1;\n pasteHandlerRegistered = isEnabled;\n };\n\n const syncActiveState = (isEnabled: boolean) => {\n syncRawMode(isEnabled);\n syncBracketedPasteMode(isEnabled);\n syncPasteRegistration(isEnabled);\n };\n\n watch(lastPasteEvent, (event) => {\n if (!event || !isActive.value) return;\n handler(event.text);\n });\n\n watch(isActive, syncActiveState, { immediate: true });\n onUnmounted(() => syncActiveState(false));\n\n return {\n isActive,\n enable: () => {\n isActive.value = true;\n },\n disable: () => {\n isActive.value = false;\n },\n };\n}\n","/**\n * useInput - Input handling composable\n */\n\nimport { isRef, onUnmounted, ref, watch, type Ref } from \"vue\";\nimport { lastCompositionEvent, lastKeyEvent, lastPasteEvent, type KeyEvent } from \"../app.js\";\nimport { hasActivePasteHandlers } from \"./usePaste.js\";\nimport { useStreamsContext } from \"./useStreams.js\";\n\nexport interface Key {\n upArrow: boolean;\n downArrow: boolean;\n leftArrow: boolean;\n rightArrow: boolean;\n pageDown: boolean;\n pageUp: boolean;\n home: boolean;\n end: boolean;\n return: boolean;\n escape: boolean;\n ctrl: boolean;\n shift: boolean;\n tab: boolean;\n backspace: boolean;\n delete: boolean;\n meta: boolean;\n super: boolean;\n hyper: boolean;\n capsLock: boolean;\n numLock: boolean;\n eventType?: \"press\" | \"repeat\" | \"release\";\n}\n\nexport interface KeyHandler {\n (key: string, modifiers: { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean }): void;\n}\n\nexport interface UseInputOptions {\n /** Whether to capture input (boolean or Ref<boolean>) */\n active?: boolean | Ref<boolean>;\n /** Whether to capture input (alias for active, boolean or Ref<boolean>) */\n isActive?: boolean | Ref<boolean>;\n /** Ink-compatible input callback */\n handler?: (input: string, key: Key) => void;\n /** Called on key press */\n onKey?: KeyHandler;\n /** Called on character input */\n onChar?: (char: string) => void;\n /** Called on Enter */\n onSubmit?: () => void;\n /** Called on Escape */\n onEscape?: () => void;\n /** Called on arrow keys */\n onArrow?: (direction: \"up\" | \"down\" | \"left\" | \"right\") => void;\n /** Called when an IME composition starts */\n onCompositionStart?: () => void;\n /** Called when IME preedit text changes */\n onCompositionUpdate?: (text: string, cursor: number) => void;\n /** Called when IME commits text */\n onCompositionEnd?: (text: string) => void;\n}\n\nexport interface UseInputReturn {\n isActive: Ref<boolean>;\n lastKey: Ref<string | null>;\n enable: () => void;\n disable: () => void;\n}\n\nexport type InputHandler = (input: string, key: Key) => void;\n\nexport interface UseInputHandlerOptions {\n isActive?: boolean | Ref<boolean>;\n}\n\nfunction toRef(value: boolean | Ref<boolean>): Ref<boolean> {\n return isRef(value) ? value : ref(value);\n}\n\nfunction keyName(event: KeyEvent): string {\n return event.char ?? event.key ?? \"\";\n}\n\nfunction toInkKey(event: KeyEvent): Key {\n const key = event.key;\n\n return {\n upArrow: key === \"up\",\n downArrow: key === \"down\",\n leftArrow: key === \"left\",\n rightArrow: key === \"right\",\n pageDown: key === \"pagedown\" || key === \"pageDown\",\n pageUp: key === \"pageup\" || key === \"pageUp\",\n home: key === \"home\",\n end: key === \"end\",\n return: key === \"enter\" || key === \"return\",\n escape: key === \"escape\" || key === \"esc\",\n ctrl: event.ctrl,\n shift: event.shift,\n tab: key === \"tab\" || key === \"backtab\",\n backspace: key === \"backspace\",\n delete: key === \"delete\",\n meta: event.meta,\n super: event.super,\n hyper: event.hyper,\n capsLock: event.capsLock,\n numLock: event.numLock,\n eventType: event.eventType,\n };\n}\n\nfunction emptyKey(): Key {\n return {\n upArrow: false,\n downArrow: false,\n leftArrow: false,\n rightArrow: false,\n pageDown: false,\n pageUp: false,\n home: false,\n end: false,\n return: false,\n escape: false,\n ctrl: false,\n shift: false,\n tab: false,\n backspace: false,\n delete: false,\n meta: false,\n super: false,\n hyper: false,\n capsLock: false,\n numLock: false,\n };\n}\n\nfunction inputValue(event: KeyEvent, key: Key): string {\n if (event.char) return event.char;\n if (key.return) return \"\\r\";\n return \"\";\n}\n\nfunction handleStructuredOptions(\n event: KeyEvent,\n options: UseInputOptions,\n lastKey: Ref<string | null>,\n) {\n const modifiers = {\n ctrl: event.ctrl,\n alt: event.alt,\n shift: event.shift,\n meta: event.meta,\n };\n const pressedKey = keyName(event);\n const inkKey = toInkKey(event);\n\n if (event.char) {\n lastKey.value = event.char;\n options.onChar?.(event.char);\n options.onKey?.(event.char, modifiers);\n return;\n }\n\n if (pressedKey) {\n lastKey.value = pressedKey;\n options.onKey?.(pressedKey, modifiers);\n }\n\n if (inkKey.return) options.onSubmit?.();\n if (inkKey.escape) options.onEscape?.();\n if (inkKey.upArrow) options.onArrow?.(\"up\");\n if (inkKey.downArrow) options.onArrow?.(\"down\");\n if (inkKey.leftArrow) options.onArrow?.(\"left\");\n if (inkKey.rightArrow) options.onArrow?.(\"right\");\n}\n\nexport function useInput(handler: InputHandler, options?: UseInputHandlerOptions): UseInputReturn;\nexport function useInput(options?: UseInputOptions): UseInputReturn;\nexport function useInput(\n handlerOrOptions: InputHandler | UseInputOptions = {},\n handlerOptions: UseInputHandlerOptions = {},\n): UseInputReturn {\n const options =\n typeof handlerOrOptions === \"function\"\n ? { handler: handlerOrOptions, isActive: handlerOptions.isActive }\n : handlerOrOptions;\n\n const activeSource = options.isActive ?? options.active ?? true;\n const isActive = toRef(activeSource);\n const lastKey = ref<string | null>(null);\n const streams = useStreamsContext();\n let rawModeEnabled = false;\n\n const syncRawMode = (isEnabled: boolean) => {\n if (rawModeEnabled === isEnabled) return;\n streams.setRawMode(isEnabled);\n rawModeEnabled = isEnabled;\n };\n\n watch(lastKeyEvent, (event) => {\n if (!event || !isActive.value) return;\n\n const inkKey = toInkKey(event);\n const input = inputValue(event, inkKey);\n const pressedKey = keyName(event);\n\n if (input === \"c\" && inkKey.ctrl && streams.internal_exitOnCtrlC) return;\n\n lastKey.value = pressedKey || null;\n options.handler?.(input, inkKey);\n handleStructuredOptions(event, options, lastKey);\n });\n\n watch(lastPasteEvent, (event) => {\n if (!event || !isActive.value || hasActivePasteHandlers()) return;\n\n lastKey.value = event.text;\n options.handler?.(event.text, emptyKey());\n options.onChar?.(event.text);\n });\n\n watch(lastCompositionEvent, (event) => {\n if (!event || !isActive.value) return;\n\n if (event.type === \"compositionstart\") {\n options.onCompositionStart?.();\n } else if (event.type === \"compositionupdate\") {\n options.onCompositionUpdate?.(event.text, event.cursor);\n } else {\n options.onCompositionEnd?.(event.text);\n }\n });\n\n watch(isActive, syncRawMode, { immediate: true });\n onUnmounted(() => syncRawMode(false));\n\n const enable = () => {\n isActive.value = true;\n };\n\n const disable = () => {\n isActive.value = false;\n };\n\n return {\n isActive,\n lastKey,\n enable,\n disable,\n };\n}\n\n/**\n * Shorthand for handling specific key combinations\n */\nexport function useKeyPress(\n key: string,\n handler: () => void,\n options: { ctrl?: boolean; alt?: boolean; shift?: boolean; meta?: boolean } = {},\n) {\n const { ctrl = false, alt = false, shift = false, meta = false } = options;\n\n useInput({\n onKey: (pressedKey, modifiers) => {\n const matches =\n pressedKey.toLowerCase() === key.toLowerCase() &&\n modifiers.ctrl === ctrl &&\n modifiers.alt === alt &&\n modifiers.shift === shift &&\n modifiers.meta === meta;\n\n if (matches) {\n handler();\n }\n },\n });\n}\n","/** Mouse and wheel input handling for focused Fresco surfaces. */\n\nimport { computed, isRef, ref, watch, type Ref } from \"vue\";\nimport { lastMouseEvent } from \"../app.js\";\nimport type { MouseEvent } from \"../protocol.js\";\n\nexport interface UseMouseOptions {\n /** Whether the handler receives events. */\n isActive?: boolean | Readonly<Ref<boolean>>;\n}\n\nexport interface UseMouseReturn {\n isActive: Readonly<Ref<boolean>>;\n /** Start delivering normalized mouse events. */\n enable: () => void;\n /** Stop delivering normalized mouse events. */\n disable: () => void;\n /** Unsubscribe the handler from the shared mouse event stream. */\n stop: () => void;\n}\n\n/** Subscribe to normalized mouse actions, including wheel direction. */\nexport function useMouse(\n handler: (event: MouseEvent) => void,\n options: UseMouseOptions = {},\n): UseMouseReturn {\n const externalIsActive = isRef(options.isActive) ? options.isActive : undefined;\n const locallyEnabled = ref(externalIsActive ? true : (options.isActive ?? true));\n const isActive = computed(() => locallyEnabled.value && (externalIsActive?.value ?? true));\n\n const stop = watch(\n lastMouseEvent,\n (event) => {\n if (event && isActive.value) handler(event);\n },\n { flush: \"sync\" },\n );\n\n return {\n isActive,\n enable: () => {\n locallyEnabled.value = true;\n },\n disable: () => {\n locallyEnabled.value = false;\n },\n stop,\n };\n}\n","/** Bounded viewport state for large terminal collections. */\n\nimport { computed, ref, type ComputedRef, type Ref } from \"vue\";\n\nexport type VirtualScrollAlignment = \"nearest\" | \"start\" | \"center\" | \"end\";\n\nexport interface VirtualViewportRange {\n /** First item occupying the viewport. */\n visibleStart: number;\n /** Exclusive end of items occupying the viewport. */\n visibleEnd: number;\n /** First retained item, including leading overscan. */\n overscanStart: number;\n /** Exclusive end of retained items, including trailing overscan. */\n overscanEnd: number;\n}\n\nexport interface VirtualViewportOptions {\n itemCount: number;\n viewportSize: number;\n overscan?: number;\n initialOffset?: number;\n}\n\nexport interface VirtualViewport {\n readonly itemCount: Readonly<Ref<number>>;\n readonly viewportSize: Readonly<Ref<number>>;\n readonly overscan: Readonly<Ref<number>>;\n readonly offset: Readonly<Ref<number>>;\n readonly maxOffset: ComputedRef<number>;\n readonly atStart: ComputedRef<boolean>;\n readonly atEnd: ComputedRef<boolean>;\n readonly range: ComputedRef<VirtualViewportRange>;\n /** Replace the collection size and clamp the current offset. */\n setItemCount(value: number): boolean;\n /** Replace the visible row count and clamp the current offset. */\n setViewportSize(value: number): boolean;\n /** Replace the number of retained rows on each side of the viewport. */\n setOverscan(value: number): boolean;\n /** Move to an absolute, bounded offset. */\n scrollTo(offset: number): boolean;\n /** Move by a signed row delta. */\n scrollBy(delta: number): boolean;\n /** Reveal one item using the requested viewport alignment. */\n scrollIntoView(index: number, alignment?: VirtualScrollAlignment): boolean;\n}\n\nfunction count(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative safe integer`);\n }\n return value;\n}\n\n/** Create viewport state whose retained range scales with visible rows, not item count. */\nexport function createVirtualViewport(options: VirtualViewportOptions): VirtualViewport {\n const itemCount = ref(count(options.itemCount, \"itemCount\"));\n const viewportSize = ref(count(options.viewportSize, \"viewportSize\"));\n const overscan = ref(count(options.overscan ?? 2, \"overscan\"));\n const offset = ref(0);\n const maxOffset = computed(() => Math.max(0, itemCount.value - viewportSize.value));\n const atStart = computed(() => offset.value === 0);\n const atEnd = computed(() => offset.value === maxOffset.value);\n const range = computed<VirtualViewportRange>(() => {\n const visibleStart = Math.min(offset.value, itemCount.value);\n const visibleEnd = Math.min(itemCount.value, visibleStart + viewportSize.value);\n return {\n visibleStart,\n visibleEnd,\n overscanStart: Math.max(0, visibleStart - overscan.value),\n overscanEnd: Math.min(itemCount.value, visibleEnd + overscan.value),\n };\n });\n\n const scrollTo = (value: number) => {\n const next = Math.min(maxOffset.value, count(value, \"offset\"));\n if (next === offset.value) return false;\n offset.value = next;\n return true;\n };\n const clamp = () => scrollTo(Math.min(offset.value, maxOffset.value));\n\n const setItemCount = (value: number) => {\n const next = count(value, \"itemCount\");\n if (next === itemCount.value) return false;\n itemCount.value = next;\n clamp();\n return true;\n };\n const setViewportSize = (value: number) => {\n const next = count(value, \"viewportSize\");\n if (next === viewportSize.value) return false;\n viewportSize.value = next;\n clamp();\n return true;\n };\n const setOverscan = (value: number) => {\n const next = count(value, \"overscan\");\n if (next === overscan.value) return false;\n overscan.value = next;\n return true;\n };\n const scrollBy = (delta: number) => {\n if (!Number.isSafeInteger(delta)) throw new RangeError(\"delta must be a safe integer\");\n return scrollTo(Math.max(0, offset.value + delta));\n };\n const scrollIntoView = (index: number, alignment: VirtualScrollAlignment = \"nearest\") => {\n count(index, \"index\");\n if (index >= itemCount.value || viewportSize.value === 0) return false;\n let next = offset.value;\n if (alignment === \"start\") next = index;\n else if (alignment === \"center\") next = Math.max(0, index - Math.floor(viewportSize.value / 2));\n else if (alignment === \"end\") next = Math.max(0, index + 1 - viewportSize.value);\n else if (index < offset.value) next = index;\n else if (index >= offset.value + viewportSize.value) {\n next = index + 1 - viewportSize.value;\n }\n return scrollTo(next);\n };\n\n scrollTo(options.initialOffset ?? 0);\n\n return {\n itemCount,\n viewportSize,\n overscan,\n offset,\n maxOffset,\n atStart,\n atEnd,\n range,\n setItemCount,\n setViewportSize,\n setOverscan,\n scrollTo,\n scrollBy,\n scrollIntoView,\n };\n}\n\n/** Composition API alias for {@link createVirtualViewport}. */\nexport const useVirtualViewport = createVirtualViewport;\n"],"mappings":"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"}