Overmind Connector

Overmind is a Hub connector that provides virtual data for testing and demonstration. It allows you to simulate a setpoint, counter, status, date, or geographic location, without physical equipment.

It manages two families of variables:

  • Defined —The value is set at save, and then changed by a write from a session, application, or other connector.
  • Evolving —The value changes automatically at a chosen interval. Subscribers receive the changes in value, quality, and source date.

The definition is carried by the URL of the handle. Name is mandatory and constitutes its primary reference. A third form, Overmind://Metronome, allows you to declare metronomes that synchronize evolving variables.

In this article

    Show more
    Show less

    1. Define and find a handle

    1.1 Path Structure

    The path of a handle is a URL. Its prefix, or protocol, is Overmind://. To define a variable, it is followed by Defined orEvolving, and then a question mark introducing its settings.

    Each parameter is an association Clé=Valeur. The character & separates the parameters, as in the query part of a URL.

    Counter from 0 to 100, incremented by 1 every 5 seconds, then reduced to 0:

    Overmind://Evolving?Name=Increment0To100Every5s&Type=Integer&InitialValue=0&EndValue=100&Step=1&Interval=5&Behavior=Increment
    
    

    1.2 Name: Identity and Replacement

    Name identifies a handle in an instance of Overmind. The spaces at the beginning and end of the name are removed, and the comparison is case-insensitive. Thus Counter and counter denote the same variable.

    Saving a definition with a name that is already present replaces the old definition and resets the value, even if the path provided is the same. Existing subscriptions to that name continue to receive its changes. An invalid definition is rejected before replacing the existing variable.

    1.3 Read and subscribe by name

    After saving the definition, use only its name to read its value or subscribe to its changes:

    Overmind://Name=Increment0To100Every5s
    
    

    This short path does not reset the handle. It only accepts the Name. To change the definition, save a path again Defined or Evolving with the same name.

    1.4 Write to a Defined handle

    Create an editable policy:

    Overmind://Defined?Name=MutableInteger20&Type=Integer&InitialValue=20
    
    

    Then send the value 25 à Overmind://Name=MutableInteger20 by the Hub write operation. The name remains the same, the value becomes 25 and the modification date is updated.

    A write that is incompatible with the type is rejected without changing the value or its date. Writes to a handle Evolving are refused.

    2. Types of values

    The parameter Type Indicates the nature of the simulated value. It determines how Overmind interprets the received value, which values are accepted, and what calculations are possible during an evolution or write.

    For example, Type=Integer Interpreter 10 like an integer to which we can add a step. Type=String canned 10 like text. Type=DateTime allows you to bring forward a date by a given duration.

    Handles Defined and Evolving use the same types. A statement Metronome has a period directly Span and doesn't use the Type.

    Type Manipulated value
    Boolean Boolean true or false.
    Integer Whole signed from -2147483648 to 2147483647.
    SmallInteger Unsigned byte from 0 to 255.
    Single Decimal number, stored in double precision in Overmind.
    DateTime Date and time published in UTC.
    GISVector Geographical position.
    String Text.
    Unknow, Any, Url, Guid Treated as text; a URL or Guid is not validated as such.
    Color, Image, Array Unsupported types: The definition is denied.

    Without Type, Overmind uses Unknow. A value such as 123 Text is left if no numeric type is indicated.

    3. Handles Defined

    A handle Defined represents a value that is fixed and then modified from the outside, by writing to the Hub. It is suitable, for example, for a setpoint, a forced state or a stable demonstration value. It does not evolve automatically.

    Multiple keys can be associated with Defined in its URL: the name identifies the variable, the type specifies its nature, and the other parameters allow you to choose its initial value, quality, or source date. The available keys are as follows.

    Parameter Role and default
    Name Required name, handle identity.
    Context Descriptive text optional, with no effect on identity.
    Type Value Type; Unknow by default.
    InitialValue Initial value, converted to Type.
    Status Initial quality; Good by default.
    LastModificationDate Initial source date; current UTC date by default.

    Context is optional descriptive information. It does not separate identities: two definitions have the same Name and different contexts refer to the same handle.

    Without InitialValue, the numbers are 0, the Boolean is false, the text is empty, the date is January 1, 1 UTC, and the GIS position is (0,0).

    LastModificationDate describes the date of the value, not how often it changes. A successful entry updates this date. A statement can therefore carry a quality Unreachable and an old date as soon as it is recorded to simulate unavailable or outdated data.

    4. Handles Evolving

    A handle Evolving represents a variable that changes automatically over time. It can simulate a counter, a random measurement, a series of states, an advancing date or a geographical displacement. Subscribers are informed of its evolution.

    The keys associated with Evolving in the URL allow you to choose the type of value, its departure, its arrival, how to evolve it and the duration between two changes. Step acts on the change in value; Interval Regulates the time between changes.

    Parameter Role and default
    Name Required name, handle identity.
    Context Descriptive text optional.
    Type Value Type; Unknow by default.
    InitialValue The starting point or initial entry of the Aggregate.
    EndValue Arrival marker, absolute date or duration depending on the type.
    Step No evolution, duration, jump in a list or number of GIS transitions.
    Interval Positive time between two evolutions; 30 seconds by default.
    Behavior Increment by default; Decrement or Random as desired. For text without explicit Aggregate, the default is Random (see Lists and texts).
    Aggregate A comma-separated list of values to browse.
    Metronome Name of an existing metronome; optional.
    Statuses List of possible qualities, separated by hyphens; Good by default.
    LastModificationTimeSpan Duration to subtract from the source date; zero by default.

    EndValue is the only accepted end point parameter.

    4.1 Behavior and looping

    Increment adds Step ; Decrement subtracts it. For numbers and dates, InitialValue is the starting point and EndValue the limit in the chosen direction. After exceeding this limit, the value returns to the starting point. The limit is reached if the step falls exactly on it.

    With InitialValue=0, EndValue=100 and Step=1, the sequence is 0, 1, 2, up to 100, and then 0. With InitialValue=3, EndValue=0 and Behavior=Decrement, it is 3, 2, 1, 0, then 3.

    Random chooses a value from the bounds or from a list of values (see below for the notion ofAggregate). Step is not used for random draw. If this parameter is provided, its value must still be valid.

    Without Behavior, the behavior is Increment. The special case of texts is explained in the Lists and texts section.

    4.2 Defaults and Step

    Type without Aggregate Default departure Default arrival terminal Default Step
    Integer Minimum of type; maximum in Decrement. Maximum of type; minimum in Decrement. 1.
    SmallInteger 0. 255 ; 0 in Decrement. 1.
    Single 0. Maximum of type; minimum in Decrement. 0.1.
    DateTime January 1, 1 UTC. Maximum date; minimum date in Decrement. 30 seconds.
    Boolean false. Alternation or random draw. Not used.
    String and similar types First entry in the list. List of texts. 1 entrance.
    GISVector Longitude 0, latitude 0. Historical end point: longitude 5.877286, latitude 47.858437 (see GISVector). A journey made in one trip.

    Choose self-explanatory terminals for a readable simulation. Step must be positive: integer for Integer, SmallInteger, lists and GIS transitions; decimal for Single ; Duration for DateTime.

    For a Boolean without Aggregate, Step is not used : the boolean is reversed at each deadline with Increment or Decrement. With Random, it is randomly drawn and can keep the same value. When a list of Booleans is provided by Aggregate, the list is traversed according to the rules described below.

    4.3 Aggregate Lists and Texts

    Aggregate=A,B,C provides the allowed values. Increment advance in the list, Decrement retreats and Random chooses an entrance. The path is cyclical; Step counts the entries to be skipped, with 1 by default.

    The first input is used initially, even with Decrement. InitialValue allows you to choose another entry and must then belong to the list. EndValue does not occur when the Aggregate is present. All entries are converted to the requested type.

    In a handle Evolving, A text always evolves by choosing an entry from a list. This concerns String and the types assimilated to the text: Any, Unknow, Url and Guid.

    This list can have three origins:

    • A Aggregate explicit: The values provided are the list. Without Behavior, they are browsed in order with Increment.
    • Texts defined by InitialValue and EndValue —They form a list of two entries. If an end is omitted, it is taken from the built-in list.
    • None of the above: Overmind uses its built-in message list.

    In the last two cases, without an explicit Aggregate, the Behavior default is Random. You can choose Behavior=Increment to browse the texts in order. A text Defined, on the other hand, remains a fixed value and does not use any lists.

    4.4 DateTime

    For a DateTime, InitialValue is the departure date. EndValue can be an absolute arrival date or a duration calculated from departure.

    Step is the duration of the simulated date. Interval is the real time between two evolutions: Step=30&Interval=1 Moves the date forward by 30 seconds every real second.

    Absolute arrival date: starting at 10:00 UTC, moving forward 30 seconds for every real second, and looping back after 10:01 UTC.

    Overmind://Evolving?Name=AdvanceDate30sEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=2026-09-08T10:01:00Z&Step=30&Interval=1
    
    

    Relative arrival date: travel one minute from 10 a.m. UTC, moving forward 500 ms for every real second.

    Overmind://Evolving?Name=AdvanceDate500msEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=00:01:00&Step=00:00:00.500&Interval=1
    
    

    Relative Duration in Decrement: Starting at 10:01 UTC, subtracting 30 seconds from each actual second, up to one minute before departure, and then repeating.

    Overmind://Evolving?Name=RewindDate30sEvery1s&Type=DateTime&InitialValue=2026-09-08T10:01:00Z&EndValue=60&Step=30&Interval=1&Behavior=Decrement
    
    

    Random Date: Choose a date every real second within a minute of 10 a.m. UTC. Step is not used.

    Overmind://Evolving?Name=RandomDateWithinMinuteEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=00:01:00&Interval=1&Behavior=Random
    
    

    4.5 GISVector

    An individual position uses the order longitude,latitude : InitialValue=2,48. Published values use the longitude;latitude, for example 2;48.

    For a GIS, EndValue is a point of arrival, not a maximum value. Coordinates 5.877286,47.858437 originate from a point in the connector's historical code; they do not represent any geographical boundaries. Specify InitialValue and EndValue allows you to choose your own route.

    Without Aggregate, a Transition is the move from the current position to the next position. Step indicates how many trips of the same length the journey from start to finish is divided. A transition is made at each Interval.

    With one start (2.48), one finish (4.50), Step=2 and Interval=1, the result is:

    Elapsed time Published position Movement
    0 seconds 2;48 Starting point.
    1 second 3;49 First transition: half the way.
    2 seconds 4;50 Second transition: arrival.
    3 seconds 2;48 Return to the start to start the journey again.
    Overmind://Evolving?Name=ForwardGisTripEvery1s&Type=GISVector&InitialValue=2,48&EndValue=4,50&Step=2&Interval=1
    
    

    Reverse InitialValue and EndValue reverses the route. With Random, a point is randomly drawn from the segment; Step is not used.

    5. Synchronize the evolutions with a metronome

    5.1 Declaring a metronome with a handle

    A metronome defines a cadence common to several variables. It also declares itself with a URL, before applying the variables that will use it.

    Metronome with beats spaced 250 ms apart:

    Overmind://Metronome?Span=00:00:00.250&Name=Demo250ms
    
    
    Key Role
    Name Mandatory name of the metronome.
    Span Mandatory and strictly positive duration between two beats. It accepts seconds, including fractional ones, or a formatted duration.

    The handle provides its period as a value, for example 00:00:00.2500000. It is readable with the reference by name described at the beginning of the document. It is not a beat counter and does not accept direct writing; to change the period, save a new definition Metronome.

    Restating the same name updates Span without restarting the common phase. If the new period is incompatible with an active or saved variable range, the declaration explicitly fails and the previous period remains applied.

    Names follow the same uniqueness rule as other handles. A metronome that is still in use cannot be replaced by a variable Defined or Evolving.

    5.2 Interval remains a duration

    The metronome is optional. Without Metronome, each handle evolves according to its interval since its initialization. Fractions of a second are accepted: Interval=0.29 requires an evolution every 290 ms.

    With Metronome, the handle retains its interval and joins a common temporal origin. Two handles with the same metronome and the same interval evolve at the same time frames, even if they were recorded at different times.

    A metronome has a name Name and a period Span strictly positive. The handle interval must be a positive integer multiple of this period. These are always durations: Interval=1 means a second, not a beat.

    Metronome Span Interval du handle Result
    250 ms 1 second Evolution every 4 beats.
    250 ms 500 ms Evolution every 2 beats.
    250 ms 750 ms Evolution every 3 beats.
    250 ms 290 ms Refusal: the report is not complete.
    10 ms 290 ms Evolution every 29 beats.

    Without Interval, the 30-second duration remains in effect and must also be a multiple of Span. A metronome missing from the configuration, an empty name, or an incompatible interval produces an explicit error.

    5.3 Common deadlines

    On a 250 ms metronome, handles of 500 ms and 750 ms intervals have a common deadline every 1.5 seconds. A handle added later joins the next deadline corresponding to its interval.

    Notifications are issued successively, with the date of the common deadline. The cadence is not a real-time guarantee. In the event of a delay in the engine, a single evolution is applied for the last deadline reached, without replaying all the missed beats. The reconnection creates a new common time origin.

    5.4 Prepare the metronomes for the examples

    The catalogue uses Demo250ms, stated above, and Demo10ms, whose beats are spaced 10 ms apart:

    Overmind://Metronome?Span=00:00:00.010&Name=Demo10ms
    
    

    Apply these two URLs before the seven synchronized examples. They are at the top of the table PreloadPaths provided at the end of the document. It is no longer necessary to prepare a base file for these examples.

    When a single batch of records contains a metronome declaration and its variables, Overmind processes the unique declaration of that metronome first. If multiple definitions share the same name in the batch, their order remains the order of the request to preserve the last record rule.

    A declaration by handle takes effect in memory, like that of a variable. Reapply it after a reconnection if it has not been saved in the database. The Overmind administration also allows you to create, modify and save metronomes.

    6. Quality, source date and errors

    Quality indicates the simulated state of the data; it is separate from Overmind's connection status.

    Quality Situation shown
    Good Valid data.
    Unreachable Inaccessible data.
    SpecificError Specific error.
    Unhandled Handle not supported.
    UnpluggedConnector Connector disconnected.
    NoConnectorFound No connectors found.

    Pros Defined, use Status. Pros Evolving, use Statuses=Good-Unreachable-SpecificError : A quality is chosen from this list for each change. A label of unknown quality is converted to SpecificError.

    LastModificationDate sets the initial date of a handle Defined. LastModificationTimeSpan Pushes back the source date by a Evolving without changing its interval: a value that is updated every second can be presented five minutes late.

    The Hub and ConnectorTester retain the original source quality and date. Thus a definition requiring Unreachable and a fixed date must display this same information as soon as it is saved, and then when played by name.

    A record failure provides an explicit reason and an error-level log, associated with the connector, path, and cause. This includes a Name absent, an unsupported type, a malformed value, a null interval, an unknown metronome, or a forbidden write.

    A simulation that fails during a published evolution SpecificError. The other handles continue to work.

    7. URL formats and reserved characters

    Parameter names, types, and behaviors are case-insensitive. Parameters that are unknown, repeated, or inapplicable to the handle family are denied.

    Because the path is a URL, some characters have a reserved role in it. For example, ? introduces the parameters and & separates them. When one of these characters is part of a value, it must be encoded to stay within that value. Spaces, accents, and the + sign must also be encoded in parameter values.

    Character Encoding in a value
    Space %20
    Ampersand & %26
    Sign + %2B
    Sign = %3D
    Question mark? %3F
    Sharp # %23
    Percentage % %25
    Comma in a GIS pair of an Aggregate %2C

    Numbers use the decimal point: 21.5, 0.25. Booleans use true or false, not 0 or 1.

    Dates can be written in ISO 8601, for example 2026-09-08T10:00:00Z. A date without a time zone is interpreted in UTC; published dates are normalized in UTC. In a positive time difference, encode the + sign: 2026-09-08T12:00:00%2B02:00.

    The durations accept a number of seconds, possibly fractional, or the format [jours.]hh:mm:ss[.fractions]. For example, 0.29 and 00:00:00.290 represent 290 ms; 1.02:03:04 represents 1 day, 2 hours, 3 minutes and 4 seconds.

    8. Installation and data retention

    The connector is distributed in the form of GraphicStream.Immersive.Hub.Connectors.Overmind.dll. Outside of the .NET 10 runtime, its application dependency is GraphicStream.Immersive.Hub.Abstractions.dll, provided by the host.

    For ConnectorTester, copy the Overmind DLL to the Connectors next to the executable, then run the test. It should offer a single Overmind connector. The configuration type is GraphicStream.Immersive.Hub.Connectors.Overmind.ConnectorSession.

    The Basics Overmind/database.json Stores catalog paths, administration variables, and metronome definitions. Metronomes are loaded on login. Saved paths do not automatically become active handles; they must be registered by a consumer.

    A disconnection stops the evolutions and empties the register of active handles. On restart, re-register the variables and metronomes that have not been saved. The basis is not an automatic saving of the last value of each handle.

    Malformed base JSON or invalid metronomes prevent the connection and produce an error. Deleting a path from the catalog accepts its name, short reference, or definition; it removes entries with the same name and saves the database.

    To adapt the old paths, add Name to all definitions and give distinct names to variables that were previously differentiated only by Context.

    9. Examples of handles

    9.1 Metronomes

    250ms metronome to synchronize variables.

    Overmind://Metronome?Span=00:00:00.250&Name=Demo250ms
    
    

    10 ms metronome for multiple intervals of 10 ms.

    Overmind://Metronome?Span=00:00:00.010&Name=Demo10ms
    
    

    9.2 Defined values

    Editable integer, initialized to 20.

    Overmind://Defined?Name=MutableInteger20&Type=Integer&InitialValue=20
    
    

    Editable Boolean, initialized to false.

    Overmind://Defined?Name=MutableBooleanFalse&Type=Boolean&InitialValue=false
    
    

    Editable byte, initialized to 128.

    Overmind://Defined?Name=MutableByte128&Type=SmallInteger&InitialValue=128
    
    

    Editable decimal, initialized to 21.5.

    Overmind://Defined?Name=MutableDecimal21Point5&Type=Single&InitialValue=21.5
    
    

    Text containing accents, spaces, & and +.

    Overmind://Defined?Name=TextWithReservedCharacters&Type=String&InitialValue=%C3%89tage%201%20%26%20accueil%20%2B%20caf%C3%A9
    
    

    Date set for September 8, 2026 at 10 a.m. UTC.

    Overmind://Defined?Name=FixedUtcDate&Type=DateTime&InitialValue=2026-09-08T10:00:00Z
    
    

    Date at 12 p.m. UTC+2, released at 10 a.m. UTC.

    Overmind://Defined?Name=DateWithTimeZone&Type=DateTime&InitialValue=2026-09-08T12:00:00%2B02:00
    
    

    Fixed position: longitude 2, latitude 48.

    Overmind://Defined?Name=FixedGisPosition&Type=GISVector&InitialValue=2,48
    
    

    Free text of type Any.

    Overmind://Defined?Name=FreeText&Type=Any&InitialValue=texte%20libre
    
    

    The URL address that is retained as text.

    Overmind://Defined?Name=UrlAsText&Type=Url&InitialValue=https:%2F%2Fexample.com%2Fstatus%3Fzone%3DA%26mode%3Dlive
    
    

    Guid ID kept as text.

    Overmind://Defined?Name=GuidAsText&Type=Guid&InitialValue=11111111-2222-3333-4444-555555555555
    
    

    Text without conversion, of type Unknow.

    Overmind://Defined?Name=UnknownTypeAsText&Type=Unknow&InitialValue=valeur%20sans%20conversion
    
    

    A value of 123 retained as text when Type is omitted.

    Overmind://Defined?Name=OmittedTypeAsText&InitialValue=123
    
    

    An integer initialized to 0 by default.

    Overmind://Defined?Name=DefaultIntegerZero&Type=Integer
    
    

    Byte initialized to 0 by default.

    Overmind://Defined?Name=DefaultByteZero&Type=SmallInteger
    
    

    Decimal set to 0 by default.

    Overmind://Defined?Name=DefaultDecimalZero&Type=Single
    
    

    Boolean set to false by default.

    Overmind://Defined?Name=DefaultBooleanFalse&Type=Boolean
    
    

    Empty text by default.

    Overmind://Defined?Name=DefaultEmptyText&Type=String
    
    

    Date initialized on January 1, 1 UTC.

    Overmind://Defined?Name=DefaultMinimumDate&Type=DateTime
    
    

    Position initialized at longitude 0, latitude 0.

    Overmind://Defined?Name=DefaultGisOrigin&Type=GISVector
    
    

    Value 42 with Good quality.

    Overmind://Defined?Name=GoodQualityValue&Type=Integer&InitialValue=42&Status=Good
    
    

    Value 42 with Unreachable quality.

    Overmind://Defined?Name=UnreachableQualityValue&Type=Integer&InitialValue=42&Status=Unreachable
    
    

    A value of 42 with SpecificError quality.

    Overmind://Defined?Name=SpecificErrorQualityValue&Type=Integer&InitialValue=42&Status=SpecificError
    
    

    Value 42 with Unhandled quality.

    Overmind://Defined?Name=UnhandledQualityValue&Type=Integer&InitialValue=42&Status=Unhandled
    
    

    Value 42 with UnpluggedConnector quality.

    Overmind://Defined?Name=UnpluggedConnectorQualityValue&Type=Integer&InitialValue=42&Status=UnpluggedConnector
    
    

    Value 42 with NoConnectorFound quality.

    Overmind://Defined?Name=NoConnectorFoundQualityValue&Type=Integer&InitialValue=42&Status=NoConnectorFound
    
    

    Value 42 dated January 1, 2026 at 8 AM UTC.

    Overmind://Defined?Name=FixedSourceDate&Type=Integer&InitialValue=42&LastModificationDate=2026-01-01T08:00:00Z
    
    

    Unknown quality converted to SpecificError.

    Overmind://Defined?Name=UnknownQualityBecomesSpecificError&Type=Integer&InitialValue=42&Status=ErreurSimulee
    
    

    Variable named "Room A & floor 1", with a descriptive context.

    Overmind://Defined?Name=Room%20A%20%26%20floor%201&Type=Integer&InitialValue=20&Context=B%C3%A2timent%20A%2F%C3%89tage%201
    
    

    9.3 Autonomous scalable values

    Counter from 0 to 100, +1 every 5 sec, then back to 0.

    Overmind://Evolving?Name=Increment0To100Every5s&Type=Integer&InitialValue=0&EndValue=100&Step=1&Interval=5&Behavior=Increment
    
    

    Countdown from 3 to 0 every second, then back to 3.

    Overmind://Evolving?Name=Countdown3To0Every1s&Type=Integer&InitialValue=3&EndValue=0&Step=1&Interval=1&Behavior=Decrement
    
    

    Random integer from 1 to 6 every second.

    Overmind://Evolving?Name=RandomInteger1To6Every1s&Type=Integer&InitialValue=1&EndValue=6&Interval=1&Behavior=Random
    
    

    Alternating between 2147483646 and 2147483647 every second.

    Overmind://Evolving?Name=IntegerMaximumEvery1s&Type=Integer&InitialValue=2147483646&EndValue=2147483647&Interval=1
    
    

    Byte from 0 to 255, +85 every second.

    Overmind://Evolving?Name=IncrementByte0To255Every1s&Type=SmallInteger&InitialValue=0&EndValue=255&Step=85&Interval=1&Behavior=Increment
    
    

    Byte from 255 to 0, -85 every second.

    Overmind://Evolving?Name=DecrementByte255To0Every1s&Type=SmallInteger&InitialValue=255&EndValue=0&Step=85&Interval=1&Behavior=Decrement
    
    

    Random byte from 0 to 255 every second.

    Overmind://Evolving?Name=RandomByteEvery1s&Type=SmallInteger&InitialValue=0&EndValue=255&Interval=1&Behavior=Random
    
    

    Decimal from 0 to 1, +0.25 every second.

    Overmind://Evolving?Name=IncrementDecimal0To1Every1s&Type=Single&InitialValue=0&EndValue=1&Step=0.25&Interval=1&Behavior=Increment
    
    

    Decimal from 1 to 0, -0.25 every second.

    Overmind://Evolving?Name=DecrementDecimal1To0Every1s&Type=Single&InitialValue=1&EndValue=0&Step=0.25&Interval=1&Behavior=Decrement
    
    

    Random decimal between 0 and 1 every second.

    Overmind://Evolving?Name=RandomDecimal0To1Every1s&Type=Single&InitialValue=0&EndValue=1&Interval=1&Behavior=Random
    
    

    Boolean reversed every second with Increment.

    Overmind://Evolving?Name=ToggleBooleanIncrementEvery1s&Type=Boolean&InitialValue=false&Interval=1&Behavior=Increment
    
    

    Boolean reversed every second with Decrement.

    Overmind://Evolving?Name=ToggleBooleanDecrementEvery1s&Type=Boolean&InitialValue=false&Interval=1&Behavior=Decrement
    
    

    Boolean randomly chosen every second.

    Overmind://Evolving?Name=RandomBooleanEvery1s&Type=Boolean&InitialValue=false&Interval=1&Behavior=Random
    
    

    Message from the built-in list randomly selected every 2 sec.

    Overmind://Evolving?Name=RandomBuiltInTextEvery2s&Type=String&Interval=2
    
    

    Messages in the built-in list are browsed in order every 2 sec.

    Overmind://Evolving?Name=OrderedBuiltInTextEvery2s&Type=String&Interval=2&Behavior=Increment
    
    

    Alternating between Stop and Start every 2 s.

    Overmind://Evolving?Name=ToggleStoppedRunningEvery2s&Type=String&InitialValue=Arr%C3%AAt&EndValue=Marche&Interval=2&Behavior=Increment
    
    

    Choice between Free and Occupied every 2 sec.

    Overmind://Evolving?Name=RandomFreeOccupiedEvery2s&Type=String&InitialValue=Libre&EndValue=Occup%C3%A9&Interval=2
    
    

    Cycle Welcome, Preparation, Execution, Completed every 2 sec.

    Overmind://Evolving?Name=OrderedWorkflowEvery2s&Type=String&Aggregate=Accueil,Pr%C3%A9paration,Ex%C3%A9cution,Termin%C3%A9&Interval=2
    
    

    Cycle A, C, B with Decrement every 2 sec.

    Overmind://Evolving?Name=ReverseTextListEvery2s&Type=String&Aggregate=A,B,C&Behavior=Decrement&Interval=2
    
    

    Free, Busy or Maintenance state chosen every 2 seconds.

    Overmind://Evolving?Name=RandomStateListEvery2s&Type=String&Aggregate=Libre,Occup%C3%A9,Maintenance&Behavior=Random&Interval=2
    
    

    List A, B, C, D traversed from B in jumps of 2 every second.

    Overmind://Evolving?Name=SkipTwoFromBEvery1s&Type=String&Aggregate=A,B,C,D&InitialValue=B&Step=2&Interval=1
    
    

    Cycle of steps 0, 10, 50, 100 every 2 s.

    Overmind://Evolving?Name=IntegerLevelsEvery2s&Type=Integer&Aggregate=0,10,50,100&Interval=2
    
    

    Cycle bytes 0, 128, 255 every 2 s.

    Overmind://Evolving?Name=ByteLevelsEvery2s&Type=SmallInteger&Aggregate=0,128,255&Interval=2
    
    

    Cycle decimals 18.5, 20.25 and 23.75 every 2 s.

    Overmind://Evolving?Name=DecimalLevelsEvery2s&Type=Single&Aggregate=18.5,20.25,23.75&Interval=2
    
    

    Cycle false, false, true every 2 sec.

    Overmind://Evolving?Name=BooleanSequenceEvery2s&Type=Boolean&Aggregate=false,false,true&Interval=2
    
    

    Cycle between three UTC dates every 2 s.

    Overmind://Evolving?Name=DateSequenceEvery2s&Type=DateTime&Aggregate=2026-09-08T08:00:00Z,2026-09-08T12:00:00Z,2026-09-08T18:00:00Z&Interval=2
    
    

    Cycle of texts A, B, C of the Any type every 2 seconds.

    Overmind://Evolving?Name=AnyTextListEvery2s&Type=Any&Aggregate=A,B,C&Interval=2
    
    

    Cycle of unknow x, y, z texts every 2 s.

    Overmind://Evolving?Name=UnknownTextListEvery2s&Type=Unknow&Aggregate=x,y,z&Interval=2
    
    

    Alternating between two URLs every 2 seconds.

    Overmind://Evolving?Name=UrlListEvery2s&Type=Url&Aggregate=https:%2F%2Fexample.com%2Fa,https:%2F%2Fexample.com%2Fb&Interval=2
    
    

    Alternating between two Guid identifiers every 2 seconds.

    Overmind://Evolving?Name=GuidListEvery2s&Type=Guid&Aggregate=11111111-2222-3333-4444-555555555555,aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee&Interval=2
    
    

    Date from 10 a.m. to 10:01 a.m., advanced by 30 seconds every second.

    Overmind://Evolving?Name=AdvanceDate30sEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=2026-09-08T10:01:00Z&Step=30&Interval=1
    
    

    Advance date by 500 ms every second, within a one-minute range.

    Overmind://Evolving?Name=AdvanceDate500msEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=00:01:00&Step=00:00:00.500&Interval=1
    
    

    Date from 10:01 a.m. to 10 a.m., set back 30 seconds every second.

    Overmind://Evolving?Name=RewindDate30sEvery1s&Type=DateTime&InitialValue=2026-09-08T10:01:00Z&EndValue=60&Step=30&Interval=1&Behavior=Decrement
    
    

    Date randomly drawn within a one-minute range, every second.

    Overmind://Evolving?Name=RandomDateWithinMinuteEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=00:01:00&Interval=1&Behavior=Random
    
    

    Path from (2.48) to (4.50) in two transitions, one per second.

    Overmind://Evolving?Name=ForwardGisTripEvery1s&Type=GISVector&InitialValue=2,48&EndValue=4,50&Step=2&Interval=1
    
    

    Path from (4.50) to (2.48) in two transitions, one per second.

    Overmind://Evolving?Name=ReverseGisTripEvery1s&Type=GISVector&InitialValue=4,50&EndValue=2,48&Step=2&Interval=1
    
    

    Point chosen on the segment (2.48)-(4.50) every second.

    Overmind://Evolving?Name=RandomGisPointEvery1s&Type=GISVector&InitialValue=2,48&EndValue=4,50&Interval=1&Behavior=Random
    
    

    Running three positions in order, one per second.

    Overmind://Evolving?Name=OrderedGisRouteEvery1s&Type=GISVector&Aggregate=48%2C2,49%2C3,50%2C4&Interval=1&Behavior=Increment
    
    

    Journey from three positions in the opposite direction, one per second.

    Overmind://Evolving?Name=ReverseGisRouteEvery1s&Type=GISVector&Aggregate=48%2C2,49%2C3,50%2C4&Interval=1&Behavior=Decrement
    
    

    Position chosen from three points every second.

    Overmind://Evolving?Name=RandomGisRouteEvery1s&Type=GISVector&Aggregate=48%2C2,49%2C3,50%2C4&Interval=1&Behavior=Random
    
    

    Counter from 0 to 10, +1 every 290 ms.

    Overmind://Evolving?Name=CounterEvery290ms&Type=Integer&InitialValue=0&EndValue=10&Interval=0.29
    
    

    Counter from 0 to 10, +1 every 90 sec.

    Overmind://Evolving?Name=CounterEvery90s&Type=Integer&InitialValue=0&EndValue=10&Interval=00:01:30
    
    

    Counter from 0 to 10, +1 every 1 day, 2 hours, 3 minutes and 4 seconds.

    Overmind://Evolving?Name=CounterEvery1d2h3m4s&Type=Integer&InitialValue=0&EndValue=10&Interval=1.02:03:04
    
    

    Counter from 0 to 10 every 250 ms, with scientific notation.

    Overmind://Evolving?Name=CounterEvery250msScientific&Type=Integer&InitialValue=0&EndValue=10&Interval=2.5e-1
    
    

    Counter from 0 to 10 every 30 s, interval omitted.

    Overmind://Evolving?Name=CounterDefault30s&Type=Integer&InitialValue=0&EndValue=10
    
    

    Counter from 0 to 2, +1 every second, with EndValue.

    Overmind://Evolving?Name=Counter0To2Every1s&Type=Integer&InitialValue=0&EndValue=2&Interval=1
    
    

    Counter with Good, Unreachable or SpecificError quality being fired every second.

    Overmind://Evolving?Name=RandomQualityCounterEvery1s&Type=Integer&InitialValue=0&EndValue=10&Interval=1&Statuses=Good-Unreachable-SpecificError
    
    

    Counter that changes every second with Unreachable quality.

    Overmind://Evolving?Name=UnreachableCounterEvery1s&Type=Integer&InitialValue=0&EndValue=10&Interval=1&Statuses=Unreachable
    
    

    Counter changing every second with unknown quality converted to SpecificError.

    Overmind://Evolving?Name=UnknownQualityCounterEvery1s&Type=Integer&InitialValue=0&EndValue=10&Interval=1&Statuses=ErreurSimulee
    
    

    Counter updated every second, with a source date set back 5 min.

    Overmind://Evolving?Name=CounterWith5MinuteOldDate&Type=Integer&InitialValue=0&EndValue=10&Interval=1&LastModificationTimeSpan=00:05:00&Context=D%C3%A9monstration%2FRetard
    
    

    9.4 Metronome-synchronized values

    Counter synchronized every second on Demo250ms.

    Overmind://Evolving?Name=SynchronizedCounterEvery1s&Type=Integer&InitialValue=0&EndValue=100&Interval=00:00:01&Metronome=Demo250ms
    
    

    Boolean synchronized with the previous counter, every second.

    Overmind://Evolving?Name=SynchronizedBooleanEvery1s&Type=Boolean&Interval=1&Metronome=Demo250ms
    
    

    Counter evolving every 2 beats of Demo250ms, i.e. 500 ms.

    Overmind://Evolving?Name=SynchronizedCounterEvery500ms&Type=Integer&InitialValue=0&EndValue=100&Interval=0.5&Metronome=Demo250ms
    
    

    Counter changing every 3 beats of Demo250ms, i.e. 750ms.

    Overmind://Evolving?Name=SynchronizedCounterEvery750ms&Type=Integer&InitialValue=0&EndValue=100&Interval=00:00:00.750&Metronome=Demo250ms
    
    

    Counter evolving every 29 beats of Demo10ms, i.e. 290ms.

    Overmind://Evolving?Name=SynchronizedCounterEvery290ms&Type=Integer&InitialValue=0&EndValue=100&Interval=0.29&Metronome=Demo10ms
    
    

    Counter synchronized to Demo250ms every 30 s, interval omitted.

    Overmind://Evolving?Name=SynchronizedCounterDefault30s&Type=Integer&InitialValue=0&EndValue=100&Metronome=Demo250ms
    
    

    Counter synchronized every second, with a source date set back 2 seconds.

    Overmind://Evolving?Name=SynchronizedCounterWith2sOldDate&Type=Integer&InitialValue=0&EndValue=100&Interval=1&Metronome=Demo250ms&LastModificationTimeSpan=2
    
    

    10. Load all samples into ConnectorTester

    The JSON table below contains 88 URLs: the two metronomes, then the 86 variables in the examples. Their names are identical to those used in this document.

    1. Close ConnectorTester, then open appsettings.json next to its executable.
    2. Integrate these paths into HubSettings.PreloadPaths, keeping the connectors, properties, and paths already configured. Do not create a second section HubSettings if it already exists.
    3. Relaunch the test and activate Overmind.
    4. Apply the first two lines, Demo250ms and Demo10ms, with the "Apply Handle to Hub" button.
    5. Apply the variables to be tested. The synchronized examples then have their metronomes.
    {
      "HubSettings": {
        "PreloadPaths": [
          "Overmind://Metronome?Span=00:00:00.250&Name=Demo250ms",
          "Overmind://Metronome?Span=00:00:00.010&Name=Demo10ms",
          "Overmind://Defined?Name=MutableInteger20&Type=Integer&InitialValue=20",
          "Overmind://Defined?Name=MutableBooleanFalse&Type=Boolean&InitialValue=false",
          "Overmind://Defined?Name=MutableByte128&Type=SmallInteger&InitialValue=128",
          "Overmind://Defined?Name=MutableDecimal21Point5&Type=Single&InitialValue=21.5",
          "Overmind://Defined?Name=TextWithReservedCharacters&Type=String&InitialValue=%C3%89tage%201%20%26%20accueil%20%2B%20caf%C3%A9",
          "Overmind://Defined?Name=FixedUtcDate&Type=DateTime&InitialValue=2026-09-08T10:00:00Z",
          "Overmind://Defined?Name=DateWithTimeZone&Type=DateTime&InitialValue=2026-09-08T12:00:00%2B02:00",
          "Overmind://Defined?Name=FixedGisPosition&Type=GISVector&InitialValue=2,48",
          "Overmind://Defined?Name=FreeText&Type=Any&InitialValue=texte%20libre",
          "Overmind://Defined?Name=UrlAsText&Type=Url&InitialValue=https:%2F%2Fexample.com%2Fstatus%3Fzone%3DA%26mode%3Dlive",
          "Overmind://Defined?Name=GuidAsText&Type=Guid&InitialValue=11111111-2222-3333-4444-555555555555",
          "Overmind://Defined?Name=UnknownTypeAsText&Type=Unknow&InitialValue=valeur%20sans%20conversion",
          "Overmind://Defined?Name=OmittedTypeAsText&InitialValue=123",
          "Overmind://Defined?Name=DefaultIntegerZero&Type=Integer",
          "Overmind://Defined?Name=DefaultByteZero&Type=SmallInteger",
          "Overmind://Defined?Name=DefaultDecimalZero&Type=Single",
          "Overmind://Defined?Name=DefaultBooleanFalse&Type=Boolean",
          "Overmind://Defined?Name=DefaultEmptyText&Type=String",
          "Overmind://Defined?Name=DefaultMinimumDate&Type=DateTime",
          "Overmind://Defined?Name=DefaultGisOrigin&Type=GISVector",
          "Overmind://Defined?Name=GoodQualityValue&Type=Integer&InitialValue=42&Status=Good",
          "Overmind://Defined?Name=UnreachableQualityValue&Type=Integer&InitialValue=42&Status=Unreachable",
          "Overmind://Defined?Name=SpecificErrorQualityValue&Type=Integer&InitialValue=42&Status=SpecificError",
          "Overmind://Defined?Name=UnhandledQualityValue&Type=Integer&InitialValue=42&Status=Unhandled",
          "Overmind://Defined?Name=UnpluggedConnectorQualityValue&Type=Integer&InitialValue=42&Status=UnpluggedConnector",
          "Overmind://Defined?Name=NoConnectorFoundQualityValue&Type=Integer&InitialValue=42&Status=NoConnectorFound",
          "Overmind://Defined?Name=FixedSourceDate&Type=Integer&InitialValue=42&LastModificationDate=2026-01-01T08:00:00Z",
          "Overmind://Defined?Name=UnknownQualityBecomesSpecificError&Type=Integer&InitialValue=42&Status=ErreurSimulee",
          "Overmind://Defined?Name=Room%20A%20%26%20floor%201&Type=Integer&InitialValue=20&Context=B%C3%A2timent%20A%2F%C3%89tage%201",
          "Overmind://Evolving?Name=Increment0To100Every5s&Type=Integer&InitialValue=0&EndValue=100&Step=1&Interval=5&Behavior=Increment",
          "Overmind://Evolving?Name=Countdown3To0Every1s&Type=Integer&InitialValue=3&EndValue=0&Step=1&Interval=1&Behavior=Decrement",
          "Overmind://Evolving?Name=RandomInteger1To6Every1s&Type=Integer&InitialValue=1&EndValue=6&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=IntegerMaximumEvery1s&Type=Integer&InitialValue=2147483646&EndValue=2147483647&Interval=1",
          "Overmind://Evolving?Name=IncrementByte0To255Every1s&Type=SmallInteger&InitialValue=0&EndValue=255&Step=85&Interval=1&Behavior=Increment",
          "Overmind://Evolving?Name=DecrementByte255To0Every1s&Type=SmallInteger&InitialValue=255&EndValue=0&Step=85&Interval=1&Behavior=Decrement",
          "Overmind://Evolving?Name=RandomByteEvery1s&Type=SmallInteger&InitialValue=0&EndValue=255&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=IncrementDecimal0To1Every1s&Type=Single&InitialValue=0&EndValue=1&Step=0.25&Interval=1&Behavior=Increment",
          "Overmind://Evolving?Name=DecrementDecimal1To0Every1s&Type=Single&InitialValue=1&EndValue=0&Step=0.25&Interval=1&Behavior=Decrement",
          "Overmind://Evolving?Name=RandomDecimal0To1Every1s&Type=Single&InitialValue=0&EndValue=1&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=ToggleBooleanIncrementEvery1s&Type=Boolean&InitialValue=false&Interval=1&Behavior=Increment",
          "Overmind://Evolving?Name=ToggleBooleanDecrementEvery1s&Type=Boolean&InitialValue=false&Interval=1&Behavior=Decrement",
          "Overmind://Evolving?Name=RandomBooleanEvery1s&Type=Boolean&InitialValue=false&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=RandomBuiltInTextEvery2s&Type=String&Interval=2",
          "Overmind://Evolving?Name=OrderedBuiltInTextEvery2s&Type=String&Interval=2&Behavior=Increment",
          "Overmind://Evolving?Name=ToggleStoppedRunningEvery2s&Type=String&InitialValue=Arr%C3%AAt&EndValue=Marche&Interval=2&Behavior=Increment",
          "Overmind://Evolving?Name=RandomFreeOccupiedEvery2s&Type=String&InitialValue=Libre&EndValue=Occup%C3%A9&Interval=2",
          "Overmind://Evolving?Name=OrderedWorkflowEvery2s&Type=String&Aggregate=Accueil,Pr%C3%A9paration,Ex%C3%A9cution,Termin%C3%A9&Interval=2",
          "Overmind://Evolving?Name=ReverseTextListEvery2s&Type=String&Aggregate=A,B,C&Behavior=Decrement&Interval=2",
          "Overmind://Evolving?Name=RandomStateListEvery2s&Type=String&Aggregate=Libre,Occup%C3%A9,Maintenance&Behavior=Random&Interval=2",
          "Overmind://Evolving?Name=SkipTwoFromBEvery1s&Type=String&Aggregate=A,B,C,D&InitialValue=B&Step=2&Interval=1",
          "Overmind://Evolving?Name=IntegerLevelsEvery2s&Type=Integer&Aggregate=0,10,50,100&Interval=2",
          "Overmind://Evolving?Name=ByteLevelsEvery2s&Type=SmallInteger&Aggregate=0,128,255&Interval=2",
          "Overmind://Evolving?Name=DecimalLevelsEvery2s&Type=Single&Aggregate=18.5,20.25,23.75&Interval=2",
          "Overmind://Evolving?Name=BooleanSequenceEvery2s&Type=Boolean&Aggregate=false,false,true&Interval=2",
          "Overmind://Evolving?Name=DateSequenceEvery2s&Type=DateTime&Aggregate=2026-09-08T08:00:00Z,2026-09-08T12:00:00Z,2026-09-08T18:00:00Z&Interval=2",
          "Overmind://Evolving?Name=AnyTextListEvery2s&Type=Any&Aggregate=A,B,C&Interval=2",
          "Overmind://Evolving?Name=UnknownTextListEvery2s&Type=Unknow&Aggregate=x,y,z&Interval=2",
          "Overmind://Evolving?Name=UrlListEvery2s&Type=Url&Aggregate=https:%2F%2Fexample.com%2Fa,https:%2F%2Fexample.com%2Fb&Interval=2",
          "Overmind://Evolving?Name=GuidListEvery2s&Type=Guid&Aggregate=11111111-2222-3333-4444-555555555555,aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee&Interval=2",
          "Overmind://Evolving?Name=AdvanceDate30sEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=2026-09-08T10:01:00Z&Step=30&Interval=1",
          "Overmind://Evolving?Name=AdvanceDate500msEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=00:01:00&Step=00:00:00.500&Interval=1",
          "Overmind://Evolving?Name=RewindDate30sEvery1s&Type=DateTime&InitialValue=2026-09-08T10:01:00Z&EndValue=60&Step=30&Interval=1&Behavior=Decrement",
          "Overmind://Evolving?Name=RandomDateWithinMinuteEvery1s&Type=DateTime&InitialValue=2026-09-08T10:00:00Z&EndValue=00:01:00&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=ForwardGisTripEvery1s&Type=GISVector&InitialValue=2,48&EndValue=4,50&Step=2&Interval=1",
          "Overmind://Evolving?Name=ReverseGisTripEvery1s&Type=GISVector&InitialValue=4,50&EndValue=2,48&Step=2&Interval=1",
          "Overmind://Evolving?Name=RandomGisPointEvery1s&Type=GISVector&InitialValue=2,48&EndValue=4,50&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=OrderedGisRouteEvery1s&Type=GISVector&Aggregate=48%2C2,49%2C3,50%2C4&Interval=1&Behavior=Increment",
          "Overmind://Evolving?Name=ReverseGisRouteEvery1s&Type=GISVector&Aggregate=48%2C2,49%2C3,50%2C4&Interval=1&Behavior=Decrement",
          "Overmind://Evolving?Name=RandomGisRouteEvery1s&Type=GISVector&Aggregate=48%2C2,49%2C3,50%2C4&Interval=1&Behavior=Random",
          "Overmind://Evolving?Name=CounterEvery290ms&Type=Integer&InitialValue=0&EndValue=10&Interval=0.29",
          "Overmind://Evolving?Name=CounterEvery90s&Type=Integer&InitialValue=0&EndValue=10&Interval=00:01:30",
          "Overmind://Evolving?Name=CounterEvery1d2h3m4s&Type=Integer&InitialValue=0&EndValue=10&Interval=1.02:03:04",
          "Overmind://Evolving?Name=CounterEvery250msScientific&Type=Integer&InitialValue=0&EndValue=10&Interval=2.5e-1",
          "Overmind://Evolving?Name=CounterDefault30s&Type=Integer&InitialValue=0&EndValue=10",
          "Overmind://Evolving?Name=Counter0To2Every1s&Type=Integer&InitialValue=0&EndValue=2&Interval=1",
          "Overmind://Evolving?Name=RandomQualityCounterEvery1s&Type=Integer&InitialValue=0&EndValue=10&Interval=1&Statuses=Good-Unreachable-SpecificError",
          "Overmind://Evolving?Name=UnreachableCounterEvery1s&Type=Integer&InitialValue=0&EndValue=10&Interval=1&Statuses=Unreachable",
          "Overmind://Evolving?Name=UnknownQualityCounterEvery1s&Type=Integer&InitialValue=0&EndValue=10&Interval=1&Statuses=ErreurSimulee",
          "Overmind://Evolving?Name=CounterWith5MinuteOldDate&Type=Integer&InitialValue=0&EndValue=10&Interval=1&LastModificationTimeSpan=00:05:00&Context=D%C3%A9monstration%2FRetard",
          "Overmind://Evolving?Name=SynchronizedCounterEvery1s&Type=Integer&InitialValue=0&EndValue=100&Interval=00:00:01&Metronome=Demo250ms",
          "Overmind://Evolving?Name=SynchronizedBooleanEvery1s&Type=Boolean&Interval=1&Metronome=Demo250ms",
          "Overmind://Evolving?Name=SynchronizedCounterEvery500ms&Type=Integer&InitialValue=0&EndValue=100&Interval=0.5&Metronome=Demo250ms",
          "Overmind://Evolving?Name=SynchronizedCounterEvery750ms&Type=Integer&InitialValue=0&EndValue=100&Interval=00:00:00.750&Metronome=Demo250ms",
          "Overmind://Evolving?Name=SynchronizedCounterEvery290ms&Type=Integer&InitialValue=0&EndValue=100&Interval=0.29&Metronome=Demo10ms",
          "Overmind://Evolving?Name=SynchronizedCounterDefault30s&Type=Integer&InitialValue=0&EndValue=100&Metronome=Demo250ms",
          "Overmind://Evolving?Name=SynchronizedCounterWith2sOldDate&Type=Integer&InitialValue=0&EndValue=100&Interval=1&Metronome=Demo250ms&LastModificationTimeSpan=2"
        ]
      }
    }