Wed, 13 May 2020 14:48:52 +0200 |
Edouard Tisserant |
SVGHMI: Makes error when HMI tree is not well formed. Prevents multiple and non-first HMI_NODE, and ensure that all paths in HMI tree are unique.
svghmi
|
changeset |
files
|
Wed, 13 May 2020 14:47:17 +0200 |
Edouard Tisserant |
Added FatalError call to Libraries code gen, so that they can emit messages addressed like config tree nodes do.
svghmi
|
changeset |
files
|
Wed, 13 May 2020 22:25:22 +0200 |
Edouard Tisserant |
SVGHMI: more Widget properties declared ES6 style.
svghmi
|
changeset |
files
|
Wed, 13 May 2020 22:22:13 +0200 |
Edouard Tisserant |
SVGHMI: Switch widget now use class declaration
svghmi
|
changeset |
files
|
Wed, 13 May 2020 18:50:07 +0200 |
Edouard Tisserant |
SVGHMI: Update Button widget to class declaration, and add a button widget in tests/svghmi.
svghmi
|
changeset |
files
|
Wed, 13 May 2020 18:47:09 +0200 |
Edouard Tisserant |
SVGHMI: explicit handling of undefined maximum widget update frequency
svghmi
|
changeset |
files
|
Wed, 13 May 2020 18:27:26 +0200 |
Edouard Tisserant |
SVGHMI: removed dead code
svghmi
|
changeset |
files
|
Wed, 13 May 2020 18:26:38 +0200 |
Edouard Tisserant |
SVGHMI: Back button updated to class style
svghmi
|
changeset |
files
|
Mon, 11 May 2020 11:33:00 +0200 |
Edouard Tisserant |
merge
svghmi
|
changeset |
files
|
Mon, 11 May 2020 11:10:38 +0200 |
Edouard Tisserant |
DEBUG: (IDE side) fixed wrong implementation of anti-rapid-fire leading to systematic delay in subscribing
svghmi
|
changeset |
files
|
Sun, 10 May 2020 23:40:43 +0200 |
Edouard Tisserant |
SVGHMI: Exclude non-widget HMI:* labeled elements from hmi_widget. Namely : HMI:Page HMI:Lang and HMI:List have been excluded.
svghmi
|
changeset |
files
|
Sun, 10 May 2020 17:01:09 +0200 |
Edouard Tisserant |
SVGHMI: clean up dead code, update generated xslt.
svghmi
|
changeset |
files
|
Sun, 10 May 2020 16:36:41 +0200 |
Edouard Tisserant |
SVGHMI: apply per class overloading of sub/unsub to Jump widget
svghmi
|
changeset |
files
|
Sun, 10 May 2020 16:36:09 +0200 |
Edouard Tisserant |
SVGHMI: apply per class overloading of sub/unsub to ForEach widget
svghmi
|
changeset |
files
|
Sun, 10 May 2020 16:34:44 +0200 |
Edouard Tisserant |
SVGHMI: Widget's specific sub/unsub traits are now wxpressed in widget's class.
svghmi
|
changeset |
files
|
Sun, 10 May 2020 16:32:19 +0200 |
Edouard Tisserant |
SVGHMI: Parameters common to all widget constructors now passed as ordered parameters.
svghmi
|
changeset |
files
|
Fri, 08 May 2020 16:51:43 +0200 |
Edouard Tisserant |
SVGHMI: One class per widget type, widget objects are instances of these classes, and members are passed through constructor. This allows to keep compatible with previous widget_defs template used in most widgets.
svghmi
|
changeset |
files
|
Fri, 08 May 2020 16:47:52 +0200 |
Edouard Tisserant |
SVGHMI: Add an exslt function to collect used widget types, in order to only include necessary JS definitions in furure changes.
svghmi
|
changeset |
files
|
Fri, 08 May 2020 16:44:20 +0200 |
Edouard Tisserant |
SVGHMI: Systematically output local name as /* comment */ when emiting content.
svghmi
|
changeset |
files
|
Fri, 24 Apr 2020 10:03:40 +0200 |
Edouard Tisserant |
Merge
svghmi
|
changeset |
files
|
Fri, 24 Apr 2020 10:02:13 +0200 |
Edouard Tisserant |
SVGHMI: Fix flawed logic to place nodes in the HMI tree, leading to wrecked tree in some cases.
svghmi
|
changeset |
files
|
Wed, 22 Apr 2020 15:33:53 +0200 |
dgaberscek |
Added button and circular bar widgets.
svghmi
|
changeset |
files
|
Mon, 20 Apr 2020 16:19:31 +0200 |
Edouard Tisserant |
SVGHMI: added more meaningful namespaces to emit javascript code from.
svghmi
|
changeset |
files
|
Sun, 19 Apr 2020 22:44:41 +0200 |
Edouard Tisserant |
SVGHMI: moved JS code of foreach and jump widget in corresponding widget_*.ysl2. To be continued.
svghmi
|
changeset |
files
|
Sun, 19 Apr 2020 22:01:12 +0200 |
Edouard Tisserant |
SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
svghmi
|
changeset |
files
|
Sun, 19 Apr 2020 10:48:34 +0200 |
Edouard Tisserant |
SVGHMI: Introduced "emit" to simplify producing per-topic code and content from anywhere in code. Applied to debug output, next to JS.
svghmi
|
changeset |
files
|
Sat, 18 Apr 2020 14:06:41 +0200 |
Edouard Tisserant |
SVGHMI: Move reflective debug tags from "reflect" to "debug" namespace, preparing for per-purpose namespaces.
svghmi
|
changeset |
files
|
Sat, 18 Apr 2020 13:14:45 +0200 |
Edouard Tisserant |
SVGHMI: Added scripts.ysl2
svghmi
|
changeset |
files
|
Sat, 18 Apr 2020 11:49:02 +0200 |
Edouard Tisserant |
SVGHMI: moving code wher it belongs, and reformulate some declarations for better readability.
svghmi
|
changeset |
files
|
Thu, 16 Apr 2020 10:21:25 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown: more documentation.
svghmi
|
changeset |
files
|
Wed, 15 Apr 2020 14:29:19 +0200 |
Edouard Tisserant |
SVGHMI: Comments in HMI:DropDown source code
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 23:04:54 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown menu aligns to selected when opening
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 22:08:52 +0200 |
Edouard Tisserant |
SVGHMI: When clicking outside of opened HMI:DropDown box, close it.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 19:22:18 +0200 |
Edouard Tisserant |
SVGHMI: Fix HMI:DropDown flicker on close.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 17:31:45 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown now temporarily takes content from widget's arguments, until HMI:List is implemented.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 17:17:35 +0200 |
Edouard Tisserant |
SVGHMI: Connect HMI:DropDown to value in HMI Tree, in svghmi test as well.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 17:16:25 +0200 |
Edouard Tisserant |
SVGHMI: fix probable problem in HMI:Input, where value could be applied to wrong index if used in relative page.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 17:15:02 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown element is brought in front when opened, so that it isn't occulted by other widgets at the same level.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 17:13:12 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown now catches all clicks when open
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 12:07:08 +0200 |
Edouard Tisserant |
SVGHMI: Add button element to HMI:DropDown, also fix problem with computed box margins.
svghmi
|
changeset |
files
|
Tue, 14 Apr 2020 10:56:45 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown now scrolls forward and backward
svghmi
|
changeset |
files
|
Mon, 13 Apr 2020 18:28:22 +0200 |
Edouard Tisserant |
SVGHMI: progress on HMI:DropDown - now selects some value on click, and close
svghmi
|
changeset |
files
|
Sun, 12 Apr 2020 21:43:42 +0200 |
Edouard Tisserant |
SVGHMI: HMI:DropDown work in progress, intermediate commit. Now menu's rectangle grows up to viewport borders.
svghmi
|
changeset |
files
|
Thu, 09 Apr 2020 09:52:34 +0200 |
Edouard Tisserant |
SVGHMI: intermediate commit while working on dropdown widget.
svghmi
|
changeset |
files
|
Tue, 07 Apr 2020 10:01:23 +0200 |
Edouard Tisserant |
SVGHMI: HMI is not speculating on PLC variable update anymore when sending new variable value.
svghmi
|
changeset |
files
|
Sat, 04 Apr 2020 22:32:54 +0200 |
Edouard Tisserant |
SVGHMI: finished shift and capslock support n keypad widget. Added a helper in widgets_common to collect subelements likle active/inactive/disabled...
svghmi
|
changeset |
files
|
Sat, 04 Apr 2020 17:47:16 +0200 |
Edouard Tisserant |
SVGHMI: fixed keypad JS regarding shift/capslock and other details
svghmi
|
changeset |
files
|
Sat, 04 Apr 2020 09:41:32 +0200 |
Edouard Tisserant |
Fix unmatched "Courier" font for monospace fonts on latest ubuntu 20.04. Selected "FreeMono" instead, present since at least 18.04
svghmi
|
changeset |
files
|
Fri, 03 Apr 2020 14:37:41 +0200 |
Edouard Tisserant |
SVGHMI: Keypad working for HMI_STRING, still Shift/CapsLock not finished.
svghmi
|
changeset |
files
|
Fri, 03 Apr 2020 09:52:57 +0200 |
Edouard Tisserant |
SVGHMI: fix keyboard not showing
svghmi
|
changeset |
files
|
Fri, 03 Apr 2020 08:30:00 +0200 |
Edouard Tisserant |
SVGHMI: Added keypads to svghmi test's SVG file
svghmi
|
changeset |
files
|
Fri, 03 Apr 2020 08:13:47 +0200 |
Edouard Tisserant |
merge
svghmi
|
changeset |
files
|
Thu, 02 Apr 2020 15:18:15 +0200 |
Edouard Tisserant |
SVGHMI: Keypad: added code to re-attach keypad when starting edit.
svghmi
|
changeset |
files
|
Thu, 02 Apr 2020 14:04:21 +0200 |
Edouard Tisserant |
SVGHMI: removed debug code
svghmi
|
changeset |
files
|
Thu, 02 Apr 2020 14:03:38 +0200 |
Edouard Tisserant |
SVGHMI: More infrastructure for editing values with a keypad.
svghmi
|
changeset |
files
|
Thu, 02 Apr 2020 09:38:53 +0200 |
Edouard Tisserant |
SVGHMI: Widget input buttons should be clickable through svg:use (onclick attribute instead of addEventListener)
svghmi
|
changeset |
files
|
Wed, 01 Apr 2020 18:10:45 +0200 |
Edouard Tisserant |
SVGHMI: moved dead code to where it belongs
svghmi
|
changeset |
files
|
Wed, 01 Apr 2020 14:42:50 +0200 |
Edouard Tisserant |
SVGHMI: empty widget_keypad.ysl2, WIP
svghmi
|
changeset |
files
|
Tue, 31 Mar 2020 13:20:15 +0200 |
Edouard Tisserant |
SVGHMI: HMI:Switch now accepts boolean values 'true' and 'false'
svghmi
|
changeset |
files
|
Mon, 30 Mar 2020 14:26:42 +0200 |
Edouard Tisserant |
SVGHMI: Jump widget, if it has a 'disabled' labeled element, reflects value of the pointed HMITree variable by showing this element when value is False, and behaving normaly otherwise.
svghmi
|
changeset |
files
|
Mon, 30 Mar 2020 11:06:12 +0200 |
Edouard Tisserant |
SVGHMI: prevent man-made memory leak by limiting back button history items count to 42
svghmi
|
changeset |
files
|
Sun, 29 Mar 2020 16:11:21 +0200 |
Edouard Tisserant |
SVGHMI: collect debug data through xslt reflectivity instead of yml2/python trick
svghmi
|
changeset |
files
|
Fri, 27 Mar 2020 14:25:24 +0100 |
Edouard Tisserant |
SVGHMI: Jump widget can now display as active or inactive, if corresponfing "active" and "inactive labeled elements are provided.
svghmi
|
changeset |
files
|
Thu, 26 Mar 2020 14:21:52 +0100 |
Edouard Tisserant |
SVGHMI: added Back widget.
svghmi
|
changeset |
files
|
Thu, 26 Mar 2020 13:33:20 +0100 |
Edouard Tisserant |
SVGHMI: Jump widget now make errors if path given for relative jump doesn't match target page reference path class.
svghmi
|
changeset |
files
|
Thu, 26 Mar 2020 11:17:34 +0100 |
Edouard Tisserant |
SVGHMI: Check that explicit relative page jump path is consistant with destination page reference path.
svghmi
|
changeset |
files
|
Wed, 25 Mar 2020 14:09:15 +0100 |
Edouard Tisserant |
SVGHMI: ForEach Widget now has a better wrap-around when scrolling : hit the boundary systematically before wrapping
svghmi
|
changeset |
files
|
Wed, 25 Mar 2020 13:56:04 +0100 |
Edouard Tisserant |
SVGHMI: Alow relative relative Jump. (i.e, relative jump from a foreach widget)
svghmi
|
changeset |
files
|
Wed, 25 Mar 2020 13:36:04 +0100 |
Edouard Tisserant |
SVGHMI: Generalize applying cache to widgets, be it from page or ForEach widgets. Now ForEach widget buttons work as expected.
svghmi
|
changeset |
files
|
Tue, 24 Mar 2020 23:07:54 +0100 |
Edouard Tisserant |
SVGHMI: Widget ForEach buttons now call corresponding methods.
svghmi
|
changeset |
files
|
Tue, 24 Mar 2020 14:03:19 +0100 |
Edouard Tisserant |
SVGHMI: ForEach now has working (un)subscribe. Fixed PageSwitch that wasn't behaving when jumping to current page with another path.
svghmi
|
changeset |
files
|
Mon, 23 Mar 2020 21:44:28 +0100 |
Edouard Tisserant |
SVGHMI: Easier way to match HMI tree elements to paths. ForEach widget now looks for paths and indexes of all items, and enforce path to be consistent with ForEach items sub widgets
svghmi
|
changeset |
files
|
Mon, 23 Mar 2020 15:13:36 +0100 |
Edouard Tisserant |
SVGHMI: added func:get_hmi_tree_elt to match HMI tree node from path. Continue implementing ForEach widget : force order and completeness of items list. Now also collecting ForEach buttons.
svghmi
|
changeset |
files
|
Mon, 23 Mar 2020 10:16:38 +0100 |
Edouard Tisserant |
SVGHMI: ForEach knows its own widgets
svghmi
|
changeset |
files
|
Fri, 20 Mar 2020 10:46:15 +0100 |
Edouard Tisserant |
SVGHMI: add widget_foreach.ysl2
svghmi
|
changeset |
files
|
Fri, 20 Mar 2020 10:00:59 +0100 |
Edouard Tisserant |
SVGHMI: make root HMI tree node a HMI_NODE, droped HMI_ROOT node type
svghmi
|
changeset |
files
|
Thu, 19 Mar 2020 19:23:56 +0100 |
Edouard Tisserant |
SVGHMI: reworked widget (un)subscription now a method of widgect object, allowing special subscription methods
svghmi
|
changeset |
files
|
Thu, 19 Mar 2020 11:32:20 +0100 |
Edouard Tisserant |
SVGHMI: Exclude (again) sub-widgets of forEach widget from page-switch managed widget.
svghmi
|
changeset |
files
|
Thu, 19 Mar 2020 09:57:26 +0100 |
Edouard Tisserant |
SVGHMI: cosmetic changes
svghmi
|
changeset |
files
|
Thu, 19 Mar 2020 09:31:07 +0100 |
Edouard Tisserant |
SVGHMI: Simplification and optimization. func:parselabel becomes a template.
svghmi
|
changeset |
files
|
Wed, 18 Mar 2020 12:06:50 +0100 |
Edouard Tisserant |
SVGHMI: intermediate untested state. Excluded ForEach widget from pages handled widgets.
svghmi
|
changeset |
files
|
Wed, 18 Mar 2020 09:37:26 +0100 |
Edouard Tisserant |
SVGHMI: update Makefile to pick all changes to any dependency
svghmi
|
changeset |
files
|
Wed, 18 Mar 2020 09:16:14 +0100 |
Edouard Tisserant |
SVGHMI: created widget_*.ysl2. Renamed widget_common in widgets_common, so that it doesn't match globing.
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 14:11:54 +0100 |
Edouard Tisserant |
SVGHMI: moving comments
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 14:01:37 +0100 |
Edouard Tisserant |
SVGHMI: added widget_common.ysl2
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 13:43:19 +0100 |
Edouard Tisserant |
SVGHMI: More readable debug output gen code
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 13:34:07 +0100 |
Edouard Tisserant |
SVGHMI: Cosmetic changes
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 13:16:01 +0100 |
Edouard Tisserant |
SVGHMI: added inline_svg.ysl2
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 11:24:07 +0100 |
Edouard Tisserant |
SVGHMI: detachable_elements.ysl2 becomes detachable_pages.ysl2, and includes logic to process pages elements. Other minor code moves.
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 10:34:26 +0100 |
Edouard Tisserant |
SVGHMI: moved debug code
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 09:29:04 +0100 |
Edouard Tisserant |
SVGHMI: created detachable_elements.ysl2
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 08:00:33 +0100 |
Edouard Tisserant |
SVGHMI: more debug code moved to hmi_tree.ysl2
svghmi
|
changeset |
files
|
Tue, 17 Mar 2020 07:39:50 +0100 |
Edouard Tisserant |
SVGHMI : create hmi_tree.ysl2, rename bbox_intersect.ysl2 into geometry.ysl2 and move more code into. Add per included ysl2 file debug output.
svghmi
|
changeset |
files
|
Mon, 16 Mar 2020 18:27:49 +0100 |
Edouard Tisserant |
SVGHMI: created bbox_intersect.ysl2
svghmi
|
changeset |
files
|
Mon, 16 Mar 2020 17:09:23 +0100 |
Edouard Tisserant |
SVGHMI: Re-enable dispatch to arrays of functions in case of multiple suscription per widget. Still unused, but disabled for reasons not any more true.
svghmi
|
changeset |
files
|
Fri, 13 Mar 2020 21:42:40 +0100 |
Edouard Tisserant |
SVGHMI: relative pages and page jumps
svghmi
|
changeset |
files
|
Fri, 13 Mar 2020 10:36:13 +0100 |
Edouard Tisserant |
SVGHMI: take care of path given in HMI:Page and HMI:Jump, but do not apply subscription offset for now. Intermediate commit in a "working" state.
svghmi
|
changeset |
files
|
Thu, 12 Mar 2020 13:16:18 +0100 |
Edouard Tisserant |
SVGHMI: significant whitespace changes
svghmi
|
changeset |
files
|
Thu, 12 Mar 2020 13:15:54 +0100 |
Edouard Tisserant |
SVGHMI: unsignificant changes or changes in generated code
svghmi
|
changeset |
files
|
Thu, 12 Mar 2020 13:14:38 +0100 |
Edouard Tisserant |
SVGHMI: Stop ignoring HMI_NODE in HMI tree, and count it as a BOOL. Soon we use those nodes as reference for relative page jump, and as an "enable" bit for features associated to an HMI tree fragment.
svghmi
|
changeset |
files
|
Thu, 12 Mar 2020 09:33:20 +0100 |
Edouard Tisserant |
SVGHMI: cosmetic code moving
svghmi
|
changeset |
files
|
Tue, 10 Mar 2020 13:57:29 +0100 |
Edouard Tisserant |
SVGHMI: split page switch into switching subscription and switching elements in the DOM, to ensure that subscriptions have been send before changing DOM, and avoid some flicker.
svghmi
|
changeset |
files
|
Mon, 09 Mar 2020 13:43:34 +0100 |
Edouard Tisserant |
SVGHMI: fix wrong updates of HMI variables on each change, especially when not subscribed.
svghmi
|
changeset |
files
|
Mon, 09 Mar 2020 13:40:45 +0100 |
Edouard Tisserant |
SVGHMI: whitespaces
svghmi
|
changeset |
files
|
Fri, 06 Mar 2020 14:43:03 +0100 |
Edouard Tisserant |
SVGHMI: fixed repeated error when Input widget is missing 'value' element
svghmi
|
changeset |
files
|
Fri, 06 Mar 2020 14:42:08 +0100 |
Edouard Tisserant |
SVGHMI: more decoupling in between UI related and the rest of JS code, still in the aim of enhancing robustness under heavy load.
svghmi
|
changeset |
files
|
Fri, 06 Mar 2020 09:35:08 +0100 |
Edouard Tisserant |
SVGHMI: use requestAnimationFrame to delegate rendering of updates from network. Should help prevent browser collapse leading to watchdog in case of overload.
svghmi
|
changeset |
files
|
Thu, 05 Mar 2020 13:54:29 +0100 |
Edouard Tisserant |
SVGHMI: Fix disapearing elements in case of nested detachable elements.
svghmi
|
changeset |
files
|
Thu, 05 Mar 2020 10:23:03 +0100 |
Edouard Tisserant |
SVGHMI: Meter widget accepts 2 arguments : min and max, taken in account when min or max text element is missing
svghmi
|
changeset |
files
|
Wed, 04 Mar 2020 20:02:15 +0100 |
Edouard Tisserant |
SVGHMI: More precise error message on missing HMI path. Meter widget now defaults 0-100 range when min and max elements arent's present, without error.
svghmi
|
changeset |
files
|
Wed, 04 Mar 2020 16:46:35 +0100 |
Edouard Tisserant |
SVGHMI: more whitespace fixes
svghmi
|
changeset |
files
|
Wed, 04 Mar 2020 16:46:03 +0100 |
Edouard Tisserant |
SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
svghmi
|
changeset |
files
|
Wed, 04 Mar 2020 09:31:53 +0100 |
Edouard Tisserant |
SVGHMI: whitespaces and comments
svghmi
|
changeset |
files
|
Tue, 03 Mar 2020 16:29:22 +0100 |
Edouard Tisserant |
SVGHMI: completely fixed indentation of generated widget description. Lets try to keep it as-is until we can use yslt indentation.
svghmi
|
changeset |
files
|
Tue, 03 Mar 2020 10:58:00 +0100 |
Edouard Tisserant |
SVGHMI: re-indent generated JS
svghmi
|
changeset |
files
|
Mon, 02 Mar 2020 16:30:29 +0100 |
Edouard Tisserant |
SVGHMI: detach/re-attach elements required by pages on page switch
svghmi
|
changeset |
files
|
Mon, 02 Mar 2020 16:25:35 +0100 |
Edouard Tisserant |
SVGHMI: re-indenting
svghmi
|
changeset |
files
|
Mon, 02 Mar 2020 14:43:21 +0100 |
Edouard Tisserant |
SVGHMI: declares pages detachable requirements as an object, to find more efficiently common requirements
svghmi
|
changeset |
files
|
Mon, 02 Mar 2020 10:29:41 +0100 |
Edouard Tisserant |
SVGHMI: fix some JS + add generation of detachable elements, to be continued
svghmi
|
changeset |
files
|
Fri, 28 Feb 2020 22:54:07 +0100 |
Edouard Tisserant |
SVGHMI: now compute discardable elements first so that we can do better grouping of required elements when sumarizing.
svghmi
|
changeset |
files
|