File dbus-final-0.0.0+git3e43f60.obscpio of Package kando

07070100000000000081A4000000000000000000000001643934E9000000FC000000000000000000000000000000000000002500000000dbus-final-0.0.0+git3e43f60/.babelrc{
  "plugins": [
    [ "@babel/plugin-proposal-decorators", { "decoratorsBeforeExport": true, "legacy": false } ],
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-syntax-bigint",
    "@babel/plugin-transform-async-to-generator"
  ]
}
07070100000001000081A4000000000000000000000001643934E90000018A000000000000000000000000000000000000002600000000dbus-final-0.0.0+git3e43f60/.eslintrc{
  "root": true,
  "extends": [ "eslint:recommended" ],
  "parserOptions": {
    "ecmaVersion": 2023
  },
  "plugins": ["jest"],
  "rules": {
    "no-constant-condition": ["error", { "checkLoops": false }],
    "eqeqeq": ["error", "always"],
    "no-console": "off",
    "no-empty": "off"
  },
  "env": {
    "jest/globals": true,
    "node": true,
    "mocha": true,
    "es2020": true
  }
}
07070100000002000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002400000000dbus-final-0.0.0+git3e43f60/.github07070100000003000081A4000000000000000000000001643934E900000021000000000000000000000000000000000000003000000000dbus-final-0.0.0+git3e43f60/.github/FUNDING.ymlko_fi: jelmerro
github: jelmerro
07070100000004000081A4000000000000000000000001643934E900000082000000000000000000000000000000000000002700000000dbus-final-0.0.0+git3e43f60/.gitignorelib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz

pids
logs
results
/coverage
/out
/doc

node_modules
npm-debug.log

*.swp
*.swo
07070100000005000081A4000000000000000000000001643934E90000176B000000000000000000000000000000000000002900000000dbus-final-0.0.0+git3e43f60/CHANGELOG.md# Changelog

## v0.10.2

This is a hotfix release for a bug in the system message bus.

* Add default parameters object to system message bus constructor (#90)
* Add missing flags to TypeScript definitions (#91)
* Add parameters object to system bus TypeScript definitions (#92)

## v0.10.1

This release includes bugfixes and new features.

* Support negotiating Unix FDs (#67, #89)
* Add noReply to MethodOptions interface in Type Definitions (#70)
* Fix compatibility with buffer@4 (#71)
* Init signals on ProxyObject creation (#86)

## v0.9.2

This release includes two bugfixes.

* service: Fix duplicate paths in xml introspection (#62)
* client: Fix a bug where signal handlers were run multiple times (#64)

## v0.9.1

This release includes some bug fixes, new features, and a semi-breaking change.

* (semi-breaking) Make type `ay` a buffer. This is different from previous behavior, but it is in line with the documentation from the beginning of the project. (#57)
* service: Add support for no reply methods (#50)
* fix syntax for tcp addresses (#51)
* Add typescript bindings for bus events (#58)
* bug: property getter executed when using `configureMembers` (#60)
* Improve code generators (#52)
* Avoid JSBI code paths when BigInt compatibility mode is not on (this should help a bit in webpack environments) (f1e2b4a)

## v0.8.2

This release includes some bug fixes.

* Include the TypeScript typings file in the package (#44)
* Add some fixes for TypeScript types (#45, #46, #47)
* Support unmarshalling messages in big endian (#36, #48)

## v0.8.1

This release contains bugfixes and new features.

* Update repository url to dbusjs org.
* Fix memory leak for high level client signal match rules. (#39, #40)
* Init proxy objects from xml string to avoid extra introspection. (4518825)
* Add `configureMembers` to service interface as an alternative to decorators. (#32)
* Allow async methods in the service interface. (#33)
* Add TypeScript typings. (#28, #34)
* Bugfix: correctly unmarshal unix socket 'h' type. (#35)
* Support DBus monitor clients. (#41, #42)

## v0.7.1

This release contains breaking changes, bugfixes, and features.

* Fix bus name validator for ProxyObject (#27)
* Move all constants to enum classes (breaking)
* Remove the `Name` class (breaking) (#22)
* Remove the `NameExistsError` (breaking)
* Enable TCP support (#26)
* Use nornagons put fork

## v0.6.1

This release contains new major features.

* Redesign, expose, and add tests for the low-level api (#20)
* Add reply info to DBusError for the client (#21)
* Add the dbus-next-send.js script to demonstrate the low-level api.

For more information on the low-level api, see the documentation for the new
classes and members.

* `Message` class - Represents a DBus message for sending or receiving messages on the bus.
* `MessageBus#call()` - Send a method call message on the bus and wait for a reply.
* `MessageBus#send()` - Send a message on the bus.
* `MessageBus#newSerial()` - Get a serial for sending the message.
* `MessageBus#addMethodHandler()` - Add a custom method handler for messages.
* `MessageBus#removeMethodHandler()` - Remove a method handler.

The `MessageBus` has gained the following events:

* `connect` - Emitted after the bus has connected.
* `message` - Emitted when a message is received on the bus.

## v0.5.1

This release contains some import bugfixes, features, and breaking changes. The
service interface has been upgraded to "somewhat stable".

* Use an ES2015 class for the `MessageBus`.
* Make the low level interface private for now. (breaking, ref #20).
* Document the public api and make everything not documented private (breaking, #10).
* Remove tcp message bus support (breaking).
* Forward connection errors to the `MessageBus`.
* Make `interfaces` member of the `ProxyObject` a map from interface names to `ProxyInterface`s (breaking).
* `ProxyObject#getInterface` now throws an error if the interface is not found (breaking).

## v0.4.2

This release contains some important bugfixes and features.

* Gracefully handle user errors in services by returning the error to the client. (#11)
* Remove the old high-level interfaces. (#15)
* Implement `org.freedesktop.DBus.Peer` for clients. (#16)
* Cache name owners and discriminate signals on owner (fixes a lot of mpris-service test errors).
* Clean up a lot of dead code.

## v0.4.1

This release contains breaking changes to how interfaces are exported on the bus with the public api. See the README and example service for the current way to export interfaces.

* Add continuous integration
* Give DBusError to clients when services throw errors (#11)
* get dbus session bus address from the filesystem when `DBUS_SESSION_BUS_ADDRESS` is not set in the environment (addresses #14)
* Add constants for name request flags
* remove `bus.export()` and `bus.unexport()` (breaking)
* Add `bus.requestName()` to the public api which now returns a promise which resolves to a `Name` object which is now also part of the public api.
* Add `name.release()` to remove a name from the bus

## v0.3.2

* Add bus name validators
* bugfix: allow "-" in bus names
* bugfix: Use Long.js internally to fix issues with sending and receiving negative numbers

## v0.3.1

Export dbus interface and member validators.

## v0.2.1

This version introduces changes for compatibility with node version 6.3.0 and adds the generate-interfaces.js utility.

## v0.2.0

This version contains breaking changes and new features.

* BigInt compatibility mode (breaking) (#7)
* Bump Node engine requirement to 8.2.1 (#7, #6)
* Make emitting of PropertiesChange a static method on Interface (breaking)
* Add `name` option to members to change the name from the JavaScript name (#9)
* Add `disabled` option to members to disable members at runtime (#9)
* Add tests for introspection xml generation

## v0.1.0

* Remove optimist dependency
* Allow throwing DBusError in getter and setter for interfaces
* Use BigInt for 'x' and 't' types
07070100000006000081A4000000000000000000000001643934E90000047E000000000000000000000000000000000000002400000000dbus-final-0.0.0+git3e43f60/LICENSEThe MIT License (MIT)

Copyright (c) 2023 Jelmer van Arnhem
Copyright (c) 2018 Tony Crisci
Copyright (c) 2012 Andrey Sidorov

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

07070100000007000081A4000000000000000000000001643934E900003D05000000000000000000000000000000000000002600000000dbus-final-0.0.0+git3e43f60/README.md# dbus-final

The (hopefully) final DBus library you will install for Node.js

Because there are far too many unmaintained ones at the moment.

`npm install git+https://github.com/Jelmerro/dbus-final.git`

## About

dbus-final is a fully featured high level library for DBus geared primarily towards integration of applications into Linux desktop and mobile environments.
dbus-final is a fork of [dbus-next](https://github.com/dbusjs/node-dbus-next) which itself is a fork of [dbus-native](https://github.com/sidorares/dbus-native) library.
Since none of the dbus libraries seem actively maintained I decided to do it myself.

## The Client Interface

You can get a proxy object for a name on the bus with the `bus.getProxyObject()` function, passing the name and the path.
The proxy object contains introspection data about the object including a list of nodes and interfaces.
You can get an interface with the `object.getInterface()` function passing the name of the interface.
The interface object has methods you can call that correspond to the methods in the introspection data.
Pass normal JavaScript objects to the parameters of the function and they will automatically be converted into the advertised DBus type.
However, you must use the `Variant` class to represent DBus variants.
Methods will similarly return JavaScript objects converted from the advertised DBus type, with the `Variant` class used to represent returned variants.
If the method returns multiple values, they will be returned within an array.
The interface object is an event emitter that will emit the name of a signal when it is emitted on the bus.
Arguments to the callback should correspond to the arguments of the signal.
This is a brief example of using a proxy object with the [MPRIS](https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html) media player interface.

```js
let dbus = require('dbus-final');
let bus = dbus.sessionBus();
let Variant = dbus.Variant;

// getting an object introspects it on the bus and creates the interfaces
let obj = await bus.getProxyObject('org.mpris.MediaPlayer2.vlc', '/org/mpris/MediaPlayer2');

// the interfaces are the primary way of interacting with objects on the bus
let player = obj.getInterface('org.mpris.MediaPlayer2.Player');
let properties = obj.getInterface('org.freedesktop.DBus.Properties');

// call methods on the interface
await player.Play()

// get properties with the properties interface (this returns a variant)
let volumeVariant = await properties.Get('org.mpris.MediaPlayer2.Player', 'Volume');
console.log('current volume: ' + volumeVariant.value);

// set properties with the properties interface using a variant
await properties.Set('org.mpris.MediaPlayer2.Player', 'Volume', new Variant('d', volumeVariant.value + 0.05));

// listen to signals
properties.on('PropertiesChanged', (iface, changed, invalidated) => {
  for (let prop of Object.keys(changed)) {
    console.log(`property changed: ${prop}`);
  }
});
```

For a complete example, see the [MPRIS client](https://github.com/dbusjs/node-dbus-final/blob/master/examples/mpris.js) example which can be used to control media players on the command line.

## The Service Interface

Interfaces extend the `Interface` class. Declare service methods, properties, and signals with the decorators provided from the library. You can optionally request a name on the bus with `bus.requestName()` so clients have a well-known name to connect to. Then call `bus.export()` with the path and interface to expose this interface on the bus.
Methods are called when a DBus client calls that method on the server. Properties can be gotten and set with the `org.freedesktop.DBus.Properties` interface and are included in the introspection xml.
To emit a signal, just call the method marked with the `signal` decorator and the signal will be emitted with the returned value.
If you have an interface xml description, which can be gotten from the `org.freedesktop.DBus.Introspect` method on an exported interface, you can generate dbus-final JavaScript classes from the xml file with the `bin/generate-interfaces.js` utility.

There are two main ways to use the interface, one of which uses decorators, the other an update function.

### Decorators using Babel

This interfaces uses the proposed [decorators syntax](https://github.com/tc39/proposal-decorators) which is not yet part of the ECMAScript standard, but should be included one day. Unfortunately, you'll need a [Babel plugin](https://www.npmjs.com/package/@babel/plugin-proposal-decorators) to make this code work for now.

```js
let dbus = require('dbus-final');
let Variant = dbus.Variant;

let {
  Interface, property, method, signal, DBusError,
  ACCESS_READ, ACCESS_WRITE, ACCESS_READWRITE
} = dbus.interface;

let bus = dbus.sessionBus();

class ExampleInterface extends Interface {
  @property({signature: 's', access: ACCESS_READWRITE})
  SimpleProperty = 'foo';

  _MapProperty = {
    'foo': new Variant('s', 'bar'),
    'bat': new Variant('i', 53)
  };

  @property({signature: 'a{sv}'})
  get MapProperty() {
    return this._MapProperty;
  }

  set MapProperty(value) {
    this._MapProperty = value;

    Interface.emitPropertiesChanged(this, {
      MapProperty: value
    });
  }

  @method({inSignature: 's', outSignature: 's'})
  Echo(what) {
    return what;
  }

  @method({inSignature: 'ss', outSignature: 'vv'})
  ReturnsMultiple(what, what2) {
    return [
      new Variant('s', what),
      new Variant('s', what2)
    ];
  }

  @method({inSignature: '', outSignature: ''})
  ThrowsError() {
    // the error is returned to the client
    throw new DBusError('org.test.iface.Error', 'something went wrong');
  }

  @method({inSignature: '', outSignature: '', noReply: true})
  NoReply() {
    // by setting noReply to true, dbus-final will NOT send a return reply through dbus
    // after the method is called.
  }

  @signal({signature: 's'})
  HelloWorld(value) {
    return value;
  }

  @signal({signature: 'ss'})
  SignalMultiple(x) {
    return [
      'hello',
      'world'
    ];
  }
}

let example = new ExampleInterface('org.test.iface');

setTimeout(() => {
  // emit the HelloWorld signal by calling the method with the parameters to
  // send to the listeners
  example.HelloWorld('hello');
}, 500);

async function main() {
  // make a request for the name on the bus
  await bus.requestName('org.test.name');
  // export the interface on the path
  bus.export('/org/test/path', example);
}

main().catch((err) => {
  console.log('Error: ' + err);
});
```

### Update function to configure members without babel

This is the same code snippet, but instead of using decorators it uses the `configureMembers` function to fix the DBus types.

```js
let dbus = require('dbus-final');
let Variant = dbus.Variant;

let {
  Interface, property, method, signal, DBusError,
  ACCESS_READ, ACCESS_WRITE, ACCESS_READWRITE
} = dbus.interface;

let bus = dbus.sessionBus();

class ExampleInterface extends Interface {
  SimpleProperty = 'foo';

  _MapProperty = {
    'foo': new Variant('s', 'bar'),
    'bat': new Variant('i', 53)
  };

  get MapProperty() {
    return this._MapProperty;
  }

  set MapProperty(value) {
    this._MapProperty = value;

    Interface.emitPropertiesChanged(this, {
      MapProperty: value
    });
  }

  Echo(what) {
    return what;
  }

  ReturnsMultiple(what, what2) {
    return [
      new Variant('s', what),
      new Variant('s', what2)
    ];
  }

  ThrowsError() {
    // the error is returned to the client
    throw new DBusError('org.test.iface.Error', 'something went wrong');
  }

  NoReply() {
    // by setting noReply to true, dbus-final will NOT send a return reply through dbus
    // after the method is called.
  }

  HelloWorld(value) {
    return value;
  }

  SignalMultiple(x) {
    return [
      'hello',
      'world'
    ];
  }
}
ExampleInterface.configureMembers({
    methods: {
        Echo: {inSignature: 's', outSignature: 's'},
        ReturnsMultiple: {inSignature: 'ss', outSignature: 'vv'},
        ThrowsError: {inSignature: '', outSignature: ''},
        NoReply: {inSignature: '', outSignature: '', noReply: true}
    },
    properties: {
        SimpleProperty: {signature: 's', access: ACCESS_READWRITE},
        MapProperty: {signature: 'a{sv}'}
    },
    signals: {
        HelloWorld: {signature: 's'},
        SignalMultiple: {signature: 'ss'}
    }
})

let example = new ExampleInterface('org.test.iface');

setTimeout(() => {
  // emit the HelloWorld signal by calling the method with the parameters to
  // send to the listeners
  example.HelloWorld('hello');
}, 500);

async function main() {
  // make a request for the name on the bus
  await bus.requestName('org.test.name');
  // export the interface on the path
  bus.export('/org/test/path', example);
}

main().catch((err) => {
  console.log('Error: ' + err);
});
```

This method is recommended if you are not using babel or do not want to use decorators.

## The Low-Level Interface

The low-level interface can be used to interact with messages directly. Create new messages with the `Message` class to be sent on the bus as method calls, signals, method returns, or errors. Method calls can be called with the `call()` method of the `MessageBus` to await a reply and `send()` can be use for messages that don't expect a reply.

```js
let dbus = require('dbus-final');
let Message = dbus.Message;

let bus = dbus.sessionBus();

// send a method call to list the names on the bus
let methodCall = new Message({
  destination: 'org.freedesktop.DBus',
  path: '/org/freedesktop/DBus',
  interface: 'org.freedesktop.DBus',
  member: 'ListNames'
});

let reply = await bus.call(methodCall);
console.log('names on the bus: ', reply.body[0]);

// add a custom handler for a particular method
bus.addMethodHandler((msg) => {
  if (msg.path === '/org/test/path' &&
      msg.interface === 'org.test.interface'
      && msg.member === 'SomeMethod') {
    // handle the method by sending a reply
    let someMethodReply = Message.newMethodReturn(msg, 's', ['hello']);
    bus.send(someMethodReply);
    return true;
  }
});

// listen to any messages that are sent to the bus
bus.on('message', (msg) => {
  console.log('got a message: ', msg);
});
```

For a complete example of how to use the low-level interface to send messages, see the `dbus-final-send.js` script in the `bin` directory.

## The Type System

Values that are sent or received over the message bus always have an associated signature that specifies the types of those values. For the high-level client and service, these signatures are specified in XML data which is advertised in a [standard DBus interface](https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format). The high-level client dynamically creates classes based on this introspection data with methods and signals with arguments based on the type signature. The high-level service does the inverse by introspecting the class to create the introspection XML data which is advertised on the bus for clients.

Each code in the signature is mapped to a JavaScript type as shown in the table below.

| Name        | Code | JS Type | Notes                                                              |
|-------------|------|---------|--------------------------------------------------------------------|
| BYTE        | y    | number  |                                                                    |
| BOOLEAN     | b    | boolean |                                                                    |
| INT16       | n    | number  |                                                                    |
| UINT16      | q    | number  |                                                                    |
| INT32       | i    | number  |                                                                    |
| UINT32      | u    | number  |                                                                    |
| INT64       | x    | BigInt  |                                                                    |
| UINT64      | t    | BigInt  |                                                                    |
| DOUBLE      | d    | number  |                                                                    |
| STRING      | s    | string  |                                                                    |
| OBJECT_PATH | o    | string  | Must be a valid object path                                        |
| SIGNATURE   | g    | string  | Must be a valid signature                                          |
| UNIX_FD     | h    | number  | Must be a valid unix file descriptor. e.g. from `fs.open()`        |
| ARRAY       | a    | Array   | Must be followed by a complete type which specifies the child type |
| STRUCT      | (    | Array   | Types in the JS Array must match the types between the parens      |
| VARIANT     | v    | Variant | This class is provided by the library.                             |
| DICT_ENTRY  | {    | Object  | Must be included in an array type to be an object.                 |

Unix file descriptors are only supported on abstract or domain (path) sockets. This is the default for both system and session bus.
When sending a file descriptor it must be kept open until the message is delivered.
When receiving a file descriptor the application is responsible for closing it.

The types `a`, `(`, `v`, and `{` are container types that hold other values. Examples of container types and JavaScript examples are in the table below.

| Signature | Example                                | Notes                                                                                                                                     |
|-----------|----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|
| `(su)`    | `[ 'foo', 5 ]`                         | Each element in the array must match the corresponding type of the struct member.                                                         |
| `as`      | `[ 'foo', 'bar' ]`                     | The child type comes immediately after the `a`. The array can have any number of elements, but they all must match the child type.        |
| `a{su}`   | `{ 'foo': 5 }`                         | An "array of dict entries" is represented by an Object. The type after `{` is the key type and the type before the `}` is the value type. |
| `ay`      | `Buffer.from([0x62, 0x75, 0x66])`      | Special case: an array of bytes is represented by a Node `Buffer`.                                                                        |
| `v`       | `new Variant('s', 'hello')`            | Signature must be a single type. Value may be a container type.                                                                           |
| `(asv)`   | `[ ['foo'], new Variant('s', 'bar') ]` | Containers may be nested.                                                                                                                 |

For more information on the DBus type system, see [the specification](https://dbus.freedesktop.org/doc/dbus-specification.html#type-system).

### Negotiating Unix File Descriptors

To support negotiating Unix file descriptors (DBus type `h`), set `negotiateUnixFd` to `true` in the message bus constructor options. The value of any type `h` in messages sent or received should be the file descriptor itself. You are responsible for closing any file descriptor sent or received by the bus.
07070100000008000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002000000000dbus-final-0.0.0+git3e43f60/bin07070100000009000081ED000000000000000000000001643934E900000D49000000000000000000000000000000000000003300000000dbus-final-0.0.0+git3e43f60/bin/dbus-final-send.js#!/usr/bin/env node

// TODO: test signal sending

const program = require('commander');
const dbus = require('../');
const Message = dbus.Message;
const {
  METHOD_RETURN,
  ERROR,
  SIGNAL,
  METHOD_CALL
} = dbus.MessageType;
const {
  isObjectPathValid,
  isMemberNameValid,
  isInterfaceNameValid,
  isBusNameValid
} = dbus.validators;

// XXX: just use yargs instead
const usage = `Usage: dbus-final-send.js [--help] [--system | --session] [--dest=NAME] [--type=TYPE] <objectPath> <interface.member> <body>`

function exitError(message) {
  console.error(usage);
  console.error(message);
  process.exit(1);
}

program
  .version('0.0.1')
  .description('Send a message to a message bus')
  .option('--system', 'Use the system bus')
  .option('--session', 'Use the session bus')
  .option('--dest <name>', 'The destination for the message')
  .option('--type <type>', 'The type of message to send (METHOD_CALL, SIGNAL)')
  .option('--signature <signature>', 'The signature of the message body')
  .arguments('<objectPath> <interface.member> <body>')
  .parse(process.argv);

if (program.system && program.session) {
  exitError('Only one of --system or --session may be passed');
}

if (!program.args[0]) {
  exitError('<objectPath> positional argument is required');
}

if (!program.args[1]) {
  exitError('<interface.member> positional argument is required');
}

const objectPath = program.args[0];
let ifaceMember = program.args[1].split('.');
const member = ifaceMember.splice(-1).join('');
const iface = ifaceMember.join('.');
const bodyStr = program.args[2] || '';

if (!isObjectPathValid(objectPath)) {
  exitError(`got invalid object path: ${objectPath}`);
}

if (!isInterfaceNameValid(iface)) {
  exitError(`got invalid interface: ${iface}`);
}

if (!isMemberNameValid(member)) {
  exitError(`got invalid member: ${member}`);
}

const types = {
  'METHOD_RETURN': METHOD_RETURN,
  'ERROR': ERROR,
  'SIGNAL': SIGNAL,
  'METHOD_CALL': METHOD_CALL
};

let type = types[program.type];

if (program.type && !type) {
  exitError(`got invalid message type: ${program.type}`);
}

type = type || METHOD_CALL;

if (type === ERROR || type === METHOD_RETURN) {
  exitError('only METHOD_CALL and SIGNAL types are currently supported');
}

if (!program.dest) {
  exitError('--dest is a required argument');
}

if (!isBusNameValid(program.dest) && !program.dest.match(/^:\d+/)) {
  exitError(`got invalid destination: ${program.dest}`);
}

let destination = program.dest;

if (bodyStr && !program.signature) {
  exitError('--signature is a required argument when passing a message body');
}

let signature = program.signature || '';
let body = [];
if (bodyStr) {
  try {
    body = JSON.parse(bodyStr);
  } catch (err) {
    exitError(`could not parse body as json: ${bodyStr}`);
  }
}

if (!Array.isArray(body)) {
  exitError('body must be an array of arguments');
}

let bus = (program.system ? dbus.systemBus() : dbus.sessionBus());

let message = new Message({
  type: type,
  destination: destination,
  path: objectPath,
  interface: iface,
  member: member,
  signature: signature,
  body: body
});

if (type === METHOD_CALL) {
  bus.call(message)
    .then((reply) => {
      console.log(JSON.stringify(reply, null, 2));
      process.exit(0);
    })
    .catch((err) => {
      console.error(`Error: ${err}`);
      process.exit(1);
    });
} else {
  bus.send(message);
  process.exit(0);
}
0707010000000A000081ED000000000000000000000001643934E900002E3E000000000000000000000000000000000000003E00000000dbus-final-0.0.0+git3e43f60/bin/generate-client-interfaces.js#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const xml2js = require('xml2js');
const Handlebars = require('handlebars');
let parser = new xml2js.Parser();
const program = require('commander');
const dbus = require('../');
const Message = dbus.Message;
const {
    METHOD_RETURN,
    ERROR,
    SIGNAL,
    METHOD_CALL
} = dbus.MessageType;
const {
    isObjectPathValid,
    isMemberNameValid,
    isInterfaceNameValid,
    isBusNameValid
} = dbus.validators;

function exitError(message) {
    program.outputHelp();
    console.error();
    console.error(message);
    process.exit(1);
}
const readFile = (fs.promises ? fs.promises.readFile : fs.readFileSync);
const writeFile = (fs.promises ? fs.promises.writeFile : fs.writeFileSync);

program
    .version('0.1.1')
    .description('Generate an interface from a DBus object')
    .option('--system', 'Use the system bus')
    .option('--session', 'Use the session bus')
    .option('-t, --template [path]', 'Template to use for interface generation')
    .option('--full', 'Do not exclude DBus standard interfaces')
    .option('-p, --prefix', 'Prefix class names with full interface path')
    .option('-o, --output [path]', 'The output file or directory (default: stdout)')
    .option('-r, --recursive', 'Recursively decent to child nodes (requires --output to be directory')
    .arguments('<destination> <objectPath>')
    .parse(process.argv);



if (program.system && program.session) {
    exitError('Only one of --system or --session may be passed');
}

if (!program.args[0]) {
    exitError('<destination> positional argument is required');
}

if (!program.args[1]) {
    exitError('<objectPath> positional argument is required');
}

const destination = program.args[0];
const objectPath = program.args[1];

if (!isObjectPathValid(objectPath)) {
    exitError(`got invalid object path: ${objectPath}`);
}

if (!isBusNameValid(destination) && !destination.match(/^:\d+/)) {
    exitError(`got invalid destination: ${destination}`);
}

program.template = program.template || "javascript-class.js";
if (path.basename(program.template, ".hbs") === program.template) {
    program.template = path.resolve(__dirname, "..", "templates", path.basename(program.template, ".hbs") + ".hbs");
}
const templateExt = path.extname(path.basename(program.template, ".hbs"));

if (!fs.existsSync(program.template)) {
    exitError(`template file '${program.template}' does not exists`);
}

if (program.recursive && !program.output) {
    exitError("Output directory is required for recursive operation");
}

if (program.recursive && !fs.existsSync(program.output)) {
    exitError(`Output directory '${program.output}' does not exists`);
}

if (program.recursive && !fs.lstatSync(program.output).isDirectory()) {
    exitError(`Output directory '${program.output}' is not a directory`);
}

const bus = (program.system ? dbus.systemBus() : dbus.sessionBus());


function getInterfaceDesc(destination, objectPath) {
    const message = new Message({
        type: METHOD_CALL,
        destination: destination,
        path: objectPath,
        interface: "org.freedesktop.DBus.Introspectable",
        member: "Introspect",
        signature: "",
        body: []
    });

    return bus.call(message).then((reply) => reply.body[0]);
}


function collapseSignature(args, dir) {
    let signature = '';
    args = args || [];
    for (arg of args) {
        if (!dir || arg['$'].direction === dir) {
            signature += arg['$'].type;
        }
    }
    return signature;
}

function tsType(type) {
    switch (type) {
        case "b": return "boolean";
        case "y":
        case "n":
        case "q":
        case "i":
        case "u":
        case "h":
        case "d":
            return "number";
        case "x":
        case "t":
            return "BigInt";
        case "g":
        case "s":
            return "string";
        case "o":
            return "DBus.ObjectPath";
        case "v":
            return "DBus.Variant";
    }
    if (type[0] === "a") {
        if (type[1] === "{") {
            if (type.match(/^a\{\w\w\}$/)) {
                return `{[key: ${tsType(type[2])}]: ${tsType(type[3])}}`
            }
            //TODO: handle more complex types
            return `/* ${type} */ {[key:string]: any}`;
        }
        // array of bytes is a NodeJS.Buffer
        if (type[1] === "y") {
            return "Buffer";
        }
        return new Handlebars.SafeString("Array<" + tsType(type.substr(1)) + ">");
    }
    if (type[0] === "(") {
        //TODO: handle more complex types
        return `/* ${type} */ any[]`;
    }

    return `/* ${type} */ any`;
}

const helpers = {
    ifeq(a, b, options) {
        if (a == b) { return options.fn(this); }
        return options.inverse(this);
    },
    unlesseq(a, b, options) {
        if (a != b) { return options.fn(this); }
        return options.inverse(this);
    },

    tsType: tsType,
    outType(args) {
        args = (args || []).map(p => p["$"]).filter((p) => p.direction === "out");

        if (args.length === 0) return "void";
        if (args.length === 1) return tsType(args[0].type);
        return "any"
    },

    canRead(access, options) {
        if (access === "read" || access === "readwrite") { return options.fn(this); }
        return options.inverse(this);
    },
    canWrite(access, options) {
        if (access === "write" || access === "readwrite") { return options.fn(this); }
        return options.inverse(this);
    },

    className(ifaceName) {
        if (program.prefix) {
            let name = ifaceName.split('');
            name[0] = name[0].toUpperCase();
            let dots = 0;
            for (let i = 0; i < name.length - dots; ++i) {
                if (name[i + dots] === '.') {
                    name[i] = name[i + dots + 1].toUpperCase();
                    ++dots;
                } else {
                    name[i] = name[i + dots];
                }
            }

            return name.slice(0, -1 * dots).join('');
        } else {
            let name = ifaceName.replace(destination, "").replace(/\./g, "");
            if (name === "") {
                const path = ifaceName.split(".");
                name = path[path.length - 1];
            }
            return name.charAt(0).toUpperCase() + name.slice(1);
        }
    },
    accessConst(access) {
        if (access === 'read') {
            return 'ACCESS_READ';
        } else if (access === 'write') {
            return 'ACCESS_WRITE';
        } else if (access === 'readwrite') {
            return 'ACCESS_READWRITE';
        } else {
            throw new Error(`got unknown access: ${access}`);
        }
    },
    inSignature(args) {
        return collapseSignature(args, 'in');
    },
    outSignature(args) {
        return collapseSignature(args, 'out');
    },
    signature(args) {
        return collapseSignature(args);
    },
    countArgs(args, dir) {
        let count = 0;
        for (arg of args) {
            if (!dir || arg['$'].direction === dir) {
                count++;
            }
        }
        return count;
    }
};

Handlebars.registerHelper(helpers);

async function parseXml(data) {
    return new Promise((resolve, reject) => {
        parser.parseString(data, (err, xml) => {
            if (err) {
                reject(err);
            }
            resolve(xml);
        })
    });
}

async function getInterfaceDataFromXml(data, objectPath) {
    let interfaces = [];
    let subNodes = [];

    let xml = await parseXml(data);
    if (!xml.node) {
        console.error('xml document did not contain a root node')
        process.exit(1);
    }
    if (xml.node.interface) {
        for (let iface of xml.node.interface) {
            if (!iface['$'] || !iface['$'].name) {
                console.log('got an interface without a name')
                process.exit(1);
            }
        }

        for (let iface of xml.node.interface) {
            if (!program.full && iface['$'].name.startsWith('org.freedesktop.DBus.')) {
                // ignore standard interfaces
                continue;
            }
            interfaces.push(iface);
        }
    }

    subNodes = (xml.node.node || []).map(n => n["$"].name);

    return {
        interfaces: interfaces,
        subNodes: subNodes,
        xmlData: new Handlebars.SafeString(data),
        objectPath: objectPath,
        serviceName: destination
    };
}

async function main() {
    const templateStr = await readFile(program.template, { encoding: "utf8" });

    const template = Handlebars.compile(templateStr);

    if (program.recursive) {
        const interfaceList = [];
        const nodeList = [objectPath];
        while (nodeList.length > 0) {
            const currentNode = nodeList.pop();
            console.log("Visit " + currentNode);
            const desc = await getInterfaceDesc(destination, currentNode);
            const interfaceData = await getInterfaceDataFromXml(desc, currentNode);

            nodeList.push(...interfaceData.subNodes.map(name => currentNode + "/" + name));
            for (const ifs of interfaceData.interfaces) {
                const foundInterface = interfaceList.find(i => i.name === ifs['$'].name);
                if (foundInterface) {
                    foundInterface.objectPaths.push(interfaceData.objectPath);
                } else {
                    interfaceList.push({
                        name: ifs['$'].name,
                        interface: ifs,
                        objectPaths: [interfaceData.objectPath],
                        xmlData: interfaceData.xmlData,
                        serviceName: interfaceData.serviceName,
                    });
                }
            }

            //const result = template(interfaceData);
        }

        for (const ifs of interfaceList) {
            let name = ifs.name.replace(ifs.serviceName, "").replace(/\./g, "-").replace(/^-/, "");
            if (name === "") {
                const path = ifs.name.split(".");
                name = path[path.length - 1];
            }
            let objectPath = ifs.objectPaths[0];
            if(ifs.objectPaths.length > 1) {
                // create a common path with wildcards
                objectPath = ifs.objectPaths
                    .map(p => p.split("/")) // split all on /
                    .reduce(($, row) => row.map((_, i) => [...($[i] || []), row[i]]), []) // transpose arrays
                    .map(frag => frag.filter((v, i, a) => a.indexOf(v) === i)) // make fragments unique
                    .map(frag => frag.length === 1 ? frag[0] : "*") // replace non unique fragments with *
                    .join("/") // rebuild path
            }

            console.log("Process %s as %s", ifs.name, name);
            ifs.filename = name + templateExt;
            ifs.result = template({
                interfaces: [ifs.interface],
                xmlData: ifs.objectPaths.length === 1 ? ifs.xmlData : undefined,
                objectPath: objectPath, 
                serviceName: ifs.serviceName
            });

            // TODO: Check for duplicate file names
            await writeFile(path.join(program.output, ifs.filename), ifs.result);
        }
    } else {
        const desc = await getInterfaceDesc(destination, objectPath);
        const interfaceData = await getInterfaceDataFromXml(desc, objectPath);
        const result = template(interfaceData);
        if (program.output) {
            await writeFile(program.output, result);
        } else {
            console.log(result);
        }
    }
    return 0;
}

main()
    .then(() => {
        bus.disconnect();
    })
    .catch((err) => {
        console.error(`Error:`, err);
        process.exit(1);
    });

0707010000000B000081ED000000000000000000000001643934E900001152000000000000000000000000000000000000003700000000dbus-final-0.0.0+git3e43f60/bin/generate-interfaces.js#!/usr/bin/env node

const fs = require('fs');
const xml2js = require('xml2js');
const Handlebars = require('handlebars');
let parser = new xml2js.Parser();

var program = require('commander');

program
  .version('0.0.1')
  .description('Generate a dbus-final JavaScript interface from an xml DBus interface description.')
  .arguments('<interface_xml..>')
  .option('-o, --output [path]', 'The output file path for JavaScript classes (default: stdout)')
  .parse(process.argv);

const templateData = `
let dbus = require('dbus-final');
let Variant = dbus.Variant;

let {
  Interface, property, method, signal, DBusError,
  ACCESS_READ, ACCESS_WRITE, ACCESS_READWRITE
} = dbus.interface;

{{#each interfaces}}
module.exports.{{className $.name}} = class {{className $.name}} extends Interface {
  constructor() {
    super('{{$.name}}');
  }

  {{#each property}}
  @property({ name: '{{$.name}}', signature: '{{$.type}}', access: {{accessConst $.access}} })
  get {{$.name}}() {
    // TODO implement property getter for {{$.name}}
  }

  set {{$.name}}(value) {
    // TODO implement property setter for {{$.name}}
  }

  {{/each}}

  {{#each method}}
  @method({ name: '{{$.name}}', inSignature: '{{inSignature arg}}', outSignature: '{{outSignature arg}}' })
  {{$.name}}() {
    // TODO implement the {{$.name}} method
  }

  {{/each}}
  {{#each signal}}
  @signal({ name: '{{$.name}}', signature: '{{signature arg}}' })
  {{$.name}}() {
    // TODO implement the {{$.name}} signal
  }

  {{/each}}
}

{{/each}}
`;

function collapseSignature(args, dir) {
  signature = '';
  args = args || [];
  for (arg of args) {
    if (!dir || arg['$'].direction === dir) {
      signature += arg['$'].type;
    }
  }
  return signature;
}

const helpers = {
  className(ifaceName) {
    let name = ifaceName.split('');
    name[0] = name[0].toUpperCase();
    let dots = 0;
    for (let i = 0; i < name.length - dots; ++i) {
      if (name[i+dots] === '.') {
        name[i] = name[i+dots+1].toUpperCase();
        ++dots;
      } else {
        name[i] = name[i+dots];
      }
    }

    return name.slice(0, -1 * dots).join('');
  },
  accessConst(access) {
    if (access === 'read') {
      return 'ACCESS_READ';
    } else if (access === 'write') {
      return 'ACCESS_WRITE';
    } else if (access === 'readwrite') {
      return 'ACCESS_READWRITE';
    } else {
      throw new Error(`got unknown access: ${access}`);
    }
  },
  inSignature(args) {
    return collapseSignature(args, 'in');
  },
  outSignature(args) {
    return collapseSignature(args, 'out');
  },
  signature(args) {
    return collapseSignature(args);
  },
  countArgs(args, dir) {
    let count = 0;
    for (arg of args) {
      if (!dir || arg['$'].direction === dir) {
        count++;
      }
    }
    return count;
  }
};

Handlebars.registerHelper(helpers);

async function parseXml(data) {
  return new Promise((resolve, reject) => {
    parser.parseString(data, (err, xml) => {
      if (err) {
        reject(err);
      }
      resolve(xml);
    })
  });
}

async function templateXmlFiles(template, files) {
  let result = '';

  let interfaces = [];
  for (let file of files) {
    let data = fs.readFileSync(file);

    let xml = await parseXml(data);
    if (!xml.node) {
      console.error('xml document did not contain a root node')
      process.exit(1);
    }
    if (!xml.node.interface) {
      console.error('xml document did not contain any interfaces');
      process.exit(1);
    }

    for (iface of xml.node.interface) {
      if (!iface['$'] || !iface['$'].name) {
        console.log('got an interface without a name')
        process.exit(1);
      }
    }

    for (iface of xml.node.interface) {
      if (iface['$'].name.startsWith('org.freedesktop.DBus.')) {
        // ignore standard interfaces
        continue;
      }
      interfaces.push(iface);
    }

    result += template({ interfaces: interfaces });
  }

  return result;
}

async function main() {
  if (program.args.length === 0) {
    program.outputHelp();
    process.exit(1);
  }

  let template = Handlebars.compile(templateData);
  let result = await templateXmlFiles(template, program.args);

  if (program.output) {
    fs.writeFileSync(program.output, result);
  } else {
    console.log(result);
  }
  return 0;
}

main()
  .then(status => {
    process.exit(status || 0);
  })
  .catch(error => {
    console.log(error);
    process.exit(1);
  });
0707010000000C000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002500000000dbus-final-0.0.0+git3e43f60/examples0707010000000D000081ED000000000000000000000001643934E900000DF8000000000000000000000000000000000000002E00000000dbus-final-0.0.0+git3e43f60/examples/mpris.js#!/usr/bin/env node
let dbus = require('../');
let program = require('commander');

const MPRIS_IFACE = 'org.mpris.MediaPlayer2.Player';
const MPRIS_PATH = '/org/mpris/MediaPlayer2';
const PROPERTIES_IFACE = 'org.freedesktop.DBus.Properties';

async function listAll() {
  let bus = dbus.sessionBus();
  let obj = await bus.getProxyObject('org.freedesktop.DBus', '/org/freedesktop/DBus');
  let iface = obj.getInterface('org.freedesktop.DBus');
  let names = await iface.ListNames();
  let result = names.filter((n) => n.startsWith('org.mpris.MediaPlayer2'))
  return result;
}

function printEpilogue() {
  console.log('');
  console.log('Commands:');
  console.log('  play, pause, stop, metadata, now-playing');
}

program
  .version('0.0.1')
  .arguments('<command>')
  .option('-p, --player <player>', 'The player to control')
  .option('-l, --list-all', 'List all players and exit');

program.on('--help', printEpilogue);
program.parse(process.argv)

if (!program.listAll && !program.args.length) {
  program.outputHelp();
  printEpilogue();
  process.exit(0);
}

async function printNames() {
  let names = await listAll();
  for (let n of names) {
    console.log(n);
  }
}

function printMetadata(metadata) {
  for (k of Object.keys(metadata.value)) {
    let value = metadata.value[k].value;
    console.log(k.padEnd(23) + value);
  }
}

let lastNowPlaying = '';

function printNowPlaying(metadata) {
  let artistVariant = metadata.value['xesam:artist'];
  let titleVariant = metadata.value['xesam:title'];
  let artist = artistVariant ? artistVariant.value : 'unknown';
  let title = titleVariant ? titleVariant.value : 'unknown';
  let nowPlaying = `${artist} - ${title}`;

  if (lastNowPlaying !== nowPlaying) {
    console.log(nowPlaying);
    lastNowPlaying = nowPlaying;
  }
}

async function nowPlaying(obj) {
  return new Promise(resolve => {
    let props = obj.getInterface(PROPERTIES_IFACE);
    props.on('PropertiesChanged', (iface, changed, invalidated) => {
      if (changed.hasOwnProperty('Metadata')) {
        printNowPlaying(changed['Metadata']);
      }
    });
  });
}

async function main() {
  if (program.listAll) {
    await printNames();
    return 0;
  }

  let command = program.args[0];
  if (['play', 'pause', 'stop', 'metadata', 'now-playing'].indexOf(command) === -1) {
    program.outputHelp();
    printEpilogue();
    return 1;
  }

  let playerName = program.player;
  if (!playerName) {
    let names = await listAll();
    if (!names.length) {
      console.error('no players found');
      return 1;
    }
    playerName = names[0];
  }
  if (!playerName.startsWith('org.mpris.MediaPlayer2')) {
    playerName = `org.mpris.MediaPlayer2.${program.player}`;
  }

  let bus = dbus.sessionBus();
  let obj = await bus.getProxyObject(playerName, MPRIS_PATH);
  let player = obj.getInterface(MPRIS_IFACE);
  let props = obj.getInterface(PROPERTIES_IFACE);

  switch (command) {
    case 'play':
      await player.Play();
      break;
    case 'pause':
      await player.Pause();
      break;
    case 'stop':
      await player.Stop();
      break;
    case 'metadata': {
      let metadata = await props.Get(MPRIS_IFACE, 'Metadata');
      printMetadata(metadata);
      break;
    }
    case 'now-playing': {
      let metadata = await props.Get(MPRIS_IFACE, 'Metadata');
      printNowPlaying(metadata);
      await nowPlaying(obj);
      // doesnt return
      break;
    }
  }

  return 0;
}

main()
  .then(status => {
    process.exit(status || 0);
  })
  .catch(error => {
    console.log(error);
    process.exit(1);
  });
0707010000000E000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002D00000000dbus-final-0.0.0+git3e43f60/examples/service0707010000000F000081A4000000000000000000000001643934E9000000CA000000000000000000000000000000000000003600000000dbus-final-0.0.0+git3e43f60/examples/service/.babelrc{
  "plugins": [
    [ "@babel/plugin-proposal-decorators", { "decoratorsBeforeExport": true, "legacy": false } ],
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-syntax-bigint"
  ]
}
07070100000010000081A4000000000000000000000001643934E900000027000000000000000000000000000000000000003800000000dbus-final-0.0.0+git3e43f60/examples/service/.gitignorenode_modules
/build
package-lock.json

07070100000011000081A4000000000000000000000001643934E9000001D1000000000000000000000000000000000000003700000000dbus-final-0.0.0+git3e43f60/examples/service/README.md# dbus-final example service

Compile and run with:

```
npm install
npm start
```

Set a property:

```
gdbus call --session --dest org.test.name --object-path /org/test/path \
  --method org.freedesktop.DBus.Properties.Set \
  'org.test.iface' 'MapProperty' "<{'foo':<'bar'>}>"
```

Get a property:

```
gdbus call --session --dest org.test.name --object-path /org/test/path \
  --method org.freedesktop.DBus.Properties.Get \
  'org.test.iface' 'MapProperty'
```
07070100000012000081A4000000000000000000000001643934E900000742000000000000000000000000000000000000003600000000dbus-final-0.0.0+git3e43f60/examples/service/index.jslet dbus = require('../../../');
let Variant = dbus.Variant;

let {
  Interface, property, method, signal, DBusError,
  ACCESS_READ, ACCESS_WRITE, ACCESS_READWRITE
} = dbus.interface;

let bus = dbus.sessionBus();

class ExampleInterface extends Interface {
  @property({signature: 's', access: ACCESS_READWRITE})
  SimpleProperty = 'foo';

  _MapProperty = {
    'foo': new Variant('s', 'bar'),
    'bat': new Variant('i', 53)
  };

  @property({signature: 'a{sv}'})
  get MapProperty() {
    return this._MapProperty;
  }

  set MapProperty(value) {
    this._MapProperty = value;

    this.PropertiesChanged({
      MapProperty: value
    });
  }

  @method({inSignature: 's', outSignature: 's'})
  Echo(what) {
    return what;
  }

  @method({inSignature: 'ss', outSignature: 'vv'})
  ReturnsMultiple(what, what2) {
    return [
      new Variant('s', what),
      new Variant('s', what2)
    ];
  }

  @method({inSignature: '', outSignature: ''})
  ThrowsError() {
    throw new DBusError('org.test.iface.Error', 'something went wrong');
  }

  @method({inSignature: '', outSignature: '', noReply: true})
  NoReply() {

  }

  @signal({signature: 's'})
  HelloWorld(value) {
    return value;
  }

  @signal({signature: 'ss'})
  SignalMultiple(x) {
    return [
      'hello',
      'world'
    ];
  }
}

class ExampleInterface2 extends Interface {
  @method({inSignature: '', outSignature: 's'})
  SomeMethod() {
    return 'ok'
  }
}

let example = new ExampleInterface('org.test.iface');
let example2 = new ExampleInterface2('org.test.iface2');

setTimeout(() => {
  // emit the HelloWorld signal
  example.HelloWorld('hello');
}, 500);

async function main() {
  await bus.requestName('org.test.name');
  bus.export('/org/test/path', example);
  bus.export('/org/test/path', example2);
}

main().catch((err) => {
  console.log('Error:' + err);
});
07070100000013000081A4000000000000000000000001643934E900000156000000000000000000000000000000000000003A00000000dbus-final-0.0.0+git3e43f60/examples/service/package.json{
    "devDependencies": {
        "@babel/cli": "^7.1.2",
        "@babel/core": "^7.1.2",
        "@babel/plugin-proposal-class-properties": "^7.1.0",
        "@babel/plugin-proposal-decorators": "^7.1.2"
    },
    "scripts": {
        "start": "rm -rf build && mkdir build && babel ./index.js -o ./build/index.js && node ./build"
    }
}
07070100000014000081A4000000000000000000000001643934E90000095C000000000000000000000000000000000000002500000000dbus-final-0.0.0+git3e43f60/index.jsconst constants = require('./lib/constants');
const MessageBus = require('./lib/bus');
const errors = require('./lib/errors');
const {Variant} = require('./lib//variant');
const {Message} = require('./lib/message-type.js');
const iface = require('./lib/service/interface');
const createConnection = require('./lib/connection.js');

let createClient = function(params) {
  let connection = createConnection(params || {});
  return new MessageBus(connection);
};

/**
 * Create a new {@link MessageBus} client on the DBus system bus to connect to
 * interfaces or request service names. Connects to the socket specified by the
 * `DBUS_SYSTEM_BUS_ADDRESS` environment variable or
 * `unix:path=/var/run/dbus/system_bus_socket`.
 *
 * @param {object} [options] - Options for `MessageBus` creation.
 * @param {object} [options.negotiateUnixFd] - Whether this bus should support the negotiation of Unix file descriptors.
 */
module.exports.systemBus = function(opts) {
  if(!opts)
    opts = {};
  return createClient({
    negotiateUnixFd: opts.negotiateUnixFd,
    busAddress:
      process.env.DBUS_SYSTEM_BUS_ADDRESS ||
      'unix:path=/var/run/dbus/system_bus_socket'
  });
};

/**
 * Create a new {@link MessageBus} client on the DBus session bus to connect to
 * interfaces or request service names.
 *
 * @param {object} [options] - Options for `MessageBus` creation.
 * @param {object} [options.busAddress] - The socket path for the session bus.
 * @param {object} [options.negotiateUnixFd] - Whether this bus should support the negotiation of Unix file descriptors.
 * Defaults to finding the bus address in the manner specified in the DBus
 * specification. The bus address will first be read from the
 * `DBUS_SESSION_BUS_ADDRESS` environment variable and when that is not
 * available, found from the `$HOME/.dbus` directory.
 */
module.exports.sessionBus = function(opts) {
  return createClient(opts);
};

module.exports.NameFlag = constants.NameFlag;
module.exports.RequestNameReply = constants.RequestNameReply;
module.exports.ReleaseNameReply = constants.ReleaseNameReply;
module.exports.MessageType = constants.MessageType;
module.exports.MessageFlag = constants.MessageFlag;

module.exports.interface = iface;
module.exports.Variant = Variant;
module.exports.Message = Message;
module.exports.validators = require('./lib/validators');
module.exports.DBusError = errors.DBusError;
07070100000015000081A4000000000000000000000001643934E900000029000000000000000000000000000000000000002700000000dbus-final-0.0.0+git3e43f60/jsdoc.conf {
    "plugins": ["plugins/markdown"]
}
07070100000016000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002000000000dbus-final-0.0.0+git3e43f60/lib07070100000017000081A4000000000000000000000001643934E900000A9C000000000000000000000000000000000000002F00000000dbus-final-0.0.0+git3e43f60/lib/address-x11.jsconst fs = require('fs');
const os = require('os');

function getDbusAddressFromWindowSelection (callback) {
  // read dbus adress from window selection
  // TODO: implement this somewhere
  const x11 = require('x11');
  if (x11 === null) {
    throw new Error('cannot get session bus address from window selection: dbus-final was installed without x11 support');
  }

  // read machine uuid
  fs.readFile('/var/lib/dbus/machine-id', 'ascii', function (err, uuid) {
    if (err) return callback(err);
    const hostname = os.hostname().split('-')[0];
    x11.createClient(function (err, display) {
      if (err) return callback(err);
      const X = display.client;
      const selectionName = `_DBUS_SESSION_BUS_SELECTION_${
        hostname
      }_${uuid.trim()}`;
      X.InternAtom(false, selectionName, function (err, id) {
        if (err) return callback(err);
        X.GetSelectionOwner(id, function (err, win) {
          if (err) return callback(err);
          X.InternAtom(false, '_DBUS_SESSION_BUS_ADDRESS', function (
            err,
            propId
          ) {
            if (err) return callback(err);
            win = display.screen[0].root;
            X.GetProperty(0, win, propId, 0, 0, 10000000, function (err, val) {
              if (err) return callback(err);
              callback(null, val.data.toString());
            });
          });
        });
      });
    });
  });
}

function getDbusAddressFromFs () {
  const home = process.env.HOME;
  const display = process.env.DISPLAY;
  if (!display) {
    throw new Error('could not get DISPLAY environment variable to get dbus address');
  }

  const reg = /.*:([0-9]+)\.?.*/;
  const match = display.match(reg);

  if (!match || !match[1]) {
    throw new Error('could not parse DISPLAY environment variable to get dbus address');
  }

  const displayNum = match[1];

  const machineId = fs.readFileSync('/var/lib/dbus/machine-id').toString().trim();
  const dbusInfo = fs.readFileSync(`${home}/.dbus/session-bus/${machineId}-${displayNum}`).toString().trim();
  for (let line of dbusInfo.split('\n')) {
    line = line.trim();
    if (line.startsWith('DBUS_SESSION_BUS_ADDRESS=')) {
      let address = line.split('DBUS_SESSION_BUS_ADDRESS=')[1];
      if (!address) {
        throw new Error('DBUS_SESSION_BUS_ADDRESS variable is set incorrectly in dbus info file');
      }

      const removeQuotes = /^['"]?(.*?)['"]?$/;
      address = address.match(removeQuotes)[1];
      return address;
    }
  }

  throw new Error('DBUS_SESSION_BUS_ADDRESS was not set in dbus info file');
}

module.exports = {
  getDbusAddressFromFs: getDbusAddressFromFs,
  getDbusAddressFromWindowSelection: getDbusAddressFromWindowSelection
};
07070100000018000081A4000000000000000000000001643934E90000014F000000000000000000000000000000000000002900000000dbus-final-0.0.0+git3e43f60/lib/align.jsconst Buffer = require('safe-buffer').Buffer;

function align (ps, n) {
  const pad = n - ps._offset % n;
  if (pad === 0 || pad === n) return;
  // TODO: write8(0) in a loop (3 to 7 times here) could be more efficient
  const padBuff = Buffer.alloc(pad);
  ps.put(Buffer.from(padBuff));
  ps._offset += pad;
}

exports.align = align;
07070100000019000081A4000000000000000000000001643934E900003EA1000000000000000000000000000000000000002700000000dbus-final-0.0.0+git3e43f60/lib/bus.jsconst EventEmitter = require('events').EventEmitter;
const constants = require('./constants');
const handleMethod = require('./service/handlers');
const { DBusError } = require('./errors');
const { Message } = require('./message-type');
const ServiceObject = require('./service/object');
const xml2js = require('xml2js');

const {
  METHOD_CALL,
  METHOD_RETURN,
  ERROR,
  SIGNAL
} = constants.MessageType;

const {
  NO_REPLY_EXPECTED
} = constants.MessageFlag;

const {
  assertBusNameValid,
  assertObjectPathValid
} = require('./validators');

const ProxyObject = require('./client/proxy-object');

const xmlHeader = '<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">\n';
const nameOwnerMatchRule =
  "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',path='/org/freedesktop/DBus',member='NameOwnerChanged'";

/**
 * @class
 * The `MessageBus` is a class for interacting with a DBus message bus capable
 * of requesting a service [`Name`]{@link module:interface~Name} to export an
 * [`Interface`]{@link module:interface~Interface}, or getting a proxy object
 * to interact with an existing name on the bus as a client. A `MessageBus` is
 * created with `dbus.sessionBus()` or `dbus.systemBus()` methods of the
 * dbus-final module.
 *
 * The `MessageBus` is an `EventEmitter` which emits the following events:
 * * `error` - The underlying connection to the bus has errored.  After
 * receiving an `error` event, the `MessageBus` may be disconnected.
 * * `connected` - The bus is connected and ready to send and receive messages.
 * Before this event, messages are buffered.
 * * `message` - The bus has received a message. Called with the {@link
 * Message} that was received. This is part of the low-level api.
 *
 * @example
 * const dbus = require('dbus-final');
 * const bus = dbus.sessionBus();
 * // get a proxy object
 * let obj = await bus.getProxyObject('org.freedesktop.DBus', '/org/freedesktop/DBus');
 * // request a well-known name
 * await bus.requestName('org.test.name');
 */
class MessageBus extends EventEmitter {
  /**
   * Create a new `MessageBus`. This constructor is not to be called directly.
   * Use `dbus.sessionBus()` or `dbus.systemBus()` to set up the connection to
    * the bus.
   */
  constructor (conn) {
    super();
    this._builder = new xml2js.Builder({ headless: true });
    this._connection = conn;
    this._serial = 1;
    this._methodReturnHandlers = {};
    this._signals = new EventEmitter();
    this._nameOwners = {};
    this._methodHandlers = [];
    this._serviceObjects = {};
    this._isHighLevelClientInitialized = false;

    // An object with match rule keys and refcount values. Used only by
    // the internal high-level function `_addMatch` for refcounting.
    this._matchRules = {};

    /**
     * The unique name of the bus connection. This will be `null` until the
     * `MessageBus` is connected.
     * @memberof MessageBus#
     * @member {string} name
     */
    this.name = null;

    const handleMessage = (msg) => {
      // Don't handle messages that aren't destined for us. This might happen
      // when we become a monitor.
      if (this.name && msg.destination) {
        if (msg.destination[0] === ':' && msg.destination !== this.name) {
          return;
        }
        if (this._nameOwners[msg.destination] &&
              this._nameOwners[msg.destination] !== this.name) {
          return;
        }
      }

      if (msg.type === METHOD_RETURN ||
        msg.type === ERROR) {
        const handler = this._methodReturnHandlers[msg.replySerial];
        if (handler) {
          delete this._methodReturnHandlers[msg.replySerial];
          handler(msg);
        }
      } else if (msg.type === SIGNAL) {
        // if this is a name owner changed message, cache the new name owner
        const { sender, path, interface: iface, member } = msg;
        if (sender === 'org.freedesktop.DBus' &&
          path === '/org/freedesktop/DBus' &&
          iface === 'org.freedesktop.DBus' &&
          member === 'NameOwnerChanged') {
          const name = msg.body[0];
          const newOwner = msg.body[2];
          if (!name.startsWith(':')) {
            this._nameOwners[name] = newOwner;
          }
        }

        const mangled = JSON.stringify({
          path: msg.path,
          interface: msg.interface,
          member: msg.member
        });
        this._signals.emit(mangled, msg);
      } else {
        // methodCall (needs to be handled)
        let handled = false;

        for (const handler of this._methodHandlers) {
          // run installed method handlers first
          handled = handler(msg);
          if (handled) {
            break;
          }
        }

        if (!handled) {
          handled = handleMethod(msg, this);
        }

        if (!handled) {
          this.send(Message.newError(msg,
            'org.freedesktop.DBus.Error.UnknownMethod',
            `Method '${msg.member}' on interface '${msg.interface || '(none)'}' does not exist`));
        }
      }
    };

    conn.on('message', (msg) => {
      try {
        // TODO: document this signal
        this.emit('message', msg);
        handleMessage(msg);
      } catch (e) {
        this.send(Message.newError(msg, 'com.github.dbus_final.Error', `The DBus library encountered an error.\n${e.stack}`));
      }
    });

    conn.on('error', (err) => {
      // forward network and stream errors
      this.emit('error', err);
    });

    const helloMessage = new Message({
      path: '/org/freedesktop/DBus',
      destination: 'org.freedesktop.DBus',
      interface: 'org.freedesktop.DBus',
      member: 'Hello'
    });

    this.call(helloMessage)
      .then((msg) => {
        this.name = msg.body[0];
        this.emit('connect');
      })
      .catch((err) => {
        this.emit('error', err);
      });
  }

  /**
   * Get a {@link ProxyObject} on the bus for the given name and path for interacting
   * with a service as a client. The proxy object contains a list of the
   * [`ProxyInterface`s]{@link ProxyInterface} exported at the name and object path as well as a list
   * of `node`s.
   *
   * @param name {string} - the well-known name on the bus.
   * @param path {string} - the object path exported on the name.
   * @param [xml] {string} - xml introspection data.
   * @returns {Promise} - a Promise that resolves with the `ProxyObject`.
   */
  async getProxyObject (name, path, xml) {
    const obj = new ProxyObject(this, name, path);

    const objInitPromise = obj._init(xml);

    await this._initHighLevelClient();

    return objInitPromise;
  }

  /**
   * Request a well-known name on the bus.
   *
   * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#bus-messages-request-name}
   *
   * @param name {string} - the well-known name on the bus to request.
   * @param flags {NameFlag} - DBus name flags which affect the behavior of taking the name.
   * @returns {Promise} - a Promise that resolves with the {@link RequestNameReply}.
   */
  requestName (name, flags) {
    flags = flags || 0;
    return new Promise((resolve, reject) => {
      assertBusNameValid(name);
      const requestNameMessage = new Message({
        path: '/org/freedesktop/DBus',
        destination: 'org.freedesktop.DBus',
        interface: 'org.freedesktop.DBus',
        member: 'RequestName',
        signature: 'su',
        body: [name, flags]
      });
      this.call(requestNameMessage)
        .then((msg) => {
          return resolve(msg.body[0]);
        })
        .catch((err) => {
          return reject(err);
        });
    });
  }

  /**
   * Release this name. Requests that the name should no longer be owned by the
   * {@link MessageBus}.
   *
   * @returns {Promise} A Promise that will resolve with the {@link ReleaseNameReply}.
   */
  releaseName (name) {
    return new Promise((resolve, reject) => {
      const msg = new Message({
        path: '/org/freedesktop/DBus',
        destination: 'org.freedesktop.DBus',
        interface: 'org.freedesktop.DBus',
        member: 'ReleaseName',
        signature: 's',
        body: [name]
      });
      this.call(msg)
        .then((reply) => {
          return resolve(reply.body[0]);
        })
        .catch((err) => {
          return reject(err);
        });
    });
  }

  /**
   * Disconnect this `MessageBus` from the bus.
   */
  disconnect () {
    this._connection.stream.end();
    this._signals.removeAllListeners();
  }

  /**
   * Get a new serial for this bus. These can be used to set the {@link
   * Message#serial} member to send the message on this bus.
   *
   * @returns {int} - A new serial for this bus.
   */
  newSerial () {
    return this._serial++;
  }

  /**
   * A function to call when a message of type {@link MessageType.METHOD_RETURN} is received. User handlers are run before
   * default handlers.
   *
   * @callback methodHandler
   * @param {Message} msg - The message to handle.
   * @returns {boolean} Return `true` if the message is handled and no further
   * handlers will run.
   */

  /**
   * Add a user method return handler. Remove the handler with {@link
   * MessageBus#removeMethodHandler}
   *
   * @param {methodHandler} - A function to handle a {@link Message} of type
   * {@link MessageType.METHOD_RETURN}. Takes the `Message` as the first
    * argument. Return `true` if the method is handled and no further handlers
    * will run.
   */
  addMethodHandler (fn) {
    this._methodHandlers.push(fn);
  }

  /**
   * Remove a user method return handler that was previously added with {@link
   * MessageBus#addMethodHandler}.
   *
   * @param {methodHandler} - A function that was previously added as a method handler.
   */
  removeMethodHandler (fn) {
    for (let i = 0; i < this._methodHandlers.length; ++i) {
      if (this._methodHandlers[i] === fn) {
        this._methodHandlers.splice(i, 1);
      }
    }
  }

  /**
   * Send a {@link Message} of type {@link MessageType.METHOD_CALL} to the bus
   * and wait for the reply.
   *
   * @example
   * let message = new Message({
   *   destination: 'org.freedesktop.DBus',
   *   path: '/org/freedesktop/DBus',
   *   interface: 'org.freedesktop.DBus',
   *   member: 'ListNames'
   * });
   * let reply = await bus.call(message);
   *
   * @param {Message} msg - The message to send.
   * @returns {Promise} reply - A `Promise` that resolves to the {@link
   * Message} which is a reply to the call.
   */
  call (msg) {
    return new Promise((resolve, reject) => {
      if (!(msg instanceof Message)) {
        throw new Error('The call() method takes a Message class as the first argument.');
      }
      if (msg.type !== METHOD_CALL) {
        throw new Error('Only messages of type METHOD_CALL can expect a call reply.');
      }
      if (msg.serial === null || msg._sent) {
        msg.serial = this.newSerial();
      }
      msg._sent = true;
      if (msg.flags & NO_REPLY_EXPECTED) {
        resolve(null);
      } else {
        this._methodReturnHandlers[msg.serial] = (reply) => {
          this._nameOwners[msg.destination] = reply.sender;
          if (reply.type === ERROR) {
            return reject(new DBusError(reply.errorName, reply.body[0], reply));
          } else {
            return resolve(reply);
          }
        };
      }
      this._connection.message(msg);
    });
  }

  /**
   * Send a {@link Message} on the bus that does not expect a reply.
   *
   * @example
   * let message = Message.newSignal('/org/test/path/,
   *                                 'org.test.interface',
   *                                 'SomeSignal');
   * bus.send(message);
   *
   * @param {Message} msg - The message to send.
   */
  send (msg) {
    if (!(msg instanceof Message)) {
      throw new Error('The send() method takes a Message class as the first argument.');
    }
    if (msg.serial === null || msg._sent) {
      msg.serial = this.newSerial();
    }
    this._connection.message(msg);
  }

  /**
   * Export an [`Interface`]{@link module:interface~Interface} on the bus. See
   * the documentation for that class for how to define service interfaces.
   *
   * @param path {string} - The object path to export this `Interface` on.
   * @param iface {module:interface~Interface} - The service interface to export.
   */
  export (path, iface) {
    const obj = this._getServiceObject(path);
    obj.addInterface(iface);
  }

  /**
   * Unexport an `Interface` on the bus. The interface will no longer be
   * advertised to clients.
   *
   * @param {string} path - The object path on which to unexport.
   * @param {module:interface~Interface} [iface] - The `Interface` to unexport.
   * If not given, this will remove all interfaces on the path.
   */
  unexport (path, iface) {
    iface = iface || null;
    if (iface === null) {
      this._removeServiceObject(path);
    } else {
      const obj = this._getServiceObject(path);
      obj.removeInterface(iface);
      if (!obj.interfaces.length) {
        this._removeServiceObject(path);
      }
    }
  }

  async _initHighLevelClient () {
    if (this._isHighLevelClientInitialized) {
      return;
    }

    try {
      await this._addMatch(nameOwnerMatchRule);
    } catch (error) {
      this.emit('error', error);
      return;
    }

    this._isHighLevelClientInitialized = true;
  }

  _introspect (path) {
    assertObjectPathValid(path);
    const xml = {
      node: {
        node: []
      }
    };

    if (this._serviceObjects[path]) {
      xml.node.interface = this._serviceObjects[path].introspect();
    }

    const pathSplit = path.split('/').filter(n => n);

    const children = new Set();

    for (const key of Object.keys(this._serviceObjects)) {
      const keySplit = key.split('/').filter(n => n);
      if (keySplit.length <= pathSplit.length) {
        continue;
      }
      if (pathSplit.every((v, i) => v === keySplit[i])) {
        children.add(keySplit[pathSplit.length]);
      }
    }

    for (const child of children) {
      xml.node.node.push({
        $: {
          name: child
        }
      });
    }

    return xmlHeader + this._builder.buildObject(xml);
  }

  _getServiceObject (path) {
    assertObjectPathValid(path);
    if (!this._serviceObjects[path]) {
      this._serviceObjects[path] = new ServiceObject(path, this);
    }
    return this._serviceObjects[path];
  }

  _removeServiceObject (path) {
    assertObjectPathValid(path);
    if (this._serviceObjects[path]) {
      const obj = this._serviceObjects[path];
      for (const i of Object.keys(obj.interfaces)) {
        obj.removeInterface(obj.interfaces[i]);
      }
      delete this._serviceObjects[path];
    }
  }

  _addMatch (match) {
    if (Object.prototype.hasOwnProperty.call(match, this._matchRules)) {
      this._matchRules[match] += 1;
      return Promise.resolve();
    }

    this._matchRules[match] = 1;

    // TODO catch error and update refcount
    const msg = new Message({
      path: '/org/freedesktop/DBus',
      destination: 'org.freedesktop.DBus',
      interface: 'org.freedesktop.DBus',
      member: 'AddMatch',
      signature: 's',
      body: [match]
    });
    return this.call(msg);
  }

  _removeMatch (match) {
    if (!this._connection.stream.writable) {
      return Promise.resolve();
    }

    if (Object.prototype.hasOwnProperty.call(match, this._matchRules)) {
      this._matchRules[match] -= 1;
      if (this._matchRules[match] > 0) {
        return Promise.resolve();
      }
    } else {
      return Promise.resolve();
    }

    delete this._matchRules[match];

    // TODO catch error and update refcount
    const msg = new Message({
      path: '/org/freedesktop/DBus',
      destination: 'org.freedesktop.DBus',
      interface: 'org.freedesktop.DBus',
      member: 'RemoveMatch',
      signature: 's',
      body: [match]
    });
    return this.call(msg);
  }
}

module.exports = MessageBus;
0707010000001A000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002700000000dbus-final-0.0.0+git3e43f60/lib/client0707010000001B000081A4000000000000000000000001643934E900001A25000000000000000000000000000000000000003A00000000dbus-final-0.0.0+git3e43f60/lib/client/proxy-interface.jsconst EventEmitter = require('events');
const {
  isInterfaceNameValid,
  isMemberNameValid
} = require('../validators');

class ProxyListener {
  constructor (signal, iface) {
    this.refcount = 0;
    this.fn = (msg) => {
      const { body, signature, sender } = msg;
      if (iface.$object.bus._nameOwners[iface.$object.name] !== sender) {
        return;
      }
      if (signature !== signal.signature) {
        console.error(`warning: got signature ${signature} for signal ${msg.interface}.${signal.name} (expected ${signal.signature})`);
        return;
      }
      iface.emit.apply(iface, [signal.name].concat(body));
    };
  }
}

/**
 * A class to represent a proxy to an interface exported on the bus to be used
 * by a client. A `ProxyInterface` is gotten by interface name from the {@link
 * ProxyObject} from the {@link MessageBus}. This class is constructed
 * dynamically based on the introspection data on the bus. The advertised
 * methods of the interface are exposed as class methods that take arguments
 * and return a Promsie that resolves to types specified by the type signature
 * of the DBus method. The `ProxyInterface` is an `EventEmitter` that emits
 * events with types that are specified by the type signature of the DBus
 * signal advertised on the bus when that signal is received.
 *
 * If an interface method call returns an error, `ProxyInterface` method call
 * will throw a {@link DBusError}.
 *
 * @example
 * // this demonstrates the use of the standard
 * // `org.freedesktop.DBus.Properties` interface for an interface that exports
 * // some properties.
 * let bus = dbus.sessionBus();
 * let obj = await bus.getProxyObject('org.test.bus_name', '/org/test/path');
 * let properties = obj.getInterface('org.freedesktop.DBus.Properties');
 * // the `Get` method provided by this interface takes two strings and returns
 * // a Variant
 * let someProperty = await properties.Get('org.test.interface_name', 'SomeProperty');
 * // the `PropertiesChanged` signal provided by this interface will emit an
 * // event on the interface with its specified signal arguments.
 * properties.on('PropertiesChanged', (props, invalidated) => {});
 */
class ProxyInterface extends EventEmitter {
  /**
   * Create a new `ProxyInterface`. This constructor should not be called
   * directly. Use {@link ProxyObject#getInterface} to get a proxy interface.
   */
  constructor (name, object) {
    super();
    this.$name = name;
    this.$object = object;
    this.$properties = [];
    this.$methods = [];
    this.$signals = [];
    this.$listeners = {};

    const getEventDetails = (eventName) => {
      const signal = this.$signals.find((s) => s.name === eventName);
      if (!signal) {
        return [null, null];
      }

      const detailedEvent = JSON.stringify({
        path: this.$object.path,
        interface: this.$name,
        member: eventName
      });

      return [signal, detailedEvent];
    };

    this.on('removeListener', (eventName, listener) => {
      const [signal, detailedEvent] = getEventDetails(eventName);

      if (!signal) {
        return;
      }

      const proxyListener = this._getEventListener(signal);

      if (proxyListener.refcount <= 0) {
        return;
      }

      proxyListener.refcount -= 1;
      if (proxyListener.refcount > 0) {
        return;
      }

      this.$object.bus._removeMatch(this._signalMatchRuleString(eventName))
        .catch(error => {
          this.$object.bus.emit('error', error);
        });
      this.$object.bus._signals.removeListener(detailedEvent, proxyListener.fn);
    });

    this.on('newListener', (eventName, listener) => {
      const [signal, detailedEvent] = getEventDetails(eventName);

      if (!signal) {
        return;
      }

      const proxyListener = this._getEventListener(signal);

      if (proxyListener.refcount > 0) {
        proxyListener.refcount += 1;
        return;
      }

      proxyListener.refcount = 1;

      this.$object.bus._addMatch(this._signalMatchRuleString(eventName))
        .catch(error => {
          this.$object.bus.emit('error', error);
        });
      this.$object.bus._signals.on(detailedEvent, proxyListener.fn);
    });
  }

  _signalMatchRuleString (eventName) {
    return `type='signal',sender='${this.$object.name}',interface='${this.$name}',path='${this.$object.path}',member='${eventName}'`;
  }

  _getEventListener (signal) {
    if (this.$listeners[signal.name]) {
      return this.$listeners[signal.name];
    }

    this.$listeners[signal.name] = new ProxyListener(signal, this);
    return this.$listeners[signal.name];
  }

  static _fromXml (object, xml) {
    if (!('$' in xml) || !isInterfaceNameValid(xml.$.name)) {
      return null;
    }

    const name = xml.$.name;
    const iface = new ProxyInterface(name, object);

    if (Array.isArray(xml.property)) {
      for (const p of xml.property) {
        // TODO validation
        if ('$' in p) {
          iface.$properties.push(p.$);
        }
      }
    }

    if (Array.isArray(xml.signal)) {
      for (const s of xml.signal) {
        if (!('$' in s) || !isMemberNameValid(s.$.name)) {
          continue;
        }
        const signal = {
          name: s.$.name,
          signature: ''
        };

        if (Array.isArray(s.arg)) {
          for (const a of s.arg) {
            if ('$' in a && 'type' in a.$) {
              // TODO signature validation
              signal.signature += a.$.type;
            }
          }
        }

        iface.$signals.push(signal);
      }
    }

    if (Array.isArray(xml.method)) {
      for (const m of xml.method) {
        if (!('$' in m) || !isMemberNameValid(m.$.name)) {
          continue;
        }
        const method = {
          name: m.$.name,
          inSignature: '',
          outSignature: ''
        };

        if (Array.isArray(m.arg)) {
          for (const a of m.arg) {
            if (!('$' in a) || typeof a.$.type !== 'string') {
              continue;
            }
            const arg = a.$;
            if (arg.direction === 'in') {
              method.inSignature += arg.type;
            } else if (arg.direction === 'out') {
              method.outSignature += arg.type;
            }
          }
        }

        // TODO signature validation
        iface.$methods.push(method);

        iface[method.name] = function (...args) {
          const objArgs = [
            name,
            method.name,
            method.inSignature,
            method.outSignature
          ].concat(args);
          return object._callMethod.apply(object, objArgs);
        };
      }
    }

    return iface;
  }
}

module.exports = ProxyInterface;
0707010000001C000081A4000000000000000000000001643934E9000016A9000000000000000000000000000000000000003700000000dbus-final-0.0.0+git3e43f60/lib/client/proxy-object.jsconst xml2js = require('xml2js');
const { parseSignature } = require('../signature');
const ProxyInterface = require('./proxy-interface');
const { Message } = require('../message-type');
const {
  assertBusNameValid,
  assertObjectPathValid,
  isObjectPathValid
} = require('../validators');

/**
 * @class
 * A class that represents a proxy to a DBus object. The `ProxyObject` contains
 * `ProxyInterface`s and a list of `node`s which are object paths of child
 * objects. A `ProxyObject` is created through {@link
 * MessageBus#getProxyObject} for a given well-known name and object path.
 * An interface can be gotten through {@link ProxyObject#getInterface} and can
 * be used to call methods and receive signals for that interface.
 *
 * @example
 * let bus = dbus.sessionBus();
 * let obj = await bus.getProxyObject('org.freedesktop.DBus', '/org/freedesktop/DBus');
 * let peer = obj.getInterface('org.freedesktop.DBus.Peer')
 * await peer.Ping();
 */
class ProxyObject {
  /**
   * Create a new `ProxyObject`. This constructor should not be called
   * directly. Use {@link MessageBus#getProxyObject} to get a proxy object.
   */
  constructor (bus, name, path) {
    assertBusNameValid(name);
    assertObjectPathValid(path);
    /**
     * The {@link MessageBus} this name belongs to.
     * @memberof ProxyObject#
     * @member {MessageBus} bus
     */
    this.bus = bus;
    /**
     * The well-known bus name for this proxy object as a string.
     * @memberof ProxyObject#
     * @member {string} name
     */
    this.name = name;
    /**
     * The object path for this `ProxyObject`.
     * @memberof ProxyObject#
     * @member {string} path
     */
    this.path = path;
    /**
     * The object path child nodes for this `ProxyObject` as an array of
     * strings
     * @memberof ProxyObject#
     * @member {string[]} nodes
     */
    this.nodes = [];

    /**
     * A map of interface names to [ProxyInterfaces]{@link ProxyInterface} for
     * this `ProxyObject`.
     * @memberof ProxyObject#
     * @member {Object.<string, ProxyInterface>} interfaces
     */
    this.interfaces = {};
    this._parser = new xml2js.Parser();
  }

  /**
   * Get a {@link ProxyInterface} for the given interface name.
   *
   * @param name {string} - the interface name to get.
   * @returns {ProxyInterface} - the proxy interface with this name exported by
   * the object or `undefined` if the object does not export an interface with
   * that name.
   * @throws {Error} Throws an error if the interface is not found on this object.
   */
  getInterface (name) {
    if (!Object.keys(this.interfaces).includes(name)) {
      throw new Error(`interface not found in proxy object: ${name}`);
    }
    return this.interfaces[name];
  }

  _initXml (xml) {
    const root = xml.node;

    if (Array.isArray(root.node)) {
      for (const n of root.node) {
        if (!('$' in n)) {
          continue;
        }
        const name = n.$.name;
        const path = `${this.path}/${name}`;
        if (isObjectPathValid(path)) {
          this.nodes.push(path);
        }
      }
    }

    if (Array.isArray(root.interface)) {
      for (const i of root.interface) {
        const iface = ProxyInterface._fromXml(this, i);
        if (iface !== null) {
          this.interfaces[iface.$name] = iface;
        }
      }
    }
  }

  _init (xml) {
    return new Promise((resolve, reject) => {
      if (xml) {
        this._parser.parseString(xml, (err, data) => {
          if (err) {
            return reject(err);
          }
          this._initXml(data);

          const nameOwnerMessage = new Message({
            destination: 'org.freedesktop.DBus',
            path: '/org/freedesktop/DBus',
            interface: 'org.freedesktop.DBus',
            member: 'GetNameOwner',
            signature: 's',
            body: [this.name]
          });

          this.bus.call(nameOwnerMessage)
            .then((msg) => {
              this.bus._nameOwners[this.name] = msg.body[0];
              resolve(this);
            })
            .catch((err) => {
              if (err.type === 'org.freedesktop.DBus.Error.NameHasNoOwner') { return resolve(this); }
              return reject(err);
            });
        });
      } else {
        const introspectMessage = new Message({
          destination: this.name,
          path: this.path,
          interface: 'org.freedesktop.DBus.Introspectable',
          member: 'Introspect',
          signature: '',
          body: []
        });

        this.bus.call(introspectMessage)
          .then((msg) => {
            const xml = msg.body[0];
            this._parser.parseString(xml, (err, data) => {
              if (err) {
                return reject(err);
              }
              this._initXml(data);
              resolve(this);
            });
          })
          .catch((err) => {
            return reject(err);
          });
      }
    });
  }

  _callMethod (iface, member, inSignature, outSignature, ...args) {
    return new Promise((resolve, reject) => {
      args = args || [];

      const methodCallMessage = new Message({
        destination: this.name,
        interface: iface,
        path: this.path,
        member: member,
        signature: inSignature,
        body: args
      });

      this.bus.call(methodCallMessage)
        .then((msg) => {
          const outSignatureTree = parseSignature(outSignature);
          if (outSignatureTree.length === 0) {
            resolve(null);
            return;
          }
          if (outSignatureTree.length === 1) {
            resolve(msg.body[0]);
          } else {
            resolve(msg.body);
          }
        })
        .catch((err) => {
          return reject(err);
        });
    });
  }
}

module.exports = ProxyObject;
0707010000001D000081A4000000000000000000000001643934E900001504000000000000000000000000000000000000002E00000000dbus-final-0.0.0+git3e43f60/lib/connection.jsconst EventEmitter = require('events').EventEmitter;
const net = require('net');
const message = require('./message');
const clientHandshake = require('./handshake');
const { getDbusAddressFromFs } = require('./address-x11');
const { Message } = require('./message-type');
const { messageToJsFmt, marshallMessage } = require('./marshall-compat');

function createStream (opts) {
  let { busAddress, negotiateUnixFd } = opts;

  if (negotiateUnixFd === undefined) {
    negotiateUnixFd = false;
  }

  // TODO according to the dbus spec, we should start a new server if the bus
  // address cannot be found.
  if (!busAddress) {
    busAddress = process.env.DBUS_SESSION_BUS_ADDRESS;
  }
  if (!busAddress) {
    busAddress = getDbusAddressFromFs();
  }

  const addresses = busAddress.split(';');
  for (let i = 0; i < addresses.length; ++i) {
    const address = addresses[i];
    const familyParams = address.split(':');
    const family = familyParams[0];
    const params = {};
    familyParams[1].split(',').forEach(function (p) {
      const keyVal = p.split('=');
      params[keyVal[0]] = keyVal[1];
    });

    try {
      switch (family.toLowerCase()) {
        case 'tcp': {
          const host = params.host || 'localhost';
          const port = params.port;
          return net.createConnection(port, host);
        }
        case 'unix': {
          if (params.socket) {
            return net.createConnection(params.socket);
          }
          if (params.abstract) {
            const usocket = require('usocket');
            const sock = new usocket.USocket({ path: '\u0000' + params.abstract });
            sock.supportsUnixFd = negotiateUnixFd;
            return sock;
          }
          if (params.path) {
            try {
              const usocket = require('usocket');
              const sock = new usocket.USocket({ path: params.path });
              sock.supportsUnixFd = negotiateUnixFd;
              return sock;
            } catch (err) {
              // TODO: maybe emit warning?
              return net.createConnection(params.path);
            }
          }
          throw new Error(
            "not enough parameters for 'unix' connection - you need to specify 'socket' or 'abstract' or 'path' parameter"
          );
        }
        case 'unixexec': {
          const eventStream = require('event-stream');
          const spawn = require('child_process').spawn;
          const args = [];
          for (let n = 1; params['arg' + n]; n++) args.push(params['arg' + n]);
          const child = spawn(params.path, args);
          // duplex socket is auto connected so emit connect event next frame
          setTimeout(() => eventStream.emit('connected'), 0);

          return eventStream.duplex(child.stdin, child.stdout);
        }
        default: {
          throw new Error('unknown address type:' + family);
        }
      }
    } catch (e) {
      if (i < addresses.length - 1) {
        console.warn(e.message);
        continue;
      } else {
        throw e;
      }
    }
  }
}

function createConnection (opts) {
  const self = new EventEmitter();
  opts = opts || {};
  const stream = (self.stream = createStream(opts));
  stream.setNoDelay && stream.setNoDelay();

  stream.on('error', function (err) {
    // forward network and stream errors
    self.emit('error', err);
  });

  stream.on('end', function () {
    self.emit('end');
    self.message = function () {
      self.emit('error', new Error('Tried to write a message to a closed stream'));
    };
  });

  self.end = function () {
    stream.end();
    return self;
  };

  function afterHandshake (error, guid) {
    if (error) {
      return self.emit('error', error);
    }
    self.guid = guid;
    self.emit('connect');
    message.unmarshalMessages(
      stream,
      function (message) {
        try {
          message = new Message(messageToJsFmt(message));
        } catch (err) {
          self.emit('error', err, `There was an error receiving a message (this is probably a bug in dbus-final): ${message}`);
          return;
        }
        self.emit('message', message);
      },
      opts
    );
  }
  stream.once('connect', () => clientHandshake(stream, opts, afterHandshake));
  stream.once('connected', () => clientHandshake(stream, opts, afterHandshake));

  self._messages = [];

  // pre-connect version, buffers all messages. replaced after connect
  self.message = function (msg) {
    self._messages.push(msg);
  };

  self.once('connect', function () {
    self.state = 'connected';
    for (let i = 0; i < self._messages.length; ++i) {
      const [data, fds] = marshallMessage(self._messages[i]);
      if (stream.supportsUnixFd) {
        stream.write({ data, fds });
      } else {
        stream.write(data);
      }
    }
    self._messages.length = 0;

    // no need to buffer once connected
    self.message = function (msg) {
      if (!stream.writable) {
        throw new Error('Cannot send message, stream is closed');
      }
      const [data, fds] = marshallMessage(msg);
      if (stream.supportsUnixFd) {
        stream.write({ data, fds });
      } else {
        if (fds.length > 0) {
          console.warn('Sending file descriptors is not supported in current bus connection');
        }
        stream.write(data);
      }
    };
  });

  return self;
}

module.exports = createConnection;
0707010000001E000081A4000000000000000000000001643934E90000179B000000000000000000000000000000000000002D00000000dbus-final-0.0.0+git3e43f60/lib/constants.js/**
 * @class
 *
 * A flag enum for {@link MessageBus#requestName} to configure the name request
 * options.
 *
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#bus-messages-request-name}
 */
class NameFlag {}

/**
 * This name allows other clients to replace it as the name owner on a request.
 *
 * @memberof NameFlag
 * @static
 * @constant
 */
NameFlag.ALLOW_REPLACEMENT = 1;

/**
 * This request should replace an existing name if that name allows
 * replacement.
 *
 * @memberof NameFlag
 * @static
 * @constant
 */
NameFlag.REPLACE_EXISTING = 2;

/**
 * This request should not enter the queue of clients requesting this name if
 * it is taken.
 *
 * @memberof NameFlag
 * @static
 * @constant
 */
NameFlag.DO_NOT_QUEUE = 4;

/**
 * @class
 *
 * An enum for the return value of {@link MessageBus#requestName} to indicate
 * the status of the name request.
 *
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#bus-messages-request-name}
 */
class RequestNameReply {}

/**
 * The application trying to request ownership of a name is already the owner
 * of it.
 *
 * @memberof RequestNameReply
 * @static
 * @constant
 */
RequestNameReply.PRIMARY_OWNER = 1;

/**
 * The name already had an owner, `DBUS_NAME_FLAG_DO_NOT_QUEUE` was not
 * specified, and either the current owner did not specify
 * `DBUS_NAME_FLAG_ALLOW_REPLACEMENT` or the requesting application did not
 * specify `DBUS_NAME_FLAG_REPLACE_EXISTING`.
 *
 * @memberof RequestNameReply
 * @static
 * @constant
 */
RequestNameReply.IN_QUEUE = 2;

/**
 * The name already has an owner, `DBUS_NAME_FLAG_DO_NOT_QUEUE` was specified,
 * and either `DBUS_NAME_FLAG_ALLOW_REPLACEMENT` was not specified by the
 * current owner, or `DBUS_NAME_FLAG_REPLACE_EXISTING` was not specified by the
 * requesting application.
 *
 * @memberof RequestNameReply
 * @static
 * @constant
 */
RequestNameReply.EXISTS = 3;

/**
 * The application trying to request ownership of a name is already the owner
 * of it.
 *
 * @memberof RequestNameReply
 * @static
 * @constant
 */
RequestNameReply.ALREADY_OWNER = 4;

/**
 * @class
 *
 * An enum for the return value of {@link MessageBus#releaseName} to indicate
 * the status of the release name request.
 *
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#bus-messages-release-name}
 */
class ReleaseNameReply {}

/**
 * The caller has released his claim on the given name. Either the caller was
 * the primary owner of the name, and the name is now unused or taken by
 * somebody waiting in the queue for the name, or the caller was waiting in the
 * queue for the name and has now been removed from the queue.
 *
 * @memberof ReleaseNameReply
 * @static
 * @constant
 */
ReleaseNameReply.RELEASED = 1;

/**
 * The given name does not exist on this bus.
 *
 * @memberof ReleaseNameReply
 * @static
 * @constant
 */
ReleaseNameReply.NON_EXISTENT = 2;

/**
 * The caller was not the primary owner of this name, and was also not waiting
 * in the queue to own this name.
 *
 * @memberof ReleaseNameReply
 * @static
 * @constant
 */
ReleaseNameReply.NOT_OWNER = 3;

/**
 * @class
 *
 * An enum value for the {@link Message} `type` member to indicate the type of message.
 *
 * @see https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol
 */
class MessageType {}

/**
 * The message is a method call.
 *
 * @memberof MessageType
 * @static
 * @constant
 */
MessageType.METHOD_CALL = 1;

/**
 * The message is a method return to a previous call.
 *
 * @memberof MessageType
 * @static
 * @constant
 */
MessageType.METHOD_RETURN = 2;

/**
 * The message is an error reply.
 *
 * @memberof MessageType
 * @static
 * @constant
 */
MessageType.ERROR = 3;

/**
 * The message is a signal.
 *
 * @memberof MessageType
 * @static
 * @constant
 */
MessageType.SIGNAL = 4;

/**
 * @class
 *
 * An flag enum for the {@link Message} `flags` member to configure behavior
 * for message processing.
 *
 * @see https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol
 */
class MessageFlag {}

/**
 * No reply is expected from this message.
 *
 * @memberof MessageFlag
 * @static
 * @constant
 */
MessageFlag.NO_REPLY_EXPECTED = 1;

/**
 * This message should not autostart a service.
 *
 * @memberof MessageFlag
 * @static
 * @constant
 */
MessageFlag.NO_AUTO_START = 2;

const MAX_INT64_STR = '9223372036854775807';
const MIN_INT64_STR = '-9223372036854775807';
const MAX_UINT64_STR = '18446744073709551615';
const MIN_UINT64_STR = '0';

const _BigIntConstants = {};

function _getBigIntConstants () {
  if (Object.keys(_BigIntConstants).length !== 0) {
    return _BigIntConstants;
  }

  _BigIntConstants.MAX_INT64 = BigInt(MAX_INT64_STR);
  _BigIntConstants.MIN_INT64 = BigInt(MIN_INT64_STR);
  _BigIntConstants.MAX_UINT64 = BigInt(MAX_UINT64_STR);
  _BigIntConstants.MIN_UINT64 = BigInt(MIN_UINT64_STR);

  return _BigIntConstants;
}

module.exports = {
  MAX_INT64_STR: MAX_INT64_STR,
  MIN_INT64_STR: MIN_INT64_STR,
  MAX_UINT64_STR: MAX_UINT64_STR,
  MIN_UINT64_STR: MIN_UINT64_STR,

  NameFlag: NameFlag,
  RequestNameReply: RequestNameReply,
  ReleaseNameReply: ReleaseNameReply,
  MessageType: MessageType,
  MessageFlag: MessageFlag,

  headerTypeName: [
    null,
    'path',
    'interface',
    'member',
    'errorName',
    'replySerial',
    'destination',
    'sender',
    'signature',
    'unixFd'
  ],

  // TODO: merge to single hash? e.g path -> [1, 'o']
  fieldSignature: {
    path: 'o',
    interface: 's',
    member: 's',
    errorName: 's',
    replySerial: 'u',
    destination: 's',
    sender: 's',
    signature: 'g',
    unixFd: 'u'
  },
  headerTypeId: {
    path: 1,
    interface: 2,
    member: 3,
    errorName: 4,
    replySerial: 5,
    destination: 6,
    sender: 7,
    signature: 8,
    unixFd: 9
  },
  protocolVersion: 1,
  endianness: {
    le: 108,
    be: 66
  },
  messageSignature: 'yyyyuua(yv)',
  defaultAuthMethods: ['EXTERNAL', 'DBUS_COOKIE_SHA1', 'ANONYMOUS'],
  _getBigIntConstants: _getBigIntConstants
};
0707010000001F000081A4000000000000000000000001643934E9000015E5000000000000000000000000000000000000002F00000000dbus-final-0.0.0+git3e43f60/lib/dbus-buffer.jsconst { parseSignature } = require('./signature');
const Long = require('long');
const LE = require('./constants').endianness.le;

// Buffer + position + global start position ( used in alignment )
function DBusBuffer (buffer, startPos, endian, fds, options) {
  if (typeof options !== 'object') {
    options = { ayBuffer: true };
  } else if (options.ayBuffer === undefined) {
    // default settings object
    options.ayBuffer = true; // enforce truthy default props
  }
  this.options = options;
  this.buffer = buffer;
  this.endian = endian;
  this.fds = fds;
  this.startPos = startPos || 0;
  this.pos = 0;
}

DBusBuffer.prototype.align = function (power) {
  const allbits = (1 << power) - 1;
  const paddedOffset = ((this.pos + this.startPos + allbits) >> power) << power;
  this.pos = paddedOffset - this.startPos;
};

DBusBuffer.prototype.readInt8 = function () {
  this.pos++;
  return this.buffer[this.pos - 1];
};

DBusBuffer.prototype.readSInt16 = function () {
  this.align(1);

  const res = (this.endian === LE
    ? this.buffer.readInt16LE(this.pos)
    : this.buffer.readInt16BE(this.pos));

  this.pos += 2;
  return res;
};

DBusBuffer.prototype.readInt16 = function () {
  this.align(1);

  const res = (this.endian === LE
    ? this.buffer.readUInt16LE(this.pos)
    : this.buffer.readUInt16BE(this.pos));

  this.pos += 2;
  return res;
};

DBusBuffer.prototype.readSInt32 = function () {
  this.align(2);

  const res = (this.endian === LE
    ? this.buffer.readInt32LE(this.pos)
    : this.buffer.readInt32BE(this.pos));

  this.pos += 4;
  return res;
};

DBusBuffer.prototype.readInt32 = function () {
  this.align(2);

  const res = (this.endian === LE
    ? this.buffer.readUInt32LE(this.pos)
    : this.buffer.readUInt32BE(this.pos));

  this.pos += 4;
  return res;
};

DBusBuffer.prototype.readDouble = function () {
  this.align(3);

  const res = (this.endian === LE
    ? this.buffer.readDoubleLE(this.pos)
    : this.buffer.readDoubleBE(this.pos));

  this.pos += 8;
  return res;
};

DBusBuffer.prototype.readString = function (len) {
  if (len === 0) {
    this.pos++;
    return '';
  }
  const res = this.buffer.toString('utf8', this.pos, this.pos + len);
  this.pos += len + 1; // dbus strings are always zero-terminated ('s' and 'g' types)
  return res;
};

DBusBuffer.prototype.readTree = function readTree (tree) {
  switch (tree.type) {
    case '(':
    case '{':
    case 'r':
      this.align(3);
      return this.readStruct(tree.child);
    case 'a':
      if (!tree.child || tree.child.length !== 1) {
        throw new Error('Incorrect array element signature');
      }
      return this.readArray(tree.child[0], this.readInt32());
    case 'v':
      return this.readVariant();
    default:
      return this.readSimpleType(tree.type);
  }
};

DBusBuffer.prototype.read = function read (signature) {
  const tree = parseSignature(signature);
  return this.readStruct(tree);
};

DBusBuffer.prototype.readVariant = function readVariant () {
  const signature = this.readSimpleType('g');
  const tree = parseSignature(signature);
  return [tree, this.readStruct(tree)];
};

DBusBuffer.prototype.readStruct = function readStruct (struct) {
  const result = [];
  for (let i = 0; i < struct.length; ++i) {
    result.push(this.readTree(struct[i]));
  }
  return result;
};

DBusBuffer.prototype.readArray = function readArray (eleType, arrayBlobSize) {
  const result = [];
  const start = this.pos;

  // special case: treat ay as Buffer
  if (eleType.type === 'y' && this.options.ayBuffer) {
    this.pos += arrayBlobSize;
    return this.buffer.slice(start, this.pos);
  }

  // end of array is start of first element + array size
  // we need to add 4 bytes if not on 8-byte boundary
  // and array element needs 8 byte alignment
  if (['x', 't', 'd', '{', '(', 'r'].indexOf(eleType.type) !== -1) {
    this.align(3);
  }
  const end = this.pos + arrayBlobSize;
  while (this.pos < end) {
    result.push(this.readTree(eleType));
  }
  return result;
};

DBusBuffer.prototype.readSimpleType = function readSimpleType (t) {
  let len, word0, word1;
  switch (t) {
    case 'y':
      return this.readInt8();
    case 'b':
      // TODO: spec says that true is strictly 1 and false is strictly 0
      // shold we error (or warn?) when non 01 values?
      return !!this.readInt32();
    case 'n':
      return this.readSInt16();
    case 'q':
      return this.readInt16();
    case 'h': {
      const idx = this.readInt32();
      if (!this.fds || this.fds.length <= idx) throw new Error('No FDs available');
      return this.fds[idx];
    } case 'u':
      return this.readInt32();
    case 'i':
      return this.readSInt32();
    case 'g':
      len = this.readInt8();
      return this.readString(len);
    case 's':
    case 'o':
      len = this.readInt32();
      return this.readString(len);
    // TODO: validate object path here
    // if (t === 'o' && !isValidObjectPath(str))
    //  throw new Error('string is not a valid object path'));
    case 'x': {
      // signed
      this.align(3);
      word0 = this.readInt32();
      word1 = this.readInt32();
      const signedLong = new Long(word0, word1, false);
      return BigInt(signedLong.toString());
    }
    case 't': {
      // unsigned
      this.align(3);
      word0 = this.readInt32();
      word1 = this.readInt32();
      const unsignedLong = new Long(word0, word1, true);
      return BigInt(unsignedLong.toString());
    }
    case 'd':
      return this.readDouble();
    default:
      throw new Error(`Unsupported type: ${t}`);
  }
};

module.exports = DBusBuffer;
07070100000020000081A4000000000000000000000001643934E9000003D5000000000000000000000000000000000000002A00000000dbus-final-0.0.0+git3e43f60/lib/errors.jsconst { assertInterfaceNameValid } = require('./validators');
/**
 * An error that can be thrown from DBus [`Interface`]{@link
 * module:interface~Interface} [methods]{@link module:interface.method} and
 * [property]{@link module:interface.property} getters and setters to return
 * the error to the client.
 *
 * This class will also be thrown by {@link ProxyInterface} method calls when
 * the interface method returns an error to the method call.
 *
 * @param {string} type - The type of error. Must be a valid DBus member name.
 * @param {string} text - The error text. Will be seen by the client.
 */
class DBusError extends Error {
  /**
   * Construct a new `DBusError` with the given type and text.
   */
  constructor (type, text, reply = null) {
    assertInterfaceNameValid(type);
    text = text || '';
    super(text);
    this.name = 'DBusError';
    this.type = type;
    this.text = text;
    this.reply = reply;
  }
}

module.exports = {
  DBusError: DBusError
};
07070100000021000081A4000000000000000000000001643934E90000129C000000000000000000000000000000000000002D00000000dbus-final-0.0.0+git3e43f60/lib/handshake.jsconst Buffer = require('safe-buffer').Buffer;
const crypto = require('crypto');
const fs = require('fs');
const path = require('path');

const constants = require('./constants');
const readLine = require('./readline');

function sha1 (input) {
  const shasum = crypto.createHash('sha1');
  shasum.update(input);
  return shasum.digest('hex');
}

function getUserHome () {
  return process.env[process.platform.match(/$win/) ? 'USERPROFILE' : 'HOME'];
}

function getCookie (context, id, cb) {
  // http://dbus.freedesktop.org/doc/dbus-specification.html#auth-mechanisms-sha
  const dirname = path.join(getUserHome(), '.dbus-keyrings');
  // > There is a default context, "org_freedesktop_general" that's used by servers that do not specify otherwise.
  if (context.length === 0) context = 'org_freedesktop_general';

  const filename = path.join(dirname, context);
  // check it's not writable by others and readable by user
  fs.stat(dirname, function (err, stat) {
    if (err) return cb(err);
    if (stat.mode & 0o22) {
      return cb(
        new Error(
          'User keyrings directory is writeable by other users. Aborting authentication'
        )
      );
    }
    if ('getuid' in process && stat.uid !== process.getuid()) {
      return cb(
        new Error(
          'Keyrings directory is not owned by the current user. Aborting authentication!'
        )
      );
    }
    fs.readFile(filename, 'ascii', function (err, keyrings) {
      if (err) return cb(err);
      const lines = keyrings.split('\n');
      for (let l = 0; l < lines.length; ++l) {
        const data = lines[l].split(' ');
        if (id === data[0]) return cb(null, data[2]);
      }
      return cb(new Error('cookie not found'));
    });
  });
}

function hexlify (input) {
  return Buffer.from(input.toString(), 'ascii').toString('hex');
}

module.exports = function auth (stream, opts, cb) {
  // filter used to make a copy so we don't accidently change opts data
  let authMethods;
  if (opts.authMethods) {
    authMethods = opts.authMethods;
  } else {
    authMethods = constants.defaultAuthMethods;
  }
  stream.write('\0');
  tryAuth(stream, authMethods.slice(), cb);
};

function tryAuth (stream, methods, cb) {
  if (methods.length === 0) {
    return cb(new Error('No authentication methods left to try'));
  }

  const authMethod = methods.shift();
  const uid = 'getuid' in process ? process.getuid() : 0;
  const id = hexlify(uid);

  let guid = '';
  function beginOrNextAuth () {
    readLine(stream, function (line) {
      const ok = line.toString('ascii').match(/^([A-Za-z]+) (.*)/);
      if (ok && ok[1] === 'OK') {
        guid = ok[2]; // ok[2] = guid. Do we need it?
        if (stream.supportsUnixFd) {
          negotiateUnixFd();
        } else {
          stream.write('BEGIN\r\n');
          return cb(null, guid);
        }
      } else {
        // TODO: parse error!
        if (!methods.empty) {
          tryAuth(stream, methods, cb);
        } else {
          return cb(line);
        }
      }
    });
  }
  function negotiateUnixFd () {
    stream.write('NEGOTIATE_UNIX_FD\r\n');
    readLine(stream, function (line) {
      const res = line.toString('ascii').trim();
      if (res === 'AGREE_UNIX_FD') {
        // ok
      } else if (res === 'ERROR') {
        stream.supportsUnixFd = false;
      } else {
        return cb(line);
      }
      stream.write('BEGIN\r\n');
      return cb(null, guid);
    });
  }

  switch (authMethod) {
    case 'EXTERNAL':
      stream.write(`AUTH ${authMethod} ${id}\r\n`);
      beginOrNextAuth();
      break;
    case 'DBUS_COOKIE_SHA1':
      stream.write(`AUTH ${authMethod} ${id}\r\n`);
      readLine(stream, function (line) {
        const data = Buffer.from(
          line
            .toString()
            .split(' ')[1]
            .trim(),
          'hex'
        )
          .toString()
          .split(' ');
        const cookieContext = data[0];
        const cookieId = data[1];
        const serverChallenge = data[2];
        // any random 16 bytes should work, sha1(rnd) to make it simplier
        const clientChallenge = crypto.randomBytes(16).toString('hex');
        getCookie(cookieContext, cookieId, function (err, cookie) {
          if (err) return cb(err);
          const response = sha1(
            [serverChallenge, clientChallenge, cookie].join(':')
          );
          const reply = hexlify(clientChallenge + response);
          stream.write(`DATA ${reply}\r\n`);
          beginOrNextAuth();
        });
      });
      break;
    case 'ANONYMOUS':
      stream.write('AUTH ANONYMOUS \r\n');
      beginOrNextAuth();
      break;
    default:
      console.error(`Unsupported auth method: ${authMethod}`);
      beginOrNextAuth();
      break;
  }
}
07070100000022000081A4000000000000000000000001643934E900000193000000000000000000000000000000000000003600000000dbus-final-0.0.0+git3e43f60/lib/header-signature.json[
    {
        "type": "a",
        "child": [
            {
                "type": "(",
                "child": [
                    {
                        "type": "y",
                        "child": []
                    },
                    {
                        "type": "v",
                        "child": []
                    }
                ]
            }
        ]
    }
]
07070100000023000081A4000000000000000000000001643934E90000199A000000000000000000000000000000000000003300000000dbus-final-0.0.0+git3e43f60/lib/marshall-compat.jsconst { parseSignature, collapseSignature } = require('./signature');
const { Variant } = require('./variant');
const message = require('./message');

function valueIsMarshallVariant (value) {
  // used for the marshaller variant type
  return Array.isArray(value) && value.length === 2 && Array.isArray(value[0]) && value[0].length > 0 && value[0][0].type;
}

function marshallVariantToJs (variant) {
  // XXX The marshaller uses a different body format than what the connection
  // is expected to emit. These two formats should be unified.
  // parses a single complete variant in marshall format
  const type = variant[0][0];
  const value = variant[1][0];

  if (!type.child.length) {
    if (valueIsMarshallVariant(value)) {
      return new Variant(collapseSignature(value[0][0]), marshallVariantToJs(value));
    } else {
      return value;
    }
  }

  if (type.type === 'a') {
    if (type.child[0].type === 'y') {
      // this gives us a buffer
      return value;
    } else if (type.child[0].type === '{') {
      // this is an array of dictionary entries
      const result = {};
      for (let i = 0; i < value.length; ++i) {
        // dictionary keys must have basic types
        result[value[i][0]] = marshallVariantToJs([[type.child[0].child[1]], [value[i][1]]]);
      }
      return result;
    } else {
      // other arrays only have one type
      const result = [];
      for (let i = 0; i < value.length; ++i) {
        result[i] = marshallVariantToJs([[type.child[0]], [value[i]]]);
      }
      return result;
    }
  } else if (type.type === '(') {
    // structs have types equal to the number of children
    const result = [];
    for (let i = 0; i < value.length; ++i) {
      result[i] = marshallVariantToJs([[type.child[i]], [value[i]]]);
    }
    return result;
  }
}

function messageToJsFmt (message) {
  // XXX The marshaller uses a different body format than what the connection
  // is expected to emit. These two formats should be unified.
  const { signature = '', body = [] } = message;
  const bodyJs = [];
  const signatureTree = parseSignature(signature);
  for (let i = 0; i < signatureTree.length; ++i) {
    const tree = signatureTree[i];
    bodyJs.push(marshallVariantToJs([[tree], [body[i]]]));
  }

  message.body = bodyJs;
  message.signature = signature;
  return message;
}

function jsToMarshalFmt (signature, value) {
  // XXX The connection accepts a message body in plain js format and converts
  // it to the marshaller format for writing. These two formats should be
  // unified.
  if (value === undefined) {
    throw new Error(`expected value for signature: ${signature}`);
  }
  if (signature === undefined) {
    throw new Error(`expected signature for value: ${value}`);
  }

  let signatureStr = null;
  if (typeof signature === 'string') {
    signatureStr = signature;
    signature = parseSignature(signature)[0];
  } else {
    signatureStr = collapseSignature(signature);
  }

  if (signature.child.length === 0) {
    if (signature.type === 'v') {
      if (value.constructor !== Variant) {
        throw new Error(`expected a Variant for value (got ${typeof value})`);
      }
      return [signature.type, jsToMarshalFmt(value.signature, value.value)];
    } else {
      return [signature.type, value];
    }
  }

  if (signature.type === 'a' && signature.child[0].type === 'y' && value.constructor === Buffer) {
    // special case: ay is a buffer
    return [signatureStr, value];
  } else if (signature.type === 'a') {
    let result = [];
    if (signature.child[0].type === 'y') {
      result = value;
    } else if (signature.child[0].type === '{') {
      // this is an array of dictionary elements
      if (value.constructor !== Object) {
        throw new Error(`expecting an object for signature '${signatureStr}' (got ${typeof value})`);
      }
      for (const k of Object.keys(value)) {
        const v = value[k];
        if (v.constructor === Variant) {
          result.push([k, jsToMarshalFmt(v.signature, v.value)]);
        } else {
          result.push([k, jsToMarshalFmt(signature.child[0].child[1], v)[1]]);
        }
      }
    } else {
      if (!Array.isArray(value)) {
        throw new Error(`expecting an array for signature '${signatureStr}' (got ${typeof value})`);
      }
      for (const v of value) {
        if (v.constructor === Variant) {
          result.push(jsToMarshalFmt(v.signature, v.value));
        } else {
          result.push(jsToMarshalFmt(signature.child[0], v)[1]);
        }
      }
    }
    return [signatureStr, result];
  } else if (signature.type === '(') {
    if (!Array.isArray(value)) {
      throw new Error(`expecting an array for signature '${signatureStr}' (got ${typeof value})`);
    }
    if (value.length !== signature.child.length) {
      throw new Error(`expecting struct to have ${signature.child.length} members (got ${value.length} members)`);
    }
    const result = [];
    for (let i = 0; i < value.length; ++i) {
      const v = value[i];
      if (signature.child[i] === 'v') {
        if (v.constructor !== Variant) {
          throw new Error(`expected a Variant for struct member ${i + 1} (got ${v})`);
        }
        result.push(jsToMarshalFmt(v.signature, v.value));
      } else {
        result.push(jsToMarshalFmt(signature.child[i], v)[1]);
      }
    }
    return [signatureStr, result];
  } else {
    throw new Error(`got unknown complex type: ${signature.type}`);
  }
}

function marshallMessage (msg) {
  // XXX The connection accepts a message body in plain js format and converts
  // it to the marshaller format for writing. These two formats should be
  // unified.
  const { signature = '', body = [] } = msg;

  const signatureTree = parseSignature(signature);

  if (signatureTree.length !== body.length) {
    throw new Error(`Expected ${signatureTree.length} body elements for signature '${signature}' (got ${body.length})`);
  }

  const marshallerBody = [];
  for (let i = 0; i < body.length; ++i) {
    if (signatureTree[i].type === 'v') {
      if (body[i].constructor !== Variant) {
        throw new Error(`Expected a Variant() argument for position ${i + 1} (value='${body[i]}')`);
      }
      marshallerBody.push(jsToMarshalFmt(body[i].signature, body[i].value));
    } else {
      marshallerBody.push(jsToMarshalFmt(signatureTree[i], body[i])[1]);
    }
  }

  msg.signature = signature;
  msg.body = marshallerBody;
  return message.marshall(msg);
}

module.exports = {
  messageToJsFmt: messageToJsFmt,
  marshallMessage: marshallMessage
};
07070100000024000081A4000000000000000000000001643934E900000E54000000000000000000000000000000000000002C00000000dbus-final-0.0.0+git3e43f60/lib/marshall.jsconst assert = require('assert');

const { parseSignature } = require('./signature');
const put = require('@nornagon/put');
const Marshallers = require('./marshallers');
const align = require('./align').align;

module.exports = function marshall (signature, data, offset, fds) {
  if (typeof offset === 'undefined') offset = 0;
  const tree = parseSignature(signature);
  if (!Array.isArray(data) || data.length !== tree.length) {
    throw new Error(
      `message body does not match message signature. Body:${JSON.stringify(
        data
      )}, signature:${signature}`
    );
  }
  const putstream = put();
  putstream._offset = offset;
  const buf = writeStruct(putstream, tree, data, fds).buffer();
  return buf;
};

// TODO: serialise JS objects as a{sv}
// function writeHash(ps, treeKey, treeVal, data) {
//
// }

function writeStruct (ps, tree, data, fds) {
  if (tree.length !== data.length) {
    throw new Error('Invalid struct data');
  }
  for (let i = 0; i < tree.length; ++i) {
    write(ps, tree[i], data[i], fds);
  }
  return ps;
}

function write (ps, ele, data, fds) {
  switch (ele.type) {
    case '(':
    case '{':
      align(ps, 8);
      writeStruct(ps, ele.child, data, fds);
      break;
    case 'a': {
      // array serialisation:
      // length of array body aligned at 4 byte boundary
      // (optional 4 bytes to align first body element on 8-byte boundary if element
      // body
      const arrPut = put();
      arrPut._offset = ps._offset;
      const _offset = arrPut._offset;
      writeSimple(arrPut, 'u', 0); // array length placeholder
      const lengthOffset = arrPut._offset - 4 - _offset;
      // we need to align here because alignment is not included in array length
      if (['x', 't', 'd', '{', '('].indexOf(ele.child[0].type) !== -1) { align(arrPut, 8); }
      const startOffset = arrPut._offset;
      for (let i = 0; i < data.length; ++i) { write(arrPut, ele.child[0], data[i], fds); }
      const arrBuff = arrPut.buffer();
      const length = arrPut._offset - startOffset;
      // lengthOffset in the range 0 to 3 depending on number of align bytes padded _before_ arrayLength
      arrBuff.writeUInt32LE(length, lengthOffset);
      ps.put(arrBuff);
      ps._offset += arrBuff.length;
      break;
    } case 'v': {
      // TODO: allow serialisation of simple types as variants, e. g 123 -> ['u', 123], true -> ['b', 1], 'abc' -> ['s', 'abc']
      assert.strictEqual(data.length, 2, 'variant data should be [signature, data]');
      const signatureEle = {
        type: 'g',
        child: []
      };
      write(ps, signatureEle, data[0], fds);
      const tree = parseSignature(data[0]);
      assert(tree.length === 1);
      write(ps, tree[0], data[1], fds);
      break;
    } case 'h': {
      if (fds) {
        const idx = fds.push(data);
        return writeSimple(ps, ele.type, idx - 1);
      }
    }
    default:
      return writeSimple(ps, ele.type, data);
  }
}

const stringTypes = ['g', 'o', 's'];

function writeSimple (ps, type, data) {
  if (typeof data === 'undefined') {
    throw new Error(
      "Serialisation of JS 'undefined' type is not supported by d-bus"
    );
  }
  if (data === null) { throw new Error('Serialisation of null value is not supported by d-bus'); }

  if (Buffer.isBuffer(data)) data = data.toString(); // encoding?
  if (stringTypes.indexOf(type) !== -1 && typeof data !== 'string') {
    throw new Error(
      `Expected string or buffer argument, got ${JSON.stringify(
        data
      )} of type '${type}'`
    );
  }

  const simpleMarshaller = Marshallers.MakeSimpleMarshaller(type);
  simpleMarshaller.marshall(ps, data);
  return ps;
}
07070100000025000081A4000000000000000000000001643934E900001D32000000000000000000000000000000000000002F00000000dbus-final-0.0.0+git3e43f60/lib/marshallers.jsconst Buffer = require('safe-buffer').Buffer;
const align = require('./align').align;
const { parseSignature } = require('../lib/signature');
const Long = require('long');

const { _getBigIntConstants } = require('./constants');

/*
 * MakeSimpleMarshaller
 * @param signature - the signature of the data you want to check
 * @returns a simple marshaller with the "check" method
 *
 * check returns nothing - it only raises errors if the data is
 * invalid for the signature
 */
const MakeSimpleMarshaller = function (signature) {
  const marshaller = {};
  function checkValidString (data) {
    if (typeof data !== 'string') {
      throw new Error(`Data: ${data} was not of type string`);
    } else if (data.indexOf('\0') !== -1) {
      throw new Error('String contains null byte');
    }
  }

  function checkValidSignature (data) {
    if (data.length > 0xff) {
      throw new Error(
        `Data: ${data} is too long for signature type (${data.length} > 255)`
      );
    }

    let parenCount = 0;
    for (let ii = 0; ii < data.length; ++ii) {
      if (parenCount > 32) {
        throw new Error(
          `Maximum container type nesting exceeded in signature type:${data}`
        );
      }
      switch (data[ii]) {
        case '(':
          ++parenCount;
          break;
        case ')':
          --parenCount;
          break;
        default:
          /* no-op */
          break;
      }
    }
    parseSignature(data);
  }

  switch (signature) {
    case 'o':
    // object path
    // TODO: verify object path here?
    case 's': // eslint-disable-line no-fallthrough
      // STRING
      marshaller.check = function (data) {
        checkValidString(data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        // utf8 string
        align(ps, 4);
        const buff = Buffer.from(data, 'utf8');
        ps
          .word32le(buff.length)
          .put(buff)
          .word8(0);
        ps._offset += 5 + buff.length;
      };
      break;
    case 'g':
      // SIGNATURE
      marshaller.check = function (data) {
        checkValidString(data);
        checkValidSignature(data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        // signature
        const buff = Buffer.from(data, 'ascii');
        ps
          .word8(data.length)
          .put(buff)
          .word8(0);
        ps._offset += 2 + buff.length;
      };
      break;
    case 'y':
      // BYTE
      marshaller.check = function (data) {
        checkInteger(data);
        checkRange(0x00, 0xff, data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        ps.word8(data);
        ps._offset++;
      };
      break;
    case 'b':
      // BOOLEAN
      marshaller.check = function (data) {
        checkBoolean(data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        // booleans serialised as 0/1 unsigned 32 bit int
        data = data ? 1 : 0;
        align(ps, 4);
        ps.word32le(data);
        ps._offset += 4;
      };
      break;
    case 'n':
      // INT16
      marshaller.check = function (data) {
        checkInteger(data);
        checkRange(-0x7fff - 1, 0x7fff, data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        align(ps, 2);
        const buff = Buffer.alloc(2);
        buff.writeInt16LE(parseInt(data), 0);
        ps.put(buff);
        ps._offset += 2;
      };
      break;
    case 'q':
      // UINT16
      marshaller.check = function (data) {
        checkInteger(data);
        checkRange(0, 0xffff, data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        align(ps, 2);
        ps.word16le(data);
        ps._offset += 2;
      };
      break;
    case 'h':
    case 'i':
      // INT32
      marshaller.check = function (data) {
        checkInteger(data);
        checkRange(-0x7fffffff - 1, 0x7fffffff, data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        align(ps, 4);
        const buff = Buffer.alloc(4);
        buff.writeInt32LE(parseInt(data), 0);
        ps.put(buff);
        ps._offset += 4;
      };
      break;
    case 'u':
      // UINT32
      marshaller.check = function (data) {
        checkInteger(data);
        checkRange(0, 0xffffffff, data);
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        // 32 t unsigned int
        align(ps, 4);
        ps.word32le(data);
        ps._offset += 4;
      };
      break;
    case 't':
      // UINT64
      marshaller.check = function (data) {
        return checkLong(data, false);
      };
      marshaller.marshall = function (ps, data) {
        data = this.check(data);
        align(ps, 8);
        ps.word32le(data.low);
        ps.word32le(data.high);
        ps._offset += 8;
      };
      break;
    case 'x':
      // INT64
      marshaller.check = function (data) {
        return checkLong(data, true);
      };
      marshaller.marshall = function (ps, data) {
        data = this.check(data);
        align(ps, 8);
        ps.word32le(data.low);
        ps.word32le(data.high);
        ps._offset += 8;
      };
      break;
    case 'd':
      // DOUBLE
      marshaller.check = function (data) {
        if (typeof data !== 'number') {
          throw new Error(`Data: ${data} was not of type number`);
        } else if (Number.isNaN(data)) {
          throw new Error(`Data: ${data} was not a number`);
        } else if (!Number.isFinite(data)) {
          throw new Error('Number outside range');
        }
      };
      marshaller.marshall = function (ps, data) {
        this.check(data);
        align(ps, 8);
        const buff = Buffer.alloc(8);
        buff.writeDoubleLE(parseFloat(data), 0);
        ps.put(buff);
        ps._offset += 8;
      };
      break;
    default:
      throw new Error(`Unknown data type format: ${signature}`);
  }
  return marshaller;
};
exports.MakeSimpleMarshaller = MakeSimpleMarshaller;

const checkRange = function (minValue, maxValue, data) {
  if (data > maxValue || data < minValue) {
    throw new Error('Number outside range');
  }
};

const checkInteger = function (data) {
  if (typeof data !== 'number') {
    throw new Error(`Data: ${data} was not of type number`);
  }
  if (Math.floor(data) !== data) {
    throw new Error(`Data: ${data} was not an integer`);
  }
};

const checkBoolean = function (data) {
  if (!(typeof data === 'boolean' || data === 0 || data === 1)) { throw new Error(`Data: ${data} was not of type boolean`); }
};

const checkBigIntLong = function (data, signed) {
  const { MAX_INT64, MIN_INT64, MAX_UINT64, MIN_UINT64 } = _getBigIntConstants();

  if (typeof data !== 'bigint') {
    data = BigInt(data.toString());
  }

  if (signed) {
    if (data > MAX_INT64) {
      throw new Error('data was out of range (greater than max int64)');
    } else if (data < MIN_INT64) {
      throw new Error('data was out of range (less than min int64)');
    }
  } else {
    if (data > MAX_UINT64) {
      throw new Error('data was out of range (greater than max uint64)');
    } else if (data < MIN_UINT64) {
      throw new Error('data was out of range (less than min uint64)');
    }
  }

  return Long.fromString(data.toString(), true);
};

const checkLong = function (data, signed) {
  return checkBigIntLong(data, signed);
};
07070100000026000081A4000000000000000000000001643934E900001A6F000000000000000000000000000000000000003000000000dbus-final-0.0.0+git3e43f60/lib/message-type.jsconst {
  assertBusNameValid,
  assertInterfaceNameValid,
  assertObjectPathValid,
  assertMemberNameValid
} = require('./validators');

const {
  METHOD_CALL,
  METHOD_RETURN,
  ERROR,
  SIGNAL
} = require('./constants').MessageType;

/**
 * @class
 * A `Message` is a class used for sending and receiving messages through the
 * {@link MessageBus} with the low-level api. `Message`s can be constructed by
 * the user directly for method calls or with the static convenience methods on
 * this class for the other types of messages. `Message`s can be sent through a
 * connected MessageBus with {@link MessageBus#call} for method calls that
 * expect a reply from the server or {@link MessageBus#send} for messages that
 * do not expect a reply. See those methods for an example of how to use this
 * class.
 *
 * @see https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol
 *
 * @param {object} options - Options to construct this `Message` with. See the
 * corresponding member for more information.
 * @param {MessageType} [options.type={@link MessageType.METHOD_CALL}]
 * @param {int} [options.serial]
 * @param {string} [options.destination]
 * @param {string} [options.path]
 * @param {string} [options.interface] - Required for signals.
 * @param {string} [options.member] - Required for method calls and signals.
 * @param {string} [options.signature='']
 * @param {Array} [options.body=[]] -  Must match the signature.
 * @param {string} [options.errorName] - Must be a valid interface name.
 * Required for errors.
 * @param {string} [options.replySerial] - Required for errors and method returns.
 * @param {MessageFlags} [options.flags]
 */
class Message {
  /**
   * Construct a new `Message` to send on the bus.
   */
  constructor (msg) {
    /**
     * @member {MessageType} - The type of message this is.
     */
    this.type = (msg.type ? msg.type : METHOD_CALL);
    this._sent = false;
    this._serial = (isNaN(msg.serial) ? null : msg.serial);
    /**
     * @member {string} - The name of the object path for the message.
     * Required for method calls and signals.
     */
    this.path = msg.path;
    /**
     * @member {string} - The destination interface for this message.
     */
    this.interface = msg.interface;
    /**
     * @member {string} - The destination member on the interface for this message.
     */
    this.member = msg.member;
    /**
     * @member {string} - The name of the error if this is a message of type
     * `ERROR`. Must be a valid interface name.
     */
    this.errorName = msg.errorName;
    /**
     * @member {int} - The serial for the message this is in reply to. Set for
     * types `ERROR` and `METHOD_RETURN`.
     */
    this.replySerial = msg.replySerial;
    /**
     * @member {string} - The address on the bus to send the message
     * to.
     */
    this.destination = msg.destination;
    /**
     * @member {string} - The name of the bus from which this message was sent.
     * Set by the {@link MessageBus}.
     */
    this.sender = msg.sender;
    /**
     * @member {string} - The type signature for the body args.
     */
    this.signature = msg.signature || '';
    /**
     * @member {Array} - The body arguments for this message. Must match the signature.
     */
    this.body = msg.body || [];
    /**
     * @member {MessageFlags} - The flags for this message.
     */
    this.flags = msg.flags || 0;

    if (this.destination) {
      assertBusNameValid(this.destination);
    }

    if (this.interface) {
      assertInterfaceNameValid(this.interface);
    }

    if (this.path) {
      assertObjectPathValid(this.path);
    }

    if (this.member) {
      assertMemberNameValid(this.member);
    }

    if (this.errorName) {
      assertInterfaceNameValid(this.errorName);
    }

    const requireFields = (...fields) => {
      for (const field of fields) {
        if (this[field] === undefined) {
          throw new Error(`Message is missing a required field: ${field}`);
        }
      }
    };

    // validate required fields
    switch (this.type) {
      case METHOD_CALL:
        requireFields('path', 'member');
        break;
      case SIGNAL:
        requireFields('path', 'member', 'interface');
        break;
      case ERROR:
        requireFields('errorName', 'replySerial');
        break;
      case METHOD_RETURN:
        requireFields('replySerial');
        break;
      default:
        throw new Error(`Got unknown message type: ${this.type}`);
    }
  }

  /**
    * @member {int} - The serial of the message to track through the bus.  You
    * must use {@link MessageBus#newSerial} to get this serial. If not set, it
    * will be set automatically when the message is sent.
    */
  get serial () {
    return this._serial;
  }

  set serial (value) {
    this._sent = false;
    this._serial = value;
  }

  /**
   * Construct a new `Message` of type `ERROR` in reply to the given `Message`.
   *
   * @param {Message} msg - The `Message` this error is in reply to.
   * @param {string} errorName - The name of the error. Must be a valid
   * interface name.
   * @param {string} [errorText='An error occurred.'] - An error message for
   * the error.
   */
  static newError (msg, errorName, errorText = 'An error occurred.') {
    assertInterfaceNameValid(errorName);
    return new Message({
      type: ERROR,
      replySerial: msg.serial,
      destination: msg.sender,
      errorName: errorName,
      signature: 's',
      body: [errorText]
    });
  }

  /**
   * Construct a new `Message` of type `METHOD_RETURN` in reply to the given
   * message.
   *
   * @param {Message} msg - The `Message` this `Message` is in reply to.
   * @param {string} signature - The signature for the message body.
   * @param {Array} body - The body of the message as an array of arguments.
   * Must match the signature.
   */
  static newMethodReturn (msg, signature = '', body = []) {
    return new Message({
      type: METHOD_RETURN,
      replySerial: msg.serial,
      destination: msg.sender,
      signature: signature,
      body: body
    });
  }

  /**
   * Construct a new `Message` of type `SIGNAL` to broadcast on the bus.
   *
   * @param {string} path - The object path of this signal.
   * @param {string} iface - The interface of this signal.
   * @param {string} signature - The signature of the message body.
   * @param {Array] body - The body of the message as an array of arguments.
   * Must match the signature.
   */
  static newSignal (path, iface, name, signature = '', body = []) {
    return new Message({
      type: SIGNAL,
      interface: iface,
      path: path,
      member: name,
      signature: signature,
      body: body
    });
  }
}

module.exports = {
  Message: Message
};
07070100000027000081A4000000000000000000000001643934E900001057000000000000000000000000000000000000002B00000000dbus-final-0.0.0+git3e43f60/lib/message.jsconst Buffer = require('safe-buffer').Buffer;
const marshall = require('./marshall');
const constants = require('./constants');
const DBusBuffer = require('./dbus-buffer');

const headerSignature = require('./header-signature.json');

module.exports.unmarshalMessages = function messageParser (
  stream,
  onMessage,
  opts
) {
  let state = 0; // 0: header, 1: fields + body
  let header, fieldsAndBody;
  let fieldsLength, fieldsLengthPadded;
  let fieldsAndBodyLength = 0;
  let bodyLength = 0;
  let endian = 0;
  const LE = constants.endianness.le;
  stream.on('readable', function () {
    while (1) {
      if (state === 0) {
        header = stream.read(16);
        if (!header) {
          break;
        }
        state = 1;

        endian = header.readUInt8(0);

        fieldsLength = (endian === LE ? header.readUInt32LE(12) : header.readUInt32BE(12));
        fieldsLengthPadded = ((fieldsLength + 7) >> 3) << 3;
        bodyLength = (endian === LE ? header.readUInt32LE(4) : header.readUInt32BE(4));
        fieldsAndBodyLength = fieldsLengthPadded + bodyLength;
      } else {
        const readBuf = stream.read(fieldsAndBodyLength, null);
        fieldsAndBody = readBuf?.data ?? readBuf;
        if (!fieldsAndBody) {
          break;
        }
        state = 0;

        const messageBuffer = new DBusBuffer(fieldsAndBody, 0, endian, readBuf.fds, opts);
        const unmarshalledHeader = messageBuffer.readArray(
          headerSignature[0].child[0],
          fieldsLength
        );
        messageBuffer.align(3);
        let headerName;
        const message = {};
        message.serial = (endian === LE ? header.readUInt32LE(8) : header.readUInt32BE(8));

        for (let i = 0; i < unmarshalledHeader.length; ++i) {
          headerName = constants.headerTypeName[unmarshalledHeader[i][0]];
          message[headerName] = unmarshalledHeader[i][1][1][0];
        }

        message.type = header[1];
        message.flags = header[2];

        if (bodyLength > 0 && message.signature) {
          message.body = messageBuffer.read(message.signature);
        }
        onMessage(message);
      }
    }
  });
};

// given buffer which contains entire message deserialise it
// TODO: factor out common code
module.exports.unmarshall = function unmarshall (buff, opts) {
  const endian = buff.readUInt8();
  const msgBuf = new DBusBuffer(buff, 0, endian, null, opts);
  const headers = msgBuf.read('yyyyuua(yv)');
  const message = {};
  for (let i = 0; i < headers[6].length; ++i) {
    const headerName = constants.headerTypeName[headers[6][i][0]];
    message[headerName] = headers[6][i][1][1][0];
  }
  message.type = headers[1];
  message.flags = headers[2];
  message.serial = headers[5];
  msgBuf.align(3);
  message.body = msgBuf.read(message.signature);
  return message;
};

module.exports.marshall = function marshallMessage (message) {
  if (!message.serial) throw new Error('Missing or invalid serial');
  const flags = message.flags || 0;
  const type = message.type || constants.messageType.METHOD_CALL;
  let bodyLength = 0;
  let bodyBuff;
  const fds = [];
  if (message.signature && message.body) {
    bodyBuff = marshall(message.signature, message.body, 0, fds);
    bodyLength = bodyBuff.length;
    message.unixFd = fds.length;
  }
  const header = [
    constants.endianness.le,
    type,
    flags,
    constants.protocolVersion,
    bodyLength,
    message.serial
  ];
  const headerBuff = marshall('yyyyuu', header);
  const fields = [];
  constants.headerTypeName.forEach(function (fieldName) {
    const fieldVal = message[fieldName];
    if (fieldVal) {
      fields.push([
        constants.headerTypeId[fieldName],
        [constants.fieldSignature[fieldName], fieldVal]
      ]);
    }
  });
  const fieldsBuff = marshall('a(yv)', [fields], 12);
  const headerLenAligned =
    ((headerBuff.length + fieldsBuff.length + 7) >> 3) << 3;
  const messageLen = headerLenAligned + bodyLength;
  const messageBuff = Buffer.alloc(messageLen);
  headerBuff.copy(messageBuff);
  fieldsBuff.copy(messageBuff, headerBuff.length);
  if (bodyLength > 0) bodyBuff.copy(messageBuff, headerLenAligned);

  return [messageBuff, fds];
};
07070100000028000081A4000000000000000000000001643934E900000218000000000000000000000000000000000000002C00000000dbus-final-0.0.0+git3e43f60/lib/readline.jsconst Buffer = require('safe-buffer').Buffer;

module.exports = function readOneLine (stream, cb) {
  const bytes = [];
  function readable () {
    while (1) {
      const buf = stream.read(1);
      if (!buf) return;
      const b = buf[0];
      if (b === 0x0a) {
        try {
          cb(Buffer.from(bytes));
        } catch (error) {
          stream.emit('error', error);
        }
        stream.removeListener('readable', readable);
        return;
      }
      bytes.push(b);
    }
  }
  stream.on('readable', readable);
};
07070100000029000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002800000000dbus-final-0.0.0+git3e43f60/lib/service0707010000002A000081A4000000000000000000000001643934E900002662000000000000000000000000000000000000003400000000dbus-final-0.0.0+git3e43f60/lib/service/handlers.jsconst fs = require('fs');
const variant = require('../variant');
const Variant = variant.Variant;
const { Message } = require('../message-type');

const {
  isObjectPathValid,
  isInterfaceNameValid,
  isMemberNameValid
} = require('../validators');

const {
  ACCESS_READ,
  ACCESS_WRITE,
  ACCESS_READWRITE
} = require('./interface');

const constants = require('../constants');

const {
  METHOD_RETURN
} = constants.MessageType;

const { DBusError } = require('../errors');

const INVALID_ARGS = 'org.freedesktop.DBus.Error.InvalidArgs';

function sendServiceError (bus, msg, errorMessage) {
  bus.send(Message.newError(msg, 'com.github.dbus_final.ServiceError', `Service error: ${errorMessage}`));
  return true;
}

function handleIntrospect (bus, msg, path) {
  bus.send(Message.newMethodReturn(msg, 's', [bus._introspect(path)]));
}

function handleGetProperty (bus, msg, path) {
  const [ifaceName, prop] = msg.body;

  if (!bus._serviceObjects[path]) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Path not exported on bus: '${path}'`));
    return;
  }

  const obj = bus._getServiceObject(path);
  const iface = obj.interfaces[ifaceName];
  // TODO An empty string may be provided for the interface name; in this case,
  // if there are multiple properties on an object with the same name, the
  // results are undefined (picking one by according to an arbitrary
  // deterministic rule, or returning an error, are the reasonable
  // possibilities).
  if (!iface) {
    bus.send(Message.newError(msg, INVALID_ARGS, `No such interface: '${ifaceName}'`));
    return;
  }

  const properties = iface.$properties || {};

  let options = null;
  let propertyKey = null;
  for (const k of Object.keys(properties)) {
    if (properties[k].name === prop && !properties[k].disabled) {
      options = properties[k];
      propertyKey = k;
      break;
    }
  }
  if (options === null) {
    bus.send(Message.newError(msg, INVALID_ARGS, `No such property: '${prop}'`));
    return;
  }

  let propertyValue = null;

  try {
    propertyValue = iface[propertyKey];
  } catch (e) {
    if (e.name === 'DBusError') {
      bus.send(Message.newError(msg, e.type, e.text));
    } else {
      sendServiceError(bus, msg, `The service threw an error.\n${e.stack}`);
    }
    return true;
  }

  if (propertyValue instanceof DBusError) {
    bus.send(Message.newError(msg, propertyValue.type, propertyValue.text));
    return true;
  } else if (propertyValue === undefined) {
    return sendServiceError(bus, msg, 'tried to get a property that is not set: ' + prop);
  }

  if (!(options.access === ACCESS_READWRITE ||
      options.access === ACCESS_READ)) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Property does not have read access: '${prop}'`));
  }

  const body = new Variant(options.signature, propertyValue);

  bus.send(Message.newMethodReturn(msg, 'v', [body]));
}

function handleGetAllProperties (bus, msg, path) {
  const ifaceName = msg.body[0];

  if (!bus._serviceObjects[path]) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Path not exported on bus: '${path}'`));
    return;
  }

  const obj = bus._getServiceObject(path);
  const iface = obj.interfaces[ifaceName];

  const result = {};
  if (iface) {
    const properties = iface.$properties || {};
    for (const k of Object.keys(properties)) {
      const p = properties[k];
      if (!(p.access === ACCESS_READ || p.access === ACCESS_READWRITE) || p.disabled) {
        continue;
      }

      let value;
      try {
        value = iface[k];
      } catch (e) {
        if (e.name === 'DBusError') {
          bus.send(Message.newError(msg, e.type, e.text));
        } else {
          sendServiceError(bus, msg, `The service threw an error.\n${e.stack}`);
        }
        return true;
      }
      if (value instanceof DBusError) {
        bus.send(Message.newError(msg, value.type, value.text));
        return true;
      } else if (value === undefined) {
        return sendServiceError(bus, msg, 'tried to get a property that is not set: ' + p);
      }

      result[p.name] = new Variant(p.signature, value);
    }
  }

  bus.send(Message.newMethodReturn(msg, 'a{sv}', [result]));
}

function handleSetProperty (bus, msg, path) {
  const [ifaceName, prop, value] = msg.body;

  if (!bus._serviceObjects[path]) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Path not exported on bus: '${path}'`));
    return;
  }

  const obj = bus._getServiceObject(path);
  const iface = obj.interfaces[ifaceName];

  if (!iface) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Interface not found: '${ifaceName}'`));
    return;
  }

  const properties = iface.$properties || {};
  let options = null;
  let propertyKey = null;
  for (const k of Object.keys(properties)) {
    if (properties[k].name === prop && !properties[k].disabled) {
      options = properties[k];
      propertyKey = k;
      break;
    }
  }

  if (options === null) {
    bus.send(Message.newError(msg, INVALID_ARGS, `No such property: '${prop}'`));
    return;
  }

  if (!(options.access === ACCESS_WRITE || options.access === ACCESS_READWRITE)) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Property does not have write access: '${prop}'`));
  }

  if (value.signature !== options.signature) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Cannot set property '${prop}' with signature '${value.signature}' (expected '${options.signature}')`));
    return;
  }

  try {
    iface[propertyKey] = value.value;
  } catch (e) {
    if (e.name === 'DBusError') {
      bus.send(Message.newError(msg, e.type, e.text));
    } else {
      sendServiceError(bus, msg, `The service threw an error.\n${e.stack}`);
    }
    return true;
  }

  bus.send(Message.newMethodReturn(msg, '', []));
}

function handleStdIfaces (bus, msg) {
  const {
    member,
    path,
    signature
  } = msg;

  const ifaceName = msg.interface;

  if (!isInterfaceNameValid(ifaceName)) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Invalid interface name: '${ifaceName}'`));
    return true;
  }

  if (!isMemberNameValid(member)) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Invalid member name: '${member}'`));
    return true;
  }

  if (!isObjectPathValid(path)) {
    bus.send(Message.newError(msg, INVALID_ARGS, `Invalid path name: '${path}'`));
    return true;
  }

  if (ifaceName === 'org.freedesktop.DBus.Introspectable' &&
        member === 'Introspect' &&
        !signature) {
    handleIntrospect(bus, msg, path);
    return true;
  } else if (ifaceName === 'org.freedesktop.DBus.Properties') {
    if (member === 'Get' && signature === 'ss') {
      handleGetProperty(bus, msg, path);
      return true;
    } else if (member === 'Set' && signature === 'ssv') {
      handleSetProperty(bus, msg, path);
      return true;
    } else if (member === 'GetAll') {
      handleGetAllProperties(bus, msg, path);
      return true;
    }
  } else if (ifaceName === 'org.freedesktop.DBus.Peer') {
    if (member === 'Ping' && !signature) {
      bus._connection.message({
        type: METHOD_RETURN,
        serial: bus._serial++,
        replySerial: msg.serial,
        destination: msg.sender
      });
      return true;
    } else if (member === 'GetMachineId' && !signature) {
      const machineId = fs.readFileSync('/var/lib/dbus/machine-id').toString().trim();
      bus._connection.message({
        type: METHOD_RETURN,
        serial: bus._serial++,
        replySerial: msg.serial,
        destination: msg.sender,
        signature: 's',
        body: [machineId]
      });
      return true;
    }
  }

  return false;
}

function handleMessage (msg, bus) {
  let {
    path,
    member,
    signature
  } = msg;

  const ifaceName = msg.interface;

  signature = signature || '';

  if (handleStdIfaces(bus, msg)) {
    return true;
  }

  if (!bus._serviceObjects[path]) {
    return false;
  }

  const obj = bus._getServiceObject(path);
  const iface = obj.interfaces[ifaceName];

  if (!iface) {
    return false;
  }

  const methods = iface.$methods || {};
  for (const m of Object.keys(methods)) {
    const method = methods[m];
    let result = null;

    const handleError = (e) => {
      if (e.name === 'DBusError') {
        bus.send(Message.newError(msg, e.type, e.text));
      } else {
        sendServiceError(bus, msg, `The service threw an error.\n${e.stack}`);
      }
    };

    if (method.name === member && method.inSignature === signature) {
      try {
        result = method.fn.apply(iface, msg.body);
      } catch (e) {
        handleError(e);
        return true;
      }

      const sendReply = (body) => {
        if (method.noReply) return;
        if (body === undefined) {
          body = [];
        } else if (method.outSignatureTree.length === 1) {
          body = [body];
        } else if (method.outSignatureTree.length === 0) {
          return sendServiceError(bus, msg, `method ${iface.$name}.${method.name} was not expected to return a body.`);
        } else if (!Array.isArray(body)) {
          return sendServiceError(bus, msg, `method ${iface.$name}.${method.name} expected to return multiple arguments in an array (signature: '${method.outSignature}')`);
        }

        if (method.outSignatureTree.length !== body.length) {
          return sendServiceError(bus, msg, `method ${iface.$name}.${m} returned the wrong number of arguments (got ${body.length} expected ${method.outSignatureTree.length}) for signature '${method.outSignature}'`);
        }

        bus.send(Message.newMethodReturn(msg, method.outSignature, body));
      };

      if (result && result.constructor === Promise) {
        result.then(sendReply).catch(handleError);
      } else {
        sendReply(result);
      }

      return true;
    }
  }

  return false;
}

module.exports = handleMessage;
0707010000002B000081A4000000000000000000000001643934E900004193000000000000000000000000000000000000003500000000dbus-final-0.0.0+git3e43f60/lib/service/interface.js/**
 * A module for exporting interfaces on a name on the message bus.
 *
 * @module interface
 */
const { parseSignature, collapseSignature } = require('../signature');
const variant = require('../variant');
const Variant = variant.Variant;

/**
 * Used for [`Interface`]{@link module:interface~Interface} [property]{@link
 * module:interface.property} options to specify that clients have read access
 * to the property.
 *
 * @static
 */
const ACCESS_READ = 'read';

/**
 * Used for [`Interface`]{@link module:interface~Interface} [property]{@link
 * module:interface.property} options to specify that clients have write access
 * to the property.
 *
 * @static
 */
const ACCESS_WRITE = 'write';

/**
 * Used for [`Interface`]{@link module:interface~Interface} [property]{@link
 * module:interface.property} options to specify that clients have read and
 * write access to the property.
 *
 * @static
 */
const ACCESS_READWRITE = 'readwrite';
const EventEmitter = require('events');
const {
  assertInterfaceNameValid,
  assertMemberNameValid
} = require('../validators');

/**
 * A decorator function to define an [`Interface`]{@link
 * module:interface~Interface} class member as a property.  The property will
 * be gotten and set from the class when users call the standard DBus methods
 * `org.freedesktop.DBus.Properties.Get`,
 * `org.freedesktop.DBus.Properties.Set`, and
 * `org.freedesktop.DBus.Properties.GetAll`. The property getters and setters
 * may throw a {@link DBusError} with an error name and message to return the
 * error to the client.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#type-system}
 *
 * @static
 *
 * @example
 * class MyInterface extends Interface {
 *   // uncomment below to use the decorator (jsdoc bug)
 *   //@property({signature: 's'})
 *   get MyProp() {
 *     return this.myProp;
 *   }
 *   set MyProp(value) {
 *     this.myProp = value;
 *   }
 * }
 *
 * @param {object} options - The options for this property.
 * @param {string} options.signature - The DBus type signature for this property.
 * @param {access} [options.access=ACCESS_READWRITE] - The read and write
 * access of the property for clients (effects `Get` and `Set` property methods).
 * @param {string} [options.name] - The name of this property on the bus.
 * Defaults to the name of the class member being decorated.
 * @param {bool} [options.disabled=false] - Whether or not this property
 * will be advertised on the bus.
 */
function property (options) {
  options.access = options.access || ACCESS_READWRITE;
  if (!options.signature) {
    throw new Error('missing signature for property');
  }
  options.signatureTree = parseSignature(options.signature);
  return function (descriptor) {
    options.name = options.name || descriptor.key;
    assertMemberNameValid(options.name);
    descriptor.finisher = function (klass) {
      klass.prototype.$properties = klass.prototype.$properties || [];
      klass.prototype.$properties[descriptor.key] = options;
    };
    return descriptor;
  };
}

/**
 * A decorator function to define an [`Interface`]{@link
 * module:interface~Interface} class member as a method. The method will be
 * called when the client calls it on the bus with the given arguments with
 * types specified by the `inSignature` in the method options.  The method
 * should return a result specified by the `outSignature` which will be
 * returned to the client over the message bus. If multiple output parameters
 * are specified in the `outSignature`, they should be returned within an
 * array.
 *
 * The method may also be `async` or return a `Promise` with the result and the
 * reply will be sent once the promise returns with a response body.
 *
 * The method may throw a {@link DBusError} with an error name and
 * message to return the error to the client.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#type-system}
 *
 * @static
 *
 * @example
 * // uncomment the decorators to use them (jsdoc bug)
 *
 * class MyInterface extends Interface {
 *   //@method({inSignature: 's', outSignature: 's'})
 *   async Echo(what) {
 *     return what;
 *   }
 *
 *   //@method({inSignature: 'ss', outSignature: 'vv'})
 *   ReturnsMultiple(what, what2) {
 *     return [
 *       new Variant('s', what),
 *       new Variant('s', what2)
 *     ];
 *   }
 *
 *   //@method({inSignature: '', outSignature: ''})
 *   ThrowsError() {
 *     // the error is returned to the client
 *     throw new DBusError('org.test.iface.Error', 'something went wrong');
 *   }
 * }
 *
 * @param {object} options - The options for this method.
 * @param {string} [options.inSignature=""] - The DBus type signature for the
 * input to this method.
 * @param {string} [options.outSignature=""] - The DBus type signature for the
 * output of this method.
 * @param {string} [options.name] - The name of this method on the bus.
 * Defaults to the name of the class member being decorated.
 * @param {bool} [options.disabled=false] - Whether or not this property
 * will be advertised on the bus.
 */
function method (options) {
  // TODO allow overriding of methods?
  // TODO introspect the names of the arguments for the function:
  // https://stackoverflow.com/questions/1007981/how-to-get-function-parameter-names-values-dynamically
  options.disabled = !!options.disabled;
  options.inSignature = options.inSignature || '';
  options.outSignature = options.outSignature || '';
  options.inSignatureTree = parseSignature(options.inSignature);
  options.outSignatureTree = parseSignature(options.outSignature);
  return function (descriptor) {
    options.name = options.name || descriptor.key;
    assertMemberNameValid(options.name);
    options.fn = descriptor.descriptor.value;
    descriptor.finisher = function (klass) {
      klass.prototype.$methods = klass.prototype.$methods || [];
      klass.prototype.$methods[descriptor.key] = options;
    };
    return descriptor;
  };
}

/**
 * A decorator function to define an [`Interface`]{@link
 * module:interface~Interface} class member as a signal. To emit the signal on
 * the bus to listeners, just call the decorated method and the signal will be
 * emitted with the returned value with types specified by the `signature` in
 * the signal options. If the signal has multiple output parameters, they
 * should be returned in an array.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#type-system}
 *
 * @static
 *
 * @example
 * // uncomment the decorators to use them (jsdoc bug)
 * class MyInterface extends Interface {
 *   //@signal({signature: 's'})
 *   HelloWorld(value) {
 *     return value;
 *   }
 *
 *   //@signal({signature: 'ss'})
 *   SignalMultiple(x) {
 *     return [
 *       'hello',
 *       'world'
 *     ];
 *   }
 * }
 *
 * @param {object} options - The options for this property.
 * @param {string} options.signature - The DBus type signature for this signal.
 * @param {string} [options.name] - The name of this signal on the bus.
 * Defaults to the name of the class member being decorated.
 * @param {bool} [options.disabled=false] - Whether or not this property
 * will be advertised on the bus.
 */
function signal (options) {
  // TODO introspect the names of the arguments for the function:
  // https://stackoverflow.com/questions/1007981/how-to-get-function-parameter-names-values-dynamically
  options.signature = options.signature || '';
  options.signatureTree = parseSignature(options.signature);
  return function (descriptor) {
    options.name = options.name || descriptor.key;
    assertMemberNameValid(options.name);
    options.fn = descriptor.descriptor.value;
    descriptor.descriptor.value = function () {
      if (options.disabled) {
        throw new Error('tried to call a disabled signal');
      }
      const result = options.fn.apply(this, arguments);
      this.$emitter.emit('signal', options, result);
    };
    descriptor.finisher = function (klass) {
      klass.prototype.$signals = klass.prototype.$signals || [];
      klass.prototype.$signals[descriptor.key] = options;
    };
    return descriptor;
  };
}

/**
 * The `Interface` is an abstract class used for defining and exporting an
 * interface on a DBus name. You can override this class to make your own DBus
 * interfaces. Use the decorators within this module to define the
 * [properties]{@link module:interface.property}, [methods]{@link
 * module:interface.method}, and [signals]{@link module:interface.signal} that
 * the interface has. These will be advertised to users in the introspection
 * xml gotten by the `org.freedesktop.DBus.Introspect` method on the name. See
 * the documentation for the decorators for more information. The constructor
 * of the `Interface` should call `super()` with the name of the interface that
 * will be exported.
 *
 * @example
 * class MyInterface extends Interface {
 *    constructor() {
 *      super('org.test.interface_name');
 *    }
 *    // define properties, methods, and signals with decorated functions
 * }
 * let bus = dbus.sessionBus();
 * let name = await bus.requestName('org.test.bus_name');
 * let iface = new MyInterface();
 * name.export('/org/test/path', iface);
 */
class Interface {
  /**
   * Create an interface. This should be called with the name of the interface
   * in the class that extends it.
   */
  constructor (name) {
    assertInterfaceNameValid(name);
    this.$name = name;
    this.$emitter = new EventEmitter();
  }

  /**
   * An alternative to the decorator functions to configure
   * [`Interface`]{@link module:interface~Interface} DBus members when
   * decorators cannot be supported.
   *
   * *Calling this method twice on the same `Interface` or mixing this method
   * with the decorator interface will result in undefined behavior that may be
   * specified at a future time.*
   *
   * @static
   * @example
   * ConfiguredInterface.configureMembers({
   *   properties: {
   *     SomeProperty: {
   *       signature: 's'
   *     }
   *   },
   *   methods: {
   *     Echo: {
   *       inSignature: 'v',
   *       outSignature: 'v'
   *     }
   *   },
   *   signals: {
   *     HelloWorld: {
   *       signature: 'ss'
   *     }
   *   }
   * });
   *
   * @param members {Object} - Member configuration object.
   * @param members.properties {Object} - The class methods to define as
   * properties. The key should be a method defined on the class and the value
   * should be the options for a [property]{@link module:interface.property}
   * decorator.
   * @param members.methods {Object} - The class methods to define as DBus
   * methods. The key should be a method defined on the class and the value
   * should be the options for a [method]{@link module:interface.method}
   * decorator.
   * @param members.signals {Object} - The class methods to define as signals.
   * The key should be a method defined on the class and hte value should be
   * options for a [signal]{@link module:interface.signal} decorator.
   */
  static configureMembers (members) {
    const properties = members.properties || {};
    const methods = members.methods || {};
    const signals = members.signals || {};

    this.prototype.$properties = {};
    this.prototype.$methods = {};
    this.prototype.$signals = {};

    for (const k of Object.keys(properties)) {
      const options = properties[k];
      options.name = options.name || k;
      options.access = options.access || ACCESS_READWRITE;
      if (!options.signature) {
        throw new Error('missing signature for property');
      }
      options.signatureTree = parseSignature(options.signature);
      assertMemberNameValid(options.name);
      this.prototype.$properties[options.name] = options;
    }

    for (const k of Object.keys(methods)) {
      const options = methods[k];
      options.name = options.name || k;
      assertMemberNameValid(options.name);
      options.disabled = !!options.disabled;
      options.inSignature = options.inSignature || '';
      options.outSignature = options.outSignature || '';
      options.inSignatureTree = parseSignature(options.inSignature);
      options.outSignatureTree = parseSignature(options.outSignature);
      options.fn = this.prototype[k];
      this.prototype.$methods[options.name] = options;
    }

    for (const k of Object.keys(signals)) {
      const options = signals[k];
      options.name = options.name || k;
      assertMemberNameValid(options.name);
      options.fn = this.prototype[k];
      options.signature = options.signature || '';
      options.signatureTree = parseSignature(options.signature);
      this.prototype[k] = function () {
        if (options.disabled) {
          throw new Error('tried to call a disabled signal');
        }
        const result = options.fn.apply(this, arguments);
        this.$emitter.emit('signal', options, result);
      };
      this.prototype.$signals[options.name] = options;
    }
  }

  /**
   * Emit the `PropertiesChanged` signal on an [`Interface`s]{@link
   * module:interface~Interface} associated standard
   * `org.freedesktop.DBus.Properties` interface with a map of new values and
   * invalidated properties. Pass the properties as JavaScript values.
   *
   * @static
   * @example
   * Interface.emitPropertiesChanged({ SomeProperty: 'bar' }, ['InvalidedProperty']);
   *
   * @param {module:interface~Interface} - the `Interface` to emit the `PropertiesChanged` signal on
   * @param {Object} - A map of property names and new property values that are changed.
   * @param {string[]} - A list of invalidated properties.
   */
  static emitPropertiesChanged (iface, changedProperties, invalidatedProperties = []) {
    if (!Array.isArray(invalidatedProperties) ||
        !invalidatedProperties.every((p) => typeof p === 'string')) {
      throw new Error('invalidated properties must be an array of strings');
    }

    // we transform them to variants here based on property signatures so they
    // don't have to
    const properties = iface.$properties || {};
    const changedPropertiesVariants = {};
    for (const p of Object.keys(changedProperties)) {
      if (properties[p] === undefined) {
        throw new Error(`got properties changed with unknown property: ${p}`);
      }
      changedPropertiesVariants[p] = new Variant(properties[p].signature, changedProperties[p]);
    }
    iface.$emitter.emit('properties-changed', changedPropertiesVariants, invalidatedProperties);
  }

  $introspect () {
    // TODO cache xml when the interface is declared
    const xml = {
      $: {
        name: this.$name
      }
    };

    const properties = this.$properties || {};
    for (const p of Object.keys(properties) || []) {
      const property = properties[p];
      if (property.disabled) {
        continue;
      }
      xml.property = xml.property || [];
      xml.property.push({
        $: {
          name: property.name,
          type: property.signature,
          access: property.access
        }
      });
    }

    const methods = this.$methods || {};
    for (const m of Object.keys(methods) || []) {
      const method = methods[m];
      if (method.disabled) {
        continue;
      }

      xml.method = xml.method || [];
      const methodXml = {
        $: {
          name: method.name
        },
        arg: [],
        annotation: []
      };

      for (const signature of method.inSignatureTree) {
        methodXml.arg.push({
          $: {
            direction: 'in',
            type: collapseSignature(signature)
          }
        });
      }

      for (const signature of method.outSignatureTree) {
        methodXml.arg.push({
          $: {
            direction: 'out',
            type: collapseSignature(signature)
          }
        });
      }

      if (method.noReply) {
        methodXml.annotation.push({
          $: {
            name: 'org.freedesktop.DBus.Method.NoReply',
            value: 'true'
          }
        });
      }

      xml.method.push(methodXml);
    }

    const signals = this.$signals || {};
    for (const s of Object.keys(signals) || []) {
      const signal = signals[s];
      if (signal.disabled) {
        continue;
      }
      xml.signal = xml.signal || [];
      const signalXml = {
        $: {
          name: signal.name
        },
        arg: []
      };

      for (const signature of signal.signatureTree) {
        signalXml.arg.push({
          $: {
            type: collapseSignature(signature)
          }
        });
      }

      xml.signal.push(signalXml);
    }

    return xml;
  }
}

module.exports = {
  ACCESS_READ: ACCESS_READ,
  ACCESS_WRITE: ACCESS_WRITE,
  ACCESS_READWRITE: ACCESS_READWRITE,
  property: property,
  method: method,
  signal: signal,
  Interface: Interface
};
0707010000002C000081A4000000000000000000000001643934E9000012B1000000000000000000000000000000000000003200000000dbus-final-0.0.0+git3e43f60/lib/service/object.jsconst { Message } = require('../message-type');
const Interface = require('./interface').Interface;
const assertObjectPathValid = require('../validators').assertObjectPathValid;

class ServiceObject {
  constructor (path, bus) {
    assertObjectPathValid(path);
    this.path = path;
    this.bus = bus;
    this.interfaces = {};
    this._handlers = {};
  }

  addInterface (iface) {
    if (!(iface instanceof Interface)) {
      throw new Error(`object.addInterface takes an Interface as the first argument (got ${iface})`);
    }
    if (this.interfaces[iface.$name]) {
      throw new Error(`an interface with name '${iface.$name}' is already exported on this object`);
    }
    this.interfaces[iface.$name] = iface;
    const that = this;

    const propertiesChangedHandler = function (changedProperties, invalidatedProperties) {
      const body = [
        iface.$name,
        changedProperties,
        invalidatedProperties
      ];
      that.bus.send(Message.newSignal(that.path, 'org.freedesktop.DBus.Properties', 'PropertiesChanged', 'sa{sv}as', body));
    };

    const signalHandler = function (options, result) {
      // TODO lots of repeated code with the method handler here
      const {
        signature,
        signatureTree,
        name
      } = options;
      if (result === undefined) {
        result = [];
      } else if (signatureTree.length === 1) {
        result = [result];
      } else if (!Array.isArray(result)) {
        throw new Error(`signal ${iface.$name}.${name} expected to return multiple arguments in an array (signature: '${signature}')`);
      }

      if (signatureTree.length !== result.length) {
        throw new Error(`signal ${iface.$name}.${name} returned the wrong number of arguments (got ${result.length} expected ${signatureTree.length}) for signature '${signature}'`);
      }

      that.bus.send(Message.newSignal(that.path, iface.$name, name, signature, result));
    };

    this._handlers[iface.$name] = {
      propertiesChanged: propertiesChangedHandler,
      signal: signalHandler
    };

    iface.$emitter.on('signal', signalHandler);
    iface.$emitter.on('properties-changed', propertiesChangedHandler);
  }

  removeInterface (iface) {
    if (!(iface instanceof Interface)) {
      throw new Error(`object.removeInterface takes an Interface as the first argument (got ${iface})`);
    }
    if (!this.interfaces[iface.$name]) {
      throw new Error(`Interface ${iface.$name} not exported on this object`);
    }
    const handlers = this._handlers[iface.$name];
    iface.$emitter.removeListener('signal', handlers.signal);
    iface.$emitter.removeListener('properties-changed', handlers.propertiesChanged);
    delete this._handlers[iface.$name];
    delete this.interfaces[iface.$name];
  }

  introspect () {
    const interfaces = ServiceObject.defaultInterfaces();

    for (const i of Object.keys(this.interfaces)) {
      const iface = this.interfaces[i];
      interfaces.push(iface.$introspect());
    }

    return interfaces;
  }

  static defaultInterfaces () {
    return [
      {
        $: { name: 'org.freedesktop.DBus.Introspectable' },
        method: [
          {
            $: { name: 'Introspect' },
            arg: [
              {
                $: { name: 'data', direction: 'out', type: 's' }
              }
            ]
          }
        ]
      },
      {
        $: { name: 'org.freedesktop.DBus.Peer' },
        method: [
          {
            $: { name: 'GetMachineId' },
            arg: [
              { $: { direction: 'out', name: 'machine_uuid', type: 's' } }
            ]
          },
          {
            $: { name: 'Ping' }
          }
        ]
      },
      {
        $: { name: 'org.freedesktop.DBus.Properties' },
        method: [
          {
            $: { name: 'Get' },
            arg: [
              { $: { direction: 'in', type: 's' } },
              { $: { direction: 'in', type: 's' } },
              { $: { direction: 'out', type: 'v' } }
            ]
          },
          {
            $: { name: 'Set' },
            arg: [
              { $: { direction: 'in', type: 's' } },
              { $: { direction: 'in', type: 's' } },
              { $: { direction: 'in', type: 'v' } }
            ]
          },
          {
            $: { name: 'GetAll' },
            arg: [
              { $: { direction: 'in', type: 's' } },
              { $: { direction: 'out', type: 'a{sv}' } }
            ]
          }
        ],
        signal: [
          {
            $: { name: 'PropertiesChanged' },
            arg: [
              { $: { type: 's' } },
              { $: { type: 'a{sv}' } },
              { $: { type: 'as' } }
            ]
          }
        ]
      }
    ];
  }
}

module.exports = ServiceObject;
0707010000002D000081A4000000000000000000000001643934E90000065E000000000000000000000000000000000000002D00000000dbus-final-0.0.0+git3e43f60/lib/signature.js// parse signature from string to tree

const match = {
  '{': '}',
  '(': ')'
};

const knownTypes = {};
'(){}ybnqiuxtdsogarvehm*?@&^'.split('').forEach(function (c) {
  knownTypes[c] = true;
});

function parseSignature (signature) {
  let index = 0;
  function next () {
    if (index < signature.length) {
      const c = signature[index];
      ++index;
      return c;
    }
    return null;
  }

  function parseOne (c) {
    function checkNotEnd (c) {
      if (!c) {
        throw new Error('Bad signature: unexpected end');
      }
      return c;
    }

    if (!knownTypes[c]) { throw new Error(`Unknown type: "${c}" in signature "${signature}"`); }

    let ele;
    const res = { type: c, child: [] };
    switch (c) {
      case 'a': // array
        ele = next();
        checkNotEnd(ele);
        res.child.push(parseOne(ele));
        return res;
      case '{': // dict entry
      case '(': // struct
        while ((ele = next()) !== null && ele !== match[c]) { res.child.push(parseOne(ele)); }
        checkNotEnd(ele);
        return res;
    }
    return res;
  }

  const ret = [];
  let c;
  while ((c = next()) !== null) {
    ret.push(parseOne(c));
  }
  return ret;
}

function collapseSignature (value) {
  if (value.child.length === 0) {
    return value.type;
  }

  let type = value.type;
  for (let i = 0; i < value.child.length; ++i) {
    type += collapseSignature(value.child[i]);
  }
  if (type[0] === '{') {
    type += '}';
  } else if (type[0] === '(') {
    type += ')';
  }
  return type;
}

module.exports = {
  parseSignature: parseSignature,
  collapseSignature: collapseSignature
};
0707010000002E000081A4000000000000000000000001643934E90000120D000000000000000000000000000000000000002E00000000dbus-final-0.0.0+git3e43f60/lib/validators.js/**
 * Utility functions to validate bus names, interface names, and object paths.
 *
 * @module validators
 */

const busNameRe = /^[A-Za-z_-][A-Za-z0-9_-]*$/;
/**
 * Validate the string as a valid bus name.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-bus}
 *
 * @static
 * @param {string} name - The name to validate as a valid bus name.
 * @returns {boolean} - Whether the string is a valid bus name.
 */
function isBusNameValid (name) {
  if (typeof name !== 'string') {
    return false;
  }

  if (name.startsWith(':')) {
    // a unique bus name
    return true;
  }

  // a well-known bus name
  return !!(name.length > 0 &&
    name.length <= 255 &&
    name[0] !== '.' &&
    name.indexOf('.') !== -1 &&
    name.split('.').every((n) => n && busNameRe.test(n)));
}

/**
 * Throws an error if the given string is not a valid bus name.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-bus}
 *
 * @static
 * @param {string} name - The name to validate as a bus name.
 */
function assertBusNameValid (name) {
  if (!isBusNameValid(name)) {
    throw new Error(`Invalid bus name: ${name}`);
  }
}

const pathRe = /^[A-Za-z0-9_]+$/;
/**
 * Validate the string as a valid object path.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-marshaling-object-path}
 *
 * @static
 * @param {string} path - The string to validate as an object path.
 * @returns {boolean} - Whether the string is a valid object path.
 */
function isObjectPathValid (path) {
  return !!(typeof path === 'string' &&
      path &&
      path[0] === '/' &&
      (path.length === 1 ||
        (path[path.length - 1] !== '/' &&
         path.split('/').slice(1).every((p) => p && pathRe.test(p)))));
}

/**
 * Throws an error if the given string is not a valid object path.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-marshaling-object-path}
 *
 * @static
 * @param {string} path - The string to validate as an object path.
 * @returns {boolean} - Whether the string is a valid object path.
 */
function assertObjectPathValid (path) {
  if (!isObjectPathValid(path)) {
    throw new Error(`Invalid object path: ${path}`);
  }
}

const elementRe = /^[A-Za-z_][A-Za-z0-9_]*$/;
/**
 * Validate the string as a valid interface name.
 * see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface}
 *
 * @static
 * @param {string} name - The string to validate as an interface name.
 * @returns {boolean} - Whether the string is a valid interface name.
 */
function isInterfaceNameValid (name) {
  return !!(typeof name === 'string' &&
    name &&
    name.length > 0 &&
    name.length <= 255 &&
    name[0] !== '.' &&
    name.indexOf('.') !== -1 &&
    name.split('.').every((n) => n && elementRe.test(n)));
}

/**
 * Throws an error if the given string is not a valid interface name.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface}
 *
 * @static
 * @param {string} name - The string to validate as an interface name.
 * @returns {boolean} - Whether the string is a valid interface name.
 */
function assertInterfaceNameValid (name) {
  if (!isInterfaceNameValid(name)) {
    throw new Error(`Invalid interface name: ${name}`);
  }
}

/**
 * Validate the string is a valid member name
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface}
 *
 * @static
 * @param {string} name - The string to validate as a member name.
 * @returns {boolean} - Whether the string is a valid member name.
 */
function isMemberNameValid (name) {
  return !!(typeof name === 'string' &&
    name &&
    name.length > 0 &&
    name.length <= 255 &&
    elementRe.test(name));
}

/**
 * Throws an error if the string is not a valid member name.
 * @see {@link https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-interface}
 *
 * @static
 * @param {string} name - The string to validate as a member name.
 */
function assertMemberNameValid (name) {
  if (!assertMemberNameValid) {
    throw new Error(`Invalid member name: ${name}`);
  }
}

module.exports = {
  isBusNameValid: isBusNameValid,
  assertBusNameValid: assertBusNameValid,
  isObjectPathValid: isObjectPathValid,
  assertObjectPathValid: assertObjectPathValid,
  isInterfaceNameValid: isInterfaceNameValid,
  assertInterfaceNameValid: assertInterfaceNameValid,
  isMemberNameValid: isMemberNameValid,
  assertMemberNameValid: assertMemberNameValid
};
0707010000002F000081A4000000000000000000000001643934E9000003DF000000000000000000000000000000000000002B00000000dbus-final-0.0.0+git3e43f60/lib/variant.js/**
 * @class
 * A class to represent DBus variants for both the client and service
 * interfaces. The {@link ProxyInterface} and [`Interface`]{@link
 * module:interface~Interface} methods, signals, and properties will use this
 * type to represent variant types. The user should use this class directly for
 * sending variants to methods if their signature expects the type to be a
 * variant.
 *
 * @example
 * let str = new Variant('s', 'hello');
 * let num = new Variant('d', 53);
 * let map = new Variant('a{ss}', { foo: 'bar' });
 * let list = new Variant('as', [ 'foo', 'bar' ]);
 */
class Variant {
  /**
  * Construct a new `Variant` with the given signature and value.
  * @param {string} signature - a DBus type signature for the `Variant`.
  * @param {any} value - the value of the `Variant` with type specified by the type signature.
  */
  constructor (signature, value) {
    this.signature = signature;
    this.value = value;
  }
}

module.exports = {
  Variant: Variant
};
07070100000030000081A4000000000000000000000001643934E90003D468000000000000000000000000000000000000002E00000000dbus-final-0.0.0+git3e43f60/package-lock.json{
  "name": "dbus-final",
  "version": "0.0.0-dev",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "dbus-final",
      "version": "0.0.0-dev",
      "license": "MIT",
      "dependencies": {
        "@nornagon/put": "0.0.8",
        "event-stream": "4.0.1",
        "long": "5.2.1",
        "safe-buffer": "5.2.1",
        "xml2js": "0.5.0"
      },
      "devDependencies": {
        "@babel/core": "7.21.4",
        "@babel/eslint-parser": "7.21.3",
        "@babel/plugin-proposal-class-properties": "7.18.6",
        "@babel/plugin-proposal-decorators": "7.21.0",
        "@babel/plugin-syntax-bigint": "7.8.3",
        "@babel/plugin-transform-async-to-generator": "7.20.7",
        "babel-jest": "29.5.0",
        "commander": "10.0.0",
        "eslint": "8.38.0",
        "eslint-plugin-jest": "27.2.1",
        "eslint-plugin-sort-keys": "2.3.5",
        "handlebars": "4.7.7",
        "jest": "29.5.0",
        "jsdoc": "4.0.2"
      }
    },
    "node_modules/@ampproject/remapping": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
      "dev": true,
      "dependencies": {
        "@jridgewell/gen-mapping": "^0.3.0",
        "@jridgewell/trace-mapping": "^0.3.9"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/@babel/code-frame": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
      "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
      "dev": true,
      "dependencies": {
        "@babel/highlight": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/compat-data": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz",
      "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/core": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz",
      "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==",
      "dev": true,
      "dependencies": {
        "@ampproject/remapping": "^2.2.0",
        "@babel/code-frame": "^7.21.4",
        "@babel/generator": "^7.21.4",
        "@babel/helper-compilation-targets": "^7.21.4",
        "@babel/helper-module-transforms": "^7.21.2",
        "@babel/helpers": "^7.21.0",
        "@babel/parser": "^7.21.4",
        "@babel/template": "^7.20.7",
        "@babel/traverse": "^7.21.4",
        "@babel/types": "^7.21.4",
        "convert-source-map": "^1.7.0",
        "debug": "^4.1.0",
        "gensync": "^1.0.0-beta.2",
        "json5": "^2.2.2",
        "semver": "^6.3.0"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/babel"
      }
    },
    "node_modules/@babel/eslint-parser": {
      "version": "7.21.3",
      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz",
      "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==",
      "dev": true,
      "dependencies": {
        "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
        "eslint-visitor-keys": "^2.1.0",
        "semver": "^6.3.0"
      },
      "engines": {
        "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
      },
      "peerDependencies": {
        "@babel/core": ">=7.11.0",
        "eslint": "^7.5.0 || ^8.0.0"
      }
    },
    "node_modules/@babel/generator": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz",
      "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.21.4",
        "@jridgewell/gen-mapping": "^0.3.2",
        "@jridgewell/trace-mapping": "^0.3.17",
        "jsesc": "^2.5.1"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-annotate-as-pure": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
      "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-compilation-targets": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz",
      "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==",
      "dev": true,
      "dependencies": {
        "@babel/compat-data": "^7.21.4",
        "@babel/helper-validator-option": "^7.21.0",
        "browserslist": "^4.21.3",
        "lru-cache": "^5.1.1",
        "semver": "^6.3.0"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0"
      }
    },
    "node_modules/@babel/helper-create-class-features-plugin": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz",
      "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==",
      "dev": true,
      "dependencies": {
        "@babel/helper-annotate-as-pure": "^7.18.6",
        "@babel/helper-environment-visitor": "^7.18.9",
        "@babel/helper-function-name": "^7.21.0",
        "@babel/helper-member-expression-to-functions": "^7.21.0",
        "@babel/helper-optimise-call-expression": "^7.18.6",
        "@babel/helper-replace-supers": "^7.20.7",
        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
        "@babel/helper-split-export-declaration": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0"
      }
    },
    "node_modules/@babel/helper-environment-visitor": {
      "version": "7.18.9",
      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
      "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-function-name": {
      "version": "7.21.0",
      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
      "dev": true,
      "dependencies": {
        "@babel/template": "^7.20.7",
        "@babel/types": "^7.21.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-hoist-variables": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
      "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-member-expression-to-functions": {
      "version": "7.21.0",
      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz",
      "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.21.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-module-imports": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz",
      "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.21.4"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-module-transforms": {
      "version": "7.21.2",
      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
      "dev": true,
      "dependencies": {
        "@babel/helper-environment-visitor": "^7.18.9",
        "@babel/helper-module-imports": "^7.18.6",
        "@babel/helper-simple-access": "^7.20.2",
        "@babel/helper-split-export-declaration": "^7.18.6",
        "@babel/helper-validator-identifier": "^7.19.1",
        "@babel/template": "^7.20.7",
        "@babel/traverse": "^7.21.2",
        "@babel/types": "^7.21.2"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-optimise-call-expression": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
      "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-plugin-utils": {
      "version": "7.20.2",
      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
      "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-remap-async-to-generator": {
      "version": "7.18.9",
      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
      "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-annotate-as-pure": "^7.18.6",
        "@babel/helper-environment-visitor": "^7.18.9",
        "@babel/helper-wrap-function": "^7.18.9",
        "@babel/types": "^7.18.9"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0"
      }
    },
    "node_modules/@babel/helper-replace-supers": {
      "version": "7.20.7",
      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
      "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
      "dev": true,
      "dependencies": {
        "@babel/helper-environment-visitor": "^7.18.9",
        "@babel/helper-member-expression-to-functions": "^7.20.7",
        "@babel/helper-optimise-call-expression": "^7.18.6",
        "@babel/template": "^7.20.7",
        "@babel/traverse": "^7.20.7",
        "@babel/types": "^7.20.7"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-simple-access": {
      "version": "7.20.2",
      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
      "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.20.2"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
      "version": "7.20.0",
      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
      "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.20.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-split-export-declaration": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
      "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-string-parser": {
      "version": "7.19.4",
      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
      "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-validator-identifier": {
      "version": "7.19.1",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
      "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-validator-option": {
      "version": "7.21.0",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-wrap-function": {
      "version": "7.20.5",
      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
      "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
      "dev": true,
      "dependencies": {
        "@babel/helper-function-name": "^7.19.0",
        "@babel/template": "^7.18.10",
        "@babel/traverse": "^7.20.5",
        "@babel/types": "^7.20.5"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helpers": {
      "version": "7.21.0",
      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
      "dev": true,
      "dependencies": {
        "@babel/template": "^7.20.7",
        "@babel/traverse": "^7.21.0",
        "@babel/types": "^7.21.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/highlight": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
      "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
      "dev": true,
      "dependencies": {
        "@babel/helper-validator-identifier": "^7.18.6",
        "chalk": "^2.0.0",
        "js-tokens": "^4.0.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/parser": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz",
      "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==",
      "dev": true,
      "bin": {
        "parser": "bin/babel-parser.js"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/@babel/plugin-proposal-class-properties": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
      "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
      "dev": true,
      "dependencies": {
        "@babel/helper-create-class-features-plugin": "^7.18.6",
        "@babel/helper-plugin-utils": "^7.18.6"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-proposal-decorators": {
      "version": "7.21.0",
      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz",
      "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==",
      "dev": true,
      "dependencies": {
        "@babel/helper-create-class-features-plugin": "^7.21.0",
        "@babel/helper-plugin-utils": "^7.20.2",
        "@babel/helper-replace-supers": "^7.20.7",
        "@babel/helper-split-export-declaration": "^7.18.6",
        "@babel/plugin-syntax-decorators": "^7.21.0"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-async-generators": {
      "version": "7.8.4",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-bigint": {
      "version": "7.8.3",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-class-properties": {
      "version": "7.12.13",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.12.13"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-decorators": {
      "version": "7.21.0",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz",
      "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.20.2"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-import-meta": {
      "version": "7.10.4",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.10.4"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-json-strings": {
      "version": "7.8.3",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-jsx": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz",
      "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.20.2"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
      "version": "7.10.4",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.10.4"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
      "version": "7.8.3",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-numeric-separator": {
      "version": "7.10.4",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.10.4"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-object-rest-spread": {
      "version": "7.8.3",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
      "version": "7.8.3",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-optional-chaining": {
      "version": "7.8.3",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.8.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-top-level-await": {
      "version": "7.14.5",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.14.5"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-syntax-typescript": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz",
      "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.20.2"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/plugin-transform-async-to-generator": {
      "version": "7.20.7",
      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
      "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
      "dev": true,
      "dependencies": {
        "@babel/helper-module-imports": "^7.18.6",
        "@babel/helper-plugin-utils": "^7.20.2",
        "@babel/helper-remap-async-to-generator": "^7.18.9"
      },
      "engines": {
        "node": ">=6.9.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0-0"
      }
    },
    "node_modules/@babel/template": {
      "version": "7.20.7",
      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
      "dev": true,
      "dependencies": {
        "@babel/code-frame": "^7.18.6",
        "@babel/parser": "^7.20.7",
        "@babel/types": "^7.20.7"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/traverse": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz",
      "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==",
      "dev": true,
      "dependencies": {
        "@babel/code-frame": "^7.21.4",
        "@babel/generator": "^7.21.4",
        "@babel/helper-environment-visitor": "^7.18.9",
        "@babel/helper-function-name": "^7.21.0",
        "@babel/helper-hoist-variables": "^7.18.6",
        "@babel/helper-split-export-declaration": "^7.18.6",
        "@babel/parser": "^7.21.4",
        "@babel/types": "^7.21.4",
        "debug": "^4.1.0",
        "globals": "^11.1.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/types": {
      "version": "7.21.4",
      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz",
      "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-string-parser": "^7.19.4",
        "@babel/helper-validator-identifier": "^7.19.1",
        "to-fast-properties": "^2.0.0"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@bcoe/v8-coverage": {
      "version": "0.2.3",
      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
      "dev": true
    },
    "node_modules/@eslint-community/eslint-utils": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
      "dev": true,
      "dependencies": {
        "eslint-visitor-keys": "^3.3.0"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "peerDependencies": {
        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
      }
    },
    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
      "version": "3.4.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
      "dev": true,
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/@eslint-community/regexpp": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz",
      "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==",
      "dev": true,
      "engines": {
        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
      }
    },
    "node_modules/@eslint/eslintrc": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
      "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
      "dev": true,
      "dependencies": {
        "ajv": "^6.12.4",
        "debug": "^4.3.2",
        "espree": "^9.5.1",
        "globals": "^13.19.0",
        "ignore": "^5.2.0",
        "import-fresh": "^3.2.1",
        "js-yaml": "^4.1.0",
        "minimatch": "^3.1.2",
        "strip-json-comments": "^3.1.1"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/@eslint/eslintrc/node_modules/argparse": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
      "dev": true
    },
    "node_modules/@eslint/eslintrc/node_modules/globals": {
      "version": "13.20.0",
      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
      "dev": true,
      "dependencies": {
        "type-fest": "^0.20.2"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
      "dev": true,
      "dependencies": {
        "argparse": "^2.0.1"
      },
      "bin": {
        "js-yaml": "bin/js-yaml.js"
      }
    },
    "node_modules/@eslint/eslintrc/node_modules/type-fest": {
      "version": "0.20.2",
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/@eslint/js": {
      "version": "8.38.0",
      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz",
      "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==",
      "dev": true,
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      }
    },
    "node_modules/@humanwhocodes/config-array": {
      "version": "0.11.8",
      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
      "dev": true,
      "dependencies": {
        "@humanwhocodes/object-schema": "^1.2.1",
        "debug": "^4.1.1",
        "minimatch": "^3.0.5"
      },
      "engines": {
        "node": ">=10.10.0"
      }
    },
    "node_modules/@humanwhocodes/module-importer": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
      "dev": true,
      "engines": {
        "node": ">=12.22"
      },
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/nzakas"
      }
    },
    "node_modules/@humanwhocodes/object-schema": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
      "dev": true
    },
    "node_modules/@istanbuljs/load-nyc-config": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
      "dev": true,
      "dependencies": {
        "camelcase": "^5.3.1",
        "find-up": "^4.1.0",
        "get-package-type": "^0.1.0",
        "js-yaml": "^3.13.1",
        "resolve-from": "^5.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@istanbuljs/schema": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/console": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
      "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "chalk": "^4.0.0",
        "jest-message-util": "^29.5.0",
        "jest-util": "^29.5.0",
        "slash": "^3.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/console/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/@jest/console/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/@jest/console/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/@jest/console/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/@jest/console/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/console/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/core": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
      "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
      "dev": true,
      "dependencies": {
        "@jest/console": "^29.5.0",
        "@jest/reporters": "^29.5.0",
        "@jest/test-result": "^29.5.0",
        "@jest/transform": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "ansi-escapes": "^4.2.1",
        "chalk": "^4.0.0",
        "ci-info": "^3.2.0",
        "exit": "^0.1.2",
        "graceful-fs": "^4.2.9",
        "jest-changed-files": "^29.5.0",
        "jest-config": "^29.5.0",
        "jest-haste-map": "^29.5.0",
        "jest-message-util": "^29.5.0",
        "jest-regex-util": "^29.4.3",
        "jest-resolve": "^29.5.0",
        "jest-resolve-dependencies": "^29.5.0",
        "jest-runner": "^29.5.0",
        "jest-runtime": "^29.5.0",
        "jest-snapshot": "^29.5.0",
        "jest-util": "^29.5.0",
        "jest-validate": "^29.5.0",
        "jest-watcher": "^29.5.0",
        "micromatch": "^4.0.4",
        "pretty-format": "^29.5.0",
        "slash": "^3.0.0",
        "strip-ansi": "^6.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
      },
      "peerDependenciesMeta": {
        "node-notifier": {
          "optional": true
        }
      }
    },
    "node_modules/@jest/core/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/@jest/core/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/@jest/core/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/@jest/core/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/@jest/core/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/core/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/environment": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
      "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
      "dev": true,
      "dependencies": {
        "@jest/fake-timers": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "jest-mock": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/expect": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
      "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
      "dev": true,
      "dependencies": {
        "expect": "^29.5.0",
        "jest-snapshot": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/expect-utils": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
      "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
      "dev": true,
      "dependencies": {
        "jest-get-type": "^29.4.3"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/fake-timers": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
      "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "@sinonjs/fake-timers": "^10.0.2",
        "@types/node": "*",
        "jest-message-util": "^29.5.0",
        "jest-mock": "^29.5.0",
        "jest-util": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/globals": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
      "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
      "dev": true,
      "dependencies": {
        "@jest/environment": "^29.5.0",
        "@jest/expect": "^29.5.0",
        "@jest/types": "^29.5.0",
        "jest-mock": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/reporters": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
      "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
      "dev": true,
      "dependencies": {
        "@bcoe/v8-coverage": "^0.2.3",
        "@jest/console": "^29.5.0",
        "@jest/test-result": "^29.5.0",
        "@jest/transform": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@jridgewell/trace-mapping": "^0.3.15",
        "@types/node": "*",
        "chalk": "^4.0.0",
        "collect-v8-coverage": "^1.0.0",
        "exit": "^0.1.2",
        "glob": "^7.1.3",
        "graceful-fs": "^4.2.9",
        "istanbul-lib-coverage": "^3.0.0",
        "istanbul-lib-instrument": "^5.1.0",
        "istanbul-lib-report": "^3.0.0",
        "istanbul-lib-source-maps": "^4.0.0",
        "istanbul-reports": "^3.1.3",
        "jest-message-util": "^29.5.0",
        "jest-util": "^29.5.0",
        "jest-worker": "^29.5.0",
        "slash": "^3.0.0",
        "string-length": "^4.0.1",
        "strip-ansi": "^6.0.0",
        "v8-to-istanbul": "^9.0.1"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
      },
      "peerDependenciesMeta": {
        "node-notifier": {
          "optional": true
        }
      }
    },
    "node_modules/@jest/reporters/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/@jest/reporters/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/@jest/reporters/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/@jest/reporters/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/@jest/reporters/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/reporters/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/schemas": {
      "version": "29.4.3",
      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
      "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
      "dev": true,
      "dependencies": {
        "@sinclair/typebox": "^0.25.16"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/source-map": {
      "version": "29.4.3",
      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
      "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
      "dev": true,
      "dependencies": {
        "@jridgewell/trace-mapping": "^0.3.15",
        "callsites": "^3.0.0",
        "graceful-fs": "^4.2.9"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/test-result": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
      "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
      "dev": true,
      "dependencies": {
        "@jest/console": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/istanbul-lib-coverage": "^2.0.0",
        "collect-v8-coverage": "^1.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/test-sequencer": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
      "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
      "dev": true,
      "dependencies": {
        "@jest/test-result": "^29.5.0",
        "graceful-fs": "^4.2.9",
        "jest-haste-map": "^29.5.0",
        "slash": "^3.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/transform": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
      "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
      "dev": true,
      "dependencies": {
        "@babel/core": "^7.11.6",
        "@jest/types": "^29.5.0",
        "@jridgewell/trace-mapping": "^0.3.15",
        "babel-plugin-istanbul": "^6.1.1",
        "chalk": "^4.0.0",
        "convert-source-map": "^2.0.0",
        "fast-json-stable-stringify": "^2.1.0",
        "graceful-fs": "^4.2.9",
        "jest-haste-map": "^29.5.0",
        "jest-regex-util": "^29.4.3",
        "jest-util": "^29.5.0",
        "micromatch": "^4.0.4",
        "pirates": "^4.0.4",
        "slash": "^3.0.0",
        "write-file-atomic": "^4.0.2"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/transform/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/@jest/transform/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/@jest/transform/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/@jest/transform/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/@jest/transform/node_modules/convert-source-map": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
      "dev": true
    },
    "node_modules/@jest/transform/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/transform/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/types": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
      "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
      "dev": true,
      "dependencies": {
        "@jest/schemas": "^29.4.3",
        "@types/istanbul-lib-coverage": "^2.0.0",
        "@types/istanbul-reports": "^3.0.0",
        "@types/node": "*",
        "@types/yargs": "^17.0.8",
        "chalk": "^4.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/@jest/types/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/@jest/types/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/@jest/types/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/@jest/types/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/@jest/types/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jest/types/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@jridgewell/gen-mapping": {
      "version": "0.3.3",
      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
      "dev": true,
      "dependencies": {
        "@jridgewell/set-array": "^1.0.1",
        "@jridgewell/sourcemap-codec": "^1.4.10",
        "@jridgewell/trace-mapping": "^0.3.9"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/@jridgewell/resolve-uri": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
      "dev": true,
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/@jridgewell/set-array": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
      "dev": true,
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/@jridgewell/sourcemap-codec": {
      "version": "1.4.14",
      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
      "dev": true
    },
    "node_modules/@jridgewell/trace-mapping": {
      "version": "0.3.18",
      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
      "dev": true,
      "dependencies": {
        "@jridgewell/resolve-uri": "3.1.0",
        "@jridgewell/sourcemap-codec": "1.4.14"
      }
    },
    "node_modules/@jsdoc/salty": {
      "version": "0.2.5",
      "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz",
      "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==",
      "dev": true,
      "dependencies": {
        "lodash": "^4.17.21"
      },
      "engines": {
        "node": ">=v12.0.0"
      }
    },
    "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
      "version": "5.1.1-v1",
      "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
      "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
      "dev": true,
      "dependencies": {
        "eslint-scope": "5.1.1"
      }
    },
    "node_modules/@nodelib/fs.scandir": {
      "version": "2.1.5",
      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
      "dev": true,
      "dependencies": {
        "@nodelib/fs.stat": "2.0.5",
        "run-parallel": "^1.1.9"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/@nodelib/fs.stat": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
      "dev": true,
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/@nodelib/fs.walk": {
      "version": "1.2.8",
      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
      "dev": true,
      "dependencies": {
        "@nodelib/fs.scandir": "2.1.5",
        "fastq": "^1.6.0"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/@nornagon/put": {
      "version": "0.0.8",
      "resolved": "https://registry.npmjs.org/@nornagon/put/-/put-0.0.8.tgz",
      "integrity": "sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==",
      "engines": {
        "node": ">=0.3.0"
      }
    },
    "node_modules/@sinclair/typebox": {
      "version": "0.25.24",
      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
      "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
      "dev": true
    },
    "node_modules/@sinonjs/commons": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
      "dev": true,
      "dependencies": {
        "type-detect": "4.0.8"
      }
    },
    "node_modules/@sinonjs/fake-timers": {
      "version": "10.0.2",
      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
      "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
      "dev": true,
      "dependencies": {
        "@sinonjs/commons": "^2.0.0"
      }
    },
    "node_modules/@types/babel__core": {
      "version": "7.20.0",
      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
      "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
      "dev": true,
      "dependencies": {
        "@babel/parser": "^7.20.7",
        "@babel/types": "^7.20.7",
        "@types/babel__generator": "*",
        "@types/babel__template": "*",
        "@types/babel__traverse": "*"
      }
    },
    "node_modules/@types/babel__generator": {
      "version": "7.6.4",
      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
      "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.0.0"
      }
    },
    "node_modules/@types/babel__template": {
      "version": "7.4.1",
      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
      "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
      "dev": true,
      "dependencies": {
        "@babel/parser": "^7.1.0",
        "@babel/types": "^7.0.0"
      }
    },
    "node_modules/@types/babel__traverse": {
      "version": "7.18.3",
      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
      "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
      "dev": true,
      "dependencies": {
        "@babel/types": "^7.3.0"
      }
    },
    "node_modules/@types/graceful-fs": {
      "version": "4.1.6",
      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
      "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
      "dev": true,
      "dependencies": {
        "@types/node": "*"
      }
    },
    "node_modules/@types/istanbul-lib-coverage": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
      "dev": true
    },
    "node_modules/@types/istanbul-lib-report": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
      "dev": true,
      "dependencies": {
        "@types/istanbul-lib-coverage": "*"
      }
    },
    "node_modules/@types/istanbul-reports": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
      "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
      "dev": true,
      "dependencies": {
        "@types/istanbul-lib-report": "*"
      }
    },
    "node_modules/@types/json-schema": {
      "version": "7.0.11",
      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
      "dev": true
    },
    "node_modules/@types/linkify-it": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
      "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
      "dev": true
    },
    "node_modules/@types/markdown-it": {
      "version": "12.2.3",
      "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
      "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
      "dev": true,
      "dependencies": {
        "@types/linkify-it": "*",
        "@types/mdurl": "*"
      }
    },
    "node_modules/@types/mdurl": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
      "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
      "dev": true
    },
    "node_modules/@types/node": {
      "version": "18.15.11",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
      "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==",
      "dev": true
    },
    "node_modules/@types/prettier": {
      "version": "2.7.2",
      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
      "dev": true
    },
    "node_modules/@types/semver": {
      "version": "7.3.13",
      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
      "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
      "dev": true
    },
    "node_modules/@types/stack-utils": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
      "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
      "dev": true
    },
    "node_modules/@types/yargs": {
      "version": "17.0.24",
      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
      "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
      "dev": true,
      "dependencies": {
        "@types/yargs-parser": "*"
      }
    },
    "node_modules/@types/yargs-parser": {
      "version": "21.0.0",
      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
      "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
      "dev": true
    },
    "node_modules/@typescript-eslint/scope-manager": {
      "version": "5.58.0",
      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz",
      "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==",
      "dev": true,
      "dependencies": {
        "@typescript-eslint/types": "5.58.0",
        "@typescript-eslint/visitor-keys": "5.58.0"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/typescript-eslint"
      }
    },
    "node_modules/@typescript-eslint/types": {
      "version": "5.58.0",
      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz",
      "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==",
      "dev": true,
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/typescript-eslint"
      }
    },
    "node_modules/@typescript-eslint/typescript-estree": {
      "version": "5.58.0",
      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz",
      "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==",
      "dev": true,
      "dependencies": {
        "@typescript-eslint/types": "5.58.0",
        "@typescript-eslint/visitor-keys": "5.58.0",
        "debug": "^4.3.4",
        "globby": "^11.1.0",
        "is-glob": "^4.0.3",
        "semver": "^7.3.7",
        "tsutils": "^3.21.0"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/typescript-eslint"
      },
      "peerDependenciesMeta": {
        "typescript": {
          "optional": true
        }
      }
    },
    "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
      "dev": true,
      "dependencies": {
        "yallist": "^4.0.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
      "version": "7.4.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz",
      "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==",
      "dev": true,
      "dependencies": {
        "lru-cache": "^6.0.0"
      },
      "bin": {
        "semver": "bin/semver.js"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
    },
    "node_modules/@typescript-eslint/utils": {
      "version": "5.58.0",
      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz",
      "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==",
      "dev": true,
      "dependencies": {
        "@eslint-community/eslint-utils": "^4.2.0",
        "@types/json-schema": "^7.0.9",
        "@types/semver": "^7.3.12",
        "@typescript-eslint/scope-manager": "5.58.0",
        "@typescript-eslint/types": "5.58.0",
        "@typescript-eslint/typescript-estree": "5.58.0",
        "eslint-scope": "^5.1.1",
        "semver": "^7.3.7"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/typescript-eslint"
      },
      "peerDependencies": {
        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
      }
    },
    "node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
      "dev": true,
      "dependencies": {
        "yallist": "^4.0.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/@typescript-eslint/utils/node_modules/semver": {
      "version": "7.4.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz",
      "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==",
      "dev": true,
      "dependencies": {
        "lru-cache": "^6.0.0"
      },
      "bin": {
        "semver": "bin/semver.js"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/@typescript-eslint/utils/node_modules/yallist": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
    },
    "node_modules/@typescript-eslint/visitor-keys": {
      "version": "5.58.0",
      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz",
      "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==",
      "dev": true,
      "dependencies": {
        "@typescript-eslint/types": "5.58.0",
        "eslint-visitor-keys": "^3.3.0"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/typescript-eslint"
      }
    },
    "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
      "version": "3.4.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
      "dev": true,
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/acorn": {
      "version": "8.8.2",
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
      "dev": true,
      "bin": {
        "acorn": "bin/acorn"
      },
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/acorn-jsx": {
      "version": "5.3.2",
      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
      "dev": true,
      "peerDependencies": {
        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
      }
    },
    "node_modules/ajv": {
      "version": "6.12.6",
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
      "dev": true,
      "dependencies": {
        "fast-deep-equal": "^3.1.1",
        "fast-json-stable-stringify": "^2.0.0",
        "json-schema-traverse": "^0.4.1",
        "uri-js": "^4.2.2"
      },
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/epoberezkin"
      }
    },
    "node_modules/ansi-escapes": {
      "version": "4.3.2",
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
      "dev": true,
      "dependencies": {
        "type-fest": "^0.21.3"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/ansi-regex": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/ansi-styles": {
      "version": "3.2.1",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
      "dev": true,
      "dependencies": {
        "color-convert": "^1.9.0"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/anymatch": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
      "dev": true,
      "dependencies": {
        "normalize-path": "^3.0.0",
        "picomatch": "^2.0.4"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/argparse": {
      "version": "1.0.10",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
      "dev": true,
      "dependencies": {
        "sprintf-js": "~1.0.2"
      }
    },
    "node_modules/array-union": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/babel-jest": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
      "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
      "dev": true,
      "dependencies": {
        "@jest/transform": "^29.5.0",
        "@types/babel__core": "^7.1.14",
        "babel-plugin-istanbul": "^6.1.1",
        "babel-preset-jest": "^29.5.0",
        "chalk": "^4.0.0",
        "graceful-fs": "^4.2.9",
        "slash": "^3.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.8.0"
      }
    },
    "node_modules/babel-jest/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/babel-jest/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/babel-jest/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/babel-jest/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/babel-jest/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/babel-jest/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/babel-plugin-istanbul": {
      "version": "6.1.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
      "dev": true,
      "dependencies": {
        "@babel/helper-plugin-utils": "^7.0.0",
        "@istanbuljs/load-nyc-config": "^1.0.0",
        "@istanbuljs/schema": "^0.1.2",
        "istanbul-lib-instrument": "^5.0.4",
        "test-exclude": "^6.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/babel-plugin-jest-hoist": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
      "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
      "dev": true,
      "dependencies": {
        "@babel/template": "^7.3.3",
        "@babel/types": "^7.3.3",
        "@types/babel__core": "^7.1.14",
        "@types/babel__traverse": "^7.0.6"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/babel-preset-current-node-syntax": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
      "dev": true,
      "dependencies": {
        "@babel/plugin-syntax-async-generators": "^7.8.4",
        "@babel/plugin-syntax-bigint": "^7.8.3",
        "@babel/plugin-syntax-class-properties": "^7.8.3",
        "@babel/plugin-syntax-import-meta": "^7.8.3",
        "@babel/plugin-syntax-json-strings": "^7.8.3",
        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
        "@babel/plugin-syntax-top-level-await": "^7.8.3"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0"
      }
    },
    "node_modules/babel-preset-jest": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
      "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
      "dev": true,
      "dependencies": {
        "babel-plugin-jest-hoist": "^29.5.0",
        "babel-preset-current-node-syntax": "^1.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "@babel/core": "^7.0.0"
      }
    },
    "node_modules/balanced-match": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
      "dev": true
    },
    "node_modules/bluebird": {
      "version": "3.7.2",
      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
      "dev": true
    },
    "node_modules/brace-expansion": {
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "dev": true,
      "dependencies": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
      }
    },
    "node_modules/braces": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
      "dev": true,
      "dependencies": {
        "fill-range": "^7.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/browserslist": {
      "version": "4.21.5",
      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
      "dev": true,
      "funding": [
        {
          "type": "opencollective",
          "url": "https://opencollective.com/browserslist"
        },
        {
          "type": "tidelift",
          "url": "https://tidelift.com/funding/github/npm/browserslist"
        }
      ],
      "dependencies": {
        "caniuse-lite": "^1.0.30001449",
        "electron-to-chromium": "^1.4.284",
        "node-releases": "^2.0.8",
        "update-browserslist-db": "^1.0.10"
      },
      "bin": {
        "browserslist": "cli.js"
      },
      "engines": {
        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
      }
    },
    "node_modules/bser": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
      "dev": true,
      "dependencies": {
        "node-int64": "^0.4.0"
      }
    },
    "node_modules/buffer-from": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
      "dev": true
    },
    "node_modules/callsites": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/camelcase": {
      "version": "5.3.1",
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/caniuse-lite": {
      "version": "1.0.30001478",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz",
      "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==",
      "dev": true,
      "funding": [
        {
          "type": "opencollective",
          "url": "https://opencollective.com/browserslist"
        },
        {
          "type": "tidelift",
          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
        },
        {
          "type": "github",
          "url": "https://github.com/sponsors/ai"
        }
      ]
    },
    "node_modules/catharsis": {
      "version": "0.9.0",
      "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
      "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
      "dev": true,
      "dependencies": {
        "lodash": "^4.17.15"
      },
      "engines": {
        "node": ">= 10"
      }
    },
    "node_modules/chalk": {
      "version": "2.4.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^3.2.1",
        "escape-string-regexp": "^1.0.5",
        "supports-color": "^5.3.0"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/char-regex": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
      "dev": true,
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/ci-info": {
      "version": "3.8.0",
      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
      "dev": true,
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/sibiraj-s"
        }
      ],
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/cjs-module-lexer": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
      "dev": true
    },
    "node_modules/cliui": {
      "version": "8.0.1",
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
      "dev": true,
      "dependencies": {
        "string-width": "^4.2.0",
        "strip-ansi": "^6.0.1",
        "wrap-ansi": "^7.0.0"
      },
      "engines": {
        "node": ">=12"
      }
    },
    "node_modules/co": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
      "dev": true,
      "engines": {
        "iojs": ">= 1.0.0",
        "node": ">= 0.12.0"
      }
    },
    "node_modules/collect-v8-coverage": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
      "dev": true
    },
    "node_modules/color-convert": {
      "version": "1.9.3",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
      "dev": true,
      "dependencies": {
        "color-name": "1.1.3"
      }
    },
    "node_modules/color-name": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
      "dev": true
    },
    "node_modules/commander": {
      "version": "10.0.0",
      "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz",
      "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==",
      "dev": true,
      "engines": {
        "node": ">=14"
      }
    },
    "node_modules/concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
      "dev": true
    },
    "node_modules/convert-source-map": {
      "version": "1.9.0",
      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
      "dev": true
    },
    "node_modules/cross-spawn": {
      "version": "7.0.3",
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
      "dev": true,
      "dependencies": {
        "path-key": "^3.1.0",
        "shebang-command": "^2.0.0",
        "which": "^2.0.1"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/debug": {
      "version": "4.3.4",
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
      "dev": true,
      "dependencies": {
        "ms": "2.1.2"
      },
      "engines": {
        "node": ">=6.0"
      },
      "peerDependenciesMeta": {
        "supports-color": {
          "optional": true
        }
      }
    },
    "node_modules/dedent": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
      "dev": true
    },
    "node_modules/deep-is": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
      "dev": true
    },
    "node_modules/deepmerge": {
      "version": "4.3.1",
      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/detect-newline": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/diff-sequences": {
      "version": "29.4.3",
      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
      "dev": true,
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/dir-glob": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
      "dev": true,
      "dependencies": {
        "path-type": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/doctrine": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
      "dev": true,
      "dependencies": {
        "esutils": "^2.0.2"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/duplexer": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
    },
    "node_modules/electron-to-chromium": {
      "version": "1.4.363",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz",
      "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==",
      "dev": true
    },
    "node_modules/emittery": {
      "version": "0.13.1",
      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
      "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
      "dev": true,
      "engines": {
        "node": ">=12"
      },
      "funding": {
        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
      }
    },
    "node_modules/emoji-regex": {
      "version": "8.0.0",
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
      "dev": true
    },
    "node_modules/entities": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
      "dev": true,
      "funding": {
        "url": "https://github.com/fb55/entities?sponsor=1"
      }
    },
    "node_modules/error-ex": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
      "dev": true,
      "dependencies": {
        "is-arrayish": "^0.2.1"
      }
    },
    "node_modules/escalade": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/escape-string-regexp": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
      "dev": true,
      "engines": {
        "node": ">=0.8.0"
      }
    },
    "node_modules/eslint": {
      "version": "8.38.0",
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz",
      "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==",
      "dev": true,
      "dependencies": {
        "@eslint-community/eslint-utils": "^4.2.0",
        "@eslint-community/regexpp": "^4.4.0",
        "@eslint/eslintrc": "^2.0.2",
        "@eslint/js": "8.38.0",
        "@humanwhocodes/config-array": "^0.11.8",
        "@humanwhocodes/module-importer": "^1.0.1",
        "@nodelib/fs.walk": "^1.2.8",
        "ajv": "^6.10.0",
        "chalk": "^4.0.0",
        "cross-spawn": "^7.0.2",
        "debug": "^4.3.2",
        "doctrine": "^3.0.0",
        "escape-string-regexp": "^4.0.0",
        "eslint-scope": "^7.1.1",
        "eslint-visitor-keys": "^3.4.0",
        "espree": "^9.5.1",
        "esquery": "^1.4.2",
        "esutils": "^2.0.2",
        "fast-deep-equal": "^3.1.3",
        "file-entry-cache": "^6.0.1",
        "find-up": "^5.0.0",
        "glob-parent": "^6.0.2",
        "globals": "^13.19.0",
        "grapheme-splitter": "^1.0.4",
        "ignore": "^5.2.0",
        "import-fresh": "^3.0.0",
        "imurmurhash": "^0.1.4",
        "is-glob": "^4.0.0",
        "is-path-inside": "^3.0.3",
        "js-sdsl": "^4.1.4",
        "js-yaml": "^4.1.0",
        "json-stable-stringify-without-jsonify": "^1.0.1",
        "levn": "^0.4.1",
        "lodash.merge": "^4.6.2",
        "minimatch": "^3.1.2",
        "natural-compare": "^1.4.0",
        "optionator": "^0.9.1",
        "strip-ansi": "^6.0.1",
        "strip-json-comments": "^3.1.0",
        "text-table": "^0.2.0"
      },
      "bin": {
        "eslint": "bin/eslint.js"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/eslint-plugin-jest": {
      "version": "27.2.1",
      "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz",
      "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==",
      "dev": true,
      "dependencies": {
        "@typescript-eslint/utils": "^5.10.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "@typescript-eslint/eslint-plugin": "^5.0.0",
        "eslint": "^7.0.0 || ^8.0.0"
      },
      "peerDependenciesMeta": {
        "@typescript-eslint/eslint-plugin": {
          "optional": true
        },
        "jest": {
          "optional": true
        }
      }
    },
    "node_modules/eslint-plugin-sort-keys": {
      "version": "2.3.5",
      "resolved": "https://registry.npmjs.org/eslint-plugin-sort-keys/-/eslint-plugin-sort-keys-2.3.5.tgz",
      "integrity": "sha512-2j/XKQ9sNJwK8kIp/U0EvuF6stS6/8aIc53/NskE4C5NRNh4dt3xzbZyOdrVC11cTH6Zo59/pdzA0Kb+2fQGWg==",
      "dev": true,
      "dependencies": {
        "natural-compare": "1.4.0"
      }
    },
    "node_modules/eslint-scope": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
      "dev": true,
      "dependencies": {
        "esrecurse": "^4.3.0",
        "estraverse": "^4.1.1"
      },
      "engines": {
        "node": ">=8.0.0"
      }
    },
    "node_modules/eslint-visitor-keys": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
      "dev": true,
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/eslint/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/eslint/node_modules/argparse": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
      "dev": true
    },
    "node_modules/eslint/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/eslint/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/eslint/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/eslint/node_modules/escape-string-regexp": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint/node_modules/eslint-scope": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
      "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
      "dev": true,
      "dependencies": {
        "esrecurse": "^4.3.0",
        "estraverse": "^5.2.0"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/eslint/node_modules/eslint-visitor-keys": {
      "version": "3.4.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
      "dev": true,
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/eslint/node_modules/estraverse": {
      "version": "5.3.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
      "dev": true,
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/eslint/node_modules/find-up": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
      "dev": true,
      "dependencies": {
        "locate-path": "^6.0.0",
        "path-exists": "^4.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint/node_modules/globals": {
      "version": "13.20.0",
      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
      "dev": true,
      "dependencies": {
        "type-fest": "^0.20.2"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/eslint/node_modules/js-yaml": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
      "dev": true,
      "dependencies": {
        "argparse": "^2.0.1"
      },
      "bin": {
        "js-yaml": "bin/js-yaml.js"
      }
    },
    "node_modules/eslint/node_modules/locate-path": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
      "dev": true,
      "dependencies": {
        "p-locate": "^5.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint/node_modules/p-locate": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
      "dev": true,
      "dependencies": {
        "p-limit": "^3.0.2"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/eslint/node_modules/type-fest": {
      "version": "0.20.2",
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/espree": {
      "version": "9.5.1",
      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
      "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
      "dev": true,
      "dependencies": {
        "acorn": "^8.8.0",
        "acorn-jsx": "^5.3.2",
        "eslint-visitor-keys": "^3.4.0"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/espree/node_modules/eslint-visitor-keys": {
      "version": "3.4.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
      "dev": true,
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/esprima": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
      "dev": true,
      "bin": {
        "esparse": "bin/esparse.js",
        "esvalidate": "bin/esvalidate.js"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/esquery": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
      "dev": true,
      "dependencies": {
        "estraverse": "^5.1.0"
      },
      "engines": {
        "node": ">=0.10"
      }
    },
    "node_modules/esquery/node_modules/estraverse": {
      "version": "5.3.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
      "dev": true,
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/esrecurse": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
      "dev": true,
      "dependencies": {
        "estraverse": "^5.2.0"
      },
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/esrecurse/node_modules/estraverse": {
      "version": "5.3.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
      "dev": true,
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/estraverse": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
      "dev": true,
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/esutils": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/event-stream": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz",
      "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==",
      "dependencies": {
        "duplexer": "^0.1.1",
        "from": "^0.1.7",
        "map-stream": "0.0.7",
        "pause-stream": "^0.0.11",
        "split": "^1.0.1",
        "stream-combiner": "^0.2.2",
        "through": "^2.3.8"
      }
    },
    "node_modules/execa": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
      "dev": true,
      "dependencies": {
        "cross-spawn": "^7.0.3",
        "get-stream": "^6.0.0",
        "human-signals": "^2.1.0",
        "is-stream": "^2.0.0",
        "merge-stream": "^2.0.0",
        "npm-run-path": "^4.0.1",
        "onetime": "^5.1.2",
        "signal-exit": "^3.0.3",
        "strip-final-newline": "^2.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sindresorhus/execa?sponsor=1"
      }
    },
    "node_modules/exit": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
      "dev": true,
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/expect": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
      "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
      "dev": true,
      "dependencies": {
        "@jest/expect-utils": "^29.5.0",
        "jest-get-type": "^29.4.3",
        "jest-matcher-utils": "^29.5.0",
        "jest-message-util": "^29.5.0",
        "jest-util": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
      "dev": true
    },
    "node_modules/fast-glob": {
      "version": "3.2.12",
      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
      "dev": true,
      "dependencies": {
        "@nodelib/fs.stat": "^2.0.2",
        "@nodelib/fs.walk": "^1.2.3",
        "glob-parent": "^5.1.2",
        "merge2": "^1.3.0",
        "micromatch": "^4.0.4"
      },
      "engines": {
        "node": ">=8.6.0"
      }
    },
    "node_modules/fast-glob/node_modules/glob-parent": {
      "version": "5.1.2",
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
      "dev": true,
      "dependencies": {
        "is-glob": "^4.0.1"
      },
      "engines": {
        "node": ">= 6"
      }
    },
    "node_modules/fast-json-stable-stringify": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
      "dev": true
    },
    "node_modules/fast-levenshtein": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
      "dev": true
    },
    "node_modules/fastq": {
      "version": "1.15.0",
      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
      "dev": true,
      "dependencies": {
        "reusify": "^1.0.4"
      }
    },
    "node_modules/fb-watchman": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
      "dev": true,
      "dependencies": {
        "bser": "2.1.1"
      }
    },
    "node_modules/file-entry-cache": {
      "version": "6.0.1",
      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
      "dev": true,
      "dependencies": {
        "flat-cache": "^3.0.4"
      },
      "engines": {
        "node": "^10.12.0 || >=12.0.0"
      }
    },
    "node_modules/fill-range": {
      "version": "7.0.1",
      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
      "dev": true,
      "dependencies": {
        "to-regex-range": "^5.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/find-up": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
      "dev": true,
      "dependencies": {
        "locate-path": "^5.0.0",
        "path-exists": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/flat-cache": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
      "dev": true,
      "dependencies": {
        "flatted": "^3.1.0",
        "rimraf": "^3.0.2"
      },
      "engines": {
        "node": "^10.12.0 || >=12.0.0"
      }
    },
    "node_modules/flatted": {
      "version": "3.2.7",
      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
      "dev": true
    },
    "node_modules/from": {
      "version": "0.1.7",
      "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
      "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g=="
    },
    "node_modules/fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
      "dev": true
    },
    "node_modules/fsevents": {
      "version": "2.3.2",
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
      "dev": true,
      "hasInstallScript": true,
      "optional": true,
      "os": [
        "darwin"
      ],
      "engines": {
        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
      }
    },
    "node_modules/function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
      "dev": true
    },
    "node_modules/gensync": {
      "version": "1.0.0-beta.2",
      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
      "dev": true,
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/get-caller-file": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
      "dev": true,
      "engines": {
        "node": "6.* || 8.* || >= 10.*"
      }
    },
    "node_modules/get-package-type": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
      "dev": true,
      "engines": {
        "node": ">=8.0.0"
      }
    },
    "node_modules/get-stream": {
      "version": "6.0.1",
      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/glob": {
      "version": "7.2.3",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
      "dev": true,
      "dependencies": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^3.1.1",
        "once": "^1.3.0",
        "path-is-absolute": "^1.0.0"
      },
      "engines": {
        "node": "*"
      },
      "funding": {
        "url": "https://github.com/sponsors/isaacs"
      }
    },
    "node_modules/glob-parent": {
      "version": "6.0.2",
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
      "dev": true,
      "dependencies": {
        "is-glob": "^4.0.3"
      },
      "engines": {
        "node": ">=10.13.0"
      }
    },
    "node_modules/globals": {
      "version": "11.12.0",
      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
      "dev": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/globby": {
      "version": "11.1.0",
      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
      "dev": true,
      "dependencies": {
        "array-union": "^2.1.0",
        "dir-glob": "^3.0.1",
        "fast-glob": "^3.2.9",
        "ignore": "^5.2.0",
        "merge2": "^1.4.1",
        "slash": "^3.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/graceful-fs": {
      "version": "4.2.11",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
      "dev": true
    },
    "node_modules/grapheme-splitter": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
      "dev": true
    },
    "node_modules/handlebars": {
      "version": "4.7.7",
      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
      "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
      "dev": true,
      "dependencies": {
        "minimist": "^1.2.5",
        "neo-async": "^2.6.0",
        "source-map": "^0.6.1",
        "wordwrap": "^1.0.0"
      },
      "bin": {
        "handlebars": "bin/handlebars"
      },
      "engines": {
        "node": ">=0.4.7"
      },
      "optionalDependencies": {
        "uglify-js": "^3.1.4"
      }
    },
    "node_modules/has": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
      "dev": true,
      "dependencies": {
        "function-bind": "^1.1.1"
      },
      "engines": {
        "node": ">= 0.4.0"
      }
    },
    "node_modules/has-flag": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
      "dev": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/html-escaper": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
      "dev": true
    },
    "node_modules/human-signals": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
      "dev": true,
      "engines": {
        "node": ">=10.17.0"
      }
    },
    "node_modules/ignore": {
      "version": "5.2.4",
      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
      "dev": true,
      "engines": {
        "node": ">= 4"
      }
    },
    "node_modules/import-fresh": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
      "dev": true,
      "dependencies": {
        "parent-module": "^1.0.0",
        "resolve-from": "^4.0.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/import-fresh/node_modules/resolve-from": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
      "dev": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/import-local": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
      "dev": true,
      "dependencies": {
        "pkg-dir": "^4.2.0",
        "resolve-cwd": "^3.0.0"
      },
      "bin": {
        "import-local-fixture": "fixtures/cli.js"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/imurmurhash": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
      "dev": true,
      "engines": {
        "node": ">=0.8.19"
      }
    },
    "node_modules/inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
      "dev": true,
      "dependencies": {
        "once": "^1.3.0",
        "wrappy": "1"
      }
    },
    "node_modules/inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
      "dev": true
    },
    "node_modules/is-arrayish": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
      "dev": true
    },
    "node_modules/is-core-module": {
      "version": "2.12.0",
      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz",
      "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==",
      "dev": true,
      "dependencies": {
        "has": "^1.0.3"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/is-extglob": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/is-fullwidth-code-point": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/is-generator-fn": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/is-glob": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
      "dev": true,
      "dependencies": {
        "is-extglob": "^2.1.1"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/is-number": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
      "dev": true,
      "engines": {
        "node": ">=0.12.0"
      }
    },
    "node_modules/is-path-inside": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/is-stream": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
      "dev": true,
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
      "dev": true
    },
    "node_modules/istanbul-lib-coverage": {
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/istanbul-lib-instrument": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
      "dev": true,
      "dependencies": {
        "@babel/core": "^7.12.3",
        "@babel/parser": "^7.14.7",
        "@istanbuljs/schema": "^0.1.2",
        "istanbul-lib-coverage": "^3.2.0",
        "semver": "^6.3.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/istanbul-lib-report": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
      "dev": true,
      "dependencies": {
        "istanbul-lib-coverage": "^3.0.0",
        "make-dir": "^3.0.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/istanbul-lib-report/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/istanbul-lib-report/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/istanbul-lib-source-maps": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
      "dev": true,
      "dependencies": {
        "debug": "^4.1.1",
        "istanbul-lib-coverage": "^3.0.0",
        "source-map": "^0.6.1"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/istanbul-reports": {
      "version": "3.1.5",
      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
      "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
      "dev": true,
      "dependencies": {
        "html-escaper": "^2.0.0",
        "istanbul-lib-report": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
      "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
      "dev": true,
      "dependencies": {
        "@jest/core": "^29.5.0",
        "@jest/types": "^29.5.0",
        "import-local": "^3.0.2",
        "jest-cli": "^29.5.0"
      },
      "bin": {
        "jest": "bin/jest.js"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
      },
      "peerDependenciesMeta": {
        "node-notifier": {
          "optional": true
        }
      }
    },
    "node_modules/jest-changed-files": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
      "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
      "dev": true,
      "dependencies": {
        "execa": "^5.0.0",
        "p-limit": "^3.1.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-circus": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
      "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
      "dev": true,
      "dependencies": {
        "@jest/environment": "^29.5.0",
        "@jest/expect": "^29.5.0",
        "@jest/test-result": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "chalk": "^4.0.0",
        "co": "^4.6.0",
        "dedent": "^0.7.0",
        "is-generator-fn": "^2.0.0",
        "jest-each": "^29.5.0",
        "jest-matcher-utils": "^29.5.0",
        "jest-message-util": "^29.5.0",
        "jest-runtime": "^29.5.0",
        "jest-snapshot": "^29.5.0",
        "jest-util": "^29.5.0",
        "p-limit": "^3.1.0",
        "pretty-format": "^29.5.0",
        "pure-rand": "^6.0.0",
        "slash": "^3.0.0",
        "stack-utils": "^2.0.3"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-circus/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-circus/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-circus/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-circus/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-circus/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-circus/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-cli": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
      "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
      "dev": true,
      "dependencies": {
        "@jest/core": "^29.5.0",
        "@jest/test-result": "^29.5.0",
        "@jest/types": "^29.5.0",
        "chalk": "^4.0.0",
        "exit": "^0.1.2",
        "graceful-fs": "^4.2.9",
        "import-local": "^3.0.2",
        "jest-config": "^29.5.0",
        "jest-util": "^29.5.0",
        "jest-validate": "^29.5.0",
        "prompts": "^2.0.1",
        "yargs": "^17.3.1"
      },
      "bin": {
        "jest": "bin/jest.js"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
      },
      "peerDependenciesMeta": {
        "node-notifier": {
          "optional": true
        }
      }
    },
    "node_modules/jest-cli/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-cli/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-cli/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-cli/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-cli/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-cli/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-config": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
      "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
      "dev": true,
      "dependencies": {
        "@babel/core": "^7.11.6",
        "@jest/test-sequencer": "^29.5.0",
        "@jest/types": "^29.5.0",
        "babel-jest": "^29.5.0",
        "chalk": "^4.0.0",
        "ci-info": "^3.2.0",
        "deepmerge": "^4.2.2",
        "glob": "^7.1.3",
        "graceful-fs": "^4.2.9",
        "jest-circus": "^29.5.0",
        "jest-environment-node": "^29.5.0",
        "jest-get-type": "^29.4.3",
        "jest-regex-util": "^29.4.3",
        "jest-resolve": "^29.5.0",
        "jest-runner": "^29.5.0",
        "jest-util": "^29.5.0",
        "jest-validate": "^29.5.0",
        "micromatch": "^4.0.4",
        "parse-json": "^5.2.0",
        "pretty-format": "^29.5.0",
        "slash": "^3.0.0",
        "strip-json-comments": "^3.1.1"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "peerDependencies": {
        "@types/node": "*",
        "ts-node": ">=9.0.0"
      },
      "peerDependenciesMeta": {
        "@types/node": {
          "optional": true
        },
        "ts-node": {
          "optional": true
        }
      }
    },
    "node_modules/jest-config/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-config/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-config/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-config/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-config/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-config/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-diff": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
      "dev": true,
      "dependencies": {
        "chalk": "^4.0.0",
        "diff-sequences": "^29.4.3",
        "jest-get-type": "^29.4.3",
        "pretty-format": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-diff/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-diff/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-diff/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-diff/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-diff/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-diff/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-docblock": {
      "version": "29.4.3",
      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
      "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
      "dev": true,
      "dependencies": {
        "detect-newline": "^3.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-each": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
      "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "chalk": "^4.0.0",
        "jest-get-type": "^29.4.3",
        "jest-util": "^29.5.0",
        "pretty-format": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-each/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-each/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-each/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-each/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-each/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-each/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-environment-node": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
      "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
      "dev": true,
      "dependencies": {
        "@jest/environment": "^29.5.0",
        "@jest/fake-timers": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "jest-mock": "^29.5.0",
        "jest-util": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-get-type": {
      "version": "29.4.3",
      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
      "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
      "dev": true,
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-haste-map": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
      "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "@types/graceful-fs": "^4.1.3",
        "@types/node": "*",
        "anymatch": "^3.0.3",
        "fb-watchman": "^2.0.0",
        "graceful-fs": "^4.2.9",
        "jest-regex-util": "^29.4.3",
        "jest-util": "^29.5.0",
        "jest-worker": "^29.5.0",
        "micromatch": "^4.0.4",
        "walker": "^1.0.8"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      },
      "optionalDependencies": {
        "fsevents": "^2.3.2"
      }
    },
    "node_modules/jest-leak-detector": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
      "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
      "dev": true,
      "dependencies": {
        "jest-get-type": "^29.4.3",
        "pretty-format": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-matcher-utils": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
      "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
      "dev": true,
      "dependencies": {
        "chalk": "^4.0.0",
        "jest-diff": "^29.5.0",
        "jest-get-type": "^29.4.3",
        "pretty-format": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-matcher-utils/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-matcher-utils/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-matcher-utils/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-matcher-utils/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-matcher-utils/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-message-util": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
      "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
      "dev": true,
      "dependencies": {
        "@babel/code-frame": "^7.12.13",
        "@jest/types": "^29.5.0",
        "@types/stack-utils": "^2.0.0",
        "chalk": "^4.0.0",
        "graceful-fs": "^4.2.9",
        "micromatch": "^4.0.4",
        "pretty-format": "^29.5.0",
        "slash": "^3.0.0",
        "stack-utils": "^2.0.3"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-message-util/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-message-util/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-message-util/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-message-util/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-message-util/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-message-util/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-mock": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
      "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "jest-util": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-pnp-resolver": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
      "dev": true,
      "engines": {
        "node": ">=6"
      },
      "peerDependencies": {
        "jest-resolve": "*"
      },
      "peerDependenciesMeta": {
        "jest-resolve": {
          "optional": true
        }
      }
    },
    "node_modules/jest-regex-util": {
      "version": "29.4.3",
      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
      "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
      "dev": true,
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-resolve": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
      "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
      "dev": true,
      "dependencies": {
        "chalk": "^4.0.0",
        "graceful-fs": "^4.2.9",
        "jest-haste-map": "^29.5.0",
        "jest-pnp-resolver": "^1.2.2",
        "jest-util": "^29.5.0",
        "jest-validate": "^29.5.0",
        "resolve": "^1.20.0",
        "resolve.exports": "^2.0.0",
        "slash": "^3.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-resolve-dependencies": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
      "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
      "dev": true,
      "dependencies": {
        "jest-regex-util": "^29.4.3",
        "jest-snapshot": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-resolve/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-resolve/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-resolve/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-resolve/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-resolve/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-resolve/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-runner": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
      "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
      "dev": true,
      "dependencies": {
        "@jest/console": "^29.5.0",
        "@jest/environment": "^29.5.0",
        "@jest/test-result": "^29.5.0",
        "@jest/transform": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "chalk": "^4.0.0",
        "emittery": "^0.13.1",
        "graceful-fs": "^4.2.9",
        "jest-docblock": "^29.4.3",
        "jest-environment-node": "^29.5.0",
        "jest-haste-map": "^29.5.0",
        "jest-leak-detector": "^29.5.0",
        "jest-message-util": "^29.5.0",
        "jest-resolve": "^29.5.0",
        "jest-runtime": "^29.5.0",
        "jest-util": "^29.5.0",
        "jest-watcher": "^29.5.0",
        "jest-worker": "^29.5.0",
        "p-limit": "^3.1.0",
        "source-map-support": "0.5.13"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-runner/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-runner/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-runner/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-runner/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-runner/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-runner/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-runtime": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
      "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
      "dev": true,
      "dependencies": {
        "@jest/environment": "^29.5.0",
        "@jest/fake-timers": "^29.5.0",
        "@jest/globals": "^29.5.0",
        "@jest/source-map": "^29.4.3",
        "@jest/test-result": "^29.5.0",
        "@jest/transform": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "chalk": "^4.0.0",
        "cjs-module-lexer": "^1.0.0",
        "collect-v8-coverage": "^1.0.0",
        "glob": "^7.1.3",
        "graceful-fs": "^4.2.9",
        "jest-haste-map": "^29.5.0",
        "jest-message-util": "^29.5.0",
        "jest-mock": "^29.5.0",
        "jest-regex-util": "^29.4.3",
        "jest-resolve": "^29.5.0",
        "jest-snapshot": "^29.5.0",
        "jest-util": "^29.5.0",
        "slash": "^3.0.0",
        "strip-bom": "^4.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-runtime/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-runtime/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-runtime/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-runtime/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-runtime/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-runtime/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-snapshot": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
      "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
      "dev": true,
      "dependencies": {
        "@babel/core": "^7.11.6",
        "@babel/generator": "^7.7.2",
        "@babel/plugin-syntax-jsx": "^7.7.2",
        "@babel/plugin-syntax-typescript": "^7.7.2",
        "@babel/traverse": "^7.7.2",
        "@babel/types": "^7.3.3",
        "@jest/expect-utils": "^29.5.0",
        "@jest/transform": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/babel__traverse": "^7.0.6",
        "@types/prettier": "^2.1.5",
        "babel-preset-current-node-syntax": "^1.0.0",
        "chalk": "^4.0.0",
        "expect": "^29.5.0",
        "graceful-fs": "^4.2.9",
        "jest-diff": "^29.5.0",
        "jest-get-type": "^29.4.3",
        "jest-matcher-utils": "^29.5.0",
        "jest-message-util": "^29.5.0",
        "jest-util": "^29.5.0",
        "natural-compare": "^1.4.0",
        "pretty-format": "^29.5.0",
        "semver": "^7.3.5"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-snapshot/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-snapshot/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-snapshot/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-snapshot/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-snapshot/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-snapshot/node_modules/lru-cache": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
      "dev": true,
      "dependencies": {
        "yallist": "^4.0.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/jest-snapshot/node_modules/semver": {
      "version": "7.4.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz",
      "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==",
      "dev": true,
      "dependencies": {
        "lru-cache": "^6.0.0"
      },
      "bin": {
        "semver": "bin/semver.js"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/jest-snapshot/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-snapshot/node_modules/yallist": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
    },
    "node_modules/jest-util": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
      "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "chalk": "^4.0.0",
        "ci-info": "^3.2.0",
        "graceful-fs": "^4.2.9",
        "picomatch": "^2.2.3"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-util/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-util/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-util/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-util/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-util/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-util/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-validate": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
      "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
      "dev": true,
      "dependencies": {
        "@jest/types": "^29.5.0",
        "camelcase": "^6.2.0",
        "chalk": "^4.0.0",
        "jest-get-type": "^29.4.3",
        "leven": "^3.1.0",
        "pretty-format": "^29.5.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-validate/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-validate/node_modules/camelcase": {
      "version": "6.3.0",
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/jest-validate/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-validate/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-validate/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-validate/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-validate/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-watcher": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
      "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
      "dev": true,
      "dependencies": {
        "@jest/test-result": "^29.5.0",
        "@jest/types": "^29.5.0",
        "@types/node": "*",
        "ansi-escapes": "^4.2.1",
        "chalk": "^4.0.0",
        "emittery": "^0.13.1",
        "jest-util": "^29.5.0",
        "string-length": "^4.0.1"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-watcher/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/jest-watcher/node_modules/chalk": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/jest-watcher/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/jest-watcher/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/jest-watcher/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-watcher/node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-worker": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
      "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
      "dev": true,
      "dependencies": {
        "@types/node": "*",
        "jest-util": "^29.5.0",
        "merge-stream": "^2.0.0",
        "supports-color": "^8.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/jest-worker/node_modules/has-flag": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jest-worker/node_modules/supports-color": {
      "version": "8.1.1",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/supports-color?sponsor=1"
      }
    },
    "node_modules/js-sdsl": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz",
      "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==",
      "dev": true,
      "funding": {
        "type": "opencollective",
        "url": "https://opencollective.com/js-sdsl"
      }
    },
    "node_modules/js-tokens": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
      "dev": true
    },
    "node_modules/js-yaml": {
      "version": "3.14.1",
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
      "dev": true,
      "dependencies": {
        "argparse": "^1.0.7",
        "esprima": "^4.0.0"
      },
      "bin": {
        "js-yaml": "bin/js-yaml.js"
      }
    },
    "node_modules/js2xmlparser": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
      "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
      "dev": true,
      "dependencies": {
        "xmlcreate": "^2.0.4"
      }
    },
    "node_modules/jsdoc": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
      "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
      "dev": true,
      "dependencies": {
        "@babel/parser": "^7.20.15",
        "@jsdoc/salty": "^0.2.1",
        "@types/markdown-it": "^12.2.3",
        "bluebird": "^3.7.2",
        "catharsis": "^0.9.0",
        "escape-string-regexp": "^2.0.0",
        "js2xmlparser": "^4.0.2",
        "klaw": "^3.0.0",
        "markdown-it": "^12.3.2",
        "markdown-it-anchor": "^8.4.1",
        "marked": "^4.0.10",
        "mkdirp": "^1.0.4",
        "requizzle": "^0.2.3",
        "strip-json-comments": "^3.1.0",
        "underscore": "~1.13.2"
      },
      "bin": {
        "jsdoc": "jsdoc.js"
      },
      "engines": {
        "node": ">=12.0.0"
      }
    },
    "node_modules/jsdoc/node_modules/escape-string-regexp": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jsesc": {
      "version": "2.5.2",
      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
      "dev": true,
      "bin": {
        "jsesc": "bin/jsesc"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/json-parse-even-better-errors": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
      "dev": true
    },
    "node_modules/json-schema-traverse": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
      "dev": true
    },
    "node_modules/json-stable-stringify-without-jsonify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
      "dev": true
    },
    "node_modules/json5": {
      "version": "2.2.3",
      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
      "dev": true,
      "bin": {
        "json5": "lib/cli.js"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/klaw": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
      "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
      "dev": true,
      "dependencies": {
        "graceful-fs": "^4.1.9"
      }
    },
    "node_modules/kleur": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/leven": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/levn": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
      "dev": true,
      "dependencies": {
        "prelude-ls": "^1.2.1",
        "type-check": "~0.4.0"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/lines-and-columns": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
      "dev": true
    },
    "node_modules/linkify-it": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
      "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
      "dev": true,
      "dependencies": {
        "uc.micro": "^1.0.1"
      }
    },
    "node_modules/locate-path": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
      "dev": true,
      "dependencies": {
        "p-locate": "^4.1.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
      "dev": true
    },
    "node_modules/lodash.merge": {
      "version": "4.6.2",
      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
      "dev": true
    },
    "node_modules/long": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
      "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
    },
    "node_modules/lru-cache": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
      "dev": true,
      "dependencies": {
        "yallist": "^3.0.2"
      }
    },
    "node_modules/make-dir": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
      "dev": true,
      "dependencies": {
        "semver": "^6.0.0"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/makeerror": {
      "version": "1.0.12",
      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
      "dev": true,
      "dependencies": {
        "tmpl": "1.0.5"
      }
    },
    "node_modules/map-stream": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
      "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ=="
    },
    "node_modules/markdown-it": {
      "version": "12.3.2",
      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
      "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
      "dev": true,
      "dependencies": {
        "argparse": "^2.0.1",
        "entities": "~2.1.0",
        "linkify-it": "^3.0.1",
        "mdurl": "^1.0.1",
        "uc.micro": "^1.0.5"
      },
      "bin": {
        "markdown-it": "bin/markdown-it.js"
      }
    },
    "node_modules/markdown-it-anchor": {
      "version": "8.6.7",
      "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
      "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
      "dev": true,
      "peerDependencies": {
        "@types/markdown-it": "*",
        "markdown-it": "*"
      }
    },
    "node_modules/markdown-it/node_modules/argparse": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
      "dev": true
    },
    "node_modules/marked": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
      "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
      "dev": true,
      "bin": {
        "marked": "bin/marked.js"
      },
      "engines": {
        "node": ">= 12"
      }
    },
    "node_modules/mdurl": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
      "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
      "dev": true
    },
    "node_modules/merge-stream": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
      "dev": true
    },
    "node_modules/merge2": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
      "dev": true,
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/micromatch": {
      "version": "4.0.5",
      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
      "dev": true,
      "dependencies": {
        "braces": "^3.0.2",
        "picomatch": "^2.3.1"
      },
      "engines": {
        "node": ">=8.6"
      }
    },
    "node_modules/mimic-fn": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/minimatch": {
      "version": "3.1.2",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
      "dev": true,
      "dependencies": {
        "brace-expansion": "^1.1.7"
      },
      "engines": {
        "node": "*"
      }
    },
    "node_modules/minimist": {
      "version": "1.2.8",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
      "dev": true,
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/mkdirp": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
      "dev": true,
      "bin": {
        "mkdirp": "bin/cmd.js"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/ms": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
      "dev": true
    },
    "node_modules/natural-compare": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
      "dev": true
    },
    "node_modules/neo-async": {
      "version": "2.6.2",
      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
      "dev": true
    },
    "node_modules/node-int64": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
      "dev": true
    },
    "node_modules/node-releases": {
      "version": "2.0.10",
      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
      "dev": true
    },
    "node_modules/normalize-path": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/npm-run-path": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
      "dev": true,
      "dependencies": {
        "path-key": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
      "dev": true,
      "dependencies": {
        "wrappy": "1"
      }
    },
    "node_modules/onetime": {
      "version": "5.1.2",
      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
      "dev": true,
      "dependencies": {
        "mimic-fn": "^2.1.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/optionator": {
      "version": "0.9.1",
      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
      "dev": true,
      "dependencies": {
        "deep-is": "^0.1.3",
        "fast-levenshtein": "^2.0.6",
        "levn": "^0.4.1",
        "prelude-ls": "^1.2.1",
        "type-check": "^0.4.0",
        "word-wrap": "^1.2.3"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/p-limit": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
      "dev": true,
      "dependencies": {
        "yocto-queue": "^0.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/p-locate": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
      "dev": true,
      "dependencies": {
        "p-limit": "^2.2.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/p-locate/node_modules/p-limit": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
      "dev": true,
      "dependencies": {
        "p-try": "^2.0.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/p-try": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/parent-module": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
      "dev": true,
      "dependencies": {
        "callsites": "^3.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/parse-json": {
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
      "dev": true,
      "dependencies": {
        "@babel/code-frame": "^7.0.0",
        "error-ex": "^1.3.1",
        "json-parse-even-better-errors": "^2.3.0",
        "lines-and-columns": "^1.1.6"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/path-exists": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/path-key": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/path-parse": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
      "dev": true
    },
    "node_modules/path-type": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/pause-stream": {
      "version": "0.0.11",
      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
      "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
      "dependencies": {
        "through": "~2.3"
      }
    },
    "node_modules/picocolors": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
      "dev": true
    },
    "node_modules/picomatch": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
      "dev": true,
      "engines": {
        "node": ">=8.6"
      },
      "funding": {
        "url": "https://github.com/sponsors/jonschlinkert"
      }
    },
    "node_modules/pirates": {
      "version": "4.0.5",
      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
      "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
      "dev": true,
      "engines": {
        "node": ">= 6"
      }
    },
    "node_modules/pkg-dir": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
      "dev": true,
      "dependencies": {
        "find-up": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/prelude-ls": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
      "dev": true,
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/pretty-format": {
      "version": "29.5.0",
      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
      "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
      "dev": true,
      "dependencies": {
        "@jest/schemas": "^29.4.3",
        "ansi-styles": "^5.0.0",
        "react-is": "^18.0.0"
      },
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/pretty-format/node_modules/ansi-styles": {
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/prompts": {
      "version": "2.4.2",
      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
      "dev": true,
      "dependencies": {
        "kleur": "^3.0.3",
        "sisteransi": "^1.0.5"
      },
      "engines": {
        "node": ">= 6"
      }
    },
    "node_modules/punycode": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/pure-rand": {
      "version": "6.0.1",
      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
      "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
      "dev": true,
      "funding": [
        {
          "type": "individual",
          "url": "https://github.com/sponsors/dubzzz"
        },
        {
          "type": "opencollective",
          "url": "https://opencollective.com/fast-check"
        }
      ]
    },
    "node_modules/queue-microtask": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
      "dev": true,
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ]
    },
    "node_modules/react-is": {
      "version": "18.2.0",
      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
      "dev": true
    },
    "node_modules/require-directory": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/requizzle": {
      "version": "0.2.4",
      "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
      "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
      "dev": true,
      "dependencies": {
        "lodash": "^4.17.21"
      }
    },
    "node_modules/resolve": {
      "version": "1.22.2",
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
      "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
      "dev": true,
      "dependencies": {
        "is-core-module": "^2.11.0",
        "path-parse": "^1.0.7",
        "supports-preserve-symlinks-flag": "^1.0.0"
      },
      "bin": {
        "resolve": "bin/resolve"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/resolve-cwd": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
      "dev": true,
      "dependencies": {
        "resolve-from": "^5.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/resolve-from": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/resolve.exports": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
      "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
      "dev": true,
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/reusify": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
      "dev": true,
      "engines": {
        "iojs": ">=1.0.0",
        "node": ">=0.10.0"
      }
    },
    "node_modules/rimraf": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
      "dev": true,
      "dependencies": {
        "glob": "^7.1.3"
      },
      "bin": {
        "rimraf": "bin.js"
      },
      "funding": {
        "url": "https://github.com/sponsors/isaacs"
      }
    },
    "node_modules/run-parallel": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
      "dev": true,
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ],
      "dependencies": {
        "queue-microtask": "^1.2.2"
      }
    },
    "node_modules/safe-buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ]
    },
    "node_modules/sax": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
    },
    "node_modules/semver": {
      "version": "6.3.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
      "dev": true,
      "bin": {
        "semver": "bin/semver.js"
      }
    },
    "node_modules/shebang-command": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
      "dev": true,
      "dependencies": {
        "shebang-regex": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/shebang-regex": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/signal-exit": {
      "version": "3.0.7",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
      "dev": true
    },
    "node_modules/sisteransi": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
      "dev": true
    },
    "node_modules/slash": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/source-map": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/source-map-support": {
      "version": "0.5.13",
      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
      "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
      "dev": true,
      "dependencies": {
        "buffer-from": "^1.0.0",
        "source-map": "^0.6.0"
      }
    },
    "node_modules/split": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
      "dependencies": {
        "through": "2"
      },
      "engines": {
        "node": "*"
      }
    },
    "node_modules/sprintf-js": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
      "dev": true
    },
    "node_modules/stack-utils": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
      "dev": true,
      "dependencies": {
        "escape-string-regexp": "^2.0.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/stack-utils/node_modules/escape-string-regexp": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/stream-combiner": {
      "version": "0.2.2",
      "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
      "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
      "dependencies": {
        "duplexer": "~0.1.1",
        "through": "~2.3.4"
      }
    },
    "node_modules/string-length": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
      "dev": true,
      "dependencies": {
        "char-regex": "^1.0.2",
        "strip-ansi": "^6.0.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/string-width": {
      "version": "4.2.3",
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
      "dev": true,
      "dependencies": {
        "emoji-regex": "^8.0.0",
        "is-fullwidth-code-point": "^3.0.0",
        "strip-ansi": "^6.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/strip-ansi": {
      "version": "6.0.1",
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
      "dev": true,
      "dependencies": {
        "ansi-regex": "^5.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/strip-bom": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/strip-final-newline": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/strip-json-comments": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
      "dev": true,
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/supports-color": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
      "dev": true,
      "dependencies": {
        "has-flag": "^3.0.0"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/supports-preserve-symlinks-flag": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
      "dev": true,
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/test-exclude": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
      "dev": true,
      "dependencies": {
        "@istanbuljs/schema": "^0.1.2",
        "glob": "^7.1.4",
        "minimatch": "^3.0.4"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/text-table": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
      "dev": true
    },
    "node_modules/through": {
      "version": "2.3.8",
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
    },
    "node_modules/tmpl": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
      "dev": true
    },
    "node_modules/to-fast-properties": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
      "dev": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/to-regex-range": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
      "dev": true,
      "dependencies": {
        "is-number": "^7.0.0"
      },
      "engines": {
        "node": ">=8.0"
      }
    },
    "node_modules/tslib": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
      "dev": true
    },
    "node_modules/tsutils": {
      "version": "3.21.0",
      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
      "dev": true,
      "dependencies": {
        "tslib": "^1.8.1"
      },
      "engines": {
        "node": ">= 6"
      },
      "peerDependencies": {
        "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
      }
    },
    "node_modules/type-check": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
      "dev": true,
      "dependencies": {
        "prelude-ls": "^1.2.1"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/type-detect": {
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
      "dev": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/type-fest": {
      "version": "0.21.3",
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/typescript": {
      "version": "5.0.4",
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
      "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
      "dev": true,
      "peer": true,
      "bin": {
        "tsc": "bin/tsc",
        "tsserver": "bin/tsserver"
      },
      "engines": {
        "node": ">=12.20"
      }
    },
    "node_modules/uc.micro": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
      "dev": true
    },
    "node_modules/uglify-js": {
      "version": "3.17.4",
      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
      "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
      "dev": true,
      "optional": true,
      "bin": {
        "uglifyjs": "bin/uglifyjs"
      },
      "engines": {
        "node": ">=0.8.0"
      }
    },
    "node_modules/underscore": {
      "version": "1.13.6",
      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
      "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
      "dev": true
    },
    "node_modules/update-browserslist-db": {
      "version": "1.0.10",
      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
      "dev": true,
      "funding": [
        {
          "type": "opencollective",
          "url": "https://opencollective.com/browserslist"
        },
        {
          "type": "tidelift",
          "url": "https://tidelift.com/funding/github/npm/browserslist"
        }
      ],
      "dependencies": {
        "escalade": "^3.1.1",
        "picocolors": "^1.0.0"
      },
      "bin": {
        "browserslist-lint": "cli.js"
      },
      "peerDependencies": {
        "browserslist": ">= 4.21.0"
      }
    },
    "node_modules/uri-js": {
      "version": "4.4.1",
      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
      "dev": true,
      "dependencies": {
        "punycode": "^2.1.0"
      }
    },
    "node_modules/v8-to-istanbul": {
      "version": "9.1.0",
      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
      "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
      "dev": true,
      "dependencies": {
        "@jridgewell/trace-mapping": "^0.3.12",
        "@types/istanbul-lib-coverage": "^2.0.1",
        "convert-source-map": "^1.6.0"
      },
      "engines": {
        "node": ">=10.12.0"
      }
    },
    "node_modules/walker": {
      "version": "1.0.8",
      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
      "dev": true,
      "dependencies": {
        "makeerror": "1.0.12"
      }
    },
    "node_modules/which": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
      "dev": true,
      "dependencies": {
        "isexe": "^2.0.0"
      },
      "bin": {
        "node-which": "bin/node-which"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/word-wrap": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/wordwrap": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
      "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
      "dev": true
    },
    "node_modules/wrap-ansi": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^4.0.0",
        "string-width": "^4.1.0",
        "strip-ansi": "^6.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
      }
    },
    "node_modules/wrap-ansi/node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dev": true,
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/wrap-ansi/node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dev": true,
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/wrap-ansi/node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
      "dev": true
    },
    "node_modules/wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
      "dev": true
    },
    "node_modules/write-file-atomic": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
      "dev": true,
      "dependencies": {
        "imurmurhash": "^0.1.4",
        "signal-exit": "^3.0.7"
      },
      "engines": {
        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
      }
    },
    "node_modules/xml2js": {
      "version": "0.5.0",
      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
      "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
      "dependencies": {
        "sax": ">=0.6.0",
        "xmlbuilder": "~11.0.0"
      },
      "engines": {
        "node": ">=4.0.0"
      }
    },
    "node_modules/xmlbuilder": {
      "version": "11.0.1",
      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/xmlcreate": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
      "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
      "dev": true
    },
    "node_modules/y18n": {
      "version": "5.0.8",
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
      "dev": true,
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/yallist": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
      "dev": true
    },
    "node_modules/yargs": {
      "version": "17.7.1",
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
      "dev": true,
      "dependencies": {
        "cliui": "^8.0.1",
        "escalade": "^3.1.1",
        "get-caller-file": "^2.0.5",
        "require-directory": "^2.1.1",
        "string-width": "^4.2.3",
        "y18n": "^5.0.5",
        "yargs-parser": "^21.1.1"
      },
      "engines": {
        "node": ">=12"
      }
    },
    "node_modules/yargs-parser": {
      "version": "21.1.1",
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
      "dev": true,
      "engines": {
        "node": ">=12"
      }
    },
    "node_modules/yocto-queue": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
      "dev": true,
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    }
  }
}
07070100000031000081A4000000000000000000000001643934E900000744000000000000000000000000000000000000002900000000dbus-final-0.0.0+git3e43f60/package.json{
  "name": "dbus-final",
  "version": "0.0.0-dev",
  "keywords": [
    "dbus",
    "dcop",
    "d-bus",
    "rpc",
    "gnome",
    "kde"
  ],
  "description": "The (hopefully_ final DBus library you will install for Node.js",
  "files": [
    "lib/*",
    "index.js",
    "package.json",
    "types.d.ts"
  ],
  "directories": {
    "lib": "lib",
    "test": "test",
    "examples": "examples"
  },
  "main": "index.js",
  "types": "types.d.ts",
  "license": "MIT",
  "repository": "http://github.com/Jelmerro/node-dbus-final.git",
  "dependencies": {
    "@nornagon/put": "0.0.8",
    "event-stream": "4.0.1",
    "long": "5.2.1",
    "safe-buffer": "5.2.1",
    "xml2js": "0.5.0"
  },
  "devDependencies": {
    "@babel/core": "7.21.4",
    "@babel/eslint-parser": "7.21.3",
    "@babel/plugin-proposal-class-properties": "7.18.6",
    "@babel/plugin-proposal-decorators": "7.21.0",
    "@babel/plugin-syntax-bigint": "7.8.3",
    "@babel/plugin-transform-async-to-generator": "7.20.7",
    "babel-jest": "29.5.0",
    "commander": "10.0.0",
    "eslint": "8.38.0",
    "eslint-plugin-jest": "27.2.1",
    "eslint-plugin-sort-keys": "2.3.5",
    "handlebars": "4.7.7",
    "jest": "29.5.0",
    "jsdoc": "4.0.2"
  },
  "scripts": {
    "integration": "dbus-run-session -- jest ./test/integration",
    "coverage": "dbus-run-session -- jest --coverage",
    "unit": "jest ./test/*.test.js",
    "test": "dbus-run-session -- jest",
    "doc": "jsdoc --verbose -c jsdoc.conf --readme README.md -r lib index.js -d doc",
    "fix": "eslint --parser @babel/eslint-parser lib/ test/ --fix",
    "lint": "eslint --parser @babel/eslint-parser lib/ test/"
  },
  "jest": {
    "testEnvironment": "node",
    "bail": true
  },
  "standard": {
    "parser": "@babel/eslint-parser",
    "globals": [
      "BigInt"
    ]
  },
  "engine": {
    "node": ">=10.8.0"
  }
}
07070100000032000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002600000000dbus-final-0.0.0+git3e43f60/templates07070100000033000081A4000000000000000000000001643934E900001025000000000000000000000000000000000000003E00000000dbus-final-0.0.0+git3e43f60/templates/javascript-class.js.hbsconst DBus = require('dbus-final');
const { EventEmitter } = require('events');

/*
 * Generated by dbus-final interface generator
 * Template: javascript-class.js.hbs
 */

{{#if xmlData}}
// Introspection XML of {{serviceName}} at {{objectPath}}
const XMLObjectData = `{{xmlData}}`;
{{/if}}

{{#each interfaces}}
/**
 * Service: {{../serviceName}}
 * ObjectPath: {{../objectPath}}
 * Interface: {{$.name}}
 */
export class {{className $.name}} extends EventEmitter {

    static Connect(bus, objectPath, xml) { {{#if ../xmlData}}
        if(!objectPath) { objectPath = "{{../objectPath}}"; }
        if(!xml) { xml = XMLObjectData; }{{/if}}
        return bus.getProxyObject('{{../serviceName}}', objectPath, xml).then((obj) => new {{className $.name}}(obj));
    }

    constructor(dbusObject) {
        super();
        this.dbusInterfaceName = '{{$.name}}';
        this.dbusObject = dbusObject;
        this.thisDBusInterface = dbusObject.getInterface('{{$.name}}');
        this.propertiesDBusInterface = dbusObject.getInterface('org.freedesktop.DBus.Properties');

        // forward property change events
        const forwardPropertyChange = (iface, changed, invalidated) => {
            if(iface === this.dbusInterfaceName) {
                this.emit('PropertiesChanged', iface, changed, invalidated);
            }
        }

        // forward all signals
        this.on("newListener", (event, listener) => {
            if(event === "PropertiesChanged" && this.listenerCount('PropertiesChanged') === 0) {
                this.propertiesDBusInterface.on('PropertiesChanged', forwardPropertyChange);
            } else {
                this.thisDBusInterface.on(event, listener);
            }
        });
        this.on("removeListener", (event, listener) => {
            if(event === "PropertiesChanged" && this.listenerCount('PropertiesChanged') === 0) {
                this.propertiesDBusInterface.removeListener('PropertiesChanged', forwardPropertyChange);
            } else {
                this.thisDBusInterface.removeListener(event, listener);
            }
        });
    }

    /***** Properties *****/

    getProperties() {
        return this.propertiesDBusInterface.GetAll(this.dbusInterfaceName);
    }

    getProperty(name) {
        return this.propertiesDBusInterface.Get(this.dbusInterfaceName, name);
    }

    setProperty(name, value) {
        return this.propertiesDBusInterface.Set(this.dbusInterfaceName, name, value);
    }

    {{#each property}}
    //@property({ name: '{{$.name}}', signature: '{{$.type}}', access: {{accessConst $.access}} }){{#ifeq $.access "read"}}
    {{$.name}}() {
        return this.propertiesDBusInterface.Get(this.dbusInterfaceName, '{{$.name}}'){{#unlesseq $.type "v"}}.then((variant) => variant.value){{/unlesseq}};
    }{{/ifeq}}{{#ifeq $.access "write"}}
    {{$.name}}(value) {
        return this.propertiesDBusInterface.Set(this.dbusInterfaceName, '{{$.name}}', {{#ifeq $.type "v"}}value{{else}}new DBus.Variant("{{$.type}}", value){{/ifeq}});
    }{{/ifeq}}{{#ifeq $.access "readwrite"}}
    {{$.name}}(value) {
        if(value !== undefined) {
            return this.propertiesDBusInterface.Set(this.dbusInterfaceName, '{{$.name}}', {{#ifeq $.type "v"}}value{{else}}new DBus.Variant("{{$.type}}", value){{/ifeq}});
        } else {
            return this.propertiesDBusInterface.Get(this.dbusInterfaceName, '{{$.name}}'){{#unlesseq $.type "v"}}.then((variant) => variant.value){{/unlesseq}};
        }
    }{{/ifeq}}

    {{/each}}

    /***** Methods *****/

    {{#each method}}
    //@method({ name: '{{$.name}}', inSignature: '{{inSignature arg}}', outSignature: '{{outSignature arg}}' })
    {{$.name}}({{#each arg}}{{#ifeq $.direction "in"}}{{$.name}}{{#unless @last}}, {{/unless}}{{/ifeq}}{{/each}}) {
        return this.thisDBusInterface.{{$.name}}({{#each arg}}{{#ifeq $.direction "in"}}{{$.name}}{{#unless @last}}, {{/unless}}{{/ifeq}}{{/each}});
    }

    {{/each}}


    /***** Signals for {{$.name}} *****/
    {{#each signal}}
    //@signal({ name: '{{$.name}}', signature: '{{signature arg}}' })
    {{/each}}
}

{{/each}}
07070100000034000081A4000000000000000000000001643934E90000055D000000000000000000000000000000000000004600000000dbus-final-0.0.0+git3e43f60/templates/javascript-service-class.js.hbslet dbus = require('dbus-final');
let Variant = dbus.Variant;

/*
 * Generated by dbus-final interface generator
 * Template: javascript-service-class.js.hbs
 */

let {
  Interface, property, method, signal, DBusError,
  ACCESS_READ, ACCESS_WRITE, ACCESS_READWRITE
} = dbus.interface;

{{#each interfaces}}
/**
 * Service: {{../serviceName}}
 * ObjectPath: {{../objectPath}}
 * Interface: {{$.name}}
 */
module.exports.{{className $.name}} = class {{className $.name}} extends Interface {
  constructor() {
    super('{{$.name}}');
  }

  {{#each property}}
  @property({ name: '{{$.name}}', signature: '{{$.type}}', access: {{accessConst $.access}} })
  get {{$.name}}() {
    // TODO: implement property getter for {{$.name}}
  }

  set {{$.name}}(value) {
    // TODO: implement property setter for {{$.name}}
  }

  {{/each}}

  {{#each method}}
  @method({ name: '{{$.name}}', inSignature: '{{inSignature arg}}', outSignature: '{{outSignature arg}}' })
  {{$.name}}({{#each arg}}{{#ifeq $.direction "in"}}{{$.name}}{{#unless @last}}, {{/unless}}{{/ifeq}}{{/each}}) {
    // TODO: implement the {{$.name}} method
  }

  {{/each}}
  {{#each signal}}
  @signal({ name: '{{$.name}}', signature: '{{signature arg}}' })
  {{$.name}}({{#each arg}}{{$.name}}{{#unless @last}}, {{/unless}}{{/each}}) {
    // TODO: implement the {{$.name}} signal
  }

  {{/each}}
}

{{/each}}
07070100000035000081A4000000000000000000000001643934E9000014CD000000000000000000000000000000000000003E00000000dbus-final-0.0.0+git3e43f60/templates/typescript-class.ts.hbsimport * as DBus from 'dbus-final';
import { EventEmitter } from 'events';

/*
 * Generated by dbus-final interface generator
 * Template: typescript-class.ts.hbs
 */

{{#if xmlData}}
// Introspection XML of {{serviceName}} at {{objectPath}}
const XMLObjectData = `{{xmlData}}`;
{{/if}}

{{#each interfaces}}
/**
 * Service: {{../serviceName}}
 * ObjectPath: {{../objectPath}}
 * Interface: {{$.name}}
 */
export class {{className $.name}} extends EventEmitter {

    public readonly dbusInterfaceName = '{{$.name}}';
    public dbusObject: DBus.ProxyObject;
    public propertiesDBusInterface: DBus.ClientInterface;
    public thisDBusInterface: DBus.ClientInterface;

    public static Connect(bus: DBus.MessageBus, objectPath: string{{#if ../xmlData}} = "{{../objectPath}}"{{/if}}, xml{{#unless ../xmlData}}?{{/unless}}: string{{#if ../xmlData}} = XMLObjectData{{/if}}): Promise<{{className $.name}}> {
        return bus.getProxyObject('{{../serviceName}}', objectPath, xml).then((obj) => new {{className $.name}}(obj));
    }

    constructor(dbusObject: DBus.ProxyObject) {
        super();
        this.dbusObject = dbusObject;
        this.thisDBusInterface = this.dbusObject.getInterface('{{$.name}}');
        this.propertiesDBusInterface = this.dbusObject.getInterface('org.freedesktop.DBus.Properties');

        // forward property change events
        const forwardPropertyChange = (iface: string, changed: any, invalidated: any) => {
            if(iface === this.dbusInterfaceName) {
                this.emit('PropertiesChanged', iface, changed, invalidated);
            }
        }

        // forward all signals
        this.on("newListener", (event: string, listener: (...args: any[]) => void) => {
            if(event === "PropertiesChanged" && this.listenerCount('PropertiesChanged') === 0) {
                this.propertiesDBusInterface.on('PropertiesChanged', forwardPropertyChange);
            } else {
                this.thisDBusInterface.on(event, listener);
            }
        });
        this.on("removeListener", (event: string, listener: (...args: any[]) => void) => {
            if(event === "PropertiesChanged" && this.listenerCount('PropertiesChanged') === 0) {
                this.propertiesDBusInterface.removeListener('PropertiesChanged', forwardPropertyChange);
            } else {
                this.thisDBusInterface.removeListener(event, listener);
            }
        });
    }

    /***** Properties *****/

    public getProperties(): Promise<{[name: string]: DBus.Variant}> {
        return this.propertiesDBusInterface.GetAll(this.dbusInterfaceName);
    }

    public getProperty(name: string): Promise<DBus.Variant> {
        return this.propertiesDBusInterface.Get(this.dbusInterfaceName, name);
    }

    public setProperty(name: string, value: DBus.Variant): Promise<void> {
        return this.propertiesDBusInterface.Set(this.dbusInterfaceName, name, value);
    }

    {{#each property}}
    //@property({ name: '{{$.name}}', signature: '{{$.type}}', access: {{accessConst $.access}} }){{#ifeq $.access "read"}}
    public {{$.name}}(): Promise<{{tsType $.type}}> {
        return this.propertiesDBusInterface.Get(this.dbusInterfaceName, '{{$.name}}'){{#unlesseq $.type "v"}}.then((variant: DBus.Variant) => variant.value){{/unlesseq}};
    }{{/ifeq}}{{#ifeq $.access "write"}}
    public {{$.name}}(value: {{tsType $.type}}): Promise<void> {
        return this.propertiesDBusInterface.Set(this.dbusInterfaceName, '{{$.name}}', {{#ifeq $.type "v"}}value{{else}}new DBus.Variant("{{$.type}}", value){{/ifeq}});
    }{{/ifeq}}{{#ifeq $.access "readwrite"}}
    public {{$.name}}(): Promise<{{tsType $.type}}>;
    public {{$.name}}(value: {{tsType $.type}}): Promise<void>;
    public {{$.name}}(value?: {{tsType $.type}}): Promise<any> {
        if(value !== undefined) {
            return this.propertiesDBusInterface.Set(this.dbusInterfaceName, '{{$.name}}', {{#ifeq $.type "v"}}value{{else}}new DBus.Variant("{{$.type}}", value){{/ifeq}});
        } else {
            return this.propertiesDBusInterface.Get(this.dbusInterfaceName, '{{$.name}}'){{#unlesseq $.type "v"}}.then((variant: DBus.Variant) => variant.value){{/unlesseq}};
        }
    }{{/ifeq}}

    {{/each}}

    /***** Methods *****/

    {{#each method}}
    //@method({ name: '{{$.name}}', inSignature: '{{inSignature arg}}', outSignature: '{{outSignature arg}}' })
    public {{$.name}}({{#each arg}}{{#ifeq $.direction "in"}}{{$.name}}: {{tsType $.type}}{{#unless @last}}, {{/unless}}{{/ifeq}}{{/each}}): Promise<{{outType arg}}> {
        return this.thisDBusInterface.{{$.name}}({{#each arg}}{{#ifeq $.direction "in"}}{{$.name}}{{#unless @last}}, {{/unless}}{{/ifeq}}{{/each}});
    }

    {{/each}}
}
{{#if signal.length}}
/***** Signals for {{$.name}} *****/
export declare interface {{className $.name}} {
    {{#each signal}}
    //@signal({ name: '{{$.name}}', signature: '{{signature arg}}' })
    on(evt: "{{$.name}}", cb: ({{#each arg}}{{$.name}}: {{tsType $.type}}{{#unless @last}}, {{/unless}}{{/each}}) => void): this;
    {{/each}}
    {{#if property}}on(evt: "PropertiesChanged", cb: (iface: string, changedProperties: {[key:string]: any}, invalidatedProperties: string[]) => void): this;{{/if}}
    on(event: string, listener: Function): this;
}{{/if}}

{{/each}}
07070100000036000081A4000000000000000000000001643934E9000004F1000000000000000000000000000000000000003C00000000dbus-final-0.0.0+git3e43f60/templates/typescript-dts.ts.hbsimport * as DBus from 'dbus-final';

/*
 * Generated by dbus-final interface generator
 * Template: typescript-dts.ts.hbs
 */

{{#each interfaces}}
/**
 * Service: {{../serviceName}}
 * ObjectPath: {{../objectPath}}
 * Interface: {{$.name}}
 */
export interface {{className $.name}} extends DBus.ClientInterface {

    /***** Properties *****/

    {{#each property}}
    //@property({ name: '{{$.name}}', signature: '{{$.type}}', access: {{accessConst $.access}} })
    {{#canRead $.access}}{{$.name}}(): Promise<{{tsType $.type}}>;{{/canRead}}{{#canWrite $.access}}
    {{$.name}}(value: {{tsType $.type}}): Promise<void>;{{/canWrite}}

    {{/each}}

    /***** Methods *****/

    {{#each method}}
    //@method({ name: '{{$.name}}', inSignature: '{{inSignature arg}}', outSignature: '{{outSignature arg}}' })
    {{$.name}}({{#each arg}}{{#ifeq $.direction "in"}}{{$.name}}: {{tsType $.type}}{{#unless @last}}, {{/unless}}{{/ifeq}}{{/each}}): Promise<{{outType arg}}>;

    {{/each}}

    /***** Signals *****/

    {{#each signal}}
    //@signal({ name: '{{$.name}}', signature: '{{signature arg}}' })
    on(evt: "{{$.name}}", cb: ({{#each arg}}{{$.name}}: {{tsType $.type}}{{#unless @last}}, {{/unless}}{{/each}}) => void): this;
    {{/each}}
}

{{/each}}
07070100000037000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002100000000dbus-final-0.0.0+git3e43f60/test07070100000038000041ED000000000000000000000002643934E900000000000000000000000000000000000000000000002D00000000dbus-final-0.0.0+git3e43f60/test/integration07070100000039000081A4000000000000000000000001643934E9000008FF000000000000000000000000000000000000003F00000000dbus-final-0.0.0+git3e43f60/test/integration/ay-buffer.test.jsconst dbus = require('../../');

const Variant = dbus.Variant;
const {
  Interface, method
} = dbus.interface;

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

const TEST_NAME = 'org.test.aybuffer';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

class AyBufferInterface extends Interface {
  @method({ inSignature: 'ay', outSignature: 'ay' })
  EchoBuffer (what) {
    expect(what).toEqual(expect.any(Buffer));
    return what;
  }

  @method({ inSignature: 'aay', outSignature: 'aay' })
  EchoAay (what) {
    expect(what).toEqual(expect.any(Array));
    for (const buf of what) {
      expect(buf).toEqual(expect.any(Buffer));
    }
    return what;
  }

  @method({ inSignature: 'v', outSignature: 'v' })
  EchoAyVariant (what) {
    expect(what.signature).toEqual('ay');
    expect(what.value).toEqual(expect.any(Buffer));
    return what;
  }
}

const testIface = new AyBufferInterface(TEST_IFACE);

test('dbus type ay should be a buffer', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);

  const ayArray = [1, 2, 3];
  const buf = Buffer.from(ayArray);
  let result = await test.EchoBuffer(buf);
  expect(result).toEqual(buf);

  // it should work with arrays to for compatibility with earlier versions
  result = await test.EchoBuffer(ayArray);
  expect(result).toEqual(buf);

  // regression #57
  const ayArray2 = [4, 5, 6];
  const buf2 = Buffer.from(ayArray2);

  const bufArray = [buf, buf2];
  result = await test.EchoAay(bufArray);
  expect(result).toEqual(bufArray);

  // compat with earlier versions
  const aayBufArray = [ayArray, ayArray2];
  result = await test.EchoAay(aayBufArray);
  expect(result).toEqual(bufArray);

  // make sure it works with variants
  const bufVariant = new Variant('ay', buf);
  result = await test.EchoAyVariant(bufVariant);
  expect(result).toEqual(bufVariant);

  const arrayBufVariant = new Variant('ay', ayArray);
  result = await test.EchoAyVariant(arrayBufVariant);
  expect(result).toEqual(new Variant('ay', buf));
});
0707010000003A000081A4000000000000000000000001643934E9000010FF000000000000000000000000000000000000004A00000000dbus-final-0.0.0+git3e43f60/test/integration/client-standard-dbus.test.js// Test some of the standard dbus interfaces to make sure the client works
// correctly

const dbus = require('../../');
const Message = dbus.Message;
const bus = dbus.sessionBus();
const { Interface } = dbus.interface;
const xml2js = require('xml2js');

bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

afterAll(() => {
  bus.disconnect();
});

test('lists names on the bus', async () => {
  const object = await bus.getProxyObject('org.freedesktop.DBus', '/org/freedesktop/DBus');
  const iface = object.getInterface('org.freedesktop.DBus');
  expect(iface).toBeDefined();
  const names = await iface.ListNames();
  expect(names.length).toBeGreaterThan(0);
  expect(names).toEqual(expect.arrayContaining(['org.freedesktop.DBus']));
});

test('get stats', async () => {
  const object = await bus.getProxyObject('org.freedesktop.DBus', '/org/freedesktop/DBus');
  const iface = object.getInterface('org.freedesktop.DBus.Debug.Stats');
  const stats = await iface.GetStats();
  expect(stats).toBeInstanceOf(Object);
  expect(stats).toHaveProperty('BusNames');
  const busNames = stats.BusNames;
  expect(busNames).toBeInstanceOf(dbus.Variant);
  expect(busNames.signature).toBe('u');
  expect(busNames.value).toBeGreaterThan(0);
});

test('provided xml', async () => {
  const xml = `
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
    "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/com/example/sample_object0">
    <interface name="com.example.SampleInterface0">
        <method name="Frobate">
            <arg name="foo" type="i" direction="in"/>
            <arg name="bar" type="s" direction="out"/>
            <arg name="baz" type="a{us}" direction="out"/>
            <annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
        </method>
        <method name="Bazify">
            <arg name="bar" type="(iiu)" direction="in"/>
            <arg name="bar" type="v" direction="out"/>
        </method>
        <method name="Mogrify">
            <arg name="bar" type="(iiav)" direction="in"/>
        </method>
        <signal name="Changed">
            <arg name="new_value" type="b"/>
        </signal>
        <signal name="ChangedMulti">
            <arg name="new_value1" type="b"/>
            <arg name="new_value2" type="y"/>
        </signal>
        <property name="Bar" type="y" access="write"/>
    </interface>
    <node name="child_of_sample_object"/>
    <node name="another_child_of_sample_object"/>
</node>
`;
  const object = await bus.getProxyObject('com.example.Sample', '/com/example/sample_object0', xml);

  const iface = object.getInterface('com.example.SampleInterface0');
  expect(object.nodes.length).toEqual(2);
  expect(iface.Frobate).toBeDefined();
  expect(iface.Bazify).toBeDefined();
  expect(iface.Mogrify).toBeDefined();
  expect(iface.$signals.find((s) => s.name === 'Changed')).toBeDefined();
});

class Iface extends Interface {
  constructor () {
    super('org.test.Interface1');
  }
}

test('exported service introspection', async () => {
  // regression: see #62

  const iface1 = new Iface();
  const iface2 = new Iface();

  const dest = 'org.test.services';

  bus.export('/org/test/path1', iface1);
  bus.export('/org/test/path2', iface2);

  await bus.requestName(dest);

  const parser = new xml2js.Parser();

  const introspect = async (path) => {
    const msg = new Message({
      destination: dest,
      path: path,
      interface: 'org.freedesktop.DBus.Introspectable',
      member: 'Introspect'
    });

    const result = await bus.call(msg);
    let error, xml;

    parser.parseString(result.body[0], (e, data) => {
      if (e) {
        error = e;
        return;
      }
      xml = data;
    });

    expect(error).toBeUndefined();

    return xml;
  };

  const validateIntrospection = (introspection, nodeCount) => {
    expect(introspection.node).toBeDefined();
    expect(introspection.node.node).toBeDefined();
    expect(introspection.node.node.length).toBe(nodeCount);
  };

  let introspection = await introspect('/');
  validateIntrospection(introspection, 1);

  introspection = await introspect('/org');
  validateIntrospection(introspection, 1);

  introspection = await introspect('/org/test');
  validateIntrospection(introspection, 2);
});
0707010000003B000081A4000000000000000000000001643934E900000A82000000000000000000000000000000000000004800000000dbus-final-0.0.0+git3e43f60/test/integration/configured-service.test.js// Test a service configured with Interface.configureMembers()

const dbus = require('../../');
const Variant = dbus.Variant;

const TEST_NAME = 'org.test.configured_service';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

const Interface = dbus.interface.Interface;

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class ConfiguredTestInterface extends Interface {
  constructor (name) {
    super(name);
    this._someProperty = 'foo';
  }

  get SomeProperty () {
    return this._someProperty;
  }

  set SomeProperty (value) {
    this._someProperty = value;
  }

  Echo (what) {
    return what;
  }

  HelloWorld () {
    return ['hello', 'world'];
  }

  EmitSignals () {
    this.HelloWorld();
  }
}

ConfiguredTestInterface.configureMembers({
  properties: {
    SomeProperty: {
      signature: 's'
    }
  },
  methods: {
    Echo: {
      inSignature: 'v',
      outSignature: 'v'
    },
    EmitSignals: {}
  },
  signals: {
    HelloWorld: {
      signature: 'ss'
    }
  }
});

const testIface = new ConfiguredTestInterface(TEST_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

test('regression: getter is not called after configureMembers (#60)', () => {
  class TestInterface extends Interface {
    constructor (name) {
      super(name);
      this._myPrivateProperty = 'HELLO';
    }

    get myProperty () {
      return this._myPrivateProperty.toLowerCase();
    }
  }

  TestInterface.configureMembers({
    properties: {
      myProperty: { signature: 's' }
    }
  });
});

test('configured interface', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);
  expect(test).toBeDefined();
  const properties = object.getInterface('org.freedesktop.DBus.Properties');

  const prop = await properties.Get(TEST_IFACE, 'SomeProperty');
  expect(prop).toBeInstanceOf(Variant);
  expect(prop.signature).toEqual('s');
  expect(prop.value).toEqual('foo');
  expect(prop.value).toEqual(testIface.SomeProperty);

  await properties.Set(TEST_IFACE, 'SomeProperty', new Variant('s', 'bar'));
  expect(testIface.SomeProperty).toEqual('bar');

  const result = await test.Echo(new Variant('s', 'foo'));
  expect(result).toBeInstanceOf(Variant);
  expect(result.signature).toEqual('s');
  expect(result.value).toEqual('foo');

  const onHelloWorld = jest.fn();
  test.once('HelloWorld', onHelloWorld);

  await test.EmitSignals();
  expect(onHelloWorld).toHaveBeenCalledWith('hello', 'world');
});
0707010000003C000081A4000000000000000000000001643934E900000691000000000000000000000000000000000000004000000000dbus-final-0.0.0+git3e43f60/test/integration/disconnect.test.jsconst dbus = require('../../');
const { ping } = require('../util');

const {
  Interface, method, signal
} = dbus.interface;

const TEST_NAME = 'org.test.disconnect';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class TestInterface extends Interface {
  @method({ inSignature: 's', outSignature: 's' })
  Echo (what) {
    return what;
  }

  @signal({})
  SomeSignal () {
  }
}

const testIface = new TestInterface(TEST_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

test('what happens when a bus disconnects', async () => {
  // low level: sending a message on a disconnected bus should throw
  let bus2 = dbus.sessionBus();
  await ping(bus2);
  bus2.disconnect();
  await expect(ping(bus2)).rejects.toThrow();

  // high level: calling a method on an object with a disconnected bus should
  // throw
  bus2 = dbus.sessionBus();
  await ping(bus2);
  let obj = await bus2.getProxyObject(TEST_NAME, TEST_PATH);
  let test = obj.getInterface(TEST_IFACE);
  bus2.disconnect();
  await expect(test.Echo('hi')).rejects.toThrow();

  // high level: if you're listening to a signal and the bus disonnects, there
  // shouldn't be a warning
  bus2 = dbus.sessionBus();
  await ping(bus2);
  obj = await bus2.getProxyObject(TEST_NAME, TEST_PATH);
  test = obj.getInterface(TEST_IFACE);
  const fn = () => {};
  test.on('SomeSignal', fn);
  await ping(bus2);
  bus2.disconnect();
  test.removeListener('SomeSignal', fn);
});
0707010000003D000081A4000000000000000000000001643934E900002041000000000000000000000000000000000000004000000000dbus-final-0.0.0+git3e43f60/test/integration/fd-passing.test.js// Test the ability to send and recv file descriptors in dbus messages.

const dbus = require('../../');
const fs = require("fs");
const Variant = dbus.Variant;
const Message = dbus.Message;

const {
    Interface, property,
    method, signal,
    ACCESS_READ, ACCESS_WRITE
} = dbus.interface;

const {METHOD_RETURN} = dbus.MessageType;

const TEST_NAME = 'org.test.filedescriptors';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

const bus = dbus.sessionBus({negotiateUnixFd: true});
bus.on('error', (err) => {
    console.log(`got unexpected connection error:\n${err.stack}`);
});

// make sure unix fds are supported by the bus
if (!bus._connection.stream.supportsUnixFd) {
    console.log("UNIX_FD not supported");
    test = test.skip
}

const bus2 = dbus.sessionBus({negotiateUnixFd: true});
bus2.on('error', (err) => {
    console.log(`got unexpected connection error:\n${err.stack}`);
});

function openFd() {
    return new Promise((resolve, reject) => {
        fs.open("/dev/null", "r", (err, fd) => {
            if (err) reject(err);
            else resolve(fd);
        })
    })
}
function closeFd(fd) {
    return new Promise((resolve, reject) => {
        fs.close(fd, (err) => {
            if (err) reject(err);
            else resolve();
        })
    })
}
function fstat(fd) {
    return new Promise((resolve, reject) => {
        fs.fstat(fd, (err, res) => {
            if (err) reject(err);
            else resolve(res);
        })
    })
}
async function compareFd(fd1, fd2) {
    expect(fd1).toBeDefined();
    expect(fd2).toBeDefined();
    const s1 = await fstat(fd1);
    const s2 = await fstat(fd2);
    //console.log(fs.readlinkSync("/proc/self/fd/"+fd1));
    //console.log(fs.readlinkSync("/proc/self/fd/"+fd2));
    expect(s1.ino).toEqual(s2.ino);
    expect(s1.dev).toEqual(s2.dev);
    expect(s1.rdev).toEqual(s2.rdev);
}


class TestInterface extends Interface {

    constructor(name) {
        super(name);
        this.fds = [];
    }

    @method({ outSignature: "h" })
    returnsFd() {
        return this.createFd();
    }

    @method({ inSignature: "h" })
    acceptsFd(fd) {
        this.fds.push(fd);
    }

    @property({ signature: 'h', access: ACCESS_READ })
    get getFdProp() {
        return this.getLastFd();
    }

    @property({ signature: 'h', access: ACCESS_WRITE })
    set setFdProp(fd) {
        this.fds.push(fd);
    }

    @signal({ signature: 'h' })
    signalFd(fd) {
        return fd;
    }

    getLastFd() {
        return this.fds[this.fds.length - 1];
    }

    @method({})
    async emitSignal() {
        const fd = await this.createFd();
        await this.signalFd(fd);
    }

    async createFd() {
        const fd = await openFd();
        this.fds.push(fd);
        return fd;
    }

    async cleanup() {
        while (this.fds.length > 0) {
            const fd = this.fds.pop();
            await closeFd(fd);
        }
    }
}

const testIface = new TestInterface(TEST_IFACE);

beforeAll(async () => {
    await bus2.requestName(TEST_NAME);
    bus2.export(TEST_PATH, testIface);
});

afterEach(async () => {
    await testIface.cleanup();
})

afterAll(() => {
    bus.disconnect();
    bus2.disconnect();
});

test('sending file descriptor', async () => {
    const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
    const test = object.getInterface(TEST_IFACE);
    expect(test).toBeDefined();
    expect(test.returnsFd).toBeDefined();
    const fd = await openFd();
    await test.acceptsFd(fd);

    expect(testIface.getLastFd()).toBeDefined();
    await compareFd(fd, testIface.getLastFd());
    await closeFd(fd);
});


test('receiving file descriptor', async () => {
    const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
    const test = object.getInterface(TEST_IFACE);
    expect(test).toBeDefined();
    expect(test.returnsFd).toBeDefined();
    const fd = await test.returnsFd();
    expect(fd).toBeDefined();

    await compareFd(fd, testIface.getLastFd());
    await closeFd(fd);
});

test('get file descriptor property', async () => {
    const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
    const properties = object.getInterface('org.freedesktop.DBus.Properties');
    expect(properties).toBeDefined();
    expect(properties.Get).toBeDefined();
    await testIface.createFd();
    const fdVariant = await properties.Get(TEST_IFACE, "getFdProp");
    expect(fdVariant.signature).toEqual("h");
    expect(fdVariant.value).toBeDefined();

    await compareFd(fdVariant.value, testIface.getLastFd());
    await closeFd(fdVariant.value);
});

test('set file descriptor property', async () => {
    const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
    const properties = object.getInterface('org.freedesktop.DBus.Properties');
    expect(properties).toBeDefined();
    expect(properties.Set).toBeDefined();
    const fd = await openFd();
    await properties.Set(TEST_IFACE, "setFdProp", new Variant("h", fd));

    expect(testIface.getLastFd()).toBeDefined();
    await compareFd(fd, testIface.getLastFd());
    await closeFd(fd);
});

test('signal file descriptor', async () => {
    const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
    const test = object.getInterface(TEST_IFACE);
    expect(test).toBeDefined();

    let fd;
    const onSignal = jest.fn((fd_) => fd = fd_);
    test.on("signalFd", onSignal);

    await test.emitSignal();

    expect(onSignal).toHaveBeenCalled();

    await compareFd(fd, testIface.getLastFd());
    await closeFd(fd);
});


test('low level file descriptor sending', async () => {
    const fd = await openFd();
    const msg = new Message({
        destination: bus.name,
        path: '/org/test/path',
        interface: 'org.test.iface',
        member: 'SomeMember',
        signature: 'h',
        body: [fd],
    });

    const methodReturnHandler = function (sent) {
        if (sent.serial === msg.serial) {
            expect(sent.path).toEqual(msg.path);
            expect(sent.serial).toEqual(msg.serial);
            expect(sent.interface).toEqual(msg.interface);
            expect(sent.member).toEqual(msg.member);
            expect(sent.signature).toEqual("h");
            const sentFd = sent.body[0];
            compareFd(sentFd, fd).then(() => {
                return closeFd(sentFd);
            }).then(() => {
                bus.send(Message.newMethodReturn(sent, 's', ['got it']));
            });

            bus.removeMethodHandler(methodReturnHandler);
            return true;
        }
        return false;
    };
    bus.addMethodHandler(methodReturnHandler);
    expect(bus._methodHandlers.length).toEqual(1);

    let reply = await bus2.call(msg);

    expect(bus._methodHandlers.length).toEqual(0);
    expect(reply.type).toEqual(METHOD_RETURN);
    expect(reply.sender).toEqual(bus.name);
    expect(reply.signature).toEqual('s');
    expect(reply.body).toEqual(['got it']);
    expect(reply.replySerial).toEqual(msg.serial);

    await closeFd(fd);
});


test('low level file descriptor receiving', async () => {
    const fd = await openFd();
    const msg = new Message({
        destination: bus.name,
        path: '/org/test/path',
        interface: 'org.test.iface',
        member: 'SomeMember',
    });

    const methodReturnHandler = function (sent) {
        if (sent.serial === msg.serial) {
            expect(sent.path).toEqual(msg.path);
            expect(sent.serial).toEqual(msg.serial);
            expect(sent.interface).toEqual(msg.interface);
            expect(sent.member).toEqual(msg.member);
            bus.send(Message.newMethodReturn(sent, 'h', [fd]));
            bus.removeMethodHandler(methodReturnHandler);
            return true;
        }
        return false;
    };
    bus.addMethodHandler(methodReturnHandler);
    expect(bus._methodHandlers.length).toEqual(1);

    let reply = await bus2.call(msg);

    expect(bus._methodHandlers.length).toEqual(0);
    expect(reply.type).toEqual(METHOD_RETURN);
    expect(reply.sender).toEqual(bus.name);
    expect(reply.signature).toEqual('h');
    expect(reply.replySerial).toEqual(msg.serial);
    await compareFd(fd, reply.body[0]);

    await closeFd(fd);
    await closeFd(reply.body[0]);
});
0707010000003E000081A4000000000000000000000001643934E900000B60000000000000000000000000000000000000003A00000000dbus-final-0.0.0+git3e43f60/test/integration/long.test.js// Test that methods and properties of type 'x' (long int) work correctly

let testIfHasBigInt = test;

if (typeof BigInt !== 'function') {
  // skip these tests if BigInt is not supported
  testIfHasBigInt = test.skip;
}

const dbus = require('../../');
const DBusError = dbus.DBusError;

const {
  Interface, method
} = dbus.interface;

const {
  _getBigIntConstants
} = require('../../lib/constants');

const TEST_NAME = 'org.test.long';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';
const TEST_ERROR_PATH = 'org.test.name.error';

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class LongInterface extends Interface {
  @method({ inSignature: 'x', outSignature: 'x' })
  EchoSigned (what) {
    if (typeof what !== 'bigint') {
      throw new DBusError(TEST_ERROR_PATH, 'interface with long expected a BigInt for type x');
    }
    return what;
  }

  @method({ inSignature: 't', outSignature: 't' })
  EchoUnsigned (what) {
    if (typeof what !== 'bigint') {
      throw new DBusError(TEST_ERROR_PATH, 'interface with long expected a BigInt for type t');
    }
    return what;
  }
}

const testIface = new LongInterface(TEST_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

testIfHasBigInt('test long type works correctly', async () => {
  const { MAX_INT64, MIN_INT64, MAX_UINT64, MIN_UINT64 } = _getBigIntConstants();

  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);

  // small numbers
  let what = BigInt(-30);
  let result = await test.EchoSigned(what);
  // XXX jest does not support bigint yet
  expect(result === what).toEqual(true);

  what = BigInt(30);
  result = await test.EchoUnsigned(what);
  expect(result === what).toEqual(true);
  result = await test.EchoSigned(what);
  expect(result === what).toEqual(true);

  // int64 max
  what = MAX_INT64;
  result = await test.EchoSigned(what);
  expect(result === what).toEqual(true);

  expect((async () => {
    return await test.EchoSigned(what + BigInt(1));
  })()).rejects.toThrow();

  // int64 min
  what = MIN_INT64;
  result = await test.EchoSigned(what);
  expect(result === what).toEqual(true);

  expect((async () => {
    return await test.EchoSigned(what - BigInt(1));
  })()).rejects.toThrow();

  // uint64 max
  what = MAX_UINT64;
  result = await test.EchoUnsigned(what);
  expect(result === what).toEqual(true);

  expect((async () => {
    return await test.EchoUnsigned(what + BigInt(1));
  })()).rejects.toThrow();

  // uint64 min
  what = MIN_UINT64;
  result = await test.EchoUnsigned(what);
  expect(result === what).toEqual(true);

  expect((async () => {
    return await test.EchoUnsigned(what - BigInt(1));
  })()).rejects.toThrow();
});
0707010000003F000081A4000000000000000000000001643934E9000010AE000000000000000000000000000000000000003F00000000dbus-final-0.0.0+git3e43f60/test/integration/low-level.test.jsconst dbus = require('../../');
const Message = dbus.Message;
const {
  METHOD_CALL,
  METHOD_RETURN,
  SIGNAL,
  ERROR
} = dbus.MessageType;

const {
  NO_REPLY_EXPECTED
} = dbus.MessageFlag;

const bus1 = dbus.sessionBus();
const bus2 = dbus.sessionBus();

bus1.on('error', (err) => {
  console.log(`bus1 got unexpected connection error:\n${err.stack}`);
});
bus2.on('error', (err) => {
  console.log(`bus2 got unexpected connection error:\n${err.stack}`);
});

beforeAll(async () => {
  const connect = [bus1, bus2].map((bus) => {
    return new Promise((resolve) => {
      bus.on('connect', resolve);
    });
  });

  await Promise.all(connect);
});

afterAll(() => {
  bus1.disconnect();
  bus2.disconnect();
});

test('send a method call between buses', async () => {
  const msg = new Message({
    destination: bus1.name,
    path: '/org/test/path',
    interface: 'org.test.iface',
    member: 'SomeMember'
  });

  const methodReturnHandler = function (sent) {
    if (sent.serial === msg.serial) {
      expect(sent.path).toEqual(msg.path);
      expect(sent.serial).toEqual(msg.serial);
      expect(sent.interface).toEqual(msg.interface);
      expect(sent.member).toEqual(msg.member);

      bus1.send(Message.newMethodReturn(sent, 's', ['got it']));
      bus1.removeMethodHandler(methodReturnHandler);
      return true;
    }
    return false;
  };
  bus1.addMethodHandler(methodReturnHandler);
  expect(bus1._methodHandlers.length).toEqual(1);

  let reply = await bus2.call(msg);

  expect(bus1._methodHandlers.length).toEqual(0);
  expect(reply.type).toEqual(METHOD_RETURN);
  expect(reply.sender).toEqual(bus1.name);
  expect(reply.signature).toEqual('s');
  expect(reply.body).toEqual(['got it']);
  expect(reply.replySerial).toEqual(msg.serial);

  const errorReturnHandler = function (sent) {
    if (sent.serial === msg.serial) {
      expect(sent.type).toEqual(METHOD_CALL);
      expect(sent.path).toEqual(msg.path);
      expect(sent.serial).toEqual(msg.serial);
      expect(sent.interface).toEqual(msg.interface);
      expect(sent.member).toEqual(msg.member);

      bus1.send(Message.newError(sent, 'org.test.Error', 'throwing an error'));
      bus1.removeMethodHandler(errorReturnHandler);
      return true;
    }
    return false;
  };

  bus1.addMethodHandler(errorReturnHandler);
  let error = null;
  try {
    // sending the same message twice should reset the serial
    await bus2.call(msg);
  } catch (e) {
    error = e;
  }

  expect(error).not.toBeNull();
  expect(error.reply).toBeInstanceOf(Message);
  expect(error.reply.type).toEqual(ERROR);
  expect(error.reply.sender).toEqual(bus1.name);
  expect(error.reply.errorName).toEqual('org.test.Error');
  expect(error.reply.signature).toEqual('s');
  expect(error.reply.replySerial).toEqual(msg.serial);
  expect(error.reply.body).toEqual(['throwing an error']);

  expect(error.type).toEqual('org.test.Error');
  expect(error.message).toEqual('throwing an error');

  // with no reply expected
  const waitForMessage = new Promise((resolve) => {
    bus1.once('message', (msg) => {
      if (msg.sender === bus2.name) {
        resolve(msg);
      }
    });
  });

  msg.flags = NO_REPLY_EXPECTED;
  const result = await bus2.call(msg);
  expect(result).toBeNull();
  reply = await waitForMessage;
  expect(reply).toBeInstanceOf(Message);
});

test('send a signal between buses', async () => {
  const addMatchMessage = new Message({
    destination: 'org.freedesktop.DBus',
    path: '/org/freedesktop/DBus',
    interface: 'org.freedesktop.DBus',
    member: 'AddMatch',
    signature: 's',
    body: [`sender='${bus2.name}'`]
  });
  await bus1.call(addMatchMessage);

  const waitForMessage = new Promise((resolve) => {
    bus1.once('message', (msg) => {
      if (msg.sender === bus2.name) {
        resolve(msg);
      }
    });
  });

  bus2.send(Message.newSignal('/org/test/path', 'org.test.interface', 'SomeSignal', 's', ['a signal']));
  const signal = await waitForMessage;

  expect(signal.type).toEqual(SIGNAL);
  expect(signal.path).toEqual('/org/test/path');
  expect(signal.interface).toEqual('org.test.interface');
  expect(signal.member).toEqual('SomeSignal');
  expect(signal.signature).toEqual('s');
  expect(signal.body).toEqual(['a signal']);
});
07070100000040000081A4000000000000000000000001643934E900000EB8000000000000000000000000000000000000003D00000000dbus-final-0.0.0+git3e43f60/test/integration/methods.test.js// Test that interface methods work correctly

const dbus = require('../../');
const Variant = dbus.Variant;
const DBusError = dbus.DBusError;

const {
  Interface, method
} = dbus.interface;

const TEST_NAME = 'org.test.methods';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class MethodsInterface extends Interface {
  expectedError () {
    return new DBusError('org.test.iface.Error', 'something went wrong');
  }

  @method({ inSignature: 'v', outSignature: 'v' })
  Echo (what) {
    return what;
  }

  @method({ inSignature: 'vv', outSignature: 'vv' })
  EchoMultiple (what, what2) {
    return [what, what2];
  }

  @method({ inSignature: '', outSignature: '' })
  ThrowsError () {
    throw this.expectedError();
  }

  complicated1 = [
    new Variant('s', 'foo'),
    new Variant('(s(sv))', [
      'bar', [
        'bat',
        new Variant('av', [
          new Variant('s', 'baz'),
          new Variant('i', 53)
        ])
      ]
    ])
  ];

  complicated2 = ['one', 'two']

  @method({ inSignature: '', outSignature: 'av(ss)' })
  ReturnsComplicated () {
    return [this.complicated1, this.complicated2];
  }

  @method({ inSignature: 'as', outSignature: '' })
  TakesList () {
  }

  @method({ inSignature: 's', outSignature: 's' })
  async AsyncEcho (what) {
    return what;
  }

  @method({ inSignature: '', outSignature: '' })
  async AsyncError () {
    throw this.expectedError();
  }
}

const testIface = new MethodsInterface(TEST_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

// a really complicated variant
const echoVariant = new Variant('a{sv}', {
  foo: new Variant('s', 'bar'),
  bar: new Variant('d', 53),
  bat: new Variant('v', new Variant('as', ['foo', 'bar', 'bat'])),
  baz: new Variant('(doodoo)', [1, '/', '/', 1, '/', '/']),
  fiz: new Variant('(as(s(v)))', [
    ['one', 'two'],
    ['three', [
      new Variant('as', ['four', 'five'])]
    ]
  ]),
  kevin: new Variant('(vs)', [new Variant('s', 'foo'), 'foo']),
  buz: new Variant('av', [
    new Variant('as', ['foo']),
    new Variant('a{ss}', { foo: 'bar' }),
    new Variant('v', new Variant('(asas)', [['bar'], ['foo']])),
    new Variant('v', new Variant('v', new Variant('as', ['one', 'two']))),
    new Variant('a{ss}', { foo: 'bar' })
  ])
});

test('that methods work correctly', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);

  const result = await test.Echo(echoVariant);
  expect(result).toEqual(echoVariant);

  let [r1, r2] = await test.EchoMultiple(echoVariant, echoVariant);
  expect(r1).toEqual(echoVariant);
  expect(r2).toEqual(echoVariant);

  [r1, r2] = await test.ReturnsComplicated();
  expect(r1).toEqual(testIface.complicated1);
  expect(r2).toEqual(testIface.complicated2);

  let req = test.ThrowsError();
  await expect(req).rejects.toEqual(testIface.expectedError());

  req = await test.AsyncEcho('what');
  expect(req).toEqual('what');

  req = test.AsyncError();
  await expect(req).rejects.toEqual(testIface.expectedError());
});

test('client method errors', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);

  await expect(test.Echo('wrong type')).rejects.toBeInstanceOf(Error);
  await expect(test.TakesList('wrong type')).rejects.toBeInstanceOf(Error);
  await expect(test.TakesList()).rejects.toBeInstanceOf(Error);
  await expect(test.Echo(new Variant('as', 'wrong type'))).rejects.toBeInstanceOf(Error);
});
07070100000041000081A4000000000000000000000001643934E900000A06000000000000000000000000000000000000003D00000000dbus-final-0.0.0+git3e43f60/test/integration/monitor.test.jsconst dbus = require('../../');
const Message = dbus.Message;
const {
  SIGNAL
} = dbus.MessageType;

const monitor = dbus.sessionBus();
const bus1 = dbus.sessionBus();
const bus2 = dbus.sessionBus();
const bus3 = dbus.sessionBus();

bus1.on('error', (err) => {
  console.log(`bus1 got unexpected connection error:\n${err.stack}`);
});
bus2.on('error', (err) => {
  console.log(`bus2 got unexpected connection error:\n${err.stack}`);
});
monitor.on('error', (err) => {
  console.log(`monitor bus got unexpected connection error:\n${err.stack}`);
});

beforeAll(async () => {
  const connect = [bus1, bus2, bus3, monitor].map((bus) => {
    return new Promise((resolve) => {
      bus.on('connect', resolve);
    });
  });

  await Promise.all(connect);

  await monitor.call(new Message({
    destination: 'org.freedesktop.DBus',
    path: '/org/freedesktop/DBus',
    interface: 'org.freedesktop.DBus.Monitoring',
    member: 'BecomeMonitor',
    signature: 'asu',
    body: [[`sender=${bus1.name}`, `sender=${bus2.name}`], 0]
  }));
});

afterAll(() => {
  bus1.disconnect();
  bus2.disconnect();
  bus3.disconnect();
  monitor.disconnect();
});

async function waitForMessage (bus) {
  return new Promise((resolve) => {
    bus.once('message', (msg) => {
      resolve(msg);
    });
  });
}

test('monitor a signal', async () => {
  const signal = Message.newSignal('/org/test/path', 'org.test.interface', 'SomeSignal', 's', ['a signal']);
  bus1.send(signal);
  const msg = await waitForMessage(monitor);
  expect(msg.type).toEqual(SIGNAL);
  expect(msg.sender).toEqual(bus1.name);
  expect(msg.serial).toEqual(signal.serial);
});

test('monitor a method call', async () => {
  const messages = [];
  const monitorHandler = function (message) {
    messages.push(message);
  };
  monitor.on('message', monitorHandler);

  const messageHandler = function (sent) {
    bus1.send(Message.newMethodReturn(sent, 's', ['got it']));
    return true;
  };

  bus1.addMethodHandler(messageHandler);

  await bus2.call(new Message({
    destination: bus1.name,
    path: '/org/test/path',
    interface: 'org.test.interface',
    member: 'TestMethod',
    signature: 's',
    body: ['hello']
  }));

  await bus3.call(new Message({
    destination: 'org.freedesktop.DBus',
    path: '/org/freedesktop/DBus',
    interface: 'org.freedesktop.DBus.Peer',
    member: 'Ping'
  }));

  expect(messages.length).toEqual(2);
  expect(messages[0].sender).toEqual(bus2.name);
  expect(messages[1].sender).toEqual(bus1.name);
  monitor.removeListener('message', monitorHandler);
});
07070100000042000081A4000000000000000000000001643934E900001B44000000000000000000000000000000000000004000000000dbus-final-0.0.0+git3e43f60/test/integration/properties.test.js// Test the server properties interface works correctly.

const dbus = require('../../');
const Variant = dbus.Variant;
const DBusError = dbus.DBusError;

const {
  Interface, property,
  ACCESS_READ, ACCESS_WRITE
} = dbus.interface;

const TEST_NAME = 'org.test.properties';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';
const USER_ERROR_IFACE = 'org.test.usererror';

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class UserErrorInterface extends Interface {
  @property({ signature: 's' })
  get UserErrorProperty () {
    throw new DBusError(`${TEST_IFACE}.UserError`, 'user error');
  }

  set UserErrorProperty (_what) {
    throw new DBusError(`${TEST_IFACE}.UserError`, 'user error');
  }
}

class TestInterface extends Interface {
  @property({ signature: 's' })
  SimpleProperty = 'foo';

  @property({ signature: 'v' })
  VariantProperty = new Variant('s', 'foo');

  @property({ signature: '(a{sv}sv)' })
  ComplicatedProperty = [
    {
      foo: new Variant('s', 'bar'),
      bar: new Variant('as', ['fiz', 'buz'])
    },
    'bat',
    new Variant('d', 53)
  ];

  _NotifyingProperty = 'foo';

  @property({ signature: 's' })
  get NotifyingProperty () {
    return this._NotifyingProperty;
  }

  set NotifyingProperty (value) {
    this._NotifyingProperty = value;
    Interface.emitPropertiesChanged(this, {
      NotifyingProperty: value
    }, ['invalid']);
  }

  @property({ signature: 's', access: ACCESS_READ })
  ReadOnly = 'only read';

  @property({ signature: 's', access: ACCESS_WRITE })
  WriteOnly = 'only write';
}

const testIface = new TestInterface(TEST_IFACE);
const userErrorIface = new UserErrorInterface(USER_ERROR_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
  bus.export(TEST_PATH, userErrorIface);
});

afterAll(() => {
  bus.disconnect();
});

test('the peer interface', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const peer = object.getInterface('org.freedesktop.DBus.Peer');
  expect(peer).toBeDefined();
  expect(peer.Ping).toBeDefined();
  let req = peer.Ping();
  await expect(req).resolves.toBeNull();
  req = peer.GetMachineId();
  await expect(req).resolves.toBeDefined();
});

test('simple property get and set', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);

  const test = object.getInterface(TEST_IFACE);
  expect(test).toBeDefined();
  const properties = object.getInterface('org.freedesktop.DBus.Properties');
  expect(properties).toBeDefined();

  // get and set a simple property
  let prop = await properties.Get(TEST_IFACE, 'SimpleProperty');
  expect(prop).toBeInstanceOf(Variant);
  expect(prop.signature).toEqual('s');
  expect(prop.value).toEqual('foo');
  expect(prop.value).toEqual(testIface.SimpleProperty);

  await properties.Set(TEST_IFACE, 'SimpleProperty', new Variant('s', 'bar'));

  prop = await properties.Get(TEST_IFACE, 'SimpleProperty');
  expect(prop).toBeInstanceOf(Variant);
  expect(prop.value).toEqual('bar');
  expect(prop.value).toEqual(testIface.SimpleProperty);

  // get and set a variant property
  prop = await properties.Get(TEST_IFACE, 'VariantProperty');
  expect(prop.value).toBeInstanceOf(Variant);
  expect(prop.value).toEqual(testIface.VariantProperty);

  await properties.Set(TEST_IFACE, 'VariantProperty', new Variant('v', new Variant('d', 53)));
  prop = await properties.Get(TEST_IFACE, 'VariantProperty');
  expect(prop).toBeInstanceOf(Variant);
  expect(prop.value).toEqual(new Variant('d', 53));
  expect(prop.value).toEqual(testIface.VariantProperty);

  // test get all properties
  const all = await properties.GetAll(TEST_IFACE);
  expect(all).toHaveProperty('SimpleProperty', new Variant('s', testIface.SimpleProperty));
  expect(all).toHaveProperty('VariantProperty', new Variant('v', testIface.VariantProperty));
});

test('complicated property get and set', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const properties = object.getInterface('org.freedesktop.DBus.Properties');
  let prop = await properties.Get(TEST_IFACE, 'ComplicatedProperty');
  expect(prop).toBeInstanceOf(Variant);
  expect(prop.value).toEqual(testIface.ComplicatedProperty);

  const updatedProp = [
    {
      oof: new Variant('s', 'rab'),
      rab: new Variant('as', ['zif', 'zub', 'zork']),
      kevin: new Variant('a{sv}', {
        foo: new Variant('s', 'bar')
      })
    },
    'tab',
    new Variant('d', 23)
  ];

  await properties.Set(TEST_IFACE, 'ComplicatedProperty', new Variant('(a{sv}sv)', updatedProp));
  prop = await properties.Get(TEST_IFACE, 'ComplicatedProperty');
  expect(prop).toBeInstanceOf(Variant);
  expect(prop.value).toEqual(testIface.ComplicatedProperty);
  expect(prop.value).toEqual(updatedProp);
});

test('properties changed signal', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const properties = object.getInterface('org.freedesktop.DBus.Properties');
  const onPropertiesChanged = jest.fn(() => null);
  properties.on('PropertiesChanged', onPropertiesChanged);

  await properties.Set(TEST_IFACE, 'NotifyingProperty', new Variant('s', 'bar'));
  const e = {
    NotifyingProperty: new Variant('s', 'bar')
  };
  expect(onPropertiesChanged).toHaveBeenCalledWith(TEST_IFACE, e, ['invalid']);
});

test('read and write access', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const properties = object.getInterface('org.freedesktop.DBus.Properties');

  let req = properties.Get(TEST_IFACE, 'WriteOnly');
  await expect(req).rejects.toBeInstanceOf(DBusError);

  req = properties.Set(TEST_IFACE, 'ReadOnly', new Variant('s', 'foo'));
  await expect(req).rejects.toBeInstanceOf(DBusError);
});

test('properties interface specific errors', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const properties = object.getInterface('org.freedesktop.DBus.Properties');

  let req = properties.Set('not.an.interface', 'ReadOnly', new Variant('s', 'foo'));
  await expect(req).rejects.toBeInstanceOf(DBusError);

  req = properties.Get(TEST_IFACE, 'NotAProperty');
  await expect(req).rejects.toBeInstanceOf(DBusError);

  req = properties.Set(TEST_IFACE, 'NotAProperty', new Variant('s', 'foo'));
  await expect(req).rejects.toBeInstanceOf(DBusError);

  req = properties.Set(TEST_IFACE, 'WriteOnly', new Variant('as', ['wrong', 'type']));
  await expect(req).rejects.toBeInstanceOf(DBusError);

  // user errors
  req = properties.Get(USER_ERROR_IFACE, 'UserErrorProperty');
  await expect(req).rejects.toBeInstanceOf(DBusError);

  req = properties.Set(USER_ERROR_IFACE, 'UserErrorProperty', new Variant('s', 'foo'));
  await expect(req).rejects.toBeInstanceOf(DBusError);

  req = properties.GetAll(USER_ERROR_IFACE);
  await expect(req).rejects.toBeInstanceOf(DBusError);
});
07070100000043000081A4000000000000000000000001643934E9000007FC000000000000000000000000000000000000004200000000dbus-final-0.0.0+git3e43f60/test/integration/request-name.test.jsconst dbus = require('../../');

const {
  Message
} = dbus;

const {
  PRIMARY_OWNER,
  IN_QUEUE,
  EXISTS,
  ALREADY_OWNER
} = dbus.RequestNameReply;

const {
  RELEASED,
  NON_EXISTENT,
  NOT_OWNER
} = dbus.ReleaseNameReply;

const {
  ALLOW_REPLACEMENT,
  REPLACE_EXISTING,
  DO_NOT_QUEUE
} = dbus.NameFlag;

const bus1 = dbus.sessionBus();
const bus2 = dbus.sessionBus();

bus1.on('error', (err) => {
  console.log(`bus1 got unexpected connection error:\n${err.stack}`);
});
bus2.on('error', (err) => {
  console.log(`bus2 got unexpected connection error:\n${err.stack}`);
});

beforeAll(async () => {
  const connect = [bus1, bus2].map((bus) => {
    return new Promise((resolve) => {
      bus.on('connect', resolve);
    });
  });

  await Promise.all(connect);
});

afterAll(() => {
  bus1.disconnect();
  bus2.disconnect();
});

async function getNameOwner (name) {
  const reply = await bus1.call(new Message({
    destination: 'org.freedesktop.DBus',
    path: '/org/freedesktop/DBus',
    interface: 'org.freedesktop.DBus',
    member: 'GetNameOwner',
    signature: 's',
    body: [name]
  }));

  return reply.body[0];
}

test('name requests', async () => {
  const testName = 'request.name.test';

  let reply = await bus1.requestName(testName);
  expect(reply).toEqual(PRIMARY_OWNER);
  reply = await bus1.requestName(testName);
  expect(reply).toEqual(ALREADY_OWNER);

  reply = await bus2.requestName(testName, ALLOW_REPLACEMENT);
  expect(reply).toEqual(IN_QUEUE);

  reply = await bus1.releaseName(testName);
  expect(reply).toEqual(RELEASED);

  reply = await bus1.releaseName('name.doesnt.exist');
  expect(reply).toEqual(NON_EXISTENT);

  reply = await bus1.releaseName(testName);
  expect(reply).toEqual(NOT_OWNER);

  const newOwner = await getNameOwner(testName);
  expect(newOwner).toEqual(bus2.name);

  reply = await bus1.requestName(testName, DO_NOT_QUEUE);
  expect(reply).toEqual(EXISTS);

  reply = await bus1.requestName(testName, DO_NOT_QUEUE | REPLACE_EXISTING);
  expect(reply).toEqual(PRIMARY_OWNER);
});
07070100000044000081A4000000000000000000000001643934E900000789000000000000000000000000000000000000004400000000dbus-final-0.0.0+git3e43f60/test/integration/service-errors.test.js// Test when services throw errors

const dbus = require('../../');
const Variant = dbus.Variant;
const DBusError = dbus.DBusError;

const {
  Interface, property, method
} = dbus.interface;

const TEST_NAME = 'org.test.service_errors';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class ErroringInterface extends Interface {
  @property({ signature: 's' })
  get ErrorProperty () {
    throw new Error('something went wrong');
  }

  set ErrorProperty (val) {
    throw new Error('something went wrong');
  }

  @property({ signature: 's' })
  WrongType = 55;

  @method({})
  ErrorMethod () {
    throw new Error('something went wrong');
  }

  @method({})
  WrongReturn () {
    return ['foo', 'bar'];
  }
}

const testIface = new ErroringInterface(TEST_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

test('when services throw errors they should be returned to the client', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const properties = object.getInterface('org.freedesktop.DBus.Properties');
  const iface = object.getInterface(TEST_IFACE);

  let req = iface.ErrorMethod();
  await expect(req).rejects.toThrow(DBusError);

  req = iface.WrongReturn();
  await expect(req).rejects.toThrow(DBusError);

  req = properties.GetAll(TEST_IFACE);
  await expect(req).rejects.toThrow(DBusError);

  req = properties.Get(TEST_IFACE, 'ErrorProperty');
  await expect(req).rejects.toThrow(DBusError);

  req = properties.Get(TEST_IFACE, 'WrongType');
  await expect(req).rejects.toThrow(DBusError);

  req = properties.Set(TEST_IFACE, 'ErrorProperty', new Variant('s', 'something'));
  await expect(req).rejects.toThrow(DBusError);
});
07070100000045000081A4000000000000000000000001643934E900000DB0000000000000000000000000000000000000004500000000dbus-final-0.0.0+git3e43f60/test/integration/service-options.test.js// Test service option features

const dbus = require('../../');
const Variant = dbus.Variant;
const DBusError = dbus.DBusError;

const {
  Interface, property, method, signal
} = dbus.interface;

const TEST_NAME = 'org.test.service_options';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class OptionsTestInterface extends Interface {
  @method({ disabled: true })
  DisabledMethod () {
  }

  @method({ name: 'SomeMethod', inSignature: 's', outSignature: 's' })
  methodNamedDifferently (what) {
    return what;
  }

  @signal({ name: 'RenamedSignal', signature: 's' })
  signalNamedDifferently (what) {
    return what;
  }

  @method({})
  EmitRenamedSignal () {
    this.signalNamedDifferently('hello');
  }

  @signal({ disabled: true, outSignature: 'd' })
  DisabledSignal (what) {
    return what;
  }

  @property({ name: 'SomeProperty', signature: 's' })
  propertyNamedDifferently = 'SomeProperty';

  @property({ disabled: true, signature: 's' })
  DisabledProperty = 'DisabledProperty';
}

const testIface = new OptionsTestInterface(TEST_IFACE);

beforeAll(async () => {
  await bus.requestName(TEST_NAME);
  bus.export(TEST_PATH, testIface);
});

afterAll(() => {
  bus.disconnect();
});

test('renamed and disabled property requests', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const properties = object.getInterface('org.freedesktop.DBus.Properties');

  let req = await properties.GetAll(TEST_IFACE);
  // this property was renamed
  expect(req).not.toHaveProperty('propertyNamedDifferently');
  // this property is disabled
  expect(req).not.toHaveProperty('DisabledProperty');
  // the renamed one should show up
  expect(req).toHaveProperty('SomeProperty');

  req = properties.Get(TEST_IFACE, 'propertyNamedDifferently');
  await expect(req).rejects.toThrow(DBusError);
  req = properties.Get(TEST_IFACE, 'DisabledProperty');
  await expect(req).rejects.toThrow(DBusError);
  req = properties.Get(TEST_IFACE, 'SomeProperty');
  await expect(req).resolves.toEqual(new Variant('s', testIface.propertyNamedDifferently));

  req = properties.Set(TEST_IFACE, 'propertyNamedDifferently', new Variant('s', testIface.propertyNamedDifferently));
  await expect(req).rejects.toThrow(DBusError);
  req = properties.Set(TEST_IFACE, 'DisabledProperty', new Variant('s', 'disabled'));
  await expect(req).rejects.toThrow(DBusError);
  req = properties.Set(TEST_IFACE, 'SomeProperty', new Variant('s', testIface.propertyNamedDifferently));
  await expect(req).resolves.toEqual(null);
});

test('renamed and disabled methods', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const iface = await object.getInterface(TEST_IFACE);

  expect(iface).not.toHaveProperty('DisabledMethod');
  expect(iface).not.toHaveProperty('methodNamedDifferently');
  expect(iface).toHaveProperty('SomeMethod');
  const testStr = 'what';
  const req = iface.SomeMethod(testStr);
  await expect(req).resolves.toEqual(testStr);
});

test('renamed and disabled signals', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const iface = await object.getInterface(TEST_IFACE);

  const onRenamedSignal = jest.fn(() => {});
  iface.on('RenamedSignal', onRenamedSignal);

  await iface.EmitRenamedSignal();

  expect(onRenamedSignal).toHaveBeenCalledWith('hello');
});
07070100000046000081A4000000000000000000000001643934E9000024C5000000000000000000000000000000000000003D00000000dbus-final-0.0.0+git3e43f60/test/integration/signals.test.js// Test that signals emit correctly

const dbus = require('../../');
const { waitForMessage } = require('../util');

const Variant = dbus.Variant;

const {
  Interface, method, signal
} = dbus.interface;

const TEST_NAME = 'org.test.signals';
const TEST_NAME2 = 'org.test.signals_name2';
const TEST_PATH = '/org/test/path';
const TEST_IFACE = 'org.test.iface';
const TEST_XML = `
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="org.freedesktop.DBus.Introspectable">
    <method name="Introspect">
      <arg name="data" direction="out" type="s"/>
    </method>
  </interface>
  <interface name="org.freedesktop.DBus.Peer">
    <method name="GetMachineId">
      <arg direction="out" name="machine_uuid" type="s"/>
    </method>
    <method name="Ping"/>
  </interface>
  <interface name="org.freedesktop.DBus.Properties">
    <method name="Get">
      <arg direction="in" type="s"/>
      <arg direction="in" type="s"/>
      <arg direction="out" type="v"/>
    </method>
    <method name="Set">
      <arg direction="in" type="s"/>
      <arg direction="in" type="s"/>
      <arg direction="in" type="v"/>
    </method>
    <method name="GetAll">
      <arg direction="in" type="s"/>
      <arg direction="out" type="a{sv}"/>
    </method>
    <signal name="PropertiesChanged">
      <arg type="s"/>
      <arg type="a{sv}"/>
      <arg type="as"/>
    </signal>
  </interface>
  <interface name="org.test.iface">
    <method name="EmitSignals"/>
    <signal name="HelloWorld">
      <arg type="s"/>
    </signal>
    <signal name="SignalMultiple">
      <arg type="s"/>
      <arg type="s"/>
    </signal>
    <signal name="SignalComplicated">
      <arg type="v"/>
    </signal>
  </interface>
</node>
`;

const bus = dbus.sessionBus();
bus.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});
const bus2 = dbus.sessionBus();
bus2.on('error', (err) => {
  console.log(`got unexpected connection error:\n${err.stack}`);
});

class SignalsInterface extends Interface {
  @signal({ signature: 's' })
  HelloWorld (value) {
    return value;
  }

  @signal({ signature: 'ss' })
  SignalMultiple () {
    return [
      'hello',
      'world'
    ];
  }

  // a really complicated variant
  complicated = new Variant('a{sv}', {
    foo: new Variant('s', 'bar'),
    bar: new Variant('d', 53),
    bat: new Variant('v', new Variant('as', ['foo', 'bar', 'bat'])),
    baz: new Variant('(doodoo)', [1, '/', '/', 1, '/', '/']),
    fiz: new Variant('(as(s(v)))', [
      ['one', 'two'],
      ['three', [
        new Variant('as', ['four', 'five'])]
      ]
    ]),
    buz: new Variant('av', [
      new Variant('as', ['foo']),
      new Variant('a{ss}', { foo: 'bar' }),
      new Variant('v', new Variant('(asas)', [['bar'], ['foo']])),
      new Variant('v', new Variant('v', new Variant('as', ['one', 'two']))),
      new Variant('a{ss}', { foo: 'bar' })
    ])
  });

  @signal({ signature: 'v' })
  SignalComplicated () {
    return this.complicated;
  }

  @method({ inSignature: '', outSignature: '' })
  EmitSignals () {
    this.HelloWorld('hello');
    this.SignalMultiple();
    this.SignalComplicated();
  }
}

const testIface = new SignalsInterface(TEST_IFACE);
const testIface2 = new SignalsInterface(TEST_IFACE);

async function createTestService(name) {
  const testBus = dbus.sessionBus();
  const testIface = new SignalsInterface(TEST_IFACE);

  await testBus.requestName(name);
  testBus.export(TEST_PATH, testIface);

  return [testBus, testIface];
}

beforeAll(async () => {
  await Promise.all([
    bus.requestName(TEST_NAME),
    bus2.requestName(TEST_NAME2)
  ]);
  bus.export(TEST_PATH, testIface);
  bus2.export(TEST_PATH, testIface2);
});

afterAll(() => {
  bus.disconnect();
  bus2.disconnect();
});

test('test that signals work correctly', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);

  const onHelloWorld = jest.fn();
  const onSignalMultiple = jest.fn();
  const onSignalMultiple2 = jest.fn();
  const onSignalComplicated = jest.fn();

  test.once('HelloWorld', onHelloWorld);
  test.on('SignalMultiple', onSignalMultiple);
  test.on('SignalMultiple', onSignalMultiple2);
  test.on('SignalComplicated', onSignalComplicated);

  await test.EmitSignals();

  expect(onHelloWorld).toHaveBeenCalledWith('hello');
  expect(onSignalMultiple).toHaveBeenCalledWith('hello', 'world');
  expect(onSignalMultiple2).toHaveBeenCalledWith('hello', 'world');
  expect(onSignalComplicated).toHaveBeenCalledWith(testIface.complicated);

  // removing the event listener on the interface should remove the event
  // listener on the bus as well
  expect(bus._signals.eventNames().length).toEqual(2);
  test.removeListener('SignalMultiple', onSignalMultiple);
  expect(bus._signals.eventNames().length).toEqual(2);

  // removing the listener on a signal should not remove them all
  onSignalMultiple2.mockClear();
  await test.EmitSignals();
  expect(onSignalMultiple2).toHaveBeenCalledWith('hello', 'world');

  test.removeListener('SignalMultiple', onSignalMultiple2);
  expect(bus._signals.eventNames().length).toEqual(1);
  test.removeListener('SignalComplicated', onSignalComplicated);
  expect(bus._signals.eventNames().length).toEqual(0);
});

test('signals dont get mixed up between names that define objects on the same path and interface', async () => {
  // Note that there is a really bad case where a single connection takes two
  // names and exports the same interfaces and paths on them. Then there is no
  // way to tell the signals apart from the names because the messages look
  // identical to us. All we get is the unique name of the sender and not the
  // well known name, and the well known name is what will be different. For
  // this reason, I am going to recommend that people only use one name per bus
  // connection until we can figure that out.
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const object2 = await bus.getProxyObject(TEST_NAME2, TEST_PATH);

  const test = object.getInterface(TEST_IFACE);
  const test2 = object2.getInterface(TEST_IFACE);

  const cb = jest.fn();
  const cb2 = jest.fn();

  test.on('HelloWorld', cb);
  test.on('SignalMultiple', cb);
  test.on('SignalComplicated', cb);

  test2.on('HelloWorld', cb2);
  test2.on('SignalMultiple', cb2);
  test2.on('SignalComplicated', cb2);

  await test.EmitSignals();

  expect(cb).toHaveBeenCalledTimes(3);
  expect(cb2).toHaveBeenCalledTimes(0);
});

test('regression #64: adding multiple listeners to a signal', async () => {
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);

  const cb = jest.fn();
  const cb2 = jest.fn();
  const cb3 = jest.fn();

  test.on('HelloWorld', cb);
  test.on('HelloWorld', cb2);
  test.on('HelloWorld', cb3);

  await test.EmitSignals();

  expect(cb).toHaveBeenCalledTimes(1);
  expect(cb2).toHaveBeenCalledTimes(1);
  expect(cb3).toHaveBeenCalledTimes(1);

  test.removeListener('HelloWorld', cb);
  test.removeListener('HelloWorld', cb2);

  await test.EmitSignals();

  expect(cb).toHaveBeenCalledTimes(1);
  expect(cb2).toHaveBeenCalledTimes(1);
  expect(cb3).toHaveBeenCalledTimes(2);

  test.removeListener('HelloWorld', cb3);

  await test.EmitSignals();

  expect(cb).toHaveBeenCalledTimes(1);
  expect(cb2).toHaveBeenCalledTimes(1);
  expect(cb3).toHaveBeenCalledTimes(2);
});

test('bug #86: signals dont get lost when no previous method calls have been made', async () => {
  // clear the name owners cache from previous tests
  bus._nameOwners = {};

  // when providing XML data, no introspection call is made
  const object = await bus.getProxyObject(TEST_NAME, TEST_PATH, TEST_XML);
  const test = object.getInterface(TEST_IFACE);
  const cb = jest.fn();

  test.on('HelloWorld', cb);
  test.on('SignalMultiple', cb);
  test.on('SignalComplicated', cb);

  // don't call EmitSignals through the proxy object
  testIface.EmitSignals();

  // allow signal handlers to run
  await new Promise(resolve => { setTimeout(resolve, 0); });

  expect(cb).toHaveBeenCalledTimes(3);
});

test('client continues receive signals from restarted DBus service', async () => {
  const clientBus = dbus.sessionBus();

  const testServiceName = 'local.test.signals';
  let [testBus] = await createTestService(testServiceName);

  const object = await clientBus.getProxyObject(testServiceName, TEST_PATH);
  const test = object.getInterface(TEST_IFACE);
  const cb = jest.fn();

  expect(clientBus._nameOwners[testServiceName]).toEqual(testBus.name);

  test.on('HelloWorld', cb);
  test.on('SignalMultiple', cb);
  test.on('SignalComplicated', cb);

  await test.EmitSignals();

  expect(cb).toHaveBeenCalledTimes(3);

  await testBus.releaseName(testServiceName);
  testBus.disconnect();

  await waitForMessage(clientBus, { member: 'NameOwnerChanged' });
  expect(clientBus._nameOwners[testServiceName]).toEqual('');

  [testBus] = await createTestService(testServiceName);

  await waitForMessage(clientBus, { member: 'NameOwnerChanged' });
  expect(clientBus._nameOwners[testServiceName]).toEqual(testBus.name);

  await test.EmitSignals();

  expect(cb).toHaveBeenCalledTimes(6);

  clientBus.disconnect();
  testBus.disconnect();
});
07070100000047000081A4000000000000000000000001643934E900000FE7000000000000000000000000000000000000003700000000dbus-final-0.0.0+git3e43f60/test/introspection.test.jsconst dbus = require('../');

const {
  Interface, property, method, signal, ACCESS_READ
} = dbus.interface;

const TEST_IFACE = 'org.test.iface';

class IntrospectionTestInterface extends Interface {
  @method({ disabled: true })
  DisabledMethod () {
  }

  @method({})
  NopMethod () {
  }

  @method({ name: 'RenamedMethod', inSignature: 'd', outSignature: 'd' })
  myRenamedMethod () {
    return 53;
  }

  @method({ inSignature: 'sd', outSignature: 'sd' })
  SomeMethod (str, d) {
    return [str, d];
  }

  @method({ inSignature: '', outSignature: '', noReply: true })
  NoReplyMethod () {

  }

  @method({ name: 'Overloaded', inSignature: 's', outSignature: 's' })
  overloaded1 (str) {
    return str;
  }

  @method({ name: 'Overloaded', inSignature: 'd', outSignature: 'd' })
  overloaded2 (what) {
    return what;
  }

  @signal({ name: 'RenamedSignal', signature: 's' })
  signalNamedDifferently (what) {
    return what;
  }

  @signal({ disabled: true, signature: 'd' })
  DisabledSignal (what) {
    return what;
  }

  @signal({ signature: 'os' })
  SomeSignal () {
    return '/foo/bar';
  }

  @property({ signature: 'd', access: ACCESS_READ })
  SomeProperty = 'foo';

  @property({ name: 'RenamedProperty', signature: 's' })
  propertyNamedDifferently = 'RenamedProperty';

  @property({ disabled: true, signature: 's' })
  DisabledProperty = 'DisabledProperty';
}

const testIface = new IntrospectionTestInterface(TEST_IFACE);

test('property xml introspection', () => {
  const getProperty = (name) => {
    const properties = testIface.$introspect().property;
    return properties.find((p) => {
      return p.$.name === name;
    });
  };

  let property = getProperty('SomeProperty');
  expect(property).toBeDefined();
  expect(property.$).toBeDefined();
  expect(property.$.type).toEqual('d');
  expect(property.$.access).toEqual('read');

  expect(getProperty('propertyNamedDifferently')).not.toBeDefined();
  expect(getProperty('DisabledProperty')).not.toBeDefined();

  property = getProperty('RenamedProperty');
  expect(property).toBeDefined();
  expect(property.$).toBeDefined();
  expect(property.$.type).toEqual('s');
  expect(property.$.access).toEqual('readwrite');
});

test('method xml introspection', () => {
  const getMethod = (name) => {
    const methods = testIface.$introspect().method;
    return methods.filter((m) => {
      return m.$.name === name;
    });
  };

  let method = getMethod('SomeMethod')[0];
  expect(method).toBeDefined();
  expect(method.arg).toBeInstanceOf(Array);
  expect(method.arg.length).toEqual(4);
  expect(method.arg[0]).toEqual({ $: { direction: 'in', type: 's' } });
  expect(method.arg[1]).toEqual({ $: { direction: 'in', type: 'd' } });
  expect(method.arg[2]).toEqual({ $: { direction: 'out', type: 's' } });
  expect(method.arg[3]).toEqual({ $: { direction: 'out', type: 'd' } });

  method = getMethod('RenamedMethod')[0];
  expect(method).toBeDefined();

  method = getMethod('DisabledMethod')[0];
  expect(method).not.toBeDefined();

  method = getMethod('NoReplyMethod')[0];
  expect(method).toBeDefined();
  expect(method.annotation).toBeInstanceOf(Array);
  expect(method.annotation[0]).toEqual({ $: { name: 'org.freedesktop.DBus.Method.NoReply', value: 'true' } });

  const overloaded = getMethod('Overloaded');
  expect(overloaded.length).toEqual(2);
});

test('signal xml introspection', () => {
  const getSignal = (name) => {
    const signals = testIface.$introspect().signal;
    return signals.filter((m) => {
      return m.$.name === name;
    });
  };

  let signal = getSignal('SomeSignal')[0];
  expect(signal).toBeDefined();
  expect(signal.arg).toBeInstanceOf(Array);
  expect(signal.arg.length).toEqual(2);
  expect(signal.arg[0]).toEqual({ $: { type: 'o' } });
  expect(signal.arg[1]).toEqual({ $: { type: 's' } });

  signal = getSignal('DisabledSignal')[0];
  expect(signal).not.toBeDefined();

  signal = getSignal('signalNamedDifferently')[0];
  expect(signal).not.toBeDefined();

  signal = getSignal('RenamedSignal');
  expect(signal).toBeDefined();
});
07070100000048000081A4000000000000000000000001643934E9000002C0000000000000000000000000000000000000002900000000dbus-final-0.0.0+git3e43f60/test/util.jsconst dbus = require('../');
const Message = dbus.Message;

async function ping (bus) {
  return bus.call(new Message({
    destination: 'org.freedesktop.DBus',
    path: '/org/freedesktop/DBus',
    interface: 'org.freedesktop.DBus.Peer',
    member: 'Ping'
  }));
}

/**
 * Waits for a message that passes a filter on a provided bus.
 */
function waitForMessage(bus, messageFilter) {
  return new Promise((resolve) => {
    bus.on('message', (message) => {
      const isMessageValid = Object.entries(messageFilter).every(
        ([key, value]) => message[key] === value
      );

      if (isMessageValid) {
        resolve();
      }
    });
  });
}

module.exports = {
  ping,
  waitForMessage,
};
07070100000049000081A4000000000000000000000001643934E900000742000000000000000000000000000000000000003400000000dbus-final-0.0.0+git3e43f60/test/validators.test.jsconst dbus = require('../');
const {
  isBusNameValid,
  isObjectPathValid,
  isInterfaceNameValid,
  isMemberNameValid
} = dbus.validators;

test('object path validators', () => {
  const validPaths = ['/', '/foo', '/foo/bar', '/foo/bar/bat'];
  for (const path of validPaths) {
    expect(isObjectPathValid(path)).toBe(true);
  }

  const invalidPaths = [undefined, {}, '', 'foo', 'foo/bar', '/foo/bar/', '/$/foo/bar', '/foo//bar', '/foo$bar/baz'];
  for (const path of invalidPaths) {
    expect(isObjectPathValid(path)).toBe(false);
  }
});

test('bus name validators', () => {
  const validNames = ['foo.bar', 'foo.bar.bat', '_foo._bar', 'foo.bar69', 'foo.bar-69', 'org.mpris.MediaPlayer2.google-play-desktop-player'];
  for (const name of validNames) {
    expect(isBusNameValid(name)).toBe(true);
  }

  const invalidNames = [undefined, {}, '', '5foo.bar', 'foo.6bar', '.foo.bar', 'bar..baz', '$foo.bar', 'foo$.ba$r'];
  for (const name of invalidNames) {
    expect(isBusNameValid(name)).toBe(false);
  }
});

test('interface name validators', () => {
  const validNames = ['foo.bar', 'foo.bar.bat', '_foo._bar', 'foo.bar69'];
  for (const name of validNames) {
    expect(isInterfaceNameValid(name)).toBe(true);
  }

  const invalidNames = [undefined, {}, '', '5foo.bar', 'foo.6bar', '.foo.bar', 'bar..baz', '$foo.bar', 'foo$.ba$r', 'org.mpris.MediaPlayer2.google-play-desktop-player'];
  for (const name of invalidNames) {
    expect(isInterfaceNameValid(name)).toBe(false);
  }
});

test('member name validators', () => {
  const validMembers = ['foo', 'FooBar', 'Bat_Baz69'];
  for (const member of validMembers) {
    expect(isMemberNameValid(member)).toBe(true);
  }

  const invalidMembers = [undefined, {}, '', 'foo.bar', '5foo', 'foo$bar'];
  for (const member of invalidMembers) {
    expect(isMemberNameValid(member)).toBe(false);
  }
});
0707010000004A000081A4000000000000000000000001643934E900001439000000000000000000000000000000000000002700000000dbus-final-0.0.0+git3e43f60/types.d.tsdeclare module 'dbus-final' {
    import { EventEmitter } from "events";

    export type ObjectPath = string;
    export type PropertyAccess = "read" | "write" | "readwrite";

    export enum MessageType {
        METHOD_CALL,
        METHOD_RETURN,
        ERROR,
        SIGNAL,
    }

    export enum MessageFlag {
        NO_REPLY_EXPECTED,
        NO_AUTO_START,
    }


    export namespace interface {
        export const ACCESS_READ = 'read';
        export const ACCESS_WRITE = 'write';
        export const ACCESS_READWRITE = 'readwrite';

        export interface PropertyOptions {
            signature: string;
            access?: PropertyAccess;
            name?: string;
            disabled?: boolean;
        }
        export interface MethodOptions {
            inSignature?: string;
            outSignature?: string;
            name?: string;
            disabled?: boolean;
            noReply?: boolean;
        }
        export interface SignalOptions {
            signature: string;
            name?: string;
            disabled?: boolean;
        }

        export class Interface extends EventEmitter {
            constructor(name: string);
            static configureMembers(members: { properties?: { [key: string]: PropertyOptions }, methods?: { [key: string]: MethodOptions }, signals?: { [key: string]: SignalOptions } }): void;
            static emitPropertiesChanged(interface: Interface, changedProperties: { [key: string]: any }, invalidatedProperties: string[]): void
        }
        export function property(opts: PropertyOptions): PropertyDecorator;
        export function method(opts: MethodOptions): MethodDecorator;
        export function signal(opts: SignalOptions): MethodDecorator;
    }
    export class Variant<T = any> {
        signature: string;
        value: T;
        constructor();
        constructor(signatur: string, value: T);
    }
    export class DBusError extends Error {
        type: string;
        text: string;
        reply?: any;
        constructor(type: string, text: string, reply?: any);
    }

    export interface MessageLike {
        type?: MessageType;
        serial?: number | null;
        path?: string;
        interface?: string;
        member?: string;
        errorName?: string;
        replySerial?: string;
        destination?: string;
        sender?: string;
        signature?: string;
        body?: any[];
        flags?: MessageFlag;
    }
    export class Message {
        type: MessageType;
        serial: number | null;
        path: string;
        interface: string;
        member: string;
        errorName: string;
        replySerial: string;
        destination: string;
        sender: string;
        signature: string;
        body: any[];
        flags: MessageFlag;

        constructor(msg: MessageLike);
        static newError(msg: string, errorName: string, errorText?: string): Message;
        static newMethodReturn(msg: Message, signature?: string, body?: any[]): Message;
        static newSignal(path: string, iface: string, name: string, signature?: string, body?: any[]): Message;
    }

    export class NameFlag {
        static ALLOW_REPLACEMENT: number;
        static REPLACE_EXISTING: number;
        static DO_NOT_QUEUE: number;
    }

    export class RequestNameReply {
        static PRIMARY_OWNER: number;
        static IN_QUEUE: number;
        static EXISTS: number;
        static ALREADY_OWNER: number;
    }

    export class MessageBus extends EventEmitter {
        getProxyObject(name: string, path: string, xml?: string): Promise<ProxyObject>;
        disconnect(): void;

        export(path: ObjectPath, interface: interface.Interface): void;
        unexport(path: ObjectPath, interface: interface.Interface): void;

        requestName(name: string, flags: number): Promise<number>;
        releaseName(name: string): Promise<number>;

        newSerial(): number;
        addMethodHandler(handler: Function): void;
        removeMethodHandler(handler: Function): void;
        call(msg: Message): Promise<Message | null>;
        send(msg: Message): void;

        on(event: 'connect', listener: () => void): this;
        on(event: 'message', listener: (msg: Message) => void): this
        on(event: 'error', listener: (err: any) => void): this
    }
    export interface ProxyObject {
        bus: MessageBus;
        readonly name: string;
        readonly path: ObjectPath;
        nodes: ObjectPath[];
        interfaces: { [name: string]: ClientInterface };

        getInterface(name: string): ClientInterface;
        getInterface<T extends ClientInterface>(name: string): T;
    }
    export interface ClientInterface extends EventEmitter {
        [name: string]: Function;
    }

    export type AuthMethod = 'EXTERNAL' | 'DBUS_COOKIE_SHA1' | 'ANONYMOUS';

    export interface SystemBusOptions {
        negotiateUnixFd?: boolean;
    }

    export interface SessionBusOptions {
        authMethods?: AuthMethod[];
        busAddress?: string;
    }

    export function systemBus(options?: SystemBusOptions): MessageBus;
    export function sessionBus(options?: SessionBusOptions): MessageBus;
}
07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!1017 blocks
openSUSE Build Service is sponsored by