diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 0cb901f88..000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - node: true, - es6: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - project: "./tsconfig.json" - }, - plugins: [ - "@typescript-eslint" - ], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - ], - rules: { - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-var-requires": "error", - "quotes": "off", - "@typescript-eslint/quotes": [ - "error", - "double", - { - "avoidEscape": true, - "allowTemplateLiterals": true - } - ], - "max-statements-per-line": [ - "error", - { - "max": 1 - } - ] - }, -} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4621c33e5..000000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -coverage -.vscode/* -!.vscode/launch.json - -docker/examples/delivery -test/integration/screenshots -docs -dist diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index b1836bb00..000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "trailingComma":"none", - "tabWidth": 2, - "semi": true, - "singleQuote": false, - "printWidth": 150 -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index c683588f3..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:8000/examples/index.html", - "webRoot": "${workspaceFolder}", - "preLaunchTask": "tsc: build - tsconfig.json", - "outFiles": ["${workspaceFolder}/dist/**/*.js"] - } - ] -} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index dd66d395e..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,4 +0,0 @@ -# [v1.0.0](https://github.com/MyScript/iinkJS/tree/v1.0.0) - -## Features -- migration javascript to typescript [link](https://github.com/MyScript/iinkJS) \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 18453c66f..000000000 --- a/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -Copyright MyScript. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index b9757156f..000000000 --- a/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# iinkTS - -[![npm version](https://badge.fury.io/js/iink-ts.svg)](https://badge.fury.io/js/iink-ts) -[![Examples](https://img.shields.io/badge/Link%20to-examples-blue.svg)](https://myscript.github.io/iinkTS/examples/) -[![Documentation](https://img.shields.io/badge/Link%20to-documentation-green.svg)](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/) - -> The fastest way to integrate rich **handwriting** features in your webapp. - -
- -
- -iinkTS is a JavaScript library that can be used in every web application to bring handwriting recognition. - -It integrates all you need: - -* Signal capture for all devices, -* Digital ink rendering, -* Link to MyScript Cloud to bring handwriting recognition. - -## Table of contents - -* [Features](https://github.com/MyScript/iinkTS#features) -* [Requirements](https://github.com/MyScript/iinkTS#requirements) -* [Installation](https://github.com/MyScript/iinkTS#installation) -* [Usage](https://github.com/MyScript/iinkTS#usage) -* [Documentation](https://github.com/MyScript/iinkTS#documentation) -* [Development](https://github.com/MyScript/iinkTS#development) -* [Support](https://github.com/MyScript/iinkTS#getting-support ) -* [Feedback](https://github.com/MyScript/iinkTS#sharing-your-feedback) -* [Contributing](https://github.com/MyScript/iinkTS#contributing) - -## Features - -* Text and Math support, -* Easy to integrate, -* Digital ink capture and rendering, -* Rich editing gestures, -* Import and export content, -* Styling, -* Typeset support, -* More than 200 mathematical symbols supported, -* 72 supported languages. - -You can discover all the features on our Developer website for [Text](https://developer.myscript.com/features/text) and [Math](https://developer.myscript.com/features/math). - -## Requirements - -1. Have [npm](https://www.npmjs.com/get-npm), [yarn](https://yarnpkg.com/en/docs/install). -2. Have a MyScript developer account. You can create one [here](https://developer.myscript.com/support/account/registering-myscript-cloud/). -3. Get your keys and the free monthly quota to access MyScript Cloud at [developer.myscript.com](https://developer.myscript.com/getting-started/web) - -## Installation - -iinkTS can be installed with the well known package managers `npm`, `yarn`. - -If you want to use `npm` or `yarn` you first have to init a project (or use an existing one). - -```shell -npm init -OR -yarn init -``` - -You can then install iinkTS and use it as showed in the [Usage](https://github.com/MyScript/iinkTS#usage) section. - -```shell -npm install iink-ts -OR -yarn add iink-ts -``` - -## Usage - -1. Create an `index.html` file in the same directory. - -2. Add the following lines in the `head` section of your file to use iinkTS and the css : -```html - -``` - -3. Still in the `head` section, add a `style` and specify the height and the width of your editor: -```html - -``` - -4. In the `body` tag, create a `div` tag that will contain the editing area: -```html -
-``` - -5. In JavaScript and within a ` - - - -
- - - -``` - -7. Open `index.html` in your browser or serve your folder content using any web server. - -You can find this guide, and a more complete example on the [MyScript Developer website](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/). - -## Documentation - -You can find a complete documentation with the following sections on our Developer website: - -* **Get Started**: [how to use iinkTS with a full example](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/get-started/), -* **Editing**: [how to interact with content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/editing/), -* **Conversion**: [how to convert your handwritten content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/conversion/), -* **Import and Export**: [how to import and export your content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/import-and-export/), -* **Styling**: [how to style content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/styling/). - -As well as a global [Configuration page](https://developer.myscript.com/docs/interactive-ink/latest/reference/web/configuration/). - -We also provide a complete [API Reference](https://myscript.github.io/iinkTS/docs/). - -## Development - -Instructions to help you build the project and develop are available in the [SETUP.md](https://github.com/MyScript/iinkTS/blob/master/SETUP.md) file. - - -## Getting support - -You can get support and ask your questions on the [dedicated section](https://developer-support.myscript.com/support/discussions/forums/16000096760) of MyScript Developer website. - -## Sharing your feedback ? - -Made a cool app with iinkTS? We would love to hear about you! -We’re planning to showcase apps using it so let us know by sending a quick mail to [myapp@myscript.com](mailto://myapp@myscript.com). - -## Contributing - -We welcome your contributions: if you would like to extend iinkTS for your needs, feel free to fork it! - -Please take a look at our [contributing](https://github.com/MyScript/iinkTS/blob/master/CONTRIBUTING.md) guidelines before submitting your pull request. - -## License -This library is licensed under the [Apache 2.0](http://opensource.org/licenses/Apache-2.0). diff --git a/config/rollup.config.build.js b/config/rollup.config.build.js deleted file mode 100644 index cf8179e87..000000000 --- a/config/rollup.config.build.js +++ /dev/null @@ -1,3 +0,0 @@ -import config from "./rollup.config" - -export default config diff --git a/config/rollup.config.dev.js b/config/rollup.config.dev.js deleted file mode 100644 index b75e24fae..000000000 --- a/config/rollup.config.dev.js +++ /dev/null @@ -1,29 +0,0 @@ -import serve from "rollup-plugin-serve" -import livereload from "rollup-plugin-livereload" -import config from "./rollup.config" - -config[0].plugins.push( - serve({ - open: true, - openPage: "/examples/index.html", - verbose: true, - contentBase: "", - host: "localhost", - port: 8000, - headers: { - "Access-Control-Allow-Origin": "*" - } - }), - livereload({ - watch: [ - "dist", - "examples" - ] - }) -) - -config.watch = { - include: "src/**" -} - -export default config diff --git a/config/rollup.config.js b/config/rollup.config.js deleted file mode 100644 index ad4db9ea4..000000000 --- a/config/rollup.config.js +++ /dev/null @@ -1,49 +0,0 @@ -import typescript from "rollup-plugin-typescript2" -import { terser } from "rollup-plugin-terser" -import resolve from "@rollup/plugin-node-resolve" -import postcss from "rollup-plugin-postcss" -import dts from "rollup-plugin-dts" -import commonjs from "rollup-plugin-commonjs" - -export default [ - { - input: "src/iink.ts", - output: [ - { - name: "iink", - file: "dist/iink.min.js", - format: "umd", - exports: "named", - }, - { - file: "./dist/iink.esm.js", - format: "esm", - }, - ], - plugins: [ - commonjs({ - include: ["node_modules/json-css/**", "node_modules/crypto-js/**"], - }), - resolve(), - typescript(), - terser({ - keep_fnames: true, - compress: true, - }), - postcss(), - ], - }, - { - input: "src/iink.ts", - plugins: [ - dts(), - postcss({ - inject: false - }), - ], - output: { - file: `dist/iink.d.ts`, - format: "es", - } - } -] diff --git a/dist/iink.d.ts b/dist/iink.d.ts new file mode 100644 index 000000000..1c39536f9 --- /dev/null +++ b/dist/iink.d.ts @@ -0,0 +1,1511 @@ +type TConvertConfiguration = { + convertOnDoubleTap: boolean +} + +type TEraserConfiguration = { + "erase-precisely": boolean +} + +type TMarginConfiguration = { + bottom: number + left: number + right: number + top: number +} + +type TTextGuidesConfiguration = { + enable: boolean +} + +type TTextConfConfiguration = { + customResources?: string[] + customLexicon?: string[] + addLKText?: boolean +} + +type TTextConfiguration = { + text?: boolean + mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[] + margin: TMarginConfiguration + guides?: TTextGuidesConfiguration + configuration?: TTextConfConfiguration + eraser?: TEraserConfiguration +} + +type TDiagramConvertConfiguration = { + edge?: boolean + node?: boolean + text?: boolean + "match-text-size"?: boolean +} + +type TDiagramConfiguration = { + mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[] + "enable-sub-blocks"?: boolean + text?: TTextConfConfiguration + convert?: TDiagramConvertConfiguration + "session-time"?: number + eraser?: TEraserConfiguration +} + +type TImageViewportConfiguration = { + x: number + y: number + width: number + height: number +} + +type TImageConfiguration = { + guides: boolean + viewport: TImageViewportConfiguration +} + +type TJiixConfiguration = { + "bounding-box"?: boolean + strokes: boolean + text?: { + chars: boolean + words: boolean + } + style?: boolean +} + +type TMathMLFlavor = { + name: string +} + +type TMathMLExport = { + flavor: TMathMLFlavor +} + +type TExportConfiguration$1 = { + "image-resolution"?: number + image?: TImageConfiguration + jiix?: TJiixConfiguration + mathml?: TMathMLExport +} + +type TRoundingMode = "half up" | "truncate" + +type TAngleUnit = "deg" | "rad" + +type TSolverOptions = "algebraic" | "numeric" + +type TSolverConfiguration = { + enable?: boolean + "fractional-part-digits"?: number + "decimal-separator"?: string + "rounding-mode"?: TRoundingMode + "angle-unit"?: TAngleUnit + options?: TSolverOptions +} + +type TUndoRedoMode = "stroke" | "session" + +type TMathUndoRedoConfiguration = { + mode: TUndoRedoMode +} + +type TMathConfiguration = { + mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[] + solver?: TSolverConfiguration + margin: TMarginConfiguration + "undo-redo"?: TMathUndoRedoConfiguration + customGrammar?: string + customGrammarId?: string + customGrammarContent?: string + eraser?: TEraserConfiguration + "session-time"?: number + "recognition-timeout"?: number +} + +type TRawContentConfiguration = { + text?: TTextConfConfiguration + "session-time"?: number + recognition?: TRecognitionConfiguration + eraser?: TEraserConfiguration +} + +type TEventConfiguration = { + processDelay: number +} + +type TListenerConfiguration = { + capture: boolean + passive: boolean +} + +type TGrabberConfiguration = { + listenerOptions: TListenerConfiguration + xyFloatPrecision: number + timestampFloatPrecision: number +} + +type TDebugConfiguration = { + "draw-text-boxes": boolean + "draw-image-boxes": boolean +} + +type TRecognitionRendererConfiguration = { + debug: TDebugConfiguration +} + +type TRecognitionType = "TEXT" | "MATH" | "DIAGRAM" | "Raw Content" + +type TConverstionState = "DIGITAL_EDIT" | "HANDWRITING" + +type TRecognitionConfiguration$1 = { + convert?: TConvertConfiguration + type: TRecognitionType + alwaysConnected: boolean + lang: string + math: TMathConfiguration + text: TTextConfiguration + diagram: TDiagramConfiguration + renderer: TRecognitionRendererConfiguration + export: TExportConfiguration$1 + "raw-content": TRawContentConfiguration + gesture: TGesture +} + +type TRecognitionConfigurationClient = { + convert?: TConvertConfiguration + type?: TRecognitionType + alwaysConnected?: boolean + lang?: string + math?: TMathConfiguration + text?: TTextConfiguration + diagram?: TDiagramConfiguration + renderer?: TRecognitionRendererConfiguration + export?: TExportConfiguration$1 + "raw-content"?: TRawContentConfiguration + gesture?: { enable: boolean } +} + +type TGuidesConfiguration = { + enable: boolean + gap: numnber +} + +type TSmartGuidesConfiguration = { + enable: boolean + fadeOut: { + enable: boolean + duration: number + } +} + +type TRenderingConfiguration = { + minHeight: number + minWidth: number + smartGuide: TSmartGuidesConfiguration + guides: TGuidesConfiguration +} + +type TProtocol = "WEBSOCKET" | "REST" + +type TSchene = "https" | "http" + +type TServerConfiguration = { + protocol: TProtocol, + scheme: TSchene, + host: string + applicationKey: string + hmacKey: string + version: string + useWindowLocation?: boolean + websocket: { + pingEnabled: boolean + pingDelay: number + maxPingLostCount: number + autoReconnect: boolean + maxRetryCount: number + fileChunkSize: number + } +} + +type TServerConfigurationClient = { + protocol?: TProtocol, + scheme?: TSchene, + host?: string + applicationKey?: string + hmacKey?: string + version?: string + useWindowLocation?: boolean + websocket?: { + pingEnabled?: boolean + pingDelay?: number + maxPingLostCount?: number + autoReconnect?: boolean + maxRetryCount?: number + fileChunkSize?: number + } +} + +/** + * Configure when the action is triggered. + * POINTER_UP : Action is triggered on every PenUP. + * This is the recommended mode for CDK V3 WebSocket recognitions. + * QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. + * The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. + * This is the recommended mode for all REST discoveries. + * DEMAND : Action is triggered on external demande + */ + type TTriggerConfiguration = { + exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND" + exportContentDelay: number + resizeTriggerDelay: number +} + +type TUndoRedoConfiguration = { + maxStackSize: number +} + +type TConfiguration = { + server: TServerConfiguration + recognition: TRecognitionConfiguration$1 + grabber: TGrabberConfiguration + rendering: TRenderingConfiguration + triggers: TTriggerConfiguration + events: TEventConfiguration + "undo-redo": TUndoRedoConfiguration +} + +type TConfigurationClient = { + server?: TServerConfigurationClient + recognition?: TRecognitionConfigurationClient + grabber?: TGrabberConfiguration + rendering?: TRenderingConfiguration + triggers?: TTriggerConfiguration + events?: TEventConfiguration + "undo-redo"?: TUndoRedoConfiguration +} + +/** + * @group Logger + */ +declare const enum LoggerLevel { + DEBUG = "1", + INFO = "2", + WARN = "3", + ERROR = "4" +} +/** + * @group Logger + */ +declare const enum LoggerClass { + EDITOR = "EDITOR", + RECOGNIZER = "RECOGNIZER", + GRABBER = "GRABBER", + BEHAVIORS = "BEHAVIORS", + CONFIGURATION = "CONFIGURATION", + PUBLIC_EVENT = "PUBLIC_EVENT", + MODEL = "MODEL", + RENDERER = "RENDERER", + SMARTGUIDE = "SMARTGUIDE", + STYLEMANAGER = "STYLEMANAGER", + UNDOREDO_MANAGER = "UNDOREDO_MANAGER", + STROKE = "STROKE", + INTERNALEVENT = "INTERNALEVENT" +} +type TLoggerConfiguration = { + [key in keyof typeof LoggerClass]: LoggerLevel; +}; + +type TPoint = { + x: number; + y: number; +}; +type TPointer = TPoint & { + t: number; + p: number; +}; + +interface IGrabber { + attach(domElement?: HTMLElement): void + + detach(domElement?: HTMLElement): void + + onPointerDown(evt: PointerEvent, point: TPointer): void + + onPointerMove(evt: PointerEvent, point: TPointer): void + + onPointerUp(evt: PointerEvent, point: TPointer): void +} + +/** + * @typedef {Object} PenStyle + * @property {String} color=#000000 Color (supported formats rgb() rgba() hsl() hsla() #rgb #rgba #rrggbb #rrggbbaa) + * @property {String} -myscript-pen-width=1 Width of strokes and primitives in mm (no other unit is supported yet) + * @property {String} -myscript-pen-fill-style=none + * @property {String} -myscript-pen-fill-color=#FFFFFF00 Color filled inside the area delimited by strokes and primitives + */ +type TPenStyle = { + color?: string + width?: number + "-myscript-pen-width"?: number + "-myscript-pen-fill-style"?: string + "-myscript-pen-fill-color"?: string +} + +type TSymbol = { + elementType?: string + type: string + style: TPenStyle +} + +type TStrokeJSON = { + id: string + pointerType: string + x: number[] + y: number[] + t: number[] + p: number[] +} + +type TStroke = TSymbol & { + id: string + pointerId: number + pointerType: string + pointers: TPointer[] + length: number +} + +type TRecognitionPositions = { + lastSentPosition: number + lastReceivedPosition: number +} + +type TWordExport = { + id?: string + label: string, + candidates?: string[] +} + +type TJIIXExport = { + type: string, + id: string, + label: string, + version: string, + words: TWordExport[] +} + +/** + * List all supported MIME types for export. + * Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} + */ +type TExport = { + /** @hidden */ + [key: string]: TJIIXExport | string | Blob + /** + * vnd.myscript.jiix is used for text and raw-content exports + */ + "application/vnd.myscript.jiix"?: TJIIXExport + /** + * text/plain is only use for text export + */ + "text/plain"? : string + /** + * x-latex is only use for math export + * @see {@link https://katex.org/docs/browser.html | katex} to render + */ + "application/x-latex"?: string + /** + * mathml+xml is only use for math export + * @see {@link https://www.w3.org/Math/whatIsMathML.html | Mathematical Markup Language} + */ + "application/mathml+xml"?: string + /** + * svg+xml is only use for diagram export + */ + "image/svg+xml"?: string + /** + * vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob | Blob} + */ + "application/vnd.openxmlformats-officedocument.presentationml.presentation"?: Blob +} + +interface IModel +{ + readonly creationTime: number + modificationDate: number + currentStroke?: TStroke + positions: TRecognitionPositions + rawStrokes: TStroke[] + selectedStrokes: TStroke[] + converts?: TExport + exports?: TExport + width: number + height: number + idle: boolean + + mergeExport(exports: TExport) + mergeConvert(converts: TExport) + + addPoint(stroke: TStroke, point: TPointer): void + addStroke(stroke: TStroke): void + extractUnsentStrokes(): TStroke[] + + initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi: number = 96): void + appendToCurrentStroke(point: TPointer): void + endCurrentStroke(point: TPointer): void + + resetSelectedStrokes(): void + appendSelectedStrokesFromPoint(point: TPoint): void + + removeStroke(id: string): void + updateStroke(updatedStroke: TStroke): void + removeStrokesFromPoint(point: TPoint): string[] + + updatePositionSent(position: number = this.model.rawStrokes.length - 1): void + updatePositionReceived(): void + + getClone(): IModel + + clear(): void +} + +type TMathTheme = { + "font-family": string +} + +type TMathSolvedTheme = { + "font-family": string + color: string +} + +type TTextTheme = { + "font-family": string, + "font-size": number +} + +type TTheme = { + ink: TPenStyle + ".math": TMathTheme + ".math-solved": TMathSolvedTheme + ".text": TTextTheme + [key: string]: unknown +} + +interface IRecognizer { + export(model: IModel, mimeTypes?: string[]): Promise + resize(model: IModel): Promise + import?(model: IModel, data: Blob, mimeType?: string): Promise +} + +type TUndoRedoContext = { + canUndo: boolean + canRedo: boolean + empty: boolean + stackIndex: number + possibleUndoCount: number + stack: IModel[] +} + +declare class StyleManager { + #private; + constructor(penStyle?: TPenStyle, theme?: TTheme); + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(style?: TPenStyle): void; + get theme(): TTheme; + setTheme(theme?: TTheme): void; + get penStyleClasses(): string; + setPenStyleClasses(penStyleClass?: string): void; +} + +type TBehaviorOptions = { + configuration: TConfiguration + behaviors?: { + grabber?: IGrabber + recognizer?: IRecognizer + } + penStyle?: TPenStyle + theme?: TTheme + logger?: TLoggerConfiguration +} + +interface IBehaviors +{ + name: string + grabber: IGrabber + recognizer: IRecognizer + context: TUndoRedoContext + options: TBehaviorOptions + styleManager: StyleManager + intention: Intention + #configuration: TConfiguration + + get currentPenStyle(): TPenStyle + + get model(): IModel + + get penStyle(): TPenStyle + setPenStyle(penStyle?: TPenStyle) + + get penStyleClasses(): string + setPenStyleClasses(penStyleClasses?: string) + + get theme(): TTheme + setTheme(theme?: TTheme) + + get configuration(): TConfiguration + set configuration(conf: TConfiguration) + + async init: (element: HTMLElement) => Promise + async export(mimeTypes?: string[]): Promise + async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise + async resize(height: number, width: number): Promise + async undo(): Promise + async redo(): Promise + + async waitForIdle?(): Promise + async importPointEvents?(strokes: TStroke[]): Promise + async import?(data: Blob, mimeType?: string): Promise + + async clear(): Promise + + async destroy(): Promise +} + +/** + * @group Error + * @remarks List all errors generated by the backend with their descriptions + */ +declare const Error$1: { + readonly NO_ACTIVITY: "Session closed due to no activity."; + readonly WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey."; + readonly TOO_OLD: "Session is too old. Max Session Duration Reached."; + readonly UNKNOW: "An unknown error has occurred."; + readonly ABNORMAL_CLOSURE: "MyScript recognition server is not reachable."; + readonly CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity."; + readonly GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection."; + readonly PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error."; + readonly UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)"; + readonly INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message)."; + readonly POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy."; + readonly MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large."; + readonly INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request."; + readonly SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting."; + readonly TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients."; + readonly BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server."; + readonly TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake"; +}; +/** + * @event + * @remarks Lists all events that can be listened to on the editor or DOM element + */ +declare const EventType: { + /** + * @event + * event emitted when history has changed i.e. the context of undo-redo + */ + readonly CHANGED: "changed"; + /** + * @event + * event emitted when clearing is complete + */ + readonly CLEARED: "cleared"; + /** + * @event + * event emitted after the conversion is complete + */ + readonly CONVERTED: "converted"; + /** + * @event + * event emitted when the editor encounters an error + */ + readonly ERROR: "error"; + /** + * @event + * event emitted on click on pointer events + */ + readonly POINTEREVENTS: "pointer_events"; + /** + * @event + * event emitted after the end of the export + */ + readonly EXPORTED: "exported"; + /** + * @event + * event emitted after the end of the import + */ + readonly IMPORTED: "imported"; + /** + * @event + * event emitted when the server is idle after a job + */ + readonly IDLE: "idle"; + /** + * @event + * event emitted after full editor initialization + */ + readonly LOADED: "loaded"; +}; +/** + * @event + * @internal + * @remarks Lists all internal library events + */ +declare const InternalEventType: { + readonly SVG_PATCH: "internal_svg_patch"; + readonly EXPORTED: "internal_exported"; + readonly CLEAR_MESSAGE: "internal_clear_message"; + readonly ERROR: "internal_error"; + readonly NOTIF: "internal_notif"; + readonly IMPORT_JIIX: "internal_import_jiix"; + readonly CONVERT: "internal_convert"; + readonly CLEAR: "internal_clear"; + readonly CONTEXT_CHANGE: "internal_context_change"; + readonly IDLE: "internal_idle"; + readonly WS_CLOSED: "internal_websocket_closed"; +}; +/** + * @group Export + * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} + */ +declare const enum ExportType { + JIIX = "application/vnd.myscript.jiix", + TEXT = "text/plain", + LATEX = "application/x-latex", + MATHML = "application/mathml+xml", + SVG = "image/svg+xml", + OFFICE_DOCUMENT = "application/vnd.openxmlformats-officedocument.presentationml.presentation" +} +/** + * @group Editor + * @remarks List the possibilities of interactions + */ +declare const enum Intention$1 { + Write = "write", + Erase = "erase" +} + +declare const Constants_EventType: typeof EventType; +declare const Constants_InternalEventType: typeof InternalEventType; +type Constants_ExportType = ExportType; +declare const Constants_ExportType: typeof ExportType; +type Constants_LoggerClass = LoggerClass; +declare const Constants_LoggerClass: typeof LoggerClass; +type Constants_LoggerLevel = LoggerLevel; +declare const Constants_LoggerLevel: typeof LoggerLevel; +declare namespace Constants { + export { + Error$1 as Error, + Constants_EventType as EventType, + Constants_InternalEventType as InternalEventType, + Constants_ExportType as ExportType, + Intention$1 as Intention, + Constants_LoggerClass as LoggerClass, + Constants_LoggerLevel as LoggerLevel, + }; +} + +declare class PublicEvent extends EventTarget { + #private; + private constructor(); + static getInstance(): PublicEvent; + setElement(el: HTMLElement): void; + emitLoaded(): void; + emitExported(exports: TExport): void; + emitChanged(undoRedoContext: TUndoRedoContext): void; + emitIdle(idle: boolean): void; + emitCleared(model?: IModel): void; + emitConverted(exports: TExport): void; + emitImported(exports: TExport): void; +} + +type TRestPostConfiguration = { + lang: string, + diagram?: TDiagramConfiguration, + math?: TMathConfiguration, + "raw-content"?: TRawContentConfiguration, + text?: TTextConfiguration, + export: TExportConfiguration +} + +type TWebSocketEvent = { + type: string + [key: string]: unknown +} + +type TUpdatePatchType = "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE" + +type TUpdatePatch = { + type: TUpdatePatchType +} + +type TWebSocketSVGPatchEvent = TWebSocketEvent & { + updates: TUpdatePatch[] + layer: ("MODEL" | "CAPTURE") +} + +declare class Logger { + instanceName: LoggerClass; + level: LoggerLevel; + constructor(instanceName: LoggerClass, level: LoggerLevel); + debug(...data: any): void; + info(...data: any): void; + warn(...data: any): void; + error(...error: any): void; +} + +declare class LoggerManager { + #private; + static getLogger(name: LoggerClass): Logger; + static setLoggerLevel(config: TLoggerConfiguration): void; +} + +type index$a_LoggerManager = LoggerManager; +declare const index$a_LoggerManager: typeof LoggerManager; +type index$a_Logger = Logger; +declare const index$a_Logger: typeof Logger; +declare namespace index$a { + export { + index$a_LoggerManager as LoggerManager, + index$a_Logger as Logger, + }; +} + +type HTMLEditorElement = HTMLElement & { + editor: Editor; +}; +declare class Editor { + #private; + wrapperHTML: HTMLEditorElement; + logger: Logger; + showStrokesPan: boolean; + constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss?: string); + get loggerConfiguration(): TLoggerConfiguration; + set loggerConfiguration(loggerConfig: TLoggerConfiguration); + get initializationPromise(): Promise; + get model(): IModel; + get behaviors(): IBehaviors; + get configuration(): TConfiguration; + set configuration(configuration: TConfiguration); + get intention(): Intention$1; + set intention(m: Intention$1); + get events(): PublicEvent; + get context(): TUndoRedoContext; + get grabber(): IGrabber; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + set penStyle(ps: TPenStyle); + get theme(): TTheme; + set theme(t: TTheme); + get penStyleClasses(): string; + set penStyleClasses(psc: string); + initialize(): Promise; + waitForIdle(): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + resize(): Promise; + export(mimeTypes?: string[]): Promise; + convert(params?: { + conversionState?: TConverstionState; + mimeTypes?: string[]; + }): Promise; + import(data: Blob | string | TJIIXExport, mimeType?: string): Promise; + importPointEvents(strokes: TStroke[]): Promise; +} + +declare class DeferredPromise { + promise: Promise; + resolve: (value: T) => void; + reject: (value: Error) => void; + isFullFilled: boolean; + isPending: boolean; + constructor(); +} + +declare function computeDistance(p1: TPoint, p2: TPoint): number; + +declare const geometric_computeDistance: typeof computeDistance; +declare namespace geometric { + export { + geometric_computeDistance as computeDistance, + }; +} + +declare const isVersionSuperiorOrEqual: (source: string, target: string) => boolean; + +declare const version_isVersionSuperiorOrEqual: typeof isVersionSuperiorOrEqual; +declare namespace version { + export { + version_isVersionSuperiorOrEqual as isVersionSuperiorOrEqual, + }; +} + +declare function computeHmac(message: string, applicationKey: string, hmacKey: string): string; + +declare const CryptoHelper_computeHmac: typeof computeHmac; +declare namespace CryptoHelper { + export { + CryptoHelper_computeHmac as computeHmac, + }; +} + +declare function getAvailableFontList(configuration: TConfigurationClient): Promise>; + +declare function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>; + +type index$9_DeferredPromise = DeferredPromise; +declare const index$9_DeferredPromise: typeof DeferredPromise; +declare const index$9_geometric: typeof geometric; +declare const index$9_version: typeof version; +declare const index$9_getAvailableFontList: typeof getAvailableFontList; +declare const index$9_getAvailableLanguageList: typeof getAvailableLanguageList; +declare namespace index$9 { + export { + index$9_DeferredPromise as DeferredPromise, + index$9_geometric as geometric, + index$9_version as version, + CryptoHelper as crypto, + index$9_getAvailableFontList as getAvailableFontList, + index$9_getAvailableLanguageList as getAvailableLanguageList, + }; +} + +declare class Configuration implements TConfiguration { + #private; + events: TEventConfiguration; + grabber: TGrabberConfiguration; + recognition: TRecognitionConfiguration$1; + rendering: TRenderingConfiguration; + server: TServerConfiguration; + triggers: TTriggerConfiguration; + "undo-redo": TUndoRedoConfiguration; + constructor(configuration?: TConfigurationClient); + overrideDefaultConfiguration(configuration?: TConfigurationClient): void; +} + +declare const DefaultServerConfiguration: TServerConfiguration; +declare const DefaultRecognitionConfiguration: TRecognitionConfiguration$1; +declare const DefaultGrabberConfiguration: TGrabberConfiguration; +declare const DefaultRenderingConfiguration: TRenderingConfiguration; +declare const DefaultTriggerConfiguration: TTriggerConfiguration; +declare const DefaultEventsConfiguration: TEventConfiguration; +declare const DefaultUndoRedoConfiguration: TUndoRedoConfiguration; +declare const DefaultConfiguration: TConfiguration; +declare const DefaultLoggerConfiguration: TLoggerConfiguration; + +type index$8_Configuration = Configuration; +declare const index$8_Configuration: typeof Configuration; +declare const index$8_DefaultServerConfiguration: typeof DefaultServerConfiguration; +declare const index$8_DefaultRecognitionConfiguration: typeof DefaultRecognitionConfiguration; +declare const index$8_DefaultGrabberConfiguration: typeof DefaultGrabberConfiguration; +declare const index$8_DefaultRenderingConfiguration: typeof DefaultRenderingConfiguration; +declare const index$8_DefaultTriggerConfiguration: typeof DefaultTriggerConfiguration; +declare const index$8_DefaultEventsConfiguration: typeof DefaultEventsConfiguration; +declare const index$8_DefaultUndoRedoConfiguration: typeof DefaultUndoRedoConfiguration; +declare const index$8_DefaultConfiguration: typeof DefaultConfiguration; +declare const index$8_DefaultLoggerConfiguration: typeof DefaultLoggerConfiguration; +declare namespace index$8 { + export { + index$8_Configuration as Configuration, + index$8_DefaultServerConfiguration as DefaultServerConfiguration, + index$8_DefaultRecognitionConfiguration as DefaultRecognitionConfiguration, + index$8_DefaultGrabberConfiguration as DefaultGrabberConfiguration, + index$8_DefaultRenderingConfiguration as DefaultRenderingConfiguration, + index$8_DefaultTriggerConfiguration as DefaultTriggerConfiguration, + index$8_DefaultEventsConfiguration as DefaultEventsConfiguration, + index$8_DefaultUndoRedoConfiguration as DefaultUndoRedoConfiguration, + index$8_DefaultConfiguration as DefaultConfiguration, + index$8_DefaultLoggerConfiguration as DefaultLoggerConfiguration, + }; +} + +declare class PointerEventGrabber implements IGrabber { + #private; + private configuration; + private domElement; + private activePointerId?; + private prevent; + onPointerDown: (evt: PointerEvent, point: TPointer) => void; + onPointerMove: (evt: PointerEvent, point: TPointer) => void; + onPointerUp: (evt: PointerEvent, point: TPointer) => void; + constructor(configuration: TGrabberConfiguration); + private roundFloat; + private extractPoint; + private pointerDownHandler; + private pointerMoveHandler; + private pointerUpHandler; + attach(domElement: HTMLElement): void; + detach(): void; +} + +declare class CanvasStroker { + private renderArc; + private renderLine; + private renderFinal; + private renderQuadratic; + drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void; +} + +declare class CanvasRenderer { + #private; + config: TRenderingConfiguration; + stroker: CanvasStroker; + context: { + parent: HTMLElement; + renderingCanvas: HTMLCanvasElement; + renderingCanvasContext: CanvasRenderingContext2D; + capturingCanvas: HTMLCanvasElement; + capturingCanvasContext: CanvasRenderingContext2D; + }; + constructor(config: TRenderingConfiguration); + private createCanvas; + private resizeContent; + private drawSymbol; + init(element: HTMLElement): void; + drawModel(model: IModel): void; + drawPendingStroke(stroke: TStroke | undefined): void; + resize(model: IModel): void; + destroy(): void; +} + +declare class RestRecognizer implements IRecognizer { + #private; + protected serverConfiguration: TServerConfiguration; + protected recognitionConfiguration: TRecognitionConfiguration$1; + constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration$1); + get url(): string; + get postConfig(): TRestPostConfiguration; + private buildData; + private post; + private tryFetch; + private getMimeTypes; + convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise; + export(model: IModel, requestedMimeTypes?: string[]): Promise; + resize(model: IModel): Promise; +} + +declare class InternalEvent extends EventTarget { + #private; + private constructor(); + static getInstance(): InternalEvent; + removeAllListeners(): void; + emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void; + addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void; + emitExported(exports: TExport): void; + addExportedListener(callback: (exports: TExport) => void): void; + emitClearMessage(): void; + addClearMessageListener(callback: () => void): void; + emitError(err: Error): void; + addErrorListener(callback: (err: Error) => void): void; + emitWSClosed(): void; + addWSClosedListener(callback: () => void): void; + emitNotif(notif: { + message: string; + timeout?: number; + }): void; + addNotifListener(callback: (notif: { + message: string; + timeout?: number; + }) => void): void; + emitImportJIIX(jiix: TJIIXExport): void; + addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void; + emitConvert(conversionState?: TConverstionState): void; + addConvertListener(callback: (params?: { + conversionState?: TConverstionState; + mimeTypes?: string[]; + }) => void): void; + emitClear(): void; + addClearListener(callback: () => void): void; + emitContextChange(context: TUndoRedoContext): void; + addContextChangeListener(callback: (context: TUndoRedoContext) => void): void; + emitIdle(idle: boolean): void; + addIdleListener(callback: (idle: boolean) => void): void; +} + +declare class UndoRedoContext implements TUndoRedoContext { + canUndo: boolean; + canRedo: boolean; + empty: boolean; + stackIndex: number; + possibleUndoCount: number; + stack: IModel[]; + constructor(model: IModel); +} + +declare class UndoRedoManager { + #private; + context: UndoRedoContext; + configuration: TUndoRedoConfiguration; + constructor(configuration: TUndoRedoConfiguration, model: IModel); + get internalEvent(): InternalEvent; + private updateCanUndoRedo; + addModelToStack(model: IModel): void; + removeLastModelInStack(): void; + updateModelInStack(model: IModel): void; + undo(): IModel; + redo(): IModel; + reset(model: IModel): void; +} + +declare class RestBehaviors implements IBehaviors { + #private; + name: string; + options: TBehaviorOptions; + grabber: PointerEventGrabber; + renderer: CanvasRenderer; + recognizer: RestRecognizer; + undoRedoManager: UndoRedoManager; + styleManager: StyleManager; + intention: Intention$1; + constructor(options: TBehaviorOptions); + get internalEvent(): InternalEvent; + get model(): IModel; + get context(): TUndoRedoContext; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(style?: TPenStyle): void; + get penStyleClasses(): string; + setPenStyleClasses(penClass?: string): void; + get theme(): TTheme; + setTheme(theme?: TTheme): void; + get configuration(): TConfiguration; + init(domElement: HTMLElement): Promise; + private onPointerDown; + private onPointerMove; + private onPointerUp; + drawCurrentStroke(): void; + updateModelRendering(): Promise; + export(mimeTypes?: string[]): Promise; + convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise; + resize(height: number, width: number): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + destroy(): Promise; +} + +/** + * A websocket dialog have this sequence : + * --------------------------- Client --------------------------------------------------- Server ---------------------------------- + * init: send newContentPackage or restoreIInkSession ==================> + * <================== hmacChallenge + * answer hmacChallenge: send the hmac ==================> + * <================== contentPackageDescription + * answer contentPackageDescription: + * send the configuration ==================> + * send newContentPart or openContentPart ==================> + * <================== partChanged + * <================== contentChanged + * <================== newPart + * <================== svgPatch + * + * setPenStyle (send the parameters) ==================> + * setTheme (send the parameters) ==================> + * setPenStyleClasses (send the parameters) ==================> + * <================== svgPatch + * addStrokes (send the strokes ) ============> + * <================== update + */ +declare class WSRecognizer implements IRecognizer { + #private; + protected serverConfiguration: TServerConfiguration; + protected recognitionConfiguration: TRecognitionConfiguration$1; + protected socket: WebSocket; + protected pingCount: number; + protected reconnectionCount: number; + protected viewSizeHeight: number; + protected viewSizeWidth: number; + protected sessionId?: string; + protected currentPartId?: string; + protected currentErrorCode?: string | number; + protected penStyle?: TPenStyle; + protected penStyleClasses?: string; + protected theme?: TTheme; + protected connected?: DeferredPromise; + protected initialized?: DeferredPromise; + protected addStrokeDeferred?: DeferredPromise; + protected exportDeferred?: DeferredPromise; + protected convertDeferred?: DeferredPromise; + protected importDeferred?: DeferredPromise; + protected resizeDeferred?: DeferredPromise; + protected undoDeferred?: DeferredPromise; + protected redoDeferred?: DeferredPromise; + protected clearDeferred?: DeferredPromise; + protected importPointEventsDeferred?: DeferredPromise; + protected waitForIdleDeferred?: DeferredPromise; + url: string; + constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration$1); + get mimeTypes(): string[]; + get internalEvent(): InternalEvent; + protected infinitePing(): void; + protected openCallback(): void; + protected rejectDeferredPending(error: Error): void; + protected closeCallback(evt: CloseEvent): void; + protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void; + protected manageContentPackageDescriptionMessage(): void; + protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void; + protected manageExportMessage(websocketMessage: TWebSocketEvent): void; + protected manageWaitForIdle(): Promise; + protected manageErrorMessage(websocketMessage: TWebSocketEvent): void; + protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void; + protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void; + protected messageCallback(message: MessageEvent): void; + init(height: number, width: number): Promise; + send(message: TWebSocketEvent): Promise; + addStrokes(strokes: TStroke[]): Promise; + setPenStyle(penStyle: TPenStyle): Promise; + setPenStyleClasses(penStyleClasses: string): Promise; + setTheme(theme: TTheme): Promise; + export(model: IModel, requestedMimeTypes?: string[]): Promise; + import(model: IModel, data: Blob, mimeType?: string): Promise; + resize(model: IModel): Promise; + importPointEvents(strokes: TStroke[]): Promise; + convert(model: IModel, conversionState?: TConverstionState): Promise; + waitForIdle(): Promise; + undo(model: IModel): Promise; + redo(model: IModel): Promise; + clear(model: IModel): Promise; + close(code: number, reason: string): void; + destroy(): void; +} + +declare class SVGStroker { + private getArcPath; + private getLinePath; + private getFinalPath; + private getQuadraticPath; + private buildSVGPath; + drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { + name: string; + value: string; + }[]): void; +} + +declare class WSSVGRenderer { + #private; + config: TRenderingConfiguration; + stroker: SVGStroker; + context: { + parent: HTMLElement; + }; + constructor(config: TRenderingConfiguration); + init(element: HTMLElement): void; + updateLayer(layerName: string, update: TUpdatePatch): void; + updatesLayer(layerName: string, updates: TUpdatePatch[]): void; + clearPendingStroke(): void; + drawPendingStroke(stroke: TStroke): void; + clearErasingStrokes(): void; + resize(model: IModel): void; + destroy(): void; +} + +type index$7_UndoRedoContext = UndoRedoContext; +declare const index$7_UndoRedoContext: typeof UndoRedoContext; +type index$7_UndoRedoManager = UndoRedoManager; +declare const index$7_UndoRedoManager: typeof UndoRedoManager; +declare namespace index$7 { + export { + index$7_UndoRedoContext as UndoRedoContext, + index$7_UndoRedoManager as UndoRedoManager, + }; +} + +declare class WSBehaviors implements IBehaviors { + #private; + name: string; + options: TBehaviorOptions; + grabber: PointerEventGrabber; + renderer: WSSVGRenderer; + recognizer: WSRecognizer; + undoRedoManager: UndoRedoManager; + styleManager: StyleManager; + intention: Intention$1; + constructor(options: TBehaviorOptions); + get internalEvent(): InternalEvent; + get model(): IModel; + get context(): TUndoRedoContext; + get configuration(): TConfiguration; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(penStyle?: TPenStyle): Promise; + get penStyleClasses(): string; + setPenStyleClasses(penClass?: string): Promise; + get theme(): TTheme; + setTheme(theme: TTheme): Promise; + init(domElement: HTMLElement): Promise; + private onPointerDown; + private onPointerMove; + private onPointerUp; + private onSVGPatch; + drawCurrentStroke(): void; + updateModelRendering(): Promise; + waitForIdle(): Promise; + importPointEvents(strokes: TStroke[]): Promise; + export(mimeTypes?: string[]): Promise; + convert(conversionState?: TConverstionState): Promise; + import(data: Blob, mimeType?: string): Promise; + resize(height: number, width: number): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + destroy(): Promise; +} + +type index$6_RestBehaviors = RestBehaviors; +declare const index$6_RestBehaviors: typeof RestBehaviors; +type index$6_WSBehaviors = WSBehaviors; +declare const index$6_WSBehaviors: typeof WSBehaviors; +declare namespace index$6 { + export { + index$6_RestBehaviors as RestBehaviors, + index$6_WSBehaviors as WSBehaviors, + }; +} + +type index$5_RestRecognizer = RestRecognizer; +declare const index$5_RestRecognizer: typeof RestRecognizer; +type index$5_WSRecognizer = WSRecognizer; +declare const index$5_WSRecognizer: typeof WSRecognizer; +declare namespace index$5 { + export { + index$5_RestRecognizer as RestRecognizer, + index$5_WSRecognizer as WSRecognizer, + }; +} + +declare const ShapeSymbols: { + table: string; + shape: string; + recognizedShape: string; + ellipse: string; + line: string; +}; +/** + * Draw a line + * @param {Object} context2D Current rendering context2D + * @param {{x: Number, y: Number}} p1 Origin point + * @param {{x: Number, y: Number}} p2 Destination point + */ +declare function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint): void; +/** + * Draw a shape symbol + * @param {Object} context2D Current rendering context2D + * @param {Object} symbol Symbol to draw + */ +declare function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol): void; + +declare const CanvasRendererShapeSymbol_ShapeSymbols: typeof ShapeSymbols; +declare const CanvasRendererShapeSymbol_drawLine: typeof drawLine; +declare const CanvasRendererShapeSymbol_drawShapeSymbol: typeof drawShapeSymbol; +declare namespace CanvasRendererShapeSymbol { + export { + CanvasRendererShapeSymbol_ShapeSymbols as ShapeSymbols, + CanvasRendererShapeSymbol_drawLine as drawLine, + CanvasRendererShapeSymbol_drawShapeSymbol as drawShapeSymbol, + }; +} + +declare function drawStroke(context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker): void; + +declare const CanvasRendererStrokeSymbol_drawStroke: typeof drawStroke; +declare namespace CanvasRendererStrokeSymbol { + export { + CanvasRendererStrokeSymbol_drawStroke as drawStroke, + }; +} + +declare const TextSymbols: { + inputCharacter: string; + char: string; + string: string; + textLine: string; +}; +/** + * Draw a text symbol + * @param {Object} context Current rendering context + * @param {Object} symbol Symbol to draw + */ +declare function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol): void; + +declare const CanvasRendererTextSymbol_TextSymbols: typeof TextSymbols; +declare const CanvasRendererTextSymbol_drawTextSymbol: typeof drawTextSymbol; +declare namespace CanvasRendererTextSymbol { + export { + CanvasRendererTextSymbol_TextSymbols as TextSymbols, + CanvasRendererTextSymbol_drawTextSymbol as drawTextSymbol, + }; +} + +declare function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]; +declare function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer; +declare function computeAxeAngle(begin: TPointer, end: TPointer): number; + +declare const QuadraticUtils_computeLinksPoints: typeof computeLinksPoints; +declare const QuadraticUtils_computeMiddlePoint: typeof computeMiddlePoint; +declare const QuadraticUtils_computeAxeAngle: typeof computeAxeAngle; +declare namespace QuadraticUtils { + export { + QuadraticUtils_computeLinksPoints as computeLinksPoints, + QuadraticUtils_computeMiddlePoint as computeMiddlePoint, + QuadraticUtils_computeAxeAngle as computeAxeAngle, + }; +} + +type index$4_CanvasRenderer = CanvasRenderer; +declare const index$4_CanvasRenderer: typeof CanvasRenderer; +type index$4_CanvasStroker = CanvasStroker; +declare const index$4_CanvasStroker: typeof CanvasStroker; +type index$4_SVGStroker = SVGStroker; +declare const index$4_SVGStroker: typeof SVGStroker; +type index$4_WSSVGRenderer = WSSVGRenderer; +declare const index$4_WSSVGRenderer: typeof WSSVGRenderer; +declare namespace index$4 { + export { + QuadraticUtils as quadradicsUtils, + index$4_CanvasRenderer as CanvasRenderer, + CanvasRendererShapeSymbol as canvasRendererShape, + CanvasRendererStrokeSymbol as canvasRendererStroke, + CanvasRendererTextSymbol as canvasRendererText, + index$4_CanvasStroker as CanvasStroker, + index$4_SVGStroker as SVGStroker, + index$4_WSSVGRenderer as WSSVGRenderer, + }; +} + +type index$3_PointerEventGrabber = PointerEventGrabber; +declare const index$3_PointerEventGrabber: typeof PointerEventGrabber; +declare namespace index$3 { + export { + index$3_PointerEventGrabber as PointerEventGrabber, + }; +} + +declare const DefaultPenStyle: TPenStyle; + +declare const DefaultTheme: TTheme; + +declare const StyleHelper: { + themeToCSS(json: TTheme): string; + themeToJSON(style: string): TTheme; + penStyleToCSS(penStyle: TPenStyle): string; + penStyleToJSON(penStyleString: string): TPenStyle; + stringToJSON(style: string): { + [key: string]: string; + }; + JSONToString(style: { + [key: string]: string; + }): string; +}; + +declare const index$2_DefaultPenStyle: typeof DefaultPenStyle; +declare const index$2_DefaultTheme: typeof DefaultTheme; +declare const index$2_StyleHelper: typeof StyleHelper; +type index$2_StyleManager = StyleManager; +declare const index$2_StyleManager: typeof StyleManager; +declare namespace index$2 { + export { + index$2_DefaultPenStyle as DefaultPenStyle, + index$2_DefaultTheme as DefaultTheme, + index$2_StyleHelper as StyleHelper, + index$2_StyleManager as StyleManager, + }; +} + +declare class Model implements IModel { + #private; + readonly creationTime: number; + modificationDate: number; + currentStroke?: TStroke; + positions: TRecognitionPositions; + rawStrokes: TStroke[]; + selectedStrokes: TStroke[]; + exports?: TExport; + converts?: TExport; + width: number; + height: number; + idle: boolean; + constructor(width?: number, height?: number, creationDate?: number); + mergeExport(exports: TExport): void; + mergeConvert(converts: TExport): void; + private computePressure; + private filterPointByAcquisitionDelta; + addPoint(stroke: TStroke, pointer: TPointer): void; + addStroke(stroke: TStroke): void; + extractUnsentStrokes(): TStroke[]; + initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi?: number): void; + appendToCurrentStroke(point: TPointer): void; + endCurrentStroke(point: TPointer): void; + resetSelectedStrokes(): void; + appendSelectedStrokesFromPoint(point: TPoint): void; + updateStroke(updatedStroke: TStroke): void; + removeStroke(id: string): void; + removeStrokesFromPoint(point: TPoint): string[]; + updatePositionSent(position?: number): void; + updatePositionReceived(): void; + getClone(): IModel; + clear(): void; +} + +declare class Stroke implements TStroke { + #private; + id: string; + type: string; + pointerId: number; + pointerType: string; + elementType?: string; + pointers: TPointer[]; + length: number; + style: TPenStyle; + constructor(style: TPenStyle, pointerId: number, pointerType?: string); +} +declare function convertStrokeToJSON(stroke: TStroke): TStrokeJSON; + +type index$1_Model = Model; +declare const index$1_Model: typeof Model; +type index$1_Stroke = Stroke; +declare const index$1_Stroke: typeof Stroke; +declare const index$1_convertStrokeToJSON: typeof convertStrokeToJSON; +declare namespace index$1 { + export { + index$1_Model as Model, + index$1_Stroke as Stroke, + index$1_convertStrokeToJSON as convertStrokeToJSON, + }; +} + +type index_InternalEvent = InternalEvent; +declare const index_InternalEvent: typeof InternalEvent; +type index_PublicEvent = PublicEvent; +declare const index_PublicEvent: typeof PublicEvent; +declare namespace index { + export { + index_InternalEvent as InternalEvent, + index_PublicEvent as PublicEvent, + }; +} + +declare class SmartGuide { + #private; + uuid: string; + margin: TMarginConfiguration; + renderingConfiguration: TRenderingConfiguration; + jiix?: TJIIXExport; + lastWord?: TWordExport; + wordToChange?: TWordExport; + constructor(); + get internalEvent(): InternalEvent; + init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void; + resize(): void; + update(exports: TJIIXExport): void; + clear(): void; + destroy(): void; +} + +type SmartGuide$1_SmartGuide = SmartGuide; +declare const SmartGuide$1_SmartGuide: typeof SmartGuide; +declare namespace SmartGuide$1 { + export { + SmartGuide$1_SmartGuide as SmartGuide, + }; +} + +export { Editor, index$6 as behaviors, index$8 as configuration, Constants as constants, index as event, index$3 as grabber, index$a as logger, index$1 as model, index$5 as recognizer, index$4 as renderer, SmartGuide$1 as smartguide, index$2 as style, index$7 as undoredo, index$9 as utils }; +//# sourceMappingURL=iink.d.ts.map diff --git a/dist/iink.d.ts.map b/dist/iink.d.ts.map new file mode 100644 index 000000000..b80bbe589 --- /dev/null +++ b/dist/iink.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/iink.esm.js b/dist/iink.esm.js new file mode 100644 index 000000000..37ad66b33 --- /dev/null +++ b/dist/iink.esm.js @@ -0,0 +1,2 @@ +function __awaiter(i,s,n,a){return new(n||(n=Promise))((function(l,d){function fulfilled(i){try{step(a.next(i))}catch(i){d(i)}}function rejected(i){try{step(a.throw(i))}catch(i){d(i)}}function step(i){i.done?l(i.value):function adopt(i){return i instanceof n?i:new n((function(s){s(i)}))}(i.value).then(fulfilled,rejected)}step((a=a.apply(i,s||[])).next())}))}function __classPrivateFieldGet(i,s,n,a){if("a"===n&&!a)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof s?i!==s||!a:!s.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?a:"a"===n?a.call(i):a?a.value:s.get(i)}function __classPrivateFieldSet(i,s,n,a,l){if("m"===a)throw new TypeError("Private method is not writable");if("a"===a&&!l)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof s?i!==s||!l:!s.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===a?l.call(i,n):l?l.value=n:s.set(i,n),n}const i={protocol:"WEBSOCKET",scheme:"https",host:"cloud.myscript.com",applicationKey:"",hmacKey:"",version:"2.1.0",useWindowLocation:!1,websocket:{pingEnabled:!0,pingDelay:3e4,maxPingLostCount:10,autoReconnect:!0,maxRetryCount:2,fileChunkSize:3e5}},s={type:"TEXT",alwaysConnected:!0,lang:"en_US",gesture:{enable:!0},export:{"image-resolution":300,jiix:{"bounding-box":!1,strokes:!1,text:{chars:!1,words:!0}}},renderer:{debug:{"draw-text-boxes":!1,"draw-image-boxes":!1}},math:{mimeTypes:["application/vnd.myscript.jiix"],solver:{enable:!0,"fractional-part-digits":3,"decimal-separator":".","rounding-mode":"half up","angle-unit":"deg"},margin:{bottom:10,left:15,right:15,top:10},eraser:{"erase-precisely":!1},"undo-redo":{mode:"stroke"}},text:{guides:{enable:!0},mimeTypes:["application/vnd.myscript.jiix"],margin:{top:20,left:10,right:10,bottom:10},eraser:{"erase-precisely":!1}},diagram:{mimeTypes:["application/vnd.myscript.jiix"],eraser:{"erase-precisely":!1},convert:{"match-text-size":!0}},"raw-content":{recognition:{text:!0,shape:!0},eraser:{"erase-precisely":!1}}},n={listenerOptions:{capture:!1,passive:!0},xyFloatPrecision:0,timestampFloatPrecision:0},a={minHeight:100,minWidth:100,smartGuide:{enable:!0,fadeOut:{enable:!1,duration:5e3}},guides:{enable:!0,gap:50}},l={exportContent:"POINTER_UP",exportContentDelay:1e3,resizeTriggerDelay:100},d={processDelay:10},c={maxStackSize:100},h={server:i,recognition:s,grabber:n,rendering:a,triggers:l,events:d,"undo-redo":c},v={EDITOR:"4",BEHAVIORS:"4",RECOGNIZER:"4",GRABBER:"4",RENDERER:"4",CONFIGURATION:"4",PUBLIC_EVENT:"4",INTERNALEVENT:"4",MODEL:"4",STROKE:"4",SMARTGUIDE:"4",STYLEMANAGER:"4",UNDOREDO_MANAGER:"4"},mergeDeep=(i,...s)=>{const isObject=i=>i&&"object"==typeof i&&!Array.isArray(i);if(!s.length)return i;const n=s.shift();if(isObject(i)&&isObject(n))for(const s in n)isObject(n[s])?(i[s]||Object.assign(i,{[s]:{}}),mergeDeep(i[s],n[s])):Object.assign(i,{[s]:n[s]});return mergeDeep(i,...s)};class Logger{constructor(i,s){this.instanceName=i,this.level=s}debug(...i){if("1">=this.level){const s={from:this.instanceName,message:i};console.debug(s)}}info(...i){if("2">=this.level){const s={from:this.instanceName,message:i};console.info(s)}}warn(...i){if("3">=this.level){const s={from:this.instanceName,message:i};console.warn(s)}}error(...i){const s={from:this.instanceName,error:i};console.error(s)}}var u,p;class LoggerManager{static getLogger(i){return __classPrivateFieldGet(this,u,"f",p).has(i)||__classPrivateFieldGet(this,u,"f",p).set(i,new Logger(i,"4")),__classPrivateFieldGet(this,u,"f",p).get(i)}static setLoggerLevel(i){Object.keys(i).forEach((s=>{LoggerManager.getLogger(s).level=i[s]}))}}u=LoggerManager,p={value:new Map};var _,g=Object.freeze({__proto__:null,LoggerManager:LoggerManager,Logger:Logger});class Configuration{constructor(i){_.set(this,LoggerManager.getLogger("CONFIGURATION")),__classPrivateFieldGet(this,_,"f").info("constructor",{configuration:i}),this.events=JSON.parse(JSON.stringify(h.events)),this.grabber=JSON.parse(JSON.stringify(h.grabber)),this.recognition=JSON.parse(JSON.stringify(h.recognition)),this.rendering=JSON.parse(JSON.stringify(h.rendering)),this.server=JSON.parse(JSON.stringify(h.server)),this.triggers=JSON.parse(JSON.stringify(h.triggers)),this.overrideDefaultConfiguration(i)}overrideDefaultConfiguration(i){var s,n,a,l,d,c,v;__classPrivateFieldGet(this,_,"f").info("overrideDefaultConfiguration",{configuration:i});const u=JSON.parse(JSON.stringify(h));this.events=mergeDeep({},u.events,null==i?void 0:i.events),this.grabber=mergeDeep({},u.grabber,null==i?void 0:i.grabber),this.recognition=mergeDeep({},u.recognition,null==i?void 0:i.recognition),this.rendering=mergeDeep({},u.rendering,null==i?void 0:i.rendering),this.server=mergeDeep({},u.server,null==i?void 0:i.server),this.triggers=mergeDeep({},u.triggers,null==i?void 0:i.triggers),this["undo-redo"]=mergeDeep({},u["undo-redo"],null==i?void 0:i["undo-redo"]),this.recognition.text.mimeTypes=(null===(n=null===(s=null==i?void 0:i.recognition)||void 0===s?void 0:s.text)||void 0===n?void 0:n.mimeTypes)||u.recognition.text.mimeTypes,this.recognition.math.mimeTypes=(null===(l=null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.math)||void 0===l?void 0:l.mimeTypes)||u.recognition.math.mimeTypes,this.recognition.diagram.mimeTypes=(null===(c=null===(d=null==i?void 0:i.recognition)||void 0===d?void 0:d.diagram)||void 0===c?void 0:c.mimeTypes)||u.recognition.diagram.mimeTypes,(null===(v=this.server)||void 0===v?void 0:v.useWindowLocation)&&(this.server.scheme=window.location.protocol.indexOf("s")>-1?"https":"http",this.server.host=window.location.host),"REST"===this.server.protocol&&"POINTER_UP"===this.triggers.exportContent&&(this.triggers.exportContent="QUIET_PERIOD",this.triggers.exportContentDelay=Math.max(this.triggers.exportContentDelay,50)),"WEBSOCKET"===this.server.protocol&&"TEXT"===this.recognition.type?this.rendering.smartGuide.enable&&!this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix")&&this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix"):this.rendering.smartGuide.enable=!1,__classPrivateFieldGet(this,_,"f").debug("overrideDefaultConfiguration",{configuration:this})}}_=new WeakMap;var f,m,P=Object.freeze({__proto__:null,Configuration:Configuration,DefaultServerConfiguration:i,DefaultRecognitionConfiguration:s,DefaultGrabberConfiguration:n,DefaultRenderingConfiguration:a,DefaultTriggerConfiguration:l,DefaultEventsConfiguration:d,DefaultUndoRedoConfiguration:c,DefaultConfiguration:h,DefaultLoggerConfiguration:v});!function(i){i.DEBUG="1",i.INFO="2",i.WARN="3",i.ERROR="4"}(f||(f={})),function(i){i.EDITOR="EDITOR",i.RECOGNIZER="RECOGNIZER",i.GRABBER="GRABBER",i.BEHAVIORS="BEHAVIORS",i.CONFIGURATION="CONFIGURATION",i.PUBLIC_EVENT="PUBLIC_EVENT",i.MODEL="MODEL",i.RENDERER="RENDERER",i.SMARTGUIDE="SMARTGUIDE",i.STYLEMANAGER="STYLEMANAGER",i.UNDOREDO_MANAGER="UNDOREDO_MANAGER",i.STROKE="STROKE",i.INTERNALEVENT="INTERNALEVENT"}(m||(m={}));const y={NO_ACTIVITY:"Session closed due to no activity.",WRONG_CREDENTIALS:"Application credentials are invalid. Please check or regenerate your application key and hmackey.",TOO_OLD:"Session is too old. Max Session Duration Reached.",UNKNOW:"An unknown error has occurred.",ABNORMAL_CLOSURE:"MyScript recognition server is not reachable.",CANT_ESTABLISH:"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.",GOING_AWAY:"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.",PROTOCOL_ERROR:"MyScript recognition server terminated the connection due to a protocol error.",UNSUPPORTED_DATA:"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)",INVALID_FRAME_PAULOAD:"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).",POLICY_VIOLATION:"MyScript recognition server terminated the connection because it received a message that violates its policy.",MESSAGE_TOO_BIG:"MyScript recognition server terminated the connection because a data frame was received that is too large.",INTERNAL_ERROR:"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.",SERVICE_RESTART:"MyScript recognition server terminated the connection because it is restarting.",TRY_AGAIN:"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.",BAD_GATEWAY:"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.",TLS_HANDSHAKE:"MyScript recognition server connection was closed due to a failure to perform a TLS handshake"},S={CHANGED:"changed",CLEARED:"cleared",CONVERTED:"converted",ERROR:"error",POINTEREVENTS:"pointer_events",EXPORTED:"exported",IMPORTED:"imported",IDLE:"idle",LOADED:"loaded"},w={SVG_PATCH:"internal_svg_patch",EXPORTED:"internal_exported",CLEAR_MESSAGE:"internal_clear_message",ERROR:"internal_error",NOTIF:"internal_notif",IMPORT_JIIX:"internal_import_jiix",CONVERT:"internal_convert",CLEAR:"internal_clear",CONTEXT_CHANGE:"internal_context_change",IDLE:"internal_idle",WS_CLOSED:"internal_websocket_closed"};var G,b;!function(i){i.JIIX="application/vnd.myscript.jiix",i.TEXT="text/plain",i.LATEX="application/x-latex",i.MATHML="application/mathml+xml",i.SVG="image/svg+xml",i.OFFICE_DOCUMENT="application/vnd.openxmlformats-officedocument.presentationml.presentation"}(G||(G={})),function(i){i.Write="write",i.Erase="erase"}(b||(b={}));var x,E,C,k,M,T,L,I,D,A,R,N,O,W,z,j,H,B,X,U,$,V,J,q,Y,Z,K,Q,ee,te,ie,se,ne,re,oe,ae,le,de,ce,he,ve,ue,pe,_e,ge,fe,me,Pe,ye,Se,we,Fe,Ge=Object.freeze({__proto__:null,Error:y,EventType:S,InternalEventType:w,get ExportType(){return G},get Intention(){return b},get LoggerClass(){return m},get LoggerLevel(){return f}});class PublicEvent extends EventTarget{constructor(){super(),x.add(this),k.set(this,void 0),M.set(this,LoggerManager.getLogger("PUBLIC_EVENT"))}static getInstance(){return __classPrivateFieldGet(PublicEvent,E,"f",C)||__classPrivateFieldSet(PublicEvent,E,new PublicEvent,"f",C),__classPrivateFieldGet(PublicEvent,E,"f",C)}setElement(i){__classPrivateFieldGet(this,M,"f").info("setElement",{el:i}),__classPrivateFieldSet(this,k,i,"f")}emitLoaded(){__classPrivateFieldGet(this,M,"f").info("emitLoaded"),__classPrivateFieldGet(this,x,"m",T).call(this,S.LOADED)}emitExported(i){__classPrivateFieldGet(this,M,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,x,"m",T).call(this,S.EXPORTED,i)}emitChanged(i){__classPrivateFieldGet(this,M,"f").info("emitChanged",{undoRedoContext:i}),__classPrivateFieldGet(this,x,"m",T).call(this,S.CHANGED,Object.assign(Object.assign({},i),{canClear:!i.empty}))}emitIdle(i){__classPrivateFieldGet(this,M,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,x,"m",T).call(this,S.IDLE,i)}emitCleared(i){__classPrivateFieldGet(this,M,"f").info("emitCleared",{model:i}),__classPrivateFieldGet(this,x,"m",T).call(this,S.CLEARED,i)}emitConverted(i){__classPrivateFieldGet(this,M,"f").info("emitConverted",{exports:i}),__classPrivateFieldGet(this,x,"m",T).call(this,S.CONVERTED,i)}emitImported(i){__classPrivateFieldGet(this,M,"f").info("emitImported",{exports:i}),__classPrivateFieldGet(this,x,"m",T).call(this,S.IMPORTED,i)}}E=PublicEvent,k=new WeakMap,M=new WeakMap,x=new WeakSet,T=function _PublicEvent_emit(i,s){var n;const a=new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0));this.dispatchEvent(a),null===(n=__classPrivateFieldGet(this,k,"f"))||void 0===n||n.dispatchEvent(a)},C={value:void 0};class InternalEvent extends EventTarget{constructor(){super(),L.add(this),A.set(this,void 0),R.set(this,LoggerManager.getLogger("INTERNALEVENT")),__classPrivateFieldGet(this,R,"f").info("constructor"),__classPrivateFieldSet(this,A,new AbortController,"f")}static getInstance(){return __classPrivateFieldGet(InternalEvent,I,"f",D)||__classPrivateFieldSet(InternalEvent,I,new InternalEvent,"f",D),__classPrivateFieldGet(InternalEvent,I,"f",D)}removeAllListeners(){__classPrivateFieldGet(this,R,"f").info("removeAllListeners"),__classPrivateFieldGet(this,A,"f").abort(),__classPrivateFieldSet(this,A,new AbortController,"f")}emitSVGPatch(i){__classPrivateFieldGet(this,R,"f").info("emitSVGPatch",{patchChange:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.SVG_PATCH,i)}addSVGPatchListener(i){__classPrivateFieldGet(this,R,"f").info("addSVGPatchListener",{callback:i}),this.addEventListener(w.SVG_PATCH,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitExported(i){__classPrivateFieldGet(this,R,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.EXPORTED,i)}addExportedListener(i){__classPrivateFieldGet(this,R,"f").info("addExportedListener",{callback:i}),this.addEventListener(w.EXPORTED,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitClearMessage(){__classPrivateFieldGet(this,R,"f").info("emitClearMessage",{}),__classPrivateFieldGet(this,L,"m",N).call(this,w.CLEAR_MESSAGE)}addClearMessageListener(i){__classPrivateFieldGet(this,R,"f").info("addClearMessageListener",{callback:i}),this.addEventListener(w.CLEAR_MESSAGE,(()=>i()),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitError(i){__classPrivateFieldGet(this,R,"f").info("emitError",{err:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.ERROR,i)}addErrorListener(i){__classPrivateFieldGet(this,R,"f").info("addErrorListener",{callback:i}),this.addEventListener(w.ERROR,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitWSClosed(){__classPrivateFieldGet(this,R,"f").info("emitWSClosed",{}),__classPrivateFieldGet(this,L,"m",N).call(this,w.WS_CLOSED)}addWSClosedListener(i){__classPrivateFieldGet(this,R,"f").info("addWSClosedListener",{callback:i}),this.addEventListener(w.WS_CLOSED,(()=>i()),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitNotif(i){__classPrivateFieldGet(this,R,"f").info("emitWNotif",{notif:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.NOTIF,i)}addNotifListener(i){__classPrivateFieldGet(this,R,"f").info("addNotifListener",{callback:i}),this.addEventListener(w.NOTIF,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitImportJIIX(i){__classPrivateFieldGet(this,R,"f").info("emitImportJIIX",{jiix:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.IMPORT_JIIX,i)}addImportJIIXListener(i){__classPrivateFieldGet(this,R,"f").info("addImportJIIXListener",{callback:i}),this.addEventListener(w.IMPORT_JIIX,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitConvert(i="DIGITAL_EDIT"){__classPrivateFieldGet(this,R,"f").info("emitConvert",{conversionState:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.CONVERT,i)}addConvertListener(i){__classPrivateFieldGet(this,R,"f").info("addConvertListener",{callback:i}),this.addEventListener(w.CONVERT,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitClear(){__classPrivateFieldGet(this,R,"f").info("emitClear"),__classPrivateFieldGet(this,L,"m",N).call(this,w.CLEAR)}addClearListener(i){__classPrivateFieldGet(this,R,"f").info("addClearListener",{callback:i}),this.addEventListener(w.CLEAR,(()=>i()),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitContextChange(i){__classPrivateFieldGet(this,R,"f").info("emitContextChange",{context:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.CONTEXT_CHANGE,i)}addContextChangeListener(i){__classPrivateFieldGet(this,R,"f").info("addContextChangeListener",{callback:i}),this.addEventListener(w.CONTEXT_CHANGE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitIdle(i){__classPrivateFieldGet(this,R,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.IDLE,i)}addIdleListener(i){__classPrivateFieldGet(this,R,"f").info("addIdleListener",{callback:i}),this.addEventListener(w.IDLE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}}I=InternalEvent,A=new WeakMap,R=new WeakMap,L=new WeakSet,N=function _InternalEvent_emit(i,s){this.dispatchEvent(new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0)))},D={value:void 0};class SmartGuide{constructor(){O.add(this),W.set(this,void 0),z.set(this,void 0),j.set(this,void 0),H.set(this,void 0),B.set(this,void 0),X.set(this,void 0),U.set(this,void 0),$.set(this,void 0),V.set(this,void 0),J.set(this,void 0),q.set(this,void 0),Y.set(this,void 0),Z.set(this,LoggerManager.getLogger("SMARTGUIDE")),he.set(this,(i=>{var s,n,a,l,d;__classPrivateFieldGet(this,Z,"f").info("showCandidates",{target:i});const c=parseInt(i.id.replace("word-","").replace(this.uuid,"")),h=null===(s=this.jiix)||void 0===s?void 0:s.words;if(this.wordToChange=h[c],this.wordToChange&&(this.wordToChange.id=c.toString(),__classPrivateFieldGet(this,X,"f").innerHTML="",null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)){__classPrivateFieldGet(this,X,"f").style.display="flex",this.wordToChange.candidates.forEach(((i,s)=>{var n;(null===(n=this.wordToChange)||void 0===n?void 0:n.label)===i?__classPrivateFieldGet(this,X,"f").innerHTML+=`${i}`:__classPrivateFieldGet(this,X,"f").innerHTML+=`${i}`}));const s=48,n=i.getBoundingClientRect().left-60;__classPrivateFieldGet(this,X,"f").style.top=`${s}px`,__classPrivateFieldGet(this,X,"f").style.left=`${n}px`;const c=null===(l=null===(a=i.parentNode)||void 0===a?void 0:a.parentNode)||void 0===l?void 0:l.parentNode;c&&c.insertBefore(__classPrivateFieldGet(this,X,"f"),null===(d=i.parentNode)||void 0===d?void 0:d.parentNode)}})),_e.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickEllipsis",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,Y,"f")?__classPrivateFieldGet(this,O,"m",pe).call(this):__classPrivateFieldGet(this,O,"m",ue).call(this),__classPrivateFieldGet(this,O,"m",ve).call(this)})),ge.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickConvert",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitConvert(),__classPrivateFieldGet(this,O,"m",pe).call(this)})),fe.set(this,(i=>__awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Z,"f").info("onClickCopy",{evt:i}),i.preventDefault(),i.stopPropagation();try{__classPrivateFieldGet(this,O,"m",pe).call(this);let i="Nothing to copy";if(__classPrivateFieldGet(this,j,"f").innerText)if(i=`"${__classPrivateFieldGet(this,j,"f").innerText}" copied to clipboard`,/iPad|iPhone|iPod/.test(navigator.userAgent)){const i="clipboard-write";"granted"===(yield navigator.permissions.query({name:i})).state&&(yield navigator.clipboard.writeText(__classPrivateFieldGet(this,j,"f").innerText))}else yield navigator.clipboard.writeText(__classPrivateFieldGet(this,j,"f").innerText);this.internalEvent.emitNotif({message:i,timeout:1500})}catch(i){__classPrivateFieldGet(this,Z,"f").error("onClickCopy",{err:i}),this.internalEvent.emitError(i)}})))),me.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickDelete",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitClear(),__classPrivateFieldGet(this,O,"m",pe).call(this)})),Pe.set(this,(i=>{var s,n,a,l;__classPrivateFieldGet(this,Z,"f").info("onClickCandidate",{evt:i}),i.preventDefault(),i.stopPropagation();const d=i.target.innerText;this.jiix&&d!==(null===(s=this.wordToChange)||void 0===s?void 0:s.label)&&(null===(a=null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)||void 0===a?void 0:a.includes(d))&&(this.jiix.words[parseInt(null===(l=this.wordToChange)||void 0===l?void 0:l.id)].label=d,this.internalEvent.emitImportJIIX(this.jiix)),__classPrivateFieldGet(this,X,"f").style.display="none"})),ye.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickPrompter",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,O,"m",pe).call(this);const s=i.target;s.id!==__classPrivateFieldGet(this,j,"f").id?__classPrivateFieldGet(this,he,"f").call(this,s):__classPrivateFieldGet(this,O,"m",ve).call(this)})),Se.set(this,(()=>{__classPrivateFieldGet(this,O,"m",ve).call(this),__classPrivateFieldGet(this,O,"m",pe).call(this)})),__classPrivateFieldGet(this,Z,"f").info("constructor",{}),this.uuid=Math.random().toString(10).substring(2,12),this.margin={bottom:0,left:0,right:0,top:0},__classPrivateFieldGet(this,O,"m",K).call(this),__classPrivateFieldGet(this,O,"m",Q).call(this),__classPrivateFieldGet(this,O,"m",ee).call(this),__classPrivateFieldGet(this,O,"m",te).call(this),__classPrivateFieldGet(this,O,"m",ie).call(this),__classPrivateFieldGet(this,O,"m",se).call(this),__classPrivateFieldGet(this,O,"m",ne).call(this),__classPrivateFieldGet(this,O,"m",re).call(this),__classPrivateFieldGet(this,O,"m",oe).call(this),__classPrivateFieldGet(this,O,"m",ae).call(this)}get internalEvent(){return InternalEvent.getInstance()}init(i,s,n){__classPrivateFieldGet(this,Z,"f").info("init",{domElement:i,margin:s,renderingConfiguration:n}),i.appendChild(__classPrivateFieldGet(this,W,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,B,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,j,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,z,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,H,"f")),__classPrivateFieldGet(this,U,"f").appendChild(__classPrivateFieldGet(this,$,"f")),__classPrivateFieldGet(this,U,"f").appendChild(__classPrivateFieldGet(this,V,"f")),__classPrivateFieldGet(this,U,"f").appendChild(__classPrivateFieldGet(this,J,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,U,"f")),__classPrivateFieldGet(this,U,"f").classList.add("close"),__classPrivateFieldSet(this,Y,!1,"f"),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,X,"f")),__classPrivateFieldGet(this,X,"f").style.display="none",this.margin=s,this.renderingConfiguration=n,__classPrivateFieldGet(this,O,"m",we).call(this),__classPrivateFieldGet(this,O,"m",de).call(this),this.renderingConfiguration.smartGuide.fadeOut.enable&&__classPrivateFieldGet(this,O,"m",le).call(this,this.renderingConfiguration.smartGuide.fadeOut.duration),this.resize()}resize(){__classPrivateFieldGet(this,Z,"f").info("resize");const i=3.779527559,s=this.margin.top*i,n=this.margin.left*i,a=this.margin.right*i,l=s-45.354330708;__classPrivateFieldGet(this,W,"f").style.top=`${l}px`,__classPrivateFieldGet(this,W,"f").style.left=`${n}px`,__classPrivateFieldGet(this,W,"f").style.right=`${a}px`;let d=__classPrivateFieldGet(this,B,"f").offsetWidth;__classPrivateFieldGet(this,z,"f").style.marginLeft=`${d}px`,__classPrivateFieldGet(this,z,"f").style.width=__classPrivateFieldGet(this,W,"f").clientWidth-__classPrivateFieldGet(this,B,"f").offsetWidth-__classPrivateFieldGet(this,H,"f").offsetHeight+"px",d+=__classPrivateFieldGet(this,z,"f").offsetWidth,__classPrivateFieldGet(this,U,"f").style.left=`${d-__classPrivateFieldGet(this,U,"f").offsetWidth+__classPrivateFieldGet(this,H,"f").offsetWidth}px`,__classPrivateFieldGet(this,U,"f").style.top=`${__classPrivateFieldGet(this,H,"f").offsetHeight}px`,__classPrivateFieldGet(this,H,"f").style.left=`${d}px`}update(i){var s,n;__classPrivateFieldGet(this,Z,"f").info("update",{exports:i}),this.jiix=i;const createWordSpan=(i,s)=>{const n=document.createElement("span");return n.id=`word-${i}${this.uuid}`,s?n.textContent=s.label:n.innerHTML=" ",__classPrivateFieldGet(this,Z,"f").debug("update",{span:n}),n};(()=>{var i;if(__classPrivateFieldGet(this,Z,"f").info("populatePrompter",{}),__classPrivateFieldGet(this,j,"f").innerHTML="",null===(i=this.jiix)||void 0===i?void 0:i.words){const i=this.jiix.words,s=document.createDocumentFragment();i.forEach(((n,a)=>{var l,d,c;if(" "===n.label||n.label.includes("\n"))s.appendChild(createWordSpan(a));else if(a!==i.length-1)s.appendChild(createWordSpan(a,n));else{__classPrivateFieldGet(this,j,"f").appendChild(s),this.lastWord&&(this.lastWord=n);const i=createWordSpan(a,n);(null===(l=this.lastWord)||void 0===l?void 0:l.candidates)!==n.candidates&&(null===(d=this.lastWord)||void 0===d?void 0:d.label)!==n.label&&(this.lastWord=n),(null===(c=this.wordToChange)||void 0===c?void 0:c.id)===a.toString()?(i.classList.add("modified-word"),this.wordToChange=void 0):i.classList.add("added-word"),__classPrivateFieldGet(this,j,"f").appendChild(i),__classPrivateFieldGet(this,z,"f").scrollLeft=i.offsetLeft,__classPrivateFieldGet(this,Z,"f").debug("update => populatePrompter",{span:i}),__classPrivateFieldGet(this,Z,"f").debug("update => populatePrompter",this.lastWord)}}))}})(),(null===(n=null===(s=this.jiix)||void 0===s?void 0:s.words)||void 0===n?void 0:n.length)&&__classPrivateFieldGet(this,O,"m",de).call(this)}clear(){__classPrivateFieldGet(this,Z,"f").info("clear"),__classPrivateFieldGet(this,j,"f").innerHTML="",__classPrivateFieldGet(this,X,"f").innerHTML="",__classPrivateFieldGet(this,O,"m",ce).call(this)}destroy(){__classPrivateFieldGet(this,Z,"f").info("destroy"),__classPrivateFieldGet(this,O,"m",Fe).call(this),__classPrivateFieldGet(this,W,"f").remove()}}W=new WeakMap,z=new WeakMap,j=new WeakMap,H=new WeakMap,B=new WeakMap,X=new WeakMap,U=new WeakMap,$=new WeakMap,V=new WeakMap,J=new WeakMap,q=new WeakMap,Y=new WeakMap,Z=new WeakMap,he=new WeakMap,_e=new WeakMap,ge=new WeakMap,fe=new WeakMap,me=new WeakMap,Pe=new WeakMap,ye=new WeakMap,Se=new WeakMap,O=new WeakSet,K=function _SmartGuide_createWrapperElement(){__classPrivateFieldSet(this,W,document.createElement("div"),"f"),__classPrivateFieldGet(this,W,"f").id=`smartguide-${this.uuid}`,__classPrivateFieldGet(this,W,"f").classList.add("smartguide")},Q=function _SmartGuide_createPrompterContainerElement(){__classPrivateFieldSet(this,z,document.createElement("div"),"f"),__classPrivateFieldGet(this,z,"f").id=`prompter-container-${this.uuid}`,__classPrivateFieldGet(this,z,"f").classList.add("prompter-container")},ee=function _SmartGuide_createPrompterTextElement(){__classPrivateFieldSet(this,j,document.createElement("div"),"f"),__classPrivateFieldGet(this,j,"f").id=`prompter-text-${this.uuid}`,__classPrivateFieldGet(this,j,"f").classList.add("prompter-text"),__classPrivateFieldGet(this,j,"f").setAttribute("touch-action","none")},te=function _SmartGuide_createEllipsisElement(){__classPrivateFieldSet(this,H,document.createElement("div"),"f"),__classPrivateFieldGet(this,H,"f").id=`ellipsis-${this.uuid}`,__classPrivateFieldGet(this,H,"f").classList.add("ellipsis"),__classPrivateFieldGet(this,H,"f").innerHTML="..."},ie=function _SmartGuide_createTagElement(){__classPrivateFieldSet(this,B,document.createElement("div"),"f"),__classPrivateFieldGet(this,B,"f").id=`tag-icon-${this.uuid}`,__classPrivateFieldGet(this,B,"f").classList.add("tag-icon"),__classPrivateFieldGet(this,B,"f").innerHTML="¶"},se=function _SmartGuide_createCandidatesElement(){__classPrivateFieldSet(this,X,document.createElement("div"),"f"),__classPrivateFieldGet(this,X,"f").id=`candidates-${this.uuid}`,__classPrivateFieldGet(this,X,"f").classList.add("candidates")},ne=function _SmartGuide_createMoreMenuElement(){__classPrivateFieldSet(this,U,document.createElement("div"),"f"),__classPrivateFieldGet(this,U,"f").id=`more-menu-${this.uuid}`,__classPrivateFieldGet(this,U,"f").classList.add("more-menu")},re=function _SmartGuide_createConvertElement(){__classPrivateFieldSet(this,$,document.createElement("button"),"f"),__classPrivateFieldGet(this,$,"f").id=`convert-${this.uuid}`,__classPrivateFieldGet(this,$,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,$,"f").innerHTML="Convert"},oe=function _SmartGuide_createCopyElement(){__classPrivateFieldSet(this,V,document.createElement("button"),"f"),__classPrivateFieldGet(this,V,"f").id=`copy-${this.uuid}`,__classPrivateFieldGet(this,V,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,V,"f").innerHTML="Copy"},ae=function _SmartGuide_createDeleteElement(){__classPrivateFieldSet(this,J,document.createElement("button"),"f"),__classPrivateFieldGet(this,J,"f").id=`delete-${this.uuid}`,__classPrivateFieldGet(this,J,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,J,"f").innerHTML="Delete"},le=function _SmartGuide_initFadeOutObserver(i=3e3){new MutationObserver((()=>{clearTimeout(__classPrivateFieldGet(this,q,"f")),__classPrivateFieldGet(this,W,"f").classList.contains("smartguide-out")||"none"!==__classPrivateFieldGet(this,X,"f").style.display||__classPrivateFieldGet(this,Y,"f")||__classPrivateFieldSet(this,q,setTimeout((()=>{__classPrivateFieldGet(this,O,"m",ce).call(this)}),i),"f")})).observe(__classPrivateFieldGet(this,W,"f"),{childList:!0,subtree:!0,attributes:!0})},de=function _SmartGuide_show(){__classPrivateFieldGet(this,W,"f").classList.remove("smartguide-out"),__classPrivateFieldGet(this,W,"f").classList.add("smartguide-in")},ce=function _SmartGuide_hide(){__classPrivateFieldGet(this,W,"f").classList.add("smartguide-out"),__classPrivateFieldGet(this,W,"f").classList.remove("smartguide-in")},ve=function _SmartGuide_hideCandidates(){__classPrivateFieldGet(this,X,"f").style.display="none"},ue=function _SmartGuide_openMenu(){__classPrivateFieldGet(this,U,"f").classList.add("open"),__classPrivateFieldGet(this,U,"f").classList.remove("close"),__classPrivateFieldSet(this,Y,!0,"f")},pe=function _SmartGuide_closeMenu(){__classPrivateFieldGet(this,U,"f").classList.add("close"),__classPrivateFieldGet(this,U,"f").classList.remove("open"),__classPrivateFieldSet(this,Y,!1,"f")},we=function _SmartGuide_addListeners(){__classPrivateFieldGet(this,H,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,_e,"f").bind(this)),__classPrivateFieldGet(this,$,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f").bind(this)),__classPrivateFieldGet(this,V,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f").bind(this)),__classPrivateFieldGet(this,J,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,me,"f").bind(this)),__classPrivateFieldGet(this,j,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f").bind(this)),__classPrivateFieldGet(this,X,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f").bind(this)),document.addEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f").bind(this))},Fe=function _SmartGuide_removeListeners(){__classPrivateFieldGet(this,H,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,_e,"f")),__classPrivateFieldGet(this,$,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f")),__classPrivateFieldGet(this,V,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f")),__classPrivateFieldGet(this,J,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,me,"f")),__classPrivateFieldGet(this,j,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f")),__classPrivateFieldGet(this,X,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f")),document.removeEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f"))};var be,xe=Object.freeze({__proto__:null,SmartGuide:SmartGuide});class DeferredPromise{constructor(){this.isFullFilled=!1,this.isPending=!0,this.promise=new Promise(((i,s)=>{this.reject=i=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,s(i)})),this.resolve=s=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,i(s)}))}))}}class PointerEventGrabber{constructor(i){this.prevent=i=>i.preventDefault(),be.set(this,LoggerManager.getLogger("GRABBER")),this.pointerDownHandler=i=>{if(__classPrivateFieldGet(this,be,"f").info("pointerDown",{evt:i}),0===i.button&&1===i.buttons&&(this.activePointerId=i.pointerId,this.onPointerDown)){const s=this.extractPoint(i);this.onPointerDown(i,s)}},this.pointerMoveHandler=i=>{if(__classPrivateFieldGet(this,be,"f").info("pointerMove",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&this.onPointerMove){const s=this.extractPoint(i);this.onPointerMove(i,s)}},this.pointerUpHandler=i=>{if(__classPrivateFieldGet(this,be,"f").info("pointerUp",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&(this.activePointerId=void 0,i.stopPropagation(),this.onPointerUp)){const s=this.extractPoint(i);this.onPointerUp(i,s)}},__classPrivateFieldGet(this,be,"f").info("constructor",{configuration:i}),this.configuration=i}roundFloat(i,s){if(s>=0){const n=Math.pow(10,s);return Math.round(i/n)*n}return __classPrivateFieldGet(this,be,"f").debug("roundFloat",{oneFloat:i,requestedFloatPrecision:s}),i}extractPoint(i){let s,n;({clientX:s,clientY:n}="changedTouches"in i?i.changedTouches[0]:i);const a=this.domElement.getBoundingClientRect(),l={x:this.roundFloat(s-a.left-this.domElement.clientLeft,this.configuration.xyFloatPrecision),y:this.roundFloat(n-a.top-this.domElement.clientTop,this.configuration.xyFloatPrecision),t:this.roundFloat(Date.now(),this.configuration.timestampFloatPrecision),p:i.pressure||1};return __classPrivateFieldGet(this,be,"f").debug("extractPoint",{event:i,pointer:l}),l}attach(i){__classPrivateFieldGet(this,be,"f").info("attach",{domElement:i}),this.domElement&&this.detach(),this.domElement=i,this.domElement.addEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("touchmove",this.prevent),document.documentElement.addEventListener("pointerdown",(()=>{}))}detach(){var i,s,n,a,l,d;__classPrivateFieldGet(this,be,"f").info("detach"),null===(i=this.domElement)||void 0===i||i.removeEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),null===(s=this.domElement)||void 0===s||s.removeEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),null===(n=this.domElement)||void 0===n||n.removeEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),null===(a=this.domElement)||void 0===a||a.removeEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),null===(l=this.domElement)||void 0===l||l.removeEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),null===(d=this.domElement)||void 0===d||d.removeEventListener("touchmove",this.prevent),document.documentElement.removeEventListener("pointerdown",(()=>{}))}}be=new WeakMap;const Ee={table:"table",shape:"shape",recognizedShape:"recognizedShape",ellipse:"ellipse",line:"line"};function phi(i){let s=(i+Math.PI)%(2*Math.PI)-Math.PI;return s<-Math.PI&&(s+=2*Math.PI),s}function drawArrowHead(i,s,n,a){const l=phi(n+Math.PI*(7/8)),d=phi(n-Math.PI*(7/8));i.save();try{i.fillStyle=i.strokeStyle,i.moveTo(s.x,s.y),i.beginPath(),i.lineTo(s.x+a*Math.cos(l),s.y+a*Math.sin(l)),i.lineTo(s.x+a*Math.cos(d),s.y+a*Math.sin(d)),i.lineTo(s.x,s.y),i.fill()}finally{i.restore()}}function drawShapeEllipse(i,s){const n=function drawEllipseArc(i,s){const{centerPoint:n,maxRadius:a,minRadius:l,orientation:d,startAngle:c,sweepAngle:h}=s;let v=Math.cos(d),u=Math.sin(d),p=v,_=u;v*=a,p*=l,u*=a,_*=l;const g=Math.floor(Math.abs(h)/.02),f=[];i.save();try{i.beginPath();for(let s=0;s<=g;s++){const d=c+s/g*h,m=Math.atan2(Math.sin(d)/l,Math.cos(d)/a),P=Math.cos(m),y=Math.sin(m),S=n.x+v*P-_*y,w=n.y+p*y+u*P;0===s?i.moveTo(S,w):i.lineTo(S,w),0!==s&&s!==g||f.push({x:S,y:w})}i.stroke()}finally{i.restore()}return f}(i,s);"ARROW_HEAD"===(null==s?void 0:s.beginDecoration)&&drawArrowHead(i,n[0],s.beginTangentAngle,12),"ARROW_HEAD"===(null==s?void 0:s.endDecoration)&&drawArrowHead(i,n[1],s.endTangentAngle,12)}function drawLine(i,s,n){i.save();try{i.beginPath(),i.moveTo(s.x,s.y),i.lineTo(n.x,n.y),i.stroke()}finally{i.restore()}}function drawShapeSymbol(i,s){i.save();try{if(i.lineWidth=s.style.width,i.strokeStyle=s.style.color,s.elementType)switch(s.elementType){case Ee.shape:{const n=s;drawShapeSymbol(i,n.candidates[n.selectedCandidateIndex]);break}case Ee.table:s.lines.forEach((s=>drawShapeSymbol(i,s)));break;case Ee.line:{const n=s;drawLine(i,n.data.p1,n.data.p2);break}}else switch(s.type){case Ee.ellipse:drawShapeEllipse(i,s);break;case Ee.line:!function drawShapeLine(i,s){drawLine(i,s.firstPoint,s.lastPoint),"ARROW_HEAD"===s.beginDecoration&&drawArrowHead(i,s.firstPoint,s.beginTangentAngle,12),"ARROW_HEAD"===s.endDecoration&&drawArrowHead(i,s.lastPoint,s.endTangentAngle,12)}(i,s);break;case Ee.recognizedShape:s.primitives.forEach((s=>drawShapeSymbol(i,s)));break}}finally{i.restore()}}var Ce=Object.freeze({__proto__:null,ShapeSymbols:Ee,drawLine:drawLine,drawShapeSymbol:drawShapeSymbol});function drawStroke(i,s,n){n&&s&&"eraser"!==s.pointerType&&n.drawStroke(i,s)}var ke=Object.freeze({__proto__:null,drawStroke:drawStroke});const Me={inputCharacter:"inputCharacter",char:"char",string:"string",textLine:"textLine"};function drawTextLine(i,s){!function drawText(i,s,n){i.save();try{i.font=`${n.textHeight}px serif`,i.textAlign="CENTER"===n.justificationType?"center":"left",i.textBaseline="bottom",i.fillStyle=i.strokeStyle,i.fillText(s,n.topLeftPoint.x,n.topLeftPoint.y+n.height)}finally{i.restore()}}(i,s.label,s.data),s.underlineList.forEach((n=>{!function drawUnderline(i,s,n,a){const l=a.width/n.length;drawLine(i,{x:a.topLeftPoint.x+s.data.firstCharacter*l,y:a.topLeftPoint.y+a.height},{x:a.topLeftPoint.x+s.data.lastCharacter*l,y:a.topLeftPoint.y+a.height})}(i,n,s.label,s.data)}))}function drawTextSymbol(i,s){i.save();try{i.lineWidth=s.style.width,i.strokeStyle=s.style.color;if((s.elementType||s.type)===Me.textLine)drawTextLine(i,s);else console.info(`drawTextSymbol => ${s.elementType} not implemented`)}finally{i.restore()}}var Te=Object.freeze({__proto__:null,TextSymbols:Me,drawTextSymbol:drawTextSymbol});function computeLinksPoints(i,s,n){const a=i.p*n;return[{x:i.x-Math.sin(s)*a,y:i.y+Math.cos(s)*a},{x:i.x+Math.sin(s)*a,y:i.y-Math.cos(s)*a}]}function computeMiddlePoint(i,s){return{x:(s.x+i.x)/2,y:(s.y+i.y)/2,p:(s.p+i.p)/2,t:(s.t+i.t)/2}}function computeAxeAngle(i,s){return Math.atan2(s.y-i.y,s.x-i.x)}var Le,Ie=Object.freeze({__proto__:null,computeLinksPoints:computeLinksPoints,computeMiddlePoint:computeMiddlePoint,computeAxeAngle:computeAxeAngle});class CanvasStroker{renderArc(i,s,n){i.arc(s.x,s.y,n,0,2*Math.PI,!0)}renderLine(i,s,n,a){const l=computeLinksPoints(s,computeAxeAngle(s,n),a),d=computeLinksPoints(n,computeAxeAngle(s,n),a);i.moveTo(l[0].x,l[0].y),i.lineTo(d[0].x,d[0].y),i.lineTo(d[1].x,d[1].y),i.lineTo(l[1].x,l[1].y)}renderFinal(i,s,n,a){const l=computeAxeAngle(s,n),d=computeLinksPoints(n,l,a);i.moveTo(d[0].x,d[0].y);for(let s=1;s<=6;s++){const d=l-s*Math.PI/6;i.lineTo(n.x-n.p*a*Math.sin(d),n.y+n.p*a*Math.cos(d))}}renderQuadratic(i,s,n,a,l){const d=computeLinksPoints(s,computeAxeAngle(s,a),l),c=computeLinksPoints(n,computeAxeAngle(a,n),l),h=computeLinksPoints(a,computeAxeAngle(s,n),l);i.moveTo(d[0].x,d[0].y),i.quadraticCurveTo(h[0].x,h[0].y,c[0].x,c[0].y),i.lineTo(c[1].x,c[1].y),i.quadraticCurveTo(h[1].x,h[1].y,d[1].x,d[1].y)}drawStroke(i,s){const n=s.pointers.length,a=n-2,l=s.style.width>0?s.style.width:i.lineWidth,d=s.style.color?s.style.color:i.strokeStyle,c=s.pointers[0];i.save();try{if(i.beginPath(),n<3)this.renderArc(i,c,.6*l);else{this.renderArc(i,c,l*c.p);const d=computeMiddlePoint(c,s.pointers[1]);this.renderLine(i,c,d,l);for(let n=0;n{var n;const a=s.parentNode,l=Math.max(this.config.minWidth,a.clientWidth),d=Math.max(this.config.minHeight,a.clientHeight);s.width=l*i,s.height=d*i,null===(n=s.getContext("2d"))||void 0===n||n.scale(i,i),s.style.width=`${l}px`,s.style.height=`${d}px`}))}drawSymbol(i,s){const n=s.elementType||s.type;"stroke"===n?drawStroke(i,s,this.stroker):Object.keys(Me).includes(n)?drawTextSymbol(i,s):Object.keys(Ee).includes(n)&&drawShapeSymbol(i,s)}init(i){__classPrivateFieldGet(this,Le,"f").info("init",{element:i});const s=this.createCanvas("ms-rendering-canvas");i.appendChild(s);const n=this.createCanvas("ms-capture-canvas");i.appendChild(n),this.context={parent:i,renderingCanvas:s,renderingCanvasContext:s.getContext("2d"),capturingCanvas:n,capturingCanvasContext:n.getContext("2d")},this.resizeContent()}drawModel(i){var s;__classPrivateFieldGet(this,Le,"f").info("drawModel",{model:i}),null===(s=this.context.renderingCanvasContext)||void 0===s||s.clearRect(0,0,this.context.renderingCanvas.width,this.context.renderingCanvas.height),i.rawStrokes.forEach((i=>this.drawSymbol(this.context.renderingCanvasContext,i))),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height)}drawPendingStroke(i){__classPrivateFieldGet(this,Le,"f").info("drawPendingStroke",{stroke:i}),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height),i&&"eraser"!==(null==i?void 0:i.pointerType)&&this.stroker.drawStroke(this.context.capturingCanvasContext,i)}resize(i){__classPrivateFieldGet(this,Le,"f").info("resize",{model:i}),this.resizeContent(),this.drawModel(i)}destroy(){__classPrivateFieldGet(this,Le,"f").info("destroy"),this.context.parent&&(this.context.parent.innerHTML="")}}Le=new WeakMap;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function createCommonjsModule(i,s){return i(s={exports:{}},s.exports),s.exports}var De=createCommonjsModule((function(i,s){i.exports=function(i){function e(n){if(s[n])return s[n].exports;var a=s[n]={i:n,l:!1,exports:{}};return i[n].call(a.exports,a,a.exports,e),a.l=!0,a.exports}var s={};return e.m=i,e.c=s,e.i=function(i){return i},e.d=function(i,s,n){e.o(i,s)||Object.defineProperty(i,s,{configurable:!1,enumerable:!0,get:n})},e.n=function(i){var s=i&&i.__esModule?function(){return i.default}:function(){return i};return e.d(s,"a",s),s},e.o=function(i,s){return Object.prototype.hasOwnProperty.call(i,s)},e.p="",e(e.s=1)}([function(i,s,n){function o(i,s){if(!(i instanceof s))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(s,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},l=function t(i){var s=this;o(this,t),this.toJSON=function(i){if("string"!=typeof i)return console.error("Need a CSS string but given ",void 0===i?"undefined":a(i),i),"Not a valid CSS..!";var n={},l=void 0,d=void 0,c=void 0;try{i.split("{").forEach((function(i){if(d=i.trim())if(-1===d.indexOf("}"))n[d]={},l=d;else{d.substring(0,d.indexOf("}")).split(";").forEach((function(i){(c=i.split(":"))&&2===c.length&&(n[l][c[0].trim().replace(/^\"|\"$/g,"")]=s._trimSemiColon(c[1].trim().replace(/^\"|\"$/g,"")))}));try{(l=d.split("}")[1].trim())&&(n[l]={})}catch(i){}}}))}catch(i){return"Not a valid CSS..!"}return n},this.toCSS=function(i){if("object"!==(void 0===i?"undefined":a(i)))return console.error("Need a JSON object but given ",void 0===i?"undefined":a(i),i),"Not a valid JSON..!";var s="";try{for(var n in i)if(i.hasOwnProperty(n)){for(var l in s+=n+" {\n",i[n])i[n].hasOwnProperty(l)&&(s+=l+": "+i[n][l]+";\n");s+="}\n"}}catch(i){return"Not a valid JSON..!"}return s},this._trimSemiColon=function(i){return";"===i.slice(-1)?i.slice(0,s.length-1):i}};s.default=l},function(i,s,n){i.exports=n(0).default}])})),Ae=function unwrapExports(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}(De);De.JsonCSS;const Re=new Ae,Ne={themeToCSS:i=>Re.toCSS(i),themeToJSON(i){const s=Re.toJSON(i);return s[".text"]["font-size"]=Number(s[".text"]["font-size"]),s.ink["-myscript-pen-width"]=Number(s.ink["-myscript-pen-width"]),s.ink.width=Number(s.ink.width),s},penStyleToCSS(i){let s=Re.toCSS({css:i});return s=s.substring(6,s.length-3),s},penStyleToJSON(i){const s=Re.toJSON(`css {${i}}`).css;return s.width?s.width=Number(s.width):delete s.width,s["-myscript-pen-width"]?s["-myscript-pen-width"]=Number(s["-myscript-pen-width"]):delete s["-myscript-pen-width"],s},stringToJSON:i=>Re.toJSON(`css {${i}}`).css,JSONToString:i=>Object.entries(i).map((([i,s])=>`${i}:${s}`)).join(";")};var Oe=createCommonjsModule((function(i,s){var n;i.exports=(n=n||function(i,s){var n=Object.create||function(){function F(){}return function(i){var s;return F.prototype=i,s=new F,F.prototype=null,s}}(),a={},l=a.lib={},d=l.Base={extend:function(i){var s=n(this);return i&&s.mixIn(i),s.hasOwnProperty("init")&&this.init!==s.init||(s.init=function(){s.$super.init.apply(this,arguments)}),s.init.prototype=s,s.$super=this,s},create:function(){var i=this.extend();return i.init.apply(i,arguments),i},init:function(){},mixIn:function(i){for(var s in i)i.hasOwnProperty(s)&&(this[s]=i[s]);i.hasOwnProperty("toString")&&(this.toString=i.toString)},clone:function(){return this.init.prototype.extend(this)}},c=l.WordArray=d.extend({init:function(i,n){i=this.words=i||[],this.sigBytes=n!=s?n:4*i.length},toString:function(i){return(i||v).stringify(this)},concat:function(i){var s=this.words,n=i.words,a=this.sigBytes,l=i.sigBytes;if(this.clamp(),a%4)for(var d=0;d>>2]>>>24-d%4*8&255;s[a+d>>>2]|=c<<24-(a+d)%4*8}else for(d=0;d>>2]=n[d>>>2];return this.sigBytes+=l,this},clamp:function(){var s=this.words,n=this.sigBytes;s[n>>>2]&=4294967295<<32-n%4*8,s.length=i.ceil(n/4)},clone:function(){var i=d.clone.call(this);return i.words=this.words.slice(0),i},random:function(s){for(var n,a=[],r=function(s){var n=987654321,a=4294967295;return function(){var l=((n=36969*(65535&n)+(n>>16)&a)<<16)+(s=18e3*(65535&s)+(s>>16)&a)&a;return l/=4294967296,(l+=.5)*(i.random()>.5?1:-1)}},l=0;l>>2]>>>24-l%4*8&255;a.push((d>>>4).toString(16)),a.push((15&d).toString(16))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>3]|=parseInt(i.substr(a,2),16)<<24-a%8*4;return new c.init(n,s/2)}},u=h.Latin1={stringify:function(i){for(var s=i.words,n=i.sigBytes,a=[],l=0;l>>2]>>>24-l%4*8&255;a.push(String.fromCharCode(d))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>2]|=(255&i.charCodeAt(a))<<24-a%4*8;return new c.init(n,s)}},p=h.Utf8={stringify:function(i){try{return decodeURIComponent(escape(u.stringify(i)))}catch(i){throw new Error("Malformed UTF-8 data")}},parse:function(i){return u.parse(unescape(encodeURIComponent(i)))}},_=l.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(i){"string"==typeof i&&(i=p.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes},_process:function(s){var n=this._data,a=n.words,l=n.sigBytes,d=this.blockSize,h=l/(4*d),v=(h=s?i.ceil(h):i.max((0|h)-this._minBufferSize,0))*d,u=i.min(4*v,l);if(v){for(var p=0;p>>1|ie<<31)^(te>>>8|ie<<24)^te>>>7,ne=(ie>>>1|te<<31)^(ie>>>8|te<<24)^(ie>>>7|te<<25),re=v[Y-2],oe=re.high,ae=re.low,le=(oe>>>19|ae<<13)^(oe<<3|ae>>>29)^oe>>>6,de=(ae>>>19|oe<<13)^(ae<<3|oe>>>29)^(ae>>>6|oe<<26),ce=v[Y-7],he=ce.high,ve=ce.low,ue=v[Y-16],pe=ue.high,_e=ue.low;K=(K=(K=se+he+((Q=ne+ve)>>>0>>0?1:0))+le+((Q+=de)>>>0>>0?1:0))+pe+((Q+=_e)>>>0<_e>>>0?1:0),Z.high=K,Z.low=Q}var ge,fe=H&X^~H&$,me=B&U^~B&V,Pe=D&R^D&O^R&O,ye=A&N^A&W^N&W,Se=(D>>>28|A<<4)^(D<<30|A>>>2)^(D<<25|A>>>7),we=(A>>>28|D<<4)^(A<<30|D>>>2)^(A<<25|D>>>7),Fe=(H>>>14|B<<18)^(H>>>18|B<<14)^(H<<23|B>>>9),Ge=(B>>>14|H<<18)^(B>>>18|H<<14)^(B<<23|H>>>9),be=h[Y],xe=be.high,Ee=be.low,Ce=J+Fe+((ge=q+Ge)>>>0>>0?1:0),ke=we+ye;J=$,q=V,$=X,V=U,X=H,U=B,H=z+(Ce=(Ce=(Ce=Ce+fe+((ge+=me)>>>0>>0?1:0))+xe+((ge+=Ee)>>>0>>0?1:0))+K+((ge+=Q)>>>0>>0?1:0))+((B=j+ge|0)>>>0>>0?1:0)|0,z=O,j=W,O=R,W=N,R=D,N=A,D=Ce+(Se+Pe+(ke>>>0>>0?1:0))+((A=ge+ke|0)>>>0>>0?1:0)|0}m=a.low=m+A,a.high=f+D+(m>>>0>>0?1:0),y=l.low=y+N,l.high=P+R+(y>>>0>>0?1:0),w=d.low=w+W,d.high=S+O+(w>>>0>>0?1:0),b=c.low=b+j,c.high=G+z+(b>>>0>>0?1:0),E=u.low=E+B,u.high=x+H+(E>>>0>>0?1:0),k=p.low=k+U,p.high=C+X+(k>>>0>>0?1:0),T=_.low=T+V,_.high=M+$+(T>>>0>>0?1:0),I=g.low=I+q,g.high=L+J+(I>>>0>>0?1:0)},_doFinalize:function(){var i=this._data,s=i.words,n=8*this._nDataBytes,a=8*i.sigBytes;return s[a>>>5]|=128<<24-a%32,s[30+(a+128>>>10<<5)]=Math.floor(n/4294967296),s[31+(a+128>>>10<<5)]=n,i.sigBytes=4*s.length,this._process(),this._hash.toX32()},clone:function(){var i=s.clone.call(this);return i._hash=this._hash.clone(),i},blockSize:32});i.SHA512=s._createHelper(u),i.HmacSHA512=s._createHmacHelper(u)}(),n.SHA512)})),createCommonjsModule((function(i,s){var n,a,l;i.exports=(a=(n=Oe).lib.Base,l=n.enc.Utf8,void(n.algo.HMAC=a.extend({init:function(i,s){i=this._hasher=new i.init,"string"==typeof s&&(s=l.parse(s));var n=i.blockSize,a=4*n;s.sigBytes>a&&(s=i.finalize(s)),s.clamp();for(var d=this._oKey=s.clone(),c=this._iKey=s.clone(),h=d.words,v=c.words,u=0;u{const n=i.split("."),a=s.split(".");for(let i=0;il)return!1;if(s{s.p.push(i.p),s.t.push(i.t),s.x.push(i.x),s.y.push(i.y)})),s}He=new WeakMap;class RestRecognizer{constructor(i,s){Be.set(this,LoggerManager.getLogger("RECOGNIZER")),__classPrivateFieldGet(this,Be,"f").info("constructor",{serverConfig:i,recognitionConfig:s}),this.serverConfiguration=i,this.recognitionConfiguration=s}get url(){return`${this.serverConfiguration.scheme}://${this.serverConfiguration.host}/api/v4.0/iink/batch`}get postConfig(){switch(this.recognitionConfiguration.type){case"DIAGRAM":return{lang:this.recognitionConfiguration.lang,diagram:this.recognitionConfiguration.diagram,export:this.recognitionConfiguration.export};case"MATH":return{lang:this.recognitionConfiguration.lang,math:this.recognitionConfiguration.math,export:this.recognitionConfiguration.export};case"Raw Content":return{lang:this.recognitionConfiguration.lang,"raw-content":this.recognitionConfiguration["raw-content"],export:this.recognitionConfiguration.export};case"TEXT":return{lang:this.recognitionConfiguration.lang,text:this.recognitionConfiguration.text,export:this.recognitionConfiguration.export};default:throw new Error(`get postConfig error Recognition type unkow "${this.recognitionConfiguration.type}"`)}}buildData(i){__classPrivateFieldGet(this,Be,"f").info("buildData",{model:i});const s=[];i.rawStrokes.forEach((i=>{const n=s.findIndex((s=>{return n=s.penStyle,a=i.style,n&&a&&n["-myscript-pen-fill-color"]===a["-myscript-pen-fill-color"]&&n["-myscript-pen-fill-style"]===a["-myscript-pen-fill-style"]&&n["-myscript-pen-width"]===a["-myscript-pen-width"]&&n.color===a.color&&n.width===a.width;var n,a}));n>-1?s[n].strokes.push(i):s.push({penStyle:i.style,strokes:[i]})}));const n=[];s.forEach((i=>{const s={penStyle:"{}"===JSON.stringify(i.penStyle)?void 0:Ne.penStyleToCSS(i.penStyle),strokes:i.strokes.map(convertStrokeToJSON)};n.push(s)}));const a="Raw Content"===this.recognitionConfiguration.type?"Raw Content":this.recognitionConfiguration.type.charAt(0).toUpperCase()+this.recognitionConfiguration.type.slice(1).toLowerCase(),l={configuration:this.postConfig,xDPI:96,yDPI:96,contentType:a,height:i.height,width:i.width,strokeGroups:n};return __classPrivateFieldGet(this,Be,"f").debug("buildData",{data:l}),l}post(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Be,"f").info("post",{data:i,mimeType:s});const n=new Headers;n.append("Accept","application/json,"+s),n.append("applicationKey",this.serverConfiguration.applicationKey),n.append("hmac",computeHmac(JSON.stringify(i),this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)),n.append("Content-Type","application/json"),isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(n.append("myscript-client-name","iink-ts"),n.append("myscript-client-version","1.0.0-buildVersion"));const a={method:"POST",headers:n,body:JSON.stringify(i)},l=new Request(this.url,a),d=yield fetch(l);if(d.ok){const i=d.headers.get("content-type");let s;switch(i){case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"image/png":case"image/jpeg":s=yield d.blob();break;case"application/json":s=yield d.json();break;case"application/vnd.myscript.jiix":s=yield d.clone().json().catch((()=>__awaiter(this,void 0,void 0,(function*(){return yield d.text()}))));break;default:__classPrivateFieldGet(this,Be,"f").warn("post default",{contentType:i}),s=yield d.text()}return __classPrivateFieldGet(this,Be,"f").debug("post",{result:s}),s}{const i=yield d.json();throw __classPrivateFieldGet(this,Be,"f").error("post",{err:i}),i}}))}tryFetch(i,s){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Be,"f").debug("tryFetch",{data:i,mimeType:s}),this.post(i,s).then((i=>{const n={};return n[s]=i,__classPrivateFieldGet(this,Be,"f").debug("tryFetch",{exports:n}),n})).catch((n=>{__classPrivateFieldGet(this,Be,"f").error("tryFetch",{data:i,mimeType:s,err:n});let a=n.message||y.UNKNOW;n.code?"access.not.granted"===n.code&&(a=y.WRONG_CREDENTIALS):a=y.CANT_ESTABLISH;throw new Error(a)}))}))}getMimeTypes(i){__classPrivateFieldGet(this,Be,"f").info("getMimeTypes",{requestedMimeTypes:i});let s=i||[];if(!s.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":s=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":s=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":s=["application/vnd.myscript.jiix"];break;case"TEXT":s=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}return s}convert(i,s,n){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Be,"f").info("convert",{model:i,conversionState:s,requestedMimeTypes:n});const a=i.getClone(),l=this.getMimeTypes(n),d=this.buildData(a);d.conversionState=s;const c=l.map((i=>this.tryFetch(d,i)));return(yield Promise.all(c)).forEach((i=>{a.mergeConvert(i)})),__classPrivateFieldGet(this,Be,"f").debug("convert",{model:a}),a}))}export(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Be,"f").info("export",{model:i,requestedMimeTypes:s});const n=i.getClone();if(0===n.rawStrokes.length)return Promise.resolve(n);const a=this.getMimeTypes(s);if(!a.length)return __classPrivateFieldGet(this,Be,"f").error("export",{model:i,requestedMimeTypes:s,"Export failed, no mimeTypes define in recognition configuration":String}),Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration"));const l=a.filter((i=>!n.exports||!n.exports[i])),d=this.buildData(i);return(yield Promise.all(l.map((i=>this.tryFetch(d,i))))).forEach((i=>{n.mergeExport(i)})),__classPrivateFieldGet(this,Be,"f").debug("export",{model:n}),n}))}resize(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Be,"f").info("resize",{model:i}),this.export(i)}))}}Be=new WeakMap;class UndoRedoContext{constructor(i){this.stackIndex=0,this.possibleUndoCount=0,this.canRedo=!1,this.canUndo=!1,this.empty=!0,this.stack=[i.getClone()]}}class UndoRedoManager{constructor(i,s){Xe.set(this,LoggerManager.getLogger("UNDOREDO_MANAGER")),__classPrivateFieldGet(this,Xe,"f").info("constructor",{configuration:i,model:s}),this.configuration=i,this.context=new UndoRedoContext(s)}get internalEvent(){return InternalEvent.getInstance()}updateCanUndoRedo(){this.context.canRedo=this.context.stack.length-1>this.context.stackIndex,this.context.canUndo=this.context.stackIndex>0;const i=this.context.stack[this.context.stackIndex];this.context.empty=0===i.rawStrokes.length}addModelToStack(i){__classPrivateFieldGet(this,Xe,"f").info("addModelToStack",{model:i}),this.context.stackIndex+1this.configuration.maxStackSize&&(this.context.stack.shift(),this.context.stackIndex--),this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)}removeLastModelInStack(){__classPrivateFieldGet(this,Xe,"f").info("removeLastModelInStack"),this.context.stackIndex===this.context.stack.length-1&&this.context.stackIndex--,this.context.stack.pop(),this.updateCanUndoRedo()}updateModelInStack(i){__classPrivateFieldGet(this,Xe,"f").info("updateModelInStack",{model:i});const s=this.context.stack.findIndex((s=>s.modificationDate===i.modificationDate));s>-1&&this.context.stack.splice(s,1,i.getClone()),this.internalEvent.emitContextChange(this.context)}undo(){__classPrivateFieldGet(this,Xe,"f").info("undo"),this.context.canUndo&&(this.context.stackIndex--,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Xe,"f").debug("undo",i),i}redo(){__classPrivateFieldGet(this,Xe,"f").info("redo"),this.context.canRedo&&(this.context.stackIndex++,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Xe,"f").debug("redo",i),i}reset(i){__classPrivateFieldGet(this,Xe,"f").info("reset",{model:i}),this.context=new UndoRedoContext(i),this.internalEvent.emitContextChange(this.context)}}Xe=new WeakMap;const $e={},Ve={ink:{color:"#000000",width:1,"-myscript-pen-width":1,"-myscript-pen-fill-style":"none","-myscript-pen-fill-color":"#FFFFFF00"},".math":{"font-family":"STIXGeneral"},".math-solved":{"font-family":"STIXGeneral",color:"#A8A8A8FF"},".text":{"font-family":"MyScriptInter","font-size":10}};var Je,qe,Ye,Ze,Ke;class StyleManager{constructor(i,s){Je.set(this,void 0),qe.set(this,void 0),Ye.set(this,void 0),Ze.set(this,void 0),Ke.set(this,LoggerManager.getLogger("STYLEMANAGER")),__classPrivateFieldGet(this,Ke,"f").info("constructor",{penStyle:i,theme:s}),this.setTheme(s),this.setPenStyleClasses(),this.setPenStyle(i)}get currentPenStyle(){return __classPrivateFieldGet(this,Ze,"f")||__classPrivateFieldGet(this,Je,"f")}get penStyle(){return __classPrivateFieldGet(this,Je,"f")}setPenStyle(i){__classPrivateFieldGet(this,Ke,"f").info("setPenStyle",{style:i}),__classPrivateFieldSet(this,Je,mergeDeep(structuredClone($e),i||{}),"f"),__classPrivateFieldSet(this,Ze,i||this.theme[`.${__classPrivateFieldGet(this,Ye,"f")}`],"f"),__classPrivateFieldGet(this,Ke,"f").debug("setPenStyle",__classPrivateFieldGet(this,Ze,"f"))}get theme(){return __classPrivateFieldGet(this,qe,"f")}setTheme(i){__classPrivateFieldGet(this,Ke,"f").info("setTheme",{theme:i}),__classPrivateFieldSet(this,qe,mergeDeep(structuredClone(Ve),i||{}),"f"),__classPrivateFieldGet(this,Ke,"f").debug("setTheme",__classPrivateFieldGet(this,qe,"f"))}get penStyleClasses(){return __classPrivateFieldGet(this,Ye,"f")}setPenStyleClasses(i=""){__classPrivateFieldGet(this,Ke,"f").info("setPenStyleClasses",{penStyleClass:i}),__classPrivateFieldSet(this,Ye,i,"f"),__classPrivateFieldSet(this,Ze,this.theme[`.${__classPrivateFieldGet(this,Ye,"f")}`],"f"),__classPrivateFieldGet(this,Ke,"f").debug("setPenStyleClasses",__classPrivateFieldGet(this,Ze,"f"))}}function computeDistance(i,s){const n=Math.hypot(s.y-i.y,s.x-i.x);return isNaN(n)?0:n}Je=new WeakMap,qe=new WeakMap,Ye=new WeakMap,Ze=new WeakMap,Ke=new WeakMap;var Qe,et,tt,it,st,nt,rt,ot,at,lt,dt,ct,ht,vt,ut,pt,_t,gt,ft,mt,Pt=Object.freeze({__proto__:null,computeDistance:computeDistance});class Model{constructor(i=100,s=100,n=Date.now()){Qe.add(this),et.set(this,LoggerManager.getLogger("MODEL")),__classPrivateFieldGet(this,et,"f").info("constructor",{width:i,height:s,creationDate:n}),this.creationTime=n,this.modificationDate=n,this.width=i,this.height=s,this.rawStrokes=[],this.selectedStrokes=[],this.positions={lastSentPosition:0,lastReceivedPosition:0},this.idle=!0}mergeExport(i){__classPrivateFieldGet(this,et,"f").info("mergeExport",{exports:i}),this.exports?Object.assign(this.exports,i):this.exports=i,__classPrivateFieldGet(this,et,"f").debug("mergeExport",this.exports)}mergeConvert(i){__classPrivateFieldGet(this,et,"f").info("mergeConvert",{converts:i}),this.converts?Object.assign(this.converts,i):this.converts=i,__classPrivateFieldGet(this,et,"f").debug("mergeConvert",this.converts)}computePressure(i,s){let n=1;0===s?n=.5:i===s?n=1:i<10?n=.2+Math.pow(.1*i,.4):i>s-10&&(n=.2+Math.pow(.1*(s-i),.4));const a=n*Math.max(.1,1-.1*Math.sqrt(i));return isNaN(a)?.5:Math.round(100*a)/100}filterPointByAcquisitionDelta(i,s,n){const a=2+(i.style["-myscript-pen-width"]||0)/4;return!n||0===i.pointers.length||Math.abs(n.x-s.x)>=a||Math.abs(n.y-s.y)>=a}addPoint(i,s){__classPrivateFieldGet(this,et,"f").debug("addPoint",{stroke:i,pointer:s});const n=i.pointers.at(-1)||{p:1,t:0,x:0,y:0};if(this.filterPointByAcquisitionDelta(i,s,n)){const a=computeDistance(s,n);i.length+=a,s.p=this.computePressure(a,i.length),i.pointers.push(s)}}addStroke(i){__classPrivateFieldGet(this,et,"f").info("addStroke",{stroke:i}),this.rawStrokes.push(i)}extractUnsentStrokes(){return this.rawStrokes.slice(this.positions.lastSentPosition)}initCurrentStroke(i,s,n,a,l=96){if(__classPrivateFieldGet(this,et,"f").info("initCurrentStroke",{point:i,pointerId:s,pointerType:n,style:a,dpi:l}),a["-myscript-pen-width"]){const i=a["-myscript-pen-width"]*l/25.4;a.width=i/2}this.modificationDate=Date.now(),this.exports=void 0,this.converts=void 0,this.currentStroke=new Stroke(a,s,n),__classPrivateFieldGet(this,et,"f").debug("initCurrentStroke",this.currentStroke),this.addPoint(this.currentStroke,i)}appendToCurrentStroke(i){__classPrivateFieldGet(this,et,"f").info("appendToCurrentStroke",{point:i}),this.currentStroke&&this.addPoint(this.currentStroke,i),__classPrivateFieldGet(this,et,"f").debug("appendToCurrentStroke",this.currentStroke)}endCurrentStroke(i){__classPrivateFieldGet(this,et,"f").info("endCurrentStroke",{point:i}),this.currentStroke&&(this.addPoint(this.currentStroke,i),this.addStroke(this.currentStroke),this.currentStroke=void 0),__classPrivateFieldGet(this,et,"f").debug("endCurrentStroke",this.currentStroke)}resetSelectedStrokes(){this.selectedStrokes=[]}appendSelectedStrokesFromPoint(i){__classPrivateFieldGet(this,et,"f").info("appendSelectedStrokesFromPoint",{point:i}),__classPrivateFieldGet(this,Qe,"m",tt).call(this,i).forEach((i=>{this.selectedStrokes.includes(i)||this.selectedStrokes.push(i)}))}updateStroke(i){__classPrivateFieldGet(this,et,"f").info("updateStroke",{updatedStroke:i});const s=this.rawStrokes.findIndex((s=>s.id===i.id));-1!==s&&this.rawStrokes.splice(s,1,i),__classPrivateFieldGet(this,et,"f").debug("updateStroke",this.rawStrokes)}removeStroke(i){__classPrivateFieldGet(this,et,"f").info("removeStroke",{id:i});const s=this.rawStrokes.findIndex((s=>s.id===i));-1!==s&&this.rawStrokes.splice(s,1),__classPrivateFieldGet(this,et,"f").debug("removeStroke",this.rawStrokes)}removeStrokesFromPoint(i){__classPrivateFieldGet(this,et,"f").info("removeStrokesFromPoint",{point:i});const s=__classPrivateFieldGet(this,Qe,"m",tt).call(this,i);return s.forEach((i=>{this.removeStroke(i.id)})),__classPrivateFieldGet(this,et,"f").debug("removeStrokesFromPoint",s.map((i=>i.id))),s.map((i=>i.id))}updatePositionSent(i=this.rawStrokes.length){__classPrivateFieldGet(this,et,"f").info("updatePositionSent",{position:i}),this.positions.lastSentPosition=i,__classPrivateFieldGet(this,et,"f").debug("updatePositionSent",this.positions.lastSentPosition)}updatePositionReceived(){__classPrivateFieldGet(this,et,"f").info("updatePositionReceived"),this.positions.lastReceivedPosition=this.positions.lastSentPosition,__classPrivateFieldGet(this,et,"f").debug("updatePositionReceived",this.positions.lastReceivedPosition)}getClone(){__classPrivateFieldGet(this,et,"f").info("getClone");const i=new Model(this.width,this.height,this.creationTime);return i.modificationDate=JSON.parse(JSON.stringify(this.modificationDate)),i.currentStroke=this.currentStroke?JSON.parse(JSON.stringify(this.currentStroke)):void 0,i.rawStrokes=JSON.parse(JSON.stringify(this.rawStrokes)),i.positions=JSON.parse(JSON.stringify(this.positions)),i.exports=this.exports?JSON.parse(JSON.stringify(this.exports)):void 0,i.converts=this.converts?JSON.parse(JSON.stringify(this.converts)):void 0,i.idle=this.idle,__classPrivateFieldGet(this,et,"f").debug("getClone",{clonedModel:i}),i}clear(){__classPrivateFieldGet(this,et,"f").info("clear"),this.modificationDate=Date.now(),this.currentStroke=void 0,this.rawStrokes=[],this.positions.lastSentPosition=0,this.positions.lastReceivedPosition=0,this.exports=void 0,this.converts=void 0,this.idle=!0}}et=new WeakMap,Qe=new WeakSet,tt=function _Model_getStrokeFromPoint(i){__classPrivateFieldGet(this,et,"f").info("getStrokeFromPoint",{point:i});const isBetween=(i,s,n)=>i>=s&&i<=n,s=[];return this.rawStrokes.forEach((n=>{for(let a=0;a0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(this.model,i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,nt,"f").warn(`onPointerDown intention unknow: "${this.intention}"`)}}onPointerMove(i,s){switch(__classPrivateFieldGet(this,nt,"f").info("onPointerMove",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,st,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.appendToCurrentStroke(s),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,nt,"f").warn(`onPointerMove intention unknow: "${this.intention}"`)}}onPointerUp(i,s){switch(__classPrivateFieldGet(this,nt,"f").info("onPointerUp",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,st,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,st,"f"),i))).catch((i=>this.internalEvent.emitError(i)));break;default:__classPrivateFieldGet(this,nt,"f").warn(`onPointerUp intention unknow: "${this.intention}"`)}}drawCurrentStroke(){__classPrivateFieldGet(this,nt,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke}),this.renderer.drawPendingStroke(this.model.currentStroke)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("updateModelRendering"),this.renderer.drawModel(this.model);const i=new DeferredPromise;if(this.undoRedoManager.addModelToStack(this.model),"DEMAND"!==__classPrivateFieldGet(this,it,"f").triggers.exportContent){clearTimeout(__classPrivateFieldGet(this,ot,"f"));let s=this.model.getClone();__classPrivateFieldSet(this,ot,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{s=yield this.recognizer.export(s),this.undoRedoManager.updateModelInStack(s),this.model.modificationDate===s.modificationDate&&(this.model.exports=s.exports),i.resolve(this.model)}catch(s){__classPrivateFieldGet(this,nt,"f").error("updateModelRendering",{error:s}),i.reject(s)}}))),"QUIET_PERIOD"===__classPrivateFieldGet(this,it,"f").triggers.exportContent?__classPrivateFieldGet(this,it,"f").triggers.exportContentDelay:0),"f")}else i.resolve(this.model);return yield i.promise,this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,nt,"f").debug("updateModelRendering",this.model.exports),i.promise}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("export",{mimeTypes:i});const s=yield this.recognizer.export(this.model.getClone(),i);return this.model.modificationDate===s.modificationDate&&this.model.mergeExport(s.exports),this.undoRedoManager.updateModelInStack(s),__classPrivateFieldGet(this,nt,"f").debug("export",this.model),this.model}))}convert(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("convert",{conversionState:i,requestedMimeTypes:s});const n=yield this.recognizer.convert(this.model,i,s);return Object.assign(__classPrivateFieldGet(this,st,"f"),n),__classPrivateFieldGet(this,nt,"f").debug("convert",this.model),this.model}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s,this.renderer.resize(this.model),this.model.rawStrokes.length?(clearTimeout(__classPrivateFieldGet(this,rt,"f")),__classPrivateFieldSet(this,rt,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){const i=yield this.recognizer.resize(this.model);n.resolve(i)}))),__classPrivateFieldGet(this,it,"f").triggers.resizeTriggerDelay),"f")):n.resolve(this.model);const a=yield n.promise;return __classPrivateFieldGet(this,nt,"f").debug("resize",{newModel:a}),this.internalEvent.emitExported(a.exports),a}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("undo"),__classPrivateFieldSet(this,st,this.undoRedoManager.undo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,st,"f")),__classPrivateFieldSet(this,st,yield this.recognizer.export(__classPrivateFieldGet(this,st,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,st,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,st,"f").exports),__classPrivateFieldGet(this,nt,"f").debug("undo",__classPrivateFieldGet(this,st,"f")),__classPrivateFieldGet(this,st,"f")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("redo"),__classPrivateFieldSet(this,st,this.undoRedoManager.redo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,st,"f")),__classPrivateFieldSet(this,st,yield this.recognizer.export(__classPrivateFieldGet(this,st,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,st,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,st,"f").exports),__classPrivateFieldGet(this,nt,"f").debug("redo",__classPrivateFieldGet(this,st,"f")),__classPrivateFieldGet(this,st,"f")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.renderer.drawModel(this.model),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,nt,"f").debug("clear",this.model),this.model}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),Promise.resolve()}))}}it=new WeakMap,st=new WeakMap,nt=new WeakMap,rt=new WeakMap,ot=new WeakMap;class WSRecognizer{constructor(i,s){at.set(this,LoggerManager.getLogger("RECOGNIZER")),this.pingCount=0,this.reconnectionCount=0,this.serverConfiguration=i,this.recognitionConfiguration=s;const n="https"===this.serverConfiguration.scheme?"wss":"ws";this.url=`${n}://${this.serverConfiguration.host}/api/v4.0/iink/document?applicationKey=${this.serverConfiguration.applicationKey}`,__classPrivateFieldGet(this,at,"f").info("constructor",{serverConfig:i,recognitionConfig:s,url:this.url})}get mimeTypes(){switch(this.recognitionConfiguration.type.toLocaleLowerCase()){case"text":return this.recognitionConfiguration.text.mimeTypes;case"math":return this.recognitionConfiguration.math.mimeTypes;case"diagram":return this.recognitionConfiguration.diagram.mimeTypes;default:return[]}}get internalEvent(){return InternalEvent.getInstance()}infinitePing(){this.pingCount++,this.serverConfiguration.websocket.maxPingLostCount{this.socket.readyState<=1&&(this.socket.send(JSON.stringify({type:"ping"})),this.infinitePing())}),this.serverConfiguration.websocket.pingDelay)}openCallback(){var i;null===(i=this.connected)||void 0===i||i.resolve();const s={type:this.sessionId?"restoreIInkSession":"newContentPackage",iinkSessionId:this.sessionId,applicationKey:this.serverConfiguration.applicationKey,xDpi:96,yDpi:96,viewSizeHeight:this.viewSizeHeight,viewSizeWidth:this.viewSizeWidth};isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(s["myscript-client-name"]="iink-ts",s["myscript-client-version"]="1.0.0-buildVersion"),this.send(s)}rejectDeferredPending(i){var s,n,a,l,d,c,h,v,u,p,_,g,f,m,P,y,S,w,G,b;(null===(s=this.connected)||void 0===s?void 0:s.isPending)&&(null===(n=this.connected)||void 0===n||n.reject(i)),(null===(a=this.initialized)||void 0===a?void 0:a.isPending)&&(null===(l=this.initialized)||void 0===l||l.reject(i)),(null===(d=this.addStrokeDeferred)||void 0===d?void 0:d.isPending)&&(null===(c=this.addStrokeDeferred)||void 0===c||c.reject(i)),(null===(h=this.exportDeferred)||void 0===h?void 0:h.isPending)&&(null===(v=this.exportDeferred)||void 0===v||v.reject(i)),(null===(u=this.convertDeferred)||void 0===u?void 0:u.isPending)&&(null===(p=this.convertDeferred)||void 0===p||p.reject(i)),(null===(_=this.importDeferred)||void 0===_?void 0:_.isPending)&&(null===(g=this.importDeferred)||void 0===g||g.reject(i)),(null===(f=this.resizeDeferred)||void 0===f?void 0:f.isPending)&&(null===(m=this.resizeDeferred)||void 0===m||m.reject(i)),(null===(P=this.undoDeferred)||void 0===P?void 0:P.isPending)&&(null===(y=this.undoDeferred)||void 0===y||y.reject(i)),(null===(S=this.redoDeferred)||void 0===S?void 0:S.isPending)&&(null===(w=this.redoDeferred)||void 0===w||w.reject(i)),(null===(G=this.clearDeferred)||void 0===G?void 0:G.isPending)&&this.clearDeferred.reject(i),(null===(b=this.waitForIdleDeferred)||void 0===b?void 0:b.isPending)&&this.waitForIdleDeferred.reject(i)}closeCallback(i){let s="";if(!this.currentErrorCode)switch(i.code){case 1e3:break;case 1001:s=y.GOING_AWAY;break;case 1002:s=y.PROTOCOL_ERROR;break;case 1003:s=y.UNSUPPORTED_DATA;break;case 1006:s=y.ABNORMAL_CLOSURE;break;case 1007:s=y.INVALID_FRAME_PAULOAD;break;case 1008:s=y.POLICY_VIOLATION;break;case 1009:s=y.MESSAGE_TOO_BIG;break;case 1011:s=y.INTERNAL_ERROR;break;case 1012:s=y.SERVICE_RESTART;break;case 1013:s=y.TRY_AGAIN;break;case 1014:s=y.BAD_GATEWAY;break;case 1015:s=y.TLS_HANDSHAKE;break;default:__classPrivateFieldGet(this,at,"f").warn("closeCallback unknow CloseEvent.code",{evt:i}),s=y.CANT_ESTABLISH}const n=new Error(s||i.reason);this.rejectDeferredPending(n),this.currentErrorCode||1e3===i.code||this.internalEvent.emitError(n)}manageHMACChallengeMessage(i){__classPrivateFieldGet(this,at,"f").info("manageHMACChallengeMessage",{websocketMessage:i});const s=i;s.hmacChallenge&&this.send({type:"hmac",hmac:computeHmac(s.hmacChallenge,this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)}),s.iinkSessionId&&(this.sessionId=s.iinkSessionId)}manageContentPackageDescriptionMessage(){this.reconnectionCount=0,__classPrivateFieldGet(this,at,"f").info("manageContentPackageDescriptionMessage"),this.send(Object.assign(Object.assign({},this.recognitionConfiguration),{type:"configuration"})),this.currentPartId?this.send({type:"openContentPart",id:this.currentPartId,mimeTypes:this.mimeTypes}):this.send({type:"newContentPart",contentType:this.recognitionConfiguration.type,mimeTypes:this.mimeTypes})}managePartChangeMessage(i){var s;__classPrivateFieldGet(this,at,"f").info("managePartChangeMessage",{websocketMessage:i});const n=i;this.currentPartId=n.partId,null===(s=this.initialized)||void 0===s||s.resolve()}manageExportMessage(i){var s,n,a,l,d,c,h,v,u;__classPrivateFieldGet(this,at,"f").info("manageExportMessage",{websocketMessage:i});const p=i;p.exports["application/vnd.myscript.jiix"]&&(p.exports["application/vnd.myscript.jiix"]=JSON.parse(p.exports["application/vnd.myscript.jiix"].toString())),null===(s=this.initialized)||void 0===s||s.resolve(),null===(n=this.addStrokeDeferred)||void 0===n||n.resolve(p.exports),null===(a=this.exportDeferred)||void 0===a||a.resolve(p.exports),null===(l=this.convertDeferred)||void 0===l||l.resolve(p.exports),null===(d=this.importDeferred)||void 0===d||d.resolve(p.exports),null===(c=this.undoDeferred)||void 0===c||c.resolve(p.exports),null===(h=this.redoDeferred)||void 0===h||h.resolve(p.exports),null===(v=this.clearDeferred)||void 0===v||v.resolve(p.exports),null===(u=this.importPointEventsDeferred)||void 0===u||u.resolve(p.exports),this.internalEvent.emitExported(p.exports)}manageWaitForIdle(){var i;return __awaiter(this,void 0,void 0,(function*(){this.internalEvent.emitIdle(!0),null===(i=this.waitForIdleDeferred)||void 0===i||i.resolve()}))}manageErrorMessage(i){var s,n;const a=i;this.currentErrorCode=(null===(s=a.data)||void 0===s?void 0:s.code)||a.code;let l=(null===(n=a.data)||void 0===n?void 0:n.message)||a.message||y.UNKNOW;switch(this.currentErrorCode){case"no.activity":l=y.NO_ACTIVITY;break;case"access.not.granted":l=y.WRONG_CREDENTIALS;break;case"session.too.old":l=y.TOO_OLD}const d=new Error(l);this.rejectDeferredPending(d),this.internalEvent.emitError(d)}manageContentChangeMessage(i){__classPrivateFieldGet(this,at,"f").info("manageContentChangeMessage",{websocketMessage:i});const s=i,n={canRedo:s.canRedo,canUndo:s.canUndo,empty:s.empty,stackIndex:s.undoStackIndex,possibleUndoCount:s.possibleUndoCount,stack:[]};this.internalEvent.emitContextChange(n)}manageSVGPatchMessage(i){var s;__classPrivateFieldGet(this,at,"f").info("manageSVGPatchMessage",{websocketMessage:i}),null===(s=this.resizeDeferred)||void 0===s||s.resolve();const n=i;this.internalEvent.emitSVGPatch(n)}messageCallback(i){var s;__classPrivateFieldGet(this,at,"f").debug("messageCallback",{message:i}),this.currentErrorCode=void 0;const n=JSON.parse(i.data);if("pong"!==n.type)switch(this.pingCount=0,n.type){case"ack":this.manageHMACChallengeMessage(n);break;case"contentPackageDescription":this.manageContentPackageDescriptionMessage();break;case"partChanged":this.managePartChangeMessage(n);break;case"newPart":null===(s=this.initialized)||void 0===s||s.resolve();break;case"contentChanged":this.manageContentChangeMessage(n);break;case"exported":this.manageExportMessage(n);break;case"svgPatch":this.manageSVGPatchMessage(n);break;case"error":this.manageErrorMessage(n);break;case"idle":this.manageWaitForIdle();break;default:__classPrivateFieldGet(this,at,"f").warn("messageCallback",`Message type unknow: "${n.type}".`)}}init(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){try{return __classPrivateFieldGet(this,at,"f").info("init",{height:i,width:s}),this.destroy(),this.connected=new DeferredPromise,this.initialized=new DeferredPromise,this.viewSizeHeight=i,this.viewSizeWidth=s,this.pingCount=0,this.socket=new WebSocket(this.url),this.serverConfiguration.websocket.pingEnabled&&this.infinitePing(),this.socket.addEventListener("open",this.openCallback.bind(this)),this.socket.addEventListener("close",this.closeCallback.bind(this)),this.socket.addEventListener("message",this.messageCallback.bind(this)),this.initialized.promise}catch(i){const s=new Error(y.CANT_ESTABLISH);return this.internalEvent.emitError(s),null===(n=this.initialized)||void 0===n||n.reject(s),null===(a=this.initialized)||void 0===a?void 0:a.promise}}))}send(i){return __awaiter(this,void 0,void 0,(function*(){return this.connected?(yield this.connected.promise,this.socket.readyState===this.socket.OPEN?(__classPrivateFieldGet(this,at,"f").debug("send",{message:i}),this.socket.send(JSON.stringify(i)),Promise.resolve()):this.socket.readyState!=this.socket.CONNECTING&&this.serverConfiguration.websocket.autoReconnect?(this.reconnectionCount++,this.serverConfiguration.websocket.maxRetryCount>=this.reconnectionCount?(__classPrivateFieldGet(this,at,"f").debug("send",`try to reconnect number: ${this.reconnectionCount}.`),this.internalEvent.emitClearMessage(),yield this.init(this.viewSizeHeight,this.viewSizeWidth),yield this.setPenStyle(this.penStyle),yield this.setPenStyleClasses(this.penStyleClasses),yield this.setTheme(this.theme),this.send(i)):Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached."))):void 0):Promise.reject(new Error("Recognizer must be initilized"))}))}addStrokes(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,at,"f").info("addStrokes",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.addStrokeDeferred=new DeferredPromise,0===i.length?this.addStrokeDeferred.resolve({}):yield this.send({type:"addStrokes",strokes:i.map(convertStrokeToJSON)}),null===(n=this.addStrokeDeferred)||void 0===n?void 0:n.promise}))}setPenStyle(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("setPenStyle",{penStyle:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyle=i;const n={type:"setPenStyle",style:Ne.penStyleToCSS(i)};return this.send(n)}))}setPenStyleClasses(i){var s;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyleClasses=i,__classPrivateFieldGet(this,at,"f").info("setPenStyleClasses",{penStyleClasses:i});const n={type:"setPenStyleClasses",styleClasses:i};return this.send(n)}))}setTheme(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("setTheme",{theme:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.theme=i;const n={type:"setTheme",theme:Ne.themeToCSS(i)};return this.send(n)}))}export(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("export",{model:i,requestedMimeTypes:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.exportDeferred=new DeferredPromise;const l=i.getClone();let d=s||[];if(!d.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":d=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":d=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":d=["application/vnd.myscript.jiix"];break;case"TEXT":d=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}if(!d.length)return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${this.recognitionConfiguration.type} configuration`));const c={type:"export",partId:this.currentPartId,mimeTypes:d};yield this.send(c);const h=yield null===(a=this.exportDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeExport(h),__classPrivateFieldGet(this,at,"f").debug("export",{model:l}),l}))}import(i,s,n){var a,l;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("import",{data:s,mimeType:n}),yield null===(a=this.initialized)||void 0===a?void 0:a.promise;const d=i.getClone(),c=this.serverConfiguration.websocket.fileChunkSize,h=Math.random().toString(10).substring(2,6);this.importDeferred=new DeferredPromise;const readBlob=i=>{const s=new FileReader;return new Promise(((n,a)=>{s.onloadend=i=>{var s;return n(null===(s=i.target)||void 0===s?void 0:s.result)},s.onerror=()=>a(),s.readAsText(i)}))},v={type:"importFile",importFileId:h,mimeType:n};yield this.send(v);for(let i=0;is.size};yield this.send(a)}const u=yield null===(l=this.importDeferred)||void 0===l?void 0:l.promise;return this.importDeferred=void 0,d.mergeExport(u),d}))}resize(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("resize",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.resizeDeferred=new DeferredPromise;const a=i.getClone();this.viewSizeHeight=a.height,this.viewSizeWidth=a.width;const l={type:"changeViewSize",height:this.viewSizeHeight,width:this.viewSizeWidth};return yield this.send(l),yield null===(n=this.resizeDeferred)||void 0===n?void 0:n.promise,a}))}importPointEvents(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("importPointsEvents",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.importPointEventsDeferred=new DeferredPromise;const a={type:"pointerEvents",events:i.map(convertStrokeToJSON)};this.send(a);const l=yield null===(n=this.importPointEventsDeferred)||void 0===n?void 0:n.promise;return this.importPointEventsDeferred=void 0,__classPrivateFieldGet(this,at,"f").debug("importPointEvents",{exportPoints:l}),l}))}convert(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("convert",{model:i,conversionState:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.convertDeferred=new DeferredPromise;const l=i.getClone(),d={type:"convert",conversionState:s};yield this.send(d);const c=yield null===(a=this.convertDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeConvert(c),l.mergeExport(c),__classPrivateFieldGet(this,at,"f").debug("convert",{model:l}),l}))}waitForIdle(){var i,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(i=this.initialized)||void 0===i?void 0:i.promise,this.waitForIdleDeferred=new DeferredPromise;return yield this.send({type:"waitForIdle"}),null===(s=this.waitForIdleDeferred)||void 0===s?void 0:s.promise}))}undo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("undo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.undoDeferred=new DeferredPromise;yield this.send({type:"undo"});const l=yield null===(n=this.undoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,at,"f").debug("undo",{model:a}),this.undoDeferred=void 0,a}))}redo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("redo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.redoDeferred=new DeferredPromise;yield this.send({type:"redo"});const l=yield null===(n=this.redoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,at,"f").debug("redo",{model:l}),this.redoDeferred=void 0,a}))}clear(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("clear",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();a.modificationDate=Date.now(),this.clearDeferred=new DeferredPromise;yield this.send({type:"clear"});const l=yield null===(n=this.clearDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),this.clearDeferred=void 0,__classPrivateFieldGet(this,at,"f").info("clear",{model:a}),a}))}close(i,s){this.socket.readyState!==this.socket.OPEN&&this.socket.readyState!==this.socket.CONNECTING||(__classPrivateFieldGet(this,at,"f").info("close",{code:i,reason:s}),this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.socket.close(i,s))}destroy(){__classPrivateFieldGet(this,at,"f").info("destroy"),this.connected=void 0,this.initialized=void 0,this.addStrokeDeferred=void 0,this.exportDeferred=void 0,this.convertDeferred=void 0,this.importDeferred=void 0,this.resizeDeferred=void 0,this.undoDeferred=void 0,this.redoDeferred=void 0,this.clearDeferred=void 0,this.socket&&(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.close(1e3,"Recognizer destroyed"))}}at=new WeakMap;class SVGStroker{getArcPath(i,s){return[`M ${i.x},${i.y}`,`m ${-s},0`,`a ${s},${s} 0 1 0 ${2*s},0`,`a ${s},${s} 0 1 0 ${-2*s},0`].join(" ")}getLinePath(i,s,n){const a=computeLinksPoints(i,computeAxeAngle(i,s),n),l=computeLinksPoints(s,computeAxeAngle(i,s),n);return[`M ${a[0].x},${a[0].y}`,`L ${l[0].x},${l[0].y}`,`L ${l[1].x},${l[1].y}`,`L ${a[1].x},${a[1].y}`].join(" ")}getFinalPath(i,s,n){const a=computeAxeAngle(i,s),l=computeLinksPoints(s,a,n),d=[`M ${l[0].x},${l[0].y}`];for(let i=1;i<=6;i++){const l=a-i*(Math.PI/6);d.push(`L ${s.x-s.p*n*Math.sin(l)},${s.y+s.p*n*Math.cos(l)}`)}return d.join(" ")}getQuadraticPath(i,s,n,a){const l=computeLinksPoints(i,computeAxeAngle(i,n),a),d=computeLinksPoints(s,computeAxeAngle(n,s),a),c=computeLinksPoints(n,computeAxeAngle(i,s),a);return[`M ${l[0].x},${l[0].y}`,`Q ${c[0].x},${c[0].y} ${d[0].x},${d[0].y}`,`L ${d[1].x},${d[1].y}`,`Q ${c[1].x},${c[1].y} ${l[1].x},${l[1].y}`].join(" ")}buildSVGPath(i){const s=i.pointers.length,n=i.style.width,a=s-2,l=i.pointers[0],d=[];if(s<3)d.push(this.getArcPath(l,.6*n));else{d.push(this.getArcPath(l,n*l.p)),d.push(this.getLinePath(l,computeMiddlePoint(l,i.pointers[1]),n));for(let s=0;s{a.setAttribute(i.name,i.value)}));const l=this.buildSVGPath(s);a.setAttribute("d",`${l}Z`),i.appendChild(a)}}class WSSVGRenderer{constructor(i){lt.add(this),dt.set(this,LoggerManager.getLogger("RENDERER")),__classPrivateFieldGet(this,dt,"f").info("constructor",{config:i}),this.config=i,this.stroker=new SVGStroker}init(i){__classPrivateFieldGet(this,dt,"f").info("init",{element:i}),i.style.fontSize="10px",this.context={parent:i}}updateLayer(i,s){switch(__classPrivateFieldGet(this,dt,"f").info("updateLayer",{layerName:i,update:s}),s.type){case"REPLACE_ALL":__classPrivateFieldGet(this,lt,"m",ht).call(this,i,s);break;case"REPLACE_ELEMENT":__classPrivateFieldGet(this,lt,"m",vt).call(this,s);break;case"APPEND_CHILD":__classPrivateFieldGet(this,lt,"m",ut).call(this,i,s);break;case"REMOVE_ELEMENT":__classPrivateFieldGet(this,lt,"m",_t).call(this,s);break;case"REMOVE_CHILD":__classPrivateFieldGet(this,lt,"m",pt).call(this,s);break;case"INSERT_BEFORE":__classPrivateFieldGet(this,lt,"m",gt).call(this,s);break;case"SET_ATTRIBUTE":__classPrivateFieldGet(this,lt,"m",ft).call(this,s);break;case"REMOVE_ATTRIBUTE":__classPrivateFieldGet(this,lt,"m",mt).call(this,s);break;default:__classPrivateFieldGet(this,dt,"f").warn("updateLayer Default",{layerName:i,update:s})}}updatesLayer(i,s){__classPrivateFieldGet(this,dt,"f").info("updatesLayer",{layerName:i,updates:s}),s.forEach((s=>this.updateLayer(i,s))),this.clearPendingStroke()}clearPendingStroke(){__classPrivateFieldGet(this,dt,"f").info("clearPendingStroke",{});const i=this.context.parent.querySelector("#pendingStrokes");i&&(i.innerHTML="")}drawPendingStroke(i){if(__classPrivateFieldGet(this,dt,"f").info("drawPendingStroke",{stroke:i}),i){const s=this.context.parent.querySelector("#pendingStrokes");if(s){const n=s.querySelector(`#${null==i?void 0:i.id}`);n&&n.remove(),__classPrivateFieldGet(this,lt,"m",ct).call(this,s,i)}}}clearErasingStrokes(){this.context.parent.querySelectorAll("[type=eraser]").forEach((i=>{i.remove()}))}resize(i){__classPrivateFieldGet(this,dt,"f").info("resize",{model:i});const s=this.context.parent.getBoundingClientRect(),n=this.context.parent.querySelectorAll("svg"),a=Math.max(s.width,i.width),l=Math.max(s.height,i.height);n.forEach((i=>{i.setAttribute("viewBox",`0 0 ${a}, ${l}`),i.setAttribute("width",`${a}px`),i.setAttribute("height",`${l}px`)}))}destroy(){var i;__classPrivateFieldGet(this,dt,"f").info("destroy",{context:this.context}),(null===(i=this.context)||void 0===i?void 0:i.parent)&&this.context.parent.querySelectorAll("svg").forEach((i=>i.remove()))}}dt=new WeakMap,lt=new WeakSet,ct=function _WSSVGRenderer_drawStroke(i,s){let n;"eraser"===s.pointerType?(s.style.width=20,n="fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;"):n=`fill:${s.style.color};stroke:transparent;`,this.stroker.drawStroke(i,s,[{name:"style",value:n}])},ht=function _WSSVGRenderer_replaceAll(i,s){const n=this.context.parent.querySelector(`svg[data-layer="${i}"]`);null==n||n.remove(),this.context.parent.insertAdjacentHTML("beforeend",s.svg);const a=this.context.parent.querySelector(`svg[data-layer="${i}"]`);if("MODEL"===i){const i=document.createElementNS("http://www.w3.org/2000/svg","g");i.id="pendingStrokes",a.appendChild(i)}},vt=function _WSSVGRenderer_replaceElement(i){const s=this.context.parent.querySelector(`#${i.id}`);if(s){const n=s.parentNode;null==s||s.remove(),null==n||n.insertAdjacentHTML("beforeend",i.svg)}},ut=function _WSSVGRenderer_appendChild(i,s){const n=s.parentId?`#${s.parentId}`:`svg[data-layer="${i}"]`,a=this.context.parent.querySelector(n);null==a||a.insertAdjacentHTML("beforeend",s.svg)},pt=function _WSSVGRenderer_removeChild(i){var s;null===(s=this.context.parent.querySelector(`#${i.parentId} > *:nth-child(${i.index+1})`))||void 0===s||s.remove()},_t=function _WSSVGRenderer_removeElement(i){const s=this.context.parent.querySelector(`#${i.id}`);s&&(i.id.includes("s")||i.id.includes("MODEL")?s.remove():(s.setAttribute("class","removed-stroke"),setTimeout((()=>{null==s||s.remove()}),100)))},gt=function _WSSVGRenderer_insertBefore(i){const s=this.context.parent.querySelector(`#${i.refId}`);null==s||s.insertAdjacentHTML("beforebegin",i.svg)},ft=function _WSSVGRenderer_setAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.setAttribute(i.name,i.value)},mt=function _WSSVGRenderer_removeAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.removeAttribute(i.name)};var yt,St,wt,Ft,Gt=Object.freeze({__proto__:null,UndoRedoContext:UndoRedoContext,UndoRedoManager:UndoRedoManager});class WSBehaviors{constructor(i){this.name="WSBehaviors",yt.set(this,void 0),St.set(this,void 0),wt.set(this,LoggerManager.getLogger("BEHAVIORS")),Ft.set(this,void 0),this.onSVGPatch=i=>{__classPrivateFieldGet(this,wt,"f").info("onSVGPatch",{evt:i}),this.renderer.updatesLayer(i.layer,i.updates)},__classPrivateFieldGet(this,wt,"f").info("constructor",{options:i}),this.options=i,__classPrivateFieldSet(this,yt,new Configuration(null==i?void 0:i.configuration),"f"),this.styleManager=new StyleManager(i.penStyle,i.theme),this.grabber=new PointerEventGrabber(__classPrivateFieldGet(this,yt,"f").grabber),this.renderer=new WSSVGRenderer(__classPrivateFieldGet(this,yt,"f").rendering),this.recognizer=new WSRecognizer(__classPrivateFieldGet(this,yt,"f").server,__classPrivateFieldGet(this,yt,"f").recognition),this.intention="write",__classPrivateFieldSet(this,St,new Model,"f"),this.undoRedoManager=new UndoRedoManager(__classPrivateFieldGet(this,yt,"f")["undo-redo"],this.model)}get internalEvent(){return InternalEvent.getInstance()}get model(){return __classPrivateFieldGet(this,St,"f")}get context(){return this.undoRedoManager.context}get configuration(){return __classPrivateFieldGet(this,yt,"f")}get currentPenStyle(){return this.styleManager.currentPenStyle}get penStyle(){return this.styleManager.penStyle}setPenStyle(i){return __classPrivateFieldGet(this,wt,"f").info("setPenStyle",{penStyle:i}),this.styleManager.setPenStyle(i),__classPrivateFieldGet(this,wt,"f").debug("setPenStyle",this.styleManager.penStyle),this.recognizer.setPenStyle(this.styleManager.penStyle)}get penStyleClasses(){return this.styleManager.penStyleClasses}setPenStyleClasses(i){return __classPrivateFieldGet(this,wt,"f").info("setPenStyleClasses",{penClass:i}),this.styleManager.setPenStyleClasses(i),__classPrivateFieldGet(this,wt,"f").debug("setPenStyleClasses",this.styleManager.penStyleClasses),this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)}get theme(){return this.styleManager.theme}setTheme(i){return __classPrivateFieldGet(this,wt,"f").info("setTheme",{theme:i}),this.styleManager.setTheme(i),__classPrivateFieldGet(this,wt,"f").debug("setTheme",this.styleManager.theme),this.recognizer.setTheme(this.styleManager.theme)}init(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("init",{domElement:i}),this.model.width=Math.max(i.clientWidth,__classPrivateFieldGet(this,yt,"f").rendering.minWidth),this.model.height=Math.max(i.clientHeight,__classPrivateFieldGet(this,yt,"f").rendering.minHeight),this.undoRedoManager.updateModelInStack(this.model),this.renderer.init(i),this.grabber.attach(i),this.grabber.onPointerDown=this.onPointerDown.bind(this),this.grabber.onPointerMove=this.onPointerMove.bind(this),this.grabber.onPointerUp=this.onPointerUp.bind(this),this.internalEvent.addSVGPatchListener(this.onSVGPatch),yield this.recognizer.init(this.model.height,this.model.width),yield this.setPenStyle(this.penStyle),yield this.setTheme(this.theme),yield this.setPenStyleClasses(this.penStyleClasses)}))}onPointerDown(i,s){var n;__classPrivateFieldGet(this,wt,"f").info("onPointerDown",{intention:this.intention,evt:i,point:s});let{pointerType:a}=i;const l=Object.assign({},null===(n=this.theme)||void 0===n?void 0:n.ink,this.currentPenStyle);"erase"===this.intention&&(a="eraser"),this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,s){__classPrivateFieldGet(this,wt,"f").info("onPointerMove",{intention:this.intention,point:s}),this.model.appendToCurrentStroke(s),this.drawCurrentStroke()}onPointerUp(i,s){return __awaiter(this,void 0,void 0,(function*(){try{__classPrivateFieldGet(this,wt,"f").info("onPointerUp",{intention:this.intention,point:s}),this.model.endCurrentStroke(s),yield this.updateModelRendering()}catch(i){this.internalEvent.emitError(i)}}))}drawCurrentStroke(){__classPrivateFieldGet(this,wt,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke});const i=this.model.currentStroke;i&&this.renderer.drawPendingStroke(i)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,wt,"f").info("updateModelRendering"),"DEMAND"!==__classPrivateFieldGet(this,yt,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent(),this.undoRedoManager.addModelToStack(this.model),this.renderer.clearErasingStrokes();const s=yield this.recognizer.addStrokes(i);this.model.mergeExport(s),this.undoRedoManager.updateModelInStack(this.model)}return __classPrivateFieldGet(this,wt,"f").debug("updateModelRendering",this.model),this.model}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){return this.recognizer.waitForIdle()}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("importPointEvents",{strokes:i});const s=yield this.recognizer.importPointEvents(i);return this.model.mergeExport(s),__classPrivateFieldGet(this,wt,"f").debug("importPointEvents",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("export",{mimeTypes:i});try{if("DEMAND"===__classPrivateFieldGet(this,yt,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent();const s=yield this.recognizer.addStrokes(i);return this.model.updatePositionReceived(),this.model.mergeExport(s),__classPrivateFieldGet(this,wt,"f").debug("export",this.model),this.model}return this.recognizer.export(this.model,i)}catch(i){return __classPrivateFieldGet(this,wt,"f").error("export",{error:i}),this.internalEvent.emitError(i),Promise.reject(i)}}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,wt,"f").info("convert",{conversionState:i}),this.undoRedoManager.addModelToStack(this.model),this.context.stack.push(this.model.getClone()),__classPrivateFieldSet(this,St,yield this.recognizer.convert(this.model,i),"f"),__classPrivateFieldGet(this,wt,"f").debug("convert",this.model),this.undoRedoManager.addModelToStack(this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("import",{data:i,mimeType:s}),this.context.stack.push(this.model.getClone());const n=yield this.recognizer.import(this.model,i,s);return this.undoRedoManager.addModelToStack(n),n}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s;const a=this.model.getClone();return this.renderer.resize(a),clearTimeout(__classPrivateFieldGet(this,Ft,"f")),__classPrivateFieldSet(this,Ft,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{const i=yield this.recognizer.resize(a);n.resolve(i)}catch(a){__classPrivateFieldGet(this,wt,"f").error("resize",{height:i,width:s,error:a}),n.reject(a)}}))),__classPrivateFieldGet(this,yt,"f").triggers.resizeTriggerDelay),"f"),__classPrivateFieldSet(this,St,yield n.promise,"f"),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,wt,"f").debug("resize",this.model),this.model}))}undo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,wt,"f").info("undo"),this.context.canUndo)return __classPrivateFieldSet(this,St,this.undoRedoManager.undo(),"f"),this.recognizer.undo(this.model);throw new Error("Undo not allowed")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,wt,"f").info("redo"),this.context.canRedo)return __classPrivateFieldSet(this,St,this.undoRedoManager.redo(),"f"),__classPrivateFieldGet(this,wt,"f").debug("undo",__classPrivateFieldGet(this,St,"f")),this.recognizer.redo(this.model);throw new Error("Redo not allowed")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,wt,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.recognizer.clear(this.model)}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,wt,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),this.recognizer.destroy(),Promise.resolve()}))}}yt=new WeakMap,St=new WeakMap,wt=new WeakMap,Ft=new WeakMap;var bt,xt,Et,Ct,kt,Mt,Tt,Lt,It,Dt,At,Rt,Nt,Ot,Wt,zt,jt,Ht,Bt;!function styleInject(i,s){void 0===s&&(s={});var n=s.insertAt;if(i&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===n&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=i:l.appendChild(document.createTextNode(i))}}('.ms-editor {\n position: relative;\n z-index: 10;\n color: #1A9FFF;\n font-family: sans-serif;\n}\n\n.ms-editor.erasing {\n cursor: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=\') 10 10, auto;\n}\n\n.ms-editor canvas,\n.ms-editor svg {\n z-index: 20;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n\n.ms-editor canvas.ms-rendering-canvas {\n z-index: 9;\n pointer-events: none;\n background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px);\n background-size: 18px 18px;\n}\n\n.ms-editor .loader {\n z-index: 30;\n position: absolute;\n width: 120px;\n height: 120px;\n top: calc(50% - 60px);\n left: calc(50% - 60px);\n border: 16px solid #F5F6F7;\n border-radius: 50%;\n border-top-color: #1A9FFF;\n -webkit-animation: spin 2s linear infinite;\n animation: spin 2s linear infinite;\n}\n\n.ms-editor .message {\n z-index: 25;\n position: absolute;\n width: 300px;\n max-height: calc(25%);\n min-height: 200px;\n top: calc(50% - 100px);\n left: calc(50% - 150px);\n font-size: 16px;\n text-align: center;\n word-wrap: break-word;\n}\n\n.ms-editor .message.error-msg::before {\n content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo=");\n}\n\n.ms-editor .message.info-msg::before {\n content: "";\n background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");\n background-size: 100% 100%;\n display: block;\n margin: auto;\n padding-bottom: 10px;\n height: 25px;\n width: 25px;\n}\n\n.ms-editor .smartguide {\n position: absolute;\n z-index: 40;\n font-size: 16px;\n height: 48px;\n line-height: 48px;\n}\n\n.ms-editor .smartguide.smartguide-in {\n visibility: visible !important;\n transition: opacity 0.5s;\n opacity: 1;\n}\n\n.ms-editor .smartguide.smartguide-out {\n transition: opacity 1s, visibility 1s;\n visibility: hidden !important;\n opacity: 0;\n}\n\n.ms-editor .smartguide .tag-icon {\n padding: 0 18px;\n border: 1px solid #959DA6;\n font-weight: bold;\n font-size: large;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n z-index: 31;\n height: 100%;\n line-height: 48px;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n}\n\n.ms-editor .smartguide .ellipsis {\n cursor: pointer;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 31;\n height: 48px;\n line-height: 38px;\n padding: 0 8px;\n font-weight: bold;\n font-size: x-large;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .ellipsis:active {\n background-color: #e0e0e0;\n}\n\n.ms-editor .smartguide .prompter-container {\n background-color: rgba(255, 255, 255, 0.9);\n height: 48px;\n line-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n text-align: left;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 30;\n color: #bfbfbf;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .prompter-container > div > span {\n cursor: pointer;\n display: inline-block;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text {\n margin-left: 12px;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .added-word {\n animation: 0.1s linear word-added,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .modified-word {\n animation: 0.1s linear word-modified,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .candidates {\n color: black;\n flex-direction: column;\n text-align: center;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n z-index: 100;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .candidates > span {\n cursor: pointer;\n padding: 2px 20px;\n}\n\n.ms-editor .smartguide .candidates > span:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .candidates > span:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .candidates .selected-word {\n font-weight: bold;\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .more-menu {\n display: flex;\n flex-direction: column;\n margin-right: 12px;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n z-index: 100;\n box-shadow: 2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n overflow: hidden;\n transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear;\n}\n.ms-editor .smartguide .more-menu.open {\n max-height: 500px;\n visibility: visible;\n opacity: 1;\n}\n.ms-editor .smartguide .more-menu.close {\n max-height: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button {\n color: black;\n font-size: 16px;\n cursor: pointer;\n box-sizing: border-box;\n background: transparent;\n border: none;\n padding: 0 24px;\n margin: 0;\n height: 40px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .ps__rail-x {\n top: 32px !important;\n}\n\n.ms-editor #stroke-panel {\n position: fixed;\n bottom: 10px;\n left: 10px;\n right: 10px;\n background-color: white;\n border: solid black 2px;\n padding: 5px;\n word-wrap: break-word;\n overflow: auto;\n cursor: copy;\n max-height: 100px;\n z-index: 999;\n}\n\n/** Stroke **/\n\n.ms-editor .removed-stroke {\n opacity: 0;\n transition: opacity 0.1s ease-in-out;\n}\n\n.ms-editor .added-stroke {\n animation: 0.2s opacity-appear;\n}\n\n@keyframes color-input {\n 0% {\n color: black;\n }\n 100% {\n color: #bfbfbf;\n }\n}\n\n@keyframes word-added {\n 0% {\n transform: translate(5px, 0);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes word-modified {\n 0% {\n transform: translate(0, 5px);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes opacity-appear {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity : 1;\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n');class Editor{constructor(i,s,n="ms-editor"){bt.add(this),xt.set(this,void 0),Et.set(this,void 0),Ct.set(this,void 0),kt.set(this,void 0),Mt.set(this,void 0),Tt.set(this,void 0),this.showStrokesPan=!1,zt.set(this,(i=>{this.events.emitChanged(i)})),jt.set(this,(i=>{this.events.emitIdle(i)})),__classPrivateFieldSet(this,Tt,Object.assign({},v,s.logger),"f"),this.logger=LoggerManager.getLogger("EDITOR"),this.logger.info("constructor",{wrapperHTML:i,options:s,globalClassCss:n}),__classPrivateFieldSet(this,Mt,new DeferredPromise,"f"),this.wrapperHTML=i,this.wrapperHTML.classList.add(n),this.events.setElement(this.wrapperHTML),__classPrivateFieldSet(this,xt,document.createElement("div"),"f"),__classPrivateFieldGet(this,xt,"f").classList.add("loader"),__classPrivateFieldGet(this,xt,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,xt,"f")),__classPrivateFieldSet(this,Et,document.createElement("div"),"f"),__classPrivateFieldGet(this,Et,"f").classList.add("message"),__classPrivateFieldGet(this,Et,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,bt,"m",Lt).call(this,s)}get loggerConfiguration(){return __classPrivateFieldGet(this,Tt,"f")}set loggerConfiguration(i){__classPrivateFieldSet(this,Tt,i,"f"),LoggerManager.setLoggerLevel(i)}get initializationPromise(){return __classPrivateFieldGet(this,Mt,"f").promise}get model(){return this.behaviors.model}get behaviors(){return __classPrivateFieldGet(this,Ct,"f")}get configuration(){return this.behaviors.configuration}set configuration(i){this.logger.info("set configuration",{configuration:i}),__classPrivateFieldGet(this,bt,"m",Lt).call(this,{configuration:i}),this.initialize()}get intention(){return this.behaviors.intention}set intention(i){if(this.logger.info("set intention",{m:i}),this.behaviors.intention=i,"erase"===this.behaviors.intention)this.wrapperHTML.classList.add("erasing"),this.wrapperHTML.classList.remove("selecting");else this.logger.warn("set intention default",{m:i}),document.body.style.cursor="initial",this.wrapperHTML.classList.remove("erasing"),this.wrapperHTML.classList.remove("selecting");this.logger.debug("set intention",this.wrapperHTML)}get events(){return PublicEvent.getInstance()}get context(){return this.behaviors.context}get grabber(){return this.behaviors.grabber}get currentPenStyle(){return this.behaviors.currentPenStyle}get penStyle(){return this.behaviors.penStyle}set penStyle(i){this.logger.info("set penStyle",{ps:i}),this.behaviors.setPenStyle(i)}get theme(){return this.behaviors.theme}set theme(i){this.logger.info("set theme",{t:i}),this.behaviors.setTheme(i)}get penStyleClasses(){return this.behaviors.penStyleClasses}set penStyleClasses(i){this.logger.info("set penStyleClasses",{psc:i}),this.behaviors.setPenStyleClasses(i)}initialize(){return __awaiter(this,void 0,void 0,(function*(){this.logger.info("initialize"),yield __classPrivateFieldGet(this,bt,"m",It).call(this),__classPrivateFieldGet(this,bt,"m",Dt).call(this),__classPrivateFieldGet(this,bt,"m",Wt).call(this)}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){if(this.behaviors.waitForIdle)return this.behaviors.waitForIdle()}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("undo",this.model),this.logger.info("undo",{}),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.undo(),__classPrivateFieldGet(this,bt,"m",Ot).call(this),this.logger.debug("undo",this.model),this.model}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("redo",this.model),this.logger.info("redo"),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.redo(),__classPrivateFieldGet(this,bt,"m",Ot).call(this),this.logger.debug("redo",this.model),this.model}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("clear",this.model),this.logger.info("clear"),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.clear(),this.events.emitCleared(this.model),__classPrivateFieldGet(this,bt,"m",Ot).call(this),this.logger.debug("clear",this.model),this.model}))}resize(){var i;return __awaiter(this,void 0,void 0,(function*(){this.logger.debug("resize",this.model),this.logger.info("resize"),yield __classPrivateFieldGet(this,Mt,"f").promise,this.configuration.rendering.smartGuide.enable&&(null===(i=__classPrivateFieldGet(this,kt,"f"))||void 0===i||i.resize());const s=Math.max(this.wrapperHTML.clientHeight,this.configuration.rendering.minHeight),n=Math.max(this.wrapperHTML.clientWidth,this.configuration.rendering.minWidth);return yield this.behaviors.resize(s,n),this.logger.debug("resize",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("export",this.model),this.logger.info("export",{mimeTypes:i}),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.export(i),this.logger.debug("export",this.model),this.model}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("convert",this.model),this.logger.info("export",{params:i}),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.convert(null==i?void 0:i.conversionState,null==i?void 0:i.mimeTypes),this.events.emitConverted(this.model.converts),this.logger.debug("convert",this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){if(this.logger.debug("import",this.model),this.logger.info("import",{data:i,mimeType:s}),yield __classPrivateFieldGet(this,Mt,"f").promise,this.behaviors.import){let n;return n=i instanceof Blob?i:"string"==typeof i?new Blob([i]):new Blob([JSON.stringify(i)]),yield this.behaviors.import(n,s),this.events.emitImported(this.model.exports),this.logger.debug("import",this.model),this.model}return Promise.reject("Import impossible, behaviors has no import function")}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("importPointEvents",this.model),this.logger.info("importPointEvents",{strokes:i}),yield __classPrivateFieldGet(this,Mt,"f").promise,this.behaviors.importPointEvents?(yield this.behaviors.importPointEvents(i),this.events.emitImported(this.model.exports),this.logger.debug("importPointEvents",this.model),this.model):Promise.reject("Import impossible, behaviors has no importPointEvents function")}))}}xt=new WeakMap,Et=new WeakMap,Ct=new WeakMap,kt=new WeakMap,Mt=new WeakMap,Tt=new WeakMap,zt=new WeakMap,jt=new WeakMap,bt=new WeakSet,Lt=function _Editor_instantiateBehaviors(i){var s;if(this.logger.info("instantiateBehaviors",{options:i}),!(null==i?void 0:i.configuration))throw new Error("Configuration required");let n;InternalEvent.getInstance().removeAllListeners(),__classPrivateFieldGet(this,Ct,"f")&&__classPrivateFieldGet(this,Ct,"f").destroy(),n="REST"===(null===(s=i.configuration.server)||void 0===s?void 0:s.protocol)?new RestBehaviors(i):new WSBehaviors(i),__classPrivateFieldSet(this,Ct,Object.assign(n,i.behaviors),"f"),this.logger.debug("instantiateBehaviors",__classPrivateFieldGet(this,Ct,"f"))},It=function _Editor_initializeBehaviors(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.info("initializeBehaviors start"),__classPrivateFieldSet(this,Mt,new DeferredPromise,"f"),__classPrivateFieldGet(this,xt,"f").style.display="initial",__classPrivateFieldGet(this,bt,"m",At).call(this),this.logger.debug("initializeBehaviors",this.wrapperHTML),this.behaviors.init(this.wrapperHTML).then((()=>__awaiter(this,void 0,void 0,(function*(){this.logger.info("initializeBehaviors then"),this.wrapperHTML.editor=this,__classPrivateFieldGet(this,Mt,"f").resolve(),this.events.emitLoaded(),this.logger.debug("initializeBehaviors",this.wrapperHTML)})))).catch((i=>{this.logger.error("initializeBehaviors catch",{error:i}),__classPrivateFieldGet(this,Mt,"f").reject(i),__classPrivateFieldGet(this,bt,"m",Rt).call(this,i)})).finally((()=>(this.logger.info("initializeBehaviors finally",{}),__classPrivateFieldGet(this,xt,"f").style.display="none",__classPrivateFieldGet(this,Mt,"f").promise)))}))},Dt=function _Editor_initializeSmartGuide(){var i;if(null===(i=__classPrivateFieldGet(this,kt,"f"))||void 0===i||i.destroy(),this.logger.info("initializeSmartGuide",{smartGuide:this.configuration.rendering.smartGuide}),this.configuration.rendering.smartGuide.enable){let i;switch(__classPrivateFieldSet(this,kt,new SmartGuide,"f"),this.configuration.recognition.type){case"TEXT":i=this.configuration.recognition.text.margin;break;case"MATH":i=this.configuration.recognition.math.margin;break;default:this.logger.warn("initializeSmartGuide default",this.configuration.recognition.type),i={top:20,left:10,right:10,bottom:10}}__classPrivateFieldGet(this,kt,"f").init(this.wrapperHTML,i,this.configuration.rendering)}},At=function _Editor_cleanMessage(){this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,Et,"f").style.display="none",__classPrivateFieldGet(this,Et,"f").innerHTML="",this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Et,"f"))},Rt=function _Editor_showError(i){this.logger.debug("showError",__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,Et,"f").style.display="initial",__classPrivateFieldGet(this,Et,"f").classList.add("error-msg"),__classPrivateFieldGet(this,Et,"f").classList.remove("info-msg"),__classPrivateFieldGet(this,Et,"f").innerText=i.message,this.logger.debug("showError",__classPrivateFieldGet(this,Et,"f"))},Nt=function _Editor_showNotif(i){this.logger.debug("showNotif",__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,Et,"f").style.display="initial",__classPrivateFieldGet(this,Et,"f").classList.add("info-msg"),__classPrivateFieldGet(this,Et,"f").classList.remove("error-msg"),__classPrivateFieldGet(this,Et,"f").innerText=i.message,setTimeout((()=>{__classPrivateFieldGet(this,bt,"m",At).call(this)}),i.timeout||2500),this.logger.debug("showNotif",__classPrivateFieldGet(this,Et,"f"))},Ot=function _Editor_showStrokesIfDebug(){if(this.showStrokesPan){let i=document.getElementById("stroke-panel");const s=JSON.stringify(this.model.rawStrokes.map((i=>({pointerType:i.pointerType,pointerId:i.pointerId,pointers:i.pointers}))));i||(i=document.createElement("div"),i.id="stroke-panel",i.addEventListener("click",(s=>{s.preventDefault(),s.stopPropagation(),navigator.clipboard.writeText(null==i?void 0:i.innerText),__classPrivateFieldGet(this,bt,"m",Nt).call(this,{message:"strokes copied to clipboard!",timeout:1500})})),this.wrapperHTML.appendChild(i)),i.innerText=s}},Wt=function _Editor_addListeners(){InternalEvent.getInstance().addConvertListener(this.convert.bind(this)),InternalEvent.getInstance().addClearListener(this.clear.bind(this)),InternalEvent.getInstance().addErrorListener(__classPrivateFieldGet(this,bt,"m",Rt).bind(this)),InternalEvent.getInstance().addImportJIIXListener(__classPrivateFieldGet(this,bt,"m",Bt).bind(this)),InternalEvent.getInstance().addExportedListener(__classPrivateFieldGet(this,bt,"m",Ht).bind(this)),InternalEvent.getInstance().addNotifListener(__classPrivateFieldGet(this,bt,"m",Nt).bind(this)),InternalEvent.getInstance().addClearMessageListener(__classPrivateFieldGet(this,bt,"m",At).bind(this)),InternalEvent.getInstance().addContextChangeListener(__classPrivateFieldGet(this,zt,"f").bind(this)),InternalEvent.getInstance().addIdleListener(__classPrivateFieldGet(this,jt,"f").bind(this))},Ht=function _Editor_onExport(i){var s;if(this.logger.info("onExport",{exports:i}),this.model.mergeExport(i),this.configuration.rendering.smartGuide.enable&&i&&i["application/vnd.myscript.jiix"]){const n=i["application/vnd.myscript.jiix"];null===(s=__classPrivateFieldGet(this,kt,"f"))||void 0===s||s.update(n)}__classPrivateFieldGet(this,bt,"m",Ot).call(this),this.events.emitExported(i)},Bt=function _Editor_onImportJIIX(i){this.logger.info("onImportJIIX",{jiix:i}),this.import(new Blob([JSON.stringify(i)],{type:"application/vnd.myscript.jiix"}),"application/vnd.myscript.jiix")};var Xt=Object.freeze({__proto__:null,geometric:Pt,version:Ue,crypto:je,DeferredPromise:DeferredPromise,getAvailableFontList:function getAvailableFontList(i){var s,n,a;return __awaiter(this,void 0,void 0,(function*(){if(!(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&!(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host))return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!");if(!(null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.lang))return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!");const l=i.server,d=yield fetch(`${l.scheme}://${l.host}/api/v4.0/iink/font/google/language/`+i.recognition.lang),{result:c}=yield d.json();return c.sort()}))},getAvailableLanguageList:function getAvailableLanguageList(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){if((null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host)){const s=i.server;return(yield fetch(`${s.scheme}://${s.host}/api/v4.0/iink/availableLanguageList`)).json()}return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!")}))}}),Ut=Object.freeze({__proto__:null,RestBehaviors:RestBehaviors,WSBehaviors:WSBehaviors}),$t=Object.freeze({__proto__:null,RestRecognizer:RestRecognizer,WSRecognizer:WSRecognizer}),Vt=Object.freeze({__proto__:null,quadradicsUtils:Ie,CanvasRenderer:CanvasRenderer,CanvasStroker:CanvasStroker,canvasRendererShape:Ce,canvasRendererStroke:ke,canvasRendererText:Te,SVGStroker:SVGStroker,WSSVGRenderer:WSSVGRenderer}),Jt=Object.freeze({__proto__:null,PointerEventGrabber:PointerEventGrabber}),qt=Object.freeze({__proto__:null,DefaultPenStyle:$e,DefaultTheme:Ve,StyleHelper:Ne,StyleManager:StyleManager}),Yt=Object.freeze({__proto__:null,Model:Model,Stroke:Stroke,convertStrokeToJSON:convertStrokeToJSON}),Zt=Object.freeze({__proto__:null,InternalEvent:InternalEvent,PublicEvent:PublicEvent});export{Editor,Ut as behaviors,P as configuration,Ge as constants,Zt as event,Jt as grabber,g as logger,Yt as model,$t as recognizer,Vt as renderer,xe as smartguide,qt as style,Gt as undoredo,Xt as utils}; +//# sourceMappingURL=iink.esm.js.map diff --git a/dist/iink.esm.js.map b/dist/iink.esm.js.map new file mode 100644 index 000000000..629bd5247 --- /dev/null +++ b/dist/iink.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.esm.js","sources":["../node_modules/tslib/tslib.es6.mjs","../src/configuration/DefaultConfiguration.ts","../src/utils/MergeHelper.ts","../src/logger/logger.ts","../src/logger/loggerManager.ts","../src/configuration/Configuration.ts","../src/@types/configuration/LoggerConfiguration.ts","../src/Constants.ts","../src/event/PublicEvent.ts","../src/event/InternalEvent.ts","../src/smartguide/SmartGuide.ts","../src/utils/DeferredPromise.ts","../src/grabber/PointerEventGrabber.ts","../src/renderer/canvas/CanvasRendererShapeSymbol.ts","../src/renderer/canvas/CanvasRendererStrokeSymbol.ts","../src/renderer/canvas/CanvasRendererTextSymbol.ts","../src/renderer/QuadraticUtils.ts","../src/renderer/canvas/CanvasStroker.ts","../src/renderer/canvas/CanvasRenderer.ts","../node_modules/json-css/lib/jsoncss.min.js","../src/style/StyleHelper.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/x64-core.js","../node_modules/crypto-js/sha512.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/hmac-sha512.js","../src/utils/CryptoHelper.ts","../src/utils/version.ts","../src/model/Stroke.ts","../src/recognizer/RestRecognizer.ts","../src/undo-redo/UndoRedoContext.ts","../src/undo-redo/UndoRedoManager.ts","../src/style/DefaultPenStyle.ts","../src/style/DefaultTheme.ts","../src/style/StyleManager.ts","../src/utils/geometric.ts","../src/model/Model.ts","../src/behaviors/RestBehaviors.ts","../src/recognizer/WSRecognizer.ts","../src/renderer/svg/SVGStroker.ts","../src/renderer/svg/WSSVGRenderer.ts","../src/behaviors/WSBehaviors.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Editor.ts","../src/utils/font.ts","../src/utils/language.ts"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n};\n","import { TConfiguration } from \"../@types/configuration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { TLoggerConfiguration, LoggerClass, LoggerLevel } from \"../@types/configuration/LoggerConfiguration\"\n\nexport const DefaultServerConfiguration: TServerConfiguration = {\n protocol: \"WEBSOCKET\",\n scheme: \"https\",\n host: \"cloud.myscript.com\",\n applicationKey: \"\",\n hmacKey: \"\",\n version: \"2.1.0\",\n useWindowLocation: false,\n websocket: {\n pingEnabled: true,\n pingDelay: 30000,\n maxPingLostCount: 10,\n autoReconnect: true,\n maxRetryCount: 2,\n fileChunkSize: 300000\n }\n}\n\nexport const DefaultRecognitionConfiguration: TRecognitionConfiguration = {\n type: \"TEXT\",\n alwaysConnected: true,\n lang: \"en_US\",\n gesture: {\n enable: true\n },\n export: {\n \"image-resolution\": 300,\n jiix: {\n \"bounding-box\": false,\n strokes: false,\n text: {\n chars: false,\n words: true\n }\n },\n },\n renderer: {\n debug: {\n \"draw-text-boxes\": false,\n \"draw-image-boxes\": false\n }\n },\n math: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/mathml+xml\", \"application/x-latex\" ,\n solver: {\n enable: true,\n \"fractional-part-digits\": 3,\n \"decimal-separator\": \".\",\n \"rounding-mode\": \"half up\",\n \"angle-unit\": \"deg\"\n },\n margin: {\n bottom: 10,\n left: 15,\n right: 15,\n top: 10\n },\n eraser: {\n \"erase-precisely\": false\n },\n \"undo-redo\": {\n mode: \"stroke\"\n }\n },\n text: {\n guides: {\n enable: true\n },\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"text/plain\"\n margin: {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n },\n eraser: {\n \"erase-precisely\": false\n }\n },\n diagram: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n eraser: {\n \"erase-precisely\": false\n },\n convert: {\n \"match-text-size\": true\n }\n },\n \"raw-content\": {\n recognition: {\n text: true,\n shape: true\n },\n eraser: {\n \"erase-precisely\": false\n }\n }\n}\n\nexport const DefaultGrabberConfiguration: TGrabberConfiguration = {\n listenerOptions: {\n capture: false,\n passive: true\n },\n xyFloatPrecision: 0,\n timestampFloatPrecision: 0\n}\n\nexport const DefaultRenderingConfiguration: TRenderingConfiguration = {\n minHeight: 100,\n minWidth: 100,\n smartGuide: {\n enable: true,\n fadeOut: {\n enable: false,\n duration: 5000\n }\n },\n guides: {\n enable: true,\n gap: 50\n }\n}\n\nexport const DefaultTriggerConfiguration: TTriggerConfiguration = {\n exportContent: \"POINTER_UP\",\n exportContentDelay: 1000,\n resizeTriggerDelay: 100\n}\n\nexport const DefaultEventsConfiguration: TEventConfiguration = {\n processDelay: 10\n}\n\nexport const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = {\n maxStackSize: 100\n}\n\nexport const DefaultConfiguration: TConfiguration = {\n server: DefaultServerConfiguration,\n recognition: DefaultRecognitionConfiguration,\n grabber: DefaultGrabberConfiguration,\n rendering: DefaultRenderingConfiguration,\n triggers: DefaultTriggerConfiguration,\n events: DefaultEventsConfiguration,\n \"undo-redo\": DefaultUndoRedoConfiguration\n}\n\nexport const DefaultLoggerConfiguration: TLoggerConfiguration = {\n [LoggerClass.EDITOR]: LoggerLevel.ERROR,\n [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR,\n [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR,\n [LoggerClass.GRABBER]: LoggerLevel.ERROR,\n [LoggerClass.RENDERER]: LoggerLevel.ERROR,\n [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR,\n [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR,\n [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR,\n [LoggerClass.MODEL]: LoggerLevel.ERROR,\n [LoggerClass.STROKE]: LoggerLevel.ERROR,\n [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR,\n [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR,\n [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR,\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const mergeDeep = (target: any, ...sources: any[]): any =>\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isObject = (item: any) =>\n {\n return (item && typeof item === \"object\" && !Array.isArray(item))\n }\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n mergeDeep(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return mergeDeep(target, ...sources)\n }\n","import { LoggerClass, LoggerLevel } from \"../@types\"\n\nexport class Logger\n{\n instanceName: LoggerClass\n level: LoggerLevel\n\n constructor(instanceName: LoggerClass, level: LoggerLevel)\n {\n this.instanceName = instanceName\n this.level = level\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n debug(...data: any)\n {\n if (LoggerLevel.DEBUG >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.debug(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n info(...data: any)\n {\n if (LoggerLevel.INFO >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.info(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn(...data: any)\n {\n if (LoggerLevel.WARN >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.warn(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(...error: any)\n {\n const dataLog = {\n from: this.instanceName,\n error,\n }\n console.error(dataLog)\n }\n}\n","import { TLoggerConfiguration } from \"../@types\"\nimport { LoggerClass, LoggerLevel } from \"../Constants\"\nimport { Logger } from \"./logger\"\n\nexport class LoggerManager\n{\n static #loggerMap: Map = new Map()\n static getLogger(name: LoggerClass): Logger {\n if(!this.#loggerMap.has(name))\n {\n this.#loggerMap.set(name, new Logger(name, LoggerLevel.ERROR))\n }\n return this.#loggerMap.get(name) as Logger\n }\n\n static setLoggerLevel(config: TLoggerConfiguration)\n {\n\n Object.keys(config).forEach((lc) => {\n LoggerManager.getLogger(lc as LoggerClass).level = config[lc as LoggerClass]\n })\n }\n}\n","\nimport { TConfiguration, TConfigurationClient } from \"../@types/configuration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { DefaultConfiguration } from \"./DefaultConfiguration\"\nimport { mergeDeep } from \"../utils/MergeHelper\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Configuration implements TConfiguration\n{\n events: TEventConfiguration\n grabber: TGrabberConfiguration\n recognition: TRecognitionConfiguration\n rendering: TRenderingConfiguration\n server: TServerConfiguration\n triggers: TTriggerConfiguration\n \"undo-redo\": TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.CONFIGURATION)\n\n constructor(configuration?: TConfigurationClient)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events))\n this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber))\n this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition))\n this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering))\n this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server))\n this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers))\n\n this.overrideDefaultConfiguration(configuration)\n }\n\n overrideDefaultConfiguration(configuration?: TConfigurationClient): void\n {\n this.#logger.info(\"overrideDefaultConfiguration\", { configuration })\n const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration))\n this.events = mergeDeep({}, defaultConf.events, configuration?.events)\n this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber)\n this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition)\n this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering)\n this.server = mergeDeep({}, defaultConf.server, configuration?.server)\n this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers)\n this[\"undo-redo\"] = mergeDeep({}, defaultConf[\"undo-redo\"], configuration?.[\"undo-redo\"])\n\n this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes\n this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes\n this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes\n\n if (this.server?.useWindowLocation) {\n this.server.scheme = window.location.protocol.indexOf(\"s\") > -1 ? \"https\" : \"http\"\n this.server.host = window.location.host\n }\n\n if (\n this.server.protocol === \"REST\" &&\n this.triggers.exportContent === \"POINTER_UP\"\n ) {\n this.triggers.exportContent = \"QUIET_PERIOD\"\n this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50)\n }\n\n if (\n this.server.protocol === \"WEBSOCKET\" &&\n this.recognition.type === \"TEXT\"\n ) {\n if (\n this.rendering.smartGuide.enable &&\n !this.recognition.text.mimeTypes.includes(\"application/vnd.myscript.jiix\")\n ) {\n // mimeType required for smartGuide\n this.recognition.text.mimeTypes.push(\"application/vnd.myscript.jiix\")\n }\n } else {\n // smartGuide enable only on websocket text\n this.rendering.smartGuide.enable = false\n }\n this.#logger.debug(\"overrideDefaultConfiguration\", { configuration: this })\n }\n}\n","\n/**\n * @group Logger\n */\nexport const enum LoggerLevel {\n DEBUG = \"1\",\n INFO = \"2\",\n WARN = \"3\",\n ERROR = \"4\"\n }\n\n/**\n * @group Logger\n */\n export const enum LoggerClass {\n EDITOR = \"EDITOR\",\n RECOGNIZER = \"RECOGNIZER\",\n GRABBER = \"GRABBER\",\n BEHAVIORS = \"BEHAVIORS\",\n CONFIGURATION = \"CONFIGURATION\",\n PUBLIC_EVENT = \"PUBLIC_EVENT\",\n MODEL = \"MODEL\",\n RENDERER = \"RENDERER\",\n SMARTGUIDE = \"SMARTGUIDE\",\n STYLEMANAGER = \"STYLEMANAGER\",\n UNDOREDO_MANAGER = \"UNDOREDO_MANAGER\",\n STROKE = \"STROKE\",\n INTERNALEVENT = \"INTERNALEVENT\"\n }\n\n export type TLoggerConfiguration = {\n [key in keyof typeof LoggerClass]: LoggerLevel\n }\n","/**\n * @group Error\n * @remarks List all errors generated by the backend with their descriptions\n */\nexport const Error = {\n NO_ACTIVITY: \"Session closed due to no activity.\",\n WRONG_CREDENTIALS: \"Application credentials are invalid. Please check or regenerate your application key and hmackey.\",\n TOO_OLD: \"Session is too old. Max Session Duration Reached.\",\n UNKNOW: \"An unknown error has occurred.\",\n ABNORMAL_CLOSURE: \"MyScript recognition server is not reachable.\",\n CANT_ESTABLISH: \"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.\",\n GOING_AWAY: \"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.\",\n PROTOCOL_ERROR: \"MyScript recognition server terminated the connection due to a protocol error.\",\n UNSUPPORTED_DATA: \"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)\",\n INVALID_FRAME_PAULOAD: \"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).\",\n POLICY_VIOLATION: \"MyScript recognition server terminated the connection because it received a message that violates its policy.\",\n MESSAGE_TOO_BIG: \"MyScript recognition server terminated the connection because a data frame was received that is too large.\",\n INTERNAL_ERROR: \"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.\",\n SERVICE_RESTART: \"MyScript recognition server terminated the connection because it is restarting.\",\n TRY_AGAIN: \"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.\",\n BAD_GATEWAY: \"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.\",\n TLS_HANDSHAKE: \"MyScript recognition server connection was closed due to a failure to perform a TLS handshake\"\n} as const\n\n/**\n * @event\n * @remarks Lists all events that can be listened to on the editor or DOM element\n */\nexport const EventType = {\n /**\n * @event\n * event emitted when history has changed i.e. the context of undo-redo\n */\n CHANGED: \"changed\",\n /**\n * @event\n * event emitted when clearing is complete\n */\n CLEARED: \"cleared\",\n /**\n * @event\n * event emitted after the conversion is complete\n */\n CONVERTED: \"converted\",\n /**\n * @event\n * event emitted when the editor encounters an error\n */\n ERROR: \"error\",\n /**\n * @event\n * event emitted on click on pointer events\n */\n POINTEREVENTS: \"pointer_events\",\n /**\n * @event\n * event emitted after the end of the export\n */\n EXPORTED: \"exported\",\n /**\n * @event\n * event emitted after the end of the import\n */\n IMPORTED: \"imported\",\n /**\n * @event\n * event emitted when the server is idle after a job\n */\n IDLE: \"idle\",\n /**\n * @event\n * event emitted after full editor initialization\n */\n LOADED: \"loaded\",\n} as const\n\n/**\n * @event\n * @internal\n * @remarks Lists all internal library events\n */\nexport const InternalEventType = {\n SVG_PATCH: \"internal_svg_patch\",\n EXPORTED: \"internal_exported\",\n CLEAR_MESSAGE: \"internal_clear_message\",\n ERROR: \"internal_error\",\n NOTIF: \"internal_notif\",\n IMPORT_JIIX: \"internal_import_jiix\",\n CONVERT: \"internal_convert\",\n CLEAR: \"internal_clear\",\n CONTEXT_CHANGE: \"internal_context_change\",\n IDLE: \"internal_idle\",\n WS_CLOSED: \"internal_websocket_closed\",\n} as const\n\n/**\n * @group Export\n * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition}\n */\nexport const enum ExportType {\n JIIX = \"application/vnd.myscript.jiix\",\n TEXT = \"text/plain\",\n LATEX = \"application/x-latex\",\n MATHML = \"application/mathml+xml\",\n SVG = \"image/svg+xml\",\n OFFICE_DOCUMENT = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n}\n\n/**\n * @group Editor\n * @remarks List the possibilities of interactions\n */\nexport const enum Intention\n{\n Write = \"write\",\n Erase = \"erase\",\n // Selecting = \"selecting\"\n}\n\n/**\n * @group Logger\n */\nexport { LoggerClass, LoggerLevel } from \"./@types/configuration/LoggerConfiguration\"\n","import { IModel, TExport } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { EventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PublicEvent extends EventTarget\n{\n static #instance: PublicEvent\n #element?: HTMLElement\n #logger = LoggerManager.getLogger(LoggerClass.PUBLIC_EVENT)\n\n private constructor()\n {\n super()\n }\n\n public static getInstance(): PublicEvent\n {\n if (!PublicEvent.#instance) {\n PublicEvent.#instance = new PublicEvent()\n }\n\n return PublicEvent.#instance\n }\n\n setElement(el: HTMLElement)\n {\n this.#logger.info(\"setElement\", { el })\n this.#element = el\n }\n\n #emit(type: string, data?: unknown): void\n {\n const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))\n this.dispatchEvent(evt)\n this.#element?.dispatchEvent(evt)\n }\n\n emitLoaded(): void\n {\n this.#logger.info(\"emitLoaded\")\n this.#emit(EventType.LOADED)\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(EventType.EXPORTED, exports)\n }\n\n emitChanged(undoRedoContext: TUndoRedoContext): void\n {\n this.#logger.info(\"emitChanged\", { undoRedoContext })\n this.#emit(EventType.CHANGED, {\n ...undoRedoContext,\n canClear: !undoRedoContext.empty\n })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(EventType.IDLE, idle)\n }\n\n emitCleared(model?: IModel): void\n {\n this.#logger.info(\"emitCleared\", { model })\n this.#emit(EventType.CLEARED, model)\n }\n\n emitConverted(exports: TExport): void\n {\n this.#logger.info(\"emitConverted\", { exports })\n this.#emit(EventType.CONVERTED, exports)\n }\n\n emitImported(exports: TExport): void\n {\n this.#logger.info(\"emitImported\", { exports })\n this.#emit(EventType.IMPORTED, exports)\n }\n}\n","import { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { InternalEventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class InternalEvent extends EventTarget\n{\n static #instance: InternalEvent\n #abortController: AbortController\n #logger = LoggerManager.getLogger(LoggerClass.INTERNALEVENT)\n\n private constructor()\n {\n super()\n this.#logger.info(\"constructor\")\n this.#abortController = new AbortController()\n }\n\n public static getInstance(): InternalEvent\n {\n if (!InternalEvent.#instance) {\n InternalEvent.#instance = new InternalEvent()\n }\n\n return InternalEvent.#instance\n }\n\n removeAllListeners(): void\n {\n this.#logger.info(\"removeAllListeners\")\n this.#abortController.abort()\n this.#abortController = new AbortController()\n }\n\n #emit(type: string, data?: unknown): void\n {\n this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)))\n }\n\n emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void\n {\n this.#logger.info(\"emitSVGPatch\", { patchChange })\n this.#emit(InternalEventType.SVG_PATCH, patchChange)\n }\n addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void\n {\n this.#logger.info(\"addSVGPatchListener\", { callback })\n this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal })\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(InternalEventType.EXPORTED, exports)\n }\n addExportedListener(callback: (exports: TExport) => void): void\n {\n this.#logger.info(\"addExportedListener\", { callback })\n this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal })\n }\n\n emitClearMessage(): void\n {\n this.#logger.info(\"emitClearMessage\", { })\n this.#emit(InternalEventType.CLEAR_MESSAGE)\n }\n addClearMessageListener(callback: () => void): void\n {\n this.#logger.info(\"addClearMessageListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitError(err: Error): void\n {\n this.#logger.info(\"emitError\", { err })\n this.#emit(InternalEventType.ERROR, err)\n }\n\n addErrorListener(callback: (err: Error) => void): void\n {\n this.#logger.info(\"addErrorListener\", { callback })\n this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal })\n }\n\n emitWSClosed(): void\n {\n this.#logger.info(\"emitWSClosed\", { })\n this.#emit(InternalEventType.WS_CLOSED)\n }\n addWSClosedListener(callback: () => void): void\n {\n this.#logger.info(\"addWSClosedListener\", { callback })\n this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitNotif(notif: { message: string, timeout?: number }): void\n {\n this.#logger.info(\"emitWNotif\", { notif })\n this.#emit(InternalEventType.NOTIF, notif)\n }\n addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void\n {\n this.#logger.info(\"addNotifListener\", { callback })\n this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal })\n }\n\n emitImportJIIX(jiix: TJIIXExport): void\n {\n this.#logger.info(\"emitImportJIIX\", { jiix })\n this.#emit(InternalEventType.IMPORT_JIIX, jiix)\n }\n addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void\n {\n this.#logger.info(\"addImportJIIXListener\", { callback })\n this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal })\n }\n\n emitConvert(conversionState: TConverstionState = \"DIGITAL_EDIT\"): void\n {\n this.#logger.info(\"emitConvert\", { conversionState })\n this.#emit(InternalEventType.CONVERT, conversionState)\n }\n addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void\n {\n this.#logger.info(\"addConvertListener\", { callback })\n this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal })\n }\n\n emitClear(): void\n {\n this.#logger.info(\"emitClear\")\n this.#emit(InternalEventType.CLEAR)\n }\n addClearListener(callback: () => void): void\n {\n this.#logger.info(\"addClearListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitContextChange(context: TUndoRedoContext): void\n {\n this.#logger.info(\"emitContextChange\", { context })\n this.#emit(InternalEventType.CONTEXT_CHANGE, context)\n }\n addContextChangeListener(callback: (context: TUndoRedoContext) => void): void\n {\n this.#logger.info(\"addContextChangeListener\", { callback })\n this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(InternalEventType.IDLE, idle)\n }\n addIdleListener(callback: (idle: boolean) => void): void\n {\n this.#logger.info(\"addIdleListener\", { callback })\n this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal })\n }\n}\n","import { TMarginConfiguration } from \"../@types/configuration/recognition/MarginConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TJIIXExport, TWordExport } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class SmartGuide {\n uuid: string\n #smartGuideElement!: HTMLDivElement\n #prompterContainerElement!: HTMLDivElement\n #prompterTextElement!: HTMLDivElement\n #ellipsisElement!: HTMLDivElement\n #tagElement!: HTMLDivElement\n #candidatesElement!: HTMLDivElement\n #menuElement!: HTMLDivElement\n #convertElement!: HTMLButtonElement\n #copyElement!: HTMLButtonElement\n #deleteElement!: HTMLButtonElement\n #fadeOutTimout?: ReturnType\n #isMenuOpen!: boolean\n margin: TMarginConfiguration\n renderingConfiguration!: TRenderingConfiguration\n jiix?: TJIIXExport\n lastWord?: TWordExport\n wordToChange?: TWordExport\n #logger = LoggerManager.getLogger(LoggerClass.SMARTGUIDE)\n\n constructor() {\n this.#logger.info(\"constructor\", { })\n this.uuid = Math.random().toString(10).substring(2, 12)\n this.margin = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n this.#createWrapperElement()\n this.#createPrompterContainerElement()\n this.#createPrompterTextElement()\n this.#createEllipsisElement()\n this.#createTagElement()\n this.#createCandidatesElement()\n this.#createMoreMenuElement()\n this.#createConvertElement()\n this.#createCopyElement()\n this.#createDeleteElement()\n }\n\n get internalEvent(): InternalEvent {\n return InternalEvent.getInstance()\n }\n\n #createWrapperElement(): void {\n this.#smartGuideElement = document.createElement(\"div\")\n this.#smartGuideElement.id = `smartguide-${this.uuid}`\n this.#smartGuideElement.classList.add(\"smartguide\")\n }\n\n #createPrompterContainerElement(): void {\n this.#prompterContainerElement = document.createElement(\"div\")\n this.#prompterContainerElement.id = `prompter-container-${this.uuid}`\n this.#prompterContainerElement.classList.add(\"prompter-container\")\n // this.#prompterContainerElement.appendChild(textElement)\n }\n\n #createPrompterTextElement(): void {\n this.#prompterTextElement = document.createElement(\"div\")\n this.#prompterTextElement.id = `prompter-text-${this.uuid}`\n this.#prompterTextElement.classList.add(\"prompter-text\")\n this.#prompterTextElement.setAttribute(\"touch-action\", \"none\")\n }\n\n #createEllipsisElement(): void {\n this.#ellipsisElement = document.createElement(\"div\")\n this.#ellipsisElement.id = `ellipsis-${this.uuid}`\n this.#ellipsisElement.classList.add(\"ellipsis\")\n this.#ellipsisElement.innerHTML = \"...\"\n }\n\n #createTagElement(): void {\n this.#tagElement = document.createElement(\"div\")\n this.#tagElement.id = `tag-icon-${this.uuid}`\n this.#tagElement.classList.add(\"tag-icon\")\n this.#tagElement.innerHTML = \"¶\"\n }\n\n #createCandidatesElement(): void {\n this.#candidatesElement = document.createElement(\"div\")\n this.#candidatesElement.id = `candidates-${this.uuid}`\n this.#candidatesElement.classList.add(\"candidates\")\n }\n\n #createMoreMenuElement(): void {\n this.#menuElement = document.createElement(\"div\")\n this.#menuElement.id = `more-menu-${this.uuid}`\n this.#menuElement.classList.add(\"more-menu\")\n }\n\n #createConvertElement(): void {\n this.#convertElement = document.createElement(\"button\")\n this.#convertElement.id = `convert-${this.uuid}`\n this.#convertElement.classList.add(\"options-label-button\")\n this.#convertElement.innerHTML = \"Convert\"\n }\n\n #createCopyElement(): void {\n this.#copyElement = document.createElement(\"button\")\n this.#copyElement.id = `copy-${this.uuid}`\n this.#copyElement.classList.add(\"options-label-button\")\n this.#copyElement.innerHTML = \"Copy\"\n }\n\n #createDeleteElement(): void {\n this.#deleteElement = document.createElement(\"button\")\n this.#deleteElement.id = `delete-${this.uuid}`\n this.#deleteElement.classList.add(\"options-label-button\")\n this.#deleteElement.innerHTML = \"Delete\"\n }\n\n init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void {\n this.#logger.info(\"init\", { domElement, margin, renderingConfiguration })\n domElement.appendChild(this.#smartGuideElement)\n this.#smartGuideElement.appendChild(this.#tagElement)\n\n this.#prompterContainerElement.appendChild(this.#prompterTextElement)\n this.#smartGuideElement.appendChild(this.#prompterContainerElement)\n\n this.#smartGuideElement.appendChild(this.#ellipsisElement)\n\n this.#menuElement.appendChild(this.#convertElement)\n this.#menuElement.appendChild(this.#copyElement)\n this.#menuElement.appendChild(this.#deleteElement)\n this.#smartGuideElement.appendChild(this.#menuElement)\n this.#menuElement.classList.add(\"close\")\n this.#isMenuOpen = false\n\n this.#smartGuideElement.appendChild(this.#candidatesElement)\n this.#candidatesElement.style.display = \"none\"\n this.margin = margin\n this.renderingConfiguration = renderingConfiguration\n this.#addListeners()\n\n this.#show()\n if (this.renderingConfiguration.smartGuide.fadeOut.enable) {\n this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration)\n }\n\n this.resize()\n }\n\n #initFadeOutObserver(duration = 3000): void {\n const observer = new MutationObserver(() => {\n clearTimeout(this.#fadeOutTimout)\n if (\n !this.#smartGuideElement.classList.contains(\"smartguide-out\") &&\n this.#candidatesElement.style.display === \"none\" &&\n !this.#isMenuOpen\n ) {\n this.#fadeOutTimout = setTimeout(() => {\n this.#hide()\n }, duration)\n }\n })\n observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true })\n }\n\n #show(): void {\n this.#smartGuideElement.classList.remove(\"smartguide-out\")\n this.#smartGuideElement.classList.add(\"smartguide-in\")\n }\n #hide(): void {\n this.#smartGuideElement.classList.add(\"smartguide-out\")\n this.#smartGuideElement.classList.remove(\"smartguide-in\")\n }\n\n #showCandidates = (target: HTMLElement) => {\n this.#logger.info(\"showCandidates\", { target })\n const wordId = parseInt(target.id.replace(\"word-\", \"\").replace(this.uuid, \"\"))\n const words = this.jiix?.words as TWordExport[]\n this.wordToChange = words[wordId]\n if (this.wordToChange) {\n this.wordToChange.id = wordId.toString()\n this.#candidatesElement.innerHTML = \"\"\n if (this.wordToChange?.candidates) {\n this.#candidatesElement.style.display = \"flex\"\n this.wordToChange.candidates.forEach((word, index) => {\n if (this.wordToChange?.label === word) {\n this.#candidatesElement.innerHTML += `${word}`\n } else {\n this.#candidatesElement.innerHTML += `${word}`\n }\n })\n const top = 48\n const left = target.getBoundingClientRect().left - 60\n this.#candidatesElement.style.top = `${top}px`\n this.#candidatesElement.style.left = `${left}px`\n\n const parent = target.parentNode?.parentNode?.parentNode\n if (parent) {\n parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode)\n }\n }\n }\n }\n #hideCandidates(): void {\n this.#candidatesElement.style.display = \"none\"\n }\n\n #openMenu(): void {\n this.#menuElement.classList.add(\"open\")\n this.#menuElement.classList.remove(\"close\")\n this.#isMenuOpen = true\n }\n #closeMenu(): void {\n this.#menuElement.classList.add(\"close\")\n this.#menuElement.classList.remove(\"open\")\n this.#isMenuOpen = false\n }\n\n #onClickEllipsis = (evt: Event) => {\n this.#logger.info(\"onClickEllipsis\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#isMenuOpen ? this.#closeMenu() : this.#openMenu()\n this.#hideCandidates()\n }\n\n #onClickConvert = (evt: Event) => {\n this.#logger.info(\"onClickConvert\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitConvert()\n this.#closeMenu()\n }\n\n #onClickCopy = async (evt: Event): Promise => {\n this.#logger.info(\"onClickCopy\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n try {\n this.#closeMenu()\n let message = \"Nothing to copy\"\n if (this.#prompterTextElement.innerText) {\n message = `\"${this.#prompterTextElement.innerText}\" copied to clipboard`\n if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {\n const permissionName = \"clipboard-write\" as PermissionName;\n const permissionStatus = await navigator.permissions.query({ name: permissionName });\n if (permissionStatus.state === \"granted\") {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n } else {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n }\n this.internalEvent.emitNotif({ message, timeout: 1500 })\n } catch (err) {\n this.#logger.error(\"onClickCopy\", { err })\n this.internalEvent.emitError(err as Error)\n }\n }\n\n #onClickDelete = (evt: Event) => {\n this.#logger.info(\"onClickDelete\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitClear()\n this.#closeMenu()\n }\n\n #onClickCandidate = (evt: Event) => {\n this.#logger.info(\"onClickCandidate\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n const target = evt.target as HTMLElement\n const candidate = target.innerText\n if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) {\n this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate\n this.internalEvent.emitImportJIIX(this.jiix)\n }\n this.#candidatesElement.style.display = \"none\"\n }\n\n #onClickPrompter = (evt: Event): void => {\n this.#logger.info(\"onClickPrompter\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#closeMenu()\n const target = evt.target as HTMLElement\n if (target.id !== this.#prompterTextElement.id) {\n this.#showCandidates(target)\n } else {\n this.#hideCandidates()\n }\n\n }\n\n #onClickOutSide = () => {\n this.#hideCandidates()\n this.#closeMenu()\n }\n\n #addListeners(): void {\n this.#ellipsisElement.addEventListener(\"pointerdown\", this.#onClickEllipsis.bind(this))\n this.#convertElement.addEventListener(\"pointerdown\", this.#onClickConvert.bind(this))\n this.#copyElement.addEventListener(\"pointerdown\", this.#onClickCopy.bind(this))\n this.#deleteElement.addEventListener(\"pointerdown\", this.#onClickDelete.bind(this))\n this.#prompterTextElement.addEventListener(\"pointerdown\", this.#onClickPrompter.bind(this))\n this.#candidatesElement.addEventListener(\"pointerdown\", this.#onClickCandidate.bind(this))\n document.addEventListener(\"pointerdown\", this.#onClickOutSide.bind(this))\n }\n\n #removeListeners(): void {\n this.#ellipsisElement.removeEventListener(\"pointerdown\", this.#onClickEllipsis)\n this.#convertElement.removeEventListener(\"pointerdown\", this.#onClickConvert)\n this.#copyElement.removeEventListener(\"pointerdown\", this.#onClickCopy)\n this.#deleteElement.removeEventListener(\"pointerdown\", this.#onClickDelete)\n this.#prompterTextElement.removeEventListener(\"pointerdown\", this.#onClickPrompter)\n this.#candidatesElement.removeEventListener(\"pointerdown\", this.#onClickCandidate)\n document.removeEventListener(\"pointerdown\", this.#onClickOutSide)\n }\n\n resize(): void {\n this.#logger.info(\"resize\")\n const mmToPixels = 3.779527559\n const marginTop = this.margin.top * mmToPixels\n const marginLeft = this.margin.left * mmToPixels\n const marginRight = this.margin.right * mmToPixels\n // 12 is the space between line in mm\n const top = marginTop - (12 * mmToPixels)\n\n this.#smartGuideElement.style.top = `${top}px`\n this.#smartGuideElement.style.left = `${marginLeft}px`\n this.#smartGuideElement.style.right = `${marginRight}px`\n\n let left = this.#tagElement.offsetWidth\n this.#prompterContainerElement.style.marginLeft = `${left}px`\n this.#prompterContainerElement.style.width = `${this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight}px`\n left += this.#prompterContainerElement.offsetWidth\n this.#menuElement.style.left = `${left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth}px`\n this.#menuElement.style.top = `${this.#ellipsisElement.offsetHeight}px`\n this.#ellipsisElement.style.left = `${left}px`\n }\n\n update(exports: TJIIXExport): void {\n this.#logger.info(\"update\", { exports })\n this.jiix = exports\n const createWordSpan = (index: number, word?: TWordExport) => {\n const span = document.createElement(\"span\")\n span.id = `word-${index}${this.uuid}`\n if (word) {\n span.textContent = word.label\n } else {\n span.innerHTML = \" \"\n }\n this.#logger.debug(\"update\", { span })\n return span\n }\n\n const populatePrompter = () => {\n this.#logger.info(\"populatePrompter\", { })\n this.#prompterTextElement.innerHTML = \"\"\n if (this.jiix?.words) {\n const words = this.jiix.words as TWordExport[]\n const myFragment = document.createDocumentFragment()\n words.forEach((word, index) => {\n if (word.label === \" \" || word.label.includes(\"\\n\")) {\n myFragment.appendChild(createWordSpan(index))\n } else if (index !== words.length - 1) {\n myFragment.appendChild(createWordSpan(index, word))\n } else {\n this.#prompterTextElement.appendChild(myFragment)\n if (this.lastWord) {\n this.lastWord = word\n }\n const span = createWordSpan(index, word)\n // This is used to scroll to last word if last word is modified\n\n if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) {\n this.lastWord = word\n }\n if(this.wordToChange?.id === index.toString())\n {\n span.classList.add(\"modified-word\")\n this.wordToChange = undefined\n }\n else\n {\n span.classList.add(\"added-word\")\n }\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n this.#logger.debug(\"update => populatePrompter\", { span })\n this.#logger.debug(\"update => populatePrompter\", this.lastWord)\n }\n })\n }\n }\n populatePrompter()\n if (this.jiix?.words?.length) {\n this.#show()\n }\n }\n\n clear(): void {\n this.#logger.info(\"clear\")\n this.#prompterTextElement.innerHTML = \"\"\n this.#candidatesElement.innerHTML = \"\"\n this.#hide()\n }\n\n destroy(): void {\n this.#logger.info(\"destroy\")\n this.#removeListeners()\n this.#smartGuideElement.remove()\n }\n}\n","\nexport class DeferredPromise {\n promise: Promise\n resolve!: (value: T) => void\n reject!: (value: Error) => void\n\n isFullFilled: boolean\n isPending: boolean\n\n\n constructor()\n {\n this.isFullFilled = false\n this.isPending = true\n\n this.promise = new Promise((resolve, reject) =>\n {\n this.reject = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return reject(v)\n }\n this.resolve = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return resolve(v as T)\n }\n })\n }\n}\n","import { IGrabber } from \"../@types/grabber/Grabber\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PointerEventGrabber implements IGrabber\n{\n private configuration: TGrabberConfiguration\n\n private domElement!: HTMLElement\n\n private activePointerId?: number\n\n private prevent = (e: Event) => e.preventDefault()\n #logger = LoggerManager.getLogger(LoggerClass.GRABBER)\n\n onPointerDown!: (evt: PointerEvent, point: TPointer) => void\n onPointerMove!: (evt: PointerEvent, point: TPointer) => void\n onPointerUp!: (evt: PointerEvent, point: TPointer) => void\n\n constructor(configuration: TGrabberConfiguration)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.configuration = configuration\n }\n\n private roundFloat(oneFloat: number, requestedFloatPrecision: number): number\n {\n if (requestedFloatPrecision >= 0) {\n const floatPrecision: number = Math.pow(10, requestedFloatPrecision)\n return Math.round(oneFloat / floatPrecision) * floatPrecision\n }\n this.#logger.debug(\"roundFloat\", { oneFloat, requestedFloatPrecision })\n return oneFloat\n }\n\n private extractPoint(event: MouseEvent | TouchEvent): TPointer\n {\n let clientX: number, clientY: number\n if (\"changedTouches\" in event) {\n ({ clientX, clientY } = event.changedTouches[0])\n } else {\n ({ clientX, clientY } = event)\n }\n const rect: DOMRect = this.domElement.getBoundingClientRect()\n const pointer = {\n x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision),\n y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision),\n t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision),\n p: (event as PointerEvent).pressure || 1,\n }\n this.#logger.debug(\"extractPoint\", { event, pointer })\n return pointer\n }\n\n private pointerDownHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerDown\", { evt })\n // exit if not a left click or multi-touch\n if (evt.button !== 0 || evt.buttons !== 1) {\n return\n }\n\n this.activePointerId = evt.pointerId\n\n if (this.onPointerDown) {\n const point = this.extractPoint(evt)\n this.onPointerDown(evt, point)\n }\n }\n\n private pointerMoveHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerMove\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n if (this.onPointerMove) {\n const point = this.extractPoint(evt)\n this.onPointerMove(evt, point)\n }\n }\n }\n\n private pointerUpHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerUp\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n this.activePointerId = undefined\n evt.stopPropagation()\n if (this.onPointerUp) {\n const point = this.extractPoint(evt)\n this.onPointerUp(evt, point)\n }\n }\n }\n\n attach(domElement: HTMLElement)\n {\n this.#logger.info(\"attach\", { domElement })\n if (this.domElement) {\n this.detach()\n }\n this.domElement = domElement\n this.domElement.addEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement.addEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n\n this.domElement.addEventListener(\"touchmove\", this.prevent)\n\n // FIXME investigate why this is needed for iOS devices\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.addEventListener(\"pointerdown\", () => { })\n }\n\n detach()\n {\n this.#logger.info(\"detach\")\n this.domElement?.removeEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement?.removeEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"touchmove\", this.prevent)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.removeEventListener(\"pointerdown\", () => { })\n }\n}\n","\nimport { TPoint } from \"../../@types/geometry\"\nimport { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const ShapeSymbols = {\n table: \"table\",\n shape: \"shape\",\n recognizedShape: \"recognizedShape\",\n ellipse: \"ellipse\",\n line: \"line\"\n}\n\nfunction phi(angle: number): number\n{\n let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI\n if (returnedAngle < -Math.PI) {\n returnedAngle += Math.PI * 2\n }\n return returnedAngle\n}\n\nfunction drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[]\n{\n const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse\n const angleStep = 0.02 // angle delta between interpolated\n\n let z1 = Math.cos(orientation)\n let z3 = Math.sin(orientation)\n let z2 = z1\n let z4 = z3\n z1 *= maxRadius\n z2 *= minRadius\n z3 *= maxRadius\n z4 *= minRadius\n\n const n = Math.floor(Math.abs(sweepAngle) / angleStep)\n\n const boundariesPoints = []\n\n context2D.save()\n try {\n context2D.beginPath()\n\n for (let i = 0; i <= n; i++) {\n const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian\n const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius)\n\n const cosAlpha = Math.cos(alpha)\n const sinAlpha = Math.sin(alpha)\n\n // current point\n const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha)\n const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha)\n if (i === 0) {\n context2D.moveTo(x, y)\n } else {\n context2D.lineTo(x, y)\n }\n\n if (i === 0 || i === n) {\n boundariesPoints.push({ x, y })\n }\n }\n\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n\n return boundariesPoints\n}\n\nfunction drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number)\n{\n const alpha = phi(angle + (Math.PI * (7 / 8)))\n const beta = phi(angle - (Math.PI * (7 / 8)))\n context2D.save()\n try {\n context2D.fillStyle = context2D.strokeStyle\n\n context2D.moveTo(headPoint.x, headPoint.y)\n context2D.beginPath()\n context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha)))\n context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta)))\n context2D.lineTo(headPoint.x, headPoint.y)\n context2D.fill()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol)\n{\n const points = drawEllipseArc(context2D, shapeEllipse)\n\n if (shapeEllipse?.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0)\n }\n if (shapeEllipse?.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a line\n * @param {Object} context2D Current rendering context2D\n * @param {{x: Number, y: Number}} p1 Origin point\n * @param {{x: Number, y: Number}} p2 Destination point\n */\nexport function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint)\n{\n context2D.save()\n try {\n context2D.beginPath()\n context2D.moveTo(p1.x, p1.y)\n context2D.lineTo(p2.x, p2.y)\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol)\n{\n drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint)\n if (shapeLine.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0)\n }\n if (shapeLine.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a shape symbol\n * @param {Object} context2D Current rendering context2D\n * @param {Object} symbol Symbol to draw\n */\nexport function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = symbol.style.width as number\n context2D.strokeStyle = symbol.style.color as string\n\n if (symbol.elementType) {\n switch (symbol.elementType) {\n case ShapeSymbols.shape: {\n const shapeSymbol = symbol as TShapeSymbol\n drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex])\n break\n }\n case ShapeSymbols.table:{\n const tableSymbols = symbol as TShapeTableSymbol\n tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line))\n break\n }\n case ShapeSymbols.line: {\n const lineSymbol = symbol as TLineSymbol\n drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2)\n break\n }\n default:\n // logger.error(`${ symbol.elementType } not implemented`)\n break\n }\n } else {\n switch (symbol.type) {\n case ShapeSymbols.ellipse: {\n drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol)\n break\n }\n case ShapeSymbols.line: {\n drawShapeLine(context2D, symbol as TShapeLineSymbol)\n break\n }\n case ShapeSymbols.recognizedShape: {\n const recognizedShape = symbol as TShapeRecognizedSymbol\n recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive))\n break\n }\n default:\n // logger.error(`${ symbol.type } not implemented`)\n break\n }\n }\n } finally {\n context2D.restore()\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) {\n if (stroker && stroke && stroke.pointerType !== \"eraser\") {\n stroker.drawStroke(context2D, stroke)\n }\n}\n","import { TPoint } from \"../../@types/geometry\"\nimport { drawLine } from \"./CanvasRendererShapeSymbol\"\nimport { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const TextSymbols = {\n inputCharacter: \"inputCharacter\",\n char: \"char\",\n string: \"string\",\n textLine: \"textLine\"\n}\n\nfunction drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol)\n{\n const delta = data.width / label.length\n const p1: TPoint = {\n x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n const p2: TPoint = {\n x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n drawLine(context2D, p1, p2)\n}\n\nfunction drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol)\n{\n context2D.save()\n try {\n context2D.font = `${ data.textHeight }px serif`\n context2D.textAlign = (data.justificationType === \"CENTER\") ? \"center\" : \"left\"\n context2D.textBaseline = \"bottom\"\n context2D.fillStyle = context2D.strokeStyle\n context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height))\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol)\n{\n drawText(context2D, textLine.label, textLine.data)\n textLine.underlineList.forEach((underline) =>\n {\n drawUnderline(context2D, underline, textLine.label, textLine.data)\n })\n}\n\n/**\n * Draw a text symbol\n * @param {Object} context Current rendering context\n * @param {Object} symbol Symbol to draw\n */\nexport function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = (symbol.style.width as number)\n context2D.strokeStyle = (symbol.style.color as string)\n const type: string = symbol.elementType || symbol.type\n\n switch (type) {\n case TextSymbols.textLine:\n drawTextLine(context2D, symbol as TTextUnderlineSymbol)\n break\n default:\n console.info(`drawTextSymbol => ${symbol.elementType} not implemented`)\n break\n }\n\n } finally {\n context2D.restore()\n }\n}\n","import { TPoint, TPointer } from \"../@types/geometry\"\n\nexport function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]\n{\n const radius = point.p * width\n return [\n {\n x: (point.x - (Math.sin(angle) * radius)),\n y: (point.y + (Math.cos(angle) * radius))\n },\n {\n x: (point.x + (Math.sin(angle) * radius)),\n y: (point.y - (Math.cos(angle) * radius))\n }\n ]\n}\n\nexport function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer\n{\n return {\n x: ((point2.x + point1.x) / 2),\n y: ((point2.y + point1.y) / 2),\n p: ((point2.p + point1.p) / 2),\n t: ((point2.t + point1.t) / 2)\n }\n}\n\nexport function computeAxeAngle(begin: TPointer, end: TPointer): number\n{\n return Math.atan2(end.y - begin.y, end.x - begin.x)\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class CanvasStroker\n{\n\n private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void\n {\n context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true)\n }\n\n private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y)\n }\n\n private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n context2d.moveTo(linkPoints[0].x, linkPoints[0].y)\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - ((i * Math.PI) / ARCSPLIT)\n context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle)))\n }\n }\n\n private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width)\n const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y)\n }\n\n drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void\n {\n const NUMBER_POINTS = stroke.pointers.length\n const NUMBER_QUADRATICS = NUMBER_POINTS - 2\n const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth\n const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle\n const firstPoint = stroke.pointers[0] as TPointer\n\n context2d.save()\n try {\n context2d.beginPath()\n if (NUMBER_POINTS < 3) {\n this.renderArc(context2d, firstPoint, width * 0.6)\n } else {\n this.renderArc(context2d, firstPoint, width * firstPoint.p)\n const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1])\n this.renderLine(context2d, firstPoint, secondPoint, width)\n\n // Possibility to try this (the start looks better when the ink is large)\n // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]);\n // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true);\n\n for (let i = 0; i < NUMBER_QUADRATICS; i++) {\n const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const ctrl: TPointer = stroke.pointers[i + 1]\n this.renderQuadratic(context2d, begin, end, ctrl, width)\n }\n const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1])\n const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderLine(context2d, beginLine, endLine, width)\n\n const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2]\n const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderFinal(context2d, beginFinal, endFinal, width)\n }\n context2d.closePath()\n if (color !== undefined) {\n context2d.fillStyle = color\n context2d.fill()\n }\n context2d.save()\n }\n finally {\n context2d.restore()\n }\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TSymbol } from \"../../@types/renderer/Symbol\"\n\nimport { drawShapeSymbol, ShapeSymbols } from \"./CanvasRendererShapeSymbol\"\nimport { drawStroke } from \"./CanvasRendererStrokeSymbol\"\nimport { drawTextSymbol, TextSymbols } from \"./CanvasRendererTextSymbol\"\nimport { CanvasStroker } from \"./CanvasStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class CanvasRenderer\n{\n config: TRenderingConfiguration\n stroker: CanvasStroker\n context!: {\n parent: HTMLElement\n renderingCanvas: HTMLCanvasElement\n renderingCanvasContext: CanvasRenderingContext2D\n capturingCanvas: HTMLCanvasElement\n capturingCanvasContext: CanvasRenderingContext2D\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new CanvasStroker()\n }\n\n private createCanvas(type: string): HTMLCanvasElement\n {\n this.#logger.debug(\"createCanvas\", { type })\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\")\n canvas.id = type\n canvas.classList.add(type)\n canvas.classList.add(\"ms-canvas\")\n return canvas\n }\n\n private resizeContent(): void\n {\n const pixelRatio: number = window.devicePixelRatio\n const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas]\n elements.forEach((canvas) =>\n {\n const domElement = canvas.parentNode as HTMLElement\n const width = Math.max(this.config.minWidth, domElement.clientWidth)\n const height = Math.max(this.config.minHeight, domElement.clientHeight)\n canvas.width = width * pixelRatio\n canvas.height = height * pixelRatio\n canvas.getContext(\"2d\")?.scale(pixelRatio, pixelRatio)\n canvas.style.width = `${ width }px`\n canvas.style.height = `${ height }px`\n })\n }\n\n private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n {\n const type = symbol.elementType || symbol.type\n if (type === \"stroke\") {\n drawStroke(context2D, symbol as TStroke, this.stroker)\n } else if (Object.keys(TextSymbols).includes(type)) {\n drawTextSymbol(context2D, symbol)\n } else if (Object.keys(ShapeSymbols).includes(type)) {\n drawShapeSymbol(context2D, symbol)\n }\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n const renderingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-rendering-canvas\")\n element.appendChild(renderingCanvas)\n\n const capturingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-capture-canvas\")\n element.appendChild(capturingCanvas)\n\n this.context = {\n parent: element,\n renderingCanvas,\n renderingCanvasContext: renderingCanvas.getContext(\"2d\") as CanvasRenderingContext2D,\n capturingCanvas,\n capturingCanvasContext: capturingCanvas.getContext(\"2d\") as CanvasRenderingContext2D\n }\n\n this.resizeContent()\n }\n\n drawModel(model: IModel): void\n {\n this.#logger.info(\"drawModel\", { model })\n this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height)\n model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol))\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n }\n\n drawPendingStroke(stroke: TStroke | undefined): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n if (stroke && stroke?.pointerType !== \"eraser\") {\n this.stroker.drawStroke(this.context.capturingCanvasContext, stroke)\n }\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n this.resizeContent()\n this.drawModel(model)\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n if (this.context.parent) {\n this.context.parent.innerHTML = \"\"\n }\n }\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.JsonCSS=e():t.JsonCSS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=1)}([function(t,e,n){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i=function t(e){var n=this;o(this,t),this.toJSON=function(t){if(\"string\"!=typeof t)return console.error(\"Need a CSS string but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid CSS..!\";var e={},o=void 0,i=void 0,u=void 0;try{t.split(\"{\").forEach(function(t){if(i=t.trim())if(-1===i.indexOf(\"}\"))e[i]={},o=i;else{i.substring(0,i.indexOf(\"}\")).split(\";\").forEach(function(t){(u=t.split(\":\"))&&2===u.length&&(e[o][u[0].trim().replace(/^\\\"|\\\"$/g,\"\")]=n._trimSemiColon(u[1].trim().replace(/^\\\"|\\\"$/g,\"\")))});try{o=i.split(\"}\")[1].trim(),o&&(e[o]={})}catch(t){}}})}catch(t){return\"Not a valid CSS..!\"}return e},this.toCSS=function(t){if(\"object\"!==(void 0===t?\"undefined\":r(t)))return console.error(\"Need a JSON object but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid JSON..!\";var e=\"\";try{for(var n in t)if(t.hasOwnProperty(n)){e+=n+\" {\\n\";for(var o in t[n])t[n].hasOwnProperty(o)&&(e+=o+\": \"+t[n][o]+\";\\n\");e+=\"}\\n\"}}catch(t){return\"Not a valid JSON..!\"}return e},this._trimSemiColon=function(t){return\";\"===t.slice(-1)?t.slice(0,n.length-1):t}};e.default=i},function(t,e,n){\"use strict\";t.exports=n(0).default}])});","import JsonCSS from \"json-css\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parser: any = new JsonCSS()\n\nexport const StyleHelper = {\n themeToCSS(json: TTheme): string\n {\n return parser.toCSS(json) as string\n // css = css.replace( /[\\r\\n]+/gm, \"\" )\n // return css\n },\n themeToJSON(style: string): TTheme\n {\n const theme = parser.toJSON(style) as TTheme\n theme[\".text\"][\"font-size\"] = Number(theme[\".text\"][\"font-size\"])\n theme.ink[\"-myscript-pen-width\"] = Number(theme.ink[\"-myscript-pen-width\"])\n theme.ink.width = Number(theme.ink.width)\n return theme\n },\n penStyleToCSS (penStyle: TPenStyle): string {\n let css = parser.toCSS({ css: penStyle }) as string\n css = css.substring(6, css.length - 3)\n return css\n },\n penStyleToJSON (penStyleString: string): TPenStyle {\n const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle\n if (penStyle.width) {\n penStyle.width = Number(penStyle.width)\n } else {\n delete penStyle.width\n }\n if (penStyle[\"-myscript-pen-width\"]) {\n penStyle[\"-myscript-pen-width\"] = Number(penStyle[\"-myscript-pen-width\"])\n } else {\n delete penStyle[\"-myscript-pen-width\"]\n }\n return penStyle\n },\n\n stringToJSON(style: string): {[key: string]: string}\n {\n return parser.toJSON(`css {${style}}`).css\n },\n JSONToString(style: {[key: string]: string}): string\n {\n return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(\";\")\n }\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA512;\n\n}));","import Hex from \"crypto-js/enc-hex\"\nimport HmacSHA512 from \"crypto-js/hmac-sha512\"\n\nexport function computeHmac (message: string, applicationKey: string, hmacKey: string): string {\n const hmac = new HmacSHA512(message, applicationKey + hmacKey)\n return hmac.toString(Hex) as string\n}\n","\nexport const isVersionSuperiorOrEqual = (source: string, target: string): boolean =>\n{\n const sourceParts = source.split(\".\")\n const targetParts = target.split(\".\")\n\n for (let i = 0; i < targetParts.length; i++) {\n const a = Number(targetParts[i])\n const b = Number(sourceParts[i])\n if (a > b) return false\n if (a < b) return true\n }\n return true\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TStroke, TStrokeJSON } from \"../@types/model/Stroke\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Stroke implements TStroke\n{\n id: string\n type: string\n pointerId: number\n pointerType: string\n elementType?: string\n pointers: TPointer[]\n length: number\n style: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STROKE)\n\n constructor(style: TPenStyle, pointerId: number, pointerType = \"pen\")\n {\n this.#logger.info(\"constructor\", { style, pointerId, pointerType })\n this.id = `${pointerType}-${Date.now().toString()}`\n this.type = \"stroke\"\n this.pointerId = pointerId\n this.pointerType = pointerType\n this.pointers = []\n this.length = 0\n this.style = style\n }\n}\n\nexport function convertStrokeToJSON(stroke: TStroke): TStrokeJSON\n{\n const json: TStrokeJSON = {\n id: stroke.id,\n pointerType: stroke.pointerType,\n p: [],\n t: [],\n x: [],\n y: []\n }\n stroke.pointers.forEach(p => {\n json.p.push(p.p)\n json.t.push(p.t)\n json.x.push(p.x)\n json.y.push(p.y)\n })\n return json\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TRestPostConfiguration, TRestPostData } from \"../@types/recognizer/RestRecognizer\"\nimport { TStrokeGroup, TStrokeGroupJSON } from \"../@types/model/Stroke\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\ntype ApiError = {\n code?: string\n message: string\n}\n\nexport class RestRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig })\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n }\n\n get url()\n {\n return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch`\n }\n\n get postConfig(): TRestPostConfiguration\n {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n return {\n lang: this.recognitionConfiguration.lang,\n diagram: this.recognitionConfiguration.diagram,\n export: this.recognitionConfiguration.export\n }\n case \"MATH\":\n return {\n lang: this.recognitionConfiguration.lang,\n math: this.recognitionConfiguration.math,\n export: this.recognitionConfiguration.export\n }\n case \"Raw Content\":\n return {\n lang: this.recognitionConfiguration.lang,\n \"raw-content\": this.recognitionConfiguration[\"raw-content\"],\n export: this.recognitionConfiguration.export\n }\n case \"TEXT\":\n return {\n lang: this.recognitionConfiguration.lang,\n text: this.recognitionConfiguration.text,\n export: this.recognitionConfiguration.export\n }\n default:\n throw new Error(`get postConfig error Recognition type unkow \"${ this.recognitionConfiguration.type }\"`)\n break\n }\n }\n\n private buildData(model: IModel): TRestPostData\n {\n this.#logger.info(\"buildData\", { model })\n const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) =>\n {\n return ps1 && ps2 && ps1[\"-myscript-pen-fill-color\"] === ps2[\"-myscript-pen-fill-color\"] &&\n ps1[\"-myscript-pen-fill-style\"] === ps2[\"-myscript-pen-fill-style\"] &&\n ps1[\"-myscript-pen-width\"] === ps2[\"-myscript-pen-width\"] &&\n ps1.color === ps2.color &&\n ps1.width === ps2.width\n }\n\n const strokeGroupByPenStyle: TStrokeGroup[] = []\n model.rawStrokes.forEach((s) => {\n const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style))\n if (groupIndex > -1) {\n strokeGroupByPenStyle[groupIndex].strokes.push(s)\n } else {\n strokeGroupByPenStyle.push({\n penStyle: s.style,\n strokes: [s]\n })\n }\n })\n\n const strokeGroupsToSend: TStrokeGroupJSON[] = []\n strokeGroupByPenStyle.forEach((group: TStrokeGroup) =>\n {\n const newPenStyle = JSON.stringify(group.penStyle) === \"{}\" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle)\n const newGroup = {\n penStyle: newPenStyle,\n strokes: group.strokes.map(convertStrokeToJSON)\n }\n strokeGroupsToSend.push(newGroup)\n })\n\n const contentType: string = this.recognitionConfiguration.type === \"Raw Content\" ?\n \"Raw Content\" :\n this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase()\n\n const data = {\n configuration: this.postConfig,\n xDPI: 96,\n yDPI: 96,\n contentType,\n // theme: StyleHelper.themeToCSS(),\n height: model.height,\n width: model.width,\n strokeGroups: strokeGroupsToSend\n }\n this.#logger.debug(\"buildData\", { data })\n return data\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async post(data: any, mimeType: string): Promise\n {\n this.#logger.info(\"post\", { data, mimeType })\n const headers = new Headers()\n headers.append(\"Accept\", \"application/json,\" + mimeType)\n headers.append(\"applicationKey\", this.serverConfiguration.applicationKey)\n headers.append(\"hmac\", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey))\n headers.append(\"Content-Type\", \"application/json\")\n\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n headers.append(\"myscript-client-name\", \"iink-ts\")\n headers.append(\"myscript-client-version\", \"1.0.0-buildVersion\")\n }\n\n const reqInit: RequestInit = {\n method: \"POST\",\n headers,\n body: JSON.stringify(data)\n }\n const request = new Request(this.url, reqInit)\n const response: Response = await fetch(request)\n if (response.ok) {\n const contentType = response.headers.get(\"content-type\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any\n switch (contentType) {\n case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n case \"image/png\":\n case \"image/jpeg\":\n result = await response.blob()\n break\n case \"application/json\":\n result = await response.json()\n break\n case \"application/vnd.myscript.jiix\":\n result = await response.clone().json().catch(async () => await response.text())\n break\n default:\n this.#logger.warn(\"post default\", { contentType })\n result = await response.text()\n break\n }\n this.#logger.debug(\"post\", { result })\n return result\n } else {\n const err = await response.json() as ApiError\n this.#logger.error(\"post\", { err })\n throw err\n }\n }\n\n private async tryFetch(data: unknown, mimeType: string): Promise\n {\n this.#logger.debug(\"tryFetch\", { data, mimeType })\n return this.post(data, mimeType)\n .then((res) =>\n {\n const exports: TExport = {}\n exports[mimeType] = res as TJIIXExport | string | Blob\n this.#logger.debug(\"tryFetch\", { exports })\n return exports\n })\n .catch((err) =>\n {\n this.#logger.error(\"tryFetch\", { data, mimeType, err })\n let message = err.message || ErrorConst.UNKNOW\n if (!err.code) {\n message = ErrorConst.CANT_ESTABLISH\n } else if (err.code === \"access.not.granted\") {\n message = ErrorConst.WRONG_CREDENTIALS\n }\n const error = new Error(message)\n throw error\n })\n }\n\n private getMimeTypes(requestedMimeTypes?: string[]): string[]\n {\n this.#logger.info(\"getMimeTypes\", { requestedMimeTypes })\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n break\n }\n }\n return mimeTypes\n }\n\n async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState, requestedMimeTypes })\n const myModel = model.getClone()\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n const dataToConcert = this.buildData(myModel)\n dataToConcert.conversionState = conversionState\n const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt))\n const converts: TExport[] = await Promise.all(promises)\n converts.forEach(c =>\n {\n myModel.mergeConvert(c)\n })\n this.#logger.debug(\"convert\", { model: myModel })\n return myModel\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n const myModel = model.getClone()\n if (myModel.rawStrokes.length === 0) {\n return Promise.resolve(myModel)\n }\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n if (!mimeTypes.length) {\n this.#logger.error(\"export\", { model, requestedMimeTypes, \"Export failed, no mimeTypes define in recognition configuration\": String })\n return Promise.reject(new Error(\"Export failed, no mimeTypes define in recognition configuration\"))\n }\n const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m])\n const data = this.buildData(model)\n const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType)))\n exports.forEach(e =>\n {\n myModel.mergeExport(e)\n })\n this.#logger.debug(\"export\", { model: myModel })\n return myModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n return this.export(model)\n }\n\n}\n","import { IModel } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\n\nexport class UndoRedoContext implements TUndoRedoContext\n{\n canUndo: boolean\n canRedo: boolean\n empty: boolean\n stackIndex: number\n possibleUndoCount: number\n stack: IModel[]\n\n constructor(model: IModel)\n {\n this.stackIndex = 0\n this.possibleUndoCount = 0\n this.canRedo = false\n this.canUndo = false\n this.empty = true\n this.stack = [model.getClone()]\n }\n}\n","import { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { IModel } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { UndoRedoContext } from \"./UndoRedoContext\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class UndoRedoManager\n{\n context: UndoRedoContext\n configuration: TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.UNDOREDO_MANAGER)\n\n constructor(configuration: TUndoRedoConfiguration, model: IModel)\n {\n this.#logger.info(\"constructor\", { configuration, model })\n this.configuration = configuration\n this.context = new UndoRedoContext(model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n private updateCanUndoRedo(): void\n {\n this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex\n this.context.canUndo = this.context.stackIndex > 0\n const currentModel = this.context.stack[this.context.stackIndex]\n this.context.empty = currentModel.rawStrokes.length === 0\n }\n\n addModelToStack(model: IModel): void\n {\n this.#logger.info(\"addModelToStack\", { model })\n if (this.context.stackIndex + 1 < this.context.stack.length) {\n this.context.stack.splice(this.context.stackIndex + 1)\n }\n\n this.context.stack.push(model.getClone())\n this.context.stackIndex = this.context.stack.length - 1\n\n if (this.context.stack.length > this.configuration.maxStackSize) {\n this.context.stack.shift()\n this.context.stackIndex--\n }\n\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n\n removeLastModelInStack(): void\n {\n this.#logger.info(\"removeLastModelInStack\")\n if (this.context.stackIndex === this.context.stack.length - 1) {\n this.context.stackIndex--\n }\n this.context.stack.pop()\n this.updateCanUndoRedo()\n }\n\n updateModelInStack(model: IModel): void\n {\n this.#logger.info(\"updateModelInStack\", { model })\n const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate)\n if (index > -1) {\n this.context.stack.splice(index, 1, model.getClone())\n }\n this.internalEvent.emitContextChange(this.context)\n }\n\n undo(): IModel\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.context.stackIndex--\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const previousModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"undo\", previousModel)\n return previousModel\n }\n\n redo(): IModel\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.context.stackIndex++\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const nextModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"redo\", nextModel)\n return nextModel\n }\n\n reset(model: IModel): void\n {\n this.#logger.info(\"reset\", { model })\n this.context = new UndoRedoContext(model)\n this.internalEvent.emitContextChange(this.context)\n }\n\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\n\nexport const DefaultPenStyle: TPenStyle = {}","import { TTheme } from \"../@types/style/Theme\"\n\nexport const DefaultTheme: TTheme = {\n ink: {\n color: \"#000000\",\n width: 1,\n \"-myscript-pen-width\": 1,\n \"-myscript-pen-fill-style\": \"none\",\n \"-myscript-pen-fill-color\": \"#FFFFFF00\"\n },\n \".math\": {\n \"font-family\": \"STIXGeneral\"\n },\n \".math-solved\": {\n \"font-family\": \"STIXGeneral\",\n color: \"#A8A8A8FF\"\n },\n \".text\": {\n \"font-family\": \"MyScriptInter\",\n \"font-size\": 10\n }\n}\n","import { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nimport { DefaultPenStyle } from \"./DefaultPenStyle\"\nimport { DefaultTheme } from \"./DefaultTheme\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class StyleManager\n{\n #penStyle!: TPenStyle\n #theme!: TTheme\n #penStyleClasses!: string\n #currentPenStyle!: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STYLEMANAGER)\n\n constructor(penStyle?: TPenStyle, theme?: TTheme)\n {\n this.#logger.info(\"constructor\", { penStyle, theme })\n this.setTheme(theme)\n this.setPenStyleClasses()\n this.setPenStyle(penStyle)\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.#currentPenStyle || this.#penStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.#penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), style || {}) as TPenStyle\n this.#currentPenStyle = style || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyle\", this.#currentPenStyle)\n }\n\n get theme(): TTheme\n {\n return this.#theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.#theme = mergeDeep(structuredClone(DefaultTheme), theme || {}) as TTheme\n this.#logger.debug(\"setTheme\", this.#theme)\n }\n\n get penStyleClasses(): string\n {\n return this.#penStyleClasses\n }\n setPenStyleClasses(penStyleClass = \"\")\n {\n this.#logger.info(\"setPenStyleClasses\", { penStyleClass })\n this.#penStyleClasses = penStyleClass\n this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyleClasses\", this.#currentPenStyle)\n }\n\n}\n","import { TPoint } from \"../@types/geometry\"\n\nexport function computeDistance(p1: TPoint, p2: TPoint): number\n{\n const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x)\n return isNaN(distance) ? 0 : distance\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPoint, TPointer } from \"../@types/geometry\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TRecognitionPositions } from \"../@types/model/RecognitionPositions\"\n\nimport { computeDistance } from \"../utils/geometric\"\nimport { Stroke } from \"./Stroke\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Model implements IModel\n{\n readonly creationTime: number\n modificationDate: number\n currentStroke?: TStroke\n positions: TRecognitionPositions\n rawStrokes: TStroke[]\n selectedStrokes: TStroke[]\n exports?: TExport\n converts?: TExport\n width: number\n height: number\n idle: boolean\n #logger = LoggerManager.getLogger(LoggerClass.MODEL)\n\n constructor(width = 100, height = 100, creationDate: number = Date.now())\n {\n this.#logger.info(\"constructor\", { width, height, creationDate })\n this.creationTime = creationDate\n this.modificationDate = creationDate\n this.width = width\n this.height = height\n this.rawStrokes = []\n this.selectedStrokes = []\n this.positions = {\n lastSentPosition: 0,\n lastReceivedPosition: 0\n }\n this.idle = true\n }\n\n mergeExport(exports: TExport)\n {\n this.#logger.info(\"mergeExport\", { exports })\n if (this.exports) {\n Object.assign(this.exports, exports)\n } else {\n this.exports = exports\n }\n this.#logger.debug(\"mergeExport\", this.exports)\n }\n\n mergeConvert(converts: TExport)\n {\n this.#logger.info(\"mergeConvert\", { converts })\n if (this.converts) {\n Object.assign(this.converts, converts)\n } else {\n this.converts = converts\n }\n this.#logger.debug(\"mergeConvert\", this.converts)\n }\n\n private computePressure(distance: number, globalDistance: number): number\n {\n let ratio = 1.0\n if (globalDistance === 0) {\n ratio = 0.5\n } else if (distance === globalDistance) {\n ratio = 1.0\n } else if (distance < 10) {\n ratio = 0.2 + Math.pow(0.1 * distance, 0.4)\n } else if (distance > globalDistance - 10) {\n ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4)\n }\n const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance)))\n return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100\n }\n\n private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean\n {\n const delta: number = (2 + ((stroke.style[\"-myscript-pen-width\"] || 0) / 4))\n return !lastPointer ||\n stroke.pointers.length === 0 ||\n Math.abs(lastPointer.x - point.x) >= delta ||\n Math.abs(lastPointer.y - point.y) >= delta\n }\n\n addPoint(stroke: TStroke, pointer: TPointer): void\n {\n this.#logger.debug(\"addPoint\", { stroke, pointer })\n const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 }\n if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) {\n const distance = computeDistance(pointer, lastPointer)\n stroke.length += distance\n pointer.p = this.computePressure(distance, stroke.length)\n stroke.pointers.push(pointer)\n }\n }\n\n addStroke(stroke: TStroke): void\n {\n this.#logger.info(\"addStroke\", { stroke })\n this.rawStrokes.push(stroke)\n }\n\n extractUnsentStrokes(): TStroke[]\n {\n return this.rawStrokes.slice(this.positions.lastSentPosition)\n }\n\n initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void\n {\n this.#logger.info(\"initCurrentStroke\", { point, pointerId, pointerType, style, dpi })\n if (style[\"-myscript-pen-width\"]) {\n const pxWidth = (style[\"-myscript-pen-width\"] * dpi) / 25.4\n style.width = pxWidth / 2\n }\n this.modificationDate = Date.now()\n this.exports = undefined\n this.converts = undefined\n this.currentStroke = new Stroke(style, pointerId, pointerType)\n this.#logger.debug(\"initCurrentStroke\", this.currentStroke)\n this.addPoint(this.currentStroke, point)\n }\n\n appendToCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"appendToCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n }\n this.#logger.debug(\"appendToCurrentStroke\", this.currentStroke)\n }\n\n endCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"endCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n this.addStroke(this.currentStroke)\n this.currentStroke = undefined\n }\n this.#logger.debug(\"endCurrentStroke\", this.currentStroke)\n }\n\n #getStrokeFromPoint(point: TPoint): TStroke[]\n {\n this.#logger.info(\"getStrokeFromPoint\", { point })\n const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max)\n\n const _strokeList: TStroke[] = []\n this.rawStrokes.forEach((stroke) =>\n {\n for (let i = 0; i < stroke.pointers.length; i++) {\n const strokePointer = stroke.pointers[i]\n if (\n isBetween(strokePointer.x, point.x - 5, point.x + 5) &&\n isBetween(strokePointer.y, point.y - 5, point.y + 5)\n ) {\n _strokeList.push(stroke)\n break\n }\n else {\n if (computeDistance(point, strokePointer) < 10) {\n _strokeList.push(stroke)\n break\n }\n }\n }\n })\n this.#logger.debug(\"getStrokeFromPoint\", { strokes: _strokeList })\n return _strokeList\n }\n\n resetSelectedStrokes(): void\n {\n this.selectedStrokes = []\n }\n\n appendSelectedStrokesFromPoint(point: TPoint): void\n {\n this.#logger.info(\"appendSelectedStrokesFromPoint\", { point })\n this.#getStrokeFromPoint(point)\n .forEach(s =>\n {\n if (!this.selectedStrokes.includes(s)) {\n this.selectedStrokes.push(s)\n }\n })\n }\n\n updateStroke(updatedStroke: TStroke): void\n {\n this.#logger.info(\"updateStroke\", { updatedStroke })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1, updatedStroke)\n }\n this.#logger.debug(\"updateStroke\", this.rawStrokes)\n }\n\n removeStroke(id: string): void\n {\n this.#logger.info(\"removeStroke\", { id })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1)\n }\n this.#logger.debug(\"removeStroke\", this.rawStrokes)\n }\n\n removeStrokesFromPoint(point: TPoint): string[]\n {\n this.#logger.info(\"removeStrokesFromPoint\", { point })\n const strokes = this.#getStrokeFromPoint(point)\n strokes.forEach(strokeToRemove =>\n {\n this.removeStroke(strokeToRemove.id)\n })\n this.#logger.debug(\"removeStrokesFromPoint\", strokes.map(s => s.id))\n return strokes.map(s => s.id)\n }\n\n updatePositionSent(position: number = this.rawStrokes.length): void\n {\n this.#logger.info(\"updatePositionSent\", { position })\n this.positions.lastSentPosition = position\n this.#logger.debug(\"updatePositionSent\", this.positions.lastSentPosition)\n }\n\n updatePositionReceived(): void\n {\n this.#logger.info(\"updatePositionReceived\")\n this.positions.lastReceivedPosition = this.positions.lastSentPosition\n this.#logger.debug(\"updatePositionReceived\", this.positions.lastReceivedPosition)\n }\n\n getClone(): IModel\n {\n this.#logger.info(\"getClone\")\n const clonedModel = new Model(this.width, this.height, this.creationTime)\n clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate))\n clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined\n clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes))\n clonedModel.positions = JSON.parse(JSON.stringify(this.positions))\n clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined\n clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined\n clonedModel.idle = this.idle\n this.#logger.debug(\"getClone\", { clonedModel })\n return clonedModel\n }\n\n clear(): void\n {\n this.#logger.info(\"clear\")\n this.modificationDate = Date.now()\n this.currentStroke = undefined\n this.rawStrokes = []\n this.positions.lastSentPosition = 0\n this.positions.lastReceivedPosition = 0\n this.exports = undefined\n this.converts = undefined\n this.idle = true\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { CanvasRenderer } from \"../renderer/canvas/CanvasRenderer\"\nimport { RestRecognizer } from \"../recognizer/RestRecognizer\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { UndoRedoManager } from \"../undo-redo/UndoRedoManager\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { Intention, LoggerClass } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\n\nexport class RestBehaviors implements IBehaviors\n{\n name = \"RestBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: CanvasRenderer\n recognizer: RestRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n #exportTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new CanvasRenderer(this.#configuration.rendering)\n this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.styleManager.setPenStyle(style)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string)\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n const { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(model => Object.assign(this.model, model))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerDown intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerMove intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n break\n default:\n this.#logger.warn(`onPointerUp intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n this.renderer.drawPendingStroke(this.model.currentStroke)\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n this.renderer.drawModel(this.model)\n const deferred = new DeferredPromise()\n this.undoRedoManager.addModelToStack(this.model)\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n clearTimeout(this.#exportTimer)\n let currentModel = this.model.getClone()\n this.#exportTimer = setTimeout(async () =>\n {\n try {\n currentModel = await this.recognizer.export(currentModel)\n this.undoRedoManager.updateModelInStack(currentModel)\n if (this.model.modificationDate === currentModel.modificationDate) {\n this.model.exports = currentModel.exports\n }\n deferred.resolve(this.model)\n } catch (error) {\n this.#logger.error(\"updateModelRendering\", { error })\n deferred.reject(error as Error)\n }\n }, this.#configuration.triggers.exportContent === \"QUIET_PERIOD\" ? this.#configuration.triggers.exportContentDelay : 0)\n } else {\n deferred.resolve(this.model)\n }\n await deferred.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"updateModelRendering\", this.model.exports)\n return deferred.promise\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes)\n if (this.model.modificationDate === newModel.modificationDate) {\n this.model.mergeExport(newModel.exports as TExport)\n }\n this.undoRedoManager.updateModelInStack(newModel)\n this.#logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { conversionState, requestedMimeTypes })\n const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes)\n Object.assign(this.#model, newModel)\n this.#logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n this.renderer.resize(this.model)\n if (this.model.rawStrokes.length) {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n const resizeModel = await this.recognizer.resize(this.model)\n deferredResize.resolve(resizeModel)\n }, this.#configuration.triggers.resizeTriggerDelay)\n } else {\n deferredResize.resolve(this.model)\n }\n const newModel = await deferredResize.promise\n this.#logger.debug(\"resize\", { newModel })\n this.internalEvent.emitExported(newModel.exports as TExport)\n return newModel\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n this.#model = this.undoRedoManager.undo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"undo\", this.#model)\n return this.#model\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n this.#model = this.undoRedoManager.redo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"redo\", this.#model)\n return this.#model\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.drawModel(this.model)\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n return Promise.resolve()\n }\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { LoggerClass } from \"../@types/configuration/LoggerConfiguration\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\nimport { LoggerManager } from \"../logger\"\n\n/**\n * A websocket dialog have this sequence :\n * --------------------------- Client --------------------------------------------------- Server ----------------------------------\n * init: send newContentPackage or restoreIInkSession ==================>\n * <================== hmacChallenge\n * answer hmacChallenge: send the hmac ==================>\n * <================== contentPackageDescription\n * answer contentPackageDescription:\n * send the configuration ==================>\n * send newContentPart or openContentPart ==================>\n * <================== partChanged\n * <================== contentChanged\n * <================== newPart\n * <================== svgPatch\n *\n * setPenStyle (send the parameters) ==================>\n * setTheme (send the parameters) ==================>\n * setPenStyleClasses (send the parameters) ==================>\n * <================== svgPatch\n * addStrokes (send the strokes ) ============>\n * <================== update\n */\nexport class WSRecognizer implements IRecognizer\n{\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n protected socket!: WebSocket\n protected pingCount = 0\n protected reconnectionCount = 0\n protected viewSizeHeight!: number\n protected viewSizeWidth!: number\n // contentPartCount = 0\n protected sessionId?: string\n protected currentPartId?: string\n protected currentErrorCode?: string | number\n\n protected penStyle?: TPenStyle\n protected penStyleClasses?: string\n protected theme?: TTheme\n\n protected connected?: DeferredPromise\n protected initialized?: DeferredPromise\n protected addStrokeDeferred?: DeferredPromise\n protected exportDeferred?: DeferredPromise\n protected convertDeferred?: DeferredPromise\n protected importDeferred?: DeferredPromise\n protected resizeDeferred?: DeferredPromise\n protected undoDeferred?: DeferredPromise\n protected redoDeferred?: DeferredPromise\n protected clearDeferred?: DeferredPromise\n protected importPointEventsDeferred?: DeferredPromise\n protected waitForIdleDeferred?: DeferredPromise\n\n url: string\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n const scheme = (this.serverConfiguration.scheme === \"https\") ? \"wss\" : \"ws\"\n this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }`\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig, url: this.url })\n }\n\n get mimeTypes(): string[]\n {\n switch (this.recognitionConfiguration.type.toLocaleLowerCase()) {\n case \"text\":\n return this.recognitionConfiguration.text.mimeTypes\n case \"math\":\n return this.recognitionConfiguration.math.mimeTypes\n case \"diagram\":\n return this.recognitionConfiguration.diagram.mimeTypes\n default:\n //\"raw-content\"\n return []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n protected infinitePing(): void\n {\n this.pingCount++\n if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) {\n this.socket.close(1000, \"PING_LOST\")\n } else if (this.socket.readyState <= 1) {\n setTimeout(() =>\n {\n if (this.socket.readyState <= 1) {\n this.socket.send(JSON.stringify({ type: \"ping\" }))\n this.infinitePing()\n }\n }, this.serverConfiguration.websocket.pingDelay)\n }\n }\n\n protected openCallback(): void\n {\n this.connected?.resolve()\n const params: TWebSocketEvent = {\n type: this.sessionId ? \"restoreIInkSession\" : \"newContentPackage\",\n iinkSessionId: this.sessionId,\n applicationKey: this.serverConfiguration.applicationKey,\n xDpi: 96,\n yDpi: 96,\n viewSizeHeight: this.viewSizeHeight,\n viewSizeWidth: this.viewSizeWidth\n }\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n params[\"myscript-client-name\"] = \"iink-ts\"\n params[\"myscript-client-version\"] = \"1.0.0-buildVersion\"\n }\n this.send(params)\n }\n\n protected rejectDeferredPending(error: Error): void\n {\n if (this.connected?.isPending) {\n this.connected?.reject(error)\n }\n if (this.initialized?.isPending) {\n this.initialized?.reject(error)\n }\n if (this.addStrokeDeferred?.isPending) {\n this.addStrokeDeferred?.reject(error)\n }\n if (this.exportDeferred?.isPending) {\n this.exportDeferred?.reject(error)\n }\n if (this.convertDeferred?.isPending) {\n this.convertDeferred?.reject(error)\n }\n if (this.importDeferred?.isPending) {\n this.importDeferred?.reject(error)\n }\n if (this.resizeDeferred?.isPending) {\n this.resizeDeferred?.reject(error)\n }\n if (this.undoDeferred?.isPending) {\n this.undoDeferred?.reject(error)\n }\n if (this.redoDeferred?.isPending) {\n this.redoDeferred?.reject(error)\n }\n if (this.clearDeferred?.isPending) {\n this.clearDeferred.reject(error)\n }\n if (this.waitForIdleDeferred?.isPending) {\n this.waitForIdleDeferred.reject(error)\n }\n }\n\n protected closeCallback(evt: CloseEvent): void\n {\n let message = \"\"\n if (!this.currentErrorCode) {\n switch (evt.code) {\n case 1000:\n // Normal Closure\n break\n case 1001:\n message = ErrorConst.GOING_AWAY\n break\n case 1002:\n message = ErrorConst.PROTOCOL_ERROR\n break\n case 1003:\n message = ErrorConst.UNSUPPORTED_DATA\n break\n case 1006:\n message = ErrorConst.ABNORMAL_CLOSURE\n break\n case 1007:\n message = ErrorConst.INVALID_FRAME_PAULOAD\n break\n case 1008:\n message = ErrorConst.POLICY_VIOLATION\n break\n case 1009:\n message = ErrorConst.MESSAGE_TOO_BIG\n break\n case 1011:\n message = ErrorConst.INTERNAL_ERROR\n break\n case 1012:\n message = ErrorConst.SERVICE_RESTART\n break\n case 1013:\n message = ErrorConst.TRY_AGAIN\n break\n case 1014:\n message = ErrorConst.BAD_GATEWAY\n break\n case 1015:\n message = ErrorConst.TLS_HANDSHAKE\n break\n default:\n this.#logger.warn(\"closeCallback unknow CloseEvent.code\", { evt })\n message = ErrorConst.CANT_ESTABLISH\n break\n }\n }\n const error = new Error(message || evt.reason)\n\n this.rejectDeferredPending(error)\n\n if (!this.currentErrorCode && evt.code !== 1000) {\n this.internalEvent.emitError(error)\n }\n }\n\n protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageHMACChallengeMessage\", { websocketMessage })\n const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent\n if (hmacChallengeMessage.hmacChallenge) {\n this.send({\n type: \"hmac\",\n hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)\n })\n }\n if (hmacChallengeMessage.iinkSessionId) {\n this.sessionId = hmacChallengeMessage.iinkSessionId\n }\n }\n\n protected manageContentPackageDescriptionMessage(): void\n {\n this.reconnectionCount = 0\n this.#logger.info(\"manageContentPackageDescriptionMessage\")\n\n this.send({ ...this.recognitionConfiguration, type: \"configuration\" })\n\n if (this.currentPartId) {\n this.send({ type: \"openContentPart\", id: this.currentPartId, mimeTypes: this.mimeTypes })\n }\n else {\n this.send({ type: \"newContentPart\", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes })\n }\n }\n\n protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"managePartChangeMessage\", { websocketMessage })\n const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent\n this.currentPartId = partChangeMessage.partId\n this.initialized?.resolve()\n }\n\n protected manageExportMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageExportMessage\", { websocketMessage })\n const exportMessage = websocketMessage as TWebSocketExportEvent\n if (exportMessage.exports[\"application/vnd.myscript.jiix\"]) {\n exportMessage.exports[\"application/vnd.myscript.jiix\"] = JSON.parse(exportMessage.exports[\"application/vnd.myscript.jiix\"].toString()) as TJIIXExport\n }\n this.initialized?.resolve()\n this.addStrokeDeferred?.resolve(exportMessage.exports)\n this.exportDeferred?.resolve(exportMessage.exports)\n this.convertDeferred?.resolve(exportMessage.exports)\n this.importDeferred?.resolve(exportMessage.exports)\n this.undoDeferred?.resolve(exportMessage.exports)\n this.redoDeferred?.resolve(exportMessage.exports)\n this.clearDeferred?.resolve(exportMessage.exports)\n this.importPointEventsDeferred?.resolve(exportMessage.exports)\n this.internalEvent.emitExported(exportMessage.exports)\n }\n\n protected async manageWaitForIdle(): Promise {\n this.internalEvent.emitIdle(true)\n this.waitForIdleDeferred?.resolve()\n }\n\n protected manageErrorMessage(websocketMessage: TWebSocketEvent): void\n {\n const err = websocketMessage as TWebSocketErrorEvent\n this.currentErrorCode = err.data?.code || err.code\n let message = err.data?.message || err.message || ErrorConst.UNKNOW\n\n switch (this.currentErrorCode) {\n case \"no.activity\":\n message = ErrorConst.NO_ACTIVITY\n break\n case \"access.not.granted\":\n message = ErrorConst.WRONG_CREDENTIALS\n break\n case \"session.too.old\":\n message = ErrorConst.TOO_OLD\n break\n }\n const error = new Error(message)\n this.rejectDeferredPending(error)\n this.internalEvent.emitError(error)\n }\n\n protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageContentChangeMessage\", { websocketMessage })\n const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent\n const context: TUndoRedoContext = {\n canRedo: contentChangeMessage.canRedo,\n canUndo: contentChangeMessage.canUndo,\n empty: contentChangeMessage.empty,\n stackIndex: contentChangeMessage.undoStackIndex,\n possibleUndoCount: contentChangeMessage.possibleUndoCount,\n stack: []\n }\n this.internalEvent.emitContextChange(context)\n }\n\n protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageSVGPatchMessage\", { websocketMessage })\n this.resizeDeferred?.resolve()\n const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent\n this.internalEvent.emitSVGPatch(svgPatchMessage)\n }\n\n protected messageCallback(message: MessageEvent): void\n {\n this.#logger.debug(\"messageCallback\", { message })\n this.currentErrorCode = undefined\n const websocketMessage: TWebSocketEvent = JSON.parse(message.data)\n if (websocketMessage.type !== \"pong\") {\n this.pingCount = 0\n switch (websocketMessage.type) {\n case \"ack\":\n this.manageHMACChallengeMessage(websocketMessage)\n break\n case \"contentPackageDescription\":\n this.manageContentPackageDescriptionMessage()\n break\n case \"partChanged\":\n this.managePartChangeMessage(websocketMessage)\n break\n case \"newPart\":\n this.initialized?.resolve()\n break\n case \"contentChanged\":\n this.manageContentChangeMessage(websocketMessage)\n break\n case \"exported\":\n this.manageExportMessage(websocketMessage)\n break\n case \"svgPatch\":\n this.manageSVGPatchMessage(websocketMessage)\n break\n case \"error\":\n this.manageErrorMessage(websocketMessage)\n break\n case \"idle\":\n this.manageWaitForIdle()\n break\n default :\n this.#logger.warn(\"messageCallback\", `Message type unknow: \"${websocketMessage.type}\".`)\n }\n }\n }\n\n async init(height: number, width: number): Promise\n {\n try {\n this.#logger.info(\"init\", { height, width })\n this.destroy()\n this.connected = new DeferredPromise()\n this.initialized = new DeferredPromise()\n this.viewSizeHeight = height\n this.viewSizeWidth = width\n this.pingCount = 0\n this.socket = new WebSocket(this.url)\n\n if (this.serverConfiguration.websocket.pingEnabled) {\n this.infinitePing()\n }\n\n this.socket.addEventListener(\"open\", this.openCallback.bind(this))\n this.socket.addEventListener(\"close\", this.closeCallback.bind(this))\n this.socket.addEventListener(\"message\", this.messageCallback.bind(this))\n\n return this.initialized.promise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n const error = new Error(ErrorConst.CANT_ESTABLISH)\n this.internalEvent.emitError(error)\n this.initialized?.reject(error)\n return this.initialized?.promise\n }\n }\n\n async send(message: TWebSocketEvent): Promise\n {\n if (!this.connected) {\n return Promise.reject(new Error(\"Recognizer must be initilized\"))\n }\n await this.connected.promise\n if (this.socket.readyState === this.socket.OPEN) {\n this.#logger.debug(\"send\", { message })\n this.socket.send(JSON.stringify(message))\n return Promise.resolve()\n } else {\n if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) {\n this.reconnectionCount++\n if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) {\n this.#logger.debug(\"send\", `try to reconnect number: ${this.reconnectionCount}.`)\n this.internalEvent.emitClearMessage()\n await this.init(this.viewSizeHeight, this.viewSizeWidth)\n await this.setPenStyle(this.penStyle as TPenStyle)\n await this.setPenStyleClasses(this.penStyleClasses as string)\n await this.setTheme(this.theme as TTheme)\n return this.send(message)\n }\n else {\n return Promise.reject(new Error(\"Unable to send message. The maximum number of connection attempts has been reached.\"))\n }\n }\n }\n }\n\n async addStrokes(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"addStrokes\", { strokes })\n await this.initialized?.promise\n this.addStrokeDeferred = new DeferredPromise()\n if (strokes.length === 0) {\n this.addStrokeDeferred.resolve({} as TExport)\n }\n else {\n await this.send({\n type: \"addStrokes\",\n strokes: strokes.map(convertStrokeToJSON)\n })\n }\n return this.addStrokeDeferred?.promise\n }\n\n async setPenStyle(penStyle: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n await this.initialized?.promise\n this.penStyle = penStyle\n const message: TWebSocketEvent = {\n type: \"setPenStyle\",\n style: StyleHelper.penStyleToCSS(penStyle)\n }\n return this.send(message)\n }\n\n async setPenStyleClasses(penStyleClasses: string): Promise\n {\n await this.initialized?.promise\n this.penStyleClasses = penStyleClasses\n this.#logger.info(\"setPenStyleClasses\", { penStyleClasses })\n const message: TWebSocketEvent = {\n type: \"setPenStyleClasses\",\n styleClasses: penStyleClasses\n }\n return this.send(message)\n }\n\n async setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n await this.initialized?.promise\n this.theme = theme\n const message: TWebSocketEvent = {\n type: \"setTheme\",\n theme: StyleHelper.themeToCSS(theme)\n }\n return this.send(message)\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n await this.initialized?.promise\n this.exportDeferred = new DeferredPromise()\n const localModel = model.getClone()\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n }\n }\n\n if (!mimeTypes.length) {\n return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`))\n }\n\n const message: TWebSocketEvent = {\n type: \"export\",\n partId: this.currentPartId,\n mimeTypes\n }\n await this.send(message)\n const exports: TExport = await this.exportDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n this.#logger.debug(\"export\", { model: localModel })\n return localModel\n }\n\n async import(model: IModel, data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n await this.initialized?.promise\n const localModel = model.getClone()\n const chunkSize = this.serverConfiguration.websocket.fileChunkSize\n const importFileId = Math.random().toString(10).substring(2, 6)\n this.importDeferred = new DeferredPromise()\n const readBlob = (blob: Blob): Promise =>\n {\n const fileReader = new FileReader()\n return new Promise((resolve, reject) =>\n {\n fileReader.onloadend = (ev) => resolve(ev.target?.result as string)\n fileReader.onerror = () => reject()\n fileReader.readAsText(blob)\n })\n }\n\n const importFileMessage: TWebSocketEvent = {\n type: \"importFile\",\n importFileId,\n mimeType\n }\n await this.send(importFileMessage)\n for (let i = 0; i < data.size; i += chunkSize) {\n const blobPart = data.slice(i, i + chunkSize, data.type)\n const partFileString = await readBlob(blobPart)\n const fileChuckMessage: TWebSocketEvent = {\n type: \"fileChunk\",\n importFileId,\n data: partFileString,\n lastChunk: i + chunkSize > data.size\n }\n await this.send(fileChuckMessage)\n }\n const exports = await this.importDeferred?.promise\n this.importDeferred = undefined\n localModel.mergeExport(exports)\n return localModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n await this.initialized?.promise\n this.resizeDeferred = new DeferredPromise()\n const localModel = model.getClone()\n this.viewSizeHeight = localModel.height\n this.viewSizeWidth = localModel.width\n const message: TWebSocketEvent = {\n type: \"changeViewSize\",\n height: this.viewSizeHeight,\n width: this.viewSizeWidth,\n }\n await this.send(message)\n await this.resizeDeferred?.promise\n return localModel\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointsEvents\", { strokes })\n await this.initialized?.promise\n this.importPointEventsDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"pointerEvents\",\n events: strokes.map(convertStrokeToJSON)\n }\n this.send(message)\n const exportPoints = await this.importPointEventsDeferred?.promise\n this.importPointEventsDeferred = undefined\n this.#logger.debug(\"importPointEvents\", { exportPoints })\n return exportPoints as TExport\n }\n\n async convert(model: IModel, conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState })\n await this.initialized?.promise\n this.convertDeferred = new DeferredPromise()\n const localModel = model.getClone()\n const message: TWebSocketEvent = {\n type: \"convert\",\n conversionState\n }\n await this.send(message)\n const myExportConverted: TExport = await this.convertDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeConvert(myExportConverted)\n localModel.mergeExport(myExportConverted)\n this.#logger.debug(\"convert\", { model: localModel })\n return localModel\n }\n\n async waitForIdle(): Promise\n {\n await this.initialized?.promise\n this.waitForIdleDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"waitForIdle\",\n }\n await this.send(message)\n return this.waitForIdleDeferred?.promise\n }\n\n async undo(model: IModel): Promise\n {\n this.#logger.info(\"undo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.undoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"undo\",\n }\n await this.send(message)\n const undoExports = await this.undoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(undoExports)\n this.#logger.debug(\"undo\", { model: localModel })\n this.undoDeferred = undefined\n return localModel\n }\n\n async redo(model: IModel): Promise\n {\n this.#logger.info(\"redo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.redoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"redo\",\n }\n await this.send(message)\n const redoExports = await this.redoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(redoExports)\n this.#logger.debug(\"redo\", { model: redoExports })\n this.redoDeferred = undefined\n return localModel\n }\n\n async clear(model: IModel): Promise\n {\n this.#logger.info(\"clear\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n localModel.modificationDate = Date.now()\n this.clearDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"clear\",\n }\n await this.send(message)\n const clearExports = await this.clearDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(clearExports)\n this.clearDeferred = undefined\n this.#logger.info(\"clear\", { model: localModel })\n return localModel\n }\n\n close(code: number, reason: string): void\n {\n if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) {\n this.#logger.info(\"close\", { code, reason })\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.socket.close(code, reason)\n }\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n this.connected = undefined\n this.initialized = undefined\n this.addStrokeDeferred = undefined\n this.exportDeferred = undefined\n this.convertDeferred = undefined\n this.importDeferred = undefined\n this.resizeDeferred = undefined\n this.undoDeferred = undefined\n this.redoDeferred = undefined\n this.clearDeferred = undefined\n if (this.socket) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.close(1000, \"Recognizer destroyed\")\n }\n }\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class SVGStroker\n{\n\n private getArcPath(center: TPointer, radius: number): string\n {\n const svgPath = [\n `M ${ center.x },${ center.y }`,\n `m ${ -radius },0`,\n `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`,\n `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0`\n ].join(\" \")\n return svgPath\n }\n\n private getLinePath(begin: TPointer, end: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `L ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private getFinalPath(begin: TPointer, end: TPointer, width: number): string\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`]\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - (i * (Math.PI / ARCSPLIT))\n parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`)\n }\n const svgPath = parts.join(\" \")\n return svgPath\n }\n\n private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width)\n const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private buildSVGPath(stroke: TStroke): string\n {\n const STROKE_LENGTH = stroke.pointers.length\n const STROKE_WIDTH = (stroke.style.width as number)\n const NB_QUADRATICS = STROKE_LENGTH - 2\n const firstPoint = stroke.pointers[0]\n\n const parts = []\n if (STROKE_LENGTH < 3) {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6))\n } else {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p))\n parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH))\n\n for (let i = 0; i < NB_QUADRATICS; i++) {\n const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const central = stroke.pointers[i + 1]\n parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH)\n )\n }\n const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2]\n const lastPoint = stroke.pointers[STROKE_LENGTH - 1]\n parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH))\n parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH))\n }\n return parts.join(\" \")\n }\n\n drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void\n {\n const svgPathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n svgPathElement.classList.add(\"pending-stroke\")\n svgPathElement.setAttribute(\"id\", stroke.id)\n svgPathElement.setAttribute(\"type\", stroke.pointerType)\n attrs?.forEach(a =>\n {\n svgPathElement.setAttribute(a.name, a.value)\n })\n const svgPath = this.buildSVGPath(stroke)\n svgPathElement.setAttribute(\"d\", `${ svgPath }Z`)\n svgElement.appendChild(svgPathElement)\n }\n}\n","import { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from \"../../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { SVGStroker } from \"./SVGStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class WSSVGRenderer\n{\n config: TRenderingConfiguration\n stroker: SVGStroker\n context!: {\n parent: HTMLElement\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new SVGStroker()\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n element.style.fontSize = \"10px\"\n this.context = {\n parent: element\n }\n }\n\n #drawStroke(svgElement: SVGElement, stroke: TStroke)\n {\n let style: string\n if (stroke.pointerType === \"eraser\") {\n stroke.style.width = 20\n style = \"fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;\"\n } else {\n style = `fill:${ stroke.style.color };stroke:transparent;`\n }\n this.stroker.drawStroke(svgElement, stroke, [{ name: \"style\", value: style }])\n }\n\n #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void\n {\n const oldLayer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement | null\n oldLayer?.remove()\n this.context.parent.insertAdjacentHTML(\"beforeend\", update.svg)\n const layer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement\n if (layerName === \"MODEL\") {\n const pendingStrokesGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n pendingStrokesGroup.id = \"pendingStrokes\"\n layer.appendChild(pendingStrokesGroup)\n }\n }\n\n #replaceElement(update: TUpdatePatchReplaceELement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null\n if (elementToRemove) {\n const parent = elementToRemove.parentNode as HTMLElement | null | undefined\n elementToRemove?.remove()\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n }\n\n #appendChild(layerName: string, update: TUpdatePatchAppendChild): void\n {\n const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer=\"${ layerName }\"]`\n const parent = this.context.parent.querySelector(parentSelector) as HTMLElement\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n\n #removeChild(update: TUpdatePatchRemoveChild): void\n {\n this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove()\n }\n\n #removeElement(update: TUpdatePatchRemoveElement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`)\n if (elementToRemove) {\n if (update.id.includes(\"s\") || update.id.includes(\"MODEL\")) {\n elementToRemove.remove()\n } else {\n elementToRemove.setAttribute(\"class\", \"removed-stroke\")\n setTimeout(() =>\n {\n elementToRemove?.remove()\n }, 100)\n }\n }\n }\n\n #insertBefore(update: TUpdatePatchInsertBefore): void\n {\n const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null\n parent?.insertAdjacentHTML(\"beforebegin\", update.svg)\n }\n\n #setAttribute(update: TUpdatePatchSetAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.setAttribute(update.name, update.value)\n }\n\n #removeAttribute(update: TUpdatePatchRemoveAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.removeAttribute(update.name)\n }\n\n updateLayer(layerName: string, update: TUpdatePatch): void\n {\n this.#logger.info(\"updateLayer\", { layerName, update })\n switch (update.type) {\n case \"REPLACE_ALL\":\n this.#replaceAll(layerName, update as TUpdatePatchReplaceAll)\n break\n case \"REPLACE_ELEMENT\":\n this.#replaceElement(update as TUpdatePatchReplaceELement)\n break\n case \"APPEND_CHILD\":\n this.#appendChild(layerName, update as TUpdatePatchAppendChild)\n break\n case \"REMOVE_ELEMENT\":\n this.#removeElement(update as TUpdatePatchRemoveElement)\n break\n case \"REMOVE_CHILD\":\n this.#removeChild(update as TUpdatePatchRemoveChild)\n break\n case \"INSERT_BEFORE\":\n this.#insertBefore(update as TUpdatePatchInsertBefore)\n break\n case \"SET_ATTRIBUTE\":\n this.#setAttribute(update as TUpdatePatchSetAttribut)\n break\n case \"REMOVE_ATTRIBUTE\":\n this.#removeAttribute(update as TUpdatePatchRemoveAttribut)\n break\n default:\n this.#logger.warn(\"updateLayer Default\", {layerName, update})\n break\n }\n }\n\n updatesLayer(layerName: string, updates: TUpdatePatch[]): void\n {\n this.#logger.info(\"updatesLayer\", { layerName, updates })\n updates.forEach(u => this.updateLayer(layerName, u))\n this.clearPendingStroke()\n }\n\n clearPendingStroke(): void\n {\n this.#logger.info(\"clearPendingStroke\", { })\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n pendingStrokeGroup.innerHTML = \"\"\n }\n }\n\n drawPendingStroke(stroke: TStroke): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n if (stroke) {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`)\n if (oldStroke) {\n oldStroke.remove()\n }\n this.#drawStroke(pendingStrokeGroup, stroke)\n }\n }\n }\n\n clearErasingStrokes(): void\n {\n const erasingStrokeList = this.context.parent.querySelectorAll(\"[type=eraser]\") as NodeListOf\n erasingStrokeList.forEach(erasingStroke => {\n erasingStroke.remove()\n })\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n const rect = this.context.parent.getBoundingClientRect()\n const svgList = this.context.parent.querySelectorAll(\"svg\")\n const width = Math.max(rect.width, model.width)\n const height = Math.max(rect.height, model.height)\n svgList.forEach(svg =>\n {\n svg.setAttribute(\"viewBox\", `0 0 ${ width }, ${ height }`)\n svg.setAttribute(\"width\", `${ width }px`)\n svg.setAttribute(\"height\", `${ height }px`)\n })\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\", { context: this.context })\n if (this.context?.parent) {\n this.context.parent.querySelectorAll(\"svg\").forEach(n => n.remove())\n }\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { WSRecognizer } from \"../recognizer/WSRecognizer\"\nimport { Intention } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { WSSVGRenderer } from \"../renderer/svg/WSSVGRenderer\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { UndoRedoManager } from \"../undo-redo\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class WSBehaviors implements IBehaviors\n{\n name = \"WSBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: WSSVGRenderer\n recognizer: WSRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new WSSVGRenderer(this.#configuration.rendering)\n this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(penStyle?: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n this.styleManager.setPenStyle(penStyle)\n this.#logger.debug(\"setPenStyle\", this.styleManager.penStyle)\n return this.recognizer.setPenStyle(this.styleManager.penStyle)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string): Promise\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n this.#logger.debug(\"setPenStyleClasses\", this.styleManager.penStyleClasses)\n return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n this.#logger.debug(\"setTheme\", this.styleManager.theme)\n return this.recognizer.setTheme(this.styleManager.theme)\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n\n this.internalEvent.addSVGPatchListener(this.onSVGPatch)\n\n await this.recognizer.init(this.model.height, this.model.width)\n await this.setPenStyle(this.penStyle)\n await this.setTheme(this.theme)\n await this.setPenStyleClasses(this.penStyleClasses)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n let { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n if (this.intention === Intention.Erase) {\n pointerType = \"eraser\"\n }\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n }\n\n private async onPointerUp(_evt: PointerEvent, point: TPointer): Promise\n {\n try {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n this.model.endCurrentStroke(point)\n await this.updateModelRendering()\n } catch (error) {\n this.internalEvent.emitError(error as Error)\n }\n }\n\n private onSVGPatch = (evt: TWebSocketSVGPatchEvent) =>\n {\n this.#logger.info(\"onSVGPatch\", { evt })\n this.renderer.updatesLayer(evt.layer, evt.updates)\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n const currentStroke = this.model.currentStroke as TStroke\n if (currentStroke) {\n this.renderer.drawPendingStroke(currentStroke)\n }\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.clearErasingStrokes()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.mergeExport(exports)\n this.undoRedoManager.updateModelInStack(this.model)\n }\n this.#logger.debug(\"updateModelRendering\", this.model)\n return this.model\n }\n\n async waitForIdle(): Promise\n {\n return this.recognizer.waitForIdle()\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointEvents\", { strokes })\n const exportPoints = await this.recognizer.importPointEvents(strokes)\n this.model.mergeExport(exportPoints)\n this.#logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n try {\n if (this.#configuration.triggers.exportContent === \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.updatePositionReceived()\n this.model.mergeExport(exports)\n this.#logger.debug(\"export\", this.model)\n return this.model\n } else {\n return this.recognizer.export(this.model, mimeTypes)\n }\n } catch (error) {\n this.#logger.error(\"export\", { error } )\n this.internalEvent.emitError(error as Error)\n return Promise.reject(error)\n }\n }\n\n async convert(conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { conversionState })\n this.undoRedoManager.addModelToStack(this.model)\n this.context.stack.push(this.model.getClone())\n this.#model = await this.recognizer.convert(this.model, conversionState)\n this.#logger.debug(\"convert\", this.model)\n this.undoRedoManager.addModelToStack(this.model)\n return this.model\n }\n\n async import(data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n this.context.stack.push(this.model.getClone())\n const m = await this.recognizer.import(this.model, data, mimeType)\n this.undoRedoManager.addModelToStack(m)\n return m\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n const clonedModel = this.model.getClone()\n this.renderer.resize(clonedModel)\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n try {\n const resizeModel = await this.recognizer.resize(clonedModel)\n deferredResize.resolve(resizeModel)\n } catch (error) {\n this.#logger.error(\"resize\", { height, width, error } )\n deferredResize.reject(error as Error)\n }\n }, this.#configuration.triggers.resizeTriggerDelay)\n\n this.#model = await deferredResize.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.#model = this.undoRedoManager.undo()\n return this.recognizer.undo(this.model)\n }\n else {\n throw new Error(\"Undo not allowed\")\n }\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.#model = this.undoRedoManager.redo()\n this.#logger.debug(\"undo\", this.#model)\n return this.recognizer.redo(this.model)\n }\n else {\n throw new Error(\"Redo not allowed\")\n }\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n return this.recognizer.clear(this.model)\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n this.recognizer.destroy()\n return Promise.resolve()\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { TConfiguration } from \"./@types/configuration\"\nimport { IGrabber } from \"./@types/grabber/Grabber\"\nimport { TStroke } from \"./@types/model/Stroke\"\nimport { IModel, TExport, TJIIXExport } from \"./@types/model/Model\"\nimport { TPenStyle } from \"./@types/style/PenStyle\"\nimport { TTheme } from \"./@types/style/Theme\"\nimport { IBehaviors, TBehaviorOptions } from \"./@types/Behaviors\"\nimport { TConverstionState } from \"./@types/configuration/RecognitionConfiguration\"\nimport { TMarginConfiguration } from \"./@types/configuration/recognition/MarginConfiguration\"\nimport { TUndoRedoContext } from \"./@types/undo-redo/UndoRedoContext\"\nimport { LoggerClass, TLoggerConfiguration } from \"./@types/configuration/LoggerConfiguration\"\n\nimport { ExportType, Intention } from \"./Constants\"\nimport { DefaultLoggerConfiguration } from \"./configuration\"\nimport { PublicEvent } from \"./event/PublicEvent\"\nimport { InternalEvent } from \"./event/InternalEvent\"\nimport { SmartGuide } from \"./smartguide/SmartGuide\"\nimport { DeferredPromise } from \"./utils/DeferredPromise\"\nimport { RestBehaviors } from \"./behaviors/RestBehaviors\"\nimport { WSBehaviors } from \"./behaviors/WSBehaviors\"\nimport { LoggerManager, Logger } from \"./logger\"\n\nimport \"./iink.css\"\n\nexport type HTMLEditorElement = HTMLElement &\n{\n editor: Editor\n}\n\nexport class Editor\n{\n wrapperHTML: HTMLEditorElement\n #loaderHTML: HTMLDivElement\n #messageHTML: HTMLDivElement\n #behaviors!: IBehaviors\n #smartGuide?: SmartGuide\n #initializationDeferred: DeferredPromise\n\n logger: Logger\n #loggerConfiguration: TLoggerConfiguration\n showStrokesPan = false\n\n constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = \"ms-editor\")\n {\n this.#loggerConfiguration = Object.assign({}, DefaultLoggerConfiguration, options.logger)\n\n this.logger = LoggerManager.getLogger(LoggerClass.EDITOR)\n this.logger.info(\"constructor\", { wrapperHTML, options, globalClassCss })\n this.#initializationDeferred = new DeferredPromise()\n\n this.wrapperHTML = wrapperHTML as HTMLEditorElement\n this.wrapperHTML.classList.add(globalClassCss)\n this.events.setElement(this.wrapperHTML)\n\n this.#loaderHTML = document.createElement(\"div\")\n this.#loaderHTML.classList.add(\"loader\")\n this.#loaderHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#loaderHTML)\n\n this.#messageHTML = document.createElement(\"div\")\n this.#messageHTML.classList.add(\"message\")\n this.#messageHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#messageHTML)\n\n this.#instantiateBehaviors(options)\n }\n\n get loggerConfiguration(): TLoggerConfiguration\n {\n return this.#loggerConfiguration\n }\n\n set loggerConfiguration(loggerConfig: TLoggerConfiguration)\n {\n this.#loggerConfiguration = loggerConfig\n LoggerManager.setLoggerLevel(loggerConfig)\n }\n\n get initializationPromise(): Promise\n {\n return this.#initializationDeferred.promise\n }\n\n get model(): IModel\n {\n return this.behaviors.model\n }\n\n get behaviors(): IBehaviors\n {\n return this.#behaviors\n }\n\n get configuration(): TConfiguration\n {\n return this.behaviors.configuration\n }\n set configuration(configuration: TConfiguration)\n {\n this.logger.info(\"set configuration\", { configuration })\n this.#instantiateBehaviors({ configuration })\n this.initialize()\n }\n\n get intention(): Intention\n {\n return this.behaviors.intention\n }\n set intention(m: Intention)\n {\n this.logger.info(\"set intention\", { m })\n this.behaviors.intention = m\n switch (this.behaviors.intention) {\n case Intention.Erase:\n this.wrapperHTML.classList.add(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n // case Intention.Selecting:\n // this.model.resetSelectedStrokes()\n // this.wrapperHTML.classList.remove(\"erasing\")\n // this.wrapperHTML.classList.add(\"selecting\")\n // break;\n default:\n this.logger.warn(\"set intention default\", { m })\n document.body.style.cursor = \"initial\"\n this.wrapperHTML.classList.remove(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n }\n this.logger.debug(\"set intention\", this.wrapperHTML)\n }\n\n get events(): PublicEvent\n {\n return PublicEvent.getInstance()\n }\n\n get context(): TUndoRedoContext\n {\n return this.behaviors.context\n }\n\n get grabber(): IGrabber\n {\n return this.behaviors.grabber\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.behaviors.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.behaviors.penStyle\n }\n set penStyle(ps: TPenStyle)\n {\n this.logger.info(\"set penStyle\", { ps })\n this.behaviors.setPenStyle(ps)\n }\n\n get theme(): TTheme\n {\n return this.behaviors.theme\n }\n set theme(t: TTheme)\n {\n this.logger.info(\"set theme\", { t })\n this.behaviors.setTheme(t)\n }\n\n get penStyleClasses(): string\n {\n return this.behaviors.penStyleClasses\n }\n set penStyleClasses(psc: string)\n {\n this.logger.info(\"set penStyleClasses\", { psc })\n this.behaviors.setPenStyleClasses(psc)\n }\n\n #instantiateBehaviors(options: TBehaviorOptions)\n {\n this.logger.info(\"instantiateBehaviors\", { options })\n if (!options?.configuration) {\n throw new Error(\"Configuration required\")\n }\n InternalEvent.getInstance().removeAllListeners()\n if (this.#behaviors) {\n this.#behaviors.destroy()\n }\n let defaultBehaviors: IBehaviors\n if (options.configuration.server?.protocol === \"REST\") {\n defaultBehaviors = new RestBehaviors(options)\n } else {\n defaultBehaviors = new WSBehaviors(options)\n }\n this.#behaviors = Object.assign(defaultBehaviors, options.behaviors)\n this.logger.debug(\"instantiateBehaviors\", this.#behaviors)\n }\n\n async #initializeBehaviors(): Promise\n {\n this.logger.info(\"initializeBehaviors start\")\n this.#initializationDeferred = new DeferredPromise()\n this.#loaderHTML.style.display = \"initial\"\n this.#cleanMessage()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n return this.behaviors.init(this.wrapperHTML)\n .then(async () =>\n {\n this.logger.info(\"initializeBehaviors then\")\n this.wrapperHTML.editor = this\n this.#initializationDeferred.resolve()\n this.events.emitLoaded()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n })\n .catch((error: Error) =>\n {\n this.logger.error(\"initializeBehaviors catch\", { error })\n this.#initializationDeferred.reject(error)\n this.#showError(error)\n })\n .finally(() =>\n {\n this.logger.info(\"initializeBehaviors finally\", { })\n this.#loaderHTML.style.display = \"none\"\n return this.#initializationDeferred.promise\n })\n }\n\n #initializeSmartGuide(): void\n {\n this.#smartGuide?.destroy()\n this.logger.info(\"initializeSmartGuide\", { smartGuide: this.configuration.rendering.smartGuide })\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide = new SmartGuide()\n let margin: TMarginConfiguration\n switch (this.configuration.recognition.type) {\n case \"TEXT\":\n margin = this.configuration.recognition.text.margin\n break\n case \"MATH\":\n margin = this.configuration.recognition.math.margin\n break\n default:\n this.logger.warn(\"initializeSmartGuide default\", this.configuration.recognition.type)\n margin = {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n }\n break\n }\n this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering)\n }\n }\n\n #cleanMessage()\n {\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n this.#messageHTML.style.display = \"none\"\n this.#messageHTML.innerHTML = \"\"\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n }\n\n #showError(err: Error)\n {\n this.logger.debug(\"showError\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"error-msg\")\n this.#messageHTML.classList.remove(\"info-msg\")\n this.#messageHTML.innerText = err.message\n this.logger.debug(\"showError\", this.#messageHTML)\n }\n\n #showNotif(notif: { message: string, timeout?: number })\n {\n this.logger.debug(\"showNotif\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"info-msg\")\n this.#messageHTML.classList.remove(\"error-msg\")\n this.#messageHTML.innerText = notif.message\n setTimeout(() =>\n {\n this.#cleanMessage()\n }, notif.timeout || 2500)\n this.logger.debug(\"showNotif\", this.#messageHTML)\n }\n\n #showStrokesIfDebug(): void\n {\n if (this.showStrokesPan) {\n let panel = document.getElementById(\"stroke-panel\")\n const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers })))\n if (!panel) {\n panel = document.createElement(\"div\")\n panel.id = \"stroke-panel\"\n panel.addEventListener(\"click\", (e) =>\n {\n e.preventDefault()\n e.stopPropagation()\n navigator.clipboard.writeText(panel?.innerText as string)\n this.#showNotif({ message: \"strokes copied to clipboard!\", timeout: 1500 })\n })\n this.wrapperHTML.appendChild(panel)\n }\n panel.innerText = text\n }\n }\n\n #addListeners(): void\n {\n InternalEvent.getInstance().addConvertListener(this.convert.bind(this))\n InternalEvent.getInstance().addClearListener(this.clear.bind(this))\n InternalEvent.getInstance().addErrorListener(this.#showError.bind(this))\n InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this))\n InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this))\n InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this))\n InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this))\n InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this))\n InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this))\n }\n\n #onContextChange = (context: TUndoRedoContext) =>\n {\n this.events.emitChanged(context)\n }\n\n #onIdleChange = (idle: boolean) =>\n {\n this.events.emitIdle(idle)\n }\n\n #onExport(exports: TExport): void\n {\n this.logger.info(\"onExport\", { exports })\n this.model.mergeExport(exports)\n if (this.configuration.rendering.smartGuide.enable) {\n if (exports && exports[\"application/vnd.myscript.jiix\"]) {\n const jjix = exports[\"application/vnd.myscript.jiix\"] as TJIIXExport\n this.#smartGuide?.update(jjix)\n }\n }\n this.#showStrokesIfDebug()\n this.events.emitExported(exports)\n }\n\n #onImportJIIX(jiix: TJIIXExport): void\n {\n this.logger.info(\"onImportJIIX\", { jiix })\n this.import(new Blob([JSON.stringify(jiix)], { type: ExportType.JIIX }), ExportType.JIIX)\n }\n\n async initialize(): Promise\n {\n this.logger.info(\"initialize\")\n await this.#initializeBehaviors()\n this.#initializeSmartGuide()\n this.#addListeners()\n }\n\n async waitForIdle(): Promise\n {\n if (this.behaviors.waitForIdle)\n {\n return this.behaviors.waitForIdle()\n }\n return\n }\n\n async undo(): Promise\n {\n this.logger.debug(\"undo\", this.model)\n this.logger.info(\"undo\", { })\n await this.#initializationDeferred.promise\n await this.behaviors.undo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"undo\", this.model)\n return this.model\n }\n\n async redo(): Promise\n {\n this.logger.debug(\"redo\", this.model)\n this.logger.info(\"redo\")\n await this.#initializationDeferred.promise\n await this.behaviors.redo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"redo\", this.model)\n return this.model\n }\n\n async clear(): Promise\n {\n this.logger.debug(\"clear\", this.model)\n this.logger.info(\"clear\")\n await this.#initializationDeferred.promise\n await this.behaviors.clear()\n this.events.emitCleared(this.model)\n this.#showStrokesIfDebug()\n this.logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async resize(): Promise\n {\n this.logger.debug(\"resize\", this.model)\n this.logger.info(\"resize\")\n await this.#initializationDeferred.promise\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide?.resize()\n }\n const height = Math.max(this.wrapperHTML.clientHeight, this.configuration.rendering.minHeight)\n const width = Math.max(this.wrapperHTML.clientWidth, this.configuration.rendering.minWidth)\n await this.behaviors.resize(height, width)\n this.logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.logger.debug(\"export\", this.model)\n this.logger.info(\"export\", { mimeTypes })\n await this.#initializationDeferred.promise\n await this.behaviors.export(mimeTypes)\n this.logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise\n {\n this.logger.debug(\"convert\", this.model)\n this.logger.info(\"export\", { params })\n await this.#initializationDeferred.promise\n await this.behaviors.convert(params?.conversionState, params?.mimeTypes)\n this.events.emitConverted(this.model.converts as TExport)\n this.logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise\n {\n this.logger.debug(\"import\", this.model)\n this.logger.info(\"import\", { data, mimeType })\n await this.#initializationDeferred.promise\n if (this.behaviors.import) {\n let blobToImport: Blob\n if (data instanceof Blob) {\n blobToImport = data\n }\n else if (typeof data === \"string\") {\n blobToImport = new Blob([data])\n }\n else {\n blobToImport = new Blob([JSON.stringify(data)])\n }\n await this.behaviors.import(blobToImport, mimeType)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"import\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no import function\")\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.logger.debug(\"importPointEvents\", this.model)\n this.logger.info(\"importPointEvents\", { strokes })\n await this.#initializationDeferred.promise\n if (this.behaviors.importPointEvents) {\n await this.behaviors.importPointEvents(strokes)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no importPointEvents function\")\n }\n\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableFontList(configuration: TConfigurationClient): Promise>\n{\n if (!configuration?.server?.scheme && !configuration?.server?.host) {\n return Promise.reject(\"Failed to get fonts: configuration.server.scheme & configuration.server.host are required!\")\n }\n if (!configuration?.recognition?.lang) {\n return Promise.reject(\"Failed to get fonts: configuration.recognition.lang is required!\")\n }\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang)\n const { result } = await response.json()\n return result.sort()\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>\n{\n if (configuration?.server?.scheme && configuration?.server?.host) {\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`)\n return response.json()\n } else {\n return Promise.reject(\"Failed to get languages: configuration.server.scheme & configuration.server.host are required!\")\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","get","__classPrivateFieldSet","set","DefaultServerConfiguration","protocol","scheme","host","applicationKey","hmacKey","version","useWindowLocation","websocket","pingEnabled","pingDelay","maxPingLostCount","autoReconnect","maxRetryCount","fileChunkSize","DefaultRecognitionConfiguration","type","alwaysConnected","lang","gesture","enable","export","jiix","strokes","text","chars","words","renderer","debug","math","mimeTypes","solver","margin","bottom","left","right","top","eraser","mode","guides","diagram","convert","recognition","shape","DefaultGrabberConfiguration","listenerOptions","capture","passive","xyFloatPrecision","timestampFloatPrecision","DefaultRenderingConfiguration","minHeight","minWidth","smartGuide","fadeOut","duration","gap","DefaultTriggerConfiguration","exportContent","exportContentDelay","resizeTriggerDelay","DefaultEventsConfiguration","processDelay","DefaultUndoRedoConfiguration","maxStackSize","DefaultConfiguration","server","grabber","rendering","triggers","events","DefaultLoggerConfiguration","EDITOR","BEHAVIORS","RECOGNIZER","GRABBER","RENDERER","CONFIGURATION","PUBLIC_EVENT","INTERNALEVENT","MODEL","STROKE","SMARTGUIDE","STYLEMANAGER","UNDOREDO_MANAGER","mergeDeep","target","sources","isObject","item","Array","isArray","length","source","shift","key","Object","assign","Logger","constructor","instanceName","level","this","data","dataLog","from","message","console","info","warn","error","LoggerManager","static","name","_a","_LoggerManager_loggerMap","config","keys","forEach","lc","getLogger","Map","Configuration","configuration","_Configuration_logger","JSON","parse","stringify","overrideDefaultConfiguration","defaultConf","_b","_d","_c","_f","_e","_g","window","location","indexOf","Math","max","includes","push","LoggerLevel","LoggerClass","Error","NO_ACTIVITY","WRONG_CREDENTIALS","TOO_OLD","UNKNOW","ABNORMAL_CLOSURE","CANT_ESTABLISH","GOING_AWAY","PROTOCOL_ERROR","UNSUPPORTED_DATA","INVALID_FRAME_PAULOAD","POLICY_VIOLATION","MESSAGE_TOO_BIG","INTERNAL_ERROR","SERVICE_RESTART","TRY_AGAIN","BAD_GATEWAY","TLS_HANDSHAKE","EventType","CHANGED","CLEARED","CONVERTED","ERROR","POINTEREVENTS","EXPORTED","IMPORTED","IDLE","LOADED","InternalEventType","SVG_PATCH","CLEAR_MESSAGE","NOTIF","IMPORT_JIIX","CONVERT","CLEAR","CONTEXT_CHANGE","WS_CLOSED","ExportType","Intention","PublicEvent","EventTarget","super","_PublicEvent_element","_PublicEvent_logger","_PublicEvent_instance","setElement","el","emitLoaded","emitExported","exports","_PublicEvent_instances","_PublicEvent_emit","emitChanged","undoRedoContext","canClear","empty","emitIdle","idle","emitCleared","model","emitConverted","emitImported","WeakMap","WeakSet","evt","CustomEvent","bubbles","composed","detail","undefined","dispatchEvent","InternalEvent","_InternalEvent_abortController","_InternalEvent_logger","AbortController","_InternalEvent_instance","removeAllListeners","abort","emitSVGPatch","patchChange","_InternalEvent_instances","_InternalEvent_emit","addSVGPatchListener","callback","addEventListener","signal","addExportedListener","emitClearMessage","addClearMessageListener","emitError","err","addErrorListener","emitWSClosed","addWSClosedListener","emitNotif","notif","addNotifListener","emitImportJIIX","addImportJIIXListener","emitConvert","conversionState","addConvertListener","emitClear","addClearListener","emitContextChange","context","addContextChangeListener","addIdleListener","SmartGuide","_SmartGuide_smartGuideElement","_SmartGuide_prompterContainerElement","_SmartGuide_prompterTextElement","_SmartGuide_ellipsisElement","_SmartGuide_tagElement","_SmartGuide_candidatesElement","_SmartGuide_menuElement","_SmartGuide_convertElement","_SmartGuide_copyElement","_SmartGuide_deleteElement","_SmartGuide_fadeOutTimout","_SmartGuide_isMenuOpen","_SmartGuide_logger","_SmartGuide_showCandidates","wordId","parseInt","id","replace","uuid","wordToChange","toString","innerHTML","candidates","style","display","word","index","label","getBoundingClientRect","parent","parentNode","insertBefore","_SmartGuide_onClickEllipsis","preventDefault","stopPropagation","_SmartGuide_instances","_SmartGuide_hideCandidates","_SmartGuide_onClickConvert","internalEvent","_SmartGuide_closeMenu","_SmartGuide_onClickCopy","innerText","test","navigator","userAgent","permissionName","permissions","query","clipboard","writeText","timeout","_SmartGuide_onClickDelete","_SmartGuide_onClickCandidate","candidate","_SmartGuide_onClickPrompter","_SmartGuide_onClickOutSide","random","substring","_SmartGuide_createWrapperElement","_SmartGuide_createPrompterContainerElement","_SmartGuide_createPrompterTextElement","_SmartGuide_createEllipsisElement","_SmartGuide_createTagElement","_SmartGuide_createCandidatesElement","_SmartGuide_createMoreMenuElement","_SmartGuide_createConvertElement","_SmartGuide_createCopyElement","_SmartGuide_createDeleteElement","getInstance","init","domElement","renderingConfiguration","appendChild","classList","add","_SmartGuide_addListeners","_SmartGuide_show","_SmartGuide_initFadeOutObserver","resize","mmToPixels","marginTop","marginLeft","marginRight","offsetWidth","width","clientWidth","offsetHeight","update","createWordSpan","span","document","createElement","textContent","myFragment","createDocumentFragment","lastWord","scrollLeft","offsetLeft","populatePrompter","clear","_SmartGuide_hide","destroy","_SmartGuide_removeListeners","remove","setAttribute","MutationObserver","clearTimeout","contains","setTimeout","observe","childList","subtree","attributes","_SmartGuide_openMenu","bind","removeEventListener","DeferredPromise","isFullFilled","isPending","promise","v","PointerEventGrabber","prevent","_PointerEventGrabber_logger","pointerDownHandler","button","buttons","activePointerId","pointerId","onPointerDown","point","extractPoint","pointerMoveHandler","onPointerMove","pointerUpHandler","onPointerUp","roundFloat","oneFloat","requestedFloatPrecision","floatPrecision","pow","round","event","clientX","clientY","changedTouches","rect","pointer","x","clientLeft","y","clientTop","t","Date","now","p","pressure","attach","detach","documentElement","ShapeSymbols","table","recognizedShape","ellipse","line","phi","angle","returnedAngle","PI","drawArrowHead","context2D","headPoint","alpha","beta","save","fillStyle","strokeStyle","moveTo","beginPath","lineTo","cos","sin","fill","restore","drawShapeEllipse","shapeEllipse","points","drawEllipseArc","centerPoint","maxRadius","minRadius","orientation","startAngle","sweepAngle","z1","z3","z2","z4","n","floor","abs","boundariesPoints","i","atan2","cosAlpha","sinAlpha","stroke","beginDecoration","beginTangentAngle","endDecoration","endTangentAngle","drawLine","p1","p2","drawShapeSymbol","symbol","lineWidth","color","elementType","shapeSymbol","selectedCandidateIndex","lines","lineSymbol","drawShapeLine","shapeLine","firstPoint","lastPoint","primitives","primitive","drawStroke","stroker","pointerType","TextSymbols","inputCharacter","char","string","textLine","drawTextLine","drawText","font","textHeight","textAlign","justificationType","textBaseline","fillText","topLeftPoint","height","underlineList","underline","drawUnderline","delta","firstCharacter","lastCharacter","drawTextSymbol","computeLinksPoints","radius","computeMiddlePoint","point1","point2","computeAxeAngle","begin","end","CanvasStroker","renderArc","context2d","center","arc","renderLine","linkPoints1","linkPoints2","renderFinal","linkPoints","newAngle","renderQuadratic","ctrl","linkPoints3","quadraticCurveTo","NUMBER_POINTS","pointers","NUMBER_QUADRATICS","secondPoint","beginLine","endLine","beginFinal","endFinal","closePath","CanvasRenderer","_CanvasRenderer_logger","createCanvas","canvas","resizeContent","pixelRatio","devicePixelRatio","renderingCanvas","capturingCanvas","clientHeight","getContext","scale","drawSymbol","element","renderingCanvasContext","capturingCanvasContext","drawModel","clearRect","rawStrokes","drawPendingStroke","module","o","r","l","m","c","d","defineProperty","configurable","enumerable","__esModule","default","prototype","hasOwnProperty","s","Symbol","iterator","toJSON","u","split","trim","_trimSemiColon","toCSS","slice","parser","JsonCSS","StyleHelper","themeToCSS","json","themeToJSON","theme","Number","ink","penStyleToCSS","penStyle","css","penStyleToJSON","penStyleString","stringToJSON","JSONToString","entries","map","k","join","CryptoJS","create","F","obj","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","$super","arguments","instance","properties","propertyName","clone","WordArray","sigBytes","encoder","Hex","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","_r","C_enc","enc","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","C_algo","HMAC","algo","require$$0","X32WordArray","C_x64","x64","Word","high","low","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","X64Word","X64WordArray","X64Word_create","K","W","SHA512","_hash","M","H","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","al","bh","bl","ch","cl","dh","dl","eh","fh","fl","gh","gl","hh","hl","Wi","Wih","Wil","gamma0x","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1x","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","t1l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1h","t2l","nBitsTotal","nBitsLeft","HmacSHA512","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","computeHmac","isVersionSuperiorOrEqual","sourceParts","targetParts","a","b","Stroke","_Stroke_logger","convertStrokeToJSON","RestRecognizer","serverConfig","recognitionConfig","_RestRecognizer_logger","serverConfiguration","recognitionConfiguration","url","postConfig","buildData","strokeGroupByPenStyle","groupIndex","findIndex","sg","isPenStyleEqual","ps1","ps2","strokeGroupsToSend","group","newGroup","contentType","charAt","toUpperCase","toLowerCase","xDPI","yDPI","strokeGroups","post","mimeType","headers","Headers","append","reqInit","method","body","request","Request","response","fetch","ok","blob","catch","tryFetch","res","ErrorConst","code","getMimeTypes","requestedMimeTypes","myModel","getClone","dataToConcert","promises","mt","all","mergeConvert","mimeTypesRequiringExport","filter","mergeExport","UndoRedoContext","stackIndex","possibleUndoCount","canRedo","canUndo","stack","UndoRedoManager","_UndoRedoManager_logger","updateCanUndoRedo","currentModel","addModelToStack","removeLastModelInStack","pop","updateModelInStack","modificationDate","undo","previousModel","redo","nextModel","DefaultPenStyle","DefaultTheme","StyleManager","_StyleManager_penStyle","_StyleManager_theme","_StyleManager_penStyleClasses","_StyleManager_currentPenStyle","_StyleManager_logger","setTheme","setPenStyleClasses","setPenStyle","currentPenStyle","structuredClone","penStyleClasses","penStyleClass","computeDistance","distance","hypot","isNaN","Model","creationDate","_Model_logger","creationTime","selectedStrokes","positions","lastSentPosition","lastReceivedPosition","converts","computePressure","globalDistance","ratio","sqrt","filterPointByAcquisitionDelta","lastPointer","addPoint","at","addStroke","extractUnsentStrokes","initCurrentStroke","dpi","pxWidth","currentStroke","appendToCurrentStroke","endCurrentStroke","resetSelectedStrokes","appendSelectedStrokesFromPoint","_Model_instances","_Model_getStrokeFromPoint","updateStroke","updatedStroke","strokeIndex","removeStroke","removeStrokesFromPoint","strokeToRemove","updatePositionSent","position","updatePositionReceived","clonedModel","isBetween","val","_strokeList","strokePointer","RestBehaviors","options","_RestBehaviors_configuration","_RestBehaviors_model","_RestBehaviors_logger","_RestBehaviors_resizeTimer","_RestBehaviors_exportTimer","styleManager","recognizer","intention","undoRedoManager","penClass","updateModelRendering","drawCurrentStroke","_evt","newModel","deferred","deferredResize","resizeModel","WSRecognizer","_WSRecognizer_logger","pingCount","reconnectionCount","toLocaleLowerCase","infinitePing","socket","close","readyState","send","openCallback","connected","params","sessionId","iinkSessionId","xDpi","yDpi","viewSizeHeight","viewSizeWidth","rejectDeferredPending","initialized","addStrokeDeferred","exportDeferred","_h","convertDeferred","_j","_k","importDeferred","_l","_m","resizeDeferred","_o","_p","undoDeferred","_q","redoDeferred","_s","_t","clearDeferred","_u","waitForIdleDeferred","_v","closeCallback","currentErrorCode","reason","manageHMACChallengeMessage","websocketMessage","hmacChallengeMessage","hmacChallenge","hmac","manageContentPackageDescriptionMessage","currentPartId","managePartChangeMessage","partChangeMessage","partId","manageExportMessage","exportMessage","importPointEventsDeferred","manageWaitForIdle","manageErrorMessage","manageContentChangeMessage","contentChangeMessage","undoStackIndex","manageSVGPatchMessage","svgPatchMessage","messageCallback","WebSocket","OPEN","CONNECTING","addStrokes","styleClasses","localModel","import","chunkSize","importFileId","readBlob","fileReader","FileReader","onloadend","ev","onerror","readAsText","importFileMessage","size","blobPart","fileChuckMessage","lastChunk","importPointEvents","exportPoints","myExportConverted","waitForIdle","undoExports","redoExports","clearExports","SVGStroker","getArcPath","getLinePath","getFinalPath","parts","getQuadraticPath","central","buildSVGPath","STROKE_LENGTH","STROKE_WIDTH","NB_QUADRATICS","beforeLastPoint","svgElement","attrs","svgPathElement","createElementNS","svgPath","WSSVGRenderer","_WSSVGRenderer_logger","fontSize","updateLayer","layerName","_WSSVGRenderer_instances","_WSSVGRenderer_replaceElement","_WSSVGRenderer_removeElement","_WSSVGRenderer_removeChild","_WSSVGRenderer_insertBefore","_WSSVGRenderer_setAttribute","_WSSVGRenderer_removeAttribute","updatesLayer","updates","clearPendingStroke","pendingStrokeGroup","querySelector","oldStroke","clearErasingStrokes","querySelectorAll","erasingStroke","svgList","svg","_WSSVGRenderer_drawStroke","_WSSVGRenderer_replaceAll","oldLayer","insertAdjacentHTML","layer","pendingStrokesGroup","elementToRemove","_WSSVGRenderer_appendChild","parentSelector","parentId","refId","selector","removeAttribute","WSBehaviors","_WSBehaviors_configuration","_WSBehaviors_model","_WSBehaviors_logger","_WSBehaviors_resizeTimer","onSVGPatch","unsentStrokes","styleInject","ref","insertAt","head","getElementsByTagName","firstChild","styleSheet","cssText","createTextNode","Editor","wrapperHTML","globalClassCss","_Editor_loaderHTML","_Editor_messageHTML","_Editor_behaviors","_Editor_smartGuide","_Editor_initializationDeferred","_Editor_loggerConfiguration","showStrokesPan","_Editor_onContextChange","_Editor_onIdleChange","logger","_Editor_instances","_Editor_instantiateBehaviors","loggerConfiguration","loggerConfig","setLoggerLevel","initializationPromise","behaviors","initialize","cursor","ps","psc","_Editor_initializeBehaviors","_Editor_initializeSmartGuide","_Editor_addListeners","_Editor_showStrokesIfDebug","blobToImport","Blob","defaultBehaviors","_Editor_cleanMessage","editor","_Editor_showError","finally","panel","getElementById","_Editor_showNotif","_Editor_onImportJIIX","_Editor_onExport","jjix","getAvailableFontList","sort","getAvailableLanguageList"],"mappings":"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"} \ No newline at end of file diff --git a/dist/iink.min.js b/dist/iink.min.js new file mode 100644 index 000000000..cee53342b --- /dev/null +++ b/dist/iink.min.js @@ -0,0 +1,2 @@ +!function(i,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((i="undefined"!=typeof globalThis?globalThis:i||self).iink={})}(this,(function(i){"use strict";function __awaiter(i,s,n,a){return new(n||(n=Promise))((function(l,d){function fulfilled(i){try{step(a.next(i))}catch(i){d(i)}}function rejected(i){try{step(a.throw(i))}catch(i){d(i)}}function step(i){i.done?l(i.value):function adopt(i){return i instanceof n?i:new n((function(s){s(i)}))}(i.value).then(fulfilled,rejected)}step((a=a.apply(i,s||[])).next())}))}function __classPrivateFieldGet(i,s,n,a){if("a"===n&&!a)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof s?i!==s||!a:!s.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?a:"a"===n?a.call(i):a?a.value:s.get(i)}function __classPrivateFieldSet(i,s,n,a,l){if("m"===a)throw new TypeError("Private method is not writable");if("a"===a&&!l)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof s?i!==s||!l:!s.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===a?l.call(i,n):l?l.value=n:s.set(i,n),n}const s={protocol:"WEBSOCKET",scheme:"https",host:"cloud.myscript.com",applicationKey:"",hmacKey:"",version:"2.1.0",useWindowLocation:!1,websocket:{pingEnabled:!0,pingDelay:3e4,maxPingLostCount:10,autoReconnect:!0,maxRetryCount:2,fileChunkSize:3e5}},n={type:"TEXT",alwaysConnected:!0,lang:"en_US",gesture:{enable:!0},export:{"image-resolution":300,jiix:{"bounding-box":!1,strokes:!1,text:{chars:!1,words:!0}}},renderer:{debug:{"draw-text-boxes":!1,"draw-image-boxes":!1}},math:{mimeTypes:["application/vnd.myscript.jiix"],solver:{enable:!0,"fractional-part-digits":3,"decimal-separator":".","rounding-mode":"half up","angle-unit":"deg"},margin:{bottom:10,left:15,right:15,top:10},eraser:{"erase-precisely":!1},"undo-redo":{mode:"stroke"}},text:{guides:{enable:!0},mimeTypes:["application/vnd.myscript.jiix"],margin:{top:20,left:10,right:10,bottom:10},eraser:{"erase-precisely":!1}},diagram:{mimeTypes:["application/vnd.myscript.jiix"],eraser:{"erase-precisely":!1},convert:{"match-text-size":!0}},"raw-content":{recognition:{text:!0,shape:!0},eraser:{"erase-precisely":!1}}},a={listenerOptions:{capture:!1,passive:!0},xyFloatPrecision:0,timestampFloatPrecision:0},l={minHeight:100,minWidth:100,smartGuide:{enable:!0,fadeOut:{enable:!1,duration:5e3}},guides:{enable:!0,gap:50}},d={exportContent:"POINTER_UP",exportContentDelay:1e3,resizeTriggerDelay:100},c={processDelay:10},h={maxStackSize:100},v={server:s,recognition:n,grabber:a,rendering:l,triggers:d,events:c,"undo-redo":h},u={EDITOR:"4",BEHAVIORS:"4",RECOGNIZER:"4",GRABBER:"4",RENDERER:"4",CONFIGURATION:"4",PUBLIC_EVENT:"4",INTERNALEVENT:"4",MODEL:"4",STROKE:"4",SMARTGUIDE:"4",STYLEMANAGER:"4",UNDOREDO_MANAGER:"4"},mergeDeep=(i,...s)=>{const isObject=i=>i&&"object"==typeof i&&!Array.isArray(i);if(!s.length)return i;const n=s.shift();if(isObject(i)&&isObject(n))for(const s in n)isObject(n[s])?(i[s]||Object.assign(i,{[s]:{}}),mergeDeep(i[s],n[s])):Object.assign(i,{[s]:n[s]});return mergeDeep(i,...s)};class Logger{constructor(i,s){this.instanceName=i,this.level=s}debug(...i){if("1">=this.level){const s={from:this.instanceName,message:i};console.debug(s)}}info(...i){if("2">=this.level){const s={from:this.instanceName,message:i};console.info(s)}}warn(...i){if("3">=this.level){const s={from:this.instanceName,message:i};console.warn(s)}}error(...i){const s={from:this.instanceName,error:i};console.error(s)}}var p,_;class LoggerManager{static getLogger(i){return __classPrivateFieldGet(this,p,"f",_).has(i)||__classPrivateFieldGet(this,p,"f",_).set(i,new Logger(i,"4")),__classPrivateFieldGet(this,p,"f",_).get(i)}static setLoggerLevel(i){Object.keys(i).forEach((s=>{LoggerManager.getLogger(s).level=i[s]}))}}p=LoggerManager,_={value:new Map};var g,f=Object.freeze({__proto__:null,LoggerManager:LoggerManager,Logger:Logger});class Configuration{constructor(i){g.set(this,LoggerManager.getLogger("CONFIGURATION")),__classPrivateFieldGet(this,g,"f").info("constructor",{configuration:i}),this.events=JSON.parse(JSON.stringify(v.events)),this.grabber=JSON.parse(JSON.stringify(v.grabber)),this.recognition=JSON.parse(JSON.stringify(v.recognition)),this.rendering=JSON.parse(JSON.stringify(v.rendering)),this.server=JSON.parse(JSON.stringify(v.server)),this.triggers=JSON.parse(JSON.stringify(v.triggers)),this.overrideDefaultConfiguration(i)}overrideDefaultConfiguration(i){var s,n,a,l,d,c,h;__classPrivateFieldGet(this,g,"f").info("overrideDefaultConfiguration",{configuration:i});const u=JSON.parse(JSON.stringify(v));this.events=mergeDeep({},u.events,null==i?void 0:i.events),this.grabber=mergeDeep({},u.grabber,null==i?void 0:i.grabber),this.recognition=mergeDeep({},u.recognition,null==i?void 0:i.recognition),this.rendering=mergeDeep({},u.rendering,null==i?void 0:i.rendering),this.server=mergeDeep({},u.server,null==i?void 0:i.server),this.triggers=mergeDeep({},u.triggers,null==i?void 0:i.triggers),this["undo-redo"]=mergeDeep({},u["undo-redo"],null==i?void 0:i["undo-redo"]),this.recognition.text.mimeTypes=(null===(n=null===(s=null==i?void 0:i.recognition)||void 0===s?void 0:s.text)||void 0===n?void 0:n.mimeTypes)||u.recognition.text.mimeTypes,this.recognition.math.mimeTypes=(null===(l=null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.math)||void 0===l?void 0:l.mimeTypes)||u.recognition.math.mimeTypes,this.recognition.diagram.mimeTypes=(null===(c=null===(d=null==i?void 0:i.recognition)||void 0===d?void 0:d.diagram)||void 0===c?void 0:c.mimeTypes)||u.recognition.diagram.mimeTypes,(null===(h=this.server)||void 0===h?void 0:h.useWindowLocation)&&(this.server.scheme=window.location.protocol.indexOf("s")>-1?"https":"http",this.server.host=window.location.host),"REST"===this.server.protocol&&"POINTER_UP"===this.triggers.exportContent&&(this.triggers.exportContent="QUIET_PERIOD",this.triggers.exportContentDelay=Math.max(this.triggers.exportContentDelay,50)),"WEBSOCKET"===this.server.protocol&&"TEXT"===this.recognition.type?this.rendering.smartGuide.enable&&!this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix")&&this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix"):this.rendering.smartGuide.enable=!1,__classPrivateFieldGet(this,g,"f").debug("overrideDefaultConfiguration",{configuration:this})}}g=new WeakMap;var m,P,y=Object.freeze({__proto__:null,Configuration:Configuration,DefaultServerConfiguration:s,DefaultRecognitionConfiguration:n,DefaultGrabberConfiguration:a,DefaultRenderingConfiguration:l,DefaultTriggerConfiguration:d,DefaultEventsConfiguration:c,DefaultUndoRedoConfiguration:h,DefaultConfiguration:v,DefaultLoggerConfiguration:u});!function(i){i.DEBUG="1",i.INFO="2",i.WARN="3",i.ERROR="4"}(m||(m={})),function(i){i.EDITOR="EDITOR",i.RECOGNIZER="RECOGNIZER",i.GRABBER="GRABBER",i.BEHAVIORS="BEHAVIORS",i.CONFIGURATION="CONFIGURATION",i.PUBLIC_EVENT="PUBLIC_EVENT",i.MODEL="MODEL",i.RENDERER="RENDERER",i.SMARTGUIDE="SMARTGUIDE",i.STYLEMANAGER="STYLEMANAGER",i.UNDOREDO_MANAGER="UNDOREDO_MANAGER",i.STROKE="STROKE",i.INTERNALEVENT="INTERNALEVENT"}(P||(P={}));const S={NO_ACTIVITY:"Session closed due to no activity.",WRONG_CREDENTIALS:"Application credentials are invalid. Please check or regenerate your application key and hmackey.",TOO_OLD:"Session is too old. Max Session Duration Reached.",UNKNOW:"An unknown error has occurred.",ABNORMAL_CLOSURE:"MyScript recognition server is not reachable.",CANT_ESTABLISH:"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.",GOING_AWAY:"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.",PROTOCOL_ERROR:"MyScript recognition server terminated the connection due to a protocol error.",UNSUPPORTED_DATA:"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)",INVALID_FRAME_PAULOAD:"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).",POLICY_VIOLATION:"MyScript recognition server terminated the connection because it received a message that violates its policy.",MESSAGE_TOO_BIG:"MyScript recognition server terminated the connection because a data frame was received that is too large.",INTERNAL_ERROR:"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.",SERVICE_RESTART:"MyScript recognition server terminated the connection because it is restarting.",TRY_AGAIN:"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.",BAD_GATEWAY:"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.",TLS_HANDSHAKE:"MyScript recognition server connection was closed due to a failure to perform a TLS handshake"},w={CHANGED:"changed",CLEARED:"cleared",CONVERTED:"converted",ERROR:"error",POINTEREVENTS:"pointer_events",EXPORTED:"exported",IMPORTED:"imported",IDLE:"idle",LOADED:"loaded"},G={SVG_PATCH:"internal_svg_patch",EXPORTED:"internal_exported",CLEAR_MESSAGE:"internal_clear_message",ERROR:"internal_error",NOTIF:"internal_notif",IMPORT_JIIX:"internal_import_jiix",CONVERT:"internal_convert",CLEAR:"internal_clear",CONTEXT_CHANGE:"internal_context_change",IDLE:"internal_idle",WS_CLOSED:"internal_websocket_closed"};var b,x;!function(i){i.JIIX="application/vnd.myscript.jiix",i.TEXT="text/plain",i.LATEX="application/x-latex",i.MATHML="application/mathml+xml",i.SVG="image/svg+xml",i.OFFICE_DOCUMENT="application/vnd.openxmlformats-officedocument.presentationml.presentation"}(b||(b={})),function(i){i.Write="write",i.Erase="erase"}(x||(x={}));var E,C,k,M,T,L,I,D,A,R,N,O,W,z,j,H,B,X,U,$,V,J,q,Y,Z,K,Q,ee,te,ie,se,ne,re,oe,ae,le,de,ce,he,ve,ue,pe,_e,ge,fe,me,Pe,ye,Se,we,Fe,Ge,be=Object.freeze({__proto__:null,Error:S,EventType:w,InternalEventType:G,get ExportType(){return b},get Intention(){return x},get LoggerClass(){return P},get LoggerLevel(){return m}});class PublicEvent extends EventTarget{constructor(){super(),E.add(this),M.set(this,void 0),T.set(this,LoggerManager.getLogger("PUBLIC_EVENT"))}static getInstance(){return __classPrivateFieldGet(PublicEvent,C,"f",k)||__classPrivateFieldSet(PublicEvent,C,new PublicEvent,"f",k),__classPrivateFieldGet(PublicEvent,C,"f",k)}setElement(i){__classPrivateFieldGet(this,T,"f").info("setElement",{el:i}),__classPrivateFieldSet(this,M,i,"f")}emitLoaded(){__classPrivateFieldGet(this,T,"f").info("emitLoaded"),__classPrivateFieldGet(this,E,"m",L).call(this,w.LOADED)}emitExported(i){__classPrivateFieldGet(this,T,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.EXPORTED,i)}emitChanged(i){__classPrivateFieldGet(this,T,"f").info("emitChanged",{undoRedoContext:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.CHANGED,Object.assign(Object.assign({},i),{canClear:!i.empty}))}emitIdle(i){__classPrivateFieldGet(this,T,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.IDLE,i)}emitCleared(i){__classPrivateFieldGet(this,T,"f").info("emitCleared",{model:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.CLEARED,i)}emitConverted(i){__classPrivateFieldGet(this,T,"f").info("emitConverted",{exports:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.CONVERTED,i)}emitImported(i){__classPrivateFieldGet(this,T,"f").info("emitImported",{exports:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.IMPORTED,i)}}C=PublicEvent,M=new WeakMap,T=new WeakMap,E=new WeakSet,L=function _PublicEvent_emit(i,s){var n;const a=new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0));this.dispatchEvent(a),null===(n=__classPrivateFieldGet(this,M,"f"))||void 0===n||n.dispatchEvent(a)},k={value:void 0};class InternalEvent extends EventTarget{constructor(){super(),I.add(this),R.set(this,void 0),N.set(this,LoggerManager.getLogger("INTERNALEVENT")),__classPrivateFieldGet(this,N,"f").info("constructor"),__classPrivateFieldSet(this,R,new AbortController,"f")}static getInstance(){return __classPrivateFieldGet(InternalEvent,D,"f",A)||__classPrivateFieldSet(InternalEvent,D,new InternalEvent,"f",A),__classPrivateFieldGet(InternalEvent,D,"f",A)}removeAllListeners(){__classPrivateFieldGet(this,N,"f").info("removeAllListeners"),__classPrivateFieldGet(this,R,"f").abort(),__classPrivateFieldSet(this,R,new AbortController,"f")}emitSVGPatch(i){__classPrivateFieldGet(this,N,"f").info("emitSVGPatch",{patchChange:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.SVG_PATCH,i)}addSVGPatchListener(i){__classPrivateFieldGet(this,N,"f").info("addSVGPatchListener",{callback:i}),this.addEventListener(G.SVG_PATCH,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitExported(i){__classPrivateFieldGet(this,N,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.EXPORTED,i)}addExportedListener(i){__classPrivateFieldGet(this,N,"f").info("addExportedListener",{callback:i}),this.addEventListener(G.EXPORTED,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitClearMessage(){__classPrivateFieldGet(this,N,"f").info("emitClearMessage",{}),__classPrivateFieldGet(this,I,"m",O).call(this,G.CLEAR_MESSAGE)}addClearMessageListener(i){__classPrivateFieldGet(this,N,"f").info("addClearMessageListener",{callback:i}),this.addEventListener(G.CLEAR_MESSAGE,(()=>i()),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitError(i){__classPrivateFieldGet(this,N,"f").info("emitError",{err:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.ERROR,i)}addErrorListener(i){__classPrivateFieldGet(this,N,"f").info("addErrorListener",{callback:i}),this.addEventListener(G.ERROR,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitWSClosed(){__classPrivateFieldGet(this,N,"f").info("emitWSClosed",{}),__classPrivateFieldGet(this,I,"m",O).call(this,G.WS_CLOSED)}addWSClosedListener(i){__classPrivateFieldGet(this,N,"f").info("addWSClosedListener",{callback:i}),this.addEventListener(G.WS_CLOSED,(()=>i()),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitNotif(i){__classPrivateFieldGet(this,N,"f").info("emitWNotif",{notif:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.NOTIF,i)}addNotifListener(i){__classPrivateFieldGet(this,N,"f").info("addNotifListener",{callback:i}),this.addEventListener(G.NOTIF,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitImportJIIX(i){__classPrivateFieldGet(this,N,"f").info("emitImportJIIX",{jiix:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.IMPORT_JIIX,i)}addImportJIIXListener(i){__classPrivateFieldGet(this,N,"f").info("addImportJIIXListener",{callback:i}),this.addEventListener(G.IMPORT_JIIX,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitConvert(i="DIGITAL_EDIT"){__classPrivateFieldGet(this,N,"f").info("emitConvert",{conversionState:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.CONVERT,i)}addConvertListener(i){__classPrivateFieldGet(this,N,"f").info("addConvertListener",{callback:i}),this.addEventListener(G.CONVERT,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitClear(){__classPrivateFieldGet(this,N,"f").info("emitClear"),__classPrivateFieldGet(this,I,"m",O).call(this,G.CLEAR)}addClearListener(i){__classPrivateFieldGet(this,N,"f").info("addClearListener",{callback:i}),this.addEventListener(G.CLEAR,(()=>i()),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitContextChange(i){__classPrivateFieldGet(this,N,"f").info("emitContextChange",{context:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.CONTEXT_CHANGE,i)}addContextChangeListener(i){__classPrivateFieldGet(this,N,"f").info("addContextChangeListener",{callback:i}),this.addEventListener(G.CONTEXT_CHANGE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitIdle(i){__classPrivateFieldGet(this,N,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.IDLE,i)}addIdleListener(i){__classPrivateFieldGet(this,N,"f").info("addIdleListener",{callback:i}),this.addEventListener(G.IDLE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}}D=InternalEvent,R=new WeakMap,N=new WeakMap,I=new WeakSet,O=function _InternalEvent_emit(i,s){this.dispatchEvent(new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0)))},A={value:void 0};class SmartGuide{constructor(){W.add(this),z.set(this,void 0),j.set(this,void 0),H.set(this,void 0),B.set(this,void 0),X.set(this,void 0),U.set(this,void 0),$.set(this,void 0),V.set(this,void 0),J.set(this,void 0),q.set(this,void 0),Y.set(this,void 0),Z.set(this,void 0),K.set(this,LoggerManager.getLogger("SMARTGUIDE")),ve.set(this,(i=>{var s,n,a,l,d;__classPrivateFieldGet(this,K,"f").info("showCandidates",{target:i});const c=parseInt(i.id.replace("word-","").replace(this.uuid,"")),h=null===(s=this.jiix)||void 0===s?void 0:s.words;if(this.wordToChange=h[c],this.wordToChange&&(this.wordToChange.id=c.toString(),__classPrivateFieldGet(this,U,"f").innerHTML="",null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)){__classPrivateFieldGet(this,U,"f").style.display="flex",this.wordToChange.candidates.forEach(((i,s)=>{var n;(null===(n=this.wordToChange)||void 0===n?void 0:n.label)===i?__classPrivateFieldGet(this,U,"f").innerHTML+=`${i}`:__classPrivateFieldGet(this,U,"f").innerHTML+=`${i}`}));const s=48,n=i.getBoundingClientRect().left-60;__classPrivateFieldGet(this,U,"f").style.top=`${s}px`,__classPrivateFieldGet(this,U,"f").style.left=`${n}px`;const c=null===(l=null===(a=i.parentNode)||void 0===a?void 0:a.parentNode)||void 0===l?void 0:l.parentNode;c&&c.insertBefore(__classPrivateFieldGet(this,U,"f"),null===(d=i.parentNode)||void 0===d?void 0:d.parentNode)}})),ge.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickEllipsis",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,Z,"f")?__classPrivateFieldGet(this,W,"m",_e).call(this):__classPrivateFieldGet(this,W,"m",pe).call(this),__classPrivateFieldGet(this,W,"m",ue).call(this)})),fe.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickConvert",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitConvert(),__classPrivateFieldGet(this,W,"m",_e).call(this)})),me.set(this,(i=>__awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,K,"f").info("onClickCopy",{evt:i}),i.preventDefault(),i.stopPropagation();try{__classPrivateFieldGet(this,W,"m",_e).call(this);let i="Nothing to copy";if(__classPrivateFieldGet(this,H,"f").innerText)if(i=`"${__classPrivateFieldGet(this,H,"f").innerText}" copied to clipboard`,/iPad|iPhone|iPod/.test(navigator.userAgent)){const i="clipboard-write";"granted"===(yield navigator.permissions.query({name:i})).state&&(yield navigator.clipboard.writeText(__classPrivateFieldGet(this,H,"f").innerText))}else yield navigator.clipboard.writeText(__classPrivateFieldGet(this,H,"f").innerText);this.internalEvent.emitNotif({message:i,timeout:1500})}catch(i){__classPrivateFieldGet(this,K,"f").error("onClickCopy",{err:i}),this.internalEvent.emitError(i)}})))),Pe.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickDelete",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitClear(),__classPrivateFieldGet(this,W,"m",_e).call(this)})),ye.set(this,(i=>{var s,n,a,l;__classPrivateFieldGet(this,K,"f").info("onClickCandidate",{evt:i}),i.preventDefault(),i.stopPropagation();const d=i.target.innerText;this.jiix&&d!==(null===(s=this.wordToChange)||void 0===s?void 0:s.label)&&(null===(a=null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)||void 0===a?void 0:a.includes(d))&&(this.jiix.words[parseInt(null===(l=this.wordToChange)||void 0===l?void 0:l.id)].label=d,this.internalEvent.emitImportJIIX(this.jiix)),__classPrivateFieldGet(this,U,"f").style.display="none"})),Se.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickPrompter",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,W,"m",_e).call(this);const s=i.target;s.id!==__classPrivateFieldGet(this,H,"f").id?__classPrivateFieldGet(this,ve,"f").call(this,s):__classPrivateFieldGet(this,W,"m",ue).call(this)})),we.set(this,(()=>{__classPrivateFieldGet(this,W,"m",ue).call(this),__classPrivateFieldGet(this,W,"m",_e).call(this)})),__classPrivateFieldGet(this,K,"f").info("constructor",{}),this.uuid=Math.random().toString(10).substring(2,12),this.margin={bottom:0,left:0,right:0,top:0},__classPrivateFieldGet(this,W,"m",Q).call(this),__classPrivateFieldGet(this,W,"m",ee).call(this),__classPrivateFieldGet(this,W,"m",te).call(this),__classPrivateFieldGet(this,W,"m",ie).call(this),__classPrivateFieldGet(this,W,"m",se).call(this),__classPrivateFieldGet(this,W,"m",ne).call(this),__classPrivateFieldGet(this,W,"m",re).call(this),__classPrivateFieldGet(this,W,"m",oe).call(this),__classPrivateFieldGet(this,W,"m",ae).call(this),__classPrivateFieldGet(this,W,"m",le).call(this)}get internalEvent(){return InternalEvent.getInstance()}init(i,s,n){__classPrivateFieldGet(this,K,"f").info("init",{domElement:i,margin:s,renderingConfiguration:n}),i.appendChild(__classPrivateFieldGet(this,z,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,X,"f")),__classPrivateFieldGet(this,j,"f").appendChild(__classPrivateFieldGet(this,H,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,j,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,B,"f")),__classPrivateFieldGet(this,$,"f").appendChild(__classPrivateFieldGet(this,V,"f")),__classPrivateFieldGet(this,$,"f").appendChild(__classPrivateFieldGet(this,J,"f")),__classPrivateFieldGet(this,$,"f").appendChild(__classPrivateFieldGet(this,q,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,$,"f")),__classPrivateFieldGet(this,$,"f").classList.add("close"),__classPrivateFieldSet(this,Z,!1,"f"),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,U,"f")),__classPrivateFieldGet(this,U,"f").style.display="none",this.margin=s,this.renderingConfiguration=n,__classPrivateFieldGet(this,W,"m",Fe).call(this),__classPrivateFieldGet(this,W,"m",ce).call(this),this.renderingConfiguration.smartGuide.fadeOut.enable&&__classPrivateFieldGet(this,W,"m",de).call(this,this.renderingConfiguration.smartGuide.fadeOut.duration),this.resize()}resize(){__classPrivateFieldGet(this,K,"f").info("resize");const i=3.779527559,s=this.margin.top*i,n=this.margin.left*i,a=this.margin.right*i,l=s-45.354330708;__classPrivateFieldGet(this,z,"f").style.top=`${l}px`,__classPrivateFieldGet(this,z,"f").style.left=`${n}px`,__classPrivateFieldGet(this,z,"f").style.right=`${a}px`;let d=__classPrivateFieldGet(this,X,"f").offsetWidth;__classPrivateFieldGet(this,j,"f").style.marginLeft=`${d}px`,__classPrivateFieldGet(this,j,"f").style.width=__classPrivateFieldGet(this,z,"f").clientWidth-__classPrivateFieldGet(this,X,"f").offsetWidth-__classPrivateFieldGet(this,B,"f").offsetHeight+"px",d+=__classPrivateFieldGet(this,j,"f").offsetWidth,__classPrivateFieldGet(this,$,"f").style.left=`${d-__classPrivateFieldGet(this,$,"f").offsetWidth+__classPrivateFieldGet(this,B,"f").offsetWidth}px`,__classPrivateFieldGet(this,$,"f").style.top=`${__classPrivateFieldGet(this,B,"f").offsetHeight}px`,__classPrivateFieldGet(this,B,"f").style.left=`${d}px`}update(i){var s,n;__classPrivateFieldGet(this,K,"f").info("update",{exports:i}),this.jiix=i;const createWordSpan=(i,s)=>{const n=document.createElement("span");return n.id=`word-${i}${this.uuid}`,s?n.textContent=s.label:n.innerHTML=" ",__classPrivateFieldGet(this,K,"f").debug("update",{span:n}),n};(()=>{var i;if(__classPrivateFieldGet(this,K,"f").info("populatePrompter",{}),__classPrivateFieldGet(this,H,"f").innerHTML="",null===(i=this.jiix)||void 0===i?void 0:i.words){const i=this.jiix.words,s=document.createDocumentFragment();i.forEach(((n,a)=>{var l,d,c;if(" "===n.label||n.label.includes("\n"))s.appendChild(createWordSpan(a));else if(a!==i.length-1)s.appendChild(createWordSpan(a,n));else{__classPrivateFieldGet(this,H,"f").appendChild(s),this.lastWord&&(this.lastWord=n);const i=createWordSpan(a,n);(null===(l=this.lastWord)||void 0===l?void 0:l.candidates)!==n.candidates&&(null===(d=this.lastWord)||void 0===d?void 0:d.label)!==n.label&&(this.lastWord=n),(null===(c=this.wordToChange)||void 0===c?void 0:c.id)===a.toString()?(i.classList.add("modified-word"),this.wordToChange=void 0):i.classList.add("added-word"),__classPrivateFieldGet(this,H,"f").appendChild(i),__classPrivateFieldGet(this,j,"f").scrollLeft=i.offsetLeft,__classPrivateFieldGet(this,K,"f").debug("update => populatePrompter",{span:i}),__classPrivateFieldGet(this,K,"f").debug("update => populatePrompter",this.lastWord)}}))}})(),(null===(n=null===(s=this.jiix)||void 0===s?void 0:s.words)||void 0===n?void 0:n.length)&&__classPrivateFieldGet(this,W,"m",ce).call(this)}clear(){__classPrivateFieldGet(this,K,"f").info("clear"),__classPrivateFieldGet(this,H,"f").innerHTML="",__classPrivateFieldGet(this,U,"f").innerHTML="",__classPrivateFieldGet(this,W,"m",he).call(this)}destroy(){__classPrivateFieldGet(this,K,"f").info("destroy"),__classPrivateFieldGet(this,W,"m",Ge).call(this),__classPrivateFieldGet(this,z,"f").remove()}}z=new WeakMap,j=new WeakMap,H=new WeakMap,B=new WeakMap,X=new WeakMap,U=new WeakMap,$=new WeakMap,V=new WeakMap,J=new WeakMap,q=new WeakMap,Y=new WeakMap,Z=new WeakMap,K=new WeakMap,ve=new WeakMap,ge=new WeakMap,fe=new WeakMap,me=new WeakMap,Pe=new WeakMap,ye=new WeakMap,Se=new WeakMap,we=new WeakMap,W=new WeakSet,Q=function _SmartGuide_createWrapperElement(){__classPrivateFieldSet(this,z,document.createElement("div"),"f"),__classPrivateFieldGet(this,z,"f").id=`smartguide-${this.uuid}`,__classPrivateFieldGet(this,z,"f").classList.add("smartguide")},ee=function _SmartGuide_createPrompterContainerElement(){__classPrivateFieldSet(this,j,document.createElement("div"),"f"),__classPrivateFieldGet(this,j,"f").id=`prompter-container-${this.uuid}`,__classPrivateFieldGet(this,j,"f").classList.add("prompter-container")},te=function _SmartGuide_createPrompterTextElement(){__classPrivateFieldSet(this,H,document.createElement("div"),"f"),__classPrivateFieldGet(this,H,"f").id=`prompter-text-${this.uuid}`,__classPrivateFieldGet(this,H,"f").classList.add("prompter-text"),__classPrivateFieldGet(this,H,"f").setAttribute("touch-action","none")},ie=function _SmartGuide_createEllipsisElement(){__classPrivateFieldSet(this,B,document.createElement("div"),"f"),__classPrivateFieldGet(this,B,"f").id=`ellipsis-${this.uuid}`,__classPrivateFieldGet(this,B,"f").classList.add("ellipsis"),__classPrivateFieldGet(this,B,"f").innerHTML="..."},se=function _SmartGuide_createTagElement(){__classPrivateFieldSet(this,X,document.createElement("div"),"f"),__classPrivateFieldGet(this,X,"f").id=`tag-icon-${this.uuid}`,__classPrivateFieldGet(this,X,"f").classList.add("tag-icon"),__classPrivateFieldGet(this,X,"f").innerHTML="¶"},ne=function _SmartGuide_createCandidatesElement(){__classPrivateFieldSet(this,U,document.createElement("div"),"f"),__classPrivateFieldGet(this,U,"f").id=`candidates-${this.uuid}`,__classPrivateFieldGet(this,U,"f").classList.add("candidates")},re=function _SmartGuide_createMoreMenuElement(){__classPrivateFieldSet(this,$,document.createElement("div"),"f"),__classPrivateFieldGet(this,$,"f").id=`more-menu-${this.uuid}`,__classPrivateFieldGet(this,$,"f").classList.add("more-menu")},oe=function _SmartGuide_createConvertElement(){__classPrivateFieldSet(this,V,document.createElement("button"),"f"),__classPrivateFieldGet(this,V,"f").id=`convert-${this.uuid}`,__classPrivateFieldGet(this,V,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,V,"f").innerHTML="Convert"},ae=function _SmartGuide_createCopyElement(){__classPrivateFieldSet(this,J,document.createElement("button"),"f"),__classPrivateFieldGet(this,J,"f").id=`copy-${this.uuid}`,__classPrivateFieldGet(this,J,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,J,"f").innerHTML="Copy"},le=function _SmartGuide_createDeleteElement(){__classPrivateFieldSet(this,q,document.createElement("button"),"f"),__classPrivateFieldGet(this,q,"f").id=`delete-${this.uuid}`,__classPrivateFieldGet(this,q,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,q,"f").innerHTML="Delete"},de=function _SmartGuide_initFadeOutObserver(i=3e3){new MutationObserver((()=>{clearTimeout(__classPrivateFieldGet(this,Y,"f")),__classPrivateFieldGet(this,z,"f").classList.contains("smartguide-out")||"none"!==__classPrivateFieldGet(this,U,"f").style.display||__classPrivateFieldGet(this,Z,"f")||__classPrivateFieldSet(this,Y,setTimeout((()=>{__classPrivateFieldGet(this,W,"m",he).call(this)}),i),"f")})).observe(__classPrivateFieldGet(this,z,"f"),{childList:!0,subtree:!0,attributes:!0})},ce=function _SmartGuide_show(){__classPrivateFieldGet(this,z,"f").classList.remove("smartguide-out"),__classPrivateFieldGet(this,z,"f").classList.add("smartguide-in")},he=function _SmartGuide_hide(){__classPrivateFieldGet(this,z,"f").classList.add("smartguide-out"),__classPrivateFieldGet(this,z,"f").classList.remove("smartguide-in")},ue=function _SmartGuide_hideCandidates(){__classPrivateFieldGet(this,U,"f").style.display="none"},pe=function _SmartGuide_openMenu(){__classPrivateFieldGet(this,$,"f").classList.add("open"),__classPrivateFieldGet(this,$,"f").classList.remove("close"),__classPrivateFieldSet(this,Z,!0,"f")},_e=function _SmartGuide_closeMenu(){__classPrivateFieldGet(this,$,"f").classList.add("close"),__classPrivateFieldGet(this,$,"f").classList.remove("open"),__classPrivateFieldSet(this,Z,!1,"f")},Fe=function _SmartGuide_addListeners(){__classPrivateFieldGet(this,B,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f").bind(this)),__classPrivateFieldGet(this,V,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f").bind(this)),__classPrivateFieldGet(this,J,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,me,"f").bind(this)),__classPrivateFieldGet(this,q,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f").bind(this)),__classPrivateFieldGet(this,H,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f").bind(this)),__classPrivateFieldGet(this,U,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f").bind(this)),document.addEventListener("pointerdown",__classPrivateFieldGet(this,we,"f").bind(this))},Ge=function _SmartGuide_removeListeners(){__classPrivateFieldGet(this,B,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f")),__classPrivateFieldGet(this,V,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f")),__classPrivateFieldGet(this,J,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,me,"f")),__classPrivateFieldGet(this,q,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f")),__classPrivateFieldGet(this,H,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f")),__classPrivateFieldGet(this,U,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f")),document.removeEventListener("pointerdown",__classPrivateFieldGet(this,we,"f"))};var xe,Ee=Object.freeze({__proto__:null,SmartGuide:SmartGuide});class DeferredPromise{constructor(){this.isFullFilled=!1,this.isPending=!0,this.promise=new Promise(((i,s)=>{this.reject=i=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,s(i)})),this.resolve=s=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,i(s)}))}))}}class PointerEventGrabber{constructor(i){this.prevent=i=>i.preventDefault(),xe.set(this,LoggerManager.getLogger("GRABBER")),this.pointerDownHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerDown",{evt:i}),0===i.button&&1===i.buttons&&(this.activePointerId=i.pointerId,this.onPointerDown)){const s=this.extractPoint(i);this.onPointerDown(i,s)}},this.pointerMoveHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerMove",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&this.onPointerMove){const s=this.extractPoint(i);this.onPointerMove(i,s)}},this.pointerUpHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerUp",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&(this.activePointerId=void 0,i.stopPropagation(),this.onPointerUp)){const s=this.extractPoint(i);this.onPointerUp(i,s)}},__classPrivateFieldGet(this,xe,"f").info("constructor",{configuration:i}),this.configuration=i}roundFloat(i,s){if(s>=0){const n=Math.pow(10,s);return Math.round(i/n)*n}return __classPrivateFieldGet(this,xe,"f").debug("roundFloat",{oneFloat:i,requestedFloatPrecision:s}),i}extractPoint(i){let s,n;({clientX:s,clientY:n}="changedTouches"in i?i.changedTouches[0]:i);const a=this.domElement.getBoundingClientRect(),l={x:this.roundFloat(s-a.left-this.domElement.clientLeft,this.configuration.xyFloatPrecision),y:this.roundFloat(n-a.top-this.domElement.clientTop,this.configuration.xyFloatPrecision),t:this.roundFloat(Date.now(),this.configuration.timestampFloatPrecision),p:i.pressure||1};return __classPrivateFieldGet(this,xe,"f").debug("extractPoint",{event:i,pointer:l}),l}attach(i){__classPrivateFieldGet(this,xe,"f").info("attach",{domElement:i}),this.domElement&&this.detach(),this.domElement=i,this.domElement.addEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("touchmove",this.prevent),document.documentElement.addEventListener("pointerdown",(()=>{}))}detach(){var i,s,n,a,l,d;__classPrivateFieldGet(this,xe,"f").info("detach"),null===(i=this.domElement)||void 0===i||i.removeEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),null===(s=this.domElement)||void 0===s||s.removeEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),null===(n=this.domElement)||void 0===n||n.removeEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),null===(a=this.domElement)||void 0===a||a.removeEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),null===(l=this.domElement)||void 0===l||l.removeEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),null===(d=this.domElement)||void 0===d||d.removeEventListener("touchmove",this.prevent),document.documentElement.removeEventListener("pointerdown",(()=>{}))}}xe=new WeakMap;const Ce={table:"table",shape:"shape",recognizedShape:"recognizedShape",ellipse:"ellipse",line:"line"};function phi(i){let s=(i+Math.PI)%(2*Math.PI)-Math.PI;return s<-Math.PI&&(s+=2*Math.PI),s}function drawArrowHead(i,s,n,a){const l=phi(n+Math.PI*(7/8)),d=phi(n-Math.PI*(7/8));i.save();try{i.fillStyle=i.strokeStyle,i.moveTo(s.x,s.y),i.beginPath(),i.lineTo(s.x+a*Math.cos(l),s.y+a*Math.sin(l)),i.lineTo(s.x+a*Math.cos(d),s.y+a*Math.sin(d)),i.lineTo(s.x,s.y),i.fill()}finally{i.restore()}}function drawShapeEllipse(i,s){const n=function drawEllipseArc(i,s){const{centerPoint:n,maxRadius:a,minRadius:l,orientation:d,startAngle:c,sweepAngle:h}=s;let v=Math.cos(d),u=Math.sin(d),p=v,_=u;v*=a,p*=l,u*=a,_*=l;const g=Math.floor(Math.abs(h)/.02),f=[];i.save();try{i.beginPath();for(let s=0;s<=g;s++){const d=c+s/g*h,m=Math.atan2(Math.sin(d)/l,Math.cos(d)/a),P=Math.cos(m),y=Math.sin(m),S=n.x+v*P-_*y,w=n.y+p*y+u*P;0===s?i.moveTo(S,w):i.lineTo(S,w),0!==s&&s!==g||f.push({x:S,y:w})}i.stroke()}finally{i.restore()}return f}(i,s);"ARROW_HEAD"===(null==s?void 0:s.beginDecoration)&&drawArrowHead(i,n[0],s.beginTangentAngle,12),"ARROW_HEAD"===(null==s?void 0:s.endDecoration)&&drawArrowHead(i,n[1],s.endTangentAngle,12)}function drawLine(i,s,n){i.save();try{i.beginPath(),i.moveTo(s.x,s.y),i.lineTo(n.x,n.y),i.stroke()}finally{i.restore()}}function drawShapeSymbol(i,s){i.save();try{if(i.lineWidth=s.style.width,i.strokeStyle=s.style.color,s.elementType)switch(s.elementType){case Ce.shape:{const n=s;drawShapeSymbol(i,n.candidates[n.selectedCandidateIndex]);break}case Ce.table:s.lines.forEach((s=>drawShapeSymbol(i,s)));break;case Ce.line:{const n=s;drawLine(i,n.data.p1,n.data.p2);break}}else switch(s.type){case Ce.ellipse:drawShapeEllipse(i,s);break;case Ce.line:!function drawShapeLine(i,s){drawLine(i,s.firstPoint,s.lastPoint),"ARROW_HEAD"===s.beginDecoration&&drawArrowHead(i,s.firstPoint,s.beginTangentAngle,12),"ARROW_HEAD"===s.endDecoration&&drawArrowHead(i,s.lastPoint,s.endTangentAngle,12)}(i,s);break;case Ce.recognizedShape:s.primitives.forEach((s=>drawShapeSymbol(i,s)));break}}finally{i.restore()}}var ke=Object.freeze({__proto__:null,ShapeSymbols:Ce,drawLine:drawLine,drawShapeSymbol:drawShapeSymbol});function drawStroke(i,s,n){n&&s&&"eraser"!==s.pointerType&&n.drawStroke(i,s)}var Me=Object.freeze({__proto__:null,drawStroke:drawStroke});const Te={inputCharacter:"inputCharacter",char:"char",string:"string",textLine:"textLine"};function drawTextLine(i,s){!function drawText(i,s,n){i.save();try{i.font=`${n.textHeight}px serif`,i.textAlign="CENTER"===n.justificationType?"center":"left",i.textBaseline="bottom",i.fillStyle=i.strokeStyle,i.fillText(s,n.topLeftPoint.x,n.topLeftPoint.y+n.height)}finally{i.restore()}}(i,s.label,s.data),s.underlineList.forEach((n=>{!function drawUnderline(i,s,n,a){const l=a.width/n.length;drawLine(i,{x:a.topLeftPoint.x+s.data.firstCharacter*l,y:a.topLeftPoint.y+a.height},{x:a.topLeftPoint.x+s.data.lastCharacter*l,y:a.topLeftPoint.y+a.height})}(i,n,s.label,s.data)}))}function drawTextSymbol(i,s){i.save();try{i.lineWidth=s.style.width,i.strokeStyle=s.style.color;if((s.elementType||s.type)===Te.textLine)drawTextLine(i,s);else console.info(`drawTextSymbol => ${s.elementType} not implemented`)}finally{i.restore()}}var Le=Object.freeze({__proto__:null,TextSymbols:Te,drawTextSymbol:drawTextSymbol});function computeLinksPoints(i,s,n){const a=i.p*n;return[{x:i.x-Math.sin(s)*a,y:i.y+Math.cos(s)*a},{x:i.x+Math.sin(s)*a,y:i.y-Math.cos(s)*a}]}function computeMiddlePoint(i,s){return{x:(s.x+i.x)/2,y:(s.y+i.y)/2,p:(s.p+i.p)/2,t:(s.t+i.t)/2}}function computeAxeAngle(i,s){return Math.atan2(s.y-i.y,s.x-i.x)}var Ie,De=Object.freeze({__proto__:null,computeLinksPoints:computeLinksPoints,computeMiddlePoint:computeMiddlePoint,computeAxeAngle:computeAxeAngle});class CanvasStroker{renderArc(i,s,n){i.arc(s.x,s.y,n,0,2*Math.PI,!0)}renderLine(i,s,n,a){const l=computeLinksPoints(s,computeAxeAngle(s,n),a),d=computeLinksPoints(n,computeAxeAngle(s,n),a);i.moveTo(l[0].x,l[0].y),i.lineTo(d[0].x,d[0].y),i.lineTo(d[1].x,d[1].y),i.lineTo(l[1].x,l[1].y)}renderFinal(i,s,n,a){const l=computeAxeAngle(s,n),d=computeLinksPoints(n,l,a);i.moveTo(d[0].x,d[0].y);for(let s=1;s<=6;s++){const d=l-s*Math.PI/6;i.lineTo(n.x-n.p*a*Math.sin(d),n.y+n.p*a*Math.cos(d))}}renderQuadratic(i,s,n,a,l){const d=computeLinksPoints(s,computeAxeAngle(s,a),l),c=computeLinksPoints(n,computeAxeAngle(a,n),l),h=computeLinksPoints(a,computeAxeAngle(s,n),l);i.moveTo(d[0].x,d[0].y),i.quadraticCurveTo(h[0].x,h[0].y,c[0].x,c[0].y),i.lineTo(c[1].x,c[1].y),i.quadraticCurveTo(h[1].x,h[1].y,d[1].x,d[1].y)}drawStroke(i,s){const n=s.pointers.length,a=n-2,l=s.style.width>0?s.style.width:i.lineWidth,d=s.style.color?s.style.color:i.strokeStyle,c=s.pointers[0];i.save();try{if(i.beginPath(),n<3)this.renderArc(i,c,.6*l);else{this.renderArc(i,c,l*c.p);const d=computeMiddlePoint(c,s.pointers[1]);this.renderLine(i,c,d,l);for(let n=0;n{var n;const a=s.parentNode,l=Math.max(this.config.minWidth,a.clientWidth),d=Math.max(this.config.minHeight,a.clientHeight);s.width=l*i,s.height=d*i,null===(n=s.getContext("2d"))||void 0===n||n.scale(i,i),s.style.width=`${l}px`,s.style.height=`${d}px`}))}drawSymbol(i,s){const n=s.elementType||s.type;"stroke"===n?drawStroke(i,s,this.stroker):Object.keys(Te).includes(n)?drawTextSymbol(i,s):Object.keys(Ce).includes(n)&&drawShapeSymbol(i,s)}init(i){__classPrivateFieldGet(this,Ie,"f").info("init",{element:i});const s=this.createCanvas("ms-rendering-canvas");i.appendChild(s);const n=this.createCanvas("ms-capture-canvas");i.appendChild(n),this.context={parent:i,renderingCanvas:s,renderingCanvasContext:s.getContext("2d"),capturingCanvas:n,capturingCanvasContext:n.getContext("2d")},this.resizeContent()}drawModel(i){var s;__classPrivateFieldGet(this,Ie,"f").info("drawModel",{model:i}),null===(s=this.context.renderingCanvasContext)||void 0===s||s.clearRect(0,0,this.context.renderingCanvas.width,this.context.renderingCanvas.height),i.rawStrokes.forEach((i=>this.drawSymbol(this.context.renderingCanvasContext,i))),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height)}drawPendingStroke(i){__classPrivateFieldGet(this,Ie,"f").info("drawPendingStroke",{stroke:i}),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height),i&&"eraser"!==(null==i?void 0:i.pointerType)&&this.stroker.drawStroke(this.context.capturingCanvasContext,i)}resize(i){__classPrivateFieldGet(this,Ie,"f").info("resize",{model:i}),this.resizeContent(),this.drawModel(i)}destroy(){__classPrivateFieldGet(this,Ie,"f").info("destroy"),this.context.parent&&(this.context.parent.innerHTML="")}}Ie=new WeakMap;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function createCommonjsModule(i,s){return i(s={exports:{}},s.exports),s.exports}var Ae=createCommonjsModule((function(i,s){i.exports=function(i){function e(n){if(s[n])return s[n].exports;var a=s[n]={i:n,l:!1,exports:{}};return i[n].call(a.exports,a,a.exports,e),a.l=!0,a.exports}var s={};return e.m=i,e.c=s,e.i=function(i){return i},e.d=function(i,s,n){e.o(i,s)||Object.defineProperty(i,s,{configurable:!1,enumerable:!0,get:n})},e.n=function(i){var s=i&&i.__esModule?function(){return i.default}:function(){return i};return e.d(s,"a",s),s},e.o=function(i,s){return Object.prototype.hasOwnProperty.call(i,s)},e.p="",e(e.s=1)}([function(i,s,n){function o(i,s){if(!(i instanceof s))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(s,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},l=function t(i){var s=this;o(this,t),this.toJSON=function(i){if("string"!=typeof i)return console.error("Need a CSS string but given ",void 0===i?"undefined":a(i),i),"Not a valid CSS..!";var n={},l=void 0,d=void 0,c=void 0;try{i.split("{").forEach((function(i){if(d=i.trim())if(-1===d.indexOf("}"))n[d]={},l=d;else{d.substring(0,d.indexOf("}")).split(";").forEach((function(i){(c=i.split(":"))&&2===c.length&&(n[l][c[0].trim().replace(/^\"|\"$/g,"")]=s._trimSemiColon(c[1].trim().replace(/^\"|\"$/g,"")))}));try{(l=d.split("}")[1].trim())&&(n[l]={})}catch(i){}}}))}catch(i){return"Not a valid CSS..!"}return n},this.toCSS=function(i){if("object"!==(void 0===i?"undefined":a(i)))return console.error("Need a JSON object but given ",void 0===i?"undefined":a(i),i),"Not a valid JSON..!";var s="";try{for(var n in i)if(i.hasOwnProperty(n)){for(var l in s+=n+" {\n",i[n])i[n].hasOwnProperty(l)&&(s+=l+": "+i[n][l]+";\n");s+="}\n"}}catch(i){return"Not a valid JSON..!"}return s},this._trimSemiColon=function(i){return";"===i.slice(-1)?i.slice(0,s.length-1):i}};s.default=l},function(i,s,n){i.exports=n(0).default}])})),Re=function unwrapExports(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}(Ae);Ae.JsonCSS;const Ne=new Re,Oe={themeToCSS:i=>Ne.toCSS(i),themeToJSON(i){const s=Ne.toJSON(i);return s[".text"]["font-size"]=Number(s[".text"]["font-size"]),s.ink["-myscript-pen-width"]=Number(s.ink["-myscript-pen-width"]),s.ink.width=Number(s.ink.width),s},penStyleToCSS(i){let s=Ne.toCSS({css:i});return s=s.substring(6,s.length-3),s},penStyleToJSON(i){const s=Ne.toJSON(`css {${i}}`).css;return s.width?s.width=Number(s.width):delete s.width,s["-myscript-pen-width"]?s["-myscript-pen-width"]=Number(s["-myscript-pen-width"]):delete s["-myscript-pen-width"],s},stringToJSON:i=>Ne.toJSON(`css {${i}}`).css,JSONToString:i=>Object.entries(i).map((([i,s])=>`${i}:${s}`)).join(";")};var We=createCommonjsModule((function(i,s){var n;i.exports=(n=n||function(i,s){var n=Object.create||function(){function F(){}return function(i){var s;return F.prototype=i,s=new F,F.prototype=null,s}}(),a={},l=a.lib={},d=l.Base={extend:function(i){var s=n(this);return i&&s.mixIn(i),s.hasOwnProperty("init")&&this.init!==s.init||(s.init=function(){s.$super.init.apply(this,arguments)}),s.init.prototype=s,s.$super=this,s},create:function(){var i=this.extend();return i.init.apply(i,arguments),i},init:function(){},mixIn:function(i){for(var s in i)i.hasOwnProperty(s)&&(this[s]=i[s]);i.hasOwnProperty("toString")&&(this.toString=i.toString)},clone:function(){return this.init.prototype.extend(this)}},c=l.WordArray=d.extend({init:function(i,n){i=this.words=i||[],this.sigBytes=n!=s?n:4*i.length},toString:function(i){return(i||v).stringify(this)},concat:function(i){var s=this.words,n=i.words,a=this.sigBytes,l=i.sigBytes;if(this.clamp(),a%4)for(var d=0;d>>2]>>>24-d%4*8&255;s[a+d>>>2]|=c<<24-(a+d)%4*8}else for(d=0;d>>2]=n[d>>>2];return this.sigBytes+=l,this},clamp:function(){var s=this.words,n=this.sigBytes;s[n>>>2]&=4294967295<<32-n%4*8,s.length=i.ceil(n/4)},clone:function(){var i=d.clone.call(this);return i.words=this.words.slice(0),i},random:function(s){for(var n,a=[],r=function(s){var n=987654321,a=4294967295;return function(){var l=((n=36969*(65535&n)+(n>>16)&a)<<16)+(s=18e3*(65535&s)+(s>>16)&a)&a;return l/=4294967296,(l+=.5)*(i.random()>.5?1:-1)}},l=0;l>>2]>>>24-l%4*8&255;a.push((d>>>4).toString(16)),a.push((15&d).toString(16))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>3]|=parseInt(i.substr(a,2),16)<<24-a%8*4;return new c.init(n,s/2)}},u=h.Latin1={stringify:function(i){for(var s=i.words,n=i.sigBytes,a=[],l=0;l>>2]>>>24-l%4*8&255;a.push(String.fromCharCode(d))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>2]|=(255&i.charCodeAt(a))<<24-a%4*8;return new c.init(n,s)}},p=h.Utf8={stringify:function(i){try{return decodeURIComponent(escape(u.stringify(i)))}catch(i){throw new Error("Malformed UTF-8 data")}},parse:function(i){return u.parse(unescape(encodeURIComponent(i)))}},_=l.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(i){"string"==typeof i&&(i=p.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes},_process:function(s){var n=this._data,a=n.words,l=n.sigBytes,d=this.blockSize,h=l/(4*d),v=(h=s?i.ceil(h):i.max((0|h)-this._minBufferSize,0))*d,u=i.min(4*v,l);if(v){for(var p=0;p>>1|ie<<31)^(te>>>8|ie<<24)^te>>>7,ne=(ie>>>1|te<<31)^(ie>>>8|te<<24)^(ie>>>7|te<<25),re=v[Y-2],oe=re.high,ae=re.low,le=(oe>>>19|ae<<13)^(oe<<3|ae>>>29)^oe>>>6,de=(ae>>>19|oe<<13)^(ae<<3|oe>>>29)^(ae>>>6|oe<<26),ce=v[Y-7],he=ce.high,ve=ce.low,ue=v[Y-16],pe=ue.high,_e=ue.low;K=(K=(K=se+he+((Q=ne+ve)>>>0>>0?1:0))+le+((Q+=de)>>>0>>0?1:0))+pe+((Q+=_e)>>>0<_e>>>0?1:0),Z.high=K,Z.low=Q}var ge,fe=H&X^~H&$,me=B&U^~B&V,Pe=D&R^D&O^R&O,ye=A&N^A&W^N&W,Se=(D>>>28|A<<4)^(D<<30|A>>>2)^(D<<25|A>>>7),we=(A>>>28|D<<4)^(A<<30|D>>>2)^(A<<25|D>>>7),Fe=(H>>>14|B<<18)^(H>>>18|B<<14)^(H<<23|B>>>9),Ge=(B>>>14|H<<18)^(B>>>18|H<<14)^(B<<23|H>>>9),be=h[Y],xe=be.high,Ee=be.low,Ce=J+Fe+((ge=q+Ge)>>>0>>0?1:0),ke=we+ye;J=$,q=V,$=X,V=U,X=H,U=B,H=z+(Ce=(Ce=(Ce=Ce+fe+((ge+=me)>>>0>>0?1:0))+xe+((ge+=Ee)>>>0>>0?1:0))+K+((ge+=Q)>>>0>>0?1:0))+((B=j+ge|0)>>>0>>0?1:0)|0,z=O,j=W,O=R,W=N,R=D,N=A,D=Ce+(Se+Pe+(ke>>>0>>0?1:0))+((A=ge+ke|0)>>>0>>0?1:0)|0}m=a.low=m+A,a.high=f+D+(m>>>0>>0?1:0),y=l.low=y+N,l.high=P+R+(y>>>0>>0?1:0),w=d.low=w+W,d.high=S+O+(w>>>0>>0?1:0),b=c.low=b+j,c.high=G+z+(b>>>0>>0?1:0),E=u.low=E+B,u.high=x+H+(E>>>0>>0?1:0),k=p.low=k+U,p.high=C+X+(k>>>0>>0?1:0),T=_.low=T+V,_.high=M+$+(T>>>0>>0?1:0),I=g.low=I+q,g.high=L+J+(I>>>0>>0?1:0)},_doFinalize:function(){var i=this._data,s=i.words,n=8*this._nDataBytes,a=8*i.sigBytes;return s[a>>>5]|=128<<24-a%32,s[30+(a+128>>>10<<5)]=Math.floor(n/4294967296),s[31+(a+128>>>10<<5)]=n,i.sigBytes=4*s.length,this._process(),this._hash.toX32()},clone:function(){var i=s.clone.call(this);return i._hash=this._hash.clone(),i},blockSize:32});i.SHA512=s._createHelper(u),i.HmacSHA512=s._createHmacHelper(u)}(),n.SHA512)})),createCommonjsModule((function(i,s){var n,a,l;i.exports=(a=(n=We).lib.Base,l=n.enc.Utf8,void(n.algo.HMAC=a.extend({init:function(i,s){i=this._hasher=new i.init,"string"==typeof s&&(s=l.parse(s));var n=i.blockSize,a=4*n;s.sigBytes>a&&(s=i.finalize(s)),s.clamp();for(var d=this._oKey=s.clone(),c=this._iKey=s.clone(),h=d.words,v=c.words,u=0;u{const n=i.split("."),a=s.split(".");for(let i=0;il)return!1;if(s{s.p.push(i.p),s.t.push(i.t),s.x.push(i.x),s.y.push(i.y)})),s}Be=new WeakMap;class RestRecognizer{constructor(i,s){Xe.set(this,LoggerManager.getLogger("RECOGNIZER")),__classPrivateFieldGet(this,Xe,"f").info("constructor",{serverConfig:i,recognitionConfig:s}),this.serverConfiguration=i,this.recognitionConfiguration=s}get url(){return`${this.serverConfiguration.scheme}://${this.serverConfiguration.host}/api/v4.0/iink/batch`}get postConfig(){switch(this.recognitionConfiguration.type){case"DIAGRAM":return{lang:this.recognitionConfiguration.lang,diagram:this.recognitionConfiguration.diagram,export:this.recognitionConfiguration.export};case"MATH":return{lang:this.recognitionConfiguration.lang,math:this.recognitionConfiguration.math,export:this.recognitionConfiguration.export};case"Raw Content":return{lang:this.recognitionConfiguration.lang,"raw-content":this.recognitionConfiguration["raw-content"],export:this.recognitionConfiguration.export};case"TEXT":return{lang:this.recognitionConfiguration.lang,text:this.recognitionConfiguration.text,export:this.recognitionConfiguration.export};default:throw new Error(`get postConfig error Recognition type unkow "${this.recognitionConfiguration.type}"`)}}buildData(i){__classPrivateFieldGet(this,Xe,"f").info("buildData",{model:i});const s=[];i.rawStrokes.forEach((i=>{const n=s.findIndex((s=>{return n=s.penStyle,a=i.style,n&&a&&n["-myscript-pen-fill-color"]===a["-myscript-pen-fill-color"]&&n["-myscript-pen-fill-style"]===a["-myscript-pen-fill-style"]&&n["-myscript-pen-width"]===a["-myscript-pen-width"]&&n.color===a.color&&n.width===a.width;var n,a}));n>-1?s[n].strokes.push(i):s.push({penStyle:i.style,strokes:[i]})}));const n=[];s.forEach((i=>{const s={penStyle:"{}"===JSON.stringify(i.penStyle)?void 0:Oe.penStyleToCSS(i.penStyle),strokes:i.strokes.map(convertStrokeToJSON)};n.push(s)}));const a="Raw Content"===this.recognitionConfiguration.type?"Raw Content":this.recognitionConfiguration.type.charAt(0).toUpperCase()+this.recognitionConfiguration.type.slice(1).toLowerCase(),l={configuration:this.postConfig,xDPI:96,yDPI:96,contentType:a,height:i.height,width:i.width,strokeGroups:n};return __classPrivateFieldGet(this,Xe,"f").debug("buildData",{data:l}),l}post(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Xe,"f").info("post",{data:i,mimeType:s});const n=new Headers;n.append("Accept","application/json,"+s),n.append("applicationKey",this.serverConfiguration.applicationKey),n.append("hmac",computeHmac(JSON.stringify(i),this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)),n.append("Content-Type","application/json"),isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(n.append("myscript-client-name","iink-ts"),n.append("myscript-client-version","1.0.0-buildVersion"));const a={method:"POST",headers:n,body:JSON.stringify(i)},l=new Request(this.url,a),d=yield fetch(l);if(d.ok){const i=d.headers.get("content-type");let s;switch(i){case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"image/png":case"image/jpeg":s=yield d.blob();break;case"application/json":s=yield d.json();break;case"application/vnd.myscript.jiix":s=yield d.clone().json().catch((()=>__awaiter(this,void 0,void 0,(function*(){return yield d.text()}))));break;default:__classPrivateFieldGet(this,Xe,"f").warn("post default",{contentType:i}),s=yield d.text()}return __classPrivateFieldGet(this,Xe,"f").debug("post",{result:s}),s}{const i=yield d.json();throw __classPrivateFieldGet(this,Xe,"f").error("post",{err:i}),i}}))}tryFetch(i,s){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Xe,"f").debug("tryFetch",{data:i,mimeType:s}),this.post(i,s).then((i=>{const n={};return n[s]=i,__classPrivateFieldGet(this,Xe,"f").debug("tryFetch",{exports:n}),n})).catch((n=>{__classPrivateFieldGet(this,Xe,"f").error("tryFetch",{data:i,mimeType:s,err:n});let a=n.message||S.UNKNOW;n.code?"access.not.granted"===n.code&&(a=S.WRONG_CREDENTIALS):a=S.CANT_ESTABLISH;throw new Error(a)}))}))}getMimeTypes(i){__classPrivateFieldGet(this,Xe,"f").info("getMimeTypes",{requestedMimeTypes:i});let s=i||[];if(!s.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":s=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":s=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":s=["application/vnd.myscript.jiix"];break;case"TEXT":s=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}return s}convert(i,s,n){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Xe,"f").info("convert",{model:i,conversionState:s,requestedMimeTypes:n});const a=i.getClone(),l=this.getMimeTypes(n),d=this.buildData(a);d.conversionState=s;const c=l.map((i=>this.tryFetch(d,i)));return(yield Promise.all(c)).forEach((i=>{a.mergeConvert(i)})),__classPrivateFieldGet(this,Xe,"f").debug("convert",{model:a}),a}))}export(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Xe,"f").info("export",{model:i,requestedMimeTypes:s});const n=i.getClone();if(0===n.rawStrokes.length)return Promise.resolve(n);const a=this.getMimeTypes(s);if(!a.length)return __classPrivateFieldGet(this,Xe,"f").error("export",{model:i,requestedMimeTypes:s,"Export failed, no mimeTypes define in recognition configuration":String}),Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration"));const l=a.filter((i=>!n.exports||!n.exports[i])),d=this.buildData(i);return(yield Promise.all(l.map((i=>this.tryFetch(d,i))))).forEach((i=>{n.mergeExport(i)})),__classPrivateFieldGet(this,Xe,"f").debug("export",{model:n}),n}))}resize(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Xe,"f").info("resize",{model:i}),this.export(i)}))}}Xe=new WeakMap;class UndoRedoContext{constructor(i){this.stackIndex=0,this.possibleUndoCount=0,this.canRedo=!1,this.canUndo=!1,this.empty=!0,this.stack=[i.getClone()]}}class UndoRedoManager{constructor(i,s){Ue.set(this,LoggerManager.getLogger("UNDOREDO_MANAGER")),__classPrivateFieldGet(this,Ue,"f").info("constructor",{configuration:i,model:s}),this.configuration=i,this.context=new UndoRedoContext(s)}get internalEvent(){return InternalEvent.getInstance()}updateCanUndoRedo(){this.context.canRedo=this.context.stack.length-1>this.context.stackIndex,this.context.canUndo=this.context.stackIndex>0;const i=this.context.stack[this.context.stackIndex];this.context.empty=0===i.rawStrokes.length}addModelToStack(i){__classPrivateFieldGet(this,Ue,"f").info("addModelToStack",{model:i}),this.context.stackIndex+1this.configuration.maxStackSize&&(this.context.stack.shift(),this.context.stackIndex--),this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)}removeLastModelInStack(){__classPrivateFieldGet(this,Ue,"f").info("removeLastModelInStack"),this.context.stackIndex===this.context.stack.length-1&&this.context.stackIndex--,this.context.stack.pop(),this.updateCanUndoRedo()}updateModelInStack(i){__classPrivateFieldGet(this,Ue,"f").info("updateModelInStack",{model:i});const s=this.context.stack.findIndex((s=>s.modificationDate===i.modificationDate));s>-1&&this.context.stack.splice(s,1,i.getClone()),this.internalEvent.emitContextChange(this.context)}undo(){__classPrivateFieldGet(this,Ue,"f").info("undo"),this.context.canUndo&&(this.context.stackIndex--,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Ue,"f").debug("undo",i),i}redo(){__classPrivateFieldGet(this,Ue,"f").info("redo"),this.context.canRedo&&(this.context.stackIndex++,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Ue,"f").debug("redo",i),i}reset(i){__classPrivateFieldGet(this,Ue,"f").info("reset",{model:i}),this.context=new UndoRedoContext(i),this.internalEvent.emitContextChange(this.context)}}Ue=new WeakMap;const Ve={},Je={ink:{color:"#000000",width:1,"-myscript-pen-width":1,"-myscript-pen-fill-style":"none","-myscript-pen-fill-color":"#FFFFFF00"},".math":{"font-family":"STIXGeneral"},".math-solved":{"font-family":"STIXGeneral",color:"#A8A8A8FF"},".text":{"font-family":"MyScriptInter","font-size":10}};var qe,Ye,Ze,Ke,Qe;class StyleManager{constructor(i,s){qe.set(this,void 0),Ye.set(this,void 0),Ze.set(this,void 0),Ke.set(this,void 0),Qe.set(this,LoggerManager.getLogger("STYLEMANAGER")),__classPrivateFieldGet(this,Qe,"f").info("constructor",{penStyle:i,theme:s}),this.setTheme(s),this.setPenStyleClasses(),this.setPenStyle(i)}get currentPenStyle(){return __classPrivateFieldGet(this,Ke,"f")||__classPrivateFieldGet(this,qe,"f")}get penStyle(){return __classPrivateFieldGet(this,qe,"f")}setPenStyle(i){__classPrivateFieldGet(this,Qe,"f").info("setPenStyle",{style:i}),__classPrivateFieldSet(this,qe,mergeDeep(structuredClone(Ve),i||{}),"f"),__classPrivateFieldSet(this,Ke,i||this.theme[`.${__classPrivateFieldGet(this,Ze,"f")}`],"f"),__classPrivateFieldGet(this,Qe,"f").debug("setPenStyle",__classPrivateFieldGet(this,Ke,"f"))}get theme(){return __classPrivateFieldGet(this,Ye,"f")}setTheme(i){__classPrivateFieldGet(this,Qe,"f").info("setTheme",{theme:i}),__classPrivateFieldSet(this,Ye,mergeDeep(structuredClone(Je),i||{}),"f"),__classPrivateFieldGet(this,Qe,"f").debug("setTheme",__classPrivateFieldGet(this,Ye,"f"))}get penStyleClasses(){return __classPrivateFieldGet(this,Ze,"f")}setPenStyleClasses(i=""){__classPrivateFieldGet(this,Qe,"f").info("setPenStyleClasses",{penStyleClass:i}),__classPrivateFieldSet(this,Ze,i,"f"),__classPrivateFieldSet(this,Ke,this.theme[`.${__classPrivateFieldGet(this,Ze,"f")}`],"f"),__classPrivateFieldGet(this,Qe,"f").debug("setPenStyleClasses",__classPrivateFieldGet(this,Ke,"f"))}}function computeDistance(i,s){const n=Math.hypot(s.y-i.y,s.x-i.x);return isNaN(n)?0:n}qe=new WeakMap,Ye=new WeakMap,Ze=new WeakMap,Ke=new WeakMap,Qe=new WeakMap;var et,tt,it,st,nt,rt,ot,at,lt,dt,ct,ht,vt,ut,pt,_t,gt,ft,mt,Pt,yt=Object.freeze({__proto__:null,computeDistance:computeDistance});class Model{constructor(i=100,s=100,n=Date.now()){et.add(this),tt.set(this,LoggerManager.getLogger("MODEL")),__classPrivateFieldGet(this,tt,"f").info("constructor",{width:i,height:s,creationDate:n}),this.creationTime=n,this.modificationDate=n,this.width=i,this.height=s,this.rawStrokes=[],this.selectedStrokes=[],this.positions={lastSentPosition:0,lastReceivedPosition:0},this.idle=!0}mergeExport(i){__classPrivateFieldGet(this,tt,"f").info("mergeExport",{exports:i}),this.exports?Object.assign(this.exports,i):this.exports=i,__classPrivateFieldGet(this,tt,"f").debug("mergeExport",this.exports)}mergeConvert(i){__classPrivateFieldGet(this,tt,"f").info("mergeConvert",{converts:i}),this.converts?Object.assign(this.converts,i):this.converts=i,__classPrivateFieldGet(this,tt,"f").debug("mergeConvert",this.converts)}computePressure(i,s){let n=1;0===s?n=.5:i===s?n=1:i<10?n=.2+Math.pow(.1*i,.4):i>s-10&&(n=.2+Math.pow(.1*(s-i),.4));const a=n*Math.max(.1,1-.1*Math.sqrt(i));return isNaN(a)?.5:Math.round(100*a)/100}filterPointByAcquisitionDelta(i,s,n){const a=2+(i.style["-myscript-pen-width"]||0)/4;return!n||0===i.pointers.length||Math.abs(n.x-s.x)>=a||Math.abs(n.y-s.y)>=a}addPoint(i,s){__classPrivateFieldGet(this,tt,"f").debug("addPoint",{stroke:i,pointer:s});const n=i.pointers.at(-1)||{p:1,t:0,x:0,y:0};if(this.filterPointByAcquisitionDelta(i,s,n)){const a=computeDistance(s,n);i.length+=a,s.p=this.computePressure(a,i.length),i.pointers.push(s)}}addStroke(i){__classPrivateFieldGet(this,tt,"f").info("addStroke",{stroke:i}),this.rawStrokes.push(i)}extractUnsentStrokes(){return this.rawStrokes.slice(this.positions.lastSentPosition)}initCurrentStroke(i,s,n,a,l=96){if(__classPrivateFieldGet(this,tt,"f").info("initCurrentStroke",{point:i,pointerId:s,pointerType:n,style:a,dpi:l}),a["-myscript-pen-width"]){const i=a["-myscript-pen-width"]*l/25.4;a.width=i/2}this.modificationDate=Date.now(),this.exports=void 0,this.converts=void 0,this.currentStroke=new Stroke(a,s,n),__classPrivateFieldGet(this,tt,"f").debug("initCurrentStroke",this.currentStroke),this.addPoint(this.currentStroke,i)}appendToCurrentStroke(i){__classPrivateFieldGet(this,tt,"f").info("appendToCurrentStroke",{point:i}),this.currentStroke&&this.addPoint(this.currentStroke,i),__classPrivateFieldGet(this,tt,"f").debug("appendToCurrentStroke",this.currentStroke)}endCurrentStroke(i){__classPrivateFieldGet(this,tt,"f").info("endCurrentStroke",{point:i}),this.currentStroke&&(this.addPoint(this.currentStroke,i),this.addStroke(this.currentStroke),this.currentStroke=void 0),__classPrivateFieldGet(this,tt,"f").debug("endCurrentStroke",this.currentStroke)}resetSelectedStrokes(){this.selectedStrokes=[]}appendSelectedStrokesFromPoint(i){__classPrivateFieldGet(this,tt,"f").info("appendSelectedStrokesFromPoint",{point:i}),__classPrivateFieldGet(this,et,"m",it).call(this,i).forEach((i=>{this.selectedStrokes.includes(i)||this.selectedStrokes.push(i)}))}updateStroke(i){__classPrivateFieldGet(this,tt,"f").info("updateStroke",{updatedStroke:i});const s=this.rawStrokes.findIndex((s=>s.id===i.id));-1!==s&&this.rawStrokes.splice(s,1,i),__classPrivateFieldGet(this,tt,"f").debug("updateStroke",this.rawStrokes)}removeStroke(i){__classPrivateFieldGet(this,tt,"f").info("removeStroke",{id:i});const s=this.rawStrokes.findIndex((s=>s.id===i));-1!==s&&this.rawStrokes.splice(s,1),__classPrivateFieldGet(this,tt,"f").debug("removeStroke",this.rawStrokes)}removeStrokesFromPoint(i){__classPrivateFieldGet(this,tt,"f").info("removeStrokesFromPoint",{point:i});const s=__classPrivateFieldGet(this,et,"m",it).call(this,i);return s.forEach((i=>{this.removeStroke(i.id)})),__classPrivateFieldGet(this,tt,"f").debug("removeStrokesFromPoint",s.map((i=>i.id))),s.map((i=>i.id))}updatePositionSent(i=this.rawStrokes.length){__classPrivateFieldGet(this,tt,"f").info("updatePositionSent",{position:i}),this.positions.lastSentPosition=i,__classPrivateFieldGet(this,tt,"f").debug("updatePositionSent",this.positions.lastSentPosition)}updatePositionReceived(){__classPrivateFieldGet(this,tt,"f").info("updatePositionReceived"),this.positions.lastReceivedPosition=this.positions.lastSentPosition,__classPrivateFieldGet(this,tt,"f").debug("updatePositionReceived",this.positions.lastReceivedPosition)}getClone(){__classPrivateFieldGet(this,tt,"f").info("getClone");const i=new Model(this.width,this.height,this.creationTime);return i.modificationDate=JSON.parse(JSON.stringify(this.modificationDate)),i.currentStroke=this.currentStroke?JSON.parse(JSON.stringify(this.currentStroke)):void 0,i.rawStrokes=JSON.parse(JSON.stringify(this.rawStrokes)),i.positions=JSON.parse(JSON.stringify(this.positions)),i.exports=this.exports?JSON.parse(JSON.stringify(this.exports)):void 0,i.converts=this.converts?JSON.parse(JSON.stringify(this.converts)):void 0,i.idle=this.idle,__classPrivateFieldGet(this,tt,"f").debug("getClone",{clonedModel:i}),i}clear(){__classPrivateFieldGet(this,tt,"f").info("clear"),this.modificationDate=Date.now(),this.currentStroke=void 0,this.rawStrokes=[],this.positions.lastSentPosition=0,this.positions.lastReceivedPosition=0,this.exports=void 0,this.converts=void 0,this.idle=!0}}tt=new WeakMap,et=new WeakSet,it=function _Model_getStrokeFromPoint(i){__classPrivateFieldGet(this,tt,"f").info("getStrokeFromPoint",{point:i});const isBetween=(i,s,n)=>i>=s&&i<=n,s=[];return this.rawStrokes.forEach((n=>{for(let a=0;a0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(this.model,i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,rt,"f").warn(`onPointerDown intention unknow: "${this.intention}"`)}}onPointerMove(i,s){switch(__classPrivateFieldGet(this,rt,"f").info("onPointerMove",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,nt,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.appendToCurrentStroke(s),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,rt,"f").warn(`onPointerMove intention unknow: "${this.intention}"`)}}onPointerUp(i,s){switch(__classPrivateFieldGet(this,rt,"f").info("onPointerUp",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,nt,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,nt,"f"),i))).catch((i=>this.internalEvent.emitError(i)));break;default:__classPrivateFieldGet(this,rt,"f").warn(`onPointerUp intention unknow: "${this.intention}"`)}}drawCurrentStroke(){__classPrivateFieldGet(this,rt,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke}),this.renderer.drawPendingStroke(this.model.currentStroke)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("updateModelRendering"),this.renderer.drawModel(this.model);const i=new DeferredPromise;if(this.undoRedoManager.addModelToStack(this.model),"DEMAND"!==__classPrivateFieldGet(this,st,"f").triggers.exportContent){clearTimeout(__classPrivateFieldGet(this,at,"f"));let s=this.model.getClone();__classPrivateFieldSet(this,at,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{s=yield this.recognizer.export(s),this.undoRedoManager.updateModelInStack(s),this.model.modificationDate===s.modificationDate&&(this.model.exports=s.exports),i.resolve(this.model)}catch(s){__classPrivateFieldGet(this,rt,"f").error("updateModelRendering",{error:s}),i.reject(s)}}))),"QUIET_PERIOD"===__classPrivateFieldGet(this,st,"f").triggers.exportContent?__classPrivateFieldGet(this,st,"f").triggers.exportContentDelay:0),"f")}else i.resolve(this.model);return yield i.promise,this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,rt,"f").debug("updateModelRendering",this.model.exports),i.promise}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("export",{mimeTypes:i});const s=yield this.recognizer.export(this.model.getClone(),i);return this.model.modificationDate===s.modificationDate&&this.model.mergeExport(s.exports),this.undoRedoManager.updateModelInStack(s),__classPrivateFieldGet(this,rt,"f").debug("export",this.model),this.model}))}convert(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("convert",{conversionState:i,requestedMimeTypes:s});const n=yield this.recognizer.convert(this.model,i,s);return Object.assign(__classPrivateFieldGet(this,nt,"f"),n),__classPrivateFieldGet(this,rt,"f").debug("convert",this.model),this.model}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s,this.renderer.resize(this.model),this.model.rawStrokes.length?(clearTimeout(__classPrivateFieldGet(this,ot,"f")),__classPrivateFieldSet(this,ot,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){const i=yield this.recognizer.resize(this.model);n.resolve(i)}))),__classPrivateFieldGet(this,st,"f").triggers.resizeTriggerDelay),"f")):n.resolve(this.model);const a=yield n.promise;return __classPrivateFieldGet(this,rt,"f").debug("resize",{newModel:a}),this.internalEvent.emitExported(a.exports),a}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("undo"),__classPrivateFieldSet(this,nt,this.undoRedoManager.undo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldSet(this,nt,yield this.recognizer.export(__classPrivateFieldGet(this,nt,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,nt,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,nt,"f").exports),__classPrivateFieldGet(this,rt,"f").debug("undo",__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldGet(this,nt,"f")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("redo"),__classPrivateFieldSet(this,nt,this.undoRedoManager.redo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldSet(this,nt,yield this.recognizer.export(__classPrivateFieldGet(this,nt,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,nt,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,nt,"f").exports),__classPrivateFieldGet(this,rt,"f").debug("redo",__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldGet(this,nt,"f")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.renderer.drawModel(this.model),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,rt,"f").debug("clear",this.model),this.model}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),Promise.resolve()}))}}st=new WeakMap,nt=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap;class WSRecognizer{constructor(i,s){lt.set(this,LoggerManager.getLogger("RECOGNIZER")),this.pingCount=0,this.reconnectionCount=0,this.serverConfiguration=i,this.recognitionConfiguration=s;const n="https"===this.serverConfiguration.scheme?"wss":"ws";this.url=`${n}://${this.serverConfiguration.host}/api/v4.0/iink/document?applicationKey=${this.serverConfiguration.applicationKey}`,__classPrivateFieldGet(this,lt,"f").info("constructor",{serverConfig:i,recognitionConfig:s,url:this.url})}get mimeTypes(){switch(this.recognitionConfiguration.type.toLocaleLowerCase()){case"text":return this.recognitionConfiguration.text.mimeTypes;case"math":return this.recognitionConfiguration.math.mimeTypes;case"diagram":return this.recognitionConfiguration.diagram.mimeTypes;default:return[]}}get internalEvent(){return InternalEvent.getInstance()}infinitePing(){this.pingCount++,this.serverConfiguration.websocket.maxPingLostCount{this.socket.readyState<=1&&(this.socket.send(JSON.stringify({type:"ping"})),this.infinitePing())}),this.serverConfiguration.websocket.pingDelay)}openCallback(){var i;null===(i=this.connected)||void 0===i||i.resolve();const s={type:this.sessionId?"restoreIInkSession":"newContentPackage",iinkSessionId:this.sessionId,applicationKey:this.serverConfiguration.applicationKey,xDpi:96,yDpi:96,viewSizeHeight:this.viewSizeHeight,viewSizeWidth:this.viewSizeWidth};isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(s["myscript-client-name"]="iink-ts",s["myscript-client-version"]="1.0.0-buildVersion"),this.send(s)}rejectDeferredPending(i){var s,n,a,l,d,c,h,v,u,p,_,g,f,m,P,y,S,w,G,b;(null===(s=this.connected)||void 0===s?void 0:s.isPending)&&(null===(n=this.connected)||void 0===n||n.reject(i)),(null===(a=this.initialized)||void 0===a?void 0:a.isPending)&&(null===(l=this.initialized)||void 0===l||l.reject(i)),(null===(d=this.addStrokeDeferred)||void 0===d?void 0:d.isPending)&&(null===(c=this.addStrokeDeferred)||void 0===c||c.reject(i)),(null===(h=this.exportDeferred)||void 0===h?void 0:h.isPending)&&(null===(v=this.exportDeferred)||void 0===v||v.reject(i)),(null===(u=this.convertDeferred)||void 0===u?void 0:u.isPending)&&(null===(p=this.convertDeferred)||void 0===p||p.reject(i)),(null===(_=this.importDeferred)||void 0===_?void 0:_.isPending)&&(null===(g=this.importDeferred)||void 0===g||g.reject(i)),(null===(f=this.resizeDeferred)||void 0===f?void 0:f.isPending)&&(null===(m=this.resizeDeferred)||void 0===m||m.reject(i)),(null===(P=this.undoDeferred)||void 0===P?void 0:P.isPending)&&(null===(y=this.undoDeferred)||void 0===y||y.reject(i)),(null===(S=this.redoDeferred)||void 0===S?void 0:S.isPending)&&(null===(w=this.redoDeferred)||void 0===w||w.reject(i)),(null===(G=this.clearDeferred)||void 0===G?void 0:G.isPending)&&this.clearDeferred.reject(i),(null===(b=this.waitForIdleDeferred)||void 0===b?void 0:b.isPending)&&this.waitForIdleDeferred.reject(i)}closeCallback(i){let s="";if(!this.currentErrorCode)switch(i.code){case 1e3:break;case 1001:s=S.GOING_AWAY;break;case 1002:s=S.PROTOCOL_ERROR;break;case 1003:s=S.UNSUPPORTED_DATA;break;case 1006:s=S.ABNORMAL_CLOSURE;break;case 1007:s=S.INVALID_FRAME_PAULOAD;break;case 1008:s=S.POLICY_VIOLATION;break;case 1009:s=S.MESSAGE_TOO_BIG;break;case 1011:s=S.INTERNAL_ERROR;break;case 1012:s=S.SERVICE_RESTART;break;case 1013:s=S.TRY_AGAIN;break;case 1014:s=S.BAD_GATEWAY;break;case 1015:s=S.TLS_HANDSHAKE;break;default:__classPrivateFieldGet(this,lt,"f").warn("closeCallback unknow CloseEvent.code",{evt:i}),s=S.CANT_ESTABLISH}const n=new Error(s||i.reason);this.rejectDeferredPending(n),this.currentErrorCode||1e3===i.code||this.internalEvent.emitError(n)}manageHMACChallengeMessage(i){__classPrivateFieldGet(this,lt,"f").info("manageHMACChallengeMessage",{websocketMessage:i});const s=i;s.hmacChallenge&&this.send({type:"hmac",hmac:computeHmac(s.hmacChallenge,this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)}),s.iinkSessionId&&(this.sessionId=s.iinkSessionId)}manageContentPackageDescriptionMessage(){this.reconnectionCount=0,__classPrivateFieldGet(this,lt,"f").info("manageContentPackageDescriptionMessage"),this.send(Object.assign(Object.assign({},this.recognitionConfiguration),{type:"configuration"})),this.currentPartId?this.send({type:"openContentPart",id:this.currentPartId,mimeTypes:this.mimeTypes}):this.send({type:"newContentPart",contentType:this.recognitionConfiguration.type,mimeTypes:this.mimeTypes})}managePartChangeMessage(i){var s;__classPrivateFieldGet(this,lt,"f").info("managePartChangeMessage",{websocketMessage:i});const n=i;this.currentPartId=n.partId,null===(s=this.initialized)||void 0===s||s.resolve()}manageExportMessage(i){var s,n,a,l,d,c,h,v,u;__classPrivateFieldGet(this,lt,"f").info("manageExportMessage",{websocketMessage:i});const p=i;p.exports["application/vnd.myscript.jiix"]&&(p.exports["application/vnd.myscript.jiix"]=JSON.parse(p.exports["application/vnd.myscript.jiix"].toString())),null===(s=this.initialized)||void 0===s||s.resolve(),null===(n=this.addStrokeDeferred)||void 0===n||n.resolve(p.exports),null===(a=this.exportDeferred)||void 0===a||a.resolve(p.exports),null===(l=this.convertDeferred)||void 0===l||l.resolve(p.exports),null===(d=this.importDeferred)||void 0===d||d.resolve(p.exports),null===(c=this.undoDeferred)||void 0===c||c.resolve(p.exports),null===(h=this.redoDeferred)||void 0===h||h.resolve(p.exports),null===(v=this.clearDeferred)||void 0===v||v.resolve(p.exports),null===(u=this.importPointEventsDeferred)||void 0===u||u.resolve(p.exports),this.internalEvent.emitExported(p.exports)}manageWaitForIdle(){var i;return __awaiter(this,void 0,void 0,(function*(){this.internalEvent.emitIdle(!0),null===(i=this.waitForIdleDeferred)||void 0===i||i.resolve()}))}manageErrorMessage(i){var s,n;const a=i;this.currentErrorCode=(null===(s=a.data)||void 0===s?void 0:s.code)||a.code;let l=(null===(n=a.data)||void 0===n?void 0:n.message)||a.message||S.UNKNOW;switch(this.currentErrorCode){case"no.activity":l=S.NO_ACTIVITY;break;case"access.not.granted":l=S.WRONG_CREDENTIALS;break;case"session.too.old":l=S.TOO_OLD}const d=new Error(l);this.rejectDeferredPending(d),this.internalEvent.emitError(d)}manageContentChangeMessage(i){__classPrivateFieldGet(this,lt,"f").info("manageContentChangeMessage",{websocketMessage:i});const s=i,n={canRedo:s.canRedo,canUndo:s.canUndo,empty:s.empty,stackIndex:s.undoStackIndex,possibleUndoCount:s.possibleUndoCount,stack:[]};this.internalEvent.emitContextChange(n)}manageSVGPatchMessage(i){var s;__classPrivateFieldGet(this,lt,"f").info("manageSVGPatchMessage",{websocketMessage:i}),null===(s=this.resizeDeferred)||void 0===s||s.resolve();const n=i;this.internalEvent.emitSVGPatch(n)}messageCallback(i){var s;__classPrivateFieldGet(this,lt,"f").debug("messageCallback",{message:i}),this.currentErrorCode=void 0;const n=JSON.parse(i.data);if("pong"!==n.type)switch(this.pingCount=0,n.type){case"ack":this.manageHMACChallengeMessage(n);break;case"contentPackageDescription":this.manageContentPackageDescriptionMessage();break;case"partChanged":this.managePartChangeMessage(n);break;case"newPart":null===(s=this.initialized)||void 0===s||s.resolve();break;case"contentChanged":this.manageContentChangeMessage(n);break;case"exported":this.manageExportMessage(n);break;case"svgPatch":this.manageSVGPatchMessage(n);break;case"error":this.manageErrorMessage(n);break;case"idle":this.manageWaitForIdle();break;default:__classPrivateFieldGet(this,lt,"f").warn("messageCallback",`Message type unknow: "${n.type}".`)}}init(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){try{return __classPrivateFieldGet(this,lt,"f").info("init",{height:i,width:s}),this.destroy(),this.connected=new DeferredPromise,this.initialized=new DeferredPromise,this.viewSizeHeight=i,this.viewSizeWidth=s,this.pingCount=0,this.socket=new WebSocket(this.url),this.serverConfiguration.websocket.pingEnabled&&this.infinitePing(),this.socket.addEventListener("open",this.openCallback.bind(this)),this.socket.addEventListener("close",this.closeCallback.bind(this)),this.socket.addEventListener("message",this.messageCallback.bind(this)),this.initialized.promise}catch(i){const s=new Error(S.CANT_ESTABLISH);return this.internalEvent.emitError(s),null===(n=this.initialized)||void 0===n||n.reject(s),null===(a=this.initialized)||void 0===a?void 0:a.promise}}))}send(i){return __awaiter(this,void 0,void 0,(function*(){return this.connected?(yield this.connected.promise,this.socket.readyState===this.socket.OPEN?(__classPrivateFieldGet(this,lt,"f").debug("send",{message:i}),this.socket.send(JSON.stringify(i)),Promise.resolve()):this.socket.readyState!=this.socket.CONNECTING&&this.serverConfiguration.websocket.autoReconnect?(this.reconnectionCount++,this.serverConfiguration.websocket.maxRetryCount>=this.reconnectionCount?(__classPrivateFieldGet(this,lt,"f").debug("send",`try to reconnect number: ${this.reconnectionCount}.`),this.internalEvent.emitClearMessage(),yield this.init(this.viewSizeHeight,this.viewSizeWidth),yield this.setPenStyle(this.penStyle),yield this.setPenStyleClasses(this.penStyleClasses),yield this.setTheme(this.theme),this.send(i)):Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached."))):void 0):Promise.reject(new Error("Recognizer must be initilized"))}))}addStrokes(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,lt,"f").info("addStrokes",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.addStrokeDeferred=new DeferredPromise,0===i.length?this.addStrokeDeferred.resolve({}):yield this.send({type:"addStrokes",strokes:i.map(convertStrokeToJSON)}),null===(n=this.addStrokeDeferred)||void 0===n?void 0:n.promise}))}setPenStyle(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("setPenStyle",{penStyle:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyle=i;const n={type:"setPenStyle",style:Oe.penStyleToCSS(i)};return this.send(n)}))}setPenStyleClasses(i){var s;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyleClasses=i,__classPrivateFieldGet(this,lt,"f").info("setPenStyleClasses",{penStyleClasses:i});const n={type:"setPenStyleClasses",styleClasses:i};return this.send(n)}))}setTheme(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("setTheme",{theme:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.theme=i;const n={type:"setTheme",theme:Oe.themeToCSS(i)};return this.send(n)}))}export(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("export",{model:i,requestedMimeTypes:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.exportDeferred=new DeferredPromise;const l=i.getClone();let d=s||[];if(!d.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":d=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":d=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":d=["application/vnd.myscript.jiix"];break;case"TEXT":d=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}if(!d.length)return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${this.recognitionConfiguration.type} configuration`));const c={type:"export",partId:this.currentPartId,mimeTypes:d};yield this.send(c);const h=yield null===(a=this.exportDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeExport(h),__classPrivateFieldGet(this,lt,"f").debug("export",{model:l}),l}))}import(i,s,n){var a,l;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("import",{data:s,mimeType:n}),yield null===(a=this.initialized)||void 0===a?void 0:a.promise;const d=i.getClone(),c=this.serverConfiguration.websocket.fileChunkSize,h=Math.random().toString(10).substring(2,6);this.importDeferred=new DeferredPromise;const readBlob=i=>{const s=new FileReader;return new Promise(((n,a)=>{s.onloadend=i=>{var s;return n(null===(s=i.target)||void 0===s?void 0:s.result)},s.onerror=()=>a(),s.readAsText(i)}))},v={type:"importFile",importFileId:h,mimeType:n};yield this.send(v);for(let i=0;is.size};yield this.send(a)}const u=yield null===(l=this.importDeferred)||void 0===l?void 0:l.promise;return this.importDeferred=void 0,d.mergeExport(u),d}))}resize(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("resize",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.resizeDeferred=new DeferredPromise;const a=i.getClone();this.viewSizeHeight=a.height,this.viewSizeWidth=a.width;const l={type:"changeViewSize",height:this.viewSizeHeight,width:this.viewSizeWidth};return yield this.send(l),yield null===(n=this.resizeDeferred)||void 0===n?void 0:n.promise,a}))}importPointEvents(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("importPointsEvents",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.importPointEventsDeferred=new DeferredPromise;const a={type:"pointerEvents",events:i.map(convertStrokeToJSON)};this.send(a);const l=yield null===(n=this.importPointEventsDeferred)||void 0===n?void 0:n.promise;return this.importPointEventsDeferred=void 0,__classPrivateFieldGet(this,lt,"f").debug("importPointEvents",{exportPoints:l}),l}))}convert(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("convert",{model:i,conversionState:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.convertDeferred=new DeferredPromise;const l=i.getClone(),d={type:"convert",conversionState:s};yield this.send(d);const c=yield null===(a=this.convertDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeConvert(c),l.mergeExport(c),__classPrivateFieldGet(this,lt,"f").debug("convert",{model:l}),l}))}waitForIdle(){var i,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(i=this.initialized)||void 0===i?void 0:i.promise,this.waitForIdleDeferred=new DeferredPromise;return yield this.send({type:"waitForIdle"}),null===(s=this.waitForIdleDeferred)||void 0===s?void 0:s.promise}))}undo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("undo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.undoDeferred=new DeferredPromise;yield this.send({type:"undo"});const l=yield null===(n=this.undoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,lt,"f").debug("undo",{model:a}),this.undoDeferred=void 0,a}))}redo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("redo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.redoDeferred=new DeferredPromise;yield this.send({type:"redo"});const l=yield null===(n=this.redoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,lt,"f").debug("redo",{model:l}),this.redoDeferred=void 0,a}))}clear(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("clear",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();a.modificationDate=Date.now(),this.clearDeferred=new DeferredPromise;yield this.send({type:"clear"});const l=yield null===(n=this.clearDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),this.clearDeferred=void 0,__classPrivateFieldGet(this,lt,"f").info("clear",{model:a}),a}))}close(i,s){this.socket.readyState!==this.socket.OPEN&&this.socket.readyState!==this.socket.CONNECTING||(__classPrivateFieldGet(this,lt,"f").info("close",{code:i,reason:s}),this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.socket.close(i,s))}destroy(){__classPrivateFieldGet(this,lt,"f").info("destroy"),this.connected=void 0,this.initialized=void 0,this.addStrokeDeferred=void 0,this.exportDeferred=void 0,this.convertDeferred=void 0,this.importDeferred=void 0,this.resizeDeferred=void 0,this.undoDeferred=void 0,this.redoDeferred=void 0,this.clearDeferred=void 0,this.socket&&(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.close(1e3,"Recognizer destroyed"))}}lt=new WeakMap;class SVGStroker{getArcPath(i,s){return[`M ${i.x},${i.y}`,`m ${-s},0`,`a ${s},${s} 0 1 0 ${2*s},0`,`a ${s},${s} 0 1 0 ${-2*s},0`].join(" ")}getLinePath(i,s,n){const a=computeLinksPoints(i,computeAxeAngle(i,s),n),l=computeLinksPoints(s,computeAxeAngle(i,s),n);return[`M ${a[0].x},${a[0].y}`,`L ${l[0].x},${l[0].y}`,`L ${l[1].x},${l[1].y}`,`L ${a[1].x},${a[1].y}`].join(" ")}getFinalPath(i,s,n){const a=computeAxeAngle(i,s),l=computeLinksPoints(s,a,n),d=[`M ${l[0].x},${l[0].y}`];for(let i=1;i<=6;i++){const l=a-i*(Math.PI/6);d.push(`L ${s.x-s.p*n*Math.sin(l)},${s.y+s.p*n*Math.cos(l)}`)}return d.join(" ")}getQuadraticPath(i,s,n,a){const l=computeLinksPoints(i,computeAxeAngle(i,n),a),d=computeLinksPoints(s,computeAxeAngle(n,s),a),c=computeLinksPoints(n,computeAxeAngle(i,s),a);return[`M ${l[0].x},${l[0].y}`,`Q ${c[0].x},${c[0].y} ${d[0].x},${d[0].y}`,`L ${d[1].x},${d[1].y}`,`Q ${c[1].x},${c[1].y} ${l[1].x},${l[1].y}`].join(" ")}buildSVGPath(i){const s=i.pointers.length,n=i.style.width,a=s-2,l=i.pointers[0],d=[];if(s<3)d.push(this.getArcPath(l,.6*n));else{d.push(this.getArcPath(l,n*l.p)),d.push(this.getLinePath(l,computeMiddlePoint(l,i.pointers[1]),n));for(let s=0;s{a.setAttribute(i.name,i.value)}));const l=this.buildSVGPath(s);a.setAttribute("d",`${l}Z`),i.appendChild(a)}}class WSSVGRenderer{constructor(i){dt.add(this),ct.set(this,LoggerManager.getLogger("RENDERER")),__classPrivateFieldGet(this,ct,"f").info("constructor",{config:i}),this.config=i,this.stroker=new SVGStroker}init(i){__classPrivateFieldGet(this,ct,"f").info("init",{element:i}),i.style.fontSize="10px",this.context={parent:i}}updateLayer(i,s){switch(__classPrivateFieldGet(this,ct,"f").info("updateLayer",{layerName:i,update:s}),s.type){case"REPLACE_ALL":__classPrivateFieldGet(this,dt,"m",vt).call(this,i,s);break;case"REPLACE_ELEMENT":__classPrivateFieldGet(this,dt,"m",ut).call(this,s);break;case"APPEND_CHILD":__classPrivateFieldGet(this,dt,"m",pt).call(this,i,s);break;case"REMOVE_ELEMENT":__classPrivateFieldGet(this,dt,"m",gt).call(this,s);break;case"REMOVE_CHILD":__classPrivateFieldGet(this,dt,"m",_t).call(this,s);break;case"INSERT_BEFORE":__classPrivateFieldGet(this,dt,"m",ft).call(this,s);break;case"SET_ATTRIBUTE":__classPrivateFieldGet(this,dt,"m",mt).call(this,s);break;case"REMOVE_ATTRIBUTE":__classPrivateFieldGet(this,dt,"m",Pt).call(this,s);break;default:__classPrivateFieldGet(this,ct,"f").warn("updateLayer Default",{layerName:i,update:s})}}updatesLayer(i,s){__classPrivateFieldGet(this,ct,"f").info("updatesLayer",{layerName:i,updates:s}),s.forEach((s=>this.updateLayer(i,s))),this.clearPendingStroke()}clearPendingStroke(){__classPrivateFieldGet(this,ct,"f").info("clearPendingStroke",{});const i=this.context.parent.querySelector("#pendingStrokes");i&&(i.innerHTML="")}drawPendingStroke(i){if(__classPrivateFieldGet(this,ct,"f").info("drawPendingStroke",{stroke:i}),i){const s=this.context.parent.querySelector("#pendingStrokes");if(s){const n=s.querySelector(`#${null==i?void 0:i.id}`);n&&n.remove(),__classPrivateFieldGet(this,dt,"m",ht).call(this,s,i)}}}clearErasingStrokes(){this.context.parent.querySelectorAll("[type=eraser]").forEach((i=>{i.remove()}))}resize(i){__classPrivateFieldGet(this,ct,"f").info("resize",{model:i});const s=this.context.parent.getBoundingClientRect(),n=this.context.parent.querySelectorAll("svg"),a=Math.max(s.width,i.width),l=Math.max(s.height,i.height);n.forEach((i=>{i.setAttribute("viewBox",`0 0 ${a}, ${l}`),i.setAttribute("width",`${a}px`),i.setAttribute("height",`${l}px`)}))}destroy(){var i;__classPrivateFieldGet(this,ct,"f").info("destroy",{context:this.context}),(null===(i=this.context)||void 0===i?void 0:i.parent)&&this.context.parent.querySelectorAll("svg").forEach((i=>i.remove()))}}ct=new WeakMap,dt=new WeakSet,ht=function _WSSVGRenderer_drawStroke(i,s){let n;"eraser"===s.pointerType?(s.style.width=20,n="fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;"):n=`fill:${s.style.color};stroke:transparent;`,this.stroker.drawStroke(i,s,[{name:"style",value:n}])},vt=function _WSSVGRenderer_replaceAll(i,s){const n=this.context.parent.querySelector(`svg[data-layer="${i}"]`);null==n||n.remove(),this.context.parent.insertAdjacentHTML("beforeend",s.svg);const a=this.context.parent.querySelector(`svg[data-layer="${i}"]`);if("MODEL"===i){const i=document.createElementNS("http://www.w3.org/2000/svg","g");i.id="pendingStrokes",a.appendChild(i)}},ut=function _WSSVGRenderer_replaceElement(i){const s=this.context.parent.querySelector(`#${i.id}`);if(s){const n=s.parentNode;null==s||s.remove(),null==n||n.insertAdjacentHTML("beforeend",i.svg)}},pt=function _WSSVGRenderer_appendChild(i,s){const n=s.parentId?`#${s.parentId}`:`svg[data-layer="${i}"]`,a=this.context.parent.querySelector(n);null==a||a.insertAdjacentHTML("beforeend",s.svg)},_t=function _WSSVGRenderer_removeChild(i){var s;null===(s=this.context.parent.querySelector(`#${i.parentId} > *:nth-child(${i.index+1})`))||void 0===s||s.remove()},gt=function _WSSVGRenderer_removeElement(i){const s=this.context.parent.querySelector(`#${i.id}`);s&&(i.id.includes("s")||i.id.includes("MODEL")?s.remove():(s.setAttribute("class","removed-stroke"),setTimeout((()=>{null==s||s.remove()}),100)))},ft=function _WSSVGRenderer_insertBefore(i){const s=this.context.parent.querySelector(`#${i.refId}`);null==s||s.insertAdjacentHTML("beforebegin",i.svg)},mt=function _WSSVGRenderer_setAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.setAttribute(i.name,i.value)},Pt=function _WSSVGRenderer_removeAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.removeAttribute(i.name)};var St,wt,Ft,Gt,bt=Object.freeze({__proto__:null,UndoRedoContext:UndoRedoContext,UndoRedoManager:UndoRedoManager});class WSBehaviors{constructor(i){this.name="WSBehaviors",St.set(this,void 0),wt.set(this,void 0),Ft.set(this,LoggerManager.getLogger("BEHAVIORS")),Gt.set(this,void 0),this.onSVGPatch=i=>{__classPrivateFieldGet(this,Ft,"f").info("onSVGPatch",{evt:i}),this.renderer.updatesLayer(i.layer,i.updates)},__classPrivateFieldGet(this,Ft,"f").info("constructor",{options:i}),this.options=i,__classPrivateFieldSet(this,St,new Configuration(null==i?void 0:i.configuration),"f"),this.styleManager=new StyleManager(i.penStyle,i.theme),this.grabber=new PointerEventGrabber(__classPrivateFieldGet(this,St,"f").grabber),this.renderer=new WSSVGRenderer(__classPrivateFieldGet(this,St,"f").rendering),this.recognizer=new WSRecognizer(__classPrivateFieldGet(this,St,"f").server,__classPrivateFieldGet(this,St,"f").recognition),this.intention="write",__classPrivateFieldSet(this,wt,new Model,"f"),this.undoRedoManager=new UndoRedoManager(__classPrivateFieldGet(this,St,"f")["undo-redo"],this.model)}get internalEvent(){return InternalEvent.getInstance()}get model(){return __classPrivateFieldGet(this,wt,"f")}get context(){return this.undoRedoManager.context}get configuration(){return __classPrivateFieldGet(this,St,"f")}get currentPenStyle(){return this.styleManager.currentPenStyle}get penStyle(){return this.styleManager.penStyle}setPenStyle(i){return __classPrivateFieldGet(this,Ft,"f").info("setPenStyle",{penStyle:i}),this.styleManager.setPenStyle(i),__classPrivateFieldGet(this,Ft,"f").debug("setPenStyle",this.styleManager.penStyle),this.recognizer.setPenStyle(this.styleManager.penStyle)}get penStyleClasses(){return this.styleManager.penStyleClasses}setPenStyleClasses(i){return __classPrivateFieldGet(this,Ft,"f").info("setPenStyleClasses",{penClass:i}),this.styleManager.setPenStyleClasses(i),__classPrivateFieldGet(this,Ft,"f").debug("setPenStyleClasses",this.styleManager.penStyleClasses),this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)}get theme(){return this.styleManager.theme}setTheme(i){return __classPrivateFieldGet(this,Ft,"f").info("setTheme",{theme:i}),this.styleManager.setTheme(i),__classPrivateFieldGet(this,Ft,"f").debug("setTheme",this.styleManager.theme),this.recognizer.setTheme(this.styleManager.theme)}init(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("init",{domElement:i}),this.model.width=Math.max(i.clientWidth,__classPrivateFieldGet(this,St,"f").rendering.minWidth),this.model.height=Math.max(i.clientHeight,__classPrivateFieldGet(this,St,"f").rendering.minHeight),this.undoRedoManager.updateModelInStack(this.model),this.renderer.init(i),this.grabber.attach(i),this.grabber.onPointerDown=this.onPointerDown.bind(this),this.grabber.onPointerMove=this.onPointerMove.bind(this),this.grabber.onPointerUp=this.onPointerUp.bind(this),this.internalEvent.addSVGPatchListener(this.onSVGPatch),yield this.recognizer.init(this.model.height,this.model.width),yield this.setPenStyle(this.penStyle),yield this.setTheme(this.theme),yield this.setPenStyleClasses(this.penStyleClasses)}))}onPointerDown(i,s){var n;__classPrivateFieldGet(this,Ft,"f").info("onPointerDown",{intention:this.intention,evt:i,point:s});let{pointerType:a}=i;const l=Object.assign({},null===(n=this.theme)||void 0===n?void 0:n.ink,this.currentPenStyle);"erase"===this.intention&&(a="eraser"),this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,s){__classPrivateFieldGet(this,Ft,"f").info("onPointerMove",{intention:this.intention,point:s}),this.model.appendToCurrentStroke(s),this.drawCurrentStroke()}onPointerUp(i,s){return __awaiter(this,void 0,void 0,(function*(){try{__classPrivateFieldGet(this,Ft,"f").info("onPointerUp",{intention:this.intention,point:s}),this.model.endCurrentStroke(s),yield this.updateModelRendering()}catch(i){this.internalEvent.emitError(i)}}))}drawCurrentStroke(){__classPrivateFieldGet(this,Ft,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke});const i=this.model.currentStroke;i&&this.renderer.drawPendingStroke(i)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,Ft,"f").info("updateModelRendering"),"DEMAND"!==__classPrivateFieldGet(this,St,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent(),this.undoRedoManager.addModelToStack(this.model),this.renderer.clearErasingStrokes();const s=yield this.recognizer.addStrokes(i);this.model.mergeExport(s),this.undoRedoManager.updateModelInStack(this.model)}return __classPrivateFieldGet(this,Ft,"f").debug("updateModelRendering",this.model),this.model}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){return this.recognizer.waitForIdle()}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("importPointEvents",{strokes:i});const s=yield this.recognizer.importPointEvents(i);return this.model.mergeExport(s),__classPrivateFieldGet(this,Ft,"f").debug("importPointEvents",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("export",{mimeTypes:i});try{if("DEMAND"===__classPrivateFieldGet(this,St,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent();const s=yield this.recognizer.addStrokes(i);return this.model.updatePositionReceived(),this.model.mergeExport(s),__classPrivateFieldGet(this,Ft,"f").debug("export",this.model),this.model}return this.recognizer.export(this.model,i)}catch(i){return __classPrivateFieldGet(this,Ft,"f").error("export",{error:i}),this.internalEvent.emitError(i),Promise.reject(i)}}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Ft,"f").info("convert",{conversionState:i}),this.undoRedoManager.addModelToStack(this.model),this.context.stack.push(this.model.getClone()),__classPrivateFieldSet(this,wt,yield this.recognizer.convert(this.model,i),"f"),__classPrivateFieldGet(this,Ft,"f").debug("convert",this.model),this.undoRedoManager.addModelToStack(this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("import",{data:i,mimeType:s}),this.context.stack.push(this.model.getClone());const n=yield this.recognizer.import(this.model,i,s);return this.undoRedoManager.addModelToStack(n),n}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s;const a=this.model.getClone();return this.renderer.resize(a),clearTimeout(__classPrivateFieldGet(this,Gt,"f")),__classPrivateFieldSet(this,Gt,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{const i=yield this.recognizer.resize(a);n.resolve(i)}catch(a){__classPrivateFieldGet(this,Ft,"f").error("resize",{height:i,width:s,error:a}),n.reject(a)}}))),__classPrivateFieldGet(this,St,"f").triggers.resizeTriggerDelay),"f"),__classPrivateFieldSet(this,wt,yield n.promise,"f"),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,Ft,"f").debug("resize",this.model),this.model}))}undo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,Ft,"f").info("undo"),this.context.canUndo)return __classPrivateFieldSet(this,wt,this.undoRedoManager.undo(),"f"),this.recognizer.undo(this.model);throw new Error("Undo not allowed")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,Ft,"f").info("redo"),this.context.canRedo)return __classPrivateFieldSet(this,wt,this.undoRedoManager.redo(),"f"),__classPrivateFieldGet(this,Ft,"f").debug("undo",__classPrivateFieldGet(this,wt,"f")),this.recognizer.redo(this.model);throw new Error("Redo not allowed")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Ft,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.recognizer.clear(this.model)}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Ft,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),this.recognizer.destroy(),Promise.resolve()}))}}St=new WeakMap,wt=new WeakMap,Ft=new WeakMap,Gt=new WeakMap;var xt,Et,Ct,kt,Mt,Tt,Lt,It,Dt,At,Rt,Nt,Ot,Wt,zt,jt,Ht,Bt,Xt;!function styleInject(i,s){void 0===s&&(s={});var n=s.insertAt;if(i&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===n&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=i:l.appendChild(document.createTextNode(i))}}('.ms-editor {\n position: relative;\n z-index: 10;\n color: #1A9FFF;\n font-family: sans-serif;\n}\n\n.ms-editor.erasing {\n cursor: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=\') 10 10, auto;\n}\n\n.ms-editor canvas,\n.ms-editor svg {\n z-index: 20;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n\n.ms-editor canvas.ms-rendering-canvas {\n z-index: 9;\n pointer-events: none;\n background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px);\n background-size: 18px 18px;\n}\n\n.ms-editor .loader {\n z-index: 30;\n position: absolute;\n width: 120px;\n height: 120px;\n top: calc(50% - 60px);\n left: calc(50% - 60px);\n border: 16px solid #F5F6F7;\n border-radius: 50%;\n border-top-color: #1A9FFF;\n -webkit-animation: spin 2s linear infinite;\n animation: spin 2s linear infinite;\n}\n\n.ms-editor .message {\n z-index: 25;\n position: absolute;\n width: 300px;\n max-height: calc(25%);\n min-height: 200px;\n top: calc(50% - 100px);\n left: calc(50% - 150px);\n font-size: 16px;\n text-align: center;\n word-wrap: break-word;\n}\n\n.ms-editor .message.error-msg::before {\n content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo=");\n}\n\n.ms-editor .message.info-msg::before {\n content: "";\n background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");\n background-size: 100% 100%;\n display: block;\n margin: auto;\n padding-bottom: 10px;\n height: 25px;\n width: 25px;\n}\n\n.ms-editor .smartguide {\n position: absolute;\n z-index: 40;\n font-size: 16px;\n height: 48px;\n line-height: 48px;\n}\n\n.ms-editor .smartguide.smartguide-in {\n visibility: visible !important;\n transition: opacity 0.5s;\n opacity: 1;\n}\n\n.ms-editor .smartguide.smartguide-out {\n transition: opacity 1s, visibility 1s;\n visibility: hidden !important;\n opacity: 0;\n}\n\n.ms-editor .smartguide .tag-icon {\n padding: 0 18px;\n border: 1px solid #959DA6;\n font-weight: bold;\n font-size: large;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n z-index: 31;\n height: 100%;\n line-height: 48px;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n}\n\n.ms-editor .smartguide .ellipsis {\n cursor: pointer;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 31;\n height: 48px;\n line-height: 38px;\n padding: 0 8px;\n font-weight: bold;\n font-size: x-large;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .ellipsis:active {\n background-color: #e0e0e0;\n}\n\n.ms-editor .smartguide .prompter-container {\n background-color: rgba(255, 255, 255, 0.9);\n height: 48px;\n line-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n text-align: left;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 30;\n color: #bfbfbf;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .prompter-container > div > span {\n cursor: pointer;\n display: inline-block;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text {\n margin-left: 12px;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .added-word {\n animation: 0.1s linear word-added,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .modified-word {\n animation: 0.1s linear word-modified,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .candidates {\n color: black;\n flex-direction: column;\n text-align: center;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n z-index: 100;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .candidates > span {\n cursor: pointer;\n padding: 2px 20px;\n}\n\n.ms-editor .smartguide .candidates > span:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .candidates > span:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .candidates .selected-word {\n font-weight: bold;\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .more-menu {\n display: flex;\n flex-direction: column;\n margin-right: 12px;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n z-index: 100;\n box-shadow: 2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n overflow: hidden;\n transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear;\n}\n.ms-editor .smartguide .more-menu.open {\n max-height: 500px;\n visibility: visible;\n opacity: 1;\n}\n.ms-editor .smartguide .more-menu.close {\n max-height: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button {\n color: black;\n font-size: 16px;\n cursor: pointer;\n box-sizing: border-box;\n background: transparent;\n border: none;\n padding: 0 24px;\n margin: 0;\n height: 40px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .ps__rail-x {\n top: 32px !important;\n}\n\n.ms-editor #stroke-panel {\n position: fixed;\n bottom: 10px;\n left: 10px;\n right: 10px;\n background-color: white;\n border: solid black 2px;\n padding: 5px;\n word-wrap: break-word;\n overflow: auto;\n cursor: copy;\n max-height: 100px;\n z-index: 999;\n}\n\n/** Stroke **/\n\n.ms-editor .removed-stroke {\n opacity: 0;\n transition: opacity 0.1s ease-in-out;\n}\n\n.ms-editor .added-stroke {\n animation: 0.2s opacity-appear;\n}\n\n@keyframes color-input {\n 0% {\n color: black;\n }\n 100% {\n color: #bfbfbf;\n }\n}\n\n@keyframes word-added {\n 0% {\n transform: translate(5px, 0);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes word-modified {\n 0% {\n transform: translate(0, 5px);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes opacity-appear {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity : 1;\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n');Et=new WeakMap,Ct=new WeakMap,kt=new WeakMap,Mt=new WeakMap,Tt=new WeakMap,Lt=new WeakMap,jt=new WeakMap,Ht=new WeakMap,xt=new WeakSet,It=function _Editor_instantiateBehaviors(i){var s;if(this.logger.info("instantiateBehaviors",{options:i}),!(null==i?void 0:i.configuration))throw new Error("Configuration required");let n;InternalEvent.getInstance().removeAllListeners(),__classPrivateFieldGet(this,kt,"f")&&__classPrivateFieldGet(this,kt,"f").destroy(),n="REST"===(null===(s=i.configuration.server)||void 0===s?void 0:s.protocol)?new RestBehaviors(i):new WSBehaviors(i),__classPrivateFieldSet(this,kt,Object.assign(n,i.behaviors),"f"),this.logger.debug("instantiateBehaviors",__classPrivateFieldGet(this,kt,"f"))},Dt=function _Editor_initializeBehaviors(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.info("initializeBehaviors start"),__classPrivateFieldSet(this,Tt,new DeferredPromise,"f"),__classPrivateFieldGet(this,Et,"f").style.display="initial",__classPrivateFieldGet(this,xt,"m",Rt).call(this),this.logger.debug("initializeBehaviors",this.wrapperHTML),this.behaviors.init(this.wrapperHTML).then((()=>__awaiter(this,void 0,void 0,(function*(){this.logger.info("initializeBehaviors then"),this.wrapperHTML.editor=this,__classPrivateFieldGet(this,Tt,"f").resolve(),this.events.emitLoaded(),this.logger.debug("initializeBehaviors",this.wrapperHTML)})))).catch((i=>{this.logger.error("initializeBehaviors catch",{error:i}),__classPrivateFieldGet(this,Tt,"f").reject(i),__classPrivateFieldGet(this,xt,"m",Nt).call(this,i)})).finally((()=>(this.logger.info("initializeBehaviors finally",{}),__classPrivateFieldGet(this,Et,"f").style.display="none",__classPrivateFieldGet(this,Tt,"f").promise)))}))},At=function _Editor_initializeSmartGuide(){var i;if(null===(i=__classPrivateFieldGet(this,Mt,"f"))||void 0===i||i.destroy(),this.logger.info("initializeSmartGuide",{smartGuide:this.configuration.rendering.smartGuide}),this.configuration.rendering.smartGuide.enable){let i;switch(__classPrivateFieldSet(this,Mt,new SmartGuide,"f"),this.configuration.recognition.type){case"TEXT":i=this.configuration.recognition.text.margin;break;case"MATH":i=this.configuration.recognition.math.margin;break;default:this.logger.warn("initializeSmartGuide default",this.configuration.recognition.type),i={top:20,left:10,right:10,bottom:10}}__classPrivateFieldGet(this,Mt,"f").init(this.wrapperHTML,i,this.configuration.rendering)}},Rt=function _Editor_cleanMessage(){this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,Ct,"f").style.display="none",__classPrivateFieldGet(this,Ct,"f").innerHTML="",this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Ct,"f"))},Nt=function _Editor_showError(i){this.logger.debug("showError",__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,Ct,"f").style.display="initial",__classPrivateFieldGet(this,Ct,"f").classList.add("error-msg"),__classPrivateFieldGet(this,Ct,"f").classList.remove("info-msg"),__classPrivateFieldGet(this,Ct,"f").innerText=i.message,this.logger.debug("showError",__classPrivateFieldGet(this,Ct,"f"))},Ot=function _Editor_showNotif(i){this.logger.debug("showNotif",__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,Ct,"f").style.display="initial",__classPrivateFieldGet(this,Ct,"f").classList.add("info-msg"),__classPrivateFieldGet(this,Ct,"f").classList.remove("error-msg"),__classPrivateFieldGet(this,Ct,"f").innerText=i.message,setTimeout((()=>{__classPrivateFieldGet(this,xt,"m",Rt).call(this)}),i.timeout||2500),this.logger.debug("showNotif",__classPrivateFieldGet(this,Ct,"f"))},Wt=function _Editor_showStrokesIfDebug(){if(this.showStrokesPan){let i=document.getElementById("stroke-panel");const s=JSON.stringify(this.model.rawStrokes.map((i=>({pointerType:i.pointerType,pointerId:i.pointerId,pointers:i.pointers}))));i||(i=document.createElement("div"),i.id="stroke-panel",i.addEventListener("click",(s=>{s.preventDefault(),s.stopPropagation(),navigator.clipboard.writeText(null==i?void 0:i.innerText),__classPrivateFieldGet(this,xt,"m",Ot).call(this,{message:"strokes copied to clipboard!",timeout:1500})})),this.wrapperHTML.appendChild(i)),i.innerText=s}},zt=function _Editor_addListeners(){InternalEvent.getInstance().addConvertListener(this.convert.bind(this)),InternalEvent.getInstance().addClearListener(this.clear.bind(this)),InternalEvent.getInstance().addErrorListener(__classPrivateFieldGet(this,xt,"m",Nt).bind(this)),InternalEvent.getInstance().addImportJIIXListener(__classPrivateFieldGet(this,xt,"m",Xt).bind(this)),InternalEvent.getInstance().addExportedListener(__classPrivateFieldGet(this,xt,"m",Bt).bind(this)),InternalEvent.getInstance().addNotifListener(__classPrivateFieldGet(this,xt,"m",Ot).bind(this)),InternalEvent.getInstance().addClearMessageListener(__classPrivateFieldGet(this,xt,"m",Rt).bind(this)),InternalEvent.getInstance().addContextChangeListener(__classPrivateFieldGet(this,jt,"f").bind(this)),InternalEvent.getInstance().addIdleListener(__classPrivateFieldGet(this,Ht,"f").bind(this))},Bt=function _Editor_onExport(i){var s;if(this.logger.info("onExport",{exports:i}),this.model.mergeExport(i),this.configuration.rendering.smartGuide.enable&&i&&i["application/vnd.myscript.jiix"]){const n=i["application/vnd.myscript.jiix"];null===(s=__classPrivateFieldGet(this,Mt,"f"))||void 0===s||s.update(n)}__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.events.emitExported(i)},Xt=function _Editor_onImportJIIX(i){this.logger.info("onImportJIIX",{jiix:i}),this.import(new Blob([JSON.stringify(i)],{type:"application/vnd.myscript.jiix"}),"application/vnd.myscript.jiix")};var Ut=Object.freeze({__proto__:null,geometric:yt,version:$e,crypto:He,DeferredPromise:DeferredPromise,getAvailableFontList:function getAvailableFontList(i){var s,n,a;return __awaiter(this,void 0,void 0,(function*(){if(!(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&!(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host))return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!");if(!(null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.lang))return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!");const l=i.server,d=yield fetch(`${l.scheme}://${l.host}/api/v4.0/iink/font/google/language/`+i.recognition.lang),{result:c}=yield d.json();return c.sort()}))},getAvailableLanguageList:function getAvailableLanguageList(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){if((null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host)){const s=i.server;return(yield fetch(`${s.scheme}://${s.host}/api/v4.0/iink/availableLanguageList`)).json()}return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!")}))}}),$t=Object.freeze({__proto__:null,RestBehaviors:RestBehaviors,WSBehaviors:WSBehaviors}),Vt=Object.freeze({__proto__:null,RestRecognizer:RestRecognizer,WSRecognizer:WSRecognizer}),Jt=Object.freeze({__proto__:null,quadradicsUtils:De,CanvasRenderer:CanvasRenderer,CanvasStroker:CanvasStroker,canvasRendererShape:ke,canvasRendererStroke:Me,canvasRendererText:Le,SVGStroker:SVGStroker,WSSVGRenderer:WSSVGRenderer}),qt=Object.freeze({__proto__:null,PointerEventGrabber:PointerEventGrabber}),Yt=Object.freeze({__proto__:null,DefaultPenStyle:Ve,DefaultTheme:Je,StyleHelper:Oe,StyleManager:StyleManager}),Zt=Object.freeze({__proto__:null,Model:Model,Stroke:Stroke,convertStrokeToJSON:convertStrokeToJSON}),Kt=Object.freeze({__proto__:null,InternalEvent:InternalEvent,PublicEvent:PublicEvent});i.Editor=class Editor{constructor(i,s,n="ms-editor"){xt.add(this),Et.set(this,void 0),Ct.set(this,void 0),kt.set(this,void 0),Mt.set(this,void 0),Tt.set(this,void 0),Lt.set(this,void 0),this.showStrokesPan=!1,jt.set(this,(i=>{this.events.emitChanged(i)})),Ht.set(this,(i=>{this.events.emitIdle(i)})),__classPrivateFieldSet(this,Lt,Object.assign({},u,s.logger),"f"),this.logger=LoggerManager.getLogger("EDITOR"),this.logger.info("constructor",{wrapperHTML:i,options:s,globalClassCss:n}),__classPrivateFieldSet(this,Tt,new DeferredPromise,"f"),this.wrapperHTML=i,this.wrapperHTML.classList.add(n),this.events.setElement(this.wrapperHTML),__classPrivateFieldSet(this,Et,document.createElement("div"),"f"),__classPrivateFieldGet(this,Et,"f").classList.add("loader"),__classPrivateFieldGet(this,Et,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldSet(this,Ct,document.createElement("div"),"f"),__classPrivateFieldGet(this,Ct,"f").classList.add("message"),__classPrivateFieldGet(this,Ct,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,xt,"m",It).call(this,s)}get loggerConfiguration(){return __classPrivateFieldGet(this,Lt,"f")}set loggerConfiguration(i){__classPrivateFieldSet(this,Lt,i,"f"),LoggerManager.setLoggerLevel(i)}get initializationPromise(){return __classPrivateFieldGet(this,Tt,"f").promise}get model(){return this.behaviors.model}get behaviors(){return __classPrivateFieldGet(this,kt,"f")}get configuration(){return this.behaviors.configuration}set configuration(i){this.logger.info("set configuration",{configuration:i}),__classPrivateFieldGet(this,xt,"m",It).call(this,{configuration:i}),this.initialize()}get intention(){return this.behaviors.intention}set intention(i){if(this.logger.info("set intention",{m:i}),this.behaviors.intention=i,"erase"===this.behaviors.intention)this.wrapperHTML.classList.add("erasing"),this.wrapperHTML.classList.remove("selecting");else this.logger.warn("set intention default",{m:i}),document.body.style.cursor="initial",this.wrapperHTML.classList.remove("erasing"),this.wrapperHTML.classList.remove("selecting");this.logger.debug("set intention",this.wrapperHTML)}get events(){return PublicEvent.getInstance()}get context(){return this.behaviors.context}get grabber(){return this.behaviors.grabber}get currentPenStyle(){return this.behaviors.currentPenStyle}get penStyle(){return this.behaviors.penStyle}set penStyle(i){this.logger.info("set penStyle",{ps:i}),this.behaviors.setPenStyle(i)}get theme(){return this.behaviors.theme}set theme(i){this.logger.info("set theme",{t:i}),this.behaviors.setTheme(i)}get penStyleClasses(){return this.behaviors.penStyleClasses}set penStyleClasses(i){this.logger.info("set penStyleClasses",{psc:i}),this.behaviors.setPenStyleClasses(i)}initialize(){return __awaiter(this,void 0,void 0,(function*(){this.logger.info("initialize"),yield __classPrivateFieldGet(this,xt,"m",Dt).call(this),__classPrivateFieldGet(this,xt,"m",At).call(this),__classPrivateFieldGet(this,xt,"m",zt).call(this)}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){if(this.behaviors.waitForIdle)return this.behaviors.waitForIdle()}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("undo",this.model),this.logger.info("undo",{}),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.undo(),__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.logger.debug("undo",this.model),this.model}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("redo",this.model),this.logger.info("redo"),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.redo(),__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.logger.debug("redo",this.model),this.model}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("clear",this.model),this.logger.info("clear"),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.clear(),this.events.emitCleared(this.model),__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.logger.debug("clear",this.model),this.model}))}resize(){var i;return __awaiter(this,void 0,void 0,(function*(){this.logger.debug("resize",this.model),this.logger.info("resize"),yield __classPrivateFieldGet(this,Tt,"f").promise,this.configuration.rendering.smartGuide.enable&&(null===(i=__classPrivateFieldGet(this,Mt,"f"))||void 0===i||i.resize());const s=Math.max(this.wrapperHTML.clientHeight,this.configuration.rendering.minHeight),n=Math.max(this.wrapperHTML.clientWidth,this.configuration.rendering.minWidth);return yield this.behaviors.resize(s,n),this.logger.debug("resize",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("export",this.model),this.logger.info("export",{mimeTypes:i}),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.export(i),this.logger.debug("export",this.model),this.model}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("convert",this.model),this.logger.info("export",{params:i}),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.convert(null==i?void 0:i.conversionState,null==i?void 0:i.mimeTypes),this.events.emitConverted(this.model.converts),this.logger.debug("convert",this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){if(this.logger.debug("import",this.model),this.logger.info("import",{data:i,mimeType:s}),yield __classPrivateFieldGet(this,Tt,"f").promise,this.behaviors.import){let n;return n=i instanceof Blob?i:"string"==typeof i?new Blob([i]):new Blob([JSON.stringify(i)]),yield this.behaviors.import(n,s),this.events.emitImported(this.model.exports),this.logger.debug("import",this.model),this.model}return Promise.reject("Import impossible, behaviors has no import function")}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("importPointEvents",this.model),this.logger.info("importPointEvents",{strokes:i}),yield __classPrivateFieldGet(this,Tt,"f").promise,this.behaviors.importPointEvents?(yield this.behaviors.importPointEvents(i),this.events.emitImported(this.model.exports),this.logger.debug("importPointEvents",this.model),this.model):Promise.reject("Import impossible, behaviors has no importPointEvents function")}))}},i.behaviors=$t,i.configuration=y,i.constants=be,i.event=Kt,i.grabber=qt,i.logger=f,i.model=Zt,i.recognizer=Vt,i.renderer=Jt,i.smartguide=Ee,i.style=Yt,i.undoredo=bt,i.utils=Ut,Object.defineProperty(i,"__esModule",{value:!0})})); +//# sourceMappingURL=iink.min.js.map diff --git a/dist/iink.min.js.map b/dist/iink.min.js.map new file mode 100644 index 000000000..ab9362716 --- /dev/null +++ b/dist/iink.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.min.js","sources":["../node_modules/tslib/tslib.es6.mjs","../src/configuration/DefaultConfiguration.ts","../src/utils/MergeHelper.ts","../src/logger/logger.ts","../src/logger/loggerManager.ts","../src/configuration/Configuration.ts","../src/@types/configuration/LoggerConfiguration.ts","../src/Constants.ts","../src/event/PublicEvent.ts","../src/event/InternalEvent.ts","../src/smartguide/SmartGuide.ts","../src/utils/DeferredPromise.ts","../src/grabber/PointerEventGrabber.ts","../src/renderer/canvas/CanvasRendererShapeSymbol.ts","../src/renderer/canvas/CanvasRendererStrokeSymbol.ts","../src/renderer/canvas/CanvasRendererTextSymbol.ts","../src/renderer/QuadraticUtils.ts","../src/renderer/canvas/CanvasStroker.ts","../src/renderer/canvas/CanvasRenderer.ts","../node_modules/json-css/lib/jsoncss.min.js","../src/style/StyleHelper.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/x64-core.js","../node_modules/crypto-js/sha512.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/hmac-sha512.js","../src/utils/CryptoHelper.ts","../src/utils/version.ts","../src/model/Stroke.ts","../src/recognizer/RestRecognizer.ts","../src/undo-redo/UndoRedoContext.ts","../src/undo-redo/UndoRedoManager.ts","../src/style/DefaultPenStyle.ts","../src/style/DefaultTheme.ts","../src/style/StyleManager.ts","../src/utils/geometric.ts","../src/model/Model.ts","../src/behaviors/RestBehaviors.ts","../src/recognizer/WSRecognizer.ts","../src/renderer/svg/SVGStroker.ts","../src/renderer/svg/WSSVGRenderer.ts","../src/behaviors/WSBehaviors.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Editor.ts","../src/utils/font.ts","../src/utils/language.ts"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n};\n","import { TConfiguration } from \"../@types/configuration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { TLoggerConfiguration, LoggerClass, LoggerLevel } from \"../@types/configuration/LoggerConfiguration\"\n\nexport const DefaultServerConfiguration: TServerConfiguration = {\n protocol: \"WEBSOCKET\",\n scheme: \"https\",\n host: \"cloud.myscript.com\",\n applicationKey: \"\",\n hmacKey: \"\",\n version: \"2.1.0\",\n useWindowLocation: false,\n websocket: {\n pingEnabled: true,\n pingDelay: 30000,\n maxPingLostCount: 10,\n autoReconnect: true,\n maxRetryCount: 2,\n fileChunkSize: 300000\n }\n}\n\nexport const DefaultRecognitionConfiguration: TRecognitionConfiguration = {\n type: \"TEXT\",\n alwaysConnected: true,\n lang: \"en_US\",\n gesture: {\n enable: true\n },\n export: {\n \"image-resolution\": 300,\n jiix: {\n \"bounding-box\": false,\n strokes: false,\n text: {\n chars: false,\n words: true\n }\n },\n },\n renderer: {\n debug: {\n \"draw-text-boxes\": false,\n \"draw-image-boxes\": false\n }\n },\n math: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/mathml+xml\", \"application/x-latex\" ,\n solver: {\n enable: true,\n \"fractional-part-digits\": 3,\n \"decimal-separator\": \".\",\n \"rounding-mode\": \"half up\",\n \"angle-unit\": \"deg\"\n },\n margin: {\n bottom: 10,\n left: 15,\n right: 15,\n top: 10\n },\n eraser: {\n \"erase-precisely\": false\n },\n \"undo-redo\": {\n mode: \"stroke\"\n }\n },\n text: {\n guides: {\n enable: true\n },\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"text/plain\"\n margin: {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n },\n eraser: {\n \"erase-precisely\": false\n }\n },\n diagram: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n eraser: {\n \"erase-precisely\": false\n },\n convert: {\n \"match-text-size\": true\n }\n },\n \"raw-content\": {\n recognition: {\n text: true,\n shape: true\n },\n eraser: {\n \"erase-precisely\": false\n }\n }\n}\n\nexport const DefaultGrabberConfiguration: TGrabberConfiguration = {\n listenerOptions: {\n capture: false,\n passive: true\n },\n xyFloatPrecision: 0,\n timestampFloatPrecision: 0\n}\n\nexport const DefaultRenderingConfiguration: TRenderingConfiguration = {\n minHeight: 100,\n minWidth: 100,\n smartGuide: {\n enable: true,\n fadeOut: {\n enable: false,\n duration: 5000\n }\n },\n guides: {\n enable: true,\n gap: 50\n }\n}\n\nexport const DefaultTriggerConfiguration: TTriggerConfiguration = {\n exportContent: \"POINTER_UP\",\n exportContentDelay: 1000,\n resizeTriggerDelay: 100\n}\n\nexport const DefaultEventsConfiguration: TEventConfiguration = {\n processDelay: 10\n}\n\nexport const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = {\n maxStackSize: 100\n}\n\nexport const DefaultConfiguration: TConfiguration = {\n server: DefaultServerConfiguration,\n recognition: DefaultRecognitionConfiguration,\n grabber: DefaultGrabberConfiguration,\n rendering: DefaultRenderingConfiguration,\n triggers: DefaultTriggerConfiguration,\n events: DefaultEventsConfiguration,\n \"undo-redo\": DefaultUndoRedoConfiguration\n}\n\nexport const DefaultLoggerConfiguration: TLoggerConfiguration = {\n [LoggerClass.EDITOR]: LoggerLevel.ERROR,\n [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR,\n [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR,\n [LoggerClass.GRABBER]: LoggerLevel.ERROR,\n [LoggerClass.RENDERER]: LoggerLevel.ERROR,\n [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR,\n [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR,\n [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR,\n [LoggerClass.MODEL]: LoggerLevel.ERROR,\n [LoggerClass.STROKE]: LoggerLevel.ERROR,\n [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR,\n [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR,\n [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR,\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const mergeDeep = (target: any, ...sources: any[]): any =>\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isObject = (item: any) =>\n {\n return (item && typeof item === \"object\" && !Array.isArray(item))\n }\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n mergeDeep(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return mergeDeep(target, ...sources)\n }\n","import { LoggerClass, LoggerLevel } from \"../@types\"\n\nexport class Logger\n{\n instanceName: LoggerClass\n level: LoggerLevel\n\n constructor(instanceName: LoggerClass, level: LoggerLevel)\n {\n this.instanceName = instanceName\n this.level = level\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n debug(...data: any)\n {\n if (LoggerLevel.DEBUG >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.debug(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n info(...data: any)\n {\n if (LoggerLevel.INFO >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.info(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn(...data: any)\n {\n if (LoggerLevel.WARN >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.warn(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(...error: any)\n {\n const dataLog = {\n from: this.instanceName,\n error,\n }\n console.error(dataLog)\n }\n}\n","import { TLoggerConfiguration } from \"../@types\"\nimport { LoggerClass, LoggerLevel } from \"../Constants\"\nimport { Logger } from \"./logger\"\n\nexport class LoggerManager\n{\n static #loggerMap: Map = new Map()\n static getLogger(name: LoggerClass): Logger {\n if(!this.#loggerMap.has(name))\n {\n this.#loggerMap.set(name, new Logger(name, LoggerLevel.ERROR))\n }\n return this.#loggerMap.get(name) as Logger\n }\n\n static setLoggerLevel(config: TLoggerConfiguration)\n {\n\n Object.keys(config).forEach((lc) => {\n LoggerManager.getLogger(lc as LoggerClass).level = config[lc as LoggerClass]\n })\n }\n}\n","\nimport { TConfiguration, TConfigurationClient } from \"../@types/configuration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { DefaultConfiguration } from \"./DefaultConfiguration\"\nimport { mergeDeep } from \"../utils/MergeHelper\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Configuration implements TConfiguration\n{\n events: TEventConfiguration\n grabber: TGrabberConfiguration\n recognition: TRecognitionConfiguration\n rendering: TRenderingConfiguration\n server: TServerConfiguration\n triggers: TTriggerConfiguration\n \"undo-redo\": TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.CONFIGURATION)\n\n constructor(configuration?: TConfigurationClient)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events))\n this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber))\n this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition))\n this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering))\n this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server))\n this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers))\n\n this.overrideDefaultConfiguration(configuration)\n }\n\n overrideDefaultConfiguration(configuration?: TConfigurationClient): void\n {\n this.#logger.info(\"overrideDefaultConfiguration\", { configuration })\n const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration))\n this.events = mergeDeep({}, defaultConf.events, configuration?.events)\n this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber)\n this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition)\n this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering)\n this.server = mergeDeep({}, defaultConf.server, configuration?.server)\n this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers)\n this[\"undo-redo\"] = mergeDeep({}, defaultConf[\"undo-redo\"], configuration?.[\"undo-redo\"])\n\n this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes\n this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes\n this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes\n\n if (this.server?.useWindowLocation) {\n this.server.scheme = window.location.protocol.indexOf(\"s\") > -1 ? \"https\" : \"http\"\n this.server.host = window.location.host\n }\n\n if (\n this.server.protocol === \"REST\" &&\n this.triggers.exportContent === \"POINTER_UP\"\n ) {\n this.triggers.exportContent = \"QUIET_PERIOD\"\n this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50)\n }\n\n if (\n this.server.protocol === \"WEBSOCKET\" &&\n this.recognition.type === \"TEXT\"\n ) {\n if (\n this.rendering.smartGuide.enable &&\n !this.recognition.text.mimeTypes.includes(\"application/vnd.myscript.jiix\")\n ) {\n // mimeType required for smartGuide\n this.recognition.text.mimeTypes.push(\"application/vnd.myscript.jiix\")\n }\n } else {\n // smartGuide enable only on websocket text\n this.rendering.smartGuide.enable = false\n }\n this.#logger.debug(\"overrideDefaultConfiguration\", { configuration: this })\n }\n}\n","\n/**\n * @group Logger\n */\nexport const enum LoggerLevel {\n DEBUG = \"1\",\n INFO = \"2\",\n WARN = \"3\",\n ERROR = \"4\"\n }\n\n/**\n * @group Logger\n */\n export const enum LoggerClass {\n EDITOR = \"EDITOR\",\n RECOGNIZER = \"RECOGNIZER\",\n GRABBER = \"GRABBER\",\n BEHAVIORS = \"BEHAVIORS\",\n CONFIGURATION = \"CONFIGURATION\",\n PUBLIC_EVENT = \"PUBLIC_EVENT\",\n MODEL = \"MODEL\",\n RENDERER = \"RENDERER\",\n SMARTGUIDE = \"SMARTGUIDE\",\n STYLEMANAGER = \"STYLEMANAGER\",\n UNDOREDO_MANAGER = \"UNDOREDO_MANAGER\",\n STROKE = \"STROKE\",\n INTERNALEVENT = \"INTERNALEVENT\"\n }\n\n export type TLoggerConfiguration = {\n [key in keyof typeof LoggerClass]: LoggerLevel\n }\n","/**\n * @group Error\n * @remarks List all errors generated by the backend with their descriptions\n */\nexport const Error = {\n NO_ACTIVITY: \"Session closed due to no activity.\",\n WRONG_CREDENTIALS: \"Application credentials are invalid. Please check or regenerate your application key and hmackey.\",\n TOO_OLD: \"Session is too old. Max Session Duration Reached.\",\n UNKNOW: \"An unknown error has occurred.\",\n ABNORMAL_CLOSURE: \"MyScript recognition server is not reachable.\",\n CANT_ESTABLISH: \"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.\",\n GOING_AWAY: \"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.\",\n PROTOCOL_ERROR: \"MyScript recognition server terminated the connection due to a protocol error.\",\n UNSUPPORTED_DATA: \"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)\",\n INVALID_FRAME_PAULOAD: \"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).\",\n POLICY_VIOLATION: \"MyScript recognition server terminated the connection because it received a message that violates its policy.\",\n MESSAGE_TOO_BIG: \"MyScript recognition server terminated the connection because a data frame was received that is too large.\",\n INTERNAL_ERROR: \"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.\",\n SERVICE_RESTART: \"MyScript recognition server terminated the connection because it is restarting.\",\n TRY_AGAIN: \"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.\",\n BAD_GATEWAY: \"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.\",\n TLS_HANDSHAKE: \"MyScript recognition server connection was closed due to a failure to perform a TLS handshake\"\n} as const\n\n/**\n * @event\n * @remarks Lists all events that can be listened to on the editor or DOM element\n */\nexport const EventType = {\n /**\n * @event\n * event emitted when history has changed i.e. the context of undo-redo\n */\n CHANGED: \"changed\",\n /**\n * @event\n * event emitted when clearing is complete\n */\n CLEARED: \"cleared\",\n /**\n * @event\n * event emitted after the conversion is complete\n */\n CONVERTED: \"converted\",\n /**\n * @event\n * event emitted when the editor encounters an error\n */\n ERROR: \"error\",\n /**\n * @event\n * event emitted on click on pointer events\n */\n POINTEREVENTS: \"pointer_events\",\n /**\n * @event\n * event emitted after the end of the export\n */\n EXPORTED: \"exported\",\n /**\n * @event\n * event emitted after the end of the import\n */\n IMPORTED: \"imported\",\n /**\n * @event\n * event emitted when the server is idle after a job\n */\n IDLE: \"idle\",\n /**\n * @event\n * event emitted after full editor initialization\n */\n LOADED: \"loaded\",\n} as const\n\n/**\n * @event\n * @internal\n * @remarks Lists all internal library events\n */\nexport const InternalEventType = {\n SVG_PATCH: \"internal_svg_patch\",\n EXPORTED: \"internal_exported\",\n CLEAR_MESSAGE: \"internal_clear_message\",\n ERROR: \"internal_error\",\n NOTIF: \"internal_notif\",\n IMPORT_JIIX: \"internal_import_jiix\",\n CONVERT: \"internal_convert\",\n CLEAR: \"internal_clear\",\n CONTEXT_CHANGE: \"internal_context_change\",\n IDLE: \"internal_idle\",\n WS_CLOSED: \"internal_websocket_closed\",\n} as const\n\n/**\n * @group Export\n * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition}\n */\nexport const enum ExportType {\n JIIX = \"application/vnd.myscript.jiix\",\n TEXT = \"text/plain\",\n LATEX = \"application/x-latex\",\n MATHML = \"application/mathml+xml\",\n SVG = \"image/svg+xml\",\n OFFICE_DOCUMENT = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n}\n\n/**\n * @group Editor\n * @remarks List the possibilities of interactions\n */\nexport const enum Intention\n{\n Write = \"write\",\n Erase = \"erase\",\n // Selecting = \"selecting\"\n}\n\n/**\n * @group Logger\n */\nexport { LoggerClass, LoggerLevel } from \"./@types/configuration/LoggerConfiguration\"\n","import { IModel, TExport } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { EventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PublicEvent extends EventTarget\n{\n static #instance: PublicEvent\n #element?: HTMLElement\n #logger = LoggerManager.getLogger(LoggerClass.PUBLIC_EVENT)\n\n private constructor()\n {\n super()\n }\n\n public static getInstance(): PublicEvent\n {\n if (!PublicEvent.#instance) {\n PublicEvent.#instance = new PublicEvent()\n }\n\n return PublicEvent.#instance\n }\n\n setElement(el: HTMLElement)\n {\n this.#logger.info(\"setElement\", { el })\n this.#element = el\n }\n\n #emit(type: string, data?: unknown): void\n {\n const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))\n this.dispatchEvent(evt)\n this.#element?.dispatchEvent(evt)\n }\n\n emitLoaded(): void\n {\n this.#logger.info(\"emitLoaded\")\n this.#emit(EventType.LOADED)\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(EventType.EXPORTED, exports)\n }\n\n emitChanged(undoRedoContext: TUndoRedoContext): void\n {\n this.#logger.info(\"emitChanged\", { undoRedoContext })\n this.#emit(EventType.CHANGED, {\n ...undoRedoContext,\n canClear: !undoRedoContext.empty\n })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(EventType.IDLE, idle)\n }\n\n emitCleared(model?: IModel): void\n {\n this.#logger.info(\"emitCleared\", { model })\n this.#emit(EventType.CLEARED, model)\n }\n\n emitConverted(exports: TExport): void\n {\n this.#logger.info(\"emitConverted\", { exports })\n this.#emit(EventType.CONVERTED, exports)\n }\n\n emitImported(exports: TExport): void\n {\n this.#logger.info(\"emitImported\", { exports })\n this.#emit(EventType.IMPORTED, exports)\n }\n}\n","import { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { InternalEventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class InternalEvent extends EventTarget\n{\n static #instance: InternalEvent\n #abortController: AbortController\n #logger = LoggerManager.getLogger(LoggerClass.INTERNALEVENT)\n\n private constructor()\n {\n super()\n this.#logger.info(\"constructor\")\n this.#abortController = new AbortController()\n }\n\n public static getInstance(): InternalEvent\n {\n if (!InternalEvent.#instance) {\n InternalEvent.#instance = new InternalEvent()\n }\n\n return InternalEvent.#instance\n }\n\n removeAllListeners(): void\n {\n this.#logger.info(\"removeAllListeners\")\n this.#abortController.abort()\n this.#abortController = new AbortController()\n }\n\n #emit(type: string, data?: unknown): void\n {\n this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)))\n }\n\n emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void\n {\n this.#logger.info(\"emitSVGPatch\", { patchChange })\n this.#emit(InternalEventType.SVG_PATCH, patchChange)\n }\n addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void\n {\n this.#logger.info(\"addSVGPatchListener\", { callback })\n this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal })\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(InternalEventType.EXPORTED, exports)\n }\n addExportedListener(callback: (exports: TExport) => void): void\n {\n this.#logger.info(\"addExportedListener\", { callback })\n this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal })\n }\n\n emitClearMessage(): void\n {\n this.#logger.info(\"emitClearMessage\", { })\n this.#emit(InternalEventType.CLEAR_MESSAGE)\n }\n addClearMessageListener(callback: () => void): void\n {\n this.#logger.info(\"addClearMessageListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitError(err: Error): void\n {\n this.#logger.info(\"emitError\", { err })\n this.#emit(InternalEventType.ERROR, err)\n }\n\n addErrorListener(callback: (err: Error) => void): void\n {\n this.#logger.info(\"addErrorListener\", { callback })\n this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal })\n }\n\n emitWSClosed(): void\n {\n this.#logger.info(\"emitWSClosed\", { })\n this.#emit(InternalEventType.WS_CLOSED)\n }\n addWSClosedListener(callback: () => void): void\n {\n this.#logger.info(\"addWSClosedListener\", { callback })\n this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitNotif(notif: { message: string, timeout?: number }): void\n {\n this.#logger.info(\"emitWNotif\", { notif })\n this.#emit(InternalEventType.NOTIF, notif)\n }\n addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void\n {\n this.#logger.info(\"addNotifListener\", { callback })\n this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal })\n }\n\n emitImportJIIX(jiix: TJIIXExport): void\n {\n this.#logger.info(\"emitImportJIIX\", { jiix })\n this.#emit(InternalEventType.IMPORT_JIIX, jiix)\n }\n addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void\n {\n this.#logger.info(\"addImportJIIXListener\", { callback })\n this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal })\n }\n\n emitConvert(conversionState: TConverstionState = \"DIGITAL_EDIT\"): void\n {\n this.#logger.info(\"emitConvert\", { conversionState })\n this.#emit(InternalEventType.CONVERT, conversionState)\n }\n addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void\n {\n this.#logger.info(\"addConvertListener\", { callback })\n this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal })\n }\n\n emitClear(): void\n {\n this.#logger.info(\"emitClear\")\n this.#emit(InternalEventType.CLEAR)\n }\n addClearListener(callback: () => void): void\n {\n this.#logger.info(\"addClearListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitContextChange(context: TUndoRedoContext): void\n {\n this.#logger.info(\"emitContextChange\", { context })\n this.#emit(InternalEventType.CONTEXT_CHANGE, context)\n }\n addContextChangeListener(callback: (context: TUndoRedoContext) => void): void\n {\n this.#logger.info(\"addContextChangeListener\", { callback })\n this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(InternalEventType.IDLE, idle)\n }\n addIdleListener(callback: (idle: boolean) => void): void\n {\n this.#logger.info(\"addIdleListener\", { callback })\n this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal })\n }\n}\n","import { TMarginConfiguration } from \"../@types/configuration/recognition/MarginConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TJIIXExport, TWordExport } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class SmartGuide {\n uuid: string\n #smartGuideElement!: HTMLDivElement\n #prompterContainerElement!: HTMLDivElement\n #prompterTextElement!: HTMLDivElement\n #ellipsisElement!: HTMLDivElement\n #tagElement!: HTMLDivElement\n #candidatesElement!: HTMLDivElement\n #menuElement!: HTMLDivElement\n #convertElement!: HTMLButtonElement\n #copyElement!: HTMLButtonElement\n #deleteElement!: HTMLButtonElement\n #fadeOutTimout?: ReturnType\n #isMenuOpen!: boolean\n margin: TMarginConfiguration\n renderingConfiguration!: TRenderingConfiguration\n jiix?: TJIIXExport\n lastWord?: TWordExport\n wordToChange?: TWordExport\n #logger = LoggerManager.getLogger(LoggerClass.SMARTGUIDE)\n\n constructor() {\n this.#logger.info(\"constructor\", { })\n this.uuid = Math.random().toString(10).substring(2, 12)\n this.margin = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n this.#createWrapperElement()\n this.#createPrompterContainerElement()\n this.#createPrompterTextElement()\n this.#createEllipsisElement()\n this.#createTagElement()\n this.#createCandidatesElement()\n this.#createMoreMenuElement()\n this.#createConvertElement()\n this.#createCopyElement()\n this.#createDeleteElement()\n }\n\n get internalEvent(): InternalEvent {\n return InternalEvent.getInstance()\n }\n\n #createWrapperElement(): void {\n this.#smartGuideElement = document.createElement(\"div\")\n this.#smartGuideElement.id = `smartguide-${this.uuid}`\n this.#smartGuideElement.classList.add(\"smartguide\")\n }\n\n #createPrompterContainerElement(): void {\n this.#prompterContainerElement = document.createElement(\"div\")\n this.#prompterContainerElement.id = `prompter-container-${this.uuid}`\n this.#prompterContainerElement.classList.add(\"prompter-container\")\n // this.#prompterContainerElement.appendChild(textElement)\n }\n\n #createPrompterTextElement(): void {\n this.#prompterTextElement = document.createElement(\"div\")\n this.#prompterTextElement.id = `prompter-text-${this.uuid}`\n this.#prompterTextElement.classList.add(\"prompter-text\")\n this.#prompterTextElement.setAttribute(\"touch-action\", \"none\")\n }\n\n #createEllipsisElement(): void {\n this.#ellipsisElement = document.createElement(\"div\")\n this.#ellipsisElement.id = `ellipsis-${this.uuid}`\n this.#ellipsisElement.classList.add(\"ellipsis\")\n this.#ellipsisElement.innerHTML = \"...\"\n }\n\n #createTagElement(): void {\n this.#tagElement = document.createElement(\"div\")\n this.#tagElement.id = `tag-icon-${this.uuid}`\n this.#tagElement.classList.add(\"tag-icon\")\n this.#tagElement.innerHTML = \"¶\"\n }\n\n #createCandidatesElement(): void {\n this.#candidatesElement = document.createElement(\"div\")\n this.#candidatesElement.id = `candidates-${this.uuid}`\n this.#candidatesElement.classList.add(\"candidates\")\n }\n\n #createMoreMenuElement(): void {\n this.#menuElement = document.createElement(\"div\")\n this.#menuElement.id = `more-menu-${this.uuid}`\n this.#menuElement.classList.add(\"more-menu\")\n }\n\n #createConvertElement(): void {\n this.#convertElement = document.createElement(\"button\")\n this.#convertElement.id = `convert-${this.uuid}`\n this.#convertElement.classList.add(\"options-label-button\")\n this.#convertElement.innerHTML = \"Convert\"\n }\n\n #createCopyElement(): void {\n this.#copyElement = document.createElement(\"button\")\n this.#copyElement.id = `copy-${this.uuid}`\n this.#copyElement.classList.add(\"options-label-button\")\n this.#copyElement.innerHTML = \"Copy\"\n }\n\n #createDeleteElement(): void {\n this.#deleteElement = document.createElement(\"button\")\n this.#deleteElement.id = `delete-${this.uuid}`\n this.#deleteElement.classList.add(\"options-label-button\")\n this.#deleteElement.innerHTML = \"Delete\"\n }\n\n init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void {\n this.#logger.info(\"init\", { domElement, margin, renderingConfiguration })\n domElement.appendChild(this.#smartGuideElement)\n this.#smartGuideElement.appendChild(this.#tagElement)\n\n this.#prompterContainerElement.appendChild(this.#prompterTextElement)\n this.#smartGuideElement.appendChild(this.#prompterContainerElement)\n\n this.#smartGuideElement.appendChild(this.#ellipsisElement)\n\n this.#menuElement.appendChild(this.#convertElement)\n this.#menuElement.appendChild(this.#copyElement)\n this.#menuElement.appendChild(this.#deleteElement)\n this.#smartGuideElement.appendChild(this.#menuElement)\n this.#menuElement.classList.add(\"close\")\n this.#isMenuOpen = false\n\n this.#smartGuideElement.appendChild(this.#candidatesElement)\n this.#candidatesElement.style.display = \"none\"\n this.margin = margin\n this.renderingConfiguration = renderingConfiguration\n this.#addListeners()\n\n this.#show()\n if (this.renderingConfiguration.smartGuide.fadeOut.enable) {\n this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration)\n }\n\n this.resize()\n }\n\n #initFadeOutObserver(duration = 3000): void {\n const observer = new MutationObserver(() => {\n clearTimeout(this.#fadeOutTimout)\n if (\n !this.#smartGuideElement.classList.contains(\"smartguide-out\") &&\n this.#candidatesElement.style.display === \"none\" &&\n !this.#isMenuOpen\n ) {\n this.#fadeOutTimout = setTimeout(() => {\n this.#hide()\n }, duration)\n }\n })\n observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true })\n }\n\n #show(): void {\n this.#smartGuideElement.classList.remove(\"smartguide-out\")\n this.#smartGuideElement.classList.add(\"smartguide-in\")\n }\n #hide(): void {\n this.#smartGuideElement.classList.add(\"smartguide-out\")\n this.#smartGuideElement.classList.remove(\"smartguide-in\")\n }\n\n #showCandidates = (target: HTMLElement) => {\n this.#logger.info(\"showCandidates\", { target })\n const wordId = parseInt(target.id.replace(\"word-\", \"\").replace(this.uuid, \"\"))\n const words = this.jiix?.words as TWordExport[]\n this.wordToChange = words[wordId]\n if (this.wordToChange) {\n this.wordToChange.id = wordId.toString()\n this.#candidatesElement.innerHTML = \"\"\n if (this.wordToChange?.candidates) {\n this.#candidatesElement.style.display = \"flex\"\n this.wordToChange.candidates.forEach((word, index) => {\n if (this.wordToChange?.label === word) {\n this.#candidatesElement.innerHTML += `${word}`\n } else {\n this.#candidatesElement.innerHTML += `${word}`\n }\n })\n const top = 48\n const left = target.getBoundingClientRect().left - 60\n this.#candidatesElement.style.top = `${top}px`\n this.#candidatesElement.style.left = `${left}px`\n\n const parent = target.parentNode?.parentNode?.parentNode\n if (parent) {\n parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode)\n }\n }\n }\n }\n #hideCandidates(): void {\n this.#candidatesElement.style.display = \"none\"\n }\n\n #openMenu(): void {\n this.#menuElement.classList.add(\"open\")\n this.#menuElement.classList.remove(\"close\")\n this.#isMenuOpen = true\n }\n #closeMenu(): void {\n this.#menuElement.classList.add(\"close\")\n this.#menuElement.classList.remove(\"open\")\n this.#isMenuOpen = false\n }\n\n #onClickEllipsis = (evt: Event) => {\n this.#logger.info(\"onClickEllipsis\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#isMenuOpen ? this.#closeMenu() : this.#openMenu()\n this.#hideCandidates()\n }\n\n #onClickConvert = (evt: Event) => {\n this.#logger.info(\"onClickConvert\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitConvert()\n this.#closeMenu()\n }\n\n #onClickCopy = async (evt: Event): Promise => {\n this.#logger.info(\"onClickCopy\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n try {\n this.#closeMenu()\n let message = \"Nothing to copy\"\n if (this.#prompterTextElement.innerText) {\n message = `\"${this.#prompterTextElement.innerText}\" copied to clipboard`\n if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {\n const permissionName = \"clipboard-write\" as PermissionName;\n const permissionStatus = await navigator.permissions.query({ name: permissionName });\n if (permissionStatus.state === \"granted\") {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n } else {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n }\n this.internalEvent.emitNotif({ message, timeout: 1500 })\n } catch (err) {\n this.#logger.error(\"onClickCopy\", { err })\n this.internalEvent.emitError(err as Error)\n }\n }\n\n #onClickDelete = (evt: Event) => {\n this.#logger.info(\"onClickDelete\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitClear()\n this.#closeMenu()\n }\n\n #onClickCandidate = (evt: Event) => {\n this.#logger.info(\"onClickCandidate\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n const target = evt.target as HTMLElement\n const candidate = target.innerText\n if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) {\n this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate\n this.internalEvent.emitImportJIIX(this.jiix)\n }\n this.#candidatesElement.style.display = \"none\"\n }\n\n #onClickPrompter = (evt: Event): void => {\n this.#logger.info(\"onClickPrompter\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#closeMenu()\n const target = evt.target as HTMLElement\n if (target.id !== this.#prompterTextElement.id) {\n this.#showCandidates(target)\n } else {\n this.#hideCandidates()\n }\n\n }\n\n #onClickOutSide = () => {\n this.#hideCandidates()\n this.#closeMenu()\n }\n\n #addListeners(): void {\n this.#ellipsisElement.addEventListener(\"pointerdown\", this.#onClickEllipsis.bind(this))\n this.#convertElement.addEventListener(\"pointerdown\", this.#onClickConvert.bind(this))\n this.#copyElement.addEventListener(\"pointerdown\", this.#onClickCopy.bind(this))\n this.#deleteElement.addEventListener(\"pointerdown\", this.#onClickDelete.bind(this))\n this.#prompterTextElement.addEventListener(\"pointerdown\", this.#onClickPrompter.bind(this))\n this.#candidatesElement.addEventListener(\"pointerdown\", this.#onClickCandidate.bind(this))\n document.addEventListener(\"pointerdown\", this.#onClickOutSide.bind(this))\n }\n\n #removeListeners(): void {\n this.#ellipsisElement.removeEventListener(\"pointerdown\", this.#onClickEllipsis)\n this.#convertElement.removeEventListener(\"pointerdown\", this.#onClickConvert)\n this.#copyElement.removeEventListener(\"pointerdown\", this.#onClickCopy)\n this.#deleteElement.removeEventListener(\"pointerdown\", this.#onClickDelete)\n this.#prompterTextElement.removeEventListener(\"pointerdown\", this.#onClickPrompter)\n this.#candidatesElement.removeEventListener(\"pointerdown\", this.#onClickCandidate)\n document.removeEventListener(\"pointerdown\", this.#onClickOutSide)\n }\n\n resize(): void {\n this.#logger.info(\"resize\")\n const mmToPixels = 3.779527559\n const marginTop = this.margin.top * mmToPixels\n const marginLeft = this.margin.left * mmToPixels\n const marginRight = this.margin.right * mmToPixels\n // 12 is the space between line in mm\n const top = marginTop - (12 * mmToPixels)\n\n this.#smartGuideElement.style.top = `${top}px`\n this.#smartGuideElement.style.left = `${marginLeft}px`\n this.#smartGuideElement.style.right = `${marginRight}px`\n\n let left = this.#tagElement.offsetWidth\n this.#prompterContainerElement.style.marginLeft = `${left}px`\n this.#prompterContainerElement.style.width = `${this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight}px`\n left += this.#prompterContainerElement.offsetWidth\n this.#menuElement.style.left = `${left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth}px`\n this.#menuElement.style.top = `${this.#ellipsisElement.offsetHeight}px`\n this.#ellipsisElement.style.left = `${left}px`\n }\n\n update(exports: TJIIXExport): void {\n this.#logger.info(\"update\", { exports })\n this.jiix = exports\n const createWordSpan = (index: number, word?: TWordExport) => {\n const span = document.createElement(\"span\")\n span.id = `word-${index}${this.uuid}`\n if (word) {\n span.textContent = word.label\n } else {\n span.innerHTML = \" \"\n }\n this.#logger.debug(\"update\", { span })\n return span\n }\n\n const populatePrompter = () => {\n this.#logger.info(\"populatePrompter\", { })\n this.#prompterTextElement.innerHTML = \"\"\n if (this.jiix?.words) {\n const words = this.jiix.words as TWordExport[]\n const myFragment = document.createDocumentFragment()\n words.forEach((word, index) => {\n if (word.label === \" \" || word.label.includes(\"\\n\")) {\n myFragment.appendChild(createWordSpan(index))\n } else if (index !== words.length - 1) {\n myFragment.appendChild(createWordSpan(index, word))\n } else {\n this.#prompterTextElement.appendChild(myFragment)\n if (this.lastWord) {\n this.lastWord = word\n }\n const span = createWordSpan(index, word)\n // This is used to scroll to last word if last word is modified\n\n if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) {\n this.lastWord = word\n }\n if(this.wordToChange?.id === index.toString())\n {\n span.classList.add(\"modified-word\")\n this.wordToChange = undefined\n }\n else\n {\n span.classList.add(\"added-word\")\n }\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n this.#logger.debug(\"update => populatePrompter\", { span })\n this.#logger.debug(\"update => populatePrompter\", this.lastWord)\n }\n })\n }\n }\n populatePrompter()\n if (this.jiix?.words?.length) {\n this.#show()\n }\n }\n\n clear(): void {\n this.#logger.info(\"clear\")\n this.#prompterTextElement.innerHTML = \"\"\n this.#candidatesElement.innerHTML = \"\"\n this.#hide()\n }\n\n destroy(): void {\n this.#logger.info(\"destroy\")\n this.#removeListeners()\n this.#smartGuideElement.remove()\n }\n}\n","\nexport class DeferredPromise {\n promise: Promise\n resolve!: (value: T) => void\n reject!: (value: Error) => void\n\n isFullFilled: boolean\n isPending: boolean\n\n\n constructor()\n {\n this.isFullFilled = false\n this.isPending = true\n\n this.promise = new Promise((resolve, reject) =>\n {\n this.reject = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return reject(v)\n }\n this.resolve = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return resolve(v as T)\n }\n })\n }\n}\n","import { IGrabber } from \"../@types/grabber/Grabber\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PointerEventGrabber implements IGrabber\n{\n private configuration: TGrabberConfiguration\n\n private domElement!: HTMLElement\n\n private activePointerId?: number\n\n private prevent = (e: Event) => e.preventDefault()\n #logger = LoggerManager.getLogger(LoggerClass.GRABBER)\n\n onPointerDown!: (evt: PointerEvent, point: TPointer) => void\n onPointerMove!: (evt: PointerEvent, point: TPointer) => void\n onPointerUp!: (evt: PointerEvent, point: TPointer) => void\n\n constructor(configuration: TGrabberConfiguration)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.configuration = configuration\n }\n\n private roundFloat(oneFloat: number, requestedFloatPrecision: number): number\n {\n if (requestedFloatPrecision >= 0) {\n const floatPrecision: number = Math.pow(10, requestedFloatPrecision)\n return Math.round(oneFloat / floatPrecision) * floatPrecision\n }\n this.#logger.debug(\"roundFloat\", { oneFloat, requestedFloatPrecision })\n return oneFloat\n }\n\n private extractPoint(event: MouseEvent | TouchEvent): TPointer\n {\n let clientX: number, clientY: number\n if (\"changedTouches\" in event) {\n ({ clientX, clientY } = event.changedTouches[0])\n } else {\n ({ clientX, clientY } = event)\n }\n const rect: DOMRect = this.domElement.getBoundingClientRect()\n const pointer = {\n x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision),\n y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision),\n t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision),\n p: (event as PointerEvent).pressure || 1,\n }\n this.#logger.debug(\"extractPoint\", { event, pointer })\n return pointer\n }\n\n private pointerDownHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerDown\", { evt })\n // exit if not a left click or multi-touch\n if (evt.button !== 0 || evt.buttons !== 1) {\n return\n }\n\n this.activePointerId = evt.pointerId\n\n if (this.onPointerDown) {\n const point = this.extractPoint(evt)\n this.onPointerDown(evt, point)\n }\n }\n\n private pointerMoveHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerMove\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n if (this.onPointerMove) {\n const point = this.extractPoint(evt)\n this.onPointerMove(evt, point)\n }\n }\n }\n\n private pointerUpHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerUp\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n this.activePointerId = undefined\n evt.stopPropagation()\n if (this.onPointerUp) {\n const point = this.extractPoint(evt)\n this.onPointerUp(evt, point)\n }\n }\n }\n\n attach(domElement: HTMLElement)\n {\n this.#logger.info(\"attach\", { domElement })\n if (this.domElement) {\n this.detach()\n }\n this.domElement = domElement\n this.domElement.addEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement.addEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n\n this.domElement.addEventListener(\"touchmove\", this.prevent)\n\n // FIXME investigate why this is needed for iOS devices\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.addEventListener(\"pointerdown\", () => { })\n }\n\n detach()\n {\n this.#logger.info(\"detach\")\n this.domElement?.removeEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement?.removeEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"touchmove\", this.prevent)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.removeEventListener(\"pointerdown\", () => { })\n }\n}\n","\nimport { TPoint } from \"../../@types/geometry\"\nimport { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const ShapeSymbols = {\n table: \"table\",\n shape: \"shape\",\n recognizedShape: \"recognizedShape\",\n ellipse: \"ellipse\",\n line: \"line\"\n}\n\nfunction phi(angle: number): number\n{\n let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI\n if (returnedAngle < -Math.PI) {\n returnedAngle += Math.PI * 2\n }\n return returnedAngle\n}\n\nfunction drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[]\n{\n const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse\n const angleStep = 0.02 // angle delta between interpolated\n\n let z1 = Math.cos(orientation)\n let z3 = Math.sin(orientation)\n let z2 = z1\n let z4 = z3\n z1 *= maxRadius\n z2 *= minRadius\n z3 *= maxRadius\n z4 *= minRadius\n\n const n = Math.floor(Math.abs(sweepAngle) / angleStep)\n\n const boundariesPoints = []\n\n context2D.save()\n try {\n context2D.beginPath()\n\n for (let i = 0; i <= n; i++) {\n const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian\n const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius)\n\n const cosAlpha = Math.cos(alpha)\n const sinAlpha = Math.sin(alpha)\n\n // current point\n const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha)\n const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha)\n if (i === 0) {\n context2D.moveTo(x, y)\n } else {\n context2D.lineTo(x, y)\n }\n\n if (i === 0 || i === n) {\n boundariesPoints.push({ x, y })\n }\n }\n\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n\n return boundariesPoints\n}\n\nfunction drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number)\n{\n const alpha = phi(angle + (Math.PI * (7 / 8)))\n const beta = phi(angle - (Math.PI * (7 / 8)))\n context2D.save()\n try {\n context2D.fillStyle = context2D.strokeStyle\n\n context2D.moveTo(headPoint.x, headPoint.y)\n context2D.beginPath()\n context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha)))\n context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta)))\n context2D.lineTo(headPoint.x, headPoint.y)\n context2D.fill()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol)\n{\n const points = drawEllipseArc(context2D, shapeEllipse)\n\n if (shapeEllipse?.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0)\n }\n if (shapeEllipse?.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a line\n * @param {Object} context2D Current rendering context2D\n * @param {{x: Number, y: Number}} p1 Origin point\n * @param {{x: Number, y: Number}} p2 Destination point\n */\nexport function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint)\n{\n context2D.save()\n try {\n context2D.beginPath()\n context2D.moveTo(p1.x, p1.y)\n context2D.lineTo(p2.x, p2.y)\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol)\n{\n drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint)\n if (shapeLine.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0)\n }\n if (shapeLine.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a shape symbol\n * @param {Object} context2D Current rendering context2D\n * @param {Object} symbol Symbol to draw\n */\nexport function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = symbol.style.width as number\n context2D.strokeStyle = symbol.style.color as string\n\n if (symbol.elementType) {\n switch (symbol.elementType) {\n case ShapeSymbols.shape: {\n const shapeSymbol = symbol as TShapeSymbol\n drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex])\n break\n }\n case ShapeSymbols.table:{\n const tableSymbols = symbol as TShapeTableSymbol\n tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line))\n break\n }\n case ShapeSymbols.line: {\n const lineSymbol = symbol as TLineSymbol\n drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2)\n break\n }\n default:\n // logger.error(`${ symbol.elementType } not implemented`)\n break\n }\n } else {\n switch (symbol.type) {\n case ShapeSymbols.ellipse: {\n drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol)\n break\n }\n case ShapeSymbols.line: {\n drawShapeLine(context2D, symbol as TShapeLineSymbol)\n break\n }\n case ShapeSymbols.recognizedShape: {\n const recognizedShape = symbol as TShapeRecognizedSymbol\n recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive))\n break\n }\n default:\n // logger.error(`${ symbol.type } not implemented`)\n break\n }\n }\n } finally {\n context2D.restore()\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) {\n if (stroker && stroke && stroke.pointerType !== \"eraser\") {\n stroker.drawStroke(context2D, stroke)\n }\n}\n","import { TPoint } from \"../../@types/geometry\"\nimport { drawLine } from \"./CanvasRendererShapeSymbol\"\nimport { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const TextSymbols = {\n inputCharacter: \"inputCharacter\",\n char: \"char\",\n string: \"string\",\n textLine: \"textLine\"\n}\n\nfunction drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol)\n{\n const delta = data.width / label.length\n const p1: TPoint = {\n x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n const p2: TPoint = {\n x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n drawLine(context2D, p1, p2)\n}\n\nfunction drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol)\n{\n context2D.save()\n try {\n context2D.font = `${ data.textHeight }px serif`\n context2D.textAlign = (data.justificationType === \"CENTER\") ? \"center\" : \"left\"\n context2D.textBaseline = \"bottom\"\n context2D.fillStyle = context2D.strokeStyle\n context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height))\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol)\n{\n drawText(context2D, textLine.label, textLine.data)\n textLine.underlineList.forEach((underline) =>\n {\n drawUnderline(context2D, underline, textLine.label, textLine.data)\n })\n}\n\n/**\n * Draw a text symbol\n * @param {Object} context Current rendering context\n * @param {Object} symbol Symbol to draw\n */\nexport function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = (symbol.style.width as number)\n context2D.strokeStyle = (symbol.style.color as string)\n const type: string = symbol.elementType || symbol.type\n\n switch (type) {\n case TextSymbols.textLine:\n drawTextLine(context2D, symbol as TTextUnderlineSymbol)\n break\n default:\n console.info(`drawTextSymbol => ${symbol.elementType} not implemented`)\n break\n }\n\n } finally {\n context2D.restore()\n }\n}\n","import { TPoint, TPointer } from \"../@types/geometry\"\n\nexport function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]\n{\n const radius = point.p * width\n return [\n {\n x: (point.x - (Math.sin(angle) * radius)),\n y: (point.y + (Math.cos(angle) * radius))\n },\n {\n x: (point.x + (Math.sin(angle) * radius)),\n y: (point.y - (Math.cos(angle) * radius))\n }\n ]\n}\n\nexport function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer\n{\n return {\n x: ((point2.x + point1.x) / 2),\n y: ((point2.y + point1.y) / 2),\n p: ((point2.p + point1.p) / 2),\n t: ((point2.t + point1.t) / 2)\n }\n}\n\nexport function computeAxeAngle(begin: TPointer, end: TPointer): number\n{\n return Math.atan2(end.y - begin.y, end.x - begin.x)\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class CanvasStroker\n{\n\n private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void\n {\n context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true)\n }\n\n private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y)\n }\n\n private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n context2d.moveTo(linkPoints[0].x, linkPoints[0].y)\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - ((i * Math.PI) / ARCSPLIT)\n context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle)))\n }\n }\n\n private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width)\n const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y)\n }\n\n drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void\n {\n const NUMBER_POINTS = stroke.pointers.length\n const NUMBER_QUADRATICS = NUMBER_POINTS - 2\n const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth\n const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle\n const firstPoint = stroke.pointers[0] as TPointer\n\n context2d.save()\n try {\n context2d.beginPath()\n if (NUMBER_POINTS < 3) {\n this.renderArc(context2d, firstPoint, width * 0.6)\n } else {\n this.renderArc(context2d, firstPoint, width * firstPoint.p)\n const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1])\n this.renderLine(context2d, firstPoint, secondPoint, width)\n\n // Possibility to try this (the start looks better when the ink is large)\n // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]);\n // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true);\n\n for (let i = 0; i < NUMBER_QUADRATICS; i++) {\n const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const ctrl: TPointer = stroke.pointers[i + 1]\n this.renderQuadratic(context2d, begin, end, ctrl, width)\n }\n const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1])\n const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderLine(context2d, beginLine, endLine, width)\n\n const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2]\n const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderFinal(context2d, beginFinal, endFinal, width)\n }\n context2d.closePath()\n if (color !== undefined) {\n context2d.fillStyle = color\n context2d.fill()\n }\n context2d.save()\n }\n finally {\n context2d.restore()\n }\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TSymbol } from \"../../@types/renderer/Symbol\"\n\nimport { drawShapeSymbol, ShapeSymbols } from \"./CanvasRendererShapeSymbol\"\nimport { drawStroke } from \"./CanvasRendererStrokeSymbol\"\nimport { drawTextSymbol, TextSymbols } from \"./CanvasRendererTextSymbol\"\nimport { CanvasStroker } from \"./CanvasStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class CanvasRenderer\n{\n config: TRenderingConfiguration\n stroker: CanvasStroker\n context!: {\n parent: HTMLElement\n renderingCanvas: HTMLCanvasElement\n renderingCanvasContext: CanvasRenderingContext2D\n capturingCanvas: HTMLCanvasElement\n capturingCanvasContext: CanvasRenderingContext2D\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new CanvasStroker()\n }\n\n private createCanvas(type: string): HTMLCanvasElement\n {\n this.#logger.debug(\"createCanvas\", { type })\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\")\n canvas.id = type\n canvas.classList.add(type)\n canvas.classList.add(\"ms-canvas\")\n return canvas\n }\n\n private resizeContent(): void\n {\n const pixelRatio: number = window.devicePixelRatio\n const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas]\n elements.forEach((canvas) =>\n {\n const domElement = canvas.parentNode as HTMLElement\n const width = Math.max(this.config.minWidth, domElement.clientWidth)\n const height = Math.max(this.config.minHeight, domElement.clientHeight)\n canvas.width = width * pixelRatio\n canvas.height = height * pixelRatio\n canvas.getContext(\"2d\")?.scale(pixelRatio, pixelRatio)\n canvas.style.width = `${ width }px`\n canvas.style.height = `${ height }px`\n })\n }\n\n private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n {\n const type = symbol.elementType || symbol.type\n if (type === \"stroke\") {\n drawStroke(context2D, symbol as TStroke, this.stroker)\n } else if (Object.keys(TextSymbols).includes(type)) {\n drawTextSymbol(context2D, symbol)\n } else if (Object.keys(ShapeSymbols).includes(type)) {\n drawShapeSymbol(context2D, symbol)\n }\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n const renderingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-rendering-canvas\")\n element.appendChild(renderingCanvas)\n\n const capturingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-capture-canvas\")\n element.appendChild(capturingCanvas)\n\n this.context = {\n parent: element,\n renderingCanvas,\n renderingCanvasContext: renderingCanvas.getContext(\"2d\") as CanvasRenderingContext2D,\n capturingCanvas,\n capturingCanvasContext: capturingCanvas.getContext(\"2d\") as CanvasRenderingContext2D\n }\n\n this.resizeContent()\n }\n\n drawModel(model: IModel): void\n {\n this.#logger.info(\"drawModel\", { model })\n this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height)\n model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol))\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n }\n\n drawPendingStroke(stroke: TStroke | undefined): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n if (stroke && stroke?.pointerType !== \"eraser\") {\n this.stroker.drawStroke(this.context.capturingCanvasContext, stroke)\n }\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n this.resizeContent()\n this.drawModel(model)\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n if (this.context.parent) {\n this.context.parent.innerHTML = \"\"\n }\n }\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.JsonCSS=e():t.JsonCSS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=1)}([function(t,e,n){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i=function t(e){var n=this;o(this,t),this.toJSON=function(t){if(\"string\"!=typeof t)return console.error(\"Need a CSS string but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid CSS..!\";var e={},o=void 0,i=void 0,u=void 0;try{t.split(\"{\").forEach(function(t){if(i=t.trim())if(-1===i.indexOf(\"}\"))e[i]={},o=i;else{i.substring(0,i.indexOf(\"}\")).split(\";\").forEach(function(t){(u=t.split(\":\"))&&2===u.length&&(e[o][u[0].trim().replace(/^\\\"|\\\"$/g,\"\")]=n._trimSemiColon(u[1].trim().replace(/^\\\"|\\\"$/g,\"\")))});try{o=i.split(\"}\")[1].trim(),o&&(e[o]={})}catch(t){}}})}catch(t){return\"Not a valid CSS..!\"}return e},this.toCSS=function(t){if(\"object\"!==(void 0===t?\"undefined\":r(t)))return console.error(\"Need a JSON object but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid JSON..!\";var e=\"\";try{for(var n in t)if(t.hasOwnProperty(n)){e+=n+\" {\\n\";for(var o in t[n])t[n].hasOwnProperty(o)&&(e+=o+\": \"+t[n][o]+\";\\n\");e+=\"}\\n\"}}catch(t){return\"Not a valid JSON..!\"}return e},this._trimSemiColon=function(t){return\";\"===t.slice(-1)?t.slice(0,n.length-1):t}};e.default=i},function(t,e,n){\"use strict\";t.exports=n(0).default}])});","import JsonCSS from \"json-css\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parser: any = new JsonCSS()\n\nexport const StyleHelper = {\n themeToCSS(json: TTheme): string\n {\n return parser.toCSS(json) as string\n // css = css.replace( /[\\r\\n]+/gm, \"\" )\n // return css\n },\n themeToJSON(style: string): TTheme\n {\n const theme = parser.toJSON(style) as TTheme\n theme[\".text\"][\"font-size\"] = Number(theme[\".text\"][\"font-size\"])\n theme.ink[\"-myscript-pen-width\"] = Number(theme.ink[\"-myscript-pen-width\"])\n theme.ink.width = Number(theme.ink.width)\n return theme\n },\n penStyleToCSS (penStyle: TPenStyle): string {\n let css = parser.toCSS({ css: penStyle }) as string\n css = css.substring(6, css.length - 3)\n return css\n },\n penStyleToJSON (penStyleString: string): TPenStyle {\n const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle\n if (penStyle.width) {\n penStyle.width = Number(penStyle.width)\n } else {\n delete penStyle.width\n }\n if (penStyle[\"-myscript-pen-width\"]) {\n penStyle[\"-myscript-pen-width\"] = Number(penStyle[\"-myscript-pen-width\"])\n } else {\n delete penStyle[\"-myscript-pen-width\"]\n }\n return penStyle\n },\n\n stringToJSON(style: string): {[key: string]: string}\n {\n return parser.toJSON(`css {${style}}`).css\n },\n JSONToString(style: {[key: string]: string}): string\n {\n return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(\";\")\n }\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA512;\n\n}));","import Hex from \"crypto-js/enc-hex\"\nimport HmacSHA512 from \"crypto-js/hmac-sha512\"\n\nexport function computeHmac (message: string, applicationKey: string, hmacKey: string): string {\n const hmac = new HmacSHA512(message, applicationKey + hmacKey)\n return hmac.toString(Hex) as string\n}\n","\nexport const isVersionSuperiorOrEqual = (source: string, target: string): boolean =>\n{\n const sourceParts = source.split(\".\")\n const targetParts = target.split(\".\")\n\n for (let i = 0; i < targetParts.length; i++) {\n const a = Number(targetParts[i])\n const b = Number(sourceParts[i])\n if (a > b) return false\n if (a < b) return true\n }\n return true\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TStroke, TStrokeJSON } from \"../@types/model/Stroke\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Stroke implements TStroke\n{\n id: string\n type: string\n pointerId: number\n pointerType: string\n elementType?: string\n pointers: TPointer[]\n length: number\n style: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STROKE)\n\n constructor(style: TPenStyle, pointerId: number, pointerType = \"pen\")\n {\n this.#logger.info(\"constructor\", { style, pointerId, pointerType })\n this.id = `${pointerType}-${Date.now().toString()}`\n this.type = \"stroke\"\n this.pointerId = pointerId\n this.pointerType = pointerType\n this.pointers = []\n this.length = 0\n this.style = style\n }\n}\n\nexport function convertStrokeToJSON(stroke: TStroke): TStrokeJSON\n{\n const json: TStrokeJSON = {\n id: stroke.id,\n pointerType: stroke.pointerType,\n p: [],\n t: [],\n x: [],\n y: []\n }\n stroke.pointers.forEach(p => {\n json.p.push(p.p)\n json.t.push(p.t)\n json.x.push(p.x)\n json.y.push(p.y)\n })\n return json\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TRestPostConfiguration, TRestPostData } from \"../@types/recognizer/RestRecognizer\"\nimport { TStrokeGroup, TStrokeGroupJSON } from \"../@types/model/Stroke\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\ntype ApiError = {\n code?: string\n message: string\n}\n\nexport class RestRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig })\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n }\n\n get url()\n {\n return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch`\n }\n\n get postConfig(): TRestPostConfiguration\n {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n return {\n lang: this.recognitionConfiguration.lang,\n diagram: this.recognitionConfiguration.diagram,\n export: this.recognitionConfiguration.export\n }\n case \"MATH\":\n return {\n lang: this.recognitionConfiguration.lang,\n math: this.recognitionConfiguration.math,\n export: this.recognitionConfiguration.export\n }\n case \"Raw Content\":\n return {\n lang: this.recognitionConfiguration.lang,\n \"raw-content\": this.recognitionConfiguration[\"raw-content\"],\n export: this.recognitionConfiguration.export\n }\n case \"TEXT\":\n return {\n lang: this.recognitionConfiguration.lang,\n text: this.recognitionConfiguration.text,\n export: this.recognitionConfiguration.export\n }\n default:\n throw new Error(`get postConfig error Recognition type unkow \"${ this.recognitionConfiguration.type }\"`)\n break\n }\n }\n\n private buildData(model: IModel): TRestPostData\n {\n this.#logger.info(\"buildData\", { model })\n const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) =>\n {\n return ps1 && ps2 && ps1[\"-myscript-pen-fill-color\"] === ps2[\"-myscript-pen-fill-color\"] &&\n ps1[\"-myscript-pen-fill-style\"] === ps2[\"-myscript-pen-fill-style\"] &&\n ps1[\"-myscript-pen-width\"] === ps2[\"-myscript-pen-width\"] &&\n ps1.color === ps2.color &&\n ps1.width === ps2.width\n }\n\n const strokeGroupByPenStyle: TStrokeGroup[] = []\n model.rawStrokes.forEach((s) => {\n const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style))\n if (groupIndex > -1) {\n strokeGroupByPenStyle[groupIndex].strokes.push(s)\n } else {\n strokeGroupByPenStyle.push({\n penStyle: s.style,\n strokes: [s]\n })\n }\n })\n\n const strokeGroupsToSend: TStrokeGroupJSON[] = []\n strokeGroupByPenStyle.forEach((group: TStrokeGroup) =>\n {\n const newPenStyle = JSON.stringify(group.penStyle) === \"{}\" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle)\n const newGroup = {\n penStyle: newPenStyle,\n strokes: group.strokes.map(convertStrokeToJSON)\n }\n strokeGroupsToSend.push(newGroup)\n })\n\n const contentType: string = this.recognitionConfiguration.type === \"Raw Content\" ?\n \"Raw Content\" :\n this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase()\n\n const data = {\n configuration: this.postConfig,\n xDPI: 96,\n yDPI: 96,\n contentType,\n // theme: StyleHelper.themeToCSS(),\n height: model.height,\n width: model.width,\n strokeGroups: strokeGroupsToSend\n }\n this.#logger.debug(\"buildData\", { data })\n return data\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async post(data: any, mimeType: string): Promise\n {\n this.#logger.info(\"post\", { data, mimeType })\n const headers = new Headers()\n headers.append(\"Accept\", \"application/json,\" + mimeType)\n headers.append(\"applicationKey\", this.serverConfiguration.applicationKey)\n headers.append(\"hmac\", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey))\n headers.append(\"Content-Type\", \"application/json\")\n\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n headers.append(\"myscript-client-name\", \"iink-ts\")\n headers.append(\"myscript-client-version\", \"1.0.0-buildVersion\")\n }\n\n const reqInit: RequestInit = {\n method: \"POST\",\n headers,\n body: JSON.stringify(data)\n }\n const request = new Request(this.url, reqInit)\n const response: Response = await fetch(request)\n if (response.ok) {\n const contentType = response.headers.get(\"content-type\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any\n switch (contentType) {\n case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n case \"image/png\":\n case \"image/jpeg\":\n result = await response.blob()\n break\n case \"application/json\":\n result = await response.json()\n break\n case \"application/vnd.myscript.jiix\":\n result = await response.clone().json().catch(async () => await response.text())\n break\n default:\n this.#logger.warn(\"post default\", { contentType })\n result = await response.text()\n break\n }\n this.#logger.debug(\"post\", { result })\n return result\n } else {\n const err = await response.json() as ApiError\n this.#logger.error(\"post\", { err })\n throw err\n }\n }\n\n private async tryFetch(data: unknown, mimeType: string): Promise\n {\n this.#logger.debug(\"tryFetch\", { data, mimeType })\n return this.post(data, mimeType)\n .then((res) =>\n {\n const exports: TExport = {}\n exports[mimeType] = res as TJIIXExport | string | Blob\n this.#logger.debug(\"tryFetch\", { exports })\n return exports\n })\n .catch((err) =>\n {\n this.#logger.error(\"tryFetch\", { data, mimeType, err })\n let message = err.message || ErrorConst.UNKNOW\n if (!err.code) {\n message = ErrorConst.CANT_ESTABLISH\n } else if (err.code === \"access.not.granted\") {\n message = ErrorConst.WRONG_CREDENTIALS\n }\n const error = new Error(message)\n throw error\n })\n }\n\n private getMimeTypes(requestedMimeTypes?: string[]): string[]\n {\n this.#logger.info(\"getMimeTypes\", { requestedMimeTypes })\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n break\n }\n }\n return mimeTypes\n }\n\n async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState, requestedMimeTypes })\n const myModel = model.getClone()\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n const dataToConcert = this.buildData(myModel)\n dataToConcert.conversionState = conversionState\n const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt))\n const converts: TExport[] = await Promise.all(promises)\n converts.forEach(c =>\n {\n myModel.mergeConvert(c)\n })\n this.#logger.debug(\"convert\", { model: myModel })\n return myModel\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n const myModel = model.getClone()\n if (myModel.rawStrokes.length === 0) {\n return Promise.resolve(myModel)\n }\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n if (!mimeTypes.length) {\n this.#logger.error(\"export\", { model, requestedMimeTypes, \"Export failed, no mimeTypes define in recognition configuration\": String })\n return Promise.reject(new Error(\"Export failed, no mimeTypes define in recognition configuration\"))\n }\n const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m])\n const data = this.buildData(model)\n const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType)))\n exports.forEach(e =>\n {\n myModel.mergeExport(e)\n })\n this.#logger.debug(\"export\", { model: myModel })\n return myModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n return this.export(model)\n }\n\n}\n","import { IModel } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\n\nexport class UndoRedoContext implements TUndoRedoContext\n{\n canUndo: boolean\n canRedo: boolean\n empty: boolean\n stackIndex: number\n possibleUndoCount: number\n stack: IModel[]\n\n constructor(model: IModel)\n {\n this.stackIndex = 0\n this.possibleUndoCount = 0\n this.canRedo = false\n this.canUndo = false\n this.empty = true\n this.stack = [model.getClone()]\n }\n}\n","import { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { IModel } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { UndoRedoContext } from \"./UndoRedoContext\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class UndoRedoManager\n{\n context: UndoRedoContext\n configuration: TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.UNDOREDO_MANAGER)\n\n constructor(configuration: TUndoRedoConfiguration, model: IModel)\n {\n this.#logger.info(\"constructor\", { configuration, model })\n this.configuration = configuration\n this.context = new UndoRedoContext(model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n private updateCanUndoRedo(): void\n {\n this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex\n this.context.canUndo = this.context.stackIndex > 0\n const currentModel = this.context.stack[this.context.stackIndex]\n this.context.empty = currentModel.rawStrokes.length === 0\n }\n\n addModelToStack(model: IModel): void\n {\n this.#logger.info(\"addModelToStack\", { model })\n if (this.context.stackIndex + 1 < this.context.stack.length) {\n this.context.stack.splice(this.context.stackIndex + 1)\n }\n\n this.context.stack.push(model.getClone())\n this.context.stackIndex = this.context.stack.length - 1\n\n if (this.context.stack.length > this.configuration.maxStackSize) {\n this.context.stack.shift()\n this.context.stackIndex--\n }\n\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n\n removeLastModelInStack(): void\n {\n this.#logger.info(\"removeLastModelInStack\")\n if (this.context.stackIndex === this.context.stack.length - 1) {\n this.context.stackIndex--\n }\n this.context.stack.pop()\n this.updateCanUndoRedo()\n }\n\n updateModelInStack(model: IModel): void\n {\n this.#logger.info(\"updateModelInStack\", { model })\n const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate)\n if (index > -1) {\n this.context.stack.splice(index, 1, model.getClone())\n }\n this.internalEvent.emitContextChange(this.context)\n }\n\n undo(): IModel\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.context.stackIndex--\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const previousModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"undo\", previousModel)\n return previousModel\n }\n\n redo(): IModel\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.context.stackIndex++\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const nextModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"redo\", nextModel)\n return nextModel\n }\n\n reset(model: IModel): void\n {\n this.#logger.info(\"reset\", { model })\n this.context = new UndoRedoContext(model)\n this.internalEvent.emitContextChange(this.context)\n }\n\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\n\nexport const DefaultPenStyle: TPenStyle = {}","import { TTheme } from \"../@types/style/Theme\"\n\nexport const DefaultTheme: TTheme = {\n ink: {\n color: \"#000000\",\n width: 1,\n \"-myscript-pen-width\": 1,\n \"-myscript-pen-fill-style\": \"none\",\n \"-myscript-pen-fill-color\": \"#FFFFFF00\"\n },\n \".math\": {\n \"font-family\": \"STIXGeneral\"\n },\n \".math-solved\": {\n \"font-family\": \"STIXGeneral\",\n color: \"#A8A8A8FF\"\n },\n \".text\": {\n \"font-family\": \"MyScriptInter\",\n \"font-size\": 10\n }\n}\n","import { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nimport { DefaultPenStyle } from \"./DefaultPenStyle\"\nimport { DefaultTheme } from \"./DefaultTheme\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class StyleManager\n{\n #penStyle!: TPenStyle\n #theme!: TTheme\n #penStyleClasses!: string\n #currentPenStyle!: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STYLEMANAGER)\n\n constructor(penStyle?: TPenStyle, theme?: TTheme)\n {\n this.#logger.info(\"constructor\", { penStyle, theme })\n this.setTheme(theme)\n this.setPenStyleClasses()\n this.setPenStyle(penStyle)\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.#currentPenStyle || this.#penStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.#penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), style || {}) as TPenStyle\n this.#currentPenStyle = style || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyle\", this.#currentPenStyle)\n }\n\n get theme(): TTheme\n {\n return this.#theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.#theme = mergeDeep(structuredClone(DefaultTheme), theme || {}) as TTheme\n this.#logger.debug(\"setTheme\", this.#theme)\n }\n\n get penStyleClasses(): string\n {\n return this.#penStyleClasses\n }\n setPenStyleClasses(penStyleClass = \"\")\n {\n this.#logger.info(\"setPenStyleClasses\", { penStyleClass })\n this.#penStyleClasses = penStyleClass\n this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyleClasses\", this.#currentPenStyle)\n }\n\n}\n","import { TPoint } from \"../@types/geometry\"\n\nexport function computeDistance(p1: TPoint, p2: TPoint): number\n{\n const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x)\n return isNaN(distance) ? 0 : distance\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPoint, TPointer } from \"../@types/geometry\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TRecognitionPositions } from \"../@types/model/RecognitionPositions\"\n\nimport { computeDistance } from \"../utils/geometric\"\nimport { Stroke } from \"./Stroke\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Model implements IModel\n{\n readonly creationTime: number\n modificationDate: number\n currentStroke?: TStroke\n positions: TRecognitionPositions\n rawStrokes: TStroke[]\n selectedStrokes: TStroke[]\n exports?: TExport\n converts?: TExport\n width: number\n height: number\n idle: boolean\n #logger = LoggerManager.getLogger(LoggerClass.MODEL)\n\n constructor(width = 100, height = 100, creationDate: number = Date.now())\n {\n this.#logger.info(\"constructor\", { width, height, creationDate })\n this.creationTime = creationDate\n this.modificationDate = creationDate\n this.width = width\n this.height = height\n this.rawStrokes = []\n this.selectedStrokes = []\n this.positions = {\n lastSentPosition: 0,\n lastReceivedPosition: 0\n }\n this.idle = true\n }\n\n mergeExport(exports: TExport)\n {\n this.#logger.info(\"mergeExport\", { exports })\n if (this.exports) {\n Object.assign(this.exports, exports)\n } else {\n this.exports = exports\n }\n this.#logger.debug(\"mergeExport\", this.exports)\n }\n\n mergeConvert(converts: TExport)\n {\n this.#logger.info(\"mergeConvert\", { converts })\n if (this.converts) {\n Object.assign(this.converts, converts)\n } else {\n this.converts = converts\n }\n this.#logger.debug(\"mergeConvert\", this.converts)\n }\n\n private computePressure(distance: number, globalDistance: number): number\n {\n let ratio = 1.0\n if (globalDistance === 0) {\n ratio = 0.5\n } else if (distance === globalDistance) {\n ratio = 1.0\n } else if (distance < 10) {\n ratio = 0.2 + Math.pow(0.1 * distance, 0.4)\n } else if (distance > globalDistance - 10) {\n ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4)\n }\n const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance)))\n return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100\n }\n\n private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean\n {\n const delta: number = (2 + ((stroke.style[\"-myscript-pen-width\"] || 0) / 4))\n return !lastPointer ||\n stroke.pointers.length === 0 ||\n Math.abs(lastPointer.x - point.x) >= delta ||\n Math.abs(lastPointer.y - point.y) >= delta\n }\n\n addPoint(stroke: TStroke, pointer: TPointer): void\n {\n this.#logger.debug(\"addPoint\", { stroke, pointer })\n const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 }\n if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) {\n const distance = computeDistance(pointer, lastPointer)\n stroke.length += distance\n pointer.p = this.computePressure(distance, stroke.length)\n stroke.pointers.push(pointer)\n }\n }\n\n addStroke(stroke: TStroke): void\n {\n this.#logger.info(\"addStroke\", { stroke })\n this.rawStrokes.push(stroke)\n }\n\n extractUnsentStrokes(): TStroke[]\n {\n return this.rawStrokes.slice(this.positions.lastSentPosition)\n }\n\n initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void\n {\n this.#logger.info(\"initCurrentStroke\", { point, pointerId, pointerType, style, dpi })\n if (style[\"-myscript-pen-width\"]) {\n const pxWidth = (style[\"-myscript-pen-width\"] * dpi) / 25.4\n style.width = pxWidth / 2\n }\n this.modificationDate = Date.now()\n this.exports = undefined\n this.converts = undefined\n this.currentStroke = new Stroke(style, pointerId, pointerType)\n this.#logger.debug(\"initCurrentStroke\", this.currentStroke)\n this.addPoint(this.currentStroke, point)\n }\n\n appendToCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"appendToCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n }\n this.#logger.debug(\"appendToCurrentStroke\", this.currentStroke)\n }\n\n endCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"endCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n this.addStroke(this.currentStroke)\n this.currentStroke = undefined\n }\n this.#logger.debug(\"endCurrentStroke\", this.currentStroke)\n }\n\n #getStrokeFromPoint(point: TPoint): TStroke[]\n {\n this.#logger.info(\"getStrokeFromPoint\", { point })\n const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max)\n\n const _strokeList: TStroke[] = []\n this.rawStrokes.forEach((stroke) =>\n {\n for (let i = 0; i < stroke.pointers.length; i++) {\n const strokePointer = stroke.pointers[i]\n if (\n isBetween(strokePointer.x, point.x - 5, point.x + 5) &&\n isBetween(strokePointer.y, point.y - 5, point.y + 5)\n ) {\n _strokeList.push(stroke)\n break\n }\n else {\n if (computeDistance(point, strokePointer) < 10) {\n _strokeList.push(stroke)\n break\n }\n }\n }\n })\n this.#logger.debug(\"getStrokeFromPoint\", { strokes: _strokeList })\n return _strokeList\n }\n\n resetSelectedStrokes(): void\n {\n this.selectedStrokes = []\n }\n\n appendSelectedStrokesFromPoint(point: TPoint): void\n {\n this.#logger.info(\"appendSelectedStrokesFromPoint\", { point })\n this.#getStrokeFromPoint(point)\n .forEach(s =>\n {\n if (!this.selectedStrokes.includes(s)) {\n this.selectedStrokes.push(s)\n }\n })\n }\n\n updateStroke(updatedStroke: TStroke): void\n {\n this.#logger.info(\"updateStroke\", { updatedStroke })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1, updatedStroke)\n }\n this.#logger.debug(\"updateStroke\", this.rawStrokes)\n }\n\n removeStroke(id: string): void\n {\n this.#logger.info(\"removeStroke\", { id })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1)\n }\n this.#logger.debug(\"removeStroke\", this.rawStrokes)\n }\n\n removeStrokesFromPoint(point: TPoint): string[]\n {\n this.#logger.info(\"removeStrokesFromPoint\", { point })\n const strokes = this.#getStrokeFromPoint(point)\n strokes.forEach(strokeToRemove =>\n {\n this.removeStroke(strokeToRemove.id)\n })\n this.#logger.debug(\"removeStrokesFromPoint\", strokes.map(s => s.id))\n return strokes.map(s => s.id)\n }\n\n updatePositionSent(position: number = this.rawStrokes.length): void\n {\n this.#logger.info(\"updatePositionSent\", { position })\n this.positions.lastSentPosition = position\n this.#logger.debug(\"updatePositionSent\", this.positions.lastSentPosition)\n }\n\n updatePositionReceived(): void\n {\n this.#logger.info(\"updatePositionReceived\")\n this.positions.lastReceivedPosition = this.positions.lastSentPosition\n this.#logger.debug(\"updatePositionReceived\", this.positions.lastReceivedPosition)\n }\n\n getClone(): IModel\n {\n this.#logger.info(\"getClone\")\n const clonedModel = new Model(this.width, this.height, this.creationTime)\n clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate))\n clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined\n clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes))\n clonedModel.positions = JSON.parse(JSON.stringify(this.positions))\n clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined\n clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined\n clonedModel.idle = this.idle\n this.#logger.debug(\"getClone\", { clonedModel })\n return clonedModel\n }\n\n clear(): void\n {\n this.#logger.info(\"clear\")\n this.modificationDate = Date.now()\n this.currentStroke = undefined\n this.rawStrokes = []\n this.positions.lastSentPosition = 0\n this.positions.lastReceivedPosition = 0\n this.exports = undefined\n this.converts = undefined\n this.idle = true\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { CanvasRenderer } from \"../renderer/canvas/CanvasRenderer\"\nimport { RestRecognizer } from \"../recognizer/RestRecognizer\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { UndoRedoManager } from \"../undo-redo/UndoRedoManager\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { Intention, LoggerClass } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\n\nexport class RestBehaviors implements IBehaviors\n{\n name = \"RestBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: CanvasRenderer\n recognizer: RestRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n #exportTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new CanvasRenderer(this.#configuration.rendering)\n this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.styleManager.setPenStyle(style)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string)\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n const { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(model => Object.assign(this.model, model))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerDown intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerMove intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n break\n default:\n this.#logger.warn(`onPointerUp intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n this.renderer.drawPendingStroke(this.model.currentStroke)\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n this.renderer.drawModel(this.model)\n const deferred = new DeferredPromise()\n this.undoRedoManager.addModelToStack(this.model)\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n clearTimeout(this.#exportTimer)\n let currentModel = this.model.getClone()\n this.#exportTimer = setTimeout(async () =>\n {\n try {\n currentModel = await this.recognizer.export(currentModel)\n this.undoRedoManager.updateModelInStack(currentModel)\n if (this.model.modificationDate === currentModel.modificationDate) {\n this.model.exports = currentModel.exports\n }\n deferred.resolve(this.model)\n } catch (error) {\n this.#logger.error(\"updateModelRendering\", { error })\n deferred.reject(error as Error)\n }\n }, this.#configuration.triggers.exportContent === \"QUIET_PERIOD\" ? this.#configuration.triggers.exportContentDelay : 0)\n } else {\n deferred.resolve(this.model)\n }\n await deferred.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"updateModelRendering\", this.model.exports)\n return deferred.promise\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes)\n if (this.model.modificationDate === newModel.modificationDate) {\n this.model.mergeExport(newModel.exports as TExport)\n }\n this.undoRedoManager.updateModelInStack(newModel)\n this.#logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { conversionState, requestedMimeTypes })\n const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes)\n Object.assign(this.#model, newModel)\n this.#logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n this.renderer.resize(this.model)\n if (this.model.rawStrokes.length) {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n const resizeModel = await this.recognizer.resize(this.model)\n deferredResize.resolve(resizeModel)\n }, this.#configuration.triggers.resizeTriggerDelay)\n } else {\n deferredResize.resolve(this.model)\n }\n const newModel = await deferredResize.promise\n this.#logger.debug(\"resize\", { newModel })\n this.internalEvent.emitExported(newModel.exports as TExport)\n return newModel\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n this.#model = this.undoRedoManager.undo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"undo\", this.#model)\n return this.#model\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n this.#model = this.undoRedoManager.redo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"redo\", this.#model)\n return this.#model\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.drawModel(this.model)\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n return Promise.resolve()\n }\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { LoggerClass } from \"../@types/configuration/LoggerConfiguration\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\nimport { LoggerManager } from \"../logger\"\n\n/**\n * A websocket dialog have this sequence :\n * --------------------------- Client --------------------------------------------------- Server ----------------------------------\n * init: send newContentPackage or restoreIInkSession ==================>\n * <================== hmacChallenge\n * answer hmacChallenge: send the hmac ==================>\n * <================== contentPackageDescription\n * answer contentPackageDescription:\n * send the configuration ==================>\n * send newContentPart or openContentPart ==================>\n * <================== partChanged\n * <================== contentChanged\n * <================== newPart\n * <================== svgPatch\n *\n * setPenStyle (send the parameters) ==================>\n * setTheme (send the parameters) ==================>\n * setPenStyleClasses (send the parameters) ==================>\n * <================== svgPatch\n * addStrokes (send the strokes ) ============>\n * <================== update\n */\nexport class WSRecognizer implements IRecognizer\n{\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n protected socket!: WebSocket\n protected pingCount = 0\n protected reconnectionCount = 0\n protected viewSizeHeight!: number\n protected viewSizeWidth!: number\n // contentPartCount = 0\n protected sessionId?: string\n protected currentPartId?: string\n protected currentErrorCode?: string | number\n\n protected penStyle?: TPenStyle\n protected penStyleClasses?: string\n protected theme?: TTheme\n\n protected connected?: DeferredPromise\n protected initialized?: DeferredPromise\n protected addStrokeDeferred?: DeferredPromise\n protected exportDeferred?: DeferredPromise\n protected convertDeferred?: DeferredPromise\n protected importDeferred?: DeferredPromise\n protected resizeDeferred?: DeferredPromise\n protected undoDeferred?: DeferredPromise\n protected redoDeferred?: DeferredPromise\n protected clearDeferred?: DeferredPromise\n protected importPointEventsDeferred?: DeferredPromise\n protected waitForIdleDeferred?: DeferredPromise\n\n url: string\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n const scheme = (this.serverConfiguration.scheme === \"https\") ? \"wss\" : \"ws\"\n this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }`\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig, url: this.url })\n }\n\n get mimeTypes(): string[]\n {\n switch (this.recognitionConfiguration.type.toLocaleLowerCase()) {\n case \"text\":\n return this.recognitionConfiguration.text.mimeTypes\n case \"math\":\n return this.recognitionConfiguration.math.mimeTypes\n case \"diagram\":\n return this.recognitionConfiguration.diagram.mimeTypes\n default:\n //\"raw-content\"\n return []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n protected infinitePing(): void\n {\n this.pingCount++\n if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) {\n this.socket.close(1000, \"PING_LOST\")\n } else if (this.socket.readyState <= 1) {\n setTimeout(() =>\n {\n if (this.socket.readyState <= 1) {\n this.socket.send(JSON.stringify({ type: \"ping\" }))\n this.infinitePing()\n }\n }, this.serverConfiguration.websocket.pingDelay)\n }\n }\n\n protected openCallback(): void\n {\n this.connected?.resolve()\n const params: TWebSocketEvent = {\n type: this.sessionId ? \"restoreIInkSession\" : \"newContentPackage\",\n iinkSessionId: this.sessionId,\n applicationKey: this.serverConfiguration.applicationKey,\n xDpi: 96,\n yDpi: 96,\n viewSizeHeight: this.viewSizeHeight,\n viewSizeWidth: this.viewSizeWidth\n }\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n params[\"myscript-client-name\"] = \"iink-ts\"\n params[\"myscript-client-version\"] = \"1.0.0-buildVersion\"\n }\n this.send(params)\n }\n\n protected rejectDeferredPending(error: Error): void\n {\n if (this.connected?.isPending) {\n this.connected?.reject(error)\n }\n if (this.initialized?.isPending) {\n this.initialized?.reject(error)\n }\n if (this.addStrokeDeferred?.isPending) {\n this.addStrokeDeferred?.reject(error)\n }\n if (this.exportDeferred?.isPending) {\n this.exportDeferred?.reject(error)\n }\n if (this.convertDeferred?.isPending) {\n this.convertDeferred?.reject(error)\n }\n if (this.importDeferred?.isPending) {\n this.importDeferred?.reject(error)\n }\n if (this.resizeDeferred?.isPending) {\n this.resizeDeferred?.reject(error)\n }\n if (this.undoDeferred?.isPending) {\n this.undoDeferred?.reject(error)\n }\n if (this.redoDeferred?.isPending) {\n this.redoDeferred?.reject(error)\n }\n if (this.clearDeferred?.isPending) {\n this.clearDeferred.reject(error)\n }\n if (this.waitForIdleDeferred?.isPending) {\n this.waitForIdleDeferred.reject(error)\n }\n }\n\n protected closeCallback(evt: CloseEvent): void\n {\n let message = \"\"\n if (!this.currentErrorCode) {\n switch (evt.code) {\n case 1000:\n // Normal Closure\n break\n case 1001:\n message = ErrorConst.GOING_AWAY\n break\n case 1002:\n message = ErrorConst.PROTOCOL_ERROR\n break\n case 1003:\n message = ErrorConst.UNSUPPORTED_DATA\n break\n case 1006:\n message = ErrorConst.ABNORMAL_CLOSURE\n break\n case 1007:\n message = ErrorConst.INVALID_FRAME_PAULOAD\n break\n case 1008:\n message = ErrorConst.POLICY_VIOLATION\n break\n case 1009:\n message = ErrorConst.MESSAGE_TOO_BIG\n break\n case 1011:\n message = ErrorConst.INTERNAL_ERROR\n break\n case 1012:\n message = ErrorConst.SERVICE_RESTART\n break\n case 1013:\n message = ErrorConst.TRY_AGAIN\n break\n case 1014:\n message = ErrorConst.BAD_GATEWAY\n break\n case 1015:\n message = ErrorConst.TLS_HANDSHAKE\n break\n default:\n this.#logger.warn(\"closeCallback unknow CloseEvent.code\", { evt })\n message = ErrorConst.CANT_ESTABLISH\n break\n }\n }\n const error = new Error(message || evt.reason)\n\n this.rejectDeferredPending(error)\n\n if (!this.currentErrorCode && evt.code !== 1000) {\n this.internalEvent.emitError(error)\n }\n }\n\n protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageHMACChallengeMessage\", { websocketMessage })\n const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent\n if (hmacChallengeMessage.hmacChallenge) {\n this.send({\n type: \"hmac\",\n hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)\n })\n }\n if (hmacChallengeMessage.iinkSessionId) {\n this.sessionId = hmacChallengeMessage.iinkSessionId\n }\n }\n\n protected manageContentPackageDescriptionMessage(): void\n {\n this.reconnectionCount = 0\n this.#logger.info(\"manageContentPackageDescriptionMessage\")\n\n this.send({ ...this.recognitionConfiguration, type: \"configuration\" })\n\n if (this.currentPartId) {\n this.send({ type: \"openContentPart\", id: this.currentPartId, mimeTypes: this.mimeTypes })\n }\n else {\n this.send({ type: \"newContentPart\", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes })\n }\n }\n\n protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"managePartChangeMessage\", { websocketMessage })\n const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent\n this.currentPartId = partChangeMessage.partId\n this.initialized?.resolve()\n }\n\n protected manageExportMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageExportMessage\", { websocketMessage })\n const exportMessage = websocketMessage as TWebSocketExportEvent\n if (exportMessage.exports[\"application/vnd.myscript.jiix\"]) {\n exportMessage.exports[\"application/vnd.myscript.jiix\"] = JSON.parse(exportMessage.exports[\"application/vnd.myscript.jiix\"].toString()) as TJIIXExport\n }\n this.initialized?.resolve()\n this.addStrokeDeferred?.resolve(exportMessage.exports)\n this.exportDeferred?.resolve(exportMessage.exports)\n this.convertDeferred?.resolve(exportMessage.exports)\n this.importDeferred?.resolve(exportMessage.exports)\n this.undoDeferred?.resolve(exportMessage.exports)\n this.redoDeferred?.resolve(exportMessage.exports)\n this.clearDeferred?.resolve(exportMessage.exports)\n this.importPointEventsDeferred?.resolve(exportMessage.exports)\n this.internalEvent.emitExported(exportMessage.exports)\n }\n\n protected async manageWaitForIdle(): Promise {\n this.internalEvent.emitIdle(true)\n this.waitForIdleDeferred?.resolve()\n }\n\n protected manageErrorMessage(websocketMessage: TWebSocketEvent): void\n {\n const err = websocketMessage as TWebSocketErrorEvent\n this.currentErrorCode = err.data?.code || err.code\n let message = err.data?.message || err.message || ErrorConst.UNKNOW\n\n switch (this.currentErrorCode) {\n case \"no.activity\":\n message = ErrorConst.NO_ACTIVITY\n break\n case \"access.not.granted\":\n message = ErrorConst.WRONG_CREDENTIALS\n break\n case \"session.too.old\":\n message = ErrorConst.TOO_OLD\n break\n }\n const error = new Error(message)\n this.rejectDeferredPending(error)\n this.internalEvent.emitError(error)\n }\n\n protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageContentChangeMessage\", { websocketMessage })\n const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent\n const context: TUndoRedoContext = {\n canRedo: contentChangeMessage.canRedo,\n canUndo: contentChangeMessage.canUndo,\n empty: contentChangeMessage.empty,\n stackIndex: contentChangeMessage.undoStackIndex,\n possibleUndoCount: contentChangeMessage.possibleUndoCount,\n stack: []\n }\n this.internalEvent.emitContextChange(context)\n }\n\n protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageSVGPatchMessage\", { websocketMessage })\n this.resizeDeferred?.resolve()\n const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent\n this.internalEvent.emitSVGPatch(svgPatchMessage)\n }\n\n protected messageCallback(message: MessageEvent): void\n {\n this.#logger.debug(\"messageCallback\", { message })\n this.currentErrorCode = undefined\n const websocketMessage: TWebSocketEvent = JSON.parse(message.data)\n if (websocketMessage.type !== \"pong\") {\n this.pingCount = 0\n switch (websocketMessage.type) {\n case \"ack\":\n this.manageHMACChallengeMessage(websocketMessage)\n break\n case \"contentPackageDescription\":\n this.manageContentPackageDescriptionMessage()\n break\n case \"partChanged\":\n this.managePartChangeMessage(websocketMessage)\n break\n case \"newPart\":\n this.initialized?.resolve()\n break\n case \"contentChanged\":\n this.manageContentChangeMessage(websocketMessage)\n break\n case \"exported\":\n this.manageExportMessage(websocketMessage)\n break\n case \"svgPatch\":\n this.manageSVGPatchMessage(websocketMessage)\n break\n case \"error\":\n this.manageErrorMessage(websocketMessage)\n break\n case \"idle\":\n this.manageWaitForIdle()\n break\n default :\n this.#logger.warn(\"messageCallback\", `Message type unknow: \"${websocketMessage.type}\".`)\n }\n }\n }\n\n async init(height: number, width: number): Promise\n {\n try {\n this.#logger.info(\"init\", { height, width })\n this.destroy()\n this.connected = new DeferredPromise()\n this.initialized = new DeferredPromise()\n this.viewSizeHeight = height\n this.viewSizeWidth = width\n this.pingCount = 0\n this.socket = new WebSocket(this.url)\n\n if (this.serverConfiguration.websocket.pingEnabled) {\n this.infinitePing()\n }\n\n this.socket.addEventListener(\"open\", this.openCallback.bind(this))\n this.socket.addEventListener(\"close\", this.closeCallback.bind(this))\n this.socket.addEventListener(\"message\", this.messageCallback.bind(this))\n\n return this.initialized.promise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n const error = new Error(ErrorConst.CANT_ESTABLISH)\n this.internalEvent.emitError(error)\n this.initialized?.reject(error)\n return this.initialized?.promise\n }\n }\n\n async send(message: TWebSocketEvent): Promise\n {\n if (!this.connected) {\n return Promise.reject(new Error(\"Recognizer must be initilized\"))\n }\n await this.connected.promise\n if (this.socket.readyState === this.socket.OPEN) {\n this.#logger.debug(\"send\", { message })\n this.socket.send(JSON.stringify(message))\n return Promise.resolve()\n } else {\n if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) {\n this.reconnectionCount++\n if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) {\n this.#logger.debug(\"send\", `try to reconnect number: ${this.reconnectionCount}.`)\n this.internalEvent.emitClearMessage()\n await this.init(this.viewSizeHeight, this.viewSizeWidth)\n await this.setPenStyle(this.penStyle as TPenStyle)\n await this.setPenStyleClasses(this.penStyleClasses as string)\n await this.setTheme(this.theme as TTheme)\n return this.send(message)\n }\n else {\n return Promise.reject(new Error(\"Unable to send message. The maximum number of connection attempts has been reached.\"))\n }\n }\n }\n }\n\n async addStrokes(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"addStrokes\", { strokes })\n await this.initialized?.promise\n this.addStrokeDeferred = new DeferredPromise()\n if (strokes.length === 0) {\n this.addStrokeDeferred.resolve({} as TExport)\n }\n else {\n await this.send({\n type: \"addStrokes\",\n strokes: strokes.map(convertStrokeToJSON)\n })\n }\n return this.addStrokeDeferred?.promise\n }\n\n async setPenStyle(penStyle: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n await this.initialized?.promise\n this.penStyle = penStyle\n const message: TWebSocketEvent = {\n type: \"setPenStyle\",\n style: StyleHelper.penStyleToCSS(penStyle)\n }\n return this.send(message)\n }\n\n async setPenStyleClasses(penStyleClasses: string): Promise\n {\n await this.initialized?.promise\n this.penStyleClasses = penStyleClasses\n this.#logger.info(\"setPenStyleClasses\", { penStyleClasses })\n const message: TWebSocketEvent = {\n type: \"setPenStyleClasses\",\n styleClasses: penStyleClasses\n }\n return this.send(message)\n }\n\n async setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n await this.initialized?.promise\n this.theme = theme\n const message: TWebSocketEvent = {\n type: \"setTheme\",\n theme: StyleHelper.themeToCSS(theme)\n }\n return this.send(message)\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n await this.initialized?.promise\n this.exportDeferred = new DeferredPromise()\n const localModel = model.getClone()\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n }\n }\n\n if (!mimeTypes.length) {\n return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`))\n }\n\n const message: TWebSocketEvent = {\n type: \"export\",\n partId: this.currentPartId,\n mimeTypes\n }\n await this.send(message)\n const exports: TExport = await this.exportDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n this.#logger.debug(\"export\", { model: localModel })\n return localModel\n }\n\n async import(model: IModel, data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n await this.initialized?.promise\n const localModel = model.getClone()\n const chunkSize = this.serverConfiguration.websocket.fileChunkSize\n const importFileId = Math.random().toString(10).substring(2, 6)\n this.importDeferred = new DeferredPromise()\n const readBlob = (blob: Blob): Promise =>\n {\n const fileReader = new FileReader()\n return new Promise((resolve, reject) =>\n {\n fileReader.onloadend = (ev) => resolve(ev.target?.result as string)\n fileReader.onerror = () => reject()\n fileReader.readAsText(blob)\n })\n }\n\n const importFileMessage: TWebSocketEvent = {\n type: \"importFile\",\n importFileId,\n mimeType\n }\n await this.send(importFileMessage)\n for (let i = 0; i < data.size; i += chunkSize) {\n const blobPart = data.slice(i, i + chunkSize, data.type)\n const partFileString = await readBlob(blobPart)\n const fileChuckMessage: TWebSocketEvent = {\n type: \"fileChunk\",\n importFileId,\n data: partFileString,\n lastChunk: i + chunkSize > data.size\n }\n await this.send(fileChuckMessage)\n }\n const exports = await this.importDeferred?.promise\n this.importDeferred = undefined\n localModel.mergeExport(exports)\n return localModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n await this.initialized?.promise\n this.resizeDeferred = new DeferredPromise()\n const localModel = model.getClone()\n this.viewSizeHeight = localModel.height\n this.viewSizeWidth = localModel.width\n const message: TWebSocketEvent = {\n type: \"changeViewSize\",\n height: this.viewSizeHeight,\n width: this.viewSizeWidth,\n }\n await this.send(message)\n await this.resizeDeferred?.promise\n return localModel\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointsEvents\", { strokes })\n await this.initialized?.promise\n this.importPointEventsDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"pointerEvents\",\n events: strokes.map(convertStrokeToJSON)\n }\n this.send(message)\n const exportPoints = await this.importPointEventsDeferred?.promise\n this.importPointEventsDeferred = undefined\n this.#logger.debug(\"importPointEvents\", { exportPoints })\n return exportPoints as TExport\n }\n\n async convert(model: IModel, conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState })\n await this.initialized?.promise\n this.convertDeferred = new DeferredPromise()\n const localModel = model.getClone()\n const message: TWebSocketEvent = {\n type: \"convert\",\n conversionState\n }\n await this.send(message)\n const myExportConverted: TExport = await this.convertDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeConvert(myExportConverted)\n localModel.mergeExport(myExportConverted)\n this.#logger.debug(\"convert\", { model: localModel })\n return localModel\n }\n\n async waitForIdle(): Promise\n {\n await this.initialized?.promise\n this.waitForIdleDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"waitForIdle\",\n }\n await this.send(message)\n return this.waitForIdleDeferred?.promise\n }\n\n async undo(model: IModel): Promise\n {\n this.#logger.info(\"undo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.undoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"undo\",\n }\n await this.send(message)\n const undoExports = await this.undoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(undoExports)\n this.#logger.debug(\"undo\", { model: localModel })\n this.undoDeferred = undefined\n return localModel\n }\n\n async redo(model: IModel): Promise\n {\n this.#logger.info(\"redo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.redoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"redo\",\n }\n await this.send(message)\n const redoExports = await this.redoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(redoExports)\n this.#logger.debug(\"redo\", { model: redoExports })\n this.redoDeferred = undefined\n return localModel\n }\n\n async clear(model: IModel): Promise\n {\n this.#logger.info(\"clear\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n localModel.modificationDate = Date.now()\n this.clearDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"clear\",\n }\n await this.send(message)\n const clearExports = await this.clearDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(clearExports)\n this.clearDeferred = undefined\n this.#logger.info(\"clear\", { model: localModel })\n return localModel\n }\n\n close(code: number, reason: string): void\n {\n if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) {\n this.#logger.info(\"close\", { code, reason })\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.socket.close(code, reason)\n }\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n this.connected = undefined\n this.initialized = undefined\n this.addStrokeDeferred = undefined\n this.exportDeferred = undefined\n this.convertDeferred = undefined\n this.importDeferred = undefined\n this.resizeDeferred = undefined\n this.undoDeferred = undefined\n this.redoDeferred = undefined\n this.clearDeferred = undefined\n if (this.socket) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.close(1000, \"Recognizer destroyed\")\n }\n }\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class SVGStroker\n{\n\n private getArcPath(center: TPointer, radius: number): string\n {\n const svgPath = [\n `M ${ center.x },${ center.y }`,\n `m ${ -radius },0`,\n `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`,\n `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0`\n ].join(\" \")\n return svgPath\n }\n\n private getLinePath(begin: TPointer, end: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `L ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private getFinalPath(begin: TPointer, end: TPointer, width: number): string\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`]\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - (i * (Math.PI / ARCSPLIT))\n parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`)\n }\n const svgPath = parts.join(\" \")\n return svgPath\n }\n\n private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width)\n const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private buildSVGPath(stroke: TStroke): string\n {\n const STROKE_LENGTH = stroke.pointers.length\n const STROKE_WIDTH = (stroke.style.width as number)\n const NB_QUADRATICS = STROKE_LENGTH - 2\n const firstPoint = stroke.pointers[0]\n\n const parts = []\n if (STROKE_LENGTH < 3) {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6))\n } else {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p))\n parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH))\n\n for (let i = 0; i < NB_QUADRATICS; i++) {\n const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const central = stroke.pointers[i + 1]\n parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH)\n )\n }\n const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2]\n const lastPoint = stroke.pointers[STROKE_LENGTH - 1]\n parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH))\n parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH))\n }\n return parts.join(\" \")\n }\n\n drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void\n {\n const svgPathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n svgPathElement.classList.add(\"pending-stroke\")\n svgPathElement.setAttribute(\"id\", stroke.id)\n svgPathElement.setAttribute(\"type\", stroke.pointerType)\n attrs?.forEach(a =>\n {\n svgPathElement.setAttribute(a.name, a.value)\n })\n const svgPath = this.buildSVGPath(stroke)\n svgPathElement.setAttribute(\"d\", `${ svgPath }Z`)\n svgElement.appendChild(svgPathElement)\n }\n}\n","import { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from \"../../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { SVGStroker } from \"./SVGStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class WSSVGRenderer\n{\n config: TRenderingConfiguration\n stroker: SVGStroker\n context!: {\n parent: HTMLElement\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new SVGStroker()\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n element.style.fontSize = \"10px\"\n this.context = {\n parent: element\n }\n }\n\n #drawStroke(svgElement: SVGElement, stroke: TStroke)\n {\n let style: string\n if (stroke.pointerType === \"eraser\") {\n stroke.style.width = 20\n style = \"fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;\"\n } else {\n style = `fill:${ stroke.style.color };stroke:transparent;`\n }\n this.stroker.drawStroke(svgElement, stroke, [{ name: \"style\", value: style }])\n }\n\n #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void\n {\n const oldLayer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement | null\n oldLayer?.remove()\n this.context.parent.insertAdjacentHTML(\"beforeend\", update.svg)\n const layer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement\n if (layerName === \"MODEL\") {\n const pendingStrokesGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n pendingStrokesGroup.id = \"pendingStrokes\"\n layer.appendChild(pendingStrokesGroup)\n }\n }\n\n #replaceElement(update: TUpdatePatchReplaceELement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null\n if (elementToRemove) {\n const parent = elementToRemove.parentNode as HTMLElement | null | undefined\n elementToRemove?.remove()\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n }\n\n #appendChild(layerName: string, update: TUpdatePatchAppendChild): void\n {\n const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer=\"${ layerName }\"]`\n const parent = this.context.parent.querySelector(parentSelector) as HTMLElement\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n\n #removeChild(update: TUpdatePatchRemoveChild): void\n {\n this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove()\n }\n\n #removeElement(update: TUpdatePatchRemoveElement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`)\n if (elementToRemove) {\n if (update.id.includes(\"s\") || update.id.includes(\"MODEL\")) {\n elementToRemove.remove()\n } else {\n elementToRemove.setAttribute(\"class\", \"removed-stroke\")\n setTimeout(() =>\n {\n elementToRemove?.remove()\n }, 100)\n }\n }\n }\n\n #insertBefore(update: TUpdatePatchInsertBefore): void\n {\n const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null\n parent?.insertAdjacentHTML(\"beforebegin\", update.svg)\n }\n\n #setAttribute(update: TUpdatePatchSetAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.setAttribute(update.name, update.value)\n }\n\n #removeAttribute(update: TUpdatePatchRemoveAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.removeAttribute(update.name)\n }\n\n updateLayer(layerName: string, update: TUpdatePatch): void\n {\n this.#logger.info(\"updateLayer\", { layerName, update })\n switch (update.type) {\n case \"REPLACE_ALL\":\n this.#replaceAll(layerName, update as TUpdatePatchReplaceAll)\n break\n case \"REPLACE_ELEMENT\":\n this.#replaceElement(update as TUpdatePatchReplaceELement)\n break\n case \"APPEND_CHILD\":\n this.#appendChild(layerName, update as TUpdatePatchAppendChild)\n break\n case \"REMOVE_ELEMENT\":\n this.#removeElement(update as TUpdatePatchRemoveElement)\n break\n case \"REMOVE_CHILD\":\n this.#removeChild(update as TUpdatePatchRemoveChild)\n break\n case \"INSERT_BEFORE\":\n this.#insertBefore(update as TUpdatePatchInsertBefore)\n break\n case \"SET_ATTRIBUTE\":\n this.#setAttribute(update as TUpdatePatchSetAttribut)\n break\n case \"REMOVE_ATTRIBUTE\":\n this.#removeAttribute(update as TUpdatePatchRemoveAttribut)\n break\n default:\n this.#logger.warn(\"updateLayer Default\", {layerName, update})\n break\n }\n }\n\n updatesLayer(layerName: string, updates: TUpdatePatch[]): void\n {\n this.#logger.info(\"updatesLayer\", { layerName, updates })\n updates.forEach(u => this.updateLayer(layerName, u))\n this.clearPendingStroke()\n }\n\n clearPendingStroke(): void\n {\n this.#logger.info(\"clearPendingStroke\", { })\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n pendingStrokeGroup.innerHTML = \"\"\n }\n }\n\n drawPendingStroke(stroke: TStroke): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n if (stroke) {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`)\n if (oldStroke) {\n oldStroke.remove()\n }\n this.#drawStroke(pendingStrokeGroup, stroke)\n }\n }\n }\n\n clearErasingStrokes(): void\n {\n const erasingStrokeList = this.context.parent.querySelectorAll(\"[type=eraser]\") as NodeListOf\n erasingStrokeList.forEach(erasingStroke => {\n erasingStroke.remove()\n })\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n const rect = this.context.parent.getBoundingClientRect()\n const svgList = this.context.parent.querySelectorAll(\"svg\")\n const width = Math.max(rect.width, model.width)\n const height = Math.max(rect.height, model.height)\n svgList.forEach(svg =>\n {\n svg.setAttribute(\"viewBox\", `0 0 ${ width }, ${ height }`)\n svg.setAttribute(\"width\", `${ width }px`)\n svg.setAttribute(\"height\", `${ height }px`)\n })\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\", { context: this.context })\n if (this.context?.parent) {\n this.context.parent.querySelectorAll(\"svg\").forEach(n => n.remove())\n }\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { WSRecognizer } from \"../recognizer/WSRecognizer\"\nimport { Intention } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { WSSVGRenderer } from \"../renderer/svg/WSSVGRenderer\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { UndoRedoManager } from \"../undo-redo\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class WSBehaviors implements IBehaviors\n{\n name = \"WSBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: WSSVGRenderer\n recognizer: WSRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new WSSVGRenderer(this.#configuration.rendering)\n this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(penStyle?: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n this.styleManager.setPenStyle(penStyle)\n this.#logger.debug(\"setPenStyle\", this.styleManager.penStyle)\n return this.recognizer.setPenStyle(this.styleManager.penStyle)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string): Promise\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n this.#logger.debug(\"setPenStyleClasses\", this.styleManager.penStyleClasses)\n return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n this.#logger.debug(\"setTheme\", this.styleManager.theme)\n return this.recognizer.setTheme(this.styleManager.theme)\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n\n this.internalEvent.addSVGPatchListener(this.onSVGPatch)\n\n await this.recognizer.init(this.model.height, this.model.width)\n await this.setPenStyle(this.penStyle)\n await this.setTheme(this.theme)\n await this.setPenStyleClasses(this.penStyleClasses)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n let { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n if (this.intention === Intention.Erase) {\n pointerType = \"eraser\"\n }\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n }\n\n private async onPointerUp(_evt: PointerEvent, point: TPointer): Promise\n {\n try {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n this.model.endCurrentStroke(point)\n await this.updateModelRendering()\n } catch (error) {\n this.internalEvent.emitError(error as Error)\n }\n }\n\n private onSVGPatch = (evt: TWebSocketSVGPatchEvent) =>\n {\n this.#logger.info(\"onSVGPatch\", { evt })\n this.renderer.updatesLayer(evt.layer, evt.updates)\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n const currentStroke = this.model.currentStroke as TStroke\n if (currentStroke) {\n this.renderer.drawPendingStroke(currentStroke)\n }\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.clearErasingStrokes()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.mergeExport(exports)\n this.undoRedoManager.updateModelInStack(this.model)\n }\n this.#logger.debug(\"updateModelRendering\", this.model)\n return this.model\n }\n\n async waitForIdle(): Promise\n {\n return this.recognizer.waitForIdle()\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointEvents\", { strokes })\n const exportPoints = await this.recognizer.importPointEvents(strokes)\n this.model.mergeExport(exportPoints)\n this.#logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n try {\n if (this.#configuration.triggers.exportContent === \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.updatePositionReceived()\n this.model.mergeExport(exports)\n this.#logger.debug(\"export\", this.model)\n return this.model\n } else {\n return this.recognizer.export(this.model, mimeTypes)\n }\n } catch (error) {\n this.#logger.error(\"export\", { error } )\n this.internalEvent.emitError(error as Error)\n return Promise.reject(error)\n }\n }\n\n async convert(conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { conversionState })\n this.undoRedoManager.addModelToStack(this.model)\n this.context.stack.push(this.model.getClone())\n this.#model = await this.recognizer.convert(this.model, conversionState)\n this.#logger.debug(\"convert\", this.model)\n this.undoRedoManager.addModelToStack(this.model)\n return this.model\n }\n\n async import(data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n this.context.stack.push(this.model.getClone())\n const m = await this.recognizer.import(this.model, data, mimeType)\n this.undoRedoManager.addModelToStack(m)\n return m\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n const clonedModel = this.model.getClone()\n this.renderer.resize(clonedModel)\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n try {\n const resizeModel = await this.recognizer.resize(clonedModel)\n deferredResize.resolve(resizeModel)\n } catch (error) {\n this.#logger.error(\"resize\", { height, width, error } )\n deferredResize.reject(error as Error)\n }\n }, this.#configuration.triggers.resizeTriggerDelay)\n\n this.#model = await deferredResize.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.#model = this.undoRedoManager.undo()\n return this.recognizer.undo(this.model)\n }\n else {\n throw new Error(\"Undo not allowed\")\n }\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.#model = this.undoRedoManager.redo()\n this.#logger.debug(\"undo\", this.#model)\n return this.recognizer.redo(this.model)\n }\n else {\n throw new Error(\"Redo not allowed\")\n }\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n return this.recognizer.clear(this.model)\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n this.recognizer.destroy()\n return Promise.resolve()\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { TConfiguration } from \"./@types/configuration\"\nimport { IGrabber } from \"./@types/grabber/Grabber\"\nimport { TStroke } from \"./@types/model/Stroke\"\nimport { IModel, TExport, TJIIXExport } from \"./@types/model/Model\"\nimport { TPenStyle } from \"./@types/style/PenStyle\"\nimport { TTheme } from \"./@types/style/Theme\"\nimport { IBehaviors, TBehaviorOptions } from \"./@types/Behaviors\"\nimport { TConverstionState } from \"./@types/configuration/RecognitionConfiguration\"\nimport { TMarginConfiguration } from \"./@types/configuration/recognition/MarginConfiguration\"\nimport { TUndoRedoContext } from \"./@types/undo-redo/UndoRedoContext\"\nimport { LoggerClass, TLoggerConfiguration } from \"./@types/configuration/LoggerConfiguration\"\n\nimport { ExportType, Intention } from \"./Constants\"\nimport { DefaultLoggerConfiguration } from \"./configuration\"\nimport { PublicEvent } from \"./event/PublicEvent\"\nimport { InternalEvent } from \"./event/InternalEvent\"\nimport { SmartGuide } from \"./smartguide/SmartGuide\"\nimport { DeferredPromise } from \"./utils/DeferredPromise\"\nimport { RestBehaviors } from \"./behaviors/RestBehaviors\"\nimport { WSBehaviors } from \"./behaviors/WSBehaviors\"\nimport { LoggerManager, Logger } from \"./logger\"\n\nimport \"./iink.css\"\n\nexport type HTMLEditorElement = HTMLElement &\n{\n editor: Editor\n}\n\nexport class Editor\n{\n wrapperHTML: HTMLEditorElement\n #loaderHTML: HTMLDivElement\n #messageHTML: HTMLDivElement\n #behaviors!: IBehaviors\n #smartGuide?: SmartGuide\n #initializationDeferred: DeferredPromise\n\n logger: Logger\n #loggerConfiguration: TLoggerConfiguration\n showStrokesPan = false\n\n constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = \"ms-editor\")\n {\n this.#loggerConfiguration = Object.assign({}, DefaultLoggerConfiguration, options.logger)\n\n this.logger = LoggerManager.getLogger(LoggerClass.EDITOR)\n this.logger.info(\"constructor\", { wrapperHTML, options, globalClassCss })\n this.#initializationDeferred = new DeferredPromise()\n\n this.wrapperHTML = wrapperHTML as HTMLEditorElement\n this.wrapperHTML.classList.add(globalClassCss)\n this.events.setElement(this.wrapperHTML)\n\n this.#loaderHTML = document.createElement(\"div\")\n this.#loaderHTML.classList.add(\"loader\")\n this.#loaderHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#loaderHTML)\n\n this.#messageHTML = document.createElement(\"div\")\n this.#messageHTML.classList.add(\"message\")\n this.#messageHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#messageHTML)\n\n this.#instantiateBehaviors(options)\n }\n\n get loggerConfiguration(): TLoggerConfiguration\n {\n return this.#loggerConfiguration\n }\n\n set loggerConfiguration(loggerConfig: TLoggerConfiguration)\n {\n this.#loggerConfiguration = loggerConfig\n LoggerManager.setLoggerLevel(loggerConfig)\n }\n\n get initializationPromise(): Promise\n {\n return this.#initializationDeferred.promise\n }\n\n get model(): IModel\n {\n return this.behaviors.model\n }\n\n get behaviors(): IBehaviors\n {\n return this.#behaviors\n }\n\n get configuration(): TConfiguration\n {\n return this.behaviors.configuration\n }\n set configuration(configuration: TConfiguration)\n {\n this.logger.info(\"set configuration\", { configuration })\n this.#instantiateBehaviors({ configuration })\n this.initialize()\n }\n\n get intention(): Intention\n {\n return this.behaviors.intention\n }\n set intention(m: Intention)\n {\n this.logger.info(\"set intention\", { m })\n this.behaviors.intention = m\n switch (this.behaviors.intention) {\n case Intention.Erase:\n this.wrapperHTML.classList.add(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n // case Intention.Selecting:\n // this.model.resetSelectedStrokes()\n // this.wrapperHTML.classList.remove(\"erasing\")\n // this.wrapperHTML.classList.add(\"selecting\")\n // break;\n default:\n this.logger.warn(\"set intention default\", { m })\n document.body.style.cursor = \"initial\"\n this.wrapperHTML.classList.remove(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n }\n this.logger.debug(\"set intention\", this.wrapperHTML)\n }\n\n get events(): PublicEvent\n {\n return PublicEvent.getInstance()\n }\n\n get context(): TUndoRedoContext\n {\n return this.behaviors.context\n }\n\n get grabber(): IGrabber\n {\n return this.behaviors.grabber\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.behaviors.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.behaviors.penStyle\n }\n set penStyle(ps: TPenStyle)\n {\n this.logger.info(\"set penStyle\", { ps })\n this.behaviors.setPenStyle(ps)\n }\n\n get theme(): TTheme\n {\n return this.behaviors.theme\n }\n set theme(t: TTheme)\n {\n this.logger.info(\"set theme\", { t })\n this.behaviors.setTheme(t)\n }\n\n get penStyleClasses(): string\n {\n return this.behaviors.penStyleClasses\n }\n set penStyleClasses(psc: string)\n {\n this.logger.info(\"set penStyleClasses\", { psc })\n this.behaviors.setPenStyleClasses(psc)\n }\n\n #instantiateBehaviors(options: TBehaviorOptions)\n {\n this.logger.info(\"instantiateBehaviors\", { options })\n if (!options?.configuration) {\n throw new Error(\"Configuration required\")\n }\n InternalEvent.getInstance().removeAllListeners()\n if (this.#behaviors) {\n this.#behaviors.destroy()\n }\n let defaultBehaviors: IBehaviors\n if (options.configuration.server?.protocol === \"REST\") {\n defaultBehaviors = new RestBehaviors(options)\n } else {\n defaultBehaviors = new WSBehaviors(options)\n }\n this.#behaviors = Object.assign(defaultBehaviors, options.behaviors)\n this.logger.debug(\"instantiateBehaviors\", this.#behaviors)\n }\n\n async #initializeBehaviors(): Promise\n {\n this.logger.info(\"initializeBehaviors start\")\n this.#initializationDeferred = new DeferredPromise()\n this.#loaderHTML.style.display = \"initial\"\n this.#cleanMessage()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n return this.behaviors.init(this.wrapperHTML)\n .then(async () =>\n {\n this.logger.info(\"initializeBehaviors then\")\n this.wrapperHTML.editor = this\n this.#initializationDeferred.resolve()\n this.events.emitLoaded()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n })\n .catch((error: Error) =>\n {\n this.logger.error(\"initializeBehaviors catch\", { error })\n this.#initializationDeferred.reject(error)\n this.#showError(error)\n })\n .finally(() =>\n {\n this.logger.info(\"initializeBehaviors finally\", { })\n this.#loaderHTML.style.display = \"none\"\n return this.#initializationDeferred.promise\n })\n }\n\n #initializeSmartGuide(): void\n {\n this.#smartGuide?.destroy()\n this.logger.info(\"initializeSmartGuide\", { smartGuide: this.configuration.rendering.smartGuide })\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide = new SmartGuide()\n let margin: TMarginConfiguration\n switch (this.configuration.recognition.type) {\n case \"TEXT\":\n margin = this.configuration.recognition.text.margin\n break\n case \"MATH\":\n margin = this.configuration.recognition.math.margin\n break\n default:\n this.logger.warn(\"initializeSmartGuide default\", this.configuration.recognition.type)\n margin = {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n }\n break\n }\n this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering)\n }\n }\n\n #cleanMessage()\n {\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n this.#messageHTML.style.display = \"none\"\n this.#messageHTML.innerHTML = \"\"\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n }\n\n #showError(err: Error)\n {\n this.logger.debug(\"showError\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"error-msg\")\n this.#messageHTML.classList.remove(\"info-msg\")\n this.#messageHTML.innerText = err.message\n this.logger.debug(\"showError\", this.#messageHTML)\n }\n\n #showNotif(notif: { message: string, timeout?: number })\n {\n this.logger.debug(\"showNotif\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"info-msg\")\n this.#messageHTML.classList.remove(\"error-msg\")\n this.#messageHTML.innerText = notif.message\n setTimeout(() =>\n {\n this.#cleanMessage()\n }, notif.timeout || 2500)\n this.logger.debug(\"showNotif\", this.#messageHTML)\n }\n\n #showStrokesIfDebug(): void\n {\n if (this.showStrokesPan) {\n let panel = document.getElementById(\"stroke-panel\")\n const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers })))\n if (!panel) {\n panel = document.createElement(\"div\")\n panel.id = \"stroke-panel\"\n panel.addEventListener(\"click\", (e) =>\n {\n e.preventDefault()\n e.stopPropagation()\n navigator.clipboard.writeText(panel?.innerText as string)\n this.#showNotif({ message: \"strokes copied to clipboard!\", timeout: 1500 })\n })\n this.wrapperHTML.appendChild(panel)\n }\n panel.innerText = text\n }\n }\n\n #addListeners(): void\n {\n InternalEvent.getInstance().addConvertListener(this.convert.bind(this))\n InternalEvent.getInstance().addClearListener(this.clear.bind(this))\n InternalEvent.getInstance().addErrorListener(this.#showError.bind(this))\n InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this))\n InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this))\n InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this))\n InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this))\n InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this))\n InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this))\n }\n\n #onContextChange = (context: TUndoRedoContext) =>\n {\n this.events.emitChanged(context)\n }\n\n #onIdleChange = (idle: boolean) =>\n {\n this.events.emitIdle(idle)\n }\n\n #onExport(exports: TExport): void\n {\n this.logger.info(\"onExport\", { exports })\n this.model.mergeExport(exports)\n if (this.configuration.rendering.smartGuide.enable) {\n if (exports && exports[\"application/vnd.myscript.jiix\"]) {\n const jjix = exports[\"application/vnd.myscript.jiix\"] as TJIIXExport\n this.#smartGuide?.update(jjix)\n }\n }\n this.#showStrokesIfDebug()\n this.events.emitExported(exports)\n }\n\n #onImportJIIX(jiix: TJIIXExport): void\n {\n this.logger.info(\"onImportJIIX\", { jiix })\n this.import(new Blob([JSON.stringify(jiix)], { type: ExportType.JIIX }), ExportType.JIIX)\n }\n\n async initialize(): Promise\n {\n this.logger.info(\"initialize\")\n await this.#initializeBehaviors()\n this.#initializeSmartGuide()\n this.#addListeners()\n }\n\n async waitForIdle(): Promise\n {\n if (this.behaviors.waitForIdle)\n {\n return this.behaviors.waitForIdle()\n }\n return\n }\n\n async undo(): Promise\n {\n this.logger.debug(\"undo\", this.model)\n this.logger.info(\"undo\", { })\n await this.#initializationDeferred.promise\n await this.behaviors.undo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"undo\", this.model)\n return this.model\n }\n\n async redo(): Promise\n {\n this.logger.debug(\"redo\", this.model)\n this.logger.info(\"redo\")\n await this.#initializationDeferred.promise\n await this.behaviors.redo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"redo\", this.model)\n return this.model\n }\n\n async clear(): Promise\n {\n this.logger.debug(\"clear\", this.model)\n this.logger.info(\"clear\")\n await this.#initializationDeferred.promise\n await this.behaviors.clear()\n this.events.emitCleared(this.model)\n this.#showStrokesIfDebug()\n this.logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async resize(): Promise\n {\n this.logger.debug(\"resize\", this.model)\n this.logger.info(\"resize\")\n await this.#initializationDeferred.promise\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide?.resize()\n }\n const height = Math.max(this.wrapperHTML.clientHeight, this.configuration.rendering.minHeight)\n const width = Math.max(this.wrapperHTML.clientWidth, this.configuration.rendering.minWidth)\n await this.behaviors.resize(height, width)\n this.logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.logger.debug(\"export\", this.model)\n this.logger.info(\"export\", { mimeTypes })\n await this.#initializationDeferred.promise\n await this.behaviors.export(mimeTypes)\n this.logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise\n {\n this.logger.debug(\"convert\", this.model)\n this.logger.info(\"export\", { params })\n await this.#initializationDeferred.promise\n await this.behaviors.convert(params?.conversionState, params?.mimeTypes)\n this.events.emitConverted(this.model.converts as TExport)\n this.logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise\n {\n this.logger.debug(\"import\", this.model)\n this.logger.info(\"import\", { data, mimeType })\n await this.#initializationDeferred.promise\n if (this.behaviors.import) {\n let blobToImport: Blob\n if (data instanceof Blob) {\n blobToImport = data\n }\n else if (typeof data === \"string\") {\n blobToImport = new Blob([data])\n }\n else {\n blobToImport = new Blob([JSON.stringify(data)])\n }\n await this.behaviors.import(blobToImport, mimeType)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"import\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no import function\")\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.logger.debug(\"importPointEvents\", this.model)\n this.logger.info(\"importPointEvents\", { strokes })\n await this.#initializationDeferred.promise\n if (this.behaviors.importPointEvents) {\n await this.behaviors.importPointEvents(strokes)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no importPointEvents function\")\n }\n\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableFontList(configuration: TConfigurationClient): Promise>\n{\n if (!configuration?.server?.scheme && !configuration?.server?.host) {\n return Promise.reject(\"Failed to get fonts: configuration.server.scheme & configuration.server.host are required!\")\n }\n if (!configuration?.recognition?.lang) {\n return Promise.reject(\"Failed to get fonts: configuration.recognition.lang is required!\")\n }\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang)\n const { result } = await response.json()\n return result.sort()\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>\n{\n if (configuration?.server?.scheme && configuration?.server?.host) {\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`)\n return response.json()\n } else {\n return Promise.reject(\"Failed to get languages: configuration.server.scheme & configuration.server.host are required!\")\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","get","__classPrivateFieldSet","set","DefaultServerConfiguration","protocol","scheme","host","applicationKey","hmacKey","version","useWindowLocation","websocket","pingEnabled","pingDelay","maxPingLostCount","autoReconnect","maxRetryCount","fileChunkSize","DefaultRecognitionConfiguration","type","alwaysConnected","lang","gesture","enable","export","jiix","strokes","text","chars","words","renderer","debug","math","mimeTypes","solver","margin","bottom","left","right","top","eraser","mode","guides","diagram","convert","recognition","shape","DefaultGrabberConfiguration","listenerOptions","capture","passive","xyFloatPrecision","timestampFloatPrecision","DefaultRenderingConfiguration","minHeight","minWidth","smartGuide","fadeOut","duration","gap","DefaultTriggerConfiguration","exportContent","exportContentDelay","resizeTriggerDelay","DefaultEventsConfiguration","processDelay","DefaultUndoRedoConfiguration","maxStackSize","DefaultConfiguration","server","grabber","rendering","triggers","events","DefaultLoggerConfiguration","EDITOR","BEHAVIORS","RECOGNIZER","GRABBER","RENDERER","CONFIGURATION","PUBLIC_EVENT","INTERNALEVENT","MODEL","STROKE","SMARTGUIDE","STYLEMANAGER","UNDOREDO_MANAGER","mergeDeep","target","sources","isObject","item","Array","isArray","length","source","shift","key","Object","assign","Logger","constructor","instanceName","level","this","data","dataLog","from","message","console","info","warn","error","LoggerManager","static","name","_a","_LoggerManager_loggerMap","config","keys","forEach","lc","getLogger","Map","Configuration","configuration","_Configuration_logger","JSON","parse","stringify","overrideDefaultConfiguration","defaultConf","_b","_d","_c","_f","_e","_g","window","location","indexOf","Math","max","includes","push","LoggerLevel","LoggerClass","Error","NO_ACTIVITY","WRONG_CREDENTIALS","TOO_OLD","UNKNOW","ABNORMAL_CLOSURE","CANT_ESTABLISH","GOING_AWAY","PROTOCOL_ERROR","UNSUPPORTED_DATA","INVALID_FRAME_PAULOAD","POLICY_VIOLATION","MESSAGE_TOO_BIG","INTERNAL_ERROR","SERVICE_RESTART","TRY_AGAIN","BAD_GATEWAY","TLS_HANDSHAKE","EventType","CHANGED","CLEARED","CONVERTED","ERROR","POINTEREVENTS","EXPORTED","IMPORTED","IDLE","LOADED","InternalEventType","SVG_PATCH","CLEAR_MESSAGE","NOTIF","IMPORT_JIIX","CONVERT","CLEAR","CONTEXT_CHANGE","WS_CLOSED","ExportType","Intention","PublicEvent","EventTarget","super","_PublicEvent_element","_PublicEvent_logger","_PublicEvent_instance","setElement","el","emitLoaded","emitExported","exports","_PublicEvent_instances","_PublicEvent_emit","emitChanged","undoRedoContext","canClear","empty","emitIdle","idle","emitCleared","model","emitConverted","emitImported","WeakMap","WeakSet","evt","CustomEvent","bubbles","composed","detail","undefined","dispatchEvent","InternalEvent","_InternalEvent_abortController","_InternalEvent_logger","AbortController","_InternalEvent_instance","removeAllListeners","abort","emitSVGPatch","patchChange","_InternalEvent_instances","_InternalEvent_emit","addSVGPatchListener","callback","addEventListener","signal","addExportedListener","emitClearMessage","addClearMessageListener","emitError","err","addErrorListener","emitWSClosed","addWSClosedListener","emitNotif","notif","addNotifListener","emitImportJIIX","addImportJIIXListener","emitConvert","conversionState","addConvertListener","emitClear","addClearListener","emitContextChange","context","addContextChangeListener","addIdleListener","SmartGuide","_SmartGuide_smartGuideElement","_SmartGuide_prompterContainerElement","_SmartGuide_prompterTextElement","_SmartGuide_ellipsisElement","_SmartGuide_tagElement","_SmartGuide_candidatesElement","_SmartGuide_menuElement","_SmartGuide_convertElement","_SmartGuide_copyElement","_SmartGuide_deleteElement","_SmartGuide_fadeOutTimout","_SmartGuide_isMenuOpen","_SmartGuide_logger","_SmartGuide_showCandidates","wordId","parseInt","id","replace","uuid","wordToChange","toString","innerHTML","candidates","style","display","word","index","label","getBoundingClientRect","parent","parentNode","insertBefore","_SmartGuide_onClickEllipsis","preventDefault","stopPropagation","_SmartGuide_instances","_SmartGuide_hideCandidates","_SmartGuide_onClickConvert","internalEvent","_SmartGuide_closeMenu","_SmartGuide_onClickCopy","innerText","test","navigator","userAgent","permissionName","permissions","query","clipboard","writeText","timeout","_SmartGuide_onClickDelete","_SmartGuide_onClickCandidate","candidate","_SmartGuide_onClickPrompter","_SmartGuide_onClickOutSide","random","substring","_SmartGuide_createWrapperElement","_SmartGuide_createPrompterContainerElement","_SmartGuide_createPrompterTextElement","_SmartGuide_createEllipsisElement","_SmartGuide_createTagElement","_SmartGuide_createCandidatesElement","_SmartGuide_createMoreMenuElement","_SmartGuide_createConvertElement","_SmartGuide_createCopyElement","_SmartGuide_createDeleteElement","getInstance","init","domElement","renderingConfiguration","appendChild","classList","add","_SmartGuide_addListeners","_SmartGuide_show","_SmartGuide_initFadeOutObserver","resize","mmToPixels","marginTop","marginLeft","marginRight","offsetWidth","width","clientWidth","offsetHeight","update","createWordSpan","span","document","createElement","textContent","myFragment","createDocumentFragment","lastWord","scrollLeft","offsetLeft","populatePrompter","clear","_SmartGuide_hide","destroy","_SmartGuide_removeListeners","remove","setAttribute","MutationObserver","clearTimeout","contains","setTimeout","observe","childList","subtree","attributes","_SmartGuide_openMenu","bind","removeEventListener","DeferredPromise","isFullFilled","isPending","promise","v","PointerEventGrabber","prevent","_PointerEventGrabber_logger","pointerDownHandler","button","buttons","activePointerId","pointerId","onPointerDown","point","extractPoint","pointerMoveHandler","onPointerMove","pointerUpHandler","onPointerUp","roundFloat","oneFloat","requestedFloatPrecision","floatPrecision","pow","round","event","clientX","clientY","changedTouches","rect","pointer","x","clientLeft","y","clientTop","t","Date","now","p","pressure","attach","detach","documentElement","ShapeSymbols","table","recognizedShape","ellipse","line","phi","angle","returnedAngle","PI","drawArrowHead","context2D","headPoint","alpha","beta","save","fillStyle","strokeStyle","moveTo","beginPath","lineTo","cos","sin","fill","restore","drawShapeEllipse","shapeEllipse","points","drawEllipseArc","centerPoint","maxRadius","minRadius","orientation","startAngle","sweepAngle","z1","z3","z2","z4","n","floor","abs","boundariesPoints","i","atan2","cosAlpha","sinAlpha","stroke","beginDecoration","beginTangentAngle","endDecoration","endTangentAngle","drawLine","p1","p2","drawShapeSymbol","symbol","lineWidth","color","elementType","shapeSymbol","selectedCandidateIndex","lines","lineSymbol","drawShapeLine","shapeLine","firstPoint","lastPoint","primitives","primitive","drawStroke","stroker","pointerType","TextSymbols","inputCharacter","char","string","textLine","drawTextLine","drawText","font","textHeight","textAlign","justificationType","textBaseline","fillText","topLeftPoint","height","underlineList","underline","drawUnderline","delta","firstCharacter","lastCharacter","drawTextSymbol","computeLinksPoints","radius","computeMiddlePoint","point1","point2","computeAxeAngle","begin","end","CanvasStroker","renderArc","context2d","center","arc","renderLine","linkPoints1","linkPoints2","renderFinal","linkPoints","newAngle","renderQuadratic","ctrl","linkPoints3","quadraticCurveTo","NUMBER_POINTS","pointers","NUMBER_QUADRATICS","secondPoint","beginLine","endLine","beginFinal","endFinal","closePath","CanvasRenderer","_CanvasRenderer_logger","createCanvas","canvas","resizeContent","pixelRatio","devicePixelRatio","renderingCanvas","capturingCanvas","clientHeight","getContext","scale","drawSymbol","element","renderingCanvasContext","capturingCanvasContext","drawModel","clearRect","rawStrokes","drawPendingStroke","module","o","r","l","m","c","d","defineProperty","configurable","enumerable","__esModule","default","prototype","hasOwnProperty","s","Symbol","iterator","toJSON","u","split","trim","_trimSemiColon","toCSS","slice","parser","JsonCSS","StyleHelper","themeToCSS","json","themeToJSON","theme","Number","ink","penStyleToCSS","penStyle","css","penStyleToJSON","penStyleString","stringToJSON","JSONToString","entries","map","k","join","CryptoJS","create","F","obj","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","$super","arguments","instance","properties","propertyName","clone","WordArray","sigBytes","encoder","Hex","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","_r","C_enc","enc","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","C_algo","HMAC","algo","require$$0","X32WordArray","C_x64","x64","Word","high","low","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","X64Word","X64WordArray","X64Word_create","K","W","SHA512","_hash","M","H","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","al","bh","bl","ch","cl","dh","dl","eh","fh","fl","gh","gl","hh","hl","Wi","Wih","Wil","gamma0x","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1x","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","t1l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1h","t2l","nBitsTotal","nBitsLeft","HmacSHA512","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","computeHmac","isVersionSuperiorOrEqual","sourceParts","targetParts","a","b","Stroke","_Stroke_logger","convertStrokeToJSON","RestRecognizer","serverConfig","recognitionConfig","_RestRecognizer_logger","serverConfiguration","recognitionConfiguration","url","postConfig","buildData","strokeGroupByPenStyle","groupIndex","findIndex","sg","isPenStyleEqual","ps1","ps2","strokeGroupsToSend","group","newGroup","contentType","charAt","toUpperCase","toLowerCase","xDPI","yDPI","strokeGroups","post","mimeType","headers","Headers","append","reqInit","method","body","request","Request","response","fetch","ok","blob","catch","tryFetch","res","ErrorConst","code","getMimeTypes","requestedMimeTypes","myModel","getClone","dataToConcert","promises","mt","all","mergeConvert","mimeTypesRequiringExport","filter","mergeExport","UndoRedoContext","stackIndex","possibleUndoCount","canRedo","canUndo","stack","UndoRedoManager","_UndoRedoManager_logger","updateCanUndoRedo","currentModel","addModelToStack","removeLastModelInStack","pop","updateModelInStack","modificationDate","undo","previousModel","redo","nextModel","DefaultPenStyle","DefaultTheme","StyleManager","_StyleManager_penStyle","_StyleManager_theme","_StyleManager_penStyleClasses","_StyleManager_currentPenStyle","_StyleManager_logger","setTheme","setPenStyleClasses","setPenStyle","currentPenStyle","structuredClone","penStyleClasses","penStyleClass","computeDistance","distance","hypot","isNaN","Model","creationDate","_Model_logger","creationTime","selectedStrokes","positions","lastSentPosition","lastReceivedPosition","converts","computePressure","globalDistance","ratio","sqrt","filterPointByAcquisitionDelta","lastPointer","addPoint","at","addStroke","extractUnsentStrokes","initCurrentStroke","dpi","pxWidth","currentStroke","appendToCurrentStroke","endCurrentStroke","resetSelectedStrokes","appendSelectedStrokesFromPoint","_Model_instances","_Model_getStrokeFromPoint","updateStroke","updatedStroke","strokeIndex","removeStroke","removeStrokesFromPoint","strokeToRemove","updatePositionSent","position","updatePositionReceived","clonedModel","isBetween","val","_strokeList","strokePointer","RestBehaviors","options","_RestBehaviors_configuration","_RestBehaviors_model","_RestBehaviors_logger","_RestBehaviors_resizeTimer","_RestBehaviors_exportTimer","styleManager","recognizer","intention","undoRedoManager","penClass","updateModelRendering","drawCurrentStroke","_evt","newModel","deferred","deferredResize","resizeModel","WSRecognizer","_WSRecognizer_logger","pingCount","reconnectionCount","toLocaleLowerCase","infinitePing","socket","close","readyState","send","openCallback","connected","params","sessionId","iinkSessionId","xDpi","yDpi","viewSizeHeight","viewSizeWidth","rejectDeferredPending","initialized","addStrokeDeferred","exportDeferred","_h","convertDeferred","_j","_k","importDeferred","_l","_m","resizeDeferred","_o","_p","undoDeferred","_q","redoDeferred","_s","_t","clearDeferred","_u","waitForIdleDeferred","_v","closeCallback","currentErrorCode","reason","manageHMACChallengeMessage","websocketMessage","hmacChallengeMessage","hmacChallenge","hmac","manageContentPackageDescriptionMessage","currentPartId","managePartChangeMessage","partChangeMessage","partId","manageExportMessage","exportMessage","importPointEventsDeferred","manageWaitForIdle","manageErrorMessage","manageContentChangeMessage","contentChangeMessage","undoStackIndex","manageSVGPatchMessage","svgPatchMessage","messageCallback","WebSocket","OPEN","CONNECTING","addStrokes","styleClasses","localModel","import","chunkSize","importFileId","readBlob","fileReader","FileReader","onloadend","ev","onerror","readAsText","importFileMessage","size","blobPart","fileChuckMessage","lastChunk","importPointEvents","exportPoints","myExportConverted","waitForIdle","undoExports","redoExports","clearExports","SVGStroker","getArcPath","getLinePath","getFinalPath","parts","getQuadraticPath","central","buildSVGPath","STROKE_LENGTH","STROKE_WIDTH","NB_QUADRATICS","beforeLastPoint","svgElement","attrs","svgPathElement","createElementNS","svgPath","WSSVGRenderer","_WSSVGRenderer_logger","fontSize","updateLayer","layerName","_WSSVGRenderer_instances","_WSSVGRenderer_replaceElement","_WSSVGRenderer_removeElement","_WSSVGRenderer_removeChild","_WSSVGRenderer_insertBefore","_WSSVGRenderer_setAttribute","_WSSVGRenderer_removeAttribute","updatesLayer","updates","clearPendingStroke","pendingStrokeGroup","querySelector","oldStroke","clearErasingStrokes","querySelectorAll","erasingStroke","svgList","svg","_WSSVGRenderer_drawStroke","_WSSVGRenderer_replaceAll","oldLayer","insertAdjacentHTML","layer","pendingStrokesGroup","elementToRemove","_WSSVGRenderer_appendChild","parentSelector","parentId","refId","selector","removeAttribute","WSBehaviors","_WSBehaviors_configuration","_WSBehaviors_model","_WSBehaviors_logger","_WSBehaviors_resizeTimer","onSVGPatch","unsentStrokes","styleInject","ref","insertAt","head","getElementsByTagName","firstChild","styleSheet","cssText","createTextNode","logger","defaultBehaviors","_Editor_behaviors","behaviors","_Editor_initializeBehaviors","_Editor_initializationDeferred","_Editor_instances","_Editor_cleanMessage","wrapperHTML","editor","_Editor_showError","finally","_Editor_smartGuide","_Editor_messageHTML","_Editor_showStrokesIfDebug","showStrokesPan","panel","getElementById","_Editor_showNotif","_Editor_addListeners","_Editor_onImportJIIX","_Editor_onExport","_Editor_onContextChange","_Editor_onIdleChange","jjix","Blob","getAvailableFontList","sort","getAvailableLanguageList","Editor","globalClassCss","_Editor_loaderHTML","_Editor_loggerConfiguration","_Editor_instantiateBehaviors","loggerConfiguration","loggerConfig","setLoggerLevel","initializationPromise","initialize","cursor","ps","psc","_Editor_initializeSmartGuide","blobToImport"],"mappings":"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"} \ No newline at end of file diff --git a/examples/server-configuration.json b/examples/server-configuration.json index 8ace2172b..ac60f62c5 100644 --- a/examples/server-configuration.json +++ b/examples/server-configuration.json @@ -1,6 +1,6 @@ { - "scheme": "http", - "host": "localhost:8897", - "applicationKey": "30a605cb-95ea-45ac-aea5-c093322c5100", - "hmacKey": "dc2afdde-40e9-4e96-9d11-430100771123" + "scheme": "https", + "host": "cloud.preprod.myscript.com", + "applicationKey": "df0e4940-0927-45f0-9873-686bfd51395d", + "hmacKey": "b12a8e02-ce2a-4539-b4d8-b8c1b09fda1d" } diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 73b1792a5..000000000 Binary files a/favicon.ico and /dev/null differ diff --git a/index.html b/index.html index ba9acb8c1..d04f1836b 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Title +Title diff --git a/jest.integration.config.js b/jest.integration.config.js deleted file mode 100644 index ec9c37a80..000000000 --- a/jest.integration.config.js +++ /dev/null @@ -1,65 +0,0 @@ -import { devices } from "playwright" - -const projects = [ - { - name: "Desktop Chrome", - ...devices["Desktop Chrome"] - }, - { - name: "Desktop Firefox", - ...devices["Desktop Firefox"] - }, - { - name: "Desktop Safari", - ...devices["Desktop Safari"] - }, - { - name: "Tablet Chrome", - ...devices["Galaxy Tab S4 landscape"] - }, - { - name: "Tablet Safari", - ...devices["iPad Mini landscape"], - }, -] - -const testEnvironmentOptions = { - "jest-playwright": { - contextOptions: { - baseURL: process.env.BASE_URL || "http://localhost:8000", - ignoreHTTPSErrors: true, - }, - exitOnPageError: true, - useDefaultBrowserType: true, - launchOptions: { - headless: process.env.HEADLESS === "false" ? false : true, - }, - }, -} -if (process.env.DEVICE) { - testEnvironmentOptions["jest-playwright"].devices = [process.env.DEVICE] -} -if (process.env.BROWSER) { - testEnvironmentOptions["jest-playwright"].browsers = [process.env.BROWSER] -} -if (process.env.PROJECT) { - const proj = projects.find(p => process.env.PROJECT === p.name) - testEnvironmentOptions["jest-playwright"].devices = [proj] - testEnvironmentOptions["jest-playwright"].browsers = [proj.defaultBrowserType] -} -if(!process.env.DEVICE && !process.env.BROWSER && !process.env.PROJECT) { - testEnvironmentOptions["jest-playwright"].devices = projects - testEnvironmentOptions["jest-playwright"].browsers = ["chromium", "firefox", "webkit"] -} - -export default { - preset: "jest-playwright-preset", - - testEnvironmentOptions, - - setupFilesAfterEnv: ["expect-playwright", "./test/integration/jest.setup.js"], - - testMatch: ["**/integration/**/*.test.js"], - - verbose: false, -} diff --git a/jest.unit.config.js b/jest.unit.config.js deleted file mode 100644 index 54aa8407b..000000000 --- a/jest.unit.config.js +++ /dev/null @@ -1,42 +0,0 @@ - -export default { - clearMocks: true, - // collectCoverage: true, - collectCoverageFrom: [ - "./src/**", - "!./src/@types/**" - ], - coverageThreshold: { - global: { - branches: 80, - functions: 80, - lines: 80, - // statements: -10, - }, - }, - coverageDirectory: "coverage", - coverageProvider: "v8", - moduleFileExtensions: [ - "ts", - "js" - ], - preset: "ts-jest", - setupFiles: [ - "jest-canvas-mock", - "./test/unit/jest.setup.js" - ], - setupFilesAfterEnv: [ - "jest-websocket-mock" - ], - testEnvironment: "jsdom", - testMatch: [ - "**/unit/**/*.test.ts" - ], - testPathIgnorePatterns: [ - "/node_modules/" - ], - transform: { - "^.+\\.css$": "jest-transform-css" - }, - verbose: false -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ffdc1c3b5..000000000 --- a/package-lock.json +++ /dev/null @@ -1,21241 +0,0 @@ -{ - "name": "iink-ts", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "iink-ts", - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "crypto-js": "^3.3.0", - "json-css": "^1.5.6" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.3.0", - "@types/jest": "^29.2.0", - "@types/node": "^18.11.5", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "babel-jest": "^29.2.2", - "eslint": "^8.22.0", - "eslint-plugin-jest": "^27.1.3", - "eslint-plugin-playwright": "^0.11.2", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.4.0", - "jest-environment-jsdom": "^28.1.3", - "jest-fetch-mock": "^3.0.3", - "jest-playwright-preset": "^2.0.0", - "jest-transform-css": "^4.0.1", - "jest-websocket-mock": "^2.4.0", - "npm-run-all": "^4.1.5", - "playwright": "^1.27.1", - "postcss": "^8.4.16", - "rollup": "^2.76.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^4.2.2", - "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-serve": "^2.0.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.32.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tslib": "^2.4.0", - "typedoc": "^0.23.24", - "typedoc-plugin-missing-exports": "^1.0.0", - "typescript": "^4.7.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/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/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/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/@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.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "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-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "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-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "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.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "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/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.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-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.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "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.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/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/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "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/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.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" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "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/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@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.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/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/@jest/console/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/console/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "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/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/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/@jest/core/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/@jest/core/node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "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/core/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/core/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "peer": true, - "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@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": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/expect/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/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, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/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/@jest/globals/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/globals/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "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/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/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/@jest/reporters/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/reporters/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "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.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@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.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@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/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "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/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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/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.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "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/@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^2.42.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", - "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@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/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "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/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/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/@types/jest/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "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/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", - "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "node_modules/@types/wait-on": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", - "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "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/eslint-plugin": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", - "integrity": "sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/type-utils": "5.33.1", - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "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" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "debug": "^4.3.4" - }, - "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" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz", - "integrity": "sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "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.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "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/utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", - "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "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/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "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/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "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/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-escapes/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/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-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "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/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "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/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/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.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-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.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "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.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.2.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/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "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/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "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.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "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/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "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/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/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/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/ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "dev": true - }, - "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/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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": "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/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/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "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/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "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/crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "node_modules/cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dev": true, - "dependencies": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": 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.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "dependencies": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/del/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.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": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "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/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "peer": 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.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "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/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "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": "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/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/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/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "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-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "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.1.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.6.tgz", - "integrity": "sha512-XA7RFLSrlQF9IGtAmhddkUkBuICCTuryfOTfCSWcZHiHb69OilIH05oozH2XA6CEOtztnOd0vgXyvxZodkxGjg==", - "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-playwright": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.11.2.tgz", - "integrity": "sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==", - "dev": true, - "peerDependencies": { - "eslint": ">=7", - "eslint-plugin-jest": ">=24" - }, - "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - } - } - }, - "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-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/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-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "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/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "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.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "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/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "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/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "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/expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect-playwright": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", - "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "dev": true - }, - "node_modules/expect/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/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/expect/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/expect/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.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.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "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.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "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-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dev": true, - "dependencies": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dev": true, - "dependencies": { - "find-file-up": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "bin": { - "find-process": "bin/find-process.js" - } - }, - "node_modules/find-process/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "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/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.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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/fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/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/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, - "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-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dev": true, - "dependencies": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "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/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-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "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-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "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/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "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-instrument/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/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "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-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.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.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-canvas-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz", - "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==", - "dev": true, - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "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": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@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": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/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, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "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/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "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.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "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/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/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/jest-config/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/jest-config/node_modules/jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "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-config/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-config/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/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/jest-diff/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "dependencies": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "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-haste-map/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/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/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-playwright-preset": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-2.0.0.tgz", - "integrity": "sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==", - "dev": true, - "dependencies": { - "expect-playwright": "^0.8.0", - "jest-process-manager": "^0.3.1", - "nyc": "^15.1.0", - "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", - "uuid": "^8.3.2" - }, - "peerDependencies": { - "jest": "^28.0.0", - "jest-circus": "^28.0.0", - "jest-environment-node": "^28.0.0", - "jest-runner": "^28.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-process-manager": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.3.1.tgz", - "integrity": "sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==", - "dev": true, - "dependencies": { - "@types/wait-on": "^5.2.0", - "chalk": "^4.1.0", - "cwd": "^0.10.0", - "exit": "^0.1.2", - "find-process": "^1.4.4", - "prompts": "^2.4.1", - "signal-exit": "^3.0.3", - "spawnd": "^5.0.0", - "tree-kill": "^1.2.2", - "wait-on": "^5.3.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@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": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runner/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/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, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "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/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/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/jest-runtime/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-runtime/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", - "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.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/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/jest-snapshot/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-snapshot/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", - "dev": true, - "dependencies": { - "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", - "postcss-modules": "4.3.1", - "style-inject": "0.3.0" - }, - "peerDependencies": { - "postcss": "^8.4.12" - } - }, - "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/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/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/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/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/jest-watcher/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-websocket-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz", - "integrity": "sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==", - "dev": true, - "dependencies": { - "jest-diff": "^28.0.2", - "mock-socket": "^9.1.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.3.1", - "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/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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-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/joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "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": "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/jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "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-css": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/json-css/-/json-css-1.5.6.tgz", - "integrity": "sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "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.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/livereload": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", - "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.0", - "livereload-js": "^3.3.1", - "opts": ">= 1.2.0", - "ws": "^7.4.3" - }, - "bin": { - "livereload": "bin/livereload.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/livereload-js": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", - "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", - "dev": true - }, - "node_modules/livereload/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "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/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.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "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/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "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/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "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/make-dir/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/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "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/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/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "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/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.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.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "dependencies": { - "color-name": "^1.1.4" - } - }, - "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/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/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/npm-run-all/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/npm-run-all/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/npm-run-all/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/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/npm-run-all/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/npm-run-all/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/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/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/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "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/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/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/nyc/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "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/opts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", - "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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": "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/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "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/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/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/playwright": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.1.tgz", - "integrity": "sha512-GnEizysWMvoqHC3I9l8+4/ZxeLwLNdJJG76xdKGxzOcIZDcw5RSk/FKrFb5CuA+zcLpjIM2p9eR9Z4CuUDkWXg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.32.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-core": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.1.tgz", - "integrity": "sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "dependencies": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-load-config/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/postcss-load-config/node_modules/cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/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/postcss-load-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.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/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise-polyfill": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", - "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==", - "dev": true - }, - "node_modules/promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "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/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "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/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-cwd/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-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dev": true, - "dependencies": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "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/rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.12.0" - } - }, - "node_modules/rollup-plugin-commonjs/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", - "dev": true, - "dependencies": { - "del": "^5.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/rollup-plugin-dts": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.2.tgz", - "integrity": "sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.26.1" - }, - "engines": { - "node": ">=v12.22.11" - }, - "funding": { - "url": "https://github.com/sponsors/Swatinem" - }, - "optionalDependencies": { - "@babel/code-frame": "^7.16.7" - }, - "peerDependencies": { - "rollup": "^2.55", - "typescript": "^4.1" - } - }, - "node_modules/rollup-plugin-dts/node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/rollup-plugin-livereload": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz", - "integrity": "sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==", - "dev": true, - "dependencies": { - "livereload": "^0.9.1" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "8.x" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-postcss/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/rollup-plugin-serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-2.0.1.tgz", - "integrity": "sha512-/9lnzylTMwbXNQUwWAO0DIxW145wl+rmikwFXgujLJ5N9bRfWcjP+qd1XM5wxSiw8ZlBAlFy/n2zRvzcG21bBw==", - "dev": true, - "dependencies": { - "mime": ">=2.4.6", - "opener": "1" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz", - "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "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/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/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/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "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/shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "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/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawnd": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz", - "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "wait-port": "^0.2.9" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "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/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "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/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "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/string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "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/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/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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/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/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@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/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "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/tsutils/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/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.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/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "dev": true, - "peerDependencies": { - "typedoc": "0.22.x || 0.23.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "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/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "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/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "dependencies": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/wait-port": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", - "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wait-port/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/wait-port/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/wait-port/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/wait-port/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/wait-port/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/wait-port/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/wait-port/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/wait-port/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/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/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=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/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "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/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/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/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "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/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@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 - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@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 - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "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 - } - } - }, - "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@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 - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.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" - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@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 - }, - "@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, - "requires": { - "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" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - } - } - }, - "@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 - }, - "@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "peer": true, - "requires": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "dependencies": { - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0" - } - }, - "@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@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.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "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 - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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 - }, - "@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 - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@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 - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@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 - }, - "@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, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "@sinclair/typebox": { - "version": "0.24.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", - "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@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, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@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, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@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, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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 - }, - "@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, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@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, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "@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 - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/node": { - "version": "18.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", - "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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 - }, - "@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "@types/wait-on": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", - "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@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 - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", - "integrity": "sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/type-utils": "5.33.1", - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz", - "integrity": "sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", - "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "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, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "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 - } - } - }, - "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 - }, - "ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "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 - }, - "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 - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", - "dev": true, - "requires": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "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, - "requires": { - "@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" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "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, - "requires": { - "@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" - } - }, - "babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "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 - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "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, - "requires": { - "node-int64": "^0.4.0" - } - }, - "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 - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "dev": true - }, - "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 - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, - "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, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dev": true, - "requires": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - } - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "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 - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "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 - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true - }, - "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, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", - "dev": true - }, - "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "peer": true - }, - "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 - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "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, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "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 - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "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-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "27.1.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.6.tgz", - "integrity": "sha512-XA7RFLSrlQF9IGtAmhddkUkBuICCTuryfOTfCSWcZHiHb69OilIH05oozH2XA6CEOtztnOd0vgXyvxZodkxGjg==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "^5.10.0" - } - }, - "eslint-plugin-playwright": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.11.2.tgz", - "integrity": "sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==", - "dev": true, - "requires": {} - }, - "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, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "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 - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "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 - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "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, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "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" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "expect-playwright": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", - "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "dev": true - }, - "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 - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "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 - }, - "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 - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "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, - "requires": { - "bser": "2.1.1" - } - }, - "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, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - } - }, - "find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dev": true, - "requires": { - "find-file-up": "^0.1.2" - } - }, - "find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - } - } - }, - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "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 - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "requires": { - "loader-utils": "^3.2.0" - } - }, - "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 - }, - "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 - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "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 - }, - "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 - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "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 - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "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 - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "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 - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "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, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "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 - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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 - }, - "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 - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "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 - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "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 - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "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 - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "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 - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "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, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "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, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - } - }, - "jest-canvas-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz", - "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==", - "dev": true, - "requires": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "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.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "peer": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - } - } - }, - "jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "requires": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true - }, - "jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - } - } - }, - "jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "jest-playwright-preset": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-2.0.0.tgz", - "integrity": "sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==", - "dev": true, - "requires": { - "expect-playwright": "^0.8.0", - "jest-process-manager": "^0.3.1", - "nyc": "^15.1.0", - "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", - "uuid": "^8.3.2" - } - }, - "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, - "requires": {} - }, - "jest-process-manager": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.3.1.tgz", - "integrity": "sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==", - "dev": true, - "requires": { - "@types/wait-on": "^5.2.0", - "chalk": "^4.1.0", - "cwd": "^0.10.0", - "exit": "^0.1.2", - "find-process": "^1.4.4", - "prompts": "^2.4.1", - "signal-exit": "^3.0.3", - "spawnd": "^5.0.0", - "tree-kill": "^1.2.2", - "wait-on": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true - }, - "jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - } - }, - "jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - } - }, - "jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "peer": true, - "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", - "dev": true, - "requires": { - "@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.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@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.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", - "dev": true, - "requires": { - "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", - "postcss-modules": "4.3.1", - "style-inject": "0.3.0" - } - }, - "jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.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" - } - } - } - }, - "jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "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 - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-websocket-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz", - "integrity": "sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==", - "dev": true, - "requires": { - "jest-diff": "^28.0.2", - "mock-socket": "^9.1.0" - }, - "dependencies": { - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true - } - } - }, - "jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "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 - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-css": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/json-css/-/json-css-1.5.6.tgz", - "integrity": "sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "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 - }, - "livereload": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", - "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "dev": true, - "requires": { - "chokidar": "^3.5.0", - "livereload-js": "^3.3.1", - "opts": ">= 1.2.0", - "ws": "^7.4.3" - }, - "dependencies": { - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - } - } - }, - "livereload-js": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", - "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "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 - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "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, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "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 - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "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 - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", - "dev": true - }, - "moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "requires": { - "color-name": "^1.1.4" - } - }, - "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 - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "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-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "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 - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "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 - }, - "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 - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "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, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "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, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, - "opts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", - "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "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 - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "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, - "requires": { - "@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" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "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, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "playwright": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.1.tgz", - "integrity": "sha512-GnEizysWMvoqHC3I9l8+4/ZxeLwLNdJJG76xdKGxzOcIZDcw5RSk/FKrFb5CuA+zcLpjIM2p9eR9Z4CuUDkWXg==", - "dev": true, - "requires": { - "playwright-core": "1.32.1" - } - }, - "playwright-core": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.1.tgz", - "integrity": "sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA==", - "dev": true - }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "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, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "requires": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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 - }, - "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "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 - } - } - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "promise-polyfill": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", - "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==", - "dev": true - }, - "promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true - }, - "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, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "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 - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "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 - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "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 - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "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 - } - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "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 - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", - "dev": true, - "requires": { - "del": "^5.1.0" - } - }, - "rollup-plugin-dts": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.2.tgz", - "integrity": "sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "magic-string": "^0.26.1" - }, - "dependencies": { - "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "rollup-plugin-livereload": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz", - "integrity": "sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==", - "dev": true, - "requires": { - "livereload": "^0.9.1" - } - }, - "rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "dependencies": { - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "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 - } - } - }, - "rollup-plugin-serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-2.0.1.tgz", - "integrity": "sha512-/9lnzylTMwbXNQUwWAO0DIxW145wl+rmikwFXgujLJ5N9bRfWcjP+qd1XM5wxSiw8ZlBAlFy/n2zRvzcG21bBw==", - "dev": true, - "requires": { - "mime": ">=2.4.6", - "opener": "1" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "rollup-plugin-typescript2": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz", - "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "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, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "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, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "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 - }, - "shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true - }, - "shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "requires": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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 - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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 - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "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, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - } - } - }, - "spawnd": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz", - "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==", - "dev": true, - "requires": { - "exit": "^0.1.2", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "wait-port": "^0.2.9" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "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 - } - } - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "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, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "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, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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 - }, - "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 - }, - "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 - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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 - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "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, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "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 - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "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, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "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 - }, - "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 - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "requires": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "dev": true, - "requires": {} - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - } - }, - "wait-port": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", - "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "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 - }, - "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, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "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" - } - }, - "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 - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "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 - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 0634873f0..000000000 --- a/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "iink-ts", - "version": "1.0.0-buildVersion", - "description": "iinkTS is the fastest way to integrate handwriting panel and recognition in your webapp", - "license": "Apache-2.0", - "private": false, - "main": "dist/iink.min.js", - "module": "dist/iink.esm.js", - "type": "module", - "types": "dist/iink.d.ts", - "keywords": [ - "myscript", - "javascript", - "developer", - "handwriting", - "recognition", - "cloud", - "iink" - ], - "files": [ - "dist", - "package.json" - ], - "homepage": "https://myscript.github.io/iinkTS/", - "repository": "git://github.com/MyScript/iinkTS.git", - "scripts": { - "lint": "eslint ./src --ext .ts", - "lint:fix": "eslint ./src --ext .ts --fix", - "test:unit": "jest --config=jest.unit.config.js", - "test:unit:coverage": "jest --config=jest.unit.config.js --coverage", - "test:integration": "jest --config=jest.integration.config.js", - "build:docs": "typedoc", - "build:lib": "rollup -c config/rollup.config.build.js --sourcemap", - "build": "npm-run-all lint:fix test:unit build:lib build:docs", - "dev": "rollup -c config/rollup.config.dev.js -w --sourcemap" - }, - "dependencies": { - "crypto-js": "^3.3.0", - "json-css": "^1.5.6" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.3.0", - "@types/jest": "^29.2.0", - "@types/node": "^18.11.5", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "babel-jest": "^29.2.2", - "eslint": "^8.22.0", - "eslint-plugin-jest": "^27.1.3", - "eslint-plugin-playwright": "^0.15.3", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.4.0", - "jest-environment-jsdom": "^28.1.3", - "jest-fetch-mock": "^3.0.3", - "jest-playwright-preset": "^3.0.1", - "jest-transform-css": "^6.0.1", - "jest-websocket-mock": "^2.4.0", - "npm-run-all": "^4.1.5", - "playwright": "^1.36.1", - "postcss": "^8.4.16", - "rollup": "^2.76.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^4.2.2", - "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-serve": "^2.0.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.32.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tslib": "^2.4.0", - "typedoc": "^0.25.2", - "typedoc-plugin-missing-exports": "^2.1.0", - "typescript": "^4.7.4" - }, - "resolutions": { - "**/loader-utils": "3.2.1", - "**/json5": "2.2.2" - } -} diff --git a/plugins/typdoc-default-object.ts b/plugins/typdoc-default-object.ts deleted file mode 100644 index f30d8423c..000000000 --- a/plugins/typdoc-default-object.ts +++ /dev/null @@ -1,42 +0,0 @@ -// @ts-check -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { TypeScript, Converter } = require("typedoc") - -exports.load = function ({ application }) -{ - const defaultValues = new Map() - - const printer = TypeScript.createPrinter({ - removeComments: true, - omitTrailingSemicolon: true, - newLine: TypeScript.NewLineKind.LineFeed - }) - - application.converter.on( - Converter.EVENT_CREATE_DECLARATION, - (context, reflection) => - { - const symbol = context.project.getSymbolFromReflection(reflection) - if (!symbol) return - - const decl = symbol.getDeclarations()?.find(TypeScript.isVariableDeclaration) - if (!decl || !decl.initializer) return - - if (decl.initializer.kind === TypeScript.SyntaxKind.ObjectLiteralExpression) { - // Unfortunately can't just set defaultValue right here, this happens before TD sets it. - defaultValues.set( - reflection, - printer.printNode(TypeScript.EmitHint.Expression, decl.initializer, decl.getSourceFile()) - ) - } - } - ) - - application.converter.on(Converter.EVENT_RESOLVE_BEGIN, () => - { - for (const [refl, init] of defaultValues) { - refl.defaultValue = init.replace("/n", "
") - } - defaultValues.clear() - }) -} diff --git a/preview.gif b/preview.gif deleted file mode 100644 index 80b1e8505..000000000 Binary files a/preview.gif and /dev/null differ diff --git a/src/@types/Behaviors.d.ts b/src/@types/Behaviors.d.ts deleted file mode 100644 index c0020ff22..000000000 --- a/src/@types/Behaviors.d.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { IGrabber } from "./grabber/Grabber" -import { IModel } from "./model/Model" -import { IRecognizer } from "./recognizer/Recognizer" -import { TTheme } from "./style/Theme" -import { TConverstionState } from "./configuration/RecognitionConfiguration" -import { TPenStyle } from "./style/PenStyle" -import { TStroke } from "./model/Stroke" -import { TUndoRedoContext } from "./undo-redo/UndoRedoContext" -import { TConfiguration } from "./configuration" -import { StyleManager } from "../style/StyleManager" -import { TLoggerConfiguration } from "./configuration/LoggerConfiguration" - -export type TBehaviorOptions = { - configuration: TConfiguration - behaviors?: { - grabber?: IGrabber - recognizer?: IRecognizer - } - penStyle?: TPenStyle - theme?: TTheme - logger?: TLoggerConfiguration -} - -export interface IBehaviors -{ - name: string - grabber: IGrabber - recognizer: IRecognizer - context: TUndoRedoContext - options: TBehaviorOptions - styleManager: StyleManager - intention: Intention - #configuration: TConfiguration - - get currentPenStyle(): TPenStyle - - get model(): IModel - - get penStyle(): TPenStyle - setPenStyle(penStyle?: TPenStyle) - - get penStyleClasses(): string - setPenStyleClasses(penStyleClasses?: string) - - get theme(): TTheme - setTheme(theme?: TTheme) - - get configuration(): TConfiguration - set configuration(conf: TConfiguration) - - async init: (element: HTMLElement) => Promise - async export(mimeTypes?: string[]): Promise - async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - async resize(height: number, width: number): Promise - async undo(): Promise - async redo(): Promise - - async waitForIdle?(): Promise - async importPointEvents?(strokes: TStroke[]): Promise - async import?(data: Blob, mimeType?: string): Promise - - async clear(): Promise - - async destroy(): Promise -} diff --git a/src/@types/configuration/Configuration.d.ts b/src/@types/configuration/Configuration.d.ts deleted file mode 100644 index 21febbe5e..000000000 --- a/src/@types/configuration/Configuration.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { TEventConfiguration } from "./EventConfiguration" -import { TGrabberConfiguration } from "./GrabberConfiguration" -import { TRecognitionConfiguration, TRecognitionConfigurationClient } from "./RecognitionConfiguration" -import { TRenderingConfiguration } from "./RenderingConfiguration" -import { TServerConfiguration, TServerConfigurationClient } from "./ServerConfiguration" -import { TTriggerConfiguration } from "./TriggerConfiguration" -import { TUndoRedoConfiguration } from "./UndoRedoConfiguration" - -export type TConfiguration = { - server: TServerConfiguration - recognition: TRecognitionConfiguration - grabber: TGrabberConfiguration - rendering: TRenderingConfiguration - triggers: TTriggerConfiguration - events: TEventConfiguration - "undo-redo": TUndoRedoConfiguration -} - -export type TConfigurationClient = { - server?: TServerConfigurationClient - recognition?: TRecognitionConfigurationClient - grabber?: TGrabberConfiguration - rendering?: TRenderingConfiguration - triggers?: TTriggerConfiguration - events?: TEventConfiguration - "undo-redo"?: TUndoRedoConfiguration -} diff --git a/src/@types/configuration/EventConfiguration.d.ts b/src/@types/configuration/EventConfiguration.d.ts deleted file mode 100644 index 973f55002..000000000 --- a/src/@types/configuration/EventConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TEventConfiguration = { - processDelay: number -} \ No newline at end of file diff --git a/src/@types/configuration/GrabberConfiguration.d.ts b/src/@types/configuration/GrabberConfiguration.d.ts deleted file mode 100644 index 9e23dace0..000000000 --- a/src/@types/configuration/GrabberConfiguration.d.ts +++ /dev/null @@ -1,11 +0,0 @@ - -export type TListenerConfiguration = { - capture: boolean - passive: boolean -} - -export type TGrabberConfiguration = { - listenerOptions: TListenerConfiguration - xyFloatPrecision: number - timestampFloatPrecision: number -} \ No newline at end of file diff --git a/src/@types/configuration/LoggerConfiguration.ts b/src/@types/configuration/LoggerConfiguration.ts deleted file mode 100644 index f2f83ed81..000000000 --- a/src/@types/configuration/LoggerConfiguration.ts +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * @group Logger - */ -export const enum LoggerLevel { - DEBUG = "1", - INFO = "2", - WARN = "3", - ERROR = "4" - } - -/** - * @group Logger - */ - export const enum LoggerClass { - EDITOR = "EDITOR", - RECOGNIZER = "RECOGNIZER", - GRABBER = "GRABBER", - BEHAVIORS = "BEHAVIORS", - CONFIGURATION = "CONFIGURATION", - PUBLIC_EVENT = "PUBLIC_EVENT", - MODEL = "MODEL", - RENDERER = "RENDERER", - SMARTGUIDE = "SMARTGUIDE", - STYLEMANAGER = "STYLEMANAGER", - UNDOREDO_MANAGER = "UNDOREDO_MANAGER", - STROKE = "STROKE", - INTERNALEVENT = "INTERNALEVENT" - } - - export type TLoggerConfiguration = { - [key in keyof typeof LoggerClass]: LoggerLevel - } diff --git a/src/@types/configuration/RecognitionConfiguration.d.ts b/src/@types/configuration/RecognitionConfiguration.d.ts deleted file mode 100644 index e05bc0a41..000000000 --- a/src/@types/configuration/RecognitionConfiguration.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { TConvertConfiguration } from "./recognition/ConvertConfiguration" -import { TDiagramConfiguration } from "./recognition/DiagramConfiguration" -import { TExportConfiguration } from "./recognition/ExportConfiguration" -import { TMathConfiguration } from "./recognition/MathConfiguration" -import { TRawContentConfiguration } from "./recognition/RawContentConfiguration" -import { TTextConfiguration } from "./recognition/TextConfiguration" - -export type TDebugConfiguration = { - "draw-text-boxes": boolean - "draw-image-boxes": boolean -} - -export type TRecognitionRendererConfiguration = { - debug: TDebugConfiguration -} - -export type TRecognitionType = "TEXT" | "MATH" | "DIAGRAM" | "Raw Content" - -export type TConverstionState = "DIGITAL_EDIT" | "HANDWRITING" - -export type TRecognitionConfiguration = { - convert?: TConvertConfiguration - type: TRecognitionType - alwaysConnected: boolean - lang: string - math: TMathConfiguration - text: TTextConfiguration - diagram: TDiagramConfiguration - renderer: TRecognitionRendererConfiguration - export: TExportConfiguration - "raw-content": TRawContentConfiguration - gesture: TGesture -} - -export type TRecognitionConfigurationClient = { - convert?: TConvertConfiguration - type?: TRecognitionType - alwaysConnected?: boolean - lang?: string - math?: TMathConfiguration - text?: TTextConfiguration - diagram?: TDiagramConfiguration - renderer?: TRecognitionRendererConfiguration - export?: TExportConfiguration - "raw-content"?: TRawContentConfiguration - gesture?: { enable: boolean } -} diff --git a/src/@types/configuration/RenderingConfiguration.d.ts b/src/@types/configuration/RenderingConfiguration.d.ts deleted file mode 100644 index e59c85bdc..000000000 --- a/src/@types/configuration/RenderingConfiguration.d.ts +++ /dev/null @@ -1,20 +0,0 @@ - -export type TGuidesConfiguration = { - enable: boolean - gap: numnber -} - -export type TSmartGuidesConfiguration = { - enable: boolean - fadeOut: { - enable: boolean - duration: number - } -} - -export type TRenderingConfiguration = { - minHeight: number - minWidth: number - smartGuide: TSmartGuidesConfiguration - guides: TGuidesConfiguration -} diff --git a/src/@types/configuration/ServerConfiguration.d.ts b/src/@types/configuration/ServerConfiguration.d.ts deleted file mode 100644 index 2068a9aab..000000000 --- a/src/@types/configuration/ServerConfiguration.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -export type TProtocol = "WEBSOCKET" | "REST" - -export type TSchene = "https" | "http" - -export type TServerConfiguration = { - protocol: TProtocol, - scheme: TSchene, - host: string - applicationKey: string - hmacKey: string - version: string - useWindowLocation?: boolean - websocket: { - pingEnabled: boolean - pingDelay: number - maxPingLostCount: number - autoReconnect: boolean - maxRetryCount: number - fileChunkSize: number - } -} - -export type TServerConfigurationClient = { - protocol?: TProtocol, - scheme?: TSchene, - host?: string - applicationKey?: string - hmacKey?: string - version?: string - useWindowLocation?: boolean - websocket?: { - pingEnabled?: boolean - pingDelay?: number - maxPingLostCount?: number - autoReconnect?: boolean - maxRetryCount?: number - fileChunkSize?: number - } -} diff --git a/src/@types/configuration/TriggerConfiguration.d.ts b/src/@types/configuration/TriggerConfiguration.d.ts deleted file mode 100644 index 0dd95743f..000000000 --- a/src/@types/configuration/TriggerConfiguration.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Configure when the action is triggered. - * POINTER_UP : Action is triggered on every PenUP. - * This is the recommended mode for CDK V3 WebSocket recognitions. - * QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. - * The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. - * This is the recommended mode for all REST discoveries. - * DEMAND : Action is triggered on external demande - */ - export type TTriggerConfiguration = { - exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND" - exportContentDelay: number - resizeTriggerDelay: number -} \ No newline at end of file diff --git a/src/@types/configuration/UndoRedoConfiguration.d.ts b/src/@types/configuration/UndoRedoConfiguration.d.ts deleted file mode 100644 index 756eaad87..000000000 --- a/src/@types/configuration/UndoRedoConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TUndoRedoConfiguration = { - maxStackSize: number -} \ No newline at end of file diff --git a/src/@types/configuration/index.d.ts b/src/@types/configuration/index.d.ts deleted file mode 100644 index 99e674bfc..000000000 --- a/src/@types/configuration/index.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./recognition" -export * from "./Configuration" -export * from "./EventConfiguration" -export * from "./GrabberConfiguration" -export * from "./RecognitionConfiguration" -export * from "./RenderingConfiguration" -export * from "./ServerConfiguration" -export * from "./TriggerConfiguration" -export * from "./UndoRedoConfiguration" -export * from "./LoggerConfiguration" \ No newline at end of file diff --git a/src/@types/configuration/recognition/ConvertConfiguration.d.ts b/src/@types/configuration/recognition/ConvertConfiguration.d.ts deleted file mode 100644 index c86a4fc72..000000000 --- a/src/@types/configuration/recognition/ConvertConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TConvertConfiguration = { - convertOnDoubleTap: boolean -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/DiagramConfiguration.d.ts b/src/@types/configuration/recognition/DiagramConfiguration.d.ts deleted file mode 100644 index 0a15e2597..000000000 --- a/src/@types/configuration/recognition/DiagramConfiguration.d.ts +++ /dev/null @@ -1,19 +0,0 @@ - -import { TEraserConfiguration } from "./EraserConfiguration" -import { TTextConfConfiguration } from "./TextConfiguration" - -export type TDiagramConvertConfiguration = { - edge?: boolean - node?: boolean - text?: boolean - "match-text-size"?: boolean -} - -export type TDiagramConfiguration = { - mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[] - "enable-sub-blocks"?: boolean - text?: TTextConfConfiguration - convert?: TDiagramConvertConfiguration - "session-time"?: number - eraser?: TEraserConfiguration -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/EraserConfiguration.d.ts b/src/@types/configuration/recognition/EraserConfiguration.d.ts deleted file mode 100644 index 11a0e44e7..000000000 --- a/src/@types/configuration/recognition/EraserConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TEraserConfiguration = { - "erase-precisely": boolean -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/ExportConfiguration.d.ts b/src/@types/configuration/recognition/ExportConfiguration.d.ts deleted file mode 100644 index 6df9ffd6a..000000000 --- a/src/@types/configuration/recognition/ExportConfiguration.d.ts +++ /dev/null @@ -1,37 +0,0 @@ - -export type TImageViewportConfiguration = { - x: number - y: number - width: number - height: number -} - -export type TImageConfiguration = { - guides: boolean - viewport: TImageViewportConfiguration -} - -export type TJiixConfiguration = { - "bounding-box"?: boolean - strokes: boolean - text?: { - chars: boolean - words: boolean - } - style?: boolean -} - -export type TMathMLFlavor = { - name: string -} - -export type TMathMLExport = { - flavor: TMathMLFlavor -} - -export type TExportConfiguration = { - "image-resolution"?: number - image?: TImageConfiguration - jiix?: TJiixConfiguration - mathml?: TMathMLExport -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/MarginConfiguration.d.ts b/src/@types/configuration/recognition/MarginConfiguration.d.ts deleted file mode 100644 index 4a270d922..000000000 --- a/src/@types/configuration/recognition/MarginConfiguration.d.ts +++ /dev/null @@ -1,7 +0,0 @@ - -export type TMarginConfiguration = { - bottom: number - left: number - right: number - top: number -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/MathConfiguration.d.ts b/src/@types/configuration/recognition/MathConfiguration.d.ts deleted file mode 100644 index 4be7b77f8..000000000 --- a/src/@types/configuration/recognition/MathConfiguration.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TMarginConfiguration } from "./MarginConfiguration" -import { TEraserConfiguration } from "./EraserConfiguration" - -export type TRoundingMode = "half up" | "truncate" - -export type TAngleUnit = "deg" | "rad" - -export type TSolverOptions = "algebraic" | "numeric" - -export type TSolverConfiguration = { - enable?: boolean - "fractional-part-digits"?: number - "decimal-separator"?: string - "rounding-mode"?: TRoundingMode - "angle-unit"?: TAngleUnit - options?: TSolverOptions -} - -export type TUndoRedoMode = "stroke" | "session" - -export type TMathUndoRedoConfiguration = { - mode: TUndoRedoMode -} - -export type TMathConfiguration = { - mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[] - solver?: TSolverConfiguration - margin: TMarginConfiguration - "undo-redo"?: TMathUndoRedoConfiguration - customGrammar?: string - customGrammarId?: string - customGrammarContent?: string - eraser?: TEraserConfiguration - "session-time"?: number - "recognition-timeout"?: number -} diff --git a/src/@types/configuration/recognition/RawContentConfiguration.d.ts b/src/@types/configuration/recognition/RawContentConfiguration.d.ts deleted file mode 100644 index c22766aad..000000000 --- a/src/@types/configuration/recognition/RawContentConfiguration.d.ts +++ /dev/null @@ -1,15 +0,0 @@ - -import { TEraserConfiguration } from "./EraserConfiguration" -import { TTextConfConfiguration } from "./TextConfiguration" - -export type TRawContentRecognitionConfiguration = { - text: boolean - shape: boolean -} - -export type TRawContentConfiguration = { - text?: TTextConfConfiguration - "session-time"?: number - recognition?: TRecognitionConfiguration - eraser?: TEraserConfiguration -} diff --git a/src/@types/configuration/recognition/TextConfiguration.d.ts b/src/@types/configuration/recognition/TextConfiguration.d.ts deleted file mode 100644 index 773ba48aa..000000000 --- a/src/@types/configuration/recognition/TextConfiguration.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TMarginConfiguration } from "./MarginConfiguration" -import { TEraserConfiguration } from "./EraserConfiguration" - -export type TTextGuidesConfiguration = { - enable: boolean -} - -export type TTextConfConfiguration = { - customResources?: string[] - customLexicon?: string[] - addLKText?: boolean -} - -export type TTextConfiguration = { - text?: boolean - mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[] - margin: TMarginConfiguration - guides?: TTextGuidesConfiguration - configuration?: TTextConfConfiguration - eraser?: TEraserConfiguration -} diff --git a/src/@types/configuration/recognition/index.d.ts b/src/@types/configuration/recognition/index.d.ts deleted file mode 100644 index ce1200bf9..000000000 --- a/src/@types/configuration/recognition/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./ConvertConfiguration" -export * from "./DiagramConfiguration" -export * from "./EraserConfiguration" -export * from "./ExportConfiguration" -export * from "./MarginConfiguration" -export * from "./MathConfiguration" -export * from "./RawContentConfiguration" -export * from "./TextConfiguration" diff --git a/src/@types/geometry.ts b/src/@types/geometry.ts deleted file mode 100644 index 8ff835df7..000000000 --- a/src/@types/geometry.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export type TPoint = { - x: number - y: number -} - -export type TPointer = TPoint & { - t: number - p: number -} - -export type TSegment = { p1: TPoint, p2: TPoint } - -export type TLineEquation = { a: number, b: number} diff --git a/src/@types/grabber/Grabber.d.ts b/src/@types/grabber/Grabber.d.ts deleted file mode 100644 index 15ef4cd52..000000000 --- a/src/@types/grabber/Grabber.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TPointer } from "../geometry" - -export interface IGrabber { - attach(domElement?: HTMLElement): void - - detach(domElement?: HTMLElement): void - - onPointerDown(evt: PointerEvent, point: TPointer): void - - onPointerMove(evt: PointerEvent, point: TPointer): void - - onPointerUp(evt: PointerEvent, point: TPointer): void -} diff --git a/src/@types/index.d.ts b/src/@types/index.d.ts deleted file mode 100644 index efc388c45..000000000 --- a/src/@types/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from "./Behaviors" -export * from "./configuration" -export * from "./geometry" -export * from "./grabber/Grabber" -export * from "./model" -export * from "./recognizer" -export * from "./renderer/Symbol" -export * from "./style" -export * from "./undo-redo/UndoRedoContext" diff --git a/src/@types/model/Model.d.ts b/src/@types/model/Model.d.ts deleted file mode 100644 index 269e4dbd0..000000000 --- a/src/@types/model/Model.d.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { TPoint, TPointer } from "../geometry" -import { TStroke } from "./Stroke" -import { TPenStyle } from "../style/PenStyle" -import { TRecognitionPositions } from "./RecognitionPositions" - -export type TWordExport = { - id?: string - label: string, - candidates?: string[] -} - -export type TJIIXExport = { - type: string, - id: string, - label: string, - version: string, - words: TWordExport[] -} - -/** - * List all supported MIME types for export. - * Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} - */ -export type TExport = { - /** @hidden */ - [key: string]: TJIIXExport | string | Blob - /** - * vnd.myscript.jiix is used for text and raw-content exports - */ - "application/vnd.myscript.jiix"?: TJIIXExport - /** - * text/plain is only use for text export - */ - "text/plain"? : string - /** - * x-latex is only use for math export - * @see {@link https://katex.org/docs/browser.html | katex} to render - */ - "application/x-latex"?: string - /** - * mathml+xml is only use for math export - * @see {@link https://www.w3.org/Math/whatIsMathML.html | Mathematical Markup Language} - */ - "application/mathml+xml"?: string - /** - * svg+xml is only use for diagram export - */ - "image/svg+xml"?: string - /** - * vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob | Blob} - */ - "application/vnd.openxmlformats-officedocument.presentationml.presentation"?: Blob -} - -export interface IModel -{ - readonly creationTime: number - modificationDate: number - currentStroke?: TStroke - positions: TRecognitionPositions - rawStrokes: TStroke[] - selectedStrokes: TStroke[] - converts?: TExport - exports?: TExport - width: number - height: number - idle: boolean - - mergeExport(exports: TExport) - mergeConvert(converts: TExport) - - addPoint(stroke: TStroke, point: TPointer): void - addStroke(stroke: TStroke): void - extractUnsentStrokes(): TStroke[] - - initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi: number = 96): void - appendToCurrentStroke(point: TPointer): void - endCurrentStroke(point: TPointer): void - - resetSelectedStrokes(): void - appendSelectedStrokesFromPoint(point: TPoint): void - - removeStroke(id: string): void - updateStroke(updatedStroke: TStroke): void - removeStrokesFromPoint(point: TPoint): string[] - - updatePositionSent(position: number = this.model.rawStrokes.length - 1): void - updatePositionReceived(): void - - getClone(): IModel - - clear(): void -} diff --git a/src/@types/model/RecognitionPositions.d.ts b/src/@types/model/RecognitionPositions.d.ts deleted file mode 100644 index 042238459..000000000 --- a/src/@types/model/RecognitionPositions.d.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export type TRecognitionPositions = { - lastSentPosition: number - lastReceivedPosition: number -} diff --git a/src/@types/model/Stroke.d.ts b/src/@types/model/Stroke.d.ts deleted file mode 100644 index c509bea76..000000000 --- a/src/@types/model/Stroke.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TPointer } from "../geometry" -import { TSymbol } from "../renderer/Symbol" -import { TPenStyle } from "../style/PenStyle" - -export type TStrokeJSON = { - id: string - pointerType: string - x: number[] - y: number[] - t: number[] - p: number[] -} - -export type TStrokeGroupJSON = { - penStyle?: string - strokes: TStrokeJSON[] -} - -export type TStroke = TSymbol & { - id: string - pointerId: number - pointerType: string - pointers: TPointer[] - length: number -} - -export type TStrokeGroup = { - penStyle: TPenStyle - strokes: TStroke[] -} diff --git a/src/@types/model/index.d.ts b/src/@types/model/index.d.ts deleted file mode 100644 index e77dd1c61..000000000 --- a/src/@types/model/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Model" -export * from "./RecognitionPositions" -export * from "./Stroke" diff --git a/src/@types/modules.d.ts b/src/@types/modules.d.ts deleted file mode 100644 index 645fe33b0..000000000 --- a/src/@types/modules.d.ts +++ /dev/null @@ -1,22 +0,0 @@ - -/** - * @hidden - */ -type JsonCSS = { - toCSS(json): string - toJSON(style): TTheme -} - -/** - * @hidden - */ -declare module "json-css" - -/** - * @hidden - */ -declare module "crypto-js/enc-hex" -/** - * @hidden - */ -declare module "crypto-js/hmac-sha512" diff --git a/src/@types/recognizer/Recognizer.d.ts b/src/@types/recognizer/Recognizer.d.ts deleted file mode 100644 index 45507ed41..000000000 --- a/src/@types/recognizer/Recognizer.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IModel } from "../model/Model" - -export interface IRecognizer { - export(model: IModel, mimeTypes?: string[]): Promise - resize(model: IModel): Promise - import?(model: IModel, data: Blob, mimeType?: string): Promise -} diff --git a/src/@types/recognizer/RestRecognizer.d.ts b/src/@types/recognizer/RestRecognizer.d.ts deleted file mode 100644 index 4b177d9d5..000000000 --- a/src/@types/recognizer/RestRecognizer.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TDiagramConfiguration } from "../configuration/recognition/DiagramConfiguration" -import { TMathConfiguration } from "../configuration/recognition/MathConfiguration" -import { TRawContentConfiguration } from "../configuration/recognition/RawContentConfiguration" -import { TTextConfiguration } from "../configuration/recognition/TextConfiguration" -import { TConverstionState } from "../configuration/RecognitionConfiguration" -import { TStrokeGroupJSON } from "../model/Stroke" - -export type TRestPostConfiguration = { - lang: string, - diagram?: TDiagramConfiguration, - math?: TMathConfiguration, - "raw-content"?: TRawContentConfiguration, - text?: TTextConfiguration, - export: TExportConfiguration -} - -export type TRestPostData = { - configuration: TRestPostConfiguration, - xDPI: number, - yDPI: nmber, - contentType: string, - conversionState?: TConverstionState - height: number, - width: nmber, - strokeGroups: TStrokeGroupJSON[] -} \ No newline at end of file diff --git a/src/@types/recognizer/WSRecognizer.d.ts b/src/@types/recognizer/WSRecognizer.d.ts deleted file mode 100644 index 5b5ed24c1..000000000 --- a/src/@types/recognizer/WSRecognizer.d.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { TExport } from "../model/Model" - - -export type TWebSocketEvent = { - type: string - [key: string]: unknown -} - -export type TWebSocketErrorEvent = { - type: string - code?: number | string - message?: string - data? : { - code: number | string - message: string - } -} - -export type TWebSocketHMACChallengeEvent = TWebSocketEvent & { - hmacChallenge: string - iinkSessionId: string -} - -export type TContentPackageDescriptionMessage = TWebSocketEvent & { - contentPartCount: number -} - -export type TWebSocketPartChangeEvent = TWebSocketEvent & { - partIdx: number - partId: string - partCount: number -} - -export type TWebSocketContentChangeEvent = TWebSocketEvent & { - partId: string - canUndo: boolean - canRedo: boolean - empty: boolean - undoStackIndex: number - possibleUndoCount: number -} - -export type TWebSocketExportEvent = TWebSocketEvent & { - partId: string - exports: TExport -} - -export type TUpdatePatchType = "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE" - -export type TUpdatePatch = { - type: TUpdatePatchType -} - -export type TUpdatePatchReplaceAll = TUpdatePatch & { - svg: string -} - -export type TUpdatePatchReplaceELement = TUpdatePatch & { - id: string - svg: string -} - -export type TUpdatePatchInsertBefore = TUpdatePatch & { - refId: string - svg: string -} - -export type TUpdatePatchRemoveElement = TUpdatePatch & { - id: string -} - -export type TUpdatePatchAppendChild = TUpdatePatch & { - parentId?: string - svg: string -} - -export type TUpdatePatchRemoveChild = TUpdatePatch & { - parentId: string - index: number -} - -export type TUpdatePatchRemoveAttribut = TUpdatePatch & { - id?: string - name: string -} - -export type TUpdatePatchSetAttribut = TUpdatePatch & { - id?: string - name: string - value: string -} - -export type TWebSocketSVGPatchEvent = TWebSocketEvent & { - updates: TUpdatePatch[] - layer: ("MODEL" | "CAPTURE") -} diff --git a/src/@types/recognizer/index.d.ts b/src/@types/recognizer/index.d.ts deleted file mode 100644 index adee9a25f..000000000 --- a/src/@types/recognizer/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Recognizer" -export * from "./RestRecognizer" -export * from "./WSRecognizer" diff --git a/src/@types/renderer/Symbol.d.ts b/src/@types/renderer/Symbol.d.ts deleted file mode 100644 index cb526eb83..000000000 --- a/src/@types/renderer/Symbol.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TPenStyle } from "../style/PenStyle" -import { TPoint, TPointer } from "../geometry" - -export type TSymbol = { - elementType?: string - type: string - style: TPenStyle -} - -export type TShapeSymbol = TSymbol & { - candidates: TSymbol[] - selectedCandidateIndex: number -} - -export type TShapeEllipseSymbol = TSymbol & { - centerPoint: TPoint - maxRadius: number - minRadius: number - orientation: number - startAngle: number - sweepAngle: number - beginDecoration?: string - endDecoration?: string - beginTangentAngle: number - endTangentAngle: number -} - -export type TShapeLineSymbol = TShapeEllipseSymbol & { - firstPoint: TPoint - lastPoint: TPoint -} - -export type TLineSymbol = TSymbol & { - data: { - p1: TPoint - p2: TPoint - } -} - -export type TShapeTableSymbol = TSymbol & { - lines: TShapeLineSymbol[] -} - -export type TShapeRecognizedSymbol = TSymbol & { - primitives: TSymbol[] -} - -export type TUnderLineSymbol = TSymbol & { - data: { - firstCharacter: number - lastCharacter: number - } -} - -export type TTextUnderlineDataSymbol = { - topLeftPoint: TPointer - height: number - width: number - textHeight: number - justificationType: string -} - -export type TTextUnderlineSymbol = TSymbol & { - label: string, - data: TTextUnderlineDataSymbol - underlineList: TUnderLineSymbol[] -} diff --git a/src/@types/style/PenStyle.d.ts b/src/@types/style/PenStyle.d.ts deleted file mode 100644 index 61a7f23f7..000000000 --- a/src/@types/style/PenStyle.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @typedef {Object} PenStyle - * @property {String} color=#000000 Color (supported formats rgb() rgba() hsl() hsla() #rgb #rgba #rrggbb #rrggbbaa) - * @property {String} -myscript-pen-width=1 Width of strokes and primitives in mm (no other unit is supported yet) - * @property {String} -myscript-pen-fill-style=none - * @property {String} -myscript-pen-fill-color=#FFFFFF00 Color filled inside the area delimited by strokes and primitives - */ -export type TPenStyle = { - color?: string - width?: number - "-myscript-pen-width"?: number - "-myscript-pen-fill-style"?: string - "-myscript-pen-fill-color"?: string -} \ No newline at end of file diff --git a/src/@types/style/Theme.d.ts b/src/@types/style/Theme.d.ts deleted file mode 100644 index ea0eee1d1..000000000 --- a/src/@types/style/Theme.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TPenStyle } from "./PenStyle" - -export type TMathTheme = { - "font-family": string -} - -export type TMathSolvedTheme = { - "font-family": string - color: string -} - -export type TTextTheme = { - "font-family": string, - "font-size": number -} - -export type TTheme = { - ink: TPenStyle - ".math": TMathTheme - ".math-solved": TMathSolvedTheme - ".text": TTextTheme - [key: string]: unknown -} \ No newline at end of file diff --git a/src/@types/style/index.d.ts b/src/@types/style/index.d.ts deleted file mode 100644 index c2ef16788..000000000 --- a/src/@types/style/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./PenStyle" -export * from "./Theme" diff --git a/src/@types/undo-redo/UndoRedoContext.d.ts b/src/@types/undo-redo/UndoRedoContext.d.ts deleted file mode 100644 index 72cc625a0..000000000 --- a/src/@types/undo-redo/UndoRedoContext.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IModel } from "../model/Model" - -export type TUndoRedoContext = { - canUndo: boolean - canRedo: boolean - empty: boolean - stackIndex: number - possibleUndoCount: number - stack: IModel[] -} diff --git a/src/Constants.ts b/src/Constants.ts deleted file mode 100644 index 1424a31cd..000000000 --- a/src/Constants.ts +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @group Error - * @remarks List all errors generated by the backend with their descriptions - */ -export const Error = { - NO_ACTIVITY: "Session closed due to no activity.", - WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey.", - TOO_OLD: "Session is too old. Max Session Duration Reached.", - UNKNOW: "An unknown error has occurred.", - ABNORMAL_CLOSURE: "MyScript recognition server is not reachable.", - CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.", - GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.", - PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error.", - UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)", - INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).", - POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy.", - MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large.", - INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.", - SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting.", - TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.", - BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.", - TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake" -} as const - -/** - * @event - * @remarks Lists all events that can be listened to on the editor or DOM element - */ -export const EventType = { - /** - * @event - * event emitted when history has changed i.e. the context of undo-redo - */ - CHANGED: "changed", - /** - * @event - * event emitted when clearing is complete - */ - CLEARED: "cleared", - /** - * @event - * event emitted after the conversion is complete - */ - CONVERTED: "converted", - /** - * @event - * event emitted when the editor encounters an error - */ - ERROR: "error", - /** - * @event - * event emitted on click on pointer events - */ - POINTEREVENTS: "pointer_events", - /** - * @event - * event emitted after the end of the export - */ - EXPORTED: "exported", - /** - * @event - * event emitted after the end of the import - */ - IMPORTED: "imported", - /** - * @event - * event emitted when the server is idle after a job - */ - IDLE: "idle", - /** - * @event - * event emitted after full editor initialization - */ - LOADED: "loaded", -} as const - -/** - * @event - * @internal - * @remarks Lists all internal library events - */ -export const InternalEventType = { - SVG_PATCH: "internal_svg_patch", - EXPORTED: "internal_exported", - CLEAR_MESSAGE: "internal_clear_message", - ERROR: "internal_error", - NOTIF: "internal_notif", - IMPORT_JIIX: "internal_import_jiix", - CONVERT: "internal_convert", - CLEAR: "internal_clear", - CONTEXT_CHANGE: "internal_context_change", - IDLE: "internal_idle", - WS_CLOSED: "internal_websocket_closed", -} as const - -/** - * @group Export - * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} - */ -export const enum ExportType { - JIIX = "application/vnd.myscript.jiix", - TEXT = "text/plain", - LATEX = "application/x-latex", - MATHML = "application/mathml+xml", - SVG = "image/svg+xml", - OFFICE_DOCUMENT = "application/vnd.openxmlformats-officedocument.presentationml.presentation" -} - -/** - * @group Editor - * @remarks List the possibilities of interactions - */ -export const enum Intention -{ - Write = "write", - Erase = "erase", - // Selecting = "selecting" -} - -/** - * @group Logger - */ -export { LoggerClass, LoggerLevel } from "./@types/configuration/LoggerConfiguration" diff --git a/src/Editor.ts b/src/Editor.ts deleted file mode 100644 index 9e69cad3d..000000000 --- a/src/Editor.ts +++ /dev/null @@ -1,482 +0,0 @@ -import { TConfiguration } from "./@types/configuration" -import { IGrabber } from "./@types/grabber/Grabber" -import { TStroke } from "./@types/model/Stroke" -import { IModel, TExport, TJIIXExport } from "./@types/model/Model" -import { TPenStyle } from "./@types/style/PenStyle" -import { TTheme } from "./@types/style/Theme" -import { IBehaviors, TBehaviorOptions } from "./@types/Behaviors" -import { TConverstionState } from "./@types/configuration/RecognitionConfiguration" -import { TMarginConfiguration } from "./@types/configuration/recognition/MarginConfiguration" -import { TUndoRedoContext } from "./@types/undo-redo/UndoRedoContext" -import { LoggerClass, TLoggerConfiguration } from "./@types/configuration/LoggerConfiguration" - -import { ExportType, Intention } from "./Constants" -import { DefaultLoggerConfiguration } from "./configuration" -import { PublicEvent } from "./event/PublicEvent" -import { InternalEvent } from "./event/InternalEvent" -import { SmartGuide } from "./smartguide/SmartGuide" -import { DeferredPromise } from "./utils/DeferredPromise" -import { RestBehaviors } from "./behaviors/RestBehaviors" -import { WSBehaviors } from "./behaviors/WSBehaviors" -import { LoggerManager, Logger } from "./logger" - -import "./iink.css" - -export type HTMLEditorElement = HTMLElement & -{ - editor: Editor -} - -export class Editor -{ - wrapperHTML: HTMLEditorElement - #loaderHTML: HTMLDivElement - #messageHTML: HTMLDivElement - #behaviors!: IBehaviors - #smartGuide?: SmartGuide - #initializationDeferred: DeferredPromise - - logger: Logger - #loggerConfiguration: TLoggerConfiguration - showStrokesPan = false - - constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = "ms-editor") - { - this.#loggerConfiguration = Object.assign({}, DefaultLoggerConfiguration, options.logger) - - this.logger = LoggerManager.getLogger(LoggerClass.EDITOR) - this.logger.info("constructor", { wrapperHTML, options, globalClassCss }) - this.#initializationDeferred = new DeferredPromise() - - this.wrapperHTML = wrapperHTML as HTMLEditorElement - this.wrapperHTML.classList.add(globalClassCss) - this.events.setElement(this.wrapperHTML) - - this.#loaderHTML = document.createElement("div") - this.#loaderHTML.classList.add("loader") - this.#loaderHTML.style.display = "none" - this.wrapperHTML.appendChild(this.#loaderHTML) - - this.#messageHTML = document.createElement("div") - this.#messageHTML.classList.add("message") - this.#messageHTML.style.display = "none" - this.wrapperHTML.appendChild(this.#messageHTML) - - this.#instantiateBehaviors(options) - } - - get loggerConfiguration(): TLoggerConfiguration - { - return this.#loggerConfiguration - } - - set loggerConfiguration(loggerConfig: TLoggerConfiguration) - { - this.#loggerConfiguration = loggerConfig - LoggerManager.setLoggerLevel(loggerConfig) - } - - get initializationPromise(): Promise - { - return this.#initializationDeferred.promise - } - - get model(): IModel - { - return this.behaviors.model - } - - get behaviors(): IBehaviors - { - return this.#behaviors - } - - get configuration(): TConfiguration - { - return this.behaviors.configuration - } - set configuration(configuration: TConfiguration) - { - this.logger.info("set configuration", { configuration }) - this.#instantiateBehaviors({ configuration }) - this.initialize() - } - - get intention(): Intention - { - return this.behaviors.intention - } - set intention(m: Intention) - { - this.logger.info("set intention", { m }) - this.behaviors.intention = m - switch (this.behaviors.intention) { - case Intention.Erase: - this.wrapperHTML.classList.add("erasing") - this.wrapperHTML.classList.remove("selecting") - break - // case Intention.Selecting: - // this.model.resetSelectedStrokes() - // this.wrapperHTML.classList.remove("erasing") - // this.wrapperHTML.classList.add("selecting") - // break; - default: - this.logger.warn("set intention default", { m }) - document.body.style.cursor = "initial" - this.wrapperHTML.classList.remove("erasing") - this.wrapperHTML.classList.remove("selecting") - break - } - this.logger.debug("set intention", this.wrapperHTML) - } - - get events(): PublicEvent - { - return PublicEvent.getInstance() - } - - get context(): TUndoRedoContext - { - return this.behaviors.context - } - - get grabber(): IGrabber - { - return this.behaviors.grabber - } - - get currentPenStyle(): TPenStyle - { - return this.behaviors.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.behaviors.penStyle - } - set penStyle(ps: TPenStyle) - { - this.logger.info("set penStyle", { ps }) - this.behaviors.setPenStyle(ps) - } - - get theme(): TTheme - { - return this.behaviors.theme - } - set theme(t: TTheme) - { - this.logger.info("set theme", { t }) - this.behaviors.setTheme(t) - } - - get penStyleClasses(): string - { - return this.behaviors.penStyleClasses - } - set penStyleClasses(psc: string) - { - this.logger.info("set penStyleClasses", { psc }) - this.behaviors.setPenStyleClasses(psc) - } - - #instantiateBehaviors(options: TBehaviorOptions) - { - this.logger.info("instantiateBehaviors", { options }) - if (!options?.configuration) { - throw new Error("Configuration required") - } - InternalEvent.getInstance().removeAllListeners() - if (this.#behaviors) { - this.#behaviors.destroy() - } - let defaultBehaviors: IBehaviors - if (options.configuration.server?.protocol === "REST") { - defaultBehaviors = new RestBehaviors(options) - } else { - defaultBehaviors = new WSBehaviors(options) - } - this.#behaviors = Object.assign(defaultBehaviors, options.behaviors) - this.logger.debug("instantiateBehaviors", this.#behaviors) - } - - async #initializeBehaviors(): Promise - { - this.logger.info("initializeBehaviors start") - this.#initializationDeferred = new DeferredPromise() - this.#loaderHTML.style.display = "initial" - this.#cleanMessage() - this.logger.debug("initializeBehaviors", this.wrapperHTML) - return this.behaviors.init(this.wrapperHTML) - .then(async () => - { - this.logger.info("initializeBehaviors then") - this.wrapperHTML.editor = this - this.#initializationDeferred.resolve() - this.events.emitLoaded() - this.logger.debug("initializeBehaviors", this.wrapperHTML) - }) - .catch((error: Error) => - { - this.logger.error("initializeBehaviors catch", { error }) - this.#initializationDeferred.reject(error) - this.#showError(error) - }) - .finally(() => - { - this.logger.info("initializeBehaviors finally", { }) - this.#loaderHTML.style.display = "none" - return this.#initializationDeferred.promise - }) - } - - #initializeSmartGuide(): void - { - this.#smartGuide?.destroy() - this.logger.info("initializeSmartGuide", { smartGuide: this.configuration.rendering.smartGuide }) - if (this.configuration.rendering.smartGuide.enable) { - this.#smartGuide = new SmartGuide() - let margin: TMarginConfiguration - switch (this.configuration.recognition.type) { - case "TEXT": - margin = this.configuration.recognition.text.margin - break - case "MATH": - margin = this.configuration.recognition.math.margin - break - default: - this.logger.warn("initializeSmartGuide default", this.configuration.recognition.type) - margin = { - top: 20, - left: 10, - right: 10, - bottom: 10 - } - break - } - this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering) - } - } - - #cleanMessage() - { - this.logger.debug("cleanMessage", this.#messageHTML) - this.#messageHTML.style.display = "none" - this.#messageHTML.innerHTML = "" - this.logger.debug("cleanMessage", this.#messageHTML) - } - - #showError(err: Error) - { - this.logger.debug("showError", this.#messageHTML) - this.#messageHTML.style.display = "initial" - this.#messageHTML.classList.add("error-msg") - this.#messageHTML.classList.remove("info-msg") - this.#messageHTML.innerText = err.message - this.logger.debug("showError", this.#messageHTML) - } - - #showNotif(notif: { message: string, timeout?: number }) - { - this.logger.debug("showNotif", this.#messageHTML) - this.#messageHTML.style.display = "initial" - this.#messageHTML.classList.add("info-msg") - this.#messageHTML.classList.remove("error-msg") - this.#messageHTML.innerText = notif.message - setTimeout(() => - { - this.#cleanMessage() - }, notif.timeout || 2500) - this.logger.debug("showNotif", this.#messageHTML) - } - - #showStrokesIfDebug(): void - { - if (this.showStrokesPan) { - let panel = document.getElementById("stroke-panel") - const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers }))) - if (!panel) { - panel = document.createElement("div") - panel.id = "stroke-panel" - panel.addEventListener("click", (e) => - { - e.preventDefault() - e.stopPropagation() - navigator.clipboard.writeText(panel?.innerText as string) - this.#showNotif({ message: "strokes copied to clipboard!", timeout: 1500 }) - }) - this.wrapperHTML.appendChild(panel) - } - panel.innerText = text - } - } - - #addListeners(): void - { - InternalEvent.getInstance().addConvertListener(this.convert.bind(this)) - InternalEvent.getInstance().addClearListener(this.clear.bind(this)) - InternalEvent.getInstance().addErrorListener(this.#showError.bind(this)) - InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this)) - InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this)) - InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this)) - InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this)) - InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this)) - InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this)) - } - - #onContextChange = (context: TUndoRedoContext) => - { - this.events.emitChanged(context) - } - - #onIdleChange = (idle: boolean) => - { - this.events.emitIdle(idle) - } - - #onExport(exports: TExport): void - { - this.logger.info("onExport", { exports }) - this.model.mergeExport(exports) - if (this.configuration.rendering.smartGuide.enable) { - if (exports && exports["application/vnd.myscript.jiix"]) { - const jjix = exports["application/vnd.myscript.jiix"] as TJIIXExport - this.#smartGuide?.update(jjix) - } - } - this.#showStrokesIfDebug() - this.events.emitExported(exports) - } - - #onImportJIIX(jiix: TJIIXExport): void - { - this.logger.info("onImportJIIX", { jiix }) - this.import(new Blob([JSON.stringify(jiix)], { type: ExportType.JIIX }), ExportType.JIIX) - } - - async initialize(): Promise - { - this.logger.info("initialize") - await this.#initializeBehaviors() - this.#initializeSmartGuide() - this.#addListeners() - } - - async waitForIdle(): Promise - { - if (this.behaviors.waitForIdle) - { - return this.behaviors.waitForIdle() - } - return - } - - async undo(): Promise - { - this.logger.debug("undo", this.model) - this.logger.info("undo", { }) - await this.#initializationDeferred.promise - await this.behaviors.undo() - this.#showStrokesIfDebug() - this.logger.debug("undo", this.model) - return this.model - } - - async redo(): Promise - { - this.logger.debug("redo", this.model) - this.logger.info("redo") - await this.#initializationDeferred.promise - await this.behaviors.redo() - this.#showStrokesIfDebug() - this.logger.debug("redo", this.model) - return this.model - } - - async clear(): Promise - { - this.logger.debug("clear", this.model) - this.logger.info("clear") - await this.#initializationDeferred.promise - await this.behaviors.clear() - this.events.emitCleared(this.model) - this.#showStrokesIfDebug() - this.logger.debug("clear", this.model) - return this.model - } - - async resize(): Promise - { - this.logger.debug("resize", this.model) - this.logger.info("resize") - await this.#initializationDeferred.promise - if (this.configuration.rendering.smartGuide.enable) { - this.#smartGuide?.resize() - } - const height = Math.max(this.wrapperHTML.clientHeight, this.configuration.rendering.minHeight) - const width = Math.max(this.wrapperHTML.clientWidth, this.configuration.rendering.minWidth) - await this.behaviors.resize(height, width) - this.logger.debug("resize", this.model) - return this.model - } - - async export(mimeTypes?: string[]): Promise - { - this.logger.debug("export", this.model) - this.logger.info("export", { mimeTypes }) - await this.#initializationDeferred.promise - await this.behaviors.export(mimeTypes) - this.logger.debug("export", this.model) - return this.model - } - - async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise - { - this.logger.debug("convert", this.model) - this.logger.info("export", { params }) - await this.#initializationDeferred.promise - await this.behaviors.convert(params?.conversionState, params?.mimeTypes) - this.events.emitConverted(this.model.converts as TExport) - this.logger.debug("convert", this.model) - return this.model - } - - async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise - { - this.logger.debug("import", this.model) - this.logger.info("import", { data, mimeType }) - await this.#initializationDeferred.promise - if (this.behaviors.import) { - let blobToImport: Blob - if (data instanceof Blob) { - blobToImport = data - } - else if (typeof data === "string") { - blobToImport = new Blob([data]) - } - else { - blobToImport = new Blob([JSON.stringify(data)]) - } - await this.behaviors.import(blobToImport, mimeType) - this.events.emitImported(this.model.exports as TExport) - this.logger.debug("import", this.model) - return this.model - } - return Promise.reject("Import impossible, behaviors has no import function") - } - - async importPointEvents(strokes: TStroke[]): Promise - { - this.logger.debug("importPointEvents", this.model) - this.logger.info("importPointEvents", { strokes }) - await this.#initializationDeferred.promise - if (this.behaviors.importPointEvents) { - await this.behaviors.importPointEvents(strokes) - this.events.emitImported(this.model.exports as TExport) - this.logger.debug("importPointEvents", this.model) - return this.model - } - return Promise.reject("Import impossible, behaviors has no importPointEvents function") - } - -} diff --git a/src/behaviors/RestBehaviors.ts b/src/behaviors/RestBehaviors.ts deleted file mode 100644 index 5da42f177..000000000 --- a/src/behaviors/RestBehaviors.ts +++ /dev/null @@ -1,319 +0,0 @@ -import { IBehaviors, TBehaviorOptions } from "../@types/Behaviors" -import { IModel, TExport } from "../@types/model/Model" -import { TConfiguration } from "../@types/configuration" -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" -import { TPointer } from "../@types/geometry" - -import { PointerEventGrabber } from "../grabber/PointerEventGrabber" -import { CanvasRenderer } from "../renderer/canvas/CanvasRenderer" -import { RestRecognizer } from "../recognizer/RestRecognizer" -import { DeferredPromise } from "../utils/DeferredPromise" -import { UndoRedoManager } from "../undo-redo/UndoRedoManager" -import { InternalEvent } from "../event/InternalEvent" -import { StyleManager } from "../style/StyleManager" -import { Configuration } from "../configuration/Configuration" -import { Model } from "../model/Model" -import { Intention, LoggerClass } from "../Constants" -import { LoggerManager } from "../logger" - -export class RestBehaviors implements IBehaviors -{ - name = "RestBehaviors" - options: TBehaviorOptions - grabber: PointerEventGrabber - renderer: CanvasRenderer - recognizer: RestRecognizer - undoRedoManager: UndoRedoManager - styleManager: StyleManager - #configuration: TConfiguration - #model: IModel - intention: Intention - #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS) - - #resizeTimer?: ReturnType - #exportTimer?: ReturnType - - constructor(options: TBehaviorOptions) - { - this.#logger.info("constructor", { options }) - this.options = options - this.#configuration = new Configuration(options?.configuration) - this.styleManager = new StyleManager(options.penStyle, options.theme) - - this.grabber = new PointerEventGrabber(this.#configuration.grabber) - this.renderer = new CanvasRenderer(this.#configuration.rendering) - this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition) - - this.intention = Intention.Write - this.#model = new Model() - this.undoRedoManager = new UndoRedoManager(this.#configuration["undo-redo"], this.model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - get model(): IModel - { - return this.#model - } - - get context(): TUndoRedoContext - { - return this.undoRedoManager.context - } - - get currentPenStyle(): TPenStyle - { - return this.styleManager.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.styleManager.penStyle - } - setPenStyle(style?: TPenStyle) - { - this.#logger.info("setPenStyle", { style }) - this.styleManager.setPenStyle(style) - } - - get penStyleClasses(): string - { - return this.styleManager.penStyleClasses - } - setPenStyleClasses(penClass?: string) - { - this.#logger.info("setPenStyleClasses", { penClass }) - this.styleManager.setPenStyleClasses(penClass) - } - - get theme(): TTheme - { - return this.styleManager.theme - } - setTheme(theme?: TTheme) - { - this.#logger.info("setTheme", { theme }) - this.styleManager.setTheme(theme) - } - - get configuration(): TConfiguration - { - return this.#configuration - } - - async init(domElement: HTMLElement): Promise - { - this.#logger.info("init", { domElement }) - this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth) - this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight) - this.undoRedoManager.updateModelInStack(this.model) - - this.renderer.init(domElement) - - this.grabber.attach(domElement) - this.grabber.onPointerDown = this.onPointerDown.bind(this) - this.grabber.onPointerMove = this.onPointerMove.bind(this) - this.grabber.onPointerUp = this.onPointerUp.bind(this) - } - - private onPointerDown(evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerDown", { intention: this.intention, evt, point }) - const { pointerType } = evt - const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle) - switch (this.intention) { - case Intention.Erase: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(model => Object.assign(this.model, model)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - case Intention.Write: - this.model.initCurrentStroke(point, evt.pointerId, pointerType, style) - this.drawCurrentStroke() - break - default: - this.#logger.warn(`onPointerDown intention unknow: "${this.intention}"`) - break - } - } - - private onPointerMove(_evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerMove", { intention: this.intention, point }) - switch (this.intention) { - case Intention.Erase: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - case Intention.Write: - this.model.appendToCurrentStroke(point) - this.drawCurrentStroke() - break - default: - this.#logger.warn(`onPointerMove intention unknow: "${this.intention}"`) - break - } - } - - private onPointerUp(_evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerUp", { intention: this.intention, point }) - switch (this.intention) { - case Intention.Erase: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - case Intention.Write: - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - break - default: - this.#logger.warn(`onPointerUp intention unknow: "${this.intention}"`) - break - } - } - - drawCurrentStroke(): void - { - this.#logger.debug("drawCurrentStroke", { stroke: this.model.currentStroke }) - this.renderer.drawPendingStroke(this.model.currentStroke) - } - - async updateModelRendering(): Promise - { - this.#logger.info("updateModelRendering") - this.renderer.drawModel(this.model) - const deferred = new DeferredPromise() - this.undoRedoManager.addModelToStack(this.model) - if (this.#configuration.triggers.exportContent !== "DEMAND") { - clearTimeout(this.#exportTimer) - let currentModel = this.model.getClone() - this.#exportTimer = setTimeout(async () => - { - try { - currentModel = await this.recognizer.export(currentModel) - this.undoRedoManager.updateModelInStack(currentModel) - if (this.model.modificationDate === currentModel.modificationDate) { - this.model.exports = currentModel.exports - } - deferred.resolve(this.model) - } catch (error) { - this.#logger.error("updateModelRendering", { error }) - deferred.reject(error as Error) - } - }, this.#configuration.triggers.exportContent === "QUIET_PERIOD" ? this.#configuration.triggers.exportContentDelay : 0) - } else { - deferred.resolve(this.model) - } - await deferred.promise - this.internalEvent.emitExported(this.model.exports as TExport) - this.#logger.debug("updateModelRendering", this.model.exports) - return deferred.promise - } - - async export(mimeTypes?: string[]): Promise - { - this.#logger.info("export", { mimeTypes }) - const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes) - if (this.model.modificationDate === newModel.modificationDate) { - this.model.mergeExport(newModel.exports as TExport) - } - this.undoRedoManager.updateModelInStack(newModel) - this.#logger.debug("export", this.model) - return this.model - } - - async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("convert", { conversionState, requestedMimeTypes }) - const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes) - Object.assign(this.#model, newModel) - this.#logger.debug("convert", this.model) - return this.model - } - - async resize(height: number, width: number): Promise - { - this.#logger.info("resize", { height, width }) - const deferredResize = new DeferredPromise() - this.model.height = height - this.model.width = width - this.renderer.resize(this.model) - if (this.model.rawStrokes.length) { - clearTimeout(this.#resizeTimer) - this.#resizeTimer = setTimeout(async () => - { - const resizeModel = await this.recognizer.resize(this.model) - deferredResize.resolve(resizeModel) - }, this.#configuration.triggers.resizeTriggerDelay) - } else { - deferredResize.resolve(this.model) - } - const newModel = await deferredResize.promise - this.#logger.debug("resize", { newModel }) - this.internalEvent.emitExported(newModel.exports as TExport) - return newModel - } - - async undo(): Promise - { - this.#logger.info("undo") - this.#model = this.undoRedoManager.undo() - this.renderer.drawModel(this.#model) - this.#model = await this.recognizer.export(this.#model) - this.undoRedoManager.updateModelInStack(this.#model) - this.internalEvent.emitExported(this.#model.exports as TExport) - this.#logger.debug("undo", this.#model) - return this.#model - } - - async redo(): Promise - { - this.#logger.info("redo") - this.#model = this.undoRedoManager.redo() - this.renderer.drawModel(this.#model) - this.#model = await this.recognizer.export(this.#model) - this.undoRedoManager.updateModelInStack(this.#model) - this.internalEvent.emitExported(this.#model.exports as TExport) - this.#logger.debug("redo", this.#model) - return this.#model - } - - async clear(): Promise - { - this.#logger.info("clear") - this.model.clear() - this.undoRedoManager.addModelToStack(this.model) - this.renderer.drawModel(this.model) - this.internalEvent.emitExported(this.model.exports as TExport) - this.#logger.debug("clear", this.model) - return this.model - } - - async destroy(): Promise - { - this.#logger.info("destroy") - this.grabber.detach() - this.renderer.destroy() - return Promise.resolve() - } -} diff --git a/src/behaviors/WSBehaviors.ts b/src/behaviors/WSBehaviors.ts deleted file mode 100644 index 6c2890a94..000000000 --- a/src/behaviors/WSBehaviors.ts +++ /dev/null @@ -1,324 +0,0 @@ -import { IBehaviors, TBehaviorOptions } from "../@types/Behaviors" -import { TConfiguration } from "../@types/configuration" -import { IModel, TExport } from "../@types/model/Model" -import { TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TStroke } from "../@types/model/Stroke" -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TTheme } from "../@types/style/Theme" -import { TPenStyle } from "../@types/style/PenStyle" -import { TPointer } from "../@types/geometry" - -import { PointerEventGrabber } from "../grabber/PointerEventGrabber" -import { WSRecognizer } from "../recognizer/WSRecognizer" -import { Intention } from "../Constants" -import { InternalEvent } from "../event/InternalEvent" -import { DeferredPromise } from "../utils/DeferredPromise" -import { WSSVGRenderer } from "../renderer/svg/WSSVGRenderer" -import { StyleManager } from "../style/StyleManager" -import { Configuration } from "../configuration/Configuration" -import { Model } from "../model/Model" -import { UndoRedoManager } from "../undo-redo" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class WSBehaviors implements IBehaviors -{ - name = "WSBehaviors" - options: TBehaviorOptions - grabber: PointerEventGrabber - renderer: WSSVGRenderer - recognizer: WSRecognizer - undoRedoManager: UndoRedoManager - styleManager: StyleManager - #configuration: TConfiguration - #model: IModel - intention: Intention - #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS) - - #resizeTimer?: ReturnType - - constructor(options: TBehaviorOptions) - { - this.#logger.info("constructor", { options }) - this.options = options - this.#configuration = new Configuration(options?.configuration) - this.styleManager = new StyleManager(options.penStyle, options.theme) - - this.grabber = new PointerEventGrabber(this.#configuration.grabber) - this.renderer = new WSSVGRenderer(this.#configuration.rendering) - this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition) - - this.intention = Intention.Write - this.#model = new Model() - this.undoRedoManager = new UndoRedoManager(this.#configuration["undo-redo"], this.model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - get model(): IModel - { - return this.#model - } - - get context(): TUndoRedoContext - { - return this.undoRedoManager.context - } - - get configuration(): TConfiguration - { - return this.#configuration - } - - get currentPenStyle(): TPenStyle - { - return this.styleManager.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.styleManager.penStyle - } - setPenStyle(penStyle?: TPenStyle): Promise - { - this.#logger.info("setPenStyle", { penStyle }) - this.styleManager.setPenStyle(penStyle) - this.#logger.debug("setPenStyle", this.styleManager.penStyle) - return this.recognizer.setPenStyle(this.styleManager.penStyle) - } - - get penStyleClasses(): string - { - return this.styleManager.penStyleClasses - } - setPenStyleClasses(penClass?: string): Promise - { - this.#logger.info("setPenStyleClasses", { penClass }) - this.styleManager.setPenStyleClasses(penClass) - this.#logger.debug("setPenStyleClasses", this.styleManager.penStyleClasses) - return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses) - } - - get theme(): TTheme - { - return this.styleManager.theme - } - setTheme(theme: TTheme): Promise - { - this.#logger.info("setTheme", { theme }) - this.styleManager.setTheme(theme) - this.#logger.debug("setTheme", this.styleManager.theme) - return this.recognizer.setTheme(this.styleManager.theme) - } - - async init(domElement: HTMLElement): Promise - { - this.#logger.info("init", { domElement }) - this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth) - this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight) - this.undoRedoManager.updateModelInStack(this.model) - - this.renderer.init(domElement) - - this.grabber.attach(domElement) - this.grabber.onPointerDown = this.onPointerDown.bind(this) - this.grabber.onPointerMove = this.onPointerMove.bind(this) - this.grabber.onPointerUp = this.onPointerUp.bind(this) - - this.internalEvent.addSVGPatchListener(this.onSVGPatch) - - await this.recognizer.init(this.model.height, this.model.width) - await this.setPenStyle(this.penStyle) - await this.setTheme(this.theme) - await this.setPenStyleClasses(this.penStyleClasses) - } - - private onPointerDown(evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerDown", { intention: this.intention, evt, point }) - let { pointerType } = evt - const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle) - if (this.intention === Intention.Erase) { - pointerType = "eraser" - } - this.model.initCurrentStroke(point, evt.pointerId, pointerType, style) - this.drawCurrentStroke() - } - - private onPointerMove(_evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerMove", { intention: this.intention, point }) - this.model.appendToCurrentStroke(point) - this.drawCurrentStroke() - } - - private async onPointerUp(_evt: PointerEvent, point: TPointer): Promise - { - try { - this.#logger.info("onPointerUp", { intention: this.intention, point }) - this.model.endCurrentStroke(point) - await this.updateModelRendering() - } catch (error) { - this.internalEvent.emitError(error as Error) - } - } - - private onSVGPatch = (evt: TWebSocketSVGPatchEvent) => - { - this.#logger.info("onSVGPatch", { evt }) - this.renderer.updatesLayer(evt.layer, evt.updates) - } - - drawCurrentStroke(): void - { - this.#logger.debug("drawCurrentStroke", { stroke: this.model.currentStroke }) - const currentStroke = this.model.currentStroke as TStroke - if (currentStroke) { - this.renderer.drawPendingStroke(currentStroke) - } - } - - async updateModelRendering(): Promise - { - this.#logger.info("updateModelRendering") - if (this.#configuration.triggers.exportContent !== "DEMAND") { - const unsentStrokes = this.model.extractUnsentStrokes() - this.model.updatePositionSent() - this.undoRedoManager.addModelToStack(this.model) - this.renderer.clearErasingStrokes() - const exports = await this.recognizer.addStrokes(unsentStrokes) - this.model.mergeExport(exports) - this.undoRedoManager.updateModelInStack(this.model) - } - this.#logger.debug("updateModelRendering", this.model) - return this.model - } - - async waitForIdle(): Promise - { - return this.recognizer.waitForIdle() - } - - async importPointEvents(strokes: TStroke[]): Promise - { - this.#logger.info("importPointEvents", { strokes }) - const exportPoints = await this.recognizer.importPointEvents(strokes) - this.model.mergeExport(exportPoints) - this.#logger.debug("importPointEvents", this.model) - return this.model - } - - async export(mimeTypes?: string[]): Promise - { - this.#logger.info("export", { mimeTypes }) - try { - if (this.#configuration.triggers.exportContent === "DEMAND") { - const unsentStrokes = this.model.extractUnsentStrokes() - this.model.updatePositionSent() - const exports = await this.recognizer.addStrokes(unsentStrokes) - this.model.updatePositionReceived() - this.model.mergeExport(exports) - this.#logger.debug("export", this.model) - return this.model - } else { - return this.recognizer.export(this.model, mimeTypes) - } - } catch (error) { - this.#logger.error("export", { error } ) - this.internalEvent.emitError(error as Error) - return Promise.reject(error) - } - } - - async convert(conversionState?: TConverstionState): Promise - { - this.#logger.info("convert", { conversionState }) - this.undoRedoManager.addModelToStack(this.model) - this.context.stack.push(this.model.getClone()) - this.#model = await this.recognizer.convert(this.model, conversionState) - this.#logger.debug("convert", this.model) - this.undoRedoManager.addModelToStack(this.model) - return this.model - } - - async import(data: Blob, mimeType?: string): Promise - { - this.#logger.info("import", { data, mimeType }) - this.context.stack.push(this.model.getClone()) - const m = await this.recognizer.import(this.model, data, mimeType) - this.undoRedoManager.addModelToStack(m) - return m - } - - async resize(height: number, width: number): Promise - { - this.#logger.info("resize", { height, width }) - const deferredResize = new DeferredPromise() - this.model.height = height - this.model.width = width - const clonedModel = this.model.getClone() - this.renderer.resize(clonedModel) - clearTimeout(this.#resizeTimer) - this.#resizeTimer = setTimeout(async () => - { - try { - const resizeModel = await this.recognizer.resize(clonedModel) - deferredResize.resolve(resizeModel) - } catch (error) { - this.#logger.error("resize", { height, width, error } ) - deferredResize.reject(error as Error) - } - }, this.#configuration.triggers.resizeTriggerDelay) - - this.#model = await deferredResize.promise - this.internalEvent.emitExported(this.model.exports as TExport) - this.#logger.debug("resize", this.model) - return this.model - } - - async undo(): Promise - { - this.#logger.info("undo") - if (this.context.canUndo) { - this.#model = this.undoRedoManager.undo() - return this.recognizer.undo(this.model) - } - else { - throw new Error("Undo not allowed") - } - } - - async redo(): Promise - { - this.#logger.info("redo") - if (this.context.canRedo) { - this.#model = this.undoRedoManager.redo() - this.#logger.debug("undo", this.#model) - return this.recognizer.redo(this.model) - } - else { - throw new Error("Redo not allowed") - } - } - - async clear(): Promise - { - this.#logger.info("clear") - this.model.clear() - this.undoRedoManager.addModelToStack(this.model) - return this.recognizer.clear(this.model) - } - - async destroy(): Promise - { - this.#logger.info("destroy") - this.grabber.detach() - this.renderer.destroy() - this.recognizer.destroy() - return Promise.resolve() - } -} diff --git a/src/behaviors/index.ts b/src/behaviors/index.ts deleted file mode 100644 index 020095935..000000000 --- a/src/behaviors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RestBehaviors } from "./RestBehaviors" -export { WSBehaviors } from "./WSBehaviors" diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts deleted file mode 100644 index 5c7b0864c..000000000 --- a/src/configuration/Configuration.ts +++ /dev/null @@ -1,85 +0,0 @@ - -import { TConfiguration, TConfigurationClient } from "../@types/configuration" -import { TEventConfiguration } from "../@types/configuration/EventConfiguration" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { TTriggerConfiguration } from "../@types/configuration/TriggerConfiguration" -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { DefaultConfiguration } from "./DefaultConfiguration" -import { mergeDeep } from "../utils/MergeHelper" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class Configuration implements TConfiguration -{ - events: TEventConfiguration - grabber: TGrabberConfiguration - recognition: TRecognitionConfiguration - rendering: TRenderingConfiguration - server: TServerConfiguration - triggers: TTriggerConfiguration - "undo-redo": TUndoRedoConfiguration - #logger = LoggerManager.getLogger(LoggerClass.CONFIGURATION) - - constructor(configuration?: TConfigurationClient) - { - this.#logger.info("constructor", { configuration }) - this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events)) - this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber)) - this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition)) - this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering)) - this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server)) - this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers)) - - this.overrideDefaultConfiguration(configuration) - } - - overrideDefaultConfiguration(configuration?: TConfigurationClient): void - { - this.#logger.info("overrideDefaultConfiguration", { configuration }) - const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration)) - this.events = mergeDeep({}, defaultConf.events, configuration?.events) - this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber) - this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition) - this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering) - this.server = mergeDeep({}, defaultConf.server, configuration?.server) - this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers) - this["undo-redo"] = mergeDeep({}, defaultConf["undo-redo"], configuration?.["undo-redo"]) - - this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes - this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes - this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes - - if (this.server?.useWindowLocation) { - this.server.scheme = window.location.protocol.indexOf("s") > -1 ? "https" : "http" - this.server.host = window.location.host - } - - if ( - this.server.protocol === "REST" && - this.triggers.exportContent === "POINTER_UP" - ) { - this.triggers.exportContent = "QUIET_PERIOD" - this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50) - } - - if ( - this.server.protocol === "WEBSOCKET" && - this.recognition.type === "TEXT" - ) { - if ( - this.rendering.smartGuide.enable && - !this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix") - ) { - // mimeType required for smartGuide - this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix") - } - } else { - // smartGuide enable only on websocket text - this.rendering.smartGuide.enable = false - } - this.#logger.debug("overrideDefaultConfiguration", { configuration: this }) - } -} diff --git a/src/configuration/DefaultConfiguration.ts b/src/configuration/DefaultConfiguration.ts deleted file mode 100644 index b80b33ac3..000000000 --- a/src/configuration/DefaultConfiguration.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { TConfiguration } from "../@types/configuration" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TTriggerConfiguration } from "../@types/configuration/TriggerConfiguration" -import { TEventConfiguration } from "../@types/configuration/EventConfiguration" -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { TLoggerConfiguration, LoggerClass, LoggerLevel } from "../@types/configuration/LoggerConfiguration" - -export const DefaultServerConfiguration: TServerConfiguration = { - protocol: "WEBSOCKET", - scheme: "https", - host: "cloud.myscript.com", - applicationKey: "", - hmacKey: "", - version: "2.1.0", - useWindowLocation: false, - websocket: { - pingEnabled: true, - pingDelay: 30000, - maxPingLostCount: 10, - autoReconnect: true, - maxRetryCount: 2, - fileChunkSize: 300000 - } -} - -export const DefaultRecognitionConfiguration: TRecognitionConfiguration = { - type: "TEXT", - alwaysConnected: true, - lang: "en_US", - gesture: { - enable: true - }, - export: { - "image-resolution": 300, - jiix: { - "bounding-box": false, - strokes: false, - text: { - chars: false, - words: true - } - }, - }, - renderer: { - debug: { - "draw-text-boxes": false, - "draw-image-boxes": false - } - }, - math: { - mimeTypes: ["application/vnd.myscript.jiix"], // "application/mathml+xml", "application/x-latex" , - solver: { - enable: true, - "fractional-part-digits": 3, - "decimal-separator": ".", - "rounding-mode": "half up", - "angle-unit": "deg" - }, - margin: { - bottom: 10, - left: 15, - right: 15, - top: 10 - }, - eraser: { - "erase-precisely": false - }, - "undo-redo": { - mode: "stroke" - } - }, - text: { - guides: { - enable: true - }, - mimeTypes: ["application/vnd.myscript.jiix"], // "text/plain" - margin: { - top: 20, - left: 10, - right: 10, - bottom: 10 - }, - eraser: { - "erase-precisely": false - } - }, - diagram: { - mimeTypes: ["application/vnd.myscript.jiix"], // "application/vnd.openxmlformats-officedocument.presentationml.presentation" - eraser: { - "erase-precisely": false - }, - convert: { - "match-text-size": true - } - }, - "raw-content": { - recognition: { - text: true, - shape: true - }, - eraser: { - "erase-precisely": false - } - } -} - -export const DefaultGrabberConfiguration: TGrabberConfiguration = { - listenerOptions: { - capture: false, - passive: true - }, - xyFloatPrecision: 0, - timestampFloatPrecision: 0 -} - -export const DefaultRenderingConfiguration: TRenderingConfiguration = { - minHeight: 100, - minWidth: 100, - smartGuide: { - enable: true, - fadeOut: { - enable: false, - duration: 5000 - } - }, - guides: { - enable: true, - gap: 50 - } -} - -export const DefaultTriggerConfiguration: TTriggerConfiguration = { - exportContent: "POINTER_UP", - exportContentDelay: 1000, - resizeTriggerDelay: 100 -} - -export const DefaultEventsConfiguration: TEventConfiguration = { - processDelay: 10 -} - -export const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = { - maxStackSize: 100 -} - -export const DefaultConfiguration: TConfiguration = { - server: DefaultServerConfiguration, - recognition: DefaultRecognitionConfiguration, - grabber: DefaultGrabberConfiguration, - rendering: DefaultRenderingConfiguration, - triggers: DefaultTriggerConfiguration, - events: DefaultEventsConfiguration, - "undo-redo": DefaultUndoRedoConfiguration -} - -export const DefaultLoggerConfiguration: TLoggerConfiguration = { - [LoggerClass.EDITOR]: LoggerLevel.ERROR, - [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR, - [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR, - [LoggerClass.GRABBER]: LoggerLevel.ERROR, - [LoggerClass.RENDERER]: LoggerLevel.ERROR, - [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR, - [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR, - [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR, - [LoggerClass.MODEL]: LoggerLevel.ERROR, - [LoggerClass.STROKE]: LoggerLevel.ERROR, - [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR, - [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR, - [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR, -} diff --git a/src/configuration/index.ts b/src/configuration/index.ts deleted file mode 100644 index 51f2786b6..000000000 --- a/src/configuration/index.ts +++ /dev/null @@ -1,3 +0,0 @@ - -export { Configuration } from "./Configuration" -export * from "./DefaultConfiguration" diff --git a/src/event/InternalEvent.ts b/src/event/InternalEvent.ts deleted file mode 100644 index 36b515e92..000000000 --- a/src/event/InternalEvent.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TExport, TJIIXExport } from "../@types/model/Model" -import { TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { InternalEventType } from "../Constants" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class InternalEvent extends EventTarget -{ - static #instance: InternalEvent - #abortController: AbortController - #logger = LoggerManager.getLogger(LoggerClass.INTERNALEVENT) - - private constructor() - { - super() - this.#logger.info("constructor") - this.#abortController = new AbortController() - } - - public static getInstance(): InternalEvent - { - if (!InternalEvent.#instance) { - InternalEvent.#instance = new InternalEvent() - } - - return InternalEvent.#instance - } - - removeAllListeners(): void - { - this.#logger.info("removeAllListeners") - this.#abortController.abort() - this.#abortController = new AbortController() - } - - #emit(type: string, data?: unknown): void - { - this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))) - } - - emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void - { - this.#logger.info("emitSVGPatch", { patchChange }) - this.#emit(InternalEventType.SVG_PATCH, patchChange) - } - addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void - { - this.#logger.info("addSVGPatchListener", { callback }) - this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal }) - } - - emitExported(exports: TExport): void - { - this.#logger.info("emitExported", { exports }) - this.#emit(InternalEventType.EXPORTED, exports) - } - addExportedListener(callback: (exports: TExport) => void): void - { - this.#logger.info("addExportedListener", { callback }) - this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal }) - } - - emitClearMessage(): void - { - this.#logger.info("emitClearMessage", { }) - this.#emit(InternalEventType.CLEAR_MESSAGE) - } - addClearMessageListener(callback: () => void): void - { - this.#logger.info("addClearMessageListener", { callback }) - this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal }) - } - - emitError(err: Error): void - { - this.#logger.info("emitError", { err }) - this.#emit(InternalEventType.ERROR, err) - } - - addErrorListener(callback: (err: Error) => void): void - { - this.#logger.info("addErrorListener", { callback }) - this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal }) - } - - emitWSClosed(): void - { - this.#logger.info("emitWSClosed", { }) - this.#emit(InternalEventType.WS_CLOSED) - } - addWSClosedListener(callback: () => void): void - { - this.#logger.info("addWSClosedListener", { callback }) - this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal }) - } - - emitNotif(notif: { message: string, timeout?: number }): void - { - this.#logger.info("emitWNotif", { notif }) - this.#emit(InternalEventType.NOTIF, notif) - } - addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void - { - this.#logger.info("addNotifListener", { callback }) - this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal }) - } - - emitImportJIIX(jiix: TJIIXExport): void - { - this.#logger.info("emitImportJIIX", { jiix }) - this.#emit(InternalEventType.IMPORT_JIIX, jiix) - } - addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void - { - this.#logger.info("addImportJIIXListener", { callback }) - this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal }) - } - - emitConvert(conversionState: TConverstionState = "DIGITAL_EDIT"): void - { - this.#logger.info("emitConvert", { conversionState }) - this.#emit(InternalEventType.CONVERT, conversionState) - } - addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void - { - this.#logger.info("addConvertListener", { callback }) - this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal }) - } - - emitClear(): void - { - this.#logger.info("emitClear") - this.#emit(InternalEventType.CLEAR) - } - addClearListener(callback: () => void): void - { - this.#logger.info("addClearListener", { callback }) - this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal }) - } - - emitContextChange(context: TUndoRedoContext): void - { - this.#logger.info("emitContextChange", { context }) - this.#emit(InternalEventType.CONTEXT_CHANGE, context) - } - addContextChangeListener(callback: (context: TUndoRedoContext) => void): void - { - this.#logger.info("addContextChangeListener", { callback }) - this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal }) - } - - emitIdle(idle: boolean): void - { - this.#logger.info("emitIdle", { idle }) - this.#emit(InternalEventType.IDLE, idle) - } - addIdleListener(callback: (idle: boolean) => void): void - { - this.#logger.info("addIdleListener", { callback }) - this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal }) - } -} diff --git a/src/event/PublicEvent.ts b/src/event/PublicEvent.ts deleted file mode 100644 index 8065c8f64..000000000 --- a/src/event/PublicEvent.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { IModel, TExport } from "../@types/model/Model" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { EventType } from "../Constants" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class PublicEvent extends EventTarget -{ - static #instance: PublicEvent - #element?: HTMLElement - #logger = LoggerManager.getLogger(LoggerClass.PUBLIC_EVENT) - - private constructor() - { - super() - } - - public static getInstance(): PublicEvent - { - if (!PublicEvent.#instance) { - PublicEvent.#instance = new PublicEvent() - } - - return PublicEvent.#instance - } - - setElement(el: HTMLElement) - { - this.#logger.info("setElement", { el }) - this.#element = el - } - - #emit(type: string, data?: unknown): void - { - const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)) - this.dispatchEvent(evt) - this.#element?.dispatchEvent(evt) - } - - emitLoaded(): void - { - this.#logger.info("emitLoaded") - this.#emit(EventType.LOADED) - } - - emitExported(exports: TExport): void - { - this.#logger.info("emitExported", { exports }) - this.#emit(EventType.EXPORTED, exports) - } - - emitChanged(undoRedoContext: TUndoRedoContext): void - { - this.#logger.info("emitChanged", { undoRedoContext }) - this.#emit(EventType.CHANGED, { - ...undoRedoContext, - canClear: !undoRedoContext.empty - }) - } - - emitIdle(idle: boolean): void - { - this.#logger.info("emitIdle", { idle }) - this.#emit(EventType.IDLE, idle) - } - - emitCleared(model?: IModel): void - { - this.#logger.info("emitCleared", { model }) - this.#emit(EventType.CLEARED, model) - } - - emitConverted(exports: TExport): void - { - this.#logger.info("emitConverted", { exports }) - this.#emit(EventType.CONVERTED, exports) - } - - emitImported(exports: TExport): void - { - this.#logger.info("emitImported", { exports }) - this.#emit(EventType.IMPORTED, exports) - } -} diff --git a/src/event/index.ts b/src/event/index.ts deleted file mode 100644 index 93c6f6c68..000000000 --- a/src/event/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { InternalEvent } from "./InternalEvent" -export { PublicEvent } from "./PublicEvent" diff --git a/src/grabber/PointerEventGrabber.ts b/src/grabber/PointerEventGrabber.ts deleted file mode 100644 index e3739f3ec..000000000 --- a/src/grabber/PointerEventGrabber.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { IGrabber } from "../@types/grabber/Grabber" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TPointer } from "../@types/geometry" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class PointerEventGrabber implements IGrabber -{ - private configuration: TGrabberConfiguration - - private domElement!: HTMLElement - - private activePointerId?: number - - private prevent = (e: Event) => e.preventDefault() - #logger = LoggerManager.getLogger(LoggerClass.GRABBER) - - onPointerDown!: (evt: PointerEvent, point: TPointer) => void - onPointerMove!: (evt: PointerEvent, point: TPointer) => void - onPointerUp!: (evt: PointerEvent, point: TPointer) => void - - constructor(configuration: TGrabberConfiguration) - { - this.#logger.info("constructor", { configuration }) - this.configuration = configuration - } - - private roundFloat(oneFloat: number, requestedFloatPrecision: number): number - { - if (requestedFloatPrecision >= 0) { - const floatPrecision: number = Math.pow(10, requestedFloatPrecision) - return Math.round(oneFloat / floatPrecision) * floatPrecision - } - this.#logger.debug("roundFloat", { oneFloat, requestedFloatPrecision }) - return oneFloat - } - - private extractPoint(event: MouseEvent | TouchEvent): TPointer - { - let clientX: number, clientY: number - if ("changedTouches" in event) { - ({ clientX, clientY } = event.changedTouches[0]) - } else { - ({ clientX, clientY } = event) - } - const rect: DOMRect = this.domElement.getBoundingClientRect() - const pointer = { - x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision), - y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision), - t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision), - p: (event as PointerEvent).pressure || 1, - } - this.#logger.debug("extractPoint", { event, pointer }) - return pointer - } - - private pointerDownHandler = (evt: PointerEvent) => - { - this.#logger.info("pointerDown", { evt }) - // exit if not a left click or multi-touch - if (evt.button !== 0 || evt.buttons !== 1) { - return - } - - this.activePointerId = evt.pointerId - - if (this.onPointerDown) { - const point = this.extractPoint(evt) - this.onPointerDown(evt, point) - } - } - - private pointerMoveHandler = (evt: PointerEvent) => - { - this.#logger.info("pointerMove", { evt }) - if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) { - if (this.onPointerMove) { - const point = this.extractPoint(evt) - this.onPointerMove(evt, point) - } - } - } - - private pointerUpHandler = (evt: PointerEvent) => - { - this.#logger.info("pointerUp", { evt }) - if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) { - this.activePointerId = undefined - evt.stopPropagation() - if (this.onPointerUp) { - const point = this.extractPoint(evt) - this.onPointerUp(evt, point) - } - } - } - - attach(domElement: HTMLElement) - { - this.#logger.info("attach", { domElement }) - if (this.domElement) { - this.detach() - } - this.domElement = domElement - this.domElement.addEventListener("pointerdown", this.pointerDownHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointermove", this.pointerMoveHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointerup", this.pointerUpHandler, this.configuration.listenerOptions) - // this.domElement.addEventListener("pointerout", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointerleave", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointercancel", this.pointerUpHandler, this.configuration.listenerOptions) - - this.domElement.addEventListener("touchmove", this.prevent) - - // FIXME investigate why this is needed for iOS devices - // eslint-disable-next-line @typescript-eslint/no-empty-function - document.documentElement.addEventListener("pointerdown", () => { }) - } - - detach() - { - this.#logger.info("detach") - this.domElement?.removeEventListener("pointerdown", this.pointerDownHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointermove", this.pointerMoveHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointerup", this.pointerUpHandler, this.configuration.listenerOptions) - // this.domElement?.removeEventListener("pointerout", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointerleave", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointercancel", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("touchmove", this.prevent) - // eslint-disable-next-line @typescript-eslint/no-empty-function - document.documentElement.removeEventListener("pointerdown", () => { }) - } -} diff --git a/src/grabber/index.ts b/src/grabber/index.ts deleted file mode 100644 index 760fbf7fa..000000000 --- a/src/grabber/index.ts +++ /dev/null @@ -1,2 +0,0 @@ - -export { PointerEventGrabber } from "./PointerEventGrabber" diff --git a/src/iink.css b/src/iink.css deleted file mode 100644 index c99cb65a7..000000000 --- a/src/iink.css +++ /dev/null @@ -1,328 +0,0 @@ -.ms-editor { - position: relative; - z-index: 10; - color: #1A9FFF; - font-family: sans-serif; -} - -.ms-editor.erasing { - cursor: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=') 10 10, auto; -} - -.ms-editor canvas, -.ms-editor svg { - z-index: 20; - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; -} - -.ms-editor canvas.ms-rendering-canvas { - z-index: 9; - pointer-events: none; - background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px); - background-size: 18px 18px; -} - -.ms-editor .loader { - z-index: 30; - position: absolute; - width: 120px; - height: 120px; - top: calc(50% - 60px); - left: calc(50% - 60px); - border: 16px solid #F5F6F7; - border-radius: 50%; - border-top-color: #1A9FFF; - -webkit-animation: spin 2s linear infinite; - animation: spin 2s linear infinite; -} - -.ms-editor .message { - z-index: 25; - position: absolute; - width: 300px; - max-height: calc(25%); - min-height: 200px; - top: calc(50% - 100px); - left: calc(50% - 150px); - font-size: 16px; - text-align: center; - word-wrap: break-word; -} - -.ms-editor .message.error-msg::before { - content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo="); -} - -.ms-editor .message.info-msg::before { - content: ""; - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4="); - background-size: 100% 100%; - display: block; - margin: auto; - padding-bottom: 10px; - height: 25px; - width: 25px; -} - -.ms-editor .smartguide { - position: absolute; - z-index: 40; - font-size: 16px; - height: 48px; - line-height: 48px; -} - -.ms-editor .smartguide.smartguide-in { - visibility: visible !important; - transition: opacity 0.5s; - opacity: 1; -} - -.ms-editor .smartguide.smartguide-out { - transition: opacity 1s, visibility 1s; - visibility: hidden !important; - opacity: 0; -} - -.ms-editor .smartguide .tag-icon { - padding: 0 18px; - border: 1px solid #959DA6; - font-weight: bold; - font-size: large; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - position: absolute; - z-index: 31; - height: 100%; - line-height: 48px; - background-color: rgba(255, 255, 255, 0.9); - color: #959DA6; -} - -.ms-editor .smartguide .ellipsis { - cursor: pointer; - border-bottom: 1px solid #959DA6; - position: absolute; - z-index: 31; - height: 48px; - line-height: 38px; - padding: 0 8px; - font-weight: bold; - font-size: x-large; - background-color: rgba(255, 255, 255, 0.9); - color: #959DA6; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .ellipsis:active { - background-color: #e0e0e0; -} - -.ms-editor .smartguide .prompter-container { - background-color: rgba(255, 255, 255, 0.9); - height: 48px; - line-height: 48px; - overflow: hidden; - white-space: nowrap; - display: block; - text-align: left; - border-bottom: 1px solid #959DA6; - position: absolute; - z-index: 30; - color: #bfbfbf; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .prompter-container > div > span { - cursor: pointer; - display: inline-block; -} - -.ms-editor .smartguide .prompter-container .prompter-text { - margin-left: 12px; -} - -.ms-editor .smartguide .prompter-container .prompter-text .added-word { - animation: 0.1s linear word-added, - 3s ease-in-out color-input; -} - -.ms-editor .smartguide .prompter-container .prompter-text .modified-word { - animation: 0.1s linear word-modified, - 3s ease-in-out color-input; -} - -.ms-editor .smartguide .candidates { - color: black; - flex-direction: column; - text-align: center; - line-height: 30px; - border-radius: 3px; - position: absolute; - box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD; - background-color: #F5F5F5; - z-index: 100; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .candidates > span { - cursor: pointer; - padding: 2px 20px; -} - -.ms-editor .smartguide .candidates > span:hover { - background-color: #EEEEEE; -} - -.ms-editor .smartguide .candidates > span:active { - background-color: #E0E0E0; -} - -.ms-editor .smartguide .candidates .selected-word { - font-weight: bold; - background-color: #E0E0E0; -} - -.ms-editor .smartguide .more-menu { - display: flex; - flex-direction: column; - margin-right: 12px; - line-height: 30px; - border-radius: 3px; - position: absolute; - z-index: 100; - box-shadow: 2px 2px 12px #BDBDBD; - background-color: #F5F5F5; - overflow: hidden; - transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear; -} -.ms-editor .smartguide .more-menu.open { - max-height: 500px; - visibility: visible; - opacity: 1; -} -.ms-editor .smartguide .more-menu.close { - max-height: 0; - visibility: hidden; - opacity: 0; -} - -.ms-editor .smartguide .more-menu .options-label-button { - color: black; - font-size: 16px; - cursor: pointer; - box-sizing: border-box; - background: transparent; - border: none; - padding: 0 24px; - margin: 0; - height: 40px; - outline: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .more-menu .options-label-button:hover { - background-color: #EEEEEE; -} - -.ms-editor .smartguide .more-menu .options-label-button:active { - background-color: #E0E0E0; -} - -.ms-editor .ps__rail-x { - top: 32px !important; -} - -.ms-editor #stroke-panel { - position: fixed; - bottom: 10px; - left: 10px; - right: 10px; - background-color: white; - border: solid black 2px; - padding: 5px; - word-wrap: break-word; - overflow: auto; - cursor: copy; - max-height: 100px; - z-index: 999; -} - -/** Stroke **/ - -.ms-editor .removed-stroke { - opacity: 0; - transition: opacity 0.1s ease-in-out; -} - -.ms-editor .added-stroke { - animation: 0.2s opacity-appear; -} - -@keyframes color-input { - 0% { - color: black; - } - 100% { - color: #bfbfbf; - } -} - -@keyframes word-added { - 0% { - transform: translate(5px, 0); - } - 100% { - transform: none; - } -} - -@keyframes word-modified { - 0% { - transform: translate(0, 5px); - } - 100% { - transform: none; - } -} - -@keyframes opacity-appear { - 0% { - opacity: 0; - } - 100% { - opacity : 1; - } -} - -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} diff --git a/src/iink.ts b/src/iink.ts deleted file mode 100644 index 8a57ac1ec..000000000 --- a/src/iink.ts +++ /dev/null @@ -1,28 +0,0 @@ - -export { Editor } from "./Editor" - -export * as utils from "./utils" - -export * as constants from "./Constants" - -export * as configuration from "./configuration" - -export * as behaviors from "./behaviors" - -export * as recognizer from "./recognizer" - -export * as renderer from "./renderer" - -export * as grabber from "./grabber" - -export * as style from "./style" - -export * as model from "./model" - -export * as undoredo from "./undo-redo" - -export * as event from "./event" - -export * as smartguide from "./smartguide/SmartGuide" - -export * as logger from "./logger" diff --git a/src/logger/index.ts b/src/logger/index.ts deleted file mode 100644 index d8cdae4e6..000000000 --- a/src/logger/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { LoggerManager } from "./loggerManager" -export { Logger } from "./logger" \ No newline at end of file diff --git a/src/logger/logger.ts b/src/logger/logger.ts deleted file mode 100644 index 47212025a..000000000 --- a/src/logger/logger.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LoggerClass, LoggerLevel } from "../@types" - -export class Logger -{ - instanceName: LoggerClass - level: LoggerLevel - - constructor(instanceName: LoggerClass, level: LoggerLevel) - { - this.instanceName = instanceName - this.level = level - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - debug(...data: any) - { - if (LoggerLevel.DEBUG >= this.level) { - const dataLog = { - from: this.instanceName, - message: data, - } - console.debug(dataLog) - } - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - info(...data: any) - { - if (LoggerLevel.INFO >= this.level) { - const dataLog = { - from: this.instanceName, - message: data, - } - console.info(dataLog) - } - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - warn(...data: any) - { - if (LoggerLevel.WARN >= this.level) { - const dataLog = { - from: this.instanceName, - message: data, - } - console.warn(dataLog) - } - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - error(...error: any) - { - const dataLog = { - from: this.instanceName, - error, - } - console.error(dataLog) - } -} diff --git a/src/logger/loggerManager.ts b/src/logger/loggerManager.ts deleted file mode 100644 index 671a06d40..000000000 --- a/src/logger/loggerManager.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TLoggerConfiguration } from "../@types" -import { LoggerClass, LoggerLevel } from "../Constants" -import { Logger } from "./logger" - -export class LoggerManager -{ - static #loggerMap: Map = new Map() - static getLogger(name: LoggerClass): Logger { - if(!this.#loggerMap.has(name)) - { - this.#loggerMap.set(name, new Logger(name, LoggerLevel.ERROR)) - } - return this.#loggerMap.get(name) as Logger - } - - static setLoggerLevel(config: TLoggerConfiguration) - { - - Object.keys(config).forEach((lc) => { - LoggerManager.getLogger(lc as LoggerClass).level = config[lc as LoggerClass] - }) - } -} diff --git a/src/model/Model.ts b/src/model/Model.ts deleted file mode 100644 index aab9e1841..000000000 --- a/src/model/Model.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" -import { TPoint, TPointer } from "../@types/geometry" -import { TStroke } from "../@types/model/Stroke" -import { IModel, TExport } from "../@types/model/Model" -import { TRecognitionPositions } from "../@types/model/RecognitionPositions" - -import { computeDistance } from "../utils/geometric" -import { Stroke } from "./Stroke" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class Model implements IModel -{ - readonly creationTime: number - modificationDate: number - currentStroke?: TStroke - positions: TRecognitionPositions - rawStrokes: TStroke[] - selectedStrokes: TStroke[] - exports?: TExport - converts?: TExport - width: number - height: number - idle: boolean - #logger = LoggerManager.getLogger(LoggerClass.MODEL) - - constructor(width = 100, height = 100, creationDate: number = Date.now()) - { - this.#logger.info("constructor", { width, height, creationDate }) - this.creationTime = creationDate - this.modificationDate = creationDate - this.width = width - this.height = height - this.rawStrokes = [] - this.selectedStrokes = [] - this.positions = { - lastSentPosition: 0, - lastReceivedPosition: 0 - } - this.idle = true - } - - mergeExport(exports: TExport) - { - this.#logger.info("mergeExport", { exports }) - if (this.exports) { - Object.assign(this.exports, exports) - } else { - this.exports = exports - } - this.#logger.debug("mergeExport", this.exports) - } - - mergeConvert(converts: TExport) - { - this.#logger.info("mergeConvert", { converts }) - if (this.converts) { - Object.assign(this.converts, converts) - } else { - this.converts = converts - } - this.#logger.debug("mergeConvert", this.converts) - } - - private computePressure(distance: number, globalDistance: number): number - { - let ratio = 1.0 - if (globalDistance === 0) { - ratio = 0.5 - } else if (distance === globalDistance) { - ratio = 1.0 - } else if (distance < 10) { - ratio = 0.2 + Math.pow(0.1 * distance, 0.4) - } else if (distance > globalDistance - 10) { - ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4) - } - const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance))) - return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100 - } - - private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean - { - const delta: number = (2 + ((stroke.style["-myscript-pen-width"] || 0) / 4)) - return !lastPointer || - stroke.pointers.length === 0 || - Math.abs(lastPointer.x - point.x) >= delta || - Math.abs(lastPointer.y - point.y) >= delta - } - - addPoint(stroke: TStroke, pointer: TPointer): void - { - this.#logger.debug("addPoint", { stroke, pointer }) - const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 } - if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) { - const distance = computeDistance(pointer, lastPointer) - stroke.length += distance - pointer.p = this.computePressure(distance, stroke.length) - stroke.pointers.push(pointer) - } - } - - addStroke(stroke: TStroke): void - { - this.#logger.info("addStroke", { stroke }) - this.rawStrokes.push(stroke) - } - - extractUnsentStrokes(): TStroke[] - { - return this.rawStrokes.slice(this.positions.lastSentPosition) - } - - initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void - { - this.#logger.info("initCurrentStroke", { point, pointerId, pointerType, style, dpi }) - if (style["-myscript-pen-width"]) { - const pxWidth = (style["-myscript-pen-width"] * dpi) / 25.4 - style.width = pxWidth / 2 - } - this.modificationDate = Date.now() - this.exports = undefined - this.converts = undefined - this.currentStroke = new Stroke(style, pointerId, pointerType) - this.#logger.debug("initCurrentStroke", this.currentStroke) - this.addPoint(this.currentStroke, point) - } - - appendToCurrentStroke(point: TPointer): void - { - this.#logger.info("appendToCurrentStroke", { point }) - if (this.currentStroke) { - this.addPoint(this.currentStroke, point) - } - this.#logger.debug("appendToCurrentStroke", this.currentStroke) - } - - endCurrentStroke(point: TPointer): void - { - this.#logger.info("endCurrentStroke", { point }) - if (this.currentStroke) { - this.addPoint(this.currentStroke, point) - this.addStroke(this.currentStroke) - this.currentStroke = undefined - } - this.#logger.debug("endCurrentStroke", this.currentStroke) - } - - #getStrokeFromPoint(point: TPoint): TStroke[] - { - this.#logger.info("getStrokeFromPoint", { point }) - const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max) - - const _strokeList: TStroke[] = [] - this.rawStrokes.forEach((stroke) => - { - for (let i = 0; i < stroke.pointers.length; i++) { - const strokePointer = stroke.pointers[i] - if ( - isBetween(strokePointer.x, point.x - 5, point.x + 5) && - isBetween(strokePointer.y, point.y - 5, point.y + 5) - ) { - _strokeList.push(stroke) - break - } - else { - if (computeDistance(point, strokePointer) < 10) { - _strokeList.push(stroke) - break - } - } - } - }) - this.#logger.debug("getStrokeFromPoint", { strokes: _strokeList }) - return _strokeList - } - - resetSelectedStrokes(): void - { - this.selectedStrokes = [] - } - - appendSelectedStrokesFromPoint(point: TPoint): void - { - this.#logger.info("appendSelectedStrokesFromPoint", { point }) - this.#getStrokeFromPoint(point) - .forEach(s => - { - if (!this.selectedStrokes.includes(s)) { - this.selectedStrokes.push(s) - } - }) - } - - updateStroke(updatedStroke: TStroke): void - { - this.#logger.info("updateStroke", { updatedStroke }) - const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id) - if (strokeIndex !== -1) { - this.rawStrokes.splice(strokeIndex, 1, updatedStroke) - } - this.#logger.debug("updateStroke", this.rawStrokes) - } - - removeStroke(id: string): void - { - this.#logger.info("removeStroke", { id }) - const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id) - if (strokeIndex !== -1) { - this.rawStrokes.splice(strokeIndex, 1) - } - this.#logger.debug("removeStroke", this.rawStrokes) - } - - removeStrokesFromPoint(point: TPoint): string[] - { - this.#logger.info("removeStrokesFromPoint", { point }) - const strokes = this.#getStrokeFromPoint(point) - strokes.forEach(strokeToRemove => - { - this.removeStroke(strokeToRemove.id) - }) - this.#logger.debug("removeStrokesFromPoint", strokes.map(s => s.id)) - return strokes.map(s => s.id) - } - - updatePositionSent(position: number = this.rawStrokes.length): void - { - this.#logger.info("updatePositionSent", { position }) - this.positions.lastSentPosition = position - this.#logger.debug("updatePositionSent", this.positions.lastSentPosition) - } - - updatePositionReceived(): void - { - this.#logger.info("updatePositionReceived") - this.positions.lastReceivedPosition = this.positions.lastSentPosition - this.#logger.debug("updatePositionReceived", this.positions.lastReceivedPosition) - } - - getClone(): IModel - { - this.#logger.info("getClone") - const clonedModel = new Model(this.width, this.height, this.creationTime) - clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate)) - clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined - clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes)) - clonedModel.positions = JSON.parse(JSON.stringify(this.positions)) - clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined - clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined - clonedModel.idle = this.idle - this.#logger.debug("getClone", { clonedModel }) - return clonedModel - } - - clear(): void - { - this.#logger.info("clear") - this.modificationDate = Date.now() - this.currentStroke = undefined - this.rawStrokes = [] - this.positions.lastSentPosition = 0 - this.positions.lastReceivedPosition = 0 - this.exports = undefined - this.converts = undefined - this.idle = true - } -} diff --git a/src/model/Stroke.ts b/src/model/Stroke.ts deleted file mode 100644 index e68293cac..000000000 --- a/src/model/Stroke.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" -import { TStroke, TStrokeJSON } from "../@types/model/Stroke" -import { TPointer } from "../@types/geometry" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class Stroke implements TStroke -{ - id: string - type: string - pointerId: number - pointerType: string - elementType?: string - pointers: TPointer[] - length: number - style: TPenStyle - #logger = LoggerManager.getLogger(LoggerClass.STROKE) - - constructor(style: TPenStyle, pointerId: number, pointerType = "pen") - { - this.#logger.info("constructor", { style, pointerId, pointerType }) - this.id = `${pointerType}-${Date.now().toString()}` - this.type = "stroke" - this.pointerId = pointerId - this.pointerType = pointerType - this.pointers = [] - this.length = 0 - this.style = style - } -} - -export function convertStrokeToJSON(stroke: TStroke): TStrokeJSON -{ - const json: TStrokeJSON = { - id: stroke.id, - pointerType: stroke.pointerType, - p: [], - t: [], - x: [], - y: [] - } - stroke.pointers.forEach(p => { - json.p.push(p.p) - json.t.push(p.t) - json.x.push(p.x) - json.y.push(p.y) - }) - return json -} diff --git a/src/model/index.ts b/src/model/index.ts deleted file mode 100644 index e261eeb52..000000000 --- a/src/model/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Model } from "./Model" -export { Stroke, convertStrokeToJSON } from "./Stroke" diff --git a/src/recognizer/RestRecognizer.ts b/src/recognizer/RestRecognizer.ts deleted file mode 100644 index 4d646303f..000000000 --- a/src/recognizer/RestRecognizer.ts +++ /dev/null @@ -1,278 +0,0 @@ - -import { IRecognizer } from "../@types/recognizer/Recognizer" -import { TRestPostConfiguration, TRestPostData } from "../@types/recognizer/RestRecognizer" -import { TStrokeGroup, TStrokeGroupJSON } from "../@types/model/Stroke" -import { TConverstionState, TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { IModel, TExport, TJIIXExport } from "../@types/model/Model" -import { TPenStyle } from "../@types/style/PenStyle" - -import { Error as ErrorConst } from "../Constants" -import { StyleHelper } from "../style/StyleHelper" -import { computeHmac } from "../utils/CryptoHelper" -import { isVersionSuperiorOrEqual } from "../utils/version" -import { convertStrokeToJSON } from "../model/Stroke" - -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -type ApiError = { - code?: string - message: string -} - -export class RestRecognizer implements IRecognizer -{ - protected serverConfiguration: TServerConfiguration - protected recognitionConfiguration: TRecognitionConfiguration - #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER) - - constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration) - { - this.#logger.info("constructor", { serverConfig, recognitionConfig }) - this.serverConfiguration = serverConfig - this.recognitionConfiguration = recognitionConfig - } - - get url() - { - return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch` - } - - get postConfig(): TRestPostConfiguration - { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - return { - lang: this.recognitionConfiguration.lang, - diagram: this.recognitionConfiguration.diagram, - export: this.recognitionConfiguration.export - } - case "MATH": - return { - lang: this.recognitionConfiguration.lang, - math: this.recognitionConfiguration.math, - export: this.recognitionConfiguration.export - } - case "Raw Content": - return { - lang: this.recognitionConfiguration.lang, - "raw-content": this.recognitionConfiguration["raw-content"], - export: this.recognitionConfiguration.export - } - case "TEXT": - return { - lang: this.recognitionConfiguration.lang, - text: this.recognitionConfiguration.text, - export: this.recognitionConfiguration.export - } - default: - throw new Error(`get postConfig error Recognition type unkow "${ this.recognitionConfiguration.type }"`) - break - } - } - - private buildData(model: IModel): TRestPostData - { - this.#logger.info("buildData", { model }) - const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) => - { - return ps1 && ps2 && ps1["-myscript-pen-fill-color"] === ps2["-myscript-pen-fill-color"] && - ps1["-myscript-pen-fill-style"] === ps2["-myscript-pen-fill-style"] && - ps1["-myscript-pen-width"] === ps2["-myscript-pen-width"] && - ps1.color === ps2.color && - ps1.width === ps2.width - } - - const strokeGroupByPenStyle: TStrokeGroup[] = [] - model.rawStrokes.forEach((s) => { - const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style)) - if (groupIndex > -1) { - strokeGroupByPenStyle[groupIndex].strokes.push(s) - } else { - strokeGroupByPenStyle.push({ - penStyle: s.style, - strokes: [s] - }) - } - }) - - const strokeGroupsToSend: TStrokeGroupJSON[] = [] - strokeGroupByPenStyle.forEach((group: TStrokeGroup) => - { - const newPenStyle = JSON.stringify(group.penStyle) === "{}" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle) - const newGroup = { - penStyle: newPenStyle, - strokes: group.strokes.map(convertStrokeToJSON) - } - strokeGroupsToSend.push(newGroup) - }) - - const contentType: string = this.recognitionConfiguration.type === "Raw Content" ? - "Raw Content" : - this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase() - - const data = { - configuration: this.postConfig, - xDPI: 96, - yDPI: 96, - contentType, - // theme: StyleHelper.themeToCSS(), - height: model.height, - width: model.width, - strokeGroups: strokeGroupsToSend - } - this.#logger.debug("buildData", { data }) - return data - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private async post(data: any, mimeType: string): Promise - { - this.#logger.info("post", { data, mimeType }) - const headers = new Headers() - headers.append("Accept", "application/json," + mimeType) - headers.append("applicationKey", this.serverConfiguration.applicationKey) - headers.append("hmac", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)) - headers.append("Content-Type", "application/json") - - if (isVersionSuperiorOrEqual(this.serverConfiguration.version, "2.0.4")) { - headers.append("myscript-client-name", "iink-ts") - headers.append("myscript-client-version", "1.0.0-buildVersion") - } - - const reqInit: RequestInit = { - method: "POST", - headers, - body: JSON.stringify(data) - } - const request = new Request(this.url, reqInit) - const response: Response = await fetch(request) - if (response.ok) { - const contentType = response.headers.get("content-type") - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let result: any - switch (contentType) { - case "application/vnd.openxmlformats-officedocument.presentationml.presentation": - case "image/png": - case "image/jpeg": - result = await response.blob() - break - case "application/json": - result = await response.json() - break - case "application/vnd.myscript.jiix": - result = await response.clone().json().catch(async () => await response.text()) - break - default: - this.#logger.warn("post default", { contentType }) - result = await response.text() - break - } - this.#logger.debug("post", { result }) - return result - } else { - const err = await response.json() as ApiError - this.#logger.error("post", { err }) - throw err - } - } - - private async tryFetch(data: unknown, mimeType: string): Promise - { - this.#logger.debug("tryFetch", { data, mimeType }) - return this.post(data, mimeType) - .then((res) => - { - const exports: TExport = {} - exports[mimeType] = res as TJIIXExport | string | Blob - this.#logger.debug("tryFetch", { exports }) - return exports - }) - .catch((err) => - { - this.#logger.error("tryFetch", { data, mimeType, err }) - let message = err.message || ErrorConst.UNKNOW - if (!err.code) { - message = ErrorConst.CANT_ESTABLISH - } else if (err.code === "access.not.granted") { - message = ErrorConst.WRONG_CREDENTIALS - } - const error = new Error(message) - throw error - }) - } - - private getMimeTypes(requestedMimeTypes?: string[]): string[] - { - this.#logger.info("getMimeTypes", { requestedMimeTypes }) - let mimeTypes: string[] = requestedMimeTypes || [] - if (!mimeTypes.length) { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - mimeTypes = this.recognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = this.recognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - case "TEXT": - mimeTypes = this.recognitionConfiguration.text.mimeTypes - break - default: - throw new Error(`Recognition type "${ this.recognitionConfiguration.type }" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`) - break - } - } - return mimeTypes - } - - async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("convert", { model, conversionState, requestedMimeTypes }) - const myModel = model.getClone() - const mimeTypes = this.getMimeTypes(requestedMimeTypes) - const dataToConcert = this.buildData(myModel) - dataToConcert.conversionState = conversionState - const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt)) - const converts: TExport[] = await Promise.all(promises) - converts.forEach(c => - { - myModel.mergeConvert(c) - }) - this.#logger.debug("convert", { model: myModel }) - return myModel - } - - async export(model: IModel, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("export", { model, requestedMimeTypes }) - const myModel = model.getClone() - if (myModel.rawStrokes.length === 0) { - return Promise.resolve(myModel) - } - const mimeTypes = this.getMimeTypes(requestedMimeTypes) - if (!mimeTypes.length) { - this.#logger.error("export", { model, requestedMimeTypes, "Export failed, no mimeTypes define in recognition configuration": String }) - return Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration")) - } - const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m]) - const data = this.buildData(model) - const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType))) - exports.forEach(e => - { - myModel.mergeExport(e) - }) - this.#logger.debug("export", { model: myModel }) - return myModel - } - - async resize(model: IModel): Promise - { - this.#logger.info("resize", { model }) - return this.export(model) - } - -} diff --git a/src/recognizer/WSRecognizer.ts b/src/recognizer/WSRecognizer.ts deleted file mode 100644 index 8be30b593..000000000 --- a/src/recognizer/WSRecognizer.ts +++ /dev/null @@ -1,734 +0,0 @@ - -import { IRecognizer } from "../@types/recognizer/Recognizer" -import { TConverstionState, TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { IModel, TExport, TJIIXExport } from "../@types/model/Model" -import { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TStroke } from "../@types/model/Stroke" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" -import { LoggerClass } from "../@types/configuration/LoggerConfiguration" - -import { Error as ErrorConst } from "../Constants" -import { InternalEvent } from "../event/InternalEvent" -import { computeHmac } from "../utils/CryptoHelper" -import { StyleHelper } from "../style/StyleHelper" -import { DeferredPromise } from "../utils/DeferredPromise" -import { isVersionSuperiorOrEqual } from "../utils/version" -import { convertStrokeToJSON } from "../model/Stroke" -import { LoggerManager } from "../logger" - -/** - * A websocket dialog have this sequence : - * --------------------------- Client --------------------------------------------------- Server ---------------------------------- - * init: send newContentPackage or restoreIInkSession ==================> - * <================== hmacChallenge - * answer hmacChallenge: send the hmac ==================> - * <================== contentPackageDescription - * answer contentPackageDescription: - * send the configuration ==================> - * send newContentPart or openContentPart ==================> - * <================== partChanged - * <================== contentChanged - * <================== newPart - * <================== svgPatch - * - * setPenStyle (send the parameters) ==================> - * setTheme (send the parameters) ==================> - * setPenStyleClasses (send the parameters) ==================> - * <================== svgPatch - * addStrokes (send the strokes ) ============> - * <================== update - */ -export class WSRecognizer implements IRecognizer -{ - #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER) - protected serverConfiguration: TServerConfiguration - protected recognitionConfiguration: TRecognitionConfiguration - - protected socket!: WebSocket - protected pingCount = 0 - protected reconnectionCount = 0 - protected viewSizeHeight!: number - protected viewSizeWidth!: number - // contentPartCount = 0 - protected sessionId?: string - protected currentPartId?: string - protected currentErrorCode?: string | number - - protected penStyle?: TPenStyle - protected penStyleClasses?: string - protected theme?: TTheme - - protected connected?: DeferredPromise - protected initialized?: DeferredPromise - protected addStrokeDeferred?: DeferredPromise - protected exportDeferred?: DeferredPromise - protected convertDeferred?: DeferredPromise - protected importDeferred?: DeferredPromise - protected resizeDeferred?: DeferredPromise - protected undoDeferred?: DeferredPromise - protected redoDeferred?: DeferredPromise - protected clearDeferred?: DeferredPromise - protected importPointEventsDeferred?: DeferredPromise - protected waitForIdleDeferred?: DeferredPromise - - url: string - - constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration) - { - this.serverConfiguration = serverConfig - this.recognitionConfiguration = recognitionConfig - const scheme = (this.serverConfiguration.scheme === "https") ? "wss" : "ws" - this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }` - this.#logger.info("constructor", { serverConfig, recognitionConfig, url: this.url }) - } - - get mimeTypes(): string[] - { - switch (this.recognitionConfiguration.type.toLocaleLowerCase()) { - case "text": - return this.recognitionConfiguration.text.mimeTypes - case "math": - return this.recognitionConfiguration.math.mimeTypes - case "diagram": - return this.recognitionConfiguration.diagram.mimeTypes - default: - //"raw-content" - return [] - } - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - protected infinitePing(): void - { - this.pingCount++ - if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) { - this.socket.close(1000, "PING_LOST") - } else if (this.socket.readyState <= 1) { - setTimeout(() => - { - if (this.socket.readyState <= 1) { - this.socket.send(JSON.stringify({ type: "ping" })) - this.infinitePing() - } - }, this.serverConfiguration.websocket.pingDelay) - } - } - - protected openCallback(): void - { - this.connected?.resolve() - const params: TWebSocketEvent = { - type: this.sessionId ? "restoreIInkSession" : "newContentPackage", - iinkSessionId: this.sessionId, - applicationKey: this.serverConfiguration.applicationKey, - xDpi: 96, - yDpi: 96, - viewSizeHeight: this.viewSizeHeight, - viewSizeWidth: this.viewSizeWidth - } - if (isVersionSuperiorOrEqual(this.serverConfiguration.version, "2.0.4")) { - params["myscript-client-name"] = "iink-ts" - params["myscript-client-version"] = "1.0.0-buildVersion" - } - this.send(params) - } - - protected rejectDeferredPending(error: Error): void - { - if (this.connected?.isPending) { - this.connected?.reject(error) - } - if (this.initialized?.isPending) { - this.initialized?.reject(error) - } - if (this.addStrokeDeferred?.isPending) { - this.addStrokeDeferred?.reject(error) - } - if (this.exportDeferred?.isPending) { - this.exportDeferred?.reject(error) - } - if (this.convertDeferred?.isPending) { - this.convertDeferred?.reject(error) - } - if (this.importDeferred?.isPending) { - this.importDeferred?.reject(error) - } - if (this.resizeDeferred?.isPending) { - this.resizeDeferred?.reject(error) - } - if (this.undoDeferred?.isPending) { - this.undoDeferred?.reject(error) - } - if (this.redoDeferred?.isPending) { - this.redoDeferred?.reject(error) - } - if (this.clearDeferred?.isPending) { - this.clearDeferred.reject(error) - } - if (this.waitForIdleDeferred?.isPending) { - this.waitForIdleDeferred.reject(error) - } - } - - protected closeCallback(evt: CloseEvent): void - { - let message = "" - if (!this.currentErrorCode) { - switch (evt.code) { - case 1000: - // Normal Closure - break - case 1001: - message = ErrorConst.GOING_AWAY - break - case 1002: - message = ErrorConst.PROTOCOL_ERROR - break - case 1003: - message = ErrorConst.UNSUPPORTED_DATA - break - case 1006: - message = ErrorConst.ABNORMAL_CLOSURE - break - case 1007: - message = ErrorConst.INVALID_FRAME_PAULOAD - break - case 1008: - message = ErrorConst.POLICY_VIOLATION - break - case 1009: - message = ErrorConst.MESSAGE_TOO_BIG - break - case 1011: - message = ErrorConst.INTERNAL_ERROR - break - case 1012: - message = ErrorConst.SERVICE_RESTART - break - case 1013: - message = ErrorConst.TRY_AGAIN - break - case 1014: - message = ErrorConst.BAD_GATEWAY - break - case 1015: - message = ErrorConst.TLS_HANDSHAKE - break - default: - this.#logger.warn("closeCallback unknow CloseEvent.code", { evt }) - message = ErrorConst.CANT_ESTABLISH - break - } - } - const error = new Error(message || evt.reason) - - this.rejectDeferredPending(error) - - if (!this.currentErrorCode && evt.code !== 1000) { - this.internalEvent.emitError(error) - } - } - - protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageHMACChallengeMessage", { websocketMessage }) - const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent - if (hmacChallengeMessage.hmacChallenge) { - this.send({ - type: "hmac", - hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey) - }) - } - if (hmacChallengeMessage.iinkSessionId) { - this.sessionId = hmacChallengeMessage.iinkSessionId - } - } - - protected manageContentPackageDescriptionMessage(): void - { - this.reconnectionCount = 0 - this.#logger.info("manageContentPackageDescriptionMessage") - - this.send({ ...this.recognitionConfiguration, type: "configuration" }) - - if (this.currentPartId) { - this.send({ type: "openContentPart", id: this.currentPartId, mimeTypes: this.mimeTypes }) - } - else { - this.send({ type: "newContentPart", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes }) - } - } - - protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("managePartChangeMessage", { websocketMessage }) - const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent - this.currentPartId = partChangeMessage.partId - this.initialized?.resolve() - } - - protected manageExportMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageExportMessage", { websocketMessage }) - const exportMessage = websocketMessage as TWebSocketExportEvent - if (exportMessage.exports["application/vnd.myscript.jiix"]) { - exportMessage.exports["application/vnd.myscript.jiix"] = JSON.parse(exportMessage.exports["application/vnd.myscript.jiix"].toString()) as TJIIXExport - } - this.initialized?.resolve() - this.addStrokeDeferred?.resolve(exportMessage.exports) - this.exportDeferred?.resolve(exportMessage.exports) - this.convertDeferred?.resolve(exportMessage.exports) - this.importDeferred?.resolve(exportMessage.exports) - this.undoDeferred?.resolve(exportMessage.exports) - this.redoDeferred?.resolve(exportMessage.exports) - this.clearDeferred?.resolve(exportMessage.exports) - this.importPointEventsDeferred?.resolve(exportMessage.exports) - this.internalEvent.emitExported(exportMessage.exports) - } - - protected async manageWaitForIdle(): Promise { - this.internalEvent.emitIdle(true) - this.waitForIdleDeferred?.resolve() - } - - protected manageErrorMessage(websocketMessage: TWebSocketEvent): void - { - const err = websocketMessage as TWebSocketErrorEvent - this.currentErrorCode = err.data?.code || err.code - let message = err.data?.message || err.message || ErrorConst.UNKNOW - - switch (this.currentErrorCode) { - case "no.activity": - message = ErrorConst.NO_ACTIVITY - break - case "access.not.granted": - message = ErrorConst.WRONG_CREDENTIALS - break - case "session.too.old": - message = ErrorConst.TOO_OLD - break - } - const error = new Error(message) - this.rejectDeferredPending(error) - this.internalEvent.emitError(error) - } - - protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageContentChangeMessage", { websocketMessage }) - const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent - const context: TUndoRedoContext = { - canRedo: contentChangeMessage.canRedo, - canUndo: contentChangeMessage.canUndo, - empty: contentChangeMessage.empty, - stackIndex: contentChangeMessage.undoStackIndex, - possibleUndoCount: contentChangeMessage.possibleUndoCount, - stack: [] - } - this.internalEvent.emitContextChange(context) - } - - protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageSVGPatchMessage", { websocketMessage }) - this.resizeDeferred?.resolve() - const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent - this.internalEvent.emitSVGPatch(svgPatchMessage) - } - - protected messageCallback(message: MessageEvent): void - { - this.#logger.debug("messageCallback", { message }) - this.currentErrorCode = undefined - const websocketMessage: TWebSocketEvent = JSON.parse(message.data) - if (websocketMessage.type !== "pong") { - this.pingCount = 0 - switch (websocketMessage.type) { - case "ack": - this.manageHMACChallengeMessage(websocketMessage) - break - case "contentPackageDescription": - this.manageContentPackageDescriptionMessage() - break - case "partChanged": - this.managePartChangeMessage(websocketMessage) - break - case "newPart": - this.initialized?.resolve() - break - case "contentChanged": - this.manageContentChangeMessage(websocketMessage) - break - case "exported": - this.manageExportMessage(websocketMessage) - break - case "svgPatch": - this.manageSVGPatchMessage(websocketMessage) - break - case "error": - this.manageErrorMessage(websocketMessage) - break - case "idle": - this.manageWaitForIdle() - break - default : - this.#logger.warn("messageCallback", `Message type unknow: "${websocketMessage.type}".`) - } - } - } - - async init(height: number, width: number): Promise - { - try { - this.#logger.info("init", { height, width }) - this.destroy() - this.connected = new DeferredPromise() - this.initialized = new DeferredPromise() - this.viewSizeHeight = height - this.viewSizeWidth = width - this.pingCount = 0 - this.socket = new WebSocket(this.url) - - if (this.serverConfiguration.websocket.pingEnabled) { - this.infinitePing() - } - - this.socket.addEventListener("open", this.openCallback.bind(this)) - this.socket.addEventListener("close", this.closeCallback.bind(this)) - this.socket.addEventListener("message", this.messageCallback.bind(this)) - - return this.initialized.promise - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (err: any) { - const error = new Error(ErrorConst.CANT_ESTABLISH) - this.internalEvent.emitError(error) - this.initialized?.reject(error) - return this.initialized?.promise - } - } - - async send(message: TWebSocketEvent): Promise - { - if (!this.connected) { - return Promise.reject(new Error("Recognizer must be initilized")) - } - await this.connected.promise - if (this.socket.readyState === this.socket.OPEN) { - this.#logger.debug("send", { message }) - this.socket.send(JSON.stringify(message)) - return Promise.resolve() - } else { - if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) { - this.reconnectionCount++ - if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) { - this.#logger.debug("send", `try to reconnect number: ${this.reconnectionCount}.`) - this.internalEvent.emitClearMessage() - await this.init(this.viewSizeHeight, this.viewSizeWidth) - await this.setPenStyle(this.penStyle as TPenStyle) - await this.setPenStyleClasses(this.penStyleClasses as string) - await this.setTheme(this.theme as TTheme) - return this.send(message) - } - else { - return Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached.")) - } - } - } - } - - async addStrokes(strokes: TStroke[]): Promise - { - this.#logger.info("addStrokes", { strokes }) - await this.initialized?.promise - this.addStrokeDeferred = new DeferredPromise() - if (strokes.length === 0) { - this.addStrokeDeferred.resolve({} as TExport) - } - else { - await this.send({ - type: "addStrokes", - strokes: strokes.map(convertStrokeToJSON) - }) - } - return this.addStrokeDeferred?.promise - } - - async setPenStyle(penStyle: TPenStyle): Promise - { - this.#logger.info("setPenStyle", { penStyle }) - await this.initialized?.promise - this.penStyle = penStyle - const message: TWebSocketEvent = { - type: "setPenStyle", - style: StyleHelper.penStyleToCSS(penStyle) - } - return this.send(message) - } - - async setPenStyleClasses(penStyleClasses: string): Promise - { - await this.initialized?.promise - this.penStyleClasses = penStyleClasses - this.#logger.info("setPenStyleClasses", { penStyleClasses }) - const message: TWebSocketEvent = { - type: "setPenStyleClasses", - styleClasses: penStyleClasses - } - return this.send(message) - } - - async setTheme(theme: TTheme): Promise - { - this.#logger.info("setTheme", { theme }) - await this.initialized?.promise - this.theme = theme - const message: TWebSocketEvent = { - type: "setTheme", - theme: StyleHelper.themeToCSS(theme) - } - return this.send(message) - } - - async export(model: IModel, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("export", { model, requestedMimeTypes }) - await this.initialized?.promise - this.exportDeferred = new DeferredPromise() - const localModel = model.getClone() - let mimeTypes: string[] = requestedMimeTypes || [] - if (!mimeTypes.length) { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - mimeTypes = this.recognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = this.recognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - case "TEXT": - mimeTypes = this.recognitionConfiguration.text.mimeTypes - break - default: - throw new Error(`Recognition type "${ this.recognitionConfiguration.type }" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`) - } - } - - if (!mimeTypes.length) { - return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`)) - } - - const message: TWebSocketEvent = { - type: "export", - partId: this.currentPartId, - mimeTypes - } - await this.send(message) - const exports: TExport = await this.exportDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(exports) - this.#logger.debug("export", { model: localModel }) - return localModel - } - - async import(model: IModel, data: Blob, mimeType?: string): Promise - { - this.#logger.info("import", { data, mimeType }) - await this.initialized?.promise - const localModel = model.getClone() - const chunkSize = this.serverConfiguration.websocket.fileChunkSize - const importFileId = Math.random().toString(10).substring(2, 6) - this.importDeferred = new DeferredPromise() - const readBlob = (blob: Blob): Promise => - { - const fileReader = new FileReader() - return new Promise((resolve, reject) => - { - fileReader.onloadend = (ev) => resolve(ev.target?.result as string) - fileReader.onerror = () => reject() - fileReader.readAsText(blob) - }) - } - - const importFileMessage: TWebSocketEvent = { - type: "importFile", - importFileId, - mimeType - } - await this.send(importFileMessage) - for (let i = 0; i < data.size; i += chunkSize) { - const blobPart = data.slice(i, i + chunkSize, data.type) - const partFileString = await readBlob(blobPart) - const fileChuckMessage: TWebSocketEvent = { - type: "fileChunk", - importFileId, - data: partFileString, - lastChunk: i + chunkSize > data.size - } - await this.send(fileChuckMessage) - } - const exports = await this.importDeferred?.promise - this.importDeferred = undefined - localModel.mergeExport(exports) - return localModel - } - - async resize(model: IModel): Promise - { - this.#logger.info("resize", { model }) - await this.initialized?.promise - this.resizeDeferred = new DeferredPromise() - const localModel = model.getClone() - this.viewSizeHeight = localModel.height - this.viewSizeWidth = localModel.width - const message: TWebSocketEvent = { - type: "changeViewSize", - height: this.viewSizeHeight, - width: this.viewSizeWidth, - } - await this.send(message) - await this.resizeDeferred?.promise - return localModel - } - - async importPointEvents(strokes: TStroke[]): Promise - { - this.#logger.info("importPointsEvents", { strokes }) - await this.initialized?.promise - this.importPointEventsDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "pointerEvents", - events: strokes.map(convertStrokeToJSON) - } - this.send(message) - const exportPoints = await this.importPointEventsDeferred?.promise - this.importPointEventsDeferred = undefined - this.#logger.debug("importPointEvents", { exportPoints }) - return exportPoints as TExport - } - - async convert(model: IModel, conversionState?: TConverstionState): Promise - { - this.#logger.info("convert", { model, conversionState }) - await this.initialized?.promise - this.convertDeferred = new DeferredPromise() - const localModel = model.getClone() - const message: TWebSocketEvent = { - type: "convert", - conversionState - } - await this.send(message) - const myExportConverted: TExport = await this.convertDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeConvert(myExportConverted) - localModel.mergeExport(myExportConverted) - this.#logger.debug("convert", { model: localModel }) - return localModel - } - - async waitForIdle(): Promise - { - await this.initialized?.promise - this.waitForIdleDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "waitForIdle", - } - await this.send(message) - return this.waitForIdleDeferred?.promise - } - - async undo(model: IModel): Promise - { - this.#logger.info("undo", { model }) - await this.initialized?.promise - const localModel = model.getClone() - this.undoDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "undo", - } - await this.send(message) - const undoExports = await this.undoDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(undoExports) - this.#logger.debug("undo", { model: localModel }) - this.undoDeferred = undefined - return localModel - } - - async redo(model: IModel): Promise - { - this.#logger.info("redo", { model }) - await this.initialized?.promise - const localModel = model.getClone() - this.redoDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "redo", - } - await this.send(message) - const redoExports = await this.redoDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(redoExports) - this.#logger.debug("redo", { model: redoExports }) - this.redoDeferred = undefined - return localModel - } - - async clear(model: IModel): Promise - { - this.#logger.info("clear", { model }) - await this.initialized?.promise - const localModel = model.getClone() - localModel.modificationDate = Date.now() - this.clearDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "clear", - } - await this.send(message) - const clearExports = await this.clearDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(clearExports) - this.clearDeferred = undefined - this.#logger.info("clear", { model: localModel }) - return localModel - } - - close(code: number, reason: string): void - { - if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) { - this.#logger.info("close", { code, reason }) - this.socket.removeEventListener("close", this.closeCallback) - this.socket.removeEventListener("message", this.messageCallback) - this.socket.removeEventListener("open", this.openCallback) - this.socket.close(code, reason) - } - } - - destroy(): void - { - this.#logger.info("destroy") - this.connected = undefined - this.initialized = undefined - this.addStrokeDeferred = undefined - this.exportDeferred = undefined - this.convertDeferred = undefined - this.importDeferred = undefined - this.resizeDeferred = undefined - this.undoDeferred = undefined - this.redoDeferred = undefined - this.clearDeferred = undefined - if (this.socket) { - this.socket.removeEventListener("close", this.closeCallback) - this.socket.removeEventListener("message", this.messageCallback) - this.socket.removeEventListener("open", this.openCallback) - this.close(1000, "Recognizer destroyed") - } - } -} diff --git a/src/recognizer/index.ts b/src/recognizer/index.ts deleted file mode 100644 index 209199a4b..000000000 --- a/src/recognizer/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RestRecognizer } from "./RestRecognizer" -export { WSRecognizer } from "./WSRecognizer" diff --git a/src/renderer/QuadraticUtils.ts b/src/renderer/QuadraticUtils.ts deleted file mode 100644 index 5b84db32b..000000000 --- a/src/renderer/QuadraticUtils.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TPoint, TPointer } from "../@types/geometry" - -export function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[] -{ - const radius = point.p * width - return [ - { - x: (point.x - (Math.sin(angle) * radius)), - y: (point.y + (Math.cos(angle) * radius)) - }, - { - x: (point.x + (Math.sin(angle) * radius)), - y: (point.y - (Math.cos(angle) * radius)) - } - ] -} - -export function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer -{ - return { - x: ((point2.x + point1.x) / 2), - y: ((point2.y + point1.y) / 2), - p: ((point2.p + point1.p) / 2), - t: ((point2.t + point1.t) / 2) - } -} - -export function computeAxeAngle(begin: TPointer, end: TPointer): number -{ - return Math.atan2(end.y - begin.y, end.x - begin.x) -} diff --git a/src/renderer/canvas/CanvasRenderer.ts b/src/renderer/canvas/CanvasRenderer.ts deleted file mode 100644 index c365b863d..000000000 --- a/src/renderer/canvas/CanvasRenderer.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { TStroke } from "../../@types/model/Stroke" -import { TRenderingConfiguration } from "../../@types/configuration/RenderingConfiguration" -import { IModel } from "../../@types/model/Model" -import { TSymbol } from "../../@types/renderer/Symbol" - -import { drawShapeSymbol, ShapeSymbols } from "./CanvasRendererShapeSymbol" -import { drawStroke } from "./CanvasRendererStrokeSymbol" -import { drawTextSymbol, TextSymbols } from "./CanvasRendererTextSymbol" -import { CanvasStroker } from "./CanvasStroker" -import { LoggerManager } from "../../logger" -import { LoggerClass } from "../../Constants" - -export class CanvasRenderer -{ - config: TRenderingConfiguration - stroker: CanvasStroker - context!: { - parent: HTMLElement - renderingCanvas: HTMLCanvasElement - renderingCanvasContext: CanvasRenderingContext2D - capturingCanvas: HTMLCanvasElement - capturingCanvasContext: CanvasRenderingContext2D - } - #logger = LoggerManager.getLogger(LoggerClass.RENDERER) - - constructor(config: TRenderingConfiguration) - { - this.#logger.info("constructor", { config }) - this.config = config - this.stroker = new CanvasStroker() - } - - private createCanvas(type: string): HTMLCanvasElement - { - this.#logger.debug("createCanvas", { type }) - const canvas: HTMLCanvasElement = document.createElement("canvas") - canvas.id = type - canvas.classList.add(type) - canvas.classList.add("ms-canvas") - return canvas - } - - private resizeContent(): void - { - const pixelRatio: number = window.devicePixelRatio - const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas] - elements.forEach((canvas) => - { - const domElement = canvas.parentNode as HTMLElement - const width = Math.max(this.config.minWidth, domElement.clientWidth) - const height = Math.max(this.config.minHeight, domElement.clientHeight) - canvas.width = width * pixelRatio - canvas.height = height * pixelRatio - canvas.getContext("2d")?.scale(pixelRatio, pixelRatio) - canvas.style.width = `${ width }px` - canvas.style.height = `${ height }px` - }) - } - - private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) - { - const type = symbol.elementType || symbol.type - if (type === "stroke") { - drawStroke(context2D, symbol as TStroke, this.stroker) - } else if (Object.keys(TextSymbols).includes(type)) { - drawTextSymbol(context2D, symbol) - } else if (Object.keys(ShapeSymbols).includes(type)) { - drawShapeSymbol(context2D, symbol) - } - } - - init(element: HTMLElement): void - { - this.#logger.info("init", { element }) - const renderingCanvas: HTMLCanvasElement = this.createCanvas("ms-rendering-canvas") - element.appendChild(renderingCanvas) - - const capturingCanvas: HTMLCanvasElement = this.createCanvas("ms-capture-canvas") - element.appendChild(capturingCanvas) - - this.context = { - parent: element, - renderingCanvas, - renderingCanvasContext: renderingCanvas.getContext("2d") as CanvasRenderingContext2D, - capturingCanvas, - capturingCanvasContext: capturingCanvas.getContext("2d") as CanvasRenderingContext2D - } - - this.resizeContent() - } - - drawModel(model: IModel): void - { - this.#logger.info("drawModel", { model }) - this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height) - model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol)) - this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height) - } - - drawPendingStroke(stroke: TStroke | undefined): void - { - this.#logger.info("drawPendingStroke", { stroke }) - this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height) - if (stroke && stroke?.pointerType !== "eraser") { - this.stroker.drawStroke(this.context.capturingCanvasContext, stroke) - } - } - - resize(model: IModel): void - { - this.#logger.info("resize", { model }) - this.resizeContent() - this.drawModel(model) - } - - destroy(): void - { - this.#logger.info("destroy") - if (this.context.parent) { - this.context.parent.innerHTML = "" - } - } -} diff --git a/src/renderer/canvas/CanvasRendererShapeSymbol.ts b/src/renderer/canvas/CanvasRendererShapeSymbol.ts deleted file mode 100644 index d5ec42c16..000000000 --- a/src/renderer/canvas/CanvasRendererShapeSymbol.ts +++ /dev/null @@ -1,190 +0,0 @@ - -import { TPoint } from "../../@types/geometry" -import { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from "../../@types/renderer/Symbol" - -export const ShapeSymbols = { - table: "table", - shape: "shape", - recognizedShape: "recognizedShape", - ellipse: "ellipse", - line: "line" -} - -function phi(angle: number): number -{ - let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI - if (returnedAngle < -Math.PI) { - returnedAngle += Math.PI * 2 - } - return returnedAngle -} - -function drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[] -{ - const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse - const angleStep = 0.02 // angle delta between interpolated - - let z1 = Math.cos(orientation) - let z3 = Math.sin(orientation) - let z2 = z1 - let z4 = z3 - z1 *= maxRadius - z2 *= minRadius - z3 *= maxRadius - z4 *= minRadius - - const n = Math.floor(Math.abs(sweepAngle) / angleStep) - - const boundariesPoints = [] - - context2D.save() - try { - context2D.beginPath() - - for (let i = 0; i <= n; i++) { - const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian - const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius) - - const cosAlpha = Math.cos(alpha) - const sinAlpha = Math.sin(alpha) - - // current point - const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha) - const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha) - if (i === 0) { - context2D.moveTo(x, y) - } else { - context2D.lineTo(x, y) - } - - if (i === 0 || i === n) { - boundariesPoints.push({ x, y }) - } - } - - context2D.stroke() - } finally { - context2D.restore() - } - - return boundariesPoints -} - -function drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number) -{ - const alpha = phi(angle + (Math.PI * (7 / 8))) - const beta = phi(angle - (Math.PI * (7 / 8))) - context2D.save() - try { - context2D.fillStyle = context2D.strokeStyle - - context2D.moveTo(headPoint.x, headPoint.y) - context2D.beginPath() - context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha))) - context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta))) - context2D.lineTo(headPoint.x, headPoint.y) - context2D.fill() - } finally { - context2D.restore() - } -} - -function drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol) -{ - const points = drawEllipseArc(context2D, shapeEllipse) - - if (shapeEllipse?.beginDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0) - } - if (shapeEllipse?.endDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0) - } -} - -/** - * Draw a line - * @param {Object} context2D Current rendering context2D - * @param {{x: Number, y: Number}} p1 Origin point - * @param {{x: Number, y: Number}} p2 Destination point - */ -export function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint) -{ - context2D.save() - try { - context2D.beginPath() - context2D.moveTo(p1.x, p1.y) - context2D.lineTo(p2.x, p2.y) - context2D.stroke() - } finally { - context2D.restore() - } -} - -function drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol) -{ - drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint) - if (shapeLine.beginDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0) - } - if (shapeLine.endDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0) - } -} - -/** - * Draw a shape symbol - * @param {Object} context2D Current rendering context2D - * @param {Object} symbol Symbol to draw - */ -export function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) -{ - context2D.save() - try { - context2D.lineWidth = symbol.style.width as number - context2D.strokeStyle = symbol.style.color as string - - if (symbol.elementType) { - switch (symbol.elementType) { - case ShapeSymbols.shape: { - const shapeSymbol = symbol as TShapeSymbol - drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex]) - break - } - case ShapeSymbols.table:{ - const tableSymbols = symbol as TShapeTableSymbol - tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line)) - break - } - case ShapeSymbols.line: { - const lineSymbol = symbol as TLineSymbol - drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2) - break - } - default: - // logger.error(`${ symbol.elementType } not implemented`) - break - } - } else { - switch (symbol.type) { - case ShapeSymbols.ellipse: { - drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol) - break - } - case ShapeSymbols.line: { - drawShapeLine(context2D, symbol as TShapeLineSymbol) - break - } - case ShapeSymbols.recognizedShape: { - const recognizedShape = symbol as TShapeRecognizedSymbol - recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive)) - break - } - default: - // logger.error(`${ symbol.type } not implemented`) - break - } - } - } finally { - context2D.restore() - } -} diff --git a/src/renderer/canvas/CanvasRendererStrokeSymbol.ts b/src/renderer/canvas/CanvasRendererStrokeSymbol.ts deleted file mode 100644 index ba169b71c..000000000 --- a/src/renderer/canvas/CanvasRendererStrokeSymbol.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TStroke } from "../../@types/model/Stroke" -import { CanvasStroker } from "./CanvasStroker" - -export function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) { - if (stroker && stroke && stroke.pointerType !== "eraser") { - stroker.drawStroke(context2D, stroke) - } -} diff --git a/src/renderer/canvas/CanvasRendererTextSymbol.ts b/src/renderer/canvas/CanvasRendererTextSymbol.ts deleted file mode 100644 index d3f420bb6..000000000 --- a/src/renderer/canvas/CanvasRendererTextSymbol.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TPoint } from "../../@types/geometry" -import { drawLine } from "./CanvasRendererShapeSymbol" -import { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from "../../@types/renderer/Symbol" - -export const TextSymbols = { - inputCharacter: "inputCharacter", - char: "char", - string: "string", - textLine: "textLine" -} - -function drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol) -{ - const delta = data.width / label.length - const p1: TPoint = { - x: data.topLeftPoint.x + (underline.data.firstCharacter * delta), - y: data.topLeftPoint.y + data.height - } - const p2: TPoint = { - x: data.topLeftPoint.x + (underline.data.lastCharacter * delta), - y: data.topLeftPoint.y + data.height - } - drawLine(context2D, p1, p2) -} - -function drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol) -{ - context2D.save() - try { - context2D.font = `${ data.textHeight }px serif` - context2D.textAlign = (data.justificationType === "CENTER") ? "center" : "left" - context2D.textBaseline = "bottom" - context2D.fillStyle = context2D.strokeStyle - context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height)) - } finally { - context2D.restore() - } -} - -function drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol) -{ - drawText(context2D, textLine.label, textLine.data) - textLine.underlineList.forEach((underline) => - { - drawUnderline(context2D, underline, textLine.label, textLine.data) - }) -} - -/** - * Draw a text symbol - * @param {Object} context Current rendering context - * @param {Object} symbol Symbol to draw - */ -export function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) -{ - context2D.save() - try { - context2D.lineWidth = (symbol.style.width as number) - context2D.strokeStyle = (symbol.style.color as string) - const type: string = symbol.elementType || symbol.type - - switch (type) { - case TextSymbols.textLine: - drawTextLine(context2D, symbol as TTextUnderlineSymbol) - break - default: - console.info(`drawTextSymbol => ${symbol.elementType} not implemented`) - break - } - - } finally { - context2D.restore() - } -} diff --git a/src/renderer/canvas/CanvasStroker.ts b/src/renderer/canvas/CanvasStroker.ts deleted file mode 100644 index 18feb259c..000000000 --- a/src/renderer/canvas/CanvasStroker.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { TPointer } from "../../@types/geometry" -import { TStroke } from "../../@types/model/Stroke" -import { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from "../QuadraticUtils" - -export class CanvasStroker -{ - - private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void - { - context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true) - } - - private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width) - - context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y) - context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y) - context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y) - context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y) - } - - private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void - { - const ARCSPLIT = 6 - const angle = computeAxeAngle(begin, end) - const linkPoints = computeLinksPoints(end, angle, width) - context2d.moveTo(linkPoints[0].x, linkPoints[0].y) - for (let i = 1; i <= ARCSPLIT; i++) { - const newAngle = angle - ((i * Math.PI) / ARCSPLIT) - context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle))) - } - } - - private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width) - const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width) - - context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y) - context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y) - context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y) - context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y) - } - - drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void - { - const NUMBER_POINTS = stroke.pointers.length - const NUMBER_QUADRATICS = NUMBER_POINTS - 2 - const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth - const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle - const firstPoint = stroke.pointers[0] as TPointer - - context2d.save() - try { - context2d.beginPath() - if (NUMBER_POINTS < 3) { - this.renderArc(context2d, firstPoint, width * 0.6) - } else { - this.renderArc(context2d, firstPoint, width * firstPoint.p) - const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1]) - this.renderLine(context2d, firstPoint, secondPoint, width) - - // Possibility to try this (the start looks better when the ink is large) - // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]); - // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true); - - for (let i = 0; i < NUMBER_QUADRATICS; i++) { - const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1]) - const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2]) - const ctrl: TPointer = stroke.pointers[i + 1] - this.renderQuadratic(context2d, begin, end, ctrl, width) - } - const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1]) - const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1] - this.renderLine(context2d, beginLine, endLine, width) - - const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2] - const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1] - this.renderFinal(context2d, beginFinal, endFinal, width) - } - context2d.closePath() - if (color !== undefined) { - context2d.fillStyle = color - context2d.fill() - } - context2d.save() - } - finally { - context2d.restore() - } - } -} diff --git a/src/renderer/canvas/index.ts b/src/renderer/canvas/index.ts deleted file mode 100644 index 3f83e86a7..000000000 --- a/src/renderer/canvas/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { CanvasRenderer } from "./CanvasRenderer" -export * as canvasRendererShape from "./CanvasRendererShapeSymbol" -export * as canvasRendererStroke from "./CanvasRendererStrokeSymbol" -export * as canvasRendererText from "./CanvasRendererTextSymbol" -export { CanvasStroker } from "./CanvasStroker" diff --git a/src/renderer/index.ts b/src/renderer/index.ts deleted file mode 100644 index 06ec1febf..000000000 --- a/src/renderer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./canvas" -export * from "./svg" -export * as quadradicsUtils from "./QuadraticUtils" diff --git a/src/renderer/svg/SVGStroker.ts b/src/renderer/svg/SVGStroker.ts deleted file mode 100644 index 19a91be0e..000000000 --- a/src/renderer/svg/SVGStroker.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { TPointer } from "../../@types/geometry" -import { TStroke } from "../../@types/model/Stroke" -import { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from "../QuadraticUtils" - -export class SVGStroker -{ - - private getArcPath(center: TPointer, radius: number): string - { - const svgPath = [ - `M ${ center.x },${ center.y }`, - `m ${ -radius },0`, - `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`, - `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0` - ].join(" ") - return svgPath - } - - private getLinePath(begin: TPointer, end: TPointer, width: number): string - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width) - const svgPath = [ - `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`, - `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`, - `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`, - `L ${ linkPoints1[1].x },${ linkPoints1[1].y }` - ].join(" ") - return svgPath - } - - private getFinalPath(begin: TPointer, end: TPointer, width: number): string - { - const ARCSPLIT = 6 - const angle = computeAxeAngle(begin, end) - const linkPoints = computeLinksPoints(end, angle, width) - const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`] - for (let i = 1; i <= ARCSPLIT; i++) { - const newAngle = angle - (i * (Math.PI / ARCSPLIT)) - parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`) - } - const svgPath = parts.join(" ") - return svgPath - } - - private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width) - const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width) - const svgPath = [ - `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`, - `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`, - `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`, - `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }` - ].join(" ") - return svgPath - } - - private buildSVGPath(stroke: TStroke): string - { - const STROKE_LENGTH = stroke.pointers.length - const STROKE_WIDTH = (stroke.style.width as number) - const NB_QUADRATICS = STROKE_LENGTH - 2 - const firstPoint = stroke.pointers[0] - - const parts = [] - if (STROKE_LENGTH < 3) { - parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6)) - } else { - parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p)) - parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH)) - - for (let i = 0; i < NB_QUADRATICS; i++) { - const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1]) - const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2]) - const central = stroke.pointers[i + 1] - parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH) - ) - } - const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2] - const lastPoint = stroke.pointers[STROKE_LENGTH - 1] - parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH)) - parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH)) - } - return parts.join(" ") - } - - drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void - { - const svgPathElement = document.createElementNS("http://www.w3.org/2000/svg", "path") - svgPathElement.classList.add("pending-stroke") - svgPathElement.setAttribute("id", stroke.id) - svgPathElement.setAttribute("type", stroke.pointerType) - attrs?.forEach(a => - { - svgPathElement.setAttribute(a.name, a.value) - }) - const svgPath = this.buildSVGPath(stroke) - svgPathElement.setAttribute("d", `${ svgPath }Z`) - svgElement.appendChild(svgPathElement) - } -} diff --git a/src/renderer/svg/WSSVGRenderer.ts b/src/renderer/svg/WSSVGRenderer.ts deleted file mode 100644 index 47646a266..000000000 --- a/src/renderer/svg/WSSVGRenderer.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { TRenderingConfiguration } from "../../@types/configuration/RenderingConfiguration" -import { IModel } from "../../@types/model/Model" -import { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from "../../@types/recognizer/WSRecognizer" -import { TStroke } from "../../@types/model/Stroke" -import { SVGStroker } from "./SVGStroker" -import { LoggerManager } from "../../logger" -import { LoggerClass } from "../../Constants" - -export class WSSVGRenderer -{ - config: TRenderingConfiguration - stroker: SVGStroker - context!: { - parent: HTMLElement - } - #logger = LoggerManager.getLogger(LoggerClass.RENDERER) - - constructor(config: TRenderingConfiguration) - { - this.#logger.info("constructor", { config }) - this.config = config - this.stroker = new SVGStroker() - } - - init(element: HTMLElement): void - { - this.#logger.info("init", { element }) - element.style.fontSize = "10px" - this.context = { - parent: element - } - } - - #drawStroke(svgElement: SVGElement, stroke: TStroke) - { - let style: string - if (stroke.pointerType === "eraser") { - stroke.style.width = 20 - style = "fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;" - } else { - style = `fill:${ stroke.style.color };stroke:transparent;` - } - this.stroker.drawStroke(svgElement, stroke, [{ name: "style", value: style }]) - } - - #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void - { - const oldLayer = this.context.parent.querySelector(`svg[data-layer="${ layerName }"]`) as SVGElement | null - oldLayer?.remove() - this.context.parent.insertAdjacentHTML("beforeend", update.svg) - const layer = this.context.parent.querySelector(`svg[data-layer="${ layerName }"]`) as SVGElement - if (layerName === "MODEL") { - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", "g") - pendingStrokesGroup.id = "pendingStrokes" - layer.appendChild(pendingStrokesGroup) - } - } - - #replaceElement(update: TUpdatePatchReplaceELement): void - { - const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null - if (elementToRemove) { - const parent = elementToRemove.parentNode as HTMLElement | null | undefined - elementToRemove?.remove() - parent?.insertAdjacentHTML("beforeend", update.svg) - } - } - - #appendChild(layerName: string, update: TUpdatePatchAppendChild): void - { - const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer="${ layerName }"]` - const parent = this.context.parent.querySelector(parentSelector) as HTMLElement - parent?.insertAdjacentHTML("beforeend", update.svg) - } - - #removeChild(update: TUpdatePatchRemoveChild): void - { - this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove() - } - - #removeElement(update: TUpdatePatchRemoveElement): void - { - const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) - if (elementToRemove) { - if (update.id.includes("s") || update.id.includes("MODEL")) { - elementToRemove.remove() - } else { - elementToRemove.setAttribute("class", "removed-stroke") - setTimeout(() => - { - elementToRemove?.remove() - }, 100) - } - } - } - - #insertBefore(update: TUpdatePatchInsertBefore): void - { - const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null - parent?.insertAdjacentHTML("beforebegin", update.svg) - } - - #setAttribute(update: TUpdatePatchSetAttribut): void - { - const selector = update.id ? `#${ update.id }` : "svg" - const element = this.context.parent.querySelector(selector) as HTMLElement | null - element?.setAttribute(update.name, update.value) - } - - #removeAttribute(update: TUpdatePatchRemoveAttribut): void - { - const selector = update.id ? `#${ update.id }` : "svg" - const element = this.context.parent.querySelector(selector) as HTMLElement | null - element?.removeAttribute(update.name) - } - - updateLayer(layerName: string, update: TUpdatePatch): void - { - this.#logger.info("updateLayer", { layerName, update }) - switch (update.type) { - case "REPLACE_ALL": - this.#replaceAll(layerName, update as TUpdatePatchReplaceAll) - break - case "REPLACE_ELEMENT": - this.#replaceElement(update as TUpdatePatchReplaceELement) - break - case "APPEND_CHILD": - this.#appendChild(layerName, update as TUpdatePatchAppendChild) - break - case "REMOVE_ELEMENT": - this.#removeElement(update as TUpdatePatchRemoveElement) - break - case "REMOVE_CHILD": - this.#removeChild(update as TUpdatePatchRemoveChild) - break - case "INSERT_BEFORE": - this.#insertBefore(update as TUpdatePatchInsertBefore) - break - case "SET_ATTRIBUTE": - this.#setAttribute(update as TUpdatePatchSetAttribut) - break - case "REMOVE_ATTRIBUTE": - this.#removeAttribute(update as TUpdatePatchRemoveAttribut) - break - default: - this.#logger.warn("updateLayer Default", {layerName, update}) - break - } - } - - updatesLayer(layerName: string, updates: TUpdatePatch[]): void - { - this.#logger.info("updatesLayer", { layerName, updates }) - updates.forEach(u => this.updateLayer(layerName, u)) - this.clearPendingStroke() - } - - clearPendingStroke(): void - { - this.#logger.info("clearPendingStroke", { }) - const pendingStrokeGroup = this.context.parent.querySelector("#pendingStrokes") as SVGElement - if (pendingStrokeGroup) { - pendingStrokeGroup.innerHTML = "" - } - } - - drawPendingStroke(stroke: TStroke): void - { - this.#logger.info("drawPendingStroke", { stroke }) - if (stroke) { - const pendingStrokeGroup = this.context.parent.querySelector("#pendingStrokes") as SVGElement - if (pendingStrokeGroup) { - const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`) - if (oldStroke) { - oldStroke.remove() - } - this.#drawStroke(pendingStrokeGroup, stroke) - } - } - } - - clearErasingStrokes(): void - { - const erasingStrokeList = this.context.parent.querySelectorAll("[type=eraser]") as NodeListOf - erasingStrokeList.forEach(erasingStroke => { - erasingStroke.remove() - }) - } - - resize(model: IModel): void - { - this.#logger.info("resize", { model }) - const rect = this.context.parent.getBoundingClientRect() - const svgList = this.context.parent.querySelectorAll("svg") - const width = Math.max(rect.width, model.width) - const height = Math.max(rect.height, model.height) - svgList.forEach(svg => - { - svg.setAttribute("viewBox", `0 0 ${ width }, ${ height }`) - svg.setAttribute("width", `${ width }px`) - svg.setAttribute("height", `${ height }px`) - }) - } - - destroy(): void - { - this.#logger.info("destroy", { context: this.context }) - if (this.context?.parent) { - this.context.parent.querySelectorAll("svg").forEach(n => n.remove()) - } - } -} diff --git a/src/renderer/svg/index.ts b/src/renderer/svg/index.ts deleted file mode 100644 index cb44a5602..000000000 --- a/src/renderer/svg/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SVGStroker } from "./SVGStroker" -export { WSSVGRenderer} from "./WSSVGRenderer" diff --git a/src/smartguide/SmartGuide.ts b/src/smartguide/SmartGuide.ts deleted file mode 100644 index 44b69efeb..000000000 --- a/src/smartguide/SmartGuide.ts +++ /dev/null @@ -1,417 +0,0 @@ -import { TMarginConfiguration } from "../@types/configuration/recognition/MarginConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TJIIXExport, TWordExport } from "../@types/model/Model" -import { InternalEvent } from "../event/InternalEvent" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class SmartGuide { - uuid: string - #smartGuideElement!: HTMLDivElement - #prompterContainerElement!: HTMLDivElement - #prompterTextElement!: HTMLDivElement - #ellipsisElement!: HTMLDivElement - #tagElement!: HTMLDivElement - #candidatesElement!: HTMLDivElement - #menuElement!: HTMLDivElement - #convertElement!: HTMLButtonElement - #copyElement!: HTMLButtonElement - #deleteElement!: HTMLButtonElement - #fadeOutTimout?: ReturnType - #isMenuOpen!: boolean - margin: TMarginConfiguration - renderingConfiguration!: TRenderingConfiguration - jiix?: TJIIXExport - lastWord?: TWordExport - wordToChange?: TWordExport - #logger = LoggerManager.getLogger(LoggerClass.SMARTGUIDE) - - constructor() { - this.#logger.info("constructor", { }) - this.uuid = Math.random().toString(10).substring(2, 12) - this.margin = { - bottom: 0, - left: 0, - right: 0, - top: 0 - } - this.#createWrapperElement() - this.#createPrompterContainerElement() - this.#createPrompterTextElement() - this.#createEllipsisElement() - this.#createTagElement() - this.#createCandidatesElement() - this.#createMoreMenuElement() - this.#createConvertElement() - this.#createCopyElement() - this.#createDeleteElement() - } - - get internalEvent(): InternalEvent { - return InternalEvent.getInstance() - } - - #createWrapperElement(): void { - this.#smartGuideElement = document.createElement("div") - this.#smartGuideElement.id = `smartguide-${this.uuid}` - this.#smartGuideElement.classList.add("smartguide") - } - - #createPrompterContainerElement(): void { - this.#prompterContainerElement = document.createElement("div") - this.#prompterContainerElement.id = `prompter-container-${this.uuid}` - this.#prompterContainerElement.classList.add("prompter-container") - // this.#prompterContainerElement.appendChild(textElement) - } - - #createPrompterTextElement(): void { - this.#prompterTextElement = document.createElement("div") - this.#prompterTextElement.id = `prompter-text-${this.uuid}` - this.#prompterTextElement.classList.add("prompter-text") - this.#prompterTextElement.setAttribute("touch-action", "none") - } - - #createEllipsisElement(): void { - this.#ellipsisElement = document.createElement("div") - this.#ellipsisElement.id = `ellipsis-${this.uuid}` - this.#ellipsisElement.classList.add("ellipsis") - this.#ellipsisElement.innerHTML = "..." - } - - #createTagElement(): void { - this.#tagElement = document.createElement("div") - this.#tagElement.id = `tag-icon-${this.uuid}` - this.#tagElement.classList.add("tag-icon") - this.#tagElement.innerHTML = "¶" - } - - #createCandidatesElement(): void { - this.#candidatesElement = document.createElement("div") - this.#candidatesElement.id = `candidates-${this.uuid}` - this.#candidatesElement.classList.add("candidates") - } - - #createMoreMenuElement(): void { - this.#menuElement = document.createElement("div") - this.#menuElement.id = `more-menu-${this.uuid}` - this.#menuElement.classList.add("more-menu") - } - - #createConvertElement(): void { - this.#convertElement = document.createElement("button") - this.#convertElement.id = `convert-${this.uuid}` - this.#convertElement.classList.add("options-label-button") - this.#convertElement.innerHTML = "Convert" - } - - #createCopyElement(): void { - this.#copyElement = document.createElement("button") - this.#copyElement.id = `copy-${this.uuid}` - this.#copyElement.classList.add("options-label-button") - this.#copyElement.innerHTML = "Copy" - } - - #createDeleteElement(): void { - this.#deleteElement = document.createElement("button") - this.#deleteElement.id = `delete-${this.uuid}` - this.#deleteElement.classList.add("options-label-button") - this.#deleteElement.innerHTML = "Delete" - } - - init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void { - this.#logger.info("init", { domElement, margin, renderingConfiguration }) - domElement.appendChild(this.#smartGuideElement) - this.#smartGuideElement.appendChild(this.#tagElement) - - this.#prompterContainerElement.appendChild(this.#prompterTextElement) - this.#smartGuideElement.appendChild(this.#prompterContainerElement) - - this.#smartGuideElement.appendChild(this.#ellipsisElement) - - this.#menuElement.appendChild(this.#convertElement) - this.#menuElement.appendChild(this.#copyElement) - this.#menuElement.appendChild(this.#deleteElement) - this.#smartGuideElement.appendChild(this.#menuElement) - this.#menuElement.classList.add("close") - this.#isMenuOpen = false - - this.#smartGuideElement.appendChild(this.#candidatesElement) - this.#candidatesElement.style.display = "none" - this.margin = margin - this.renderingConfiguration = renderingConfiguration - this.#addListeners() - - this.#show() - if (this.renderingConfiguration.smartGuide.fadeOut.enable) { - this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration) - } - - this.resize() - } - - #initFadeOutObserver(duration = 3000): void { - const observer = new MutationObserver(() => { - clearTimeout(this.#fadeOutTimout) - if ( - !this.#smartGuideElement.classList.contains("smartguide-out") && - this.#candidatesElement.style.display === "none" && - !this.#isMenuOpen - ) { - this.#fadeOutTimout = setTimeout(() => { - this.#hide() - }, duration) - } - }) - observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true }) - } - - #show(): void { - this.#smartGuideElement.classList.remove("smartguide-out") - this.#smartGuideElement.classList.add("smartguide-in") - } - #hide(): void { - this.#smartGuideElement.classList.add("smartguide-out") - this.#smartGuideElement.classList.remove("smartguide-in") - } - - #showCandidates = (target: HTMLElement) => { - this.#logger.info("showCandidates", { target }) - const wordId = parseInt(target.id.replace("word-", "").replace(this.uuid, "")) - const words = this.jiix?.words as TWordExport[] - this.wordToChange = words[wordId] - if (this.wordToChange) { - this.wordToChange.id = wordId.toString() - this.#candidatesElement.innerHTML = "" - if (this.wordToChange?.candidates) { - this.#candidatesElement.style.display = "flex" - this.wordToChange.candidates.forEach((word, index) => { - if (this.wordToChange?.label === word) { - this.#candidatesElement.innerHTML += `${word}` - } else { - this.#candidatesElement.innerHTML += `${word}` - } - }) - const top = 48 - const left = target.getBoundingClientRect().left - 60 - this.#candidatesElement.style.top = `${top}px` - this.#candidatesElement.style.left = `${left}px` - - const parent = target.parentNode?.parentNode?.parentNode - if (parent) { - parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode) - } - } - } - } - #hideCandidates(): void { - this.#candidatesElement.style.display = "none" - } - - #openMenu(): void { - this.#menuElement.classList.add("open") - this.#menuElement.classList.remove("close") - this.#isMenuOpen = true - } - #closeMenu(): void { - this.#menuElement.classList.add("close") - this.#menuElement.classList.remove("open") - this.#isMenuOpen = false - } - - #onClickEllipsis = (evt: Event) => { - this.#logger.info("onClickEllipsis", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.#isMenuOpen ? this.#closeMenu() : this.#openMenu() - this.#hideCandidates() - } - - #onClickConvert = (evt: Event) => { - this.#logger.info("onClickConvert", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.internalEvent.emitConvert() - this.#closeMenu() - } - - #onClickCopy = async (evt: Event): Promise => { - this.#logger.info("onClickCopy", { evt }) - evt.preventDefault() - evt.stopPropagation() - try { - this.#closeMenu() - let message = "Nothing to copy" - if (this.#prompterTextElement.innerText) { - message = `"${this.#prompterTextElement.innerText}" copied to clipboard` - if (/iPad|iPhone|iPod/.test(navigator.userAgent)) { - const permissionName = "clipboard-write" as PermissionName; - const permissionStatus = await navigator.permissions.query({ name: permissionName }); - if (permissionStatus.state === "granted") { - await navigator.clipboard.writeText(this.#prompterTextElement.innerText) - } - } else { - await navigator.clipboard.writeText(this.#prompterTextElement.innerText) - } - } - this.internalEvent.emitNotif({ message, timeout: 1500 }) - } catch (err) { - this.#logger.error("onClickCopy", { err }) - this.internalEvent.emitError(err as Error) - } - } - - #onClickDelete = (evt: Event) => { - this.#logger.info("onClickDelete", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.internalEvent.emitClear() - this.#closeMenu() - } - - #onClickCandidate = (evt: Event) => { - this.#logger.info("onClickCandidate", { evt }) - evt.preventDefault() - evt.stopPropagation() - const target = evt.target as HTMLElement - const candidate = target.innerText - if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) { - this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate - this.internalEvent.emitImportJIIX(this.jiix) - } - this.#candidatesElement.style.display = "none" - } - - #onClickPrompter = (evt: Event): void => { - this.#logger.info("onClickPrompter", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.#closeMenu() - const target = evt.target as HTMLElement - if (target.id !== this.#prompterTextElement.id) { - this.#showCandidates(target) - } else { - this.#hideCandidates() - } - - } - - #onClickOutSide = () => { - this.#hideCandidates() - this.#closeMenu() - } - - #addListeners(): void { - this.#ellipsisElement.addEventListener("pointerdown", this.#onClickEllipsis.bind(this)) - this.#convertElement.addEventListener("pointerdown", this.#onClickConvert.bind(this)) - this.#copyElement.addEventListener("pointerdown", this.#onClickCopy.bind(this)) - this.#deleteElement.addEventListener("pointerdown", this.#onClickDelete.bind(this)) - this.#prompterTextElement.addEventListener("pointerdown", this.#onClickPrompter.bind(this)) - this.#candidatesElement.addEventListener("pointerdown", this.#onClickCandidate.bind(this)) - document.addEventListener("pointerdown", this.#onClickOutSide.bind(this)) - } - - #removeListeners(): void { - this.#ellipsisElement.removeEventListener("pointerdown", this.#onClickEllipsis) - this.#convertElement.removeEventListener("pointerdown", this.#onClickConvert) - this.#copyElement.removeEventListener("pointerdown", this.#onClickCopy) - this.#deleteElement.removeEventListener("pointerdown", this.#onClickDelete) - this.#prompterTextElement.removeEventListener("pointerdown", this.#onClickPrompter) - this.#candidatesElement.removeEventListener("pointerdown", this.#onClickCandidate) - document.removeEventListener("pointerdown", this.#onClickOutSide) - } - - resize(): void { - this.#logger.info("resize") - const mmToPixels = 3.779527559 - const marginTop = this.margin.top * mmToPixels - const marginLeft = this.margin.left * mmToPixels - const marginRight = this.margin.right * mmToPixels - // 12 is the space between line in mm - const top = marginTop - (12 * mmToPixels) - - this.#smartGuideElement.style.top = `${top}px` - this.#smartGuideElement.style.left = `${marginLeft}px` - this.#smartGuideElement.style.right = `${marginRight}px` - - let left = this.#tagElement.offsetWidth - this.#prompterContainerElement.style.marginLeft = `${left}px` - this.#prompterContainerElement.style.width = `${this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight}px` - left += this.#prompterContainerElement.offsetWidth - this.#menuElement.style.left = `${left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth}px` - this.#menuElement.style.top = `${this.#ellipsisElement.offsetHeight}px` - this.#ellipsisElement.style.left = `${left}px` - } - - update(exports: TJIIXExport): void { - this.#logger.info("update", { exports }) - this.jiix = exports - const createWordSpan = (index: number, word?: TWordExport) => { - const span = document.createElement("span") - span.id = `word-${index}${this.uuid}` - if (word) { - span.textContent = word.label - } else { - span.innerHTML = " " - } - this.#logger.debug("update", { span }) - return span - } - - const populatePrompter = () => { - this.#logger.info("populatePrompter", { }) - this.#prompterTextElement.innerHTML = "" - if (this.jiix?.words) { - const words = this.jiix.words as TWordExport[] - const myFragment = document.createDocumentFragment() - words.forEach((word, index) => { - if (word.label === " " || word.label.includes("\n")) { - myFragment.appendChild(createWordSpan(index)) - } else if (index !== words.length - 1) { - myFragment.appendChild(createWordSpan(index, word)) - } else { - this.#prompterTextElement.appendChild(myFragment) - if (this.lastWord) { - this.lastWord = word - } - const span = createWordSpan(index, word) - // This is used to scroll to last word if last word is modified - - if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) { - this.lastWord = word - } - if(this.wordToChange?.id === index.toString()) - { - span.classList.add("modified-word") - this.wordToChange = undefined - } - else - { - span.classList.add("added-word") - } - this.#prompterTextElement.appendChild(span) - this.#prompterContainerElement.scrollLeft = span.offsetLeft - this.#logger.debug("update => populatePrompter", { span }) - this.#logger.debug("update => populatePrompter", this.lastWord) - } - }) - } - } - populatePrompter() - if (this.jiix?.words?.length) { - this.#show() - } - } - - clear(): void { - this.#logger.info("clear") - this.#prompterTextElement.innerHTML = "" - this.#candidatesElement.innerHTML = "" - this.#hide() - } - - destroy(): void { - this.#logger.info("destroy") - this.#removeListeners() - this.#smartGuideElement.remove() - } -} diff --git a/src/style/DefaultPenStyle.ts b/src/style/DefaultPenStyle.ts deleted file mode 100644 index d6b60dc49..000000000 --- a/src/style/DefaultPenStyle.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" - -export const DefaultPenStyle: TPenStyle = {} \ No newline at end of file diff --git a/src/style/DefaultTheme.ts b/src/style/DefaultTheme.ts deleted file mode 100644 index 6dedb4401..000000000 --- a/src/style/DefaultTheme.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { TTheme } from "../@types/style/Theme" - -export const DefaultTheme: TTheme = { - ink: { - color: "#000000", - width: 1, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "#A8A8A8FF" - }, - ".text": { - "font-family": "MyScriptInter", - "font-size": 10 - } -} diff --git a/src/style/StyleHelper.ts b/src/style/StyleHelper.ts deleted file mode 100644 index 39ce56c4b..000000000 --- a/src/style/StyleHelper.ts +++ /dev/null @@ -1,51 +0,0 @@ -import JsonCSS from "json-css" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const parser: any = new JsonCSS() - -export const StyleHelper = { - themeToCSS(json: TTheme): string - { - return parser.toCSS(json) as string - // css = css.replace( /[\r\n]+/gm, "" ) - // return css - }, - themeToJSON(style: string): TTheme - { - const theme = parser.toJSON(style) as TTheme - theme[".text"]["font-size"] = Number(theme[".text"]["font-size"]) - theme.ink["-myscript-pen-width"] = Number(theme.ink["-myscript-pen-width"]) - theme.ink.width = Number(theme.ink.width) - return theme - }, - penStyleToCSS (penStyle: TPenStyle): string { - let css = parser.toCSS({ css: penStyle }) as string - css = css.substring(6, css.length - 3) - return css - }, - penStyleToJSON (penStyleString: string): TPenStyle { - const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle - if (penStyle.width) { - penStyle.width = Number(penStyle.width) - } else { - delete penStyle.width - } - if (penStyle["-myscript-pen-width"]) { - penStyle["-myscript-pen-width"] = Number(penStyle["-myscript-pen-width"]) - } else { - delete penStyle["-myscript-pen-width"] - } - return penStyle - }, - - stringToJSON(style: string): {[key: string]: string} - { - return parser.toJSON(`css {${style}}`).css - }, - JSONToString(style: {[key: string]: string}): string - { - return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(";") - } -} diff --git a/src/style/StyleManager.ts b/src/style/StyleManager.ts deleted file mode 100644 index 8061ce433..000000000 --- a/src/style/StyleManager.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TTheme } from "../@types/style/Theme" -import { TPenStyle } from "../@types/style/PenStyle" - -import { mergeDeep } from "../utils/MergeHelper" - -import { DefaultPenStyle } from "./DefaultPenStyle" -import { DefaultTheme } from "./DefaultTheme" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class StyleManager -{ - #penStyle!: TPenStyle - #theme!: TTheme - #penStyleClasses!: string - #currentPenStyle!: TPenStyle - #logger = LoggerManager.getLogger(LoggerClass.STYLEMANAGER) - - constructor(penStyle?: TPenStyle, theme?: TTheme) - { - this.#logger.info("constructor", { penStyle, theme }) - this.setTheme(theme) - this.setPenStyleClasses() - this.setPenStyle(penStyle) - } - - get currentPenStyle(): TPenStyle - { - return this.#currentPenStyle || this.#penStyle - } - - get penStyle(): TPenStyle - { - return this.#penStyle - } - setPenStyle(style?: TPenStyle) - { - this.#logger.info("setPenStyle", { style }) - this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), style || {}) as TPenStyle - this.#currentPenStyle = style || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle - this.#logger.debug("setPenStyle", this.#currentPenStyle) - } - - get theme(): TTheme - { - return this.#theme - } - setTheme(theme?: TTheme) - { - this.#logger.info("setTheme", { theme }) - this.#theme = mergeDeep(structuredClone(DefaultTheme), theme || {}) as TTheme - this.#logger.debug("setTheme", this.#theme) - } - - get penStyleClasses(): string - { - return this.#penStyleClasses - } - setPenStyleClasses(penStyleClass = "") - { - this.#logger.info("setPenStyleClasses", { penStyleClass }) - this.#penStyleClasses = penStyleClass - this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle - this.#logger.debug("setPenStyleClasses", this.#currentPenStyle) - } - -} diff --git a/src/style/index.ts b/src/style/index.ts deleted file mode 100644 index 151f2b336..000000000 --- a/src/style/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { DefaultPenStyle } from "./DefaultPenStyle" -export { DefaultTheme } from "./DefaultTheme" -export { StyleHelper } from "./StyleHelper" -export { StyleManager } from "./StyleManager" diff --git a/src/undo-redo/UndoRedoContext.ts b/src/undo-redo/UndoRedoContext.ts deleted file mode 100644 index 82b54c84f..000000000 --- a/src/undo-redo/UndoRedoContext.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IModel } from "../@types/model/Model" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" - -export class UndoRedoContext implements TUndoRedoContext -{ - canUndo: boolean - canRedo: boolean - empty: boolean - stackIndex: number - possibleUndoCount: number - stack: IModel[] - - constructor(model: IModel) - { - this.stackIndex = 0 - this.possibleUndoCount = 0 - this.canRedo = false - this.canUndo = false - this.empty = true - this.stack = [model.getClone()] - } -} diff --git a/src/undo-redo/UndoRedoManager.ts b/src/undo-redo/UndoRedoManager.ts deleted file mode 100644 index 6eb5a731b..000000000 --- a/src/undo-redo/UndoRedoManager.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { IModel } from "../@types/model/Model" -import { InternalEvent } from "../event/InternalEvent" -import { UndoRedoContext } from "./UndoRedoContext" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class UndoRedoManager -{ - context: UndoRedoContext - configuration: TUndoRedoConfiguration - #logger = LoggerManager.getLogger(LoggerClass.UNDOREDO_MANAGER) - - constructor(configuration: TUndoRedoConfiguration, model: IModel) - { - this.#logger.info("constructor", { configuration, model }) - this.configuration = configuration - this.context = new UndoRedoContext(model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - private updateCanUndoRedo(): void - { - this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex - this.context.canUndo = this.context.stackIndex > 0 - const currentModel = this.context.stack[this.context.stackIndex] - this.context.empty = currentModel.rawStrokes.length === 0 - } - - addModelToStack(model: IModel): void - { - this.#logger.info("addModelToStack", { model }) - if (this.context.stackIndex + 1 < this.context.stack.length) { - this.context.stack.splice(this.context.stackIndex + 1) - } - - this.context.stack.push(model.getClone()) - this.context.stackIndex = this.context.stack.length - 1 - - if (this.context.stack.length > this.configuration.maxStackSize) { - this.context.stack.shift() - this.context.stackIndex-- - } - - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - - removeLastModelInStack(): void - { - this.#logger.info("removeLastModelInStack") - if (this.context.stackIndex === this.context.stack.length - 1) { - this.context.stackIndex-- - } - this.context.stack.pop() - this.updateCanUndoRedo() - } - - updateModelInStack(model: IModel): void - { - this.#logger.info("updateModelInStack", { model }) - const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate) - if (index > -1) { - this.context.stack.splice(index, 1, model.getClone()) - } - this.internalEvent.emitContextChange(this.context) - } - - undo(): IModel - { - this.#logger.info("undo") - if (this.context.canUndo) { - this.context.stackIndex-- - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - const previousModel = this.context.stack[this.context.stackIndex].getClone() - this.#logger.debug("undo", previousModel) - return previousModel - } - - redo(): IModel - { - this.#logger.info("redo") - if (this.context.canRedo) { - this.context.stackIndex++ - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - const nextModel = this.context.stack[this.context.stackIndex].getClone() - this.#logger.debug("redo", nextModel) - return nextModel - } - - reset(model: IModel): void - { - this.#logger.info("reset", { model }) - this.context = new UndoRedoContext(model) - this.internalEvent.emitContextChange(this.context) - } - -} diff --git a/src/undo-redo/index.ts b/src/undo-redo/index.ts deleted file mode 100644 index 407c8949a..000000000 --- a/src/undo-redo/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { UndoRedoContext } from "./UndoRedoContext" -export { UndoRedoManager } from "./UndoRedoManager" diff --git a/src/utils/CryptoHelper.ts b/src/utils/CryptoHelper.ts deleted file mode 100644 index 2847de7ca..000000000 --- a/src/utils/CryptoHelper.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Hex from "crypto-js/enc-hex" -import HmacSHA512 from "crypto-js/hmac-sha512" - -export function computeHmac (message: string, applicationKey: string, hmacKey: string): string { - const hmac = new HmacSHA512(message, applicationKey + hmacKey) - return hmac.toString(Hex) as string -} diff --git a/src/utils/DeferredPromise.ts b/src/utils/DeferredPromise.ts deleted file mode 100644 index 86c0afd59..000000000 --- a/src/utils/DeferredPromise.ts +++ /dev/null @@ -1,32 +0,0 @@ - -export class DeferredPromise { - promise: Promise - resolve!: (value: T) => void - reject!: (value: Error) => void - - isFullFilled: boolean - isPending: boolean - - - constructor() - { - this.isFullFilled = false - this.isPending = true - - this.promise = new Promise((resolve, reject) => - { - this.reject = async (v: unknown) => - { - this.isFullFilled = true - this.isPending = false - return reject(v) - } - this.resolve = async (v: unknown) => - { - this.isFullFilled = true - this.isPending = false - return resolve(v as T) - } - }) - } -} diff --git a/src/utils/MergeHelper.ts b/src/utils/MergeHelper.ts deleted file mode 100644 index d884ac3e1..000000000 --- a/src/utils/MergeHelper.ts +++ /dev/null @@ -1,26 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const mergeDeep = (target: any, ...sources: any[]): any => - { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const isObject = (item: any) => - { - return (item && typeof item === "object" && !Array.isArray(item)) - } - if (!sources.length) return target - const source = sources.shift() - - if (isObject(target) && isObject(source)) { - for (const key in source) { - if (isObject(source[key])) { - if (!target[key]) { - Object.assign(target, { [key]: {} }) - } - mergeDeep(target[key], source[key]) - } else { - Object.assign(target, { [key]: source[key] }) - } - } - } - - return mergeDeep(target, ...sources) - } diff --git a/src/utils/font.ts b/src/utils/font.ts deleted file mode 100644 index c75d5eebd..000000000 --- a/src/utils/font.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TConfigurationClient } from "../@types/configuration" - -export async function getAvailableFontList(configuration: TConfigurationClient): Promise> -{ - if (!configuration?.server?.scheme && !configuration?.server?.host) { - return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - } - if (!configuration?.recognition?.lang) { - return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!") - } - const serverConfig = configuration.server - const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang) - const { result } = await response.json() - return result.sort() -} diff --git a/src/utils/geometric.ts b/src/utils/geometric.ts deleted file mode 100644 index c0911494b..000000000 --- a/src/utils/geometric.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TPoint } from "../@types/geometry" - -export function computeDistance(p1: TPoint, p2: TPoint): number -{ - const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x) - return isNaN(distance) ? 0 : distance -} diff --git a/src/utils/index.ts b/src/utils/index.ts deleted file mode 100644 index 4f47fee3e..000000000 --- a/src/utils/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { DeferredPromise } from "./DeferredPromise" -export * as geometric from "./geometric" -export * as version from "./version" -export * as crypto from "../utils/CryptoHelper" -export { getAvailableFontList } from "./font" -export { getAvailableLanguageList } from "./language" diff --git a/src/utils/language.ts b/src/utils/language.ts deleted file mode 100644 index 0b9aad3e3..000000000 --- a/src/utils/language.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TConfigurationClient } from "../@types/configuration" - -export async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>> -{ - if (configuration?.server?.scheme && configuration?.server?.host) { - const serverConfig = configuration.server - const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`) - return response.json() - } else { - return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - } -} diff --git a/src/utils/version.ts b/src/utils/version.ts deleted file mode 100644 index 8e97eb7fa..000000000 --- a/src/utils/version.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export const isVersionSuperiorOrEqual = (source: string, target: string): boolean => -{ - const sourceParts = source.split(".") - const targetParts = target.split(".") - - for (let i = 0; i < targetParts.length; i++) { - const a = Number(targetParts[i]) - const b = Number(sourceParts[i]) - if (a > b) return false - if (a < b) return true - } - return true -} diff --git a/test/.eslintrc.js b/test/.eslintrc.js deleted file mode 100644 index 2c4bdaf9d..000000000 --- a/test/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - globals: { - browser: true, - page: true, - expect: true - }, - extends: [ - 'standard' - ], - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module' - } -} diff --git a/test/integration/01-home/home.test.js b/test/integration/01-home/home.test.js deleted file mode 100644 index cf5348689..000000000 --- a/test/integration/01-home/home.test.js +++ /dev/null @@ -1,90 +0,0 @@ -describe('Home Page', () => -{ - beforeAll(async () => { - await page.goto('/examples/index.html') - }) - - test('should have title', async () => - { - const title = await page.title() - expect(title).toMatch('iinkTS: Examples') - }) - - test('should display table of content', async () => - { - const tableOfContent = await page.locator('#table-of-content') - expect(await tableOfContent.isVisible()).toBe(true) - }) - - test('each table of contents link must be associated with a section part', async () => - { - const links = await page.locator('#table-of-content li') - const sectionParts = await page.locator('.title') - const linksCount = await links.count() - const secctionPartsCount = await sectionParts.count() - expect(linksCount).toBe(secctionPartsCount) - - for (let i = 0; i < linksCount; i++) { - const linkHref = await links.nth(i).locator('a').getAttribute('href') - const sectionPartName = await sectionParts.nth(i).getAttribute('name') - expect(linkHref).toBe('#' + sectionPartName) - } - }) - - test('each example-item should have 2 links', async () => - { - const exampleItems = await page.locator('.example-item') - - for (let i = 0; i < await exampleItems.count(); i++) { - const exampleItemsTitle = await exampleItems.nth(i).locator('p strong').textContent() - expect(exampleItemsTitle).toBeDefined() - - const links = await exampleItems.nth(i).locator('a') - expect(await links.count()).toBe(2) - - const exampleLink = links.nth(0) - const codeLink = links.nth(1) - - const exampleLinkText = await exampleLink.allInnerTexts() - expect(exampleLinkText.length).toBe(1) - expect(exampleLinkText[0].trim()).toBe('View example') - - const codeLinkText = await codeLink.allInnerTexts() - expect(codeLinkText.length).toBe(1) - expect(codeLinkText[0].trim()).toBe('Get source code') - expect(await codeLink.getAttribute('href')).toContain('https://github.com/MyScript') - } - }) - - test('each "View example" link should ok', async () => - { - const exampleLink = await page.locator('text=View example') - const linksInErrors = [] - for (let i = 0; i < await exampleLink.count(); i++) { - const link = exampleLink.nth(i) - const href = await link.getAttribute('href') - - const [response] = await Promise.all([ - page.waitForResponse((response) => response.url().includes(href)), - link.click() - ]) - await page.waitForLoadState("networkidle") - - if (response.status() >= 400) { - linksInErrors.push(href) - } - await page.goBack() - } - expect(linksInErrors).toStrictEqual([]) - }) - test('each "Get source code" link should ok', async () => - { - const codeLinks = await page.locator('text=Get source code') - const exampleLinks = await page.locator('text=View example') - for(let i = 0; i < await exampleLinks.count(); i++) { - const exampleHref = await exampleLinks.nth(i).getAttribute('href') - const linkHref = await codeLinks.nth(i).getAttribute("href") - expect(linkHref).toEqual(`https://github.com/MyScript/iinkTS/blob/master/examples/${exampleHref}`) - } - }) -}) diff --git a/test/integration/02-rest/rest-diagram.test.js b/test/integration/02-rest/rest-diagram.test.js deleted file mode 100644 index b690a3158..000000000 --- a/test/integration/02-rest/rest-diagram.test.js +++ /dev/null @@ -1,166 +0,0 @@ -const { - waitForEditorRest, - write, - getDatasFromExportedEvent, - setEditorConfiguration, - getEditorConfiguration, - getExportsFromEditorModel, -} = require('../helper') -const { rectangle, line } = require('../strokesDatas') - -describe('Rest Diagram', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_diagram_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Diagram') - }) - - test('should display application/vnd.myscript.jiix into result', async () => { - const [lineExportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[0]]), - ]) - const lineResultText = await page.locator('#result').textContent() - const lineResultJson = JSON.parse(lineResultText) - expect(lineResultJson).toEqual(lineExportedDatas) - expect(lineExportedDatas['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports[0]['application/vnd.myscript.jiix']) - - const [rectExportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[1]]), - ]) - const rectResultText = await page.locator('#result').textContent() - const rectResultJson = JSON.parse(rectResultText) - expect(rectResultJson).toEqual(rectExportedDatas) - expect(rectExportedDatas['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports[1]['application/vnd.myscript.jiix']) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request application/vnd.myscript.jiix by default', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.myscript.jiix') - }) - - test('should only request application/vnd.openxmlformats-officedocument.presentationml.presentation', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.diagram.mimeTypes = [ - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.openxmlformats-officedocument.presentationml.presentation') - }) - - test('should request application/vnd.myscript.jiix & application/vnd.openxmlformats-officedocument.presentationml.presentation', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.diagram.mimeTypes = [ - 'application/vnd.myscript.jiix', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/vnd.myscript.jiix') - expect(allMimeTypesRequested).toContain('application/vnd.openxmlformats-officedocument.presentationml.presentation') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - const resultText = await page.locator('#result').textContent() - const rectResultJson = JSON.parse(resultText) - expect(exportedDatas['application/vnd.myscript.jiix']).toEqual(rectResultJson['application/vnd.myscript.jiix']) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(line.exports[0]['application/vnd.myscript.jiix']) - - expect(await getExportsFromEditorModel(page)).toBeDefined() - - const promisesResult = await Promise.all([ - getDatasFromExportedEvent(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getExportsFromEditorModel(page)).toBeNull() - - expect(await page.locator('#result').textContent()).toBe('{}') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[0]]) - ]) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[1]]) - ]) - let resultText = await page.locator('#result').textContent() - let rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-1)['application/vnd.myscript.jiix']) - - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - resultText = await page.locator('#result').textContent() - rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-2)['application/vnd.myscript.jiix']) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length - 1) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#redo')]) - resultText = await page.locator('#result').textContent() - rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-1)['application/vnd.myscript.jiix']) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length) - }) - }) -}) diff --git a/test/integration/02-rest/rest-math.test.js b/test/integration/02-rest/rest-math.test.js deleted file mode 100644 index 06577dbca..000000000 --- a/test/integration/02-rest/rest-math.test.js +++ /dev/null @@ -1,149 +0,0 @@ -const { - waitForEditorRest, - write, - getDatasFromExportedEvent, - setEditorConfiguration, - getEditorConfiguration, - getExportsFromEditorModel, - getExportsTypeFromEditorModel, - waitEditorIdle, - writePointers, -} = require('../helper') -const { equation1, one } = require('../strokesDatas') - -describe('Rest Math', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_math_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Math') - }) - - test('should display katex-html into result', async () => { - let exportedDatas - for (let s of equation1.strokes) { - [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]), - ]) - } - - const resultElement = page.locator('#result') - const htmlKatexResult = await resultElement.locator('.katex-html').textContent() - - const modelExports = await getExportsFromEditorModel(page) - expect(exportedDatas['application/x-latex']).toStrictEqual(equation1.exports.LATEX.at(-1)) - expect(modelExports['application/x-latex']).toStrictEqual(equation1.exports.LATEX.at(-1)) - expect(htmlKatexResult).toStrictEqual(equation1.exports.LATEX.at(-1)) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request application/x-latex by default', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/x-latex') - }) - - test('should only request application/mathml+xml', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.math.mimeTypes = ['application/mathml+xml'] - await setEditorConfiguration(page, configuration) - - await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/mathml+xml') - }) - - test('should request application/mathml+xml & application/x-latex', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.math.mimeTypes = [ - 'application/mathml+xml', - 'application/x-latex', - ] - await setEditorConfiguration(page, configuration) - - await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/mathml+xml') - expect(allMimeTypesRequested).toContain('application/x-latex') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes) - ]) - - expect(exportedDatas['application/x-latex']).toStrictEqual(one.exports.LATEX.at(-1)) - - const promisesResult = await Promise.all([ - getDatasFromExportedEvent(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - - const resultElement = page.locator('#result') - const resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - - await write(page, equation1.strokes) - await waitEditorIdle(page) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 1) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 2) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#redo')]) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 1) - }) - }) -}) diff --git a/test/integration/02-rest/rest-text.test.js b/test/integration/02-rest/rest-text.test.js deleted file mode 100644 index 7b35d6450..000000000 --- a/test/integration/02-rest/rest-text.test.js +++ /dev/null @@ -1,173 +0,0 @@ -const { - waitForEditorRest, - write, - getDatasFromExportedEvent, - setEditorConfiguration, - getEditorConfiguration, - waitEditorLoaded, - getExportsFromEditorModel, -} = require('../helper') -const { h, hello } = require('../strokesDatas') - -describe('Rest Text', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_text_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Text') - }) - - test('should display text/plain into result', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request text/plain by default', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('text/plain') - }) - - test('should only request application/vnd.myscript.jiix', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.text.mimeTypes = [ - 'application/vnd.myscript.jiix', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.myscript.jiix') - }) - - test('should request application/vnd.myscript.jiix & text/plain', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.text.mimeTypes = [ - 'application/vnd.myscript.jiix', - 'text/plain', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/vnd.myscript.jiix') - expect(allMimeTypesRequested).toContain('text/plain') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - expect(await getExportsFromEditorModel(page)).toBeDefined() - - const promisesResult = await Promise.all([ - getDatasFromExportedEvent(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getExportsFromEditorModel(page)).toBeNull() - - expect(await page.locator('#result').textContent()).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - - await page.waitForTimeout(1500) - - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-1)) - - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-2)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-3)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 2) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#redo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-2)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - }) - - test('should change language', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - await Promise.all([ - waitEditorLoaded(page), - page.selectOption('#language', 'fr_FR'), - ]) - - expect(await page.locator('#result').textContent()).toBe('') - }) - }) -}) diff --git a/test/integration/03-websocket/websocket-export-on-demand.test.js b/test/integration/03-websocket/websocket-export-on-demand.test.js deleted file mode 100644 index 9afcd9db0..000000000 --- a/test/integration/03-websocket/websocket-export-on-demand.test.js +++ /dev/null @@ -1,31 +0,0 @@ -const { helloHowAreYou } = require('../strokesDatas') -const { waitForEditorWebSocket, waitEditorIdle, getExportsFromEditorModel, write } = require('../helper') - -describe('Websocket on-demand export', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_export_on_demand.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket on-demand export') - }) - - test('should not export', async () => { - await write(page, helloHowAreYou.strokes) - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - expect(exports).toBeUndefined() - expect(await page.locator("#result").textContent()).toEqual("") - }) - - test('should export on click', async () => { - await page.click("#export") - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - const jiix = exports['application/vnd.myscript.jiix'] - expect(jiix.label).toEqual(helloHowAreYou.exports["text/plain"].at(-1)) - expect(await page.locator("#result").textContent()).toEqual(helloHowAreYou.exports["text/plain"].at(-1)) - }) -}) diff --git a/test/integration/03-websocket/websocket-handle_errors.test.js b/test/integration/03-websocket/websocket-handle_errors.test.js deleted file mode 100644 index a96951649..000000000 --- a/test/integration/03-websocket/websocket-handle_errors.test.js +++ /dev/null @@ -1,17 +0,0 @@ - describe("Websocket Text", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_handle_errors.html") - await page.waitForSelector(".message") - }) - - test("should have title", async () => { - - const title = await page.title() - expect(title).toMatch("Handle error") - }) - - test("should have error message", async () => { - const errorMessage = await page.locator(".message.error-msg").textContent() - expect(errorMessage).toContain("Application credentials are invalid. Please check or regenerate your application key and hmackey.") - }) - }) diff --git a/test/integration/03-websocket/websocket-math-custom-resources.test.js b/test/integration/03-websocket/websocket-math-custom-resources.test.js deleted file mode 100644 index 441d70dfb..000000000 --- a/test/integration/03-websocket/websocket-math-custom-resources.test.js +++ /dev/null @@ -1,54 +0,0 @@ -const { waitForEditorWebSocket, writePointers, write, getDatasFromExportedEvent, getExportsTypeFromEditorModel, waitEditorIdle, getEditorConfiguration, setEditorConfiguration } = require("../helper") -const { sumSimple, h } = require("../strokesDatas") - -describe("Websocket Math", function () { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_math_custom_resources.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom resources math") - }) - - test("should only export latex by default", async () => { - for (const s of sumSimple.strokes) { - await Promise.all([getDatasFromExportedEvent(page), writePointers(page, [s], 100, 100)]) - } - const jiix = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - expect(jiix).toBeUndefined() - const latex = await getExportsTypeFromEditorModel(page, "application/x-latex") - expect(latex).toBeDefined() - const mathml = await getExportsTypeFromEditorModel(page, "application/mathml+xml") - expect(mathml).toBeUndefined() - }) - - test("should not recognize text", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).not.toEqual("h") - }) - - test("should change configuration and recognize text", async () => { - - const config = await getEditorConfiguration(page) - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - const [exportedDatas] = await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - const latexReceived = exportedDatas["application/x-latex"] - expect(resultText).toEqual("h") - }) - require("../_partials/math/nav-actions-math-undo-redo-test") - require("../_partials/math/nav-actions-math-clear-test") -}) diff --git a/test/integration/03-websocket/websocket-math-eraser.test.js b/test/integration/03-websocket/websocket-math-eraser.test.js deleted file mode 100644 index b496749cb..000000000 --- a/test/integration/03-websocket/websocket-math-eraser.test.js +++ /dev/null @@ -1,20 +0,0 @@ - -const { waitForEditorWebSocket } = require('../helper') - -describe('Websocket Math Eraser', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_iink_eraser.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Math Eraser') - }) - require("../_partials/math/nav-actions-math-undo-redo-test") - require("../_partials/math/nav-actions-math-clear-test") -}) diff --git a/test/integration/03-websocket/websocket-math-import-jiix.test.js b/test/integration/03-websocket/websocket-math-import-jiix.test.js deleted file mode 100644 index 54fc1fdad..000000000 --- a/test/integration/03-websocket/websocket-math-import-jiix.test.js +++ /dev/null @@ -1,25 +0,0 @@ - -const { waitForEditorWebSocket, waitEditorIdle, getExportsTypeFromEditorModel, haveSameLabels } = require('../helper') - -describe('Websocket Math Import JIIX', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_import_jiix.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Import math with JIIX') - }) - - test('should import JIIX', async () => { - await page.click('#import') - await waitEditorIdle(page) - - const jiix = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - const jiixTextToImport = await page.locator("#jiix").textContent() - const jiixToImport = JSON.parse(jiixTextToImport) - expect(haveSameLabels(jiix, jiixToImport)).toEqual(true) - }) - -}) diff --git a/test/integration/03-websocket/websocket-math-inside-page.test.js b/test/integration/03-websocket/websocket-math-inside-page.test.js deleted file mode 100644 index 66c1d60db..000000000 --- a/test/integration/03-websocket/websocket-math-inside-page.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const { haveSameLabels, write, getExportsFromEditorModel, getDatasFromImportedEvent, getDatasFromExportedEvent, waitEditorIdle } = require("../helper") - -const mathContentList = [ - { - id: "eq-1", - latex: "a^{2}+b^{2}=c^{2}", - textContent: "a2+b2=c2", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [159, 157, 156, 154, 150, 149, 146, 143, 142, 138, 144, 149, 154, 159, 162, 166, 169, 168, 169, 169, 169, 168, 168, 168, 168], "y": [174, 177, 180, 183, 188, 191, 195, 199, 202, 205, 204, 204, 204, 204, 204, 202, 202, 205, 208, 212, 216, 219, 222, 225, 229], "t": [1689858551959, 1689858552062, 1689858552078, 1689858552094, 1689858552112, 1689858552128, 1689858552162, 1689858552194, 1689858552228, 1689858552261, 1689858552711, 1689858552727, 1689858552744, 1689858552761, 1689858552835, 1689858552877, 1689858552910, 1689858553177, 1689858553193, 1689858553227, 1689858553243, 1689858553260, 1689858553277, 1689858553431, 1689858553460], "p": [0.5, 0.81, 0.68, 0.7, 0.77, 0.68, 0.74, 0.74, 0.68, 0.74, 0.77, 0.74, 0.74, 0.74, 0.68, 0.73, 0.68, 0.68, 0.68, 0.71, 0.71, 0.68, 0.68, 0.68, 0.71] }], - latexAfterWriting: "4a^{2}+b^{2}=c^{2}" - }, - { - id: "eq-2", - latex: "c=\\sqrt{a^{2}+b^{2}}", - textContent: "c=a2+b2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [190, 190, 191, 192, 193, 195, 198, 201, 206, 211, 215, 218, 222, 224, 226, 227, 227, 227, 226, 225, 225, 222, 221, 218, 214, 210, 208, 205, 201, 198, 206, 215, 228, 238, 247, 255], "y": [194, 191, 188, 183, 180, 176, 174, 172, 171, 171, 172, 173, 175, 178, 181, 184, 187, 192, 195, 198, 201, 206, 209, 213, 217, 220, 224, 227, 230, 233, 232, 231, 231, 231, 231, 231], "t": [1689859052854, 1689859052908, 1689859052922, 1689859052956, 1689859052972, 1689859052989, 1689859053054, 1689859053092, 1689859053122, 1689859053139, 1689859053155, 1689859053189, 1689859053222, 1689859053238, 1689859053272, 1689859053289, 1689859053306, 1689859053339, 1689859053356, 1689859053372, 1689859053389, 1689859053421, 1689859053438, 1689859053472, 1689859053489, 1689859053522, 1689859053555, 1689859053589, 1689859053621, 1689859053739, 1689859053922, 1689859053938, 1689859053955, 1689859053971, 1689859053988, 1689859054005], "p": [0.5, 0.83, 0.68, 0.75, 0.68, 0.73, 0.7, 0.7, 0.75, 0.74, 0.72, 0.68, 0.73, 0.7, 0.7, 0.68, 0.68, 0.74, 0.68, 0.68, 0.68, 0.76, 0.68, 0.74, 0.76, 0.74, 0.73, 0.72, 0.74, 0.72, 0.8, 0.81, 0.64, 0.68, 0.81, 0.8] }], - latexAfterWriting: "2c=\\sqrt{a^{2}+b^{2}}" - }, - { - id: "eq-3", - latex: "a=\\sqrt{c^{2}-b^{2}}", - textContent: "a=c2−b2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [159, 157, 156, 154, 150, 149, 146, 143, 142, 138, 144, 149, 154, 159, 162, 166, 169, 168, 169, 169, 169, 168, 168, 168, 168], "y": [174, 177, 180, 183, 188, 191, 195, 199, 202, 205, 204, 204, 204, 204, 204, 202, 202, 205, 208, 212, 216, 219, 222, 225, 229], "t": [1689858551959, 1689858552062, 1689858552078, 1689858552094, 1689858552112, 1689858552128, 1689858552162, 1689858552194, 1689858552228, 1689858552261, 1689858552711, 1689858552727, 1689858552744, 1689858552761, 1689858552835, 1689858552877, 1689858552910, 1689858553177, 1689858553193, 1689858553227, 1689858553243, 1689858553260, 1689858553277, 1689858553431, 1689858553460], "p": [0.5, 0.81, 0.68, 0.7, 0.77, 0.68, 0.74, 0.74, 0.68, 0.74, 0.77, 0.74, 0.74, 0.74, 0.68, 0.73, 0.68, 0.68, 0.68, 0.71, 0.71, 0.68, 0.68, 0.68, 0.71] }], - latexAfterWriting: "4a=\\sqrt{c^{2}-b^{2}}" - }, - { - id: "eq-4", - latex: "b=\\sqrt{c^{2}-a^{2}}", - textContent: "b=c2−a2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [190, 190, 191, 192, 193, 195, 198, 201, 206, 211, 215, 218, 222, 224, 226, 227, 227, 227, 226, 225, 225, 222, 221, 218, 214, 210, 208, 205, 201, 198, 206, 215, 228, 238, 247, 255], "y": [194, 191, 188, 183, 180, 176, 174, 172, 171, 171, 172, 173, 175, 178, 181, 184, 187, 192, 195, 198, 201, 206, 209, 213, 217, 220, 224, 227, 230, 233, 232, 231, 231, 231, 231, 231], "t": [1689859052854, 1689859052908, 1689859052922, 1689859052956, 1689859052972, 1689859052989, 1689859053054, 1689859053092, 1689859053122, 1689859053139, 1689859053155, 1689859053189, 1689859053222, 1689859053238, 1689859053272, 1689859053289, 1689859053306, 1689859053339, 1689859053356, 1689859053372, 1689859053389, 1689859053421, 1689859053438, 1689859053472, 1689859053489, 1689859053522, 1689859053555, 1689859053589, 1689859053621, 1689859053739, 1689859053922, 1689859053938, 1689859053955, 1689859053971, 1689859053988, 1689859054005], "p": [0.5, 0.83, 0.68, 0.75, 0.68, 0.73, 0.7, 0.7, 0.75, 0.74, 0.72, 0.68, 0.73, 0.7, 0.7, 0.68, 0.68, 0.74, 0.68, 0.68, 0.68, 0.76, 0.68, 0.74, 0.76, 0.74, 0.73, 0.72, 0.74, 0.72, 0.8, 0.81, 0.64, 0.68, 0.81, 0.8] }], - latexAfterWriting: "2b=\\sqrt{c^{2}-a^{2}}" - }, -] - -describe("Websocket Math Inside Page", function () { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_math_inside_page.html") - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Dynamic math part inside a page") - }) - - mathContentList.forEach(async (mc) => { - describe(`Math content for ${mc.id}`, () => { - let currentExport - let currentTextContent - - beforeAll(async () => { - await page.reload({ waitUntil: 'load' }) - await waitEditorIdle(page) - }) - - test(`should open modal editor`, async () => { - await waitEditorIdle(page) - expect(await page.locator("#editor-modal").isVisible()).toEqual(false) - currentTextContent = await page.locator(`#${mc.id} .katex-html`).textContent() - expect(currentTextContent).toEqual(mc.textContent) - await Promise.all([ - getDatasFromImportedEvent(page), - page.locator(`#${ mc.id }`).click() - ]) - await waitEditorIdle(page) - expect(await page.locator("#editor-modal").isVisible()).toEqual(true) - }) - - test(`should import data-jiix`, async () => { - await waitEditorIdle(page) - currentExport = await getExportsFromEditorModel(page) - const jiixExpected = JSON.parse(await page.locator(`#${ mc.id }`).getAttribute("data-jiix")) - expect(haveSameLabels(currentExport["application/vnd.myscript.jiix"], jiixExpected)).toEqual(true) - expect(currentExport["application/x-latex"]).toEqual(mc.latex) - }) - - test(`should update equation`, async () => { - await waitEditorIdle(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, mc.strokesToWrite) - ]) - await waitEditorIdle(page) - currentExport = await getExportsFromEditorModel(page) - expect(currentExport['application/x-latex']).toEqual(mc.latexAfterWriting) - }) - - test(`should close modal editor`, async () => { - await waitEditorIdle(page) - await page.locator("#close").click() - expect(await page.locator("#editor-modal").isVisible()).toEqual(false) - }) - - test(`should update math content`, async () => { - await waitEditorIdle(page) - expect(await page.locator(`#${mc.id} .katex-html`).textContent()).not.toEqual(currentTextContent) - }) - - test(`should re-open modal editor with new equation`, async () => { - await waitEditorIdle(page) - await Promise.all([ - getDatasFromImportedEvent(page), - page.locator(`#${ mc.id }`).click() - ]) - await waitEditorIdle(page) - expect(await page.locator("#editor-modal").isVisible()).toEqual(true) - currentExport = await getExportsFromEditorModel(page) - expect(currentExport['application/x-latex']).toEqual(mc.latexAfterWriting) - }) - }) - }) - -}) diff --git a/test/integration/03-websocket/websocket-math.test.js b/test/integration/03-websocket/websocket-math.test.js deleted file mode 100644 index 88ddbe671..000000000 --- a/test/integration/03-websocket/websocket-math.test.js +++ /dev/null @@ -1,195 +0,0 @@ - -const { - waitForEditorWebSocket, - write, - getDatasFromExportedEvent, - getExportsTypeFromEditorModel, - getEditorConfiguration, - setEditorConfiguration, - getConversionsFromEditorModel, - getDatasFromConvertedEvent, - waitEditorIdle -} = require('../helper') -const { equation1, fence, sum } = require('../strokesDatas') - -describe('Websocket Math', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Math') - }) - - test('should only export latex by default', async () => { - for(const s of equation1.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s], 100, 100) - ]) - } - const jiix = await getExportsTypeFromEditorModel(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeUndefined() - const latex = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(latex).toBeDefined() - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml).toBeUndefined() - }) - - test('should only export jiix', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/vnd.myscript.jiix'] - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - for(const s of equation1.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s], 100, 100) - ]) - } - const latex = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(latex).toBeUndefined() - const jiix = await getExportsTypeFromEditorModel(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeDefined() - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml).toBeUndefined() - }) - - test('should only export mathml+xml', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - await write(page, equation1.strokes, 100, 100) - await waitEditorIdle(page) - - const latex = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(latex).toBeUndefined() - const jiix = await getExportsTypeFromEditorModel(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeUndefined() - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml).toBeDefined() - }) - - test('should export mathml with flavor "standard"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - config.recognition.export.mathml = { flavor: 'standard' } - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - for(const s of fence.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - } - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml.trim().replace(/ /g, '')).toEqual(fence.exports.MATHML.STANDARD[fence.exports.MATHML.STANDARD.length - 1].trim().replace(/ /g, '')) - }) - - test('should export mathml with flavor "ms-office"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - config.recognition.export.mathml = { flavor: 'ms-office' } - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - for(const s of fence.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - } - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml.trim().replace(/ /g, '')).toEqual(fence.exports.MATHML.MSOFFICE[fence.exports.MATHML.MSOFFICE.length - 1].trim().replace(/ /g, '')) - }) - - test('should convert svg path', async () => { - for(const s of equation1.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s], 100, 100) - ]) - } - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - expect(await page.locator('path').count()).toEqual(equation1.strokes.length) - - await Promise.all([ - getDatasFromConvertedEvent(page), - page.click('#convert') - ]) - - await waitEditorIdle(page) - expect(await page.locator('path').count()).toEqual(equation1.exports.LATEX.at(-1).length) - - const convert = await getConversionsFromEditorModel(page) - const latexExport = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(convert['application/x-latex']).toEqual(latexExport) - expect(latexExport).toEqual(equation1.exports.LATEX.at(-1)) - }) - - test('should convert and solve sum by default', async () => { - const config = await getEditorConfiguration(page) - expect(config.recognition.math.solver.enable).toEqual(true) - let numStroke = 0 - for(const s of sum.strokes) { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - expect(exports['application/x-latex']).toEqual(sum.exports.LATEX.at(numStroke)) - numStroke++ - } - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - - await Promise.all([ - getDatasFromConvertedEvent(page), - page.click('#convert') - ]) - const convert = await getConversionsFromEditorModel(page) - expect(convert['application/x-latex']).toEqual(sum.converts.LATEX.at(-1)) - expect(await page.locator('#result').locator('.katex-html').textContent()).toEqual(sum.converts.LATEX.at(-1)) - }) - - test('should convert and not solve sum', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.solver.enable = false - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - let numStroke = 0 - for(const s of sum.strokes) { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - expect(exports['application/x-latex']).toEqual(sum.exports.LATEX.at(numStroke)) - numStroke++ - } - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - - await Promise.all([ - getDatasFromConvertedEvent(page), - page.click('#convert') - ]) - const convert = await getConversionsFromEditorModel(page) - const latexExport = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(convert['application/x-latex']).toEqual(latexExport) - expect(latexExport).toEqual(sum.exports.LATEX.at(-1)) - expect(await page.locator('#result').locator('.katex-html').textContent()).toEqual(sum.exports.LATEX.at(-1)) - }) - - - require("../_partials/math/nav-actions-math-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-custom-lexicon.test.js b/test/integration/03-websocket/websocket-text-custom-lexicon.test.js deleted file mode 100644 index a36ebbff3..000000000 --- a/test/integration/03-websocket/websocket-text-custom-lexicon.test.js +++ /dev/null @@ -1,41 +0,0 @@ -const { writePointers, waitForEditorWebSocket, getExportsFromEditorModel, waitEditorIdle } = require("../helper") -const { covfefe } = require("../strokesDatas") - -describe("Websocket Text Custom Lexicon", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_custom_lexicon.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom lexicon") - }) - - test("should not recognize 'covfefe'", async () => { - await writePointers(page, covfefe.strokes) - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).not.toEqual(covfefe.exports["text/plain"].at(-1)) - }) - - test("should send lexicon data with jiix", async () => { - await Promise.all([ - waitForEditorWebSocket(page), - page.locator("#lexicon").fill("covfefe"), - page.locator("#reinit").click(), - ]) - await writePointers(page, covfefe.strokes) - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).toEqual(covfefe.exports["text/plain"].at(-1)) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-custom-resources.test.js b/test/integration/03-websocket/websocket-text-custom-resources.test.js deleted file mode 100644 index 933d01405..000000000 --- a/test/integration/03-websocket/websocket-text-custom-resources.test.js +++ /dev/null @@ -1,30 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { abrausorus } = require("../strokesDatas") - -describe("Websocket Text Custom Resource", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_custom_resources.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom pre-loaded resources") - }) - - test("should export application/vnd.myscript.jiix", async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, abrausorus.strokes), - ]) - await waitEditorIdle(page) - const jiixExpected = abrausorus.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).toEqual(jiixExpected.label) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-customize-editor-css.test.js b/test/integration/03-websocket/websocket-text-customize-editor-css.test.js deleted file mode 100644 index e503986a4..000000000 --- a/test/integration/03-websocket/websocket-text-customize-editor-css.test.js +++ /dev/null @@ -1,19 +0,0 @@ -const { waitForEditorWebSocket } = require("../helper") - -describe("Websocket Text Custom Resource", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_customize_editor_css.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Styling editor style") - }) - - require("../_partials/text/nav-actions-text-undo-redo-test") -}) \ No newline at end of file diff --git a/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js b/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js deleted file mode 100644 index 79680153a..000000000 --- a/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js +++ /dev/null @@ -1,113 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent } = require('../helper') -const { h } = require('../strokesDatas') - -function hexToRgbA(hex) { - let c - if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) { - c = hex.substring(1).split('') - if (c.length == 3) { - c = [c[0], c[0], c[1], c[1], c[2], c[2]] - } - c = '0x' + c.join('') - return ( - 'rgba(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(', ') + ', 1)' - ) - } - throw new Error('Bad Hex') -} - -describe('Websocket Text Customize Stroke Style', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_customize_stroke_style.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Text Styling') - }) - - test('should draw stroke with DefaultTheme', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const defaultThemeColor = await page.evaluate('editor.theme.ink.color') - const path = page.locator(`path[fill="${hexToRgbA(defaultThemeColor)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with penStyleClasses', async () => { - await page.click('#penStyleClasses') - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const editorTheme = await page.evaluate('editor.theme') - const editorPenStyleClasses = await page.evaluate('editor.penStyleClasses') - const penColorExpected = editorTheme[`.${editorPenStyleClasses}`].color - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with theme', async () => { - await page.selectOption('#theme', 'bold-red'), - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const editorTheme = await page.evaluate('editor.theme') - const penColorExpected = editorTheme.ink.color - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with default penStyle', async () => { - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - await page.setChecked('#penenabled', true) - expect(await page.locator('#pencolor').isDisabled()).toEqual(false) - expect(await page.locator('#penwidth').isDisabled()).toEqual(false) - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const editorPenStyle = await page.evaluate('editor.penStyle') - const path = page.locator(`path[fill="${hexToRgbA(editorPenStyle.color)}"]`) - expect(await path.count()).toEqual(1) - - await page.setChecked('#penenabled', false) - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - }) - - test('should draw stroke with selected penStyle', async () => { - const penColorExpected = '#1a5fb4' - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - - await page.setChecked('#penenabled', true) - expect(await page.locator('#pencolor').isDisabled()).toEqual(false) - expect(await page.locator('#penwidth').isDisabled()).toEqual(false) - - await page.fill('#pencolor', penColorExpected) - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-erase.test.js b/test/integration/03-websocket/websocket-text-erase.test.js deleted file mode 100644 index 20a3b0657..000000000 --- a/test/integration/03-websocket/websocket-text-erase.test.js +++ /dev/null @@ -1,75 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require('../helper') -const { ponyErase, ponyErasePrecisely } = require('../strokesDatas') - -describe('Websocket Text erase', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_iink_eraser.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Text Eraser') - }) - - test('should toggle intention writing <-> erasing', async () => { - expect(await page.locator("#pen").isDisabled()).toBe(true) - expect(await page.locator("#eraser").isDisabled()).toBe(false) - expect(await page.locator("#editor").getAttribute('class')).not.toContain('erasing') - await page.click("#eraser") - expect(await page.locator("#pen").isDisabled()).toBe(false) - expect(await page.locator("#eraser").isDisabled()).toBe(true) - expect(await page.locator("#editor").getAttribute('class')).toContain('erasing') - }) - - test('should export erase stroke', async () => { - const [ponyExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErase.strokes[0]]), - ]) - const ponyJiixExpected = ponyErase.exports[0]['application/vnd.myscript.jiix'] - const ponyJiixReceived = ponyExports['application/vnd.myscript.jiix'] - expect(ponyJiixReceived.label).toEqual(ponyJiixExpected.label) - - await page.click("#eraser") - - const [ponyEraseExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErase.strokes[1]]), - ]) - const ponyEraseJiixExpected = ponyErase.exports[1]['application/vnd.myscript.jiix'] - const ponyEraseJiixReceived = ponyEraseExports['application/vnd.myscript.jiix'] - expect(ponyEraseJiixReceived.label).toEqual(ponyEraseJiixExpected.label) - }) - - test('should export erase stroke precisely', async () => { - await Promise.all([ - waitForEditorWebSocket(page), - page.click("#erase-precisely") - ]) - await waitEditorIdle(page) - - const [ponyExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErasePrecisely.strokes[0]]), - ]) - const ponyJiixExpected = ponyErasePrecisely.exports[0]['application/vnd.myscript.jiix'] - const ponyJiixReceived = ponyExports['application/vnd.myscript.jiix'] - expect(ponyJiixReceived.label).toEqual(ponyJiixExpected.label) - - await page.click("#eraser") - - const [ponyEraseExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErasePrecisely.strokes[1]]), - ]) - const ponyEraseJiixExpected = ponyErasePrecisely.exports[1]['application/vnd.myscript.jiix'] - const ponyEraseJiixReceived = ponyEraseExports['application/vnd.myscript.jiix'] - expect(ponyEraseJiixReceived.label).toEqual(ponyEraseJiixExpected.label) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-file-export.test.js b/test/integration/03-websocket/websocket-text-file-export.test.js deleted file mode 100644 index 99c3477f8..000000000 --- a/test/integration/03-websocket/websocket-text-file-export.test.js +++ /dev/null @@ -1,72 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { hello } = require("../strokesDatas") - -describe("Websocket Text file export", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_file_export.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Word Export with iink") - }) - - test("should write and save to word file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.docx"); - }) - - test("should write and save to html file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'html'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.html"); - }) - - test("should write and save to png file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'png'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.png"); - }) - - test("should write and save to jpg file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'jpeg'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.jpg"); - }) - require("../_partials/text/nav-actions-text-undo-redo-test") - require("../_partials/text/nav-actions-text-clear-test") -}) diff --git a/test/integration/03-websocket/websocket-text-highlight-words.test.js b/test/integration/03-websocket/websocket-text-highlight-words.test.js deleted file mode 100644 index 92b7deaa7..000000000 --- a/test/integration/03-websocket/websocket-text-highlight-words.test.js +++ /dev/null @@ -1,140 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require("../helper") -const { helloOneSurrounded, helloOneStroke } = require("../strokesDatas") - -const getComputedStyle = async (locator) => { - return locator.evaluate((el) => { - const cs = window.getComputedStyle(el) - return { - color: cs.color, - backgroundColor: cs.backgroundColor - } - }) -} - -const colorMap = [ - { - id: "black-btn", - color: "rgb(0, 0, 0)" - }, - { - id: "dark-grey-btn", - color: "rgb(128, 128, 128)" - }, - { - id: "light-grey-btn", - color: "rgb(217, 217, 217)" - }, - { - id: "blue-btn", - color: "rgb(26, 140, 255)" - }, - { - id: "red-btn", - color: "rgb(255, 26, 64)" - }, - { - id: "green-btn", - color: "rgb(43, 217, 101)" - }, - { - id: "yellow-btn", - color: "rgb(255, 221, 51)" - }, - -] - -describe("Websocket Text highlight words", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_highlight_words.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Highlight words') - }) - - test('should write and isn\'t in list', async () => { - await Promise.all([ - write(page, helloOneStroke.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - - test('should write, surround and is in list', async () => { - await Promise.all([ - write(page, helloOneSurrounded.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain("rgb(128, 128, 128)") - }) - - test("should write, surround and is in list then remove from list", async () => { - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - await Promise.all([ - write(page, helloOneSurrounded.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - - for (let index = 0; index < colorMap.length; index++) { - test(`should write text in color${colorMap[index].id} and highlight them`, async () => { - const currentColor = colorMap[index] - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[0]]) - ]) - await page.locator(`#${currentColor.id}`).click() - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain(currentColor.color) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - } - - test("should write in color and surround with another color", async () => { - const strokeColor = colorMap[4] - const highlightColor = colorMap[5] - await page.click(`#${strokeColor.id}`) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[0]]) - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - - await page.click(`#${highlightColor.id}`) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain(highlightColor.color) - expect(style.color).toContain(strokeColor.color) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-iink-no-guides.test.js b/test/integration/03-websocket/websocket-text-iink-no-guides.test.js deleted file mode 100644 index 0f59c17b6..000000000 --- a/test/integration/03-websocket/websocket-text-iink-no-guides.test.js +++ /dev/null @@ -1,39 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket } = require("../helper") -const { helloOneStroke } = require("../strokesDatas") - - describe("Websocket Text Search Without Smartguide", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink_no_guides.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("No guides") - }) - - test("should draw stroke hello", async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, helloOneStroke.strokes), - ]) - - const jiixExpected = helloOneStroke.exports["application/vnd.myscript.jiix"].label - const jiixReceived = exports["application/vnd.myscript.jiix"].label - expect(jiixReceived).toStrictEqual(jiixExpected) - }) - - test("should not see guides", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, helloOneStroke.strokes), - ]) - const line = await page.locator("line").all() - expect(line.length).toEqual(0) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") - }) diff --git a/test/integration/03-websocket/websocket-text-iink-search.test.js b/test/integration/03-websocket/websocket-text-iink-search.test.js deleted file mode 100644 index 4747b878c..000000000 --- a/test/integration/03-websocket/websocket-text-iink-search.test.js +++ /dev/null @@ -1,47 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket } = require("../helper") -const { hello } = require("../strokesDatas") - -describe("Websocket Text search", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink_search.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Text search") - }) - - test("should find text", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - - const inputSearch = page.locator("#searchInput") - await Promise.all([ - inputSearch.type("hello"), - page.click("#searchBtn") - ]) - - //wait for css highlight - await page.waitForTimeout(1000) - const highlight = page.locator(".highlight") - expect(highlight).toBeDefined() - }) - - test("should failed to find", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - - page.locator("#searchInput").type("test") - await page.click("#searchBtn") - expect(await page.locator(".highlight").count()).toEqual(0) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-import-content.test.js b/test/integration/03-websocket/websocket-text-import-content.test.js deleted file mode 100644 index c12f8370c..000000000 --- a/test/integration/03-websocket/websocket-text-import-content.test.js +++ /dev/null @@ -1,54 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require('../helper') -const { h } = require('../strokesDatas') - -describe('Websocket Text Import Content', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_import_content.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Import') - }) - - test('should export application/vnd.myscript.jiix', async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const jiixExpected = h.exports['application/vnd.myscript.jiix'] - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived).toEqual(jiixExpected) - }) - - test('should import text hello', async () => { - await Promise.all([ - page.locator("#importContentField").fill("hello"), - page.locator("#importContent").click(), - getDatasFromExportedEvent(page), - ]) - - const prompterText = await page.waitForSelector('.prompter-text') - const textContent = await prompterText.evaluate((node) => node.textContent) - expect(textContent).toEqual("hello") - }) - - test('should import text pony', async () => { - await Promise.all([ - page.locator("#importContentField").fill("pony"), - page.locator("#importContent").click(), - getDatasFromExportedEvent(page), - ]) - - const prompterText = await page.waitForSelector('.prompter-text') - const textContent = await prompterText.evaluate((node) => node.textContent) - expect(textContent).toEqual("pony") - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-interact.test.js b/test/integration/03-websocket/websocket-text-interact.test.js deleted file mode 100644 index 57c74a6f8..000000000 --- a/test/integration/03-websocket/websocket-text-interact.test.js +++ /dev/null @@ -1,89 +0,0 @@ -const { writePointers, getDatasFromExportedEvent, waitForEditorWebSocket, waitEditorIdle, getExportsTypeFromEditorModel } = require("../helper") -const { paris, tokyo, madrid, rome, buenosAires } = require("../strokesDatas") - - -describe("Websocket Text interact", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_interact.html") - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Interact with your app") - }) - - test(`should ask teh capital of France`, async () => { - const question = await page.locator("#question").textContent() - expect(question).toEqual("What is the capital of France?") - }) - - test(`should answer question capital of France`, async () => { - await writePointers(page, paris.strokes) - await waitEditorIdle(page) - const textExpected = paris.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Italy") - }) - - test(`should answer question capital of Italy`, async () => { - await writePointers(page, rome.strokes) - await waitEditorIdle(page) - const textExpected = rome.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Spain") - }) - - test(`should answer question capital of Spain`, async () => { - await writePointers(page, madrid.strokes) - await waitEditorIdle(page) - const textExpected = madrid.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Argentina") - }) - - test(`should answer question capital of Argentina`, async () => { - await writePointers(page, buenosAires.strokes) - await waitEditorIdle(page) - const textExpected = buenosAires.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Japan") - }) - - test(`should answer question capital of Japan`, async () => { - await writePointers(page, tokyo.strokes) - await waitEditorIdle(page) - const textExpected = tokyo.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-local-storage.test.js b/test/integration/03-websocket/websocket-text-local-storage.test.js deleted file mode 100644 index 4bfbbf2ae..000000000 --- a/test/integration/03-websocket/websocket-text-local-storage.test.js +++ /dev/null @@ -1,41 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, getExportsTypeFromEditorModel, waitEditorIdle } = require("../helper"); -const { helloOneStroke } = require("../strokesDatas"); - -describe("Websocket Text local storage", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_local_storage_text.html"); - }); - - beforeEach(async () => { - await page.reload({ waitUntil: "load" }); - await waitForEditorWebSocket(page); - }); - - test("should have title", async () => { - const title = await page.title(); - expect(title).toMatch("WEBSOCKET Text iink"); - }); - - test("should export text/plain", async () => { - const [exports] = await Promise.all([getDatasFromExportedEvent(page), write(page, helloOneStroke.strokes)]); - //add delay to save text in localstorage - await page.waitForTimeout(400); - const jiixExpected = helloOneStroke.exports["text/plain"][0]; - const jiixReceived = exports["text/plain"]; - await page.locator("#clear-storage").click(); - expect(jiixReceived).toStrictEqual(jiixExpected); - }); - - test("should get hello in localstorage", async () => { - await page.click("#clear-storage"); - await Promise.all([getDatasFromExportedEvent(page), write(page, helloOneStroke.strokes)]); - - await page.reload({ waitUntil: "load" }); - await waitForEditorWebSocket(page); - - const exports = await page.locator(".added-word").textContent(); - expect(exports).toEqual("hello"); - await page.click("#clear-storage"); - }); - require("../_partials/text/nav-actions-text-undo-redo-test"); -}); diff --git a/test/integration/03-websocket/websocket-text-multiple-inputs.test.js b/test/integration/03-websocket/websocket-text-multiple-inputs.test.js deleted file mode 100644 index 21e364eae..000000000 --- a/test/integration/03-websocket/websocket-text-multiple-inputs.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const { waitForEditorWebSocket, writePointers, waitEditorIdle } = require('../helper') -const { centralProcessingUnit, oneThousandNineHundredAndFortyThree, oneThousandNineHundredAndNintyThree } = require('../strokesDatas') - -const switchToOtherQuestion = async (page, inputId) => { - return Promise.all([ - page.locator(`#${inputId}`).click(), - waitEditorIdle(page) - ]) -} - -const getAnswerText = async (page, answerId) => { - return (await page.locator(`#${answerId}`).textContent()).replace(/[\r\n]+/gm, " ").replace(" ", " ").toLocaleLowerCase() -} - -describe('Websocket Text Multiple Inputs', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_multiple_inputs.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Multiple inputs') - }) - - const data0 = { - inputId: "input-0", - answerId: "answer-0", - text: centralProcessingUnit, - } - - test('should answer the first question', async () => { - await writePointers(page, data0.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data0.answerId) - expect(answerText).toEqual(data0.text.exports["text/plain"]) - }) - - test('should validate the first answer', async () => { - expect(await page.locator(`#${data0.answerId}`).getAttribute('class')).not.toContain('success') - await page.click("#validate-answers") - expect(await page.locator(`#${data0.answerId}`).getAttribute('class')).toContain('success') - }) - - const data1 = { - inputId: "input-1", - answerId: "answer-1", - text: oneThousandNineHundredAndFortyThree, - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data1.inputId) - await writePointers(page, data1.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data1.answerId) - expect(answerText).toEqual(data1.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).toContain('success') - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).not.toContain('error') - }) - - const data2 = { - inputId: "input-2", - answerId: "answer-2", - text: oneThousandNineHundredAndFortyThree - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data2.inputId) - await writePointers(page, data2.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data2.answerId) - expect(answerText).toEqual(data2.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).toContain('error') - }) - - const data3 = { - inputId: "input-3", - answerId: "answer-3", - text: oneThousandNineHundredAndNintyThree, - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data3.inputId) - await writePointers(page, data3.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data3.answerId) - expect(answerText).toEqual(data3.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).toContain('success') - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).not.toContain('error') - }) - -}) diff --git a/test/integration/03-websocket/websocket-text-pointer-events.test.js b/test/integration/03-websocket/websocket-text-pointer-events.test.js deleted file mode 100644 index ef0f93a00..000000000 --- a/test/integration/03-websocket/websocket-text-pointer-events.test.js +++ /dev/null @@ -1,38 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require('../helper') -const { h } = require('../strokesDatas') - -describe('Websocket Text Pointer Events', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_pointer_events.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Pointer events') - }) - - test('should export application/vnd.myscript.jiix', async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const jiixExpected = h.exports['application/vnd.myscript.jiix'] - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived).toEqual(jiixExpected) - }) - - test('should import points with button', async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - page.locator('#pointerEvents').click(), - ]) - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived.label).toStrictEqual("A") - }) -}) diff --git a/test/integration/03-websocket/websocket-text.test.js b/test/integration/03-websocket/websocket-text.test.js deleted file mode 100644 index f2ff04f77..000000000 --- a/test/integration/03-websocket/websocket-text.test.js +++ /dev/null @@ -1,200 +0,0 @@ -const { - waitForEditorWebSocket, - write, - getDatasFromExportedEvent, - getExportsTypeFromEditorModel, - getEditorConfiguration, - setEditorConfiguration, - getConversionsFromEditorModel, - waitEditorIdle -} = require("../helper") -const { h, hello, helloOneStroke, helloStrikeStroke } = require("../strokesDatas") - -describe("Websocket Text", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Websocket Text") - }) - - test("should export application/vnd.myscript.jiix", async () => { - const [exports] = await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - const jiixExpected = h.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - const modelExportJiixReceived = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - expect(jiixReceived).toEqual(modelExportJiixReceived) - expect(jiixReceived).toEqual(jiixExpected) - }) - - describe("Gesture", () => { - test("should apply gesture", async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.gesture.enable = true - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - const [firstModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[0]])]) - const firstJiixExport = firstModelExports["application/vnd.myscript.jiix"] - expect(firstJiixExport.label).toEqual(helloStrikeStroke.exports["text/plain"][0]) - - const [secondModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[1]])]) - const secondJiixExport = secondModelExports["application/vnd.myscript.jiix"] - expect(secondJiixExport.label).toEqual("") - }) - - test("should not apply gesture", async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.gesture.enable = false - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - const [firstModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[0]])]) - const firstJiixExport = firstModelExports["application/vnd.myscript.jiix"] - expect(firstJiixExport.label).toEqual(helloStrikeStroke.exports["text/plain"][0]) - - const [secondModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[1]])]) - const secondJiixExport = secondModelExports["application/vnd.myscript.jiix"] - expect(secondJiixExport.label).not.toEqual("") - }) - }) - - describe("SmartGuide", () => { - test("should not display", async () => { - const configuration = await getEditorConfiguration(page) - configuration.rendering.smartGuide.enable = false - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - // wait css animation - await page.waitForTimeout(1000) - expect(await page.locator(".prompter-text").isVisible()).toBe(false) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should display", async () => { - const configuration = await getEditorConfiguration(page) - configuration.rendering.smartGuide.enable = true - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - // wait css animation - await page.waitForTimeout(1000) - expect(await page.locator(".prompter-text").isVisible()).toBe(true) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should display text into", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - const textExpected = h.exports["text/plain"].at(-1) - const textExpectedWithNbsp = textExpected.replace(/\s/g, "\u00A0") - - const prompterText = await page.waitForSelector(".prompter-text") - const textContent = await prompterText.evaluate((node) => node.textContent) - - expect(textExpectedWithNbsp).toEqual(textContent) - }) - - test("should select candidate", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - await waitEditorIdle(page) - const jiixExport = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - expect(await page.innerText(".prompter-text")).toBe(jiixExport.label) - expect(await page.locator(".candidates").isVisible()).toBe(false) - - // wait css animation - await page.waitForTimeout(1000) - await page.click(`.prompter-text > span`) - expect(await page.locator(".candidates").isVisible()).toBe(true) - const candidate = jiixExport.words[0].candidates[2] - - await Promise.all([getDatasFromExportedEvent(page), page.click(`.candidates > span >> text=${candidate}`)]) - - expect(await page.innerText(".prompter-text")).toBe(candidate) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should convert", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, helloOneStroke.strokes)]) - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - const wrotePath = await page.locator("path").first().getAttribute("d") - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - - await Promise.all([getDatasFromExportedEvent(page), page.click(`.more-menu > button >> text=Convert`)]) - - const convert = await getConversionsFromEditorModel(page) - expect(convert).toBeDefined() - - const convertedPath = await page.locator("path").first().getAttribute("d") - expect(wrotePath).not.toEqual(convertedPath) - }) - - test.skip("should Copy", async () => { - await write(page, h.strokes) - await getDatasFromExportedEvent(page) - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - - let pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(1) - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - await page.click(`.more-menu > button >> text=Copy`) - - const clipboardCopy = page.evaluate(`(async () => { return await navigator.clipboard.readText() })()`) - expect(clipboardCopy).toEqual(h.label) - }) - - test("should Delete", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - - let pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(1) - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - - await Promise.all([getDatasFromExportedEvent(page), page.click(`.more-menu > button >> text=Delete`)]) - - // wait for css animation - await page.waitForTimeout(1000) - - pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(0) - }) - }) - - require("../_partials/text/nav-actions-text-clear-test") - require("../_partials/text/nav-actions-text-language-test") - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/_partials/math/nav-actions-math-clear-test.js b/test/integration/_partials/math/nav-actions-math-clear-test.js deleted file mode 100644 index fa08de4df..000000000 --- a/test/integration/_partials/math/nav-actions-math-clear-test.js +++ /dev/null @@ -1,20 +0,0 @@ -const { writePointers, getDatasFromExportedEvent, getEditorModelExportsType } = require("../../helper") -const { sumSimple } = require("../../strokesDatas") - -describe('Nav actions math clear', () => { - test("should clear", async () => { - await Promise.all([getDatasFromExportedEvent(page), writePointers(page, sumSimple.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toBeDefined() - - const [clearExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#clear")]) - const emptyLatex = "" - const LatexReceived = clearExport["application/x-latex"] - expect(LatexReceived).toEqual(emptyLatex) - - resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toBe("") - }) -}) diff --git a/test/integration/_partials/math/nav-actions-math-undo-redo-test.js b/test/integration/_partials/math/nav-actions-math-undo-redo-test.js deleted file mode 100644 index 0298e2df9..000000000 --- a/test/integration/_partials/math/nav-actions-math-undo-redo-test.js +++ /dev/null @@ -1,99 +0,0 @@ -const { - waitForEditorWebSocket, - write, - getDatasFromExportedEvent, - getExportsTypeFromEditorModel, - getEditorConfiguration, - setEditorConfiguration, - getExportsFromEditorModel, - waitEditorIdle -} = require("../../helper"); -const { equation1 } = require("../../strokesDatas"); - -describe("Nav actions math undo/redo", () => { - test('should undo/redo in mode "stroke" by default', async () => { - const config = await getEditorConfiguration(page); - expect(config.recognition.math["undo-redo"].mode).toEqual("stroke"); - - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - let latex; - await write(page, equation1.strokes, 100, 100); - await waitEditorIdle(page); - - const [clearExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#clear")]); - const modelExportCleared = await getExportsFromEditorModel(page); - if (modelExportCleared) { - expect(modelExportCleared["application/x-latex"]).toEqual(""); - expect(clearExport["application/x-latex"]).toEqual(""); - } - - const [undo1Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo1Export["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-1)).toEqual(undo1Export["application/x-latex"]); - - await waitEditorIdle(page); - const [undo2Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo2Export["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-2)).toEqual(undo2Export["application/x-latex"]); - - await waitEditorIdle(page); - const [undo3Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo3Export["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-3)).toEqual(undo3Export["application/x-latex"]); - - await waitEditorIdle(page); - const [redoExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#redo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(redoExport["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-2)).toEqual(redoExport["application/x-latex"]); - }); - - test('should undo/redo in mode "session"', async () => { - const config = await getEditorConfiguration(page); - config.recognition.math.mimeTypes = ["application/x-latex"]; - config.recognition.math["undo-redo"].mode = "session"; - // 5000 = time to write equation1 - config.recognition.math["session-time"] = 5000; - - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config); - await waitForEditorWebSocket(page); - - let latex; - await write(page, equation1.strokes); - await waitEditorIdle(page); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(latex).toEqual(equation1.exports.LATEX.at(-1)); - - const [clearExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#clear")]); - const modelExportCleared = await getExportsFromEditorModel(page); - if (modelExportCleared) { - expect(modelExportCleared["application/x-latex"]).toEqual(""); - expect(clearExport["application/x-latex"]).toEqual(""); - } - - await waitEditorIdle(page); - const [undo1Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo1Export["application/x-latex"]).toEqual(latex); - expect(undo1Export["application/x-latex"]).toEqual(equation1.exports.LATEX.at(-1)); - - await waitEditorIdle(page); - const [undo2Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo2Export["application/x-latex"]).toEqual(latex); - expect(latex).toEqual(""); - - await waitEditorIdle(page); - const [redoExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#redo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(redoExport["application/x-latex"]).toEqual(latex); - expect(redoExport["application/x-latex"]).toEqual(equation1.exports.LATEX.at(-1)); - }); -}); diff --git a/test/integration/_partials/text/nav-actions-text-clear-test.js b/test/integration/_partials/text/nav-actions-text-clear-test.js deleted file mode 100644 index ebabf92b7..000000000 --- a/test/integration/_partials/text/nav-actions-text-clear-test.js +++ /dev/null @@ -1,20 +0,0 @@ -const { writePointers, getDatasFromExportedEvent, getExportsFromEditorModel } = require("../../helper") -const { one } = require("../../strokesDatas") - -describe('Nav actions text clear', () => { - test('should clear', async () => { - const [exportBeforeClear] = await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes, 100) - ]) - expect(exportBeforeClear["application/vnd.myscript.jiix"].label).toStrictEqual("1") - - const [exportAfterClear] = await Promise.all([ - getDatasFromExportedEvent(page), - page.click("#clear") - ]) - const emptyJiix = { "type": "Text", "label": "", "words": [ ], "version": "3", "id": "MainBlock"} - expect(exportAfterClear["application/vnd.myscript.jiix"]).toEqual(emptyJiix) - expect(exportAfterClear["application/vnd.myscript.jiix"].label).toStrictEqual('') - }) -}) diff --git a/test/integration/_partials/text/nav-actions-text-language-test.js b/test/integration/_partials/text/nav-actions-text-language-test.js deleted file mode 100644 index 3edd8c606..000000000 --- a/test/integration/_partials/text/nav-actions-text-language-test.js +++ /dev/null @@ -1,28 +0,0 @@ -const { getDatasFromExportedEvent, write, waitEditorIdle } = require("../../helper") -const { h } = require("../../strokesDatas") - -describe('Nav actions text language', () => { - test('should change language', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - await waitEditorIdle(page) - - let resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - await Promise.all([ - getDatasFromExportedEvent(page), - page.selectOption('#language', 'fr_FR'), - ]) - - await waitEditorIdle(page) - - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) -}) \ No newline at end of file diff --git a/test/integration/_partials/text/nav-actions-text-undo-redo-test.js b/test/integration/_partials/text/nav-actions-text-undo-redo-test.js deleted file mode 100644 index eed3b875a..000000000 --- a/test/integration/_partials/text/nav-actions-text-undo-redo-test.js +++ /dev/null @@ -1,36 +0,0 @@ -const { getExportsFromEditorModel, write } = require("../../helper") -const { hello } = require("../../strokesDatas") - -describe('Nav actions text undo/redo', () => { - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - for(const s of hello.strokes) { - await Promise.all([ - write(page, [s]), - getExportsFromEditorModel(page), - ]) - } - let resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-1)) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length) - - await Promise.all([getExportsFromEditorModel(page), page.click('#undo')]) - resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - - await Promise.all([getExportsFromEditorModel(page), page.click('#undo')]) - resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-3)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 2) - - await Promise.all([getExportsFromEditorModel(page), page.click('#redo')]) - resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - }) -}) \ No newline at end of file diff --git a/test/integration/helper.js b/test/integration/helper.js deleted file mode 100644 index 712b4a113..000000000 --- a/test/integration/helper.js +++ /dev/null @@ -1,246 +0,0 @@ -/** - * @param {Page} page - Playwright Page - * @param {Array} strokes - * @param {Object} strokes[0] - * @param {Array} strokes[0].x - * @param {Number} strokes[0].x[0] - * @param {Array} strokes[0].y - * @param {Number} strokes[0].y[0] - * @param {Array} [strokes[0].t] - * @param {Number} strokes[0].t[0] - * @param {Number} [offsetTop=0] - * @param {Number} [offsetLeft=0] - */ -module.exports.write = async (page, strokes, offsetTop = 0, offsetLeft = 0) => { - - const editorEl = await page.waitForSelector('#editor') - const offsetX = offsetLeft + await editorEl.evaluate((node) => node.offsetLeft) - const offsetY = offsetTop + await editorEl.evaluate((node) => node.offsetTop) - - for (const { x, y, t } of strokes) { - const hasTimeStamp = t && t.length === x.length - await page.mouse.move(offsetX + x[0], offsetY + y[0]) - await page.mouse.down() - - let oldTimestamp = hasTimeStamp ? t[0] : null - for (let p = 0; p < x.length; p++) { - let waitTime = 0 - if (hasTimeStamp) { - waitTime = t[p] - oldTimestamp - oldTimestamp = t[p] - } - await page.waitForTimeout(waitTime) - await page.mouse.move(offsetX + x[p], offsetY + y[p]) - } - await page.mouse.up() - await page.waitForTimeout(500) - } -} - -/** - * @param {Page} page - Playwright Page - * @param {Array} strokes - * @param {Object} strokes[0] - * @param {Array} strokes[0].pointers - * @param {Object} strokes[0].pointers[0] - * @param {Number} strokes[0].pointers[0].x - * @param {Number} strokes[0].pointers[0].y - * @param {Number} strokes[0].pointers[0].t - * @param {Number} strokes[0].pointers[0].p - * @param {Number} [offsetTop=0] - * @param {Number} [offsetLeft=0] - */ -module.exports.writePointers = async (page, strokes, offsetTop = 0, offsetLeft = 0) => { - const editorEl = await page.waitForSelector('#editor') - const boundingBox = await editorEl.evaluate((node) => node.getBoundingClientRect()) - const offsetX = offsetLeft + boundingBox.x - const offsetY = offsetTop + boundingBox.y - for(s of strokes) { - const firstPointer = s.pointers[0] - let oldTimestamp = firstPointer.t - await page.mouse.move(offsetX + firstPointer.x, offsetY + firstPointer.y) - await page.mouse.down() - for(p of s.pointers) { - let waitTime = 0 - waitTime = p.t - oldTimestamp - oldTimestamp = p.t - await page.waitForTimeout(waitTime) - await page.mouse.move(offsetX + p.x, offsetY + p.y) - } - await page.mouse.up() - await page.waitForTimeout(500) - } -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getEditor = async (page) => { - return page.evaluate('editor') -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getEditorConfiguration = async (page) => { - return page.evaluate('editor.configuration') -} - -/** - * @param {Page} page - Playwright Page - * @param {Configuration} configuration - Editor configuration - * @returns Promise - */ -module.exports.setEditorConfiguration = async (page, configuration) => { - return page.evaluate(`editor.configuration = ${JSON.stringify(configuration)};`) -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getExportsFromEditorModel = async (page) => { - return page.evaluate('editor.model.exports') -} -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getConversionsFromEditorModel = async (page) => { - return page.evaluate('editor.model.converts') -} -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getExportsTypeFromEditorModel = async (page, type) => { - return page.evaluate(`editor.model.exports['${type}']`) -} - -const exported = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('exported', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getDatasFromExportedEvent = async (page) => { - return page.evaluate(exported) -} - -const imported = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('imported', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getDatasFromImportedEvent = async (page) => { - return page.evaluate(imported) -} - -const converted = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('converted', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getDatasFromConvertedEvent = async (page) => { - await page.waitForFunction(() => !!window.editor) - return page.evaluate(converted) -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.waitEditorIdle = async (page) => { - await page.waitForFunction(() => !!window.editor) - return page.evaluate("editor.waitForIdle()") -} - -const loaded = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('loaded', (e) => { - resolve(); - }); - }); -})()` -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.waitEditorLoaded = async (page) => { - await page.waitForFunction(() => !!window.editor) - return page.evaluate(loaded) -} - -module.exports.waitForEditorRest = async (page) => { - await Promise.all([ - page.waitForSelector('#ms-rendering-canvas'), - page.waitForSelector('#ms-capture-canvas'), - ]) - return page.evaluate('editor.initializationPromise') -} - -module.exports.waitForEditorWebSocket = async (page) => { - await Promise.all([ - page.waitForSelector('svg[data-layer="CAPTURE"]'), - page.waitForSelector('svg[data-layer="MODEL"]'), - ]) - return page.evaluate('editor.initializationPromise') -} - -function findValuesByKey (obj, key, list = []) { - if (!obj) return list - if (obj instanceof Array) { - Object.keys(obj).forEach((k) => { - list = list.concat(findValuesByKey(obj[k], key, [])) - }) - return list - } - if (obj[key]) { - if (obj[key] instanceof Array) { - Object.keys(obj[key]).forEach((l) => { - list.push(obj[key][l]) - }) - } else { - list.push(obj[key]) - } - } - - if (typeof obj === 'object') { - const children = Object.keys(obj) - if (children.length > 0) { - children.forEach((child) => { - list = list.concat(findValuesByKey(obj[child], key, [])) - }) - } - } - return list -} -module.exports.findValuesByKey = findValuesByKey - -module.exports.haveSameLabels = (jiix1, jiix2) => { - const labels1 = findValuesByKey(jiix1, 'label') - const labels2 = findValuesByKey(jiix2, 'label') - return JSON.stringify(labels1) === JSON.stringify(labels2) -} diff --git a/test/integration/jest.setup.js b/test/integration/jest.setup.js deleted file mode 100644 index 9df84ff26..000000000 --- a/test/integration/jest.setup.js +++ /dev/null @@ -1,6 +0,0 @@ -jest.retryTimes(0) -jest.setTimeout(30 * 1000) - -afterAll(() => { - browser.close() -}) diff --git a/test/integration/strokes/abrausorus.json b/test/integration/strokes/abrausorus.json deleted file mode 100644 index 24dbc17a7..000000000 --- a/test/integration/strokes/abrausorus.json +++ /dev/null @@ -1,69 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 201, 198, 191, 188, 185, 182, 177, 174, 171, 172, 174, 177, 184, 188, 192, 196, 199, 202, 204, 206, 207, 209, 210, 209, 205, 204, 206, 209, 211, - 217, 223, 230, 235, 240, 247, 250, 255, 260, 263, 266, 267, 267, 265, 262, 259, 255, 252, 250, 249, 249, 250, 252, 254, 259, 263, 268, 273, 277, - 283, 288, 293, 298, 302, 303, 303, 303, 300, 297, 294, 291, 290, 292, 297, 300, 303, 307, 311, 314, 319, 323, 324, 324, 319, 316, 321, 326, 331, - 335, 338, 340, 340, 339, 337, 337, 341, 344, 351, 357, 362, 367, 370, 375, 377, 376, 373, 369, 364, 359, 356, 353, 352, 352, 355, 359, 363, 367, - 372, 375, 378, 379, 378, 375, 374, 377, 381, 387, 391, 394, 398, 401, 403, 404, 401, 401, 401, 408, 411, 414, 418, 423, 425, 426, 426, 424, 424, - 426, 429, 434, 438, 442, 448, 452, 455, 456, 455, 457, 463, 467, 471, 474, 474, 470, 467, 471, 475, 486, 493, 498, 502, 506, 504, 499, 495, 494, - 494, 496, 499, 503, 507, 513, 518, 520, 521, 520, 514, 510, 507, 504, 503, 504, 509, 513, 517, 522, 525, 529, 531, 534, 538, 543, 548, 550, 550, - 550, 552, 556, 559, 562, 565, 569, 570, 570, 567, 568, 572, 575, 578, 581, 586, 589, 591, 589, 590, 594, 597, 600, 602, 604, 606, 609, 614, 618, - 621, 623, 624, 621, 617, 614 - ], - "y": [ - 160, 159, 159, 159, 159, 160, 162, 164, 168, 172, 175, 177, 180, 180, 180, 180, 178, 176, 173, 169, 166, 161, 158, 155, 150, 154, 159, 165, 168, - 173, 175, 176, 176, 176, 175, 174, 169, 161, 155, 149, 144, 140, 133, 127, 124, 121, 121, 127, 133, 142, 148, 153, 159, 167, 170, 173, 175, 176, - 177, 177, 175, 171, 165, 161, 157, 154, 152, 151, 150, 150, 153, 156, 157, 157, 156, 154, 152, 152, 151, 147, 144, 141, 140, 142, 143, 143, 144, - 145, 147, 150, 155, 158, 161, 164, 166, 167, 166, 165, 163, 160, 158, 153, 149, 146, 145, 145, 145, 148, 151, 156, 159, 163, 169, 172, 173, 173, - 173, 171, 165, 161, 157, 153, 159, 163, 168, 172, 172, 172, 169, 164, 158, 154, 154, 158, 162, 166, 167, 167, 165, 161, 157, 154, 150, 153, 156, - 163, 167, 169, 170, 170, 167, 164, 159, 154, 149, 153, 157, 161, 165, 170, 177, 180, 177, 172, 169, 165, 162, 160, 159, 155, 152, 152, 157, 162, - 167, 173, 175, 176, 176, 172, 168, 164, 160, 156, 152, 151, 151, 152, 156, 159, 163, 164, 165, 164, 163, 158, 155, 152, 150, 150, 155, 158, 164, - 168, 172, 171, 170, 168, 165, 160, 157, 154, 157, 161, 166, 169, 170, 170, 167, 162, 157, 161, 165, 168, 169, 168, 165, 161, 156, 157, 160, 163, - 165, 168, 172, 174, 175, 175 - ], - "t": [ - 1692198864522, 1692198864757, 1692198864791, 1692198864807, 1692198864824, 1692198864841, 1692198864874, 1692198864907, 1692198864941, - 1692198864974, 1692198864991, 1692198865007, 1692198865024, 1692198865040, 1692198865057, 1692198865074, 1692198865091, 1692198865107, - 1692198865124, 1692198865141, 1692198865158, 1692198865174, 1692198865191, 1692198865208, 1692198865240, 1692198865307, 1692198865325, - 1692198865357, 1692198865374, 1692198865392, 1692198865408, 1692198865424, 1692198865441, 1692198865457, 1692198865474, 1692198865491, - 1692198865524, 1692198865541, 1692198865558, 1692198865574, 1692198865591, 1692198865608, 1692198865624, 1692198865641, 1692198865658, - 1692198865674, 1692198865708, 1692198865741, 1692198865757, 1692198865774, 1692198865791, 1692198865808, 1692198865824, 1692198865841, - 1692198865857, 1692198865875, 1692198865891, 1692198865908, 1692198865924, 1692198865941, 1692198865958, 1692198865976, 1692198865991, - 1692198866008, 1692198866024, 1692198866042, 1692198866058, 1692198866074, 1692198866091, 1692198866125, 1692198866158, 1692198866193, - 1692198866225, 1692198866241, 1692198866258, 1692198866275, 1692198866325, 1692198866358, 1692198866408, 1692198866441, 1692198866458, - 1692198866475, 1692198866508, 1692198866541, 1692198866575, 1692198866592, 1692198866609, 1692198866625, 1692198866641, 1692198866659, - 1692198866692, 1692198866708, 1692198866725, 1692198866742, 1692198866775, 1692198866792, 1692198866808, 1692198866825, 1692198866842, - 1692198866859, 1692198866875, 1692198866892, 1692198866926, 1692198866942, 1692198866959, 1692198866976, 1692198866992, 1692198867009, - 1692198867025, 1692198867042, 1692198867059, 1692198867075, 1692198867092, 1692198867109, 1692198867125, 1692198867142, 1692198867160, - 1692198867176, 1692198867194, 1692198867209, 1692198867225, 1692198867259, 1692198867342, 1692198867359, 1692198867376, 1692198867393, - 1692198867409, 1692198867426, 1692198867443, 1692198867459, 1692198867476, 1692198867493, 1692198867559, 1692198867576, 1692198867593, - 1692198867626, 1692198867642, 1692198867659, 1692198867676, 1692198867692, 1692198867709, 1692198867726, 1692198867759, 1692198867810, - 1692198867826, 1692198867843, 1692198867859, 1692198867876, 1692198867893, 1692198867910, 1692198867926, 1692198867943, 1692198867960, - 1692198867977, 1692198867993, 1692198868060, 1692198868076, 1692198868093, 1692198868110, 1692198868127, 1692198868143, 1692198868177, - 1692198868227, 1692198868260, 1692198868276, 1692198868293, 1692198868310, 1692198868326, 1692198868343, 1692198868376, 1692198868410, - 1692198868444, 1692198868478, 1692198868494, 1692198868510, 1692198868527, 1692198868543, 1692198868560, 1692198868577, 1692198868594, - 1692198868610, 1692198868627, 1692198868643, 1692198868660, 1692198868693, 1692198868710, 1692198868727, 1692198868743, 1692198868777, - 1692198868794, 1692198868810, 1692198868827, 1692198868844, 1692198868861, 1692198868877, 1692198868894, 1692198868993, 1692198869027, - 1692198869111, 1692198869127, 1692198869161, 1692198869177, 1692198869194, 1692198869211, 1692198869244, 1692198869277, 1692198869294, - 1692198869311, 1692198869327, 1692198869344, 1692198869360, 1692198869394, 1692198869461, 1692198869478, 1692198869494, 1692198869511, - 1692198869529, 1692198869545, 1692198869561, 1692198869578, 1692198869595, 1692198869678, 1692198869694, 1692198869711, 1692198869728, - 1692198869745, 1692198869761, 1692198869778, 1692198869795, 1692198869862, 1692198869878, 1692198869895, 1692198869912, 1692198869928, - 1692198869945, 1692198869962, 1692198869978, 1692198869995 - ], - "p": [ - 0.5, 0.82, 0.78, 0.68, 0.68, 0.68, 0.75, 0.7, 0.74, 0.72, 0.7, 0.7, 0.79, 0.71, 0.71, 0.71, 0.7, 0.7, 0.7, 0.73, 0.68, 0.75, 0.68, 0.68, 0.77, - 0.72, 0.75, 0.78, 0.7, 0.8, 0.77, 0.79, 0.74, 0.74, 0.79, 0.68, 0.79, 0.82, 0.78, 0.78, 0.75, 0.71, 0.79, 0.78, 0.72, 0.74, 0.68, 0.77, 0.77, - 0.81, 0.77, 0.75, 0.77, 0.82, 0.74, 0.76, 0.75, 0.72, 0.77, 0.74, 0.75, 0.77, 0.79, 0.72, 0.71, 0.68, 0.7, 0.68, 0.68, 0.68, 0.68, 0.7, 0.75, - 0.68, 0.68, 0.73, 0.73, 0.68, 0.75, 0.76, 0.68, 0.68, 0.75, 0.7, 0.75, 0.74, 0.75, 0.72, 0.7, 0.7, 0.74, 0.68, 0.7, 0.68, 0.73, 0.68, 0.79, - 0.77, 0.75, 0.76, 0.7, 0.79, 0.73, 0.68, 0.68, 0.71, 0.74, 0.76, 0.72, 0.76, 0.68, 0.71, 0.78, 0.74, 0.72, 0.71, 0.74, 0.7, 0.78, 0.72, 0.72, - 0.74, 0.77, 0.74, 0.77, 0.79, 0.71, 0.68, 0.74, 0.76, 0.77, 0.72, 0.68, 0.71, 0.71, 0.8, 0.68, 0.68, 0.73, 0.77, 0.73, 0.68, 0.71, 0.7, 0.68, - 0.79, 0.74, 0.75, 0.72, 0.71, 0.78, 0.74, 0.76, 0.75, 0.75, 0.73, 0.79, 0.76, 0.76, 0.76, 0.78, 0.74, 0.72, 0.77, 0.74, 0.66, 0.79, 0.75, 0.72, - 0.76, 0.7, 0.74, 0.77, 0.75, 0.74, 0.77, 0.7, 0.72, 0.71, 0.79, 0.77, 0.73, 0.72, 0.72, 0.79, 0.72, 0.68, 0.68, 0.72, 0.68, 0.77, 0.72, 0.72, - 0.75, 0.68, 0.77, 0.7, 0.72, 0.73, 0.74, 0.79, 0.7, 0.77, 0.71, 0.73, 0.72, 0.68, 0.7, 0.72, 0.77, 0.68, 0.68, 0.72, 0.72, 0.77, 0.72, 0.68, - 0.68, 0.76, 0.76, 0.75, 0.73, 0.72, 0.74, 0.68, 0.68, 0.7, 0.73, 0.75, 0.68, 0.76, 0.74, 0.7, 0.7, 0.72, 0.7, 0.72, 0.68 - ] - } -] diff --git a/test/integration/strokes/covfefe.json b/test/integration/strokes/covfefe.json deleted file mode 100644 index e38c20e20..000000000 --- a/test/integration/strokes/covfefe.json +++ /dev/null @@ -1,782 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 173, - "y": 216, - "t": 1695827135476, - "p": 0.1 - }, - { - "x": 170, - "y": 216, - "t": 1695827135512, - "p": 0.68 - }, - { - "x": 166, - "y": 216, - "t": 1695827135528, - "p": 0.71 - }, - { - "x": 161, - "y": 218, - "t": 1695827135545, - "p": 0.75 - }, - { - "x": 157, - "y": 220, - "t": 1695827135561, - "p": 0.73 - }, - { - "x": 153, - "y": 223, - "t": 1695827135578, - "p": 0.74 - }, - { - "x": 149, - "y": 226, - "t": 1695827135595, - "p": 0.74 - }, - { - "x": 145, - "y": 229, - "t": 1695827135611, - "p": 0.74 - }, - { - "x": 143, - "y": 233, - "t": 1695827135628, - "p": 0.73 - }, - { - "x": 142, - "y": 238, - "t": 1695827135661, - "p": 0.75 - }, - { - "x": 146, - "y": 241, - "t": 1695827135694, - "p": 0.74 - }, - { - "x": 152, - "y": 242, - "t": 1695827135727, - "p": 0.77 - }, - { - "x": 157, - "y": 242, - "t": 1695827135744, - "p": 0.74 - }, - { - "x": 164, - "y": 243, - "t": 1695827135761, - "p": 0.79 - }, - { - "x": 170, - "y": 243, - "t": 1695827135778, - "p": 0.77 - }, - { - "x": 176, - "y": 243, - "t": 1695827135793, - "p": 0.77 - }, - { - "x": 180, - "y": 243, - "t": 1695827135827, - "p": 0.71 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 188, - "y": 223, - "t": 1695827136162, - "p": 0.1 - }, - { - "x": 184, - "y": 226, - "t": 1695827136178, - "p": 0.74 - }, - { - "x": 181, - "y": 229, - "t": 1695827136194, - "p": 0.72 - }, - { - "x": 180, - "y": 232, - "t": 1695827136211, - "p": 0.68 - }, - { - "x": 181, - "y": 236, - "t": 1695827136244, - "p": 0.72 - }, - { - "x": 185, - "y": 237, - "t": 1695827136260, - "p": 0.72 - }, - { - "x": 191, - "y": 237, - "t": 1695827136277, - "p": 0.77 - }, - { - "x": 200, - "y": 237, - "t": 1695827136294, - "p": 0.81 - }, - { - "x": 209, - "y": 236, - "t": 1695827136311, - "p": 0.81 - }, - { - "x": 216, - "y": 235, - "t": 1695827136328, - "p": 0.79 - }, - { - "x": 219, - "y": 234, - "t": 1695827136344, - "p": 0.68 - }, - { - "x": 222, - "y": 233, - "t": 1695827136361, - "p": 0.68 - }, - { - "x": 217, - "y": 229, - "t": 1695827136394, - "p": 0.77 - }, - { - "x": 207, - "y": 225, - "t": 1695827136410, - "p": 0.67 - }, - { - "x": 198, - "y": 224, - "t": 1695827136428, - "p": 0.81 - }, - { - "x": 194, - "y": 223, - "t": 1695827136444, - "p": 0.72 - }, - { - "x": 191, - "y": 225, - "t": 1695827136560, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 228, - "y": 215, - "t": 1695827136988, - "p": 0.1 - }, - { - "x": 227, - "y": 219, - "t": 1695827137011, - "p": 0.72 - }, - { - "x": 226, - "y": 224, - "t": 1695827137026, - "p": 0.75 - }, - { - "x": 225, - "y": 231, - "t": 1695827137044, - "p": 0.79 - }, - { - "x": 227, - "y": 235, - "t": 1695827137059, - "p": 0.73 - }, - { - "x": 229, - "y": 238, - "t": 1695827137092, - "p": 0.7 - }, - { - "x": 233, - "y": 239, - "t": 1695827137143, - "p": 0.72 - }, - { - "x": 236, - "y": 236, - "t": 1695827137193, - "p": 0.72 - }, - { - "x": 239, - "y": 234, - "t": 1695827137210, - "p": 0.7 - }, - { - "x": 244, - "y": 228, - "t": 1695827137226, - "p": 0.8 - }, - { - "x": 250, - "y": 222, - "t": 1695827137260, - "p": 0.81 - }, - { - "x": 253, - "y": 216, - "t": 1695827137276, - "p": 0.78 - }, - { - "x": 255, - "y": 213, - "t": 1695827137293, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 269, - "y": 248, - "t": 1695827137679, - "p": 0.1 - }, - { - "x": 268, - "y": 243, - "t": 1695827137742, - "p": 0.75 - }, - { - "x": 267, - "y": 233, - "t": 1695827137759, - "p": 0.68 - }, - { - "x": 267, - "y": 227, - "t": 1695827137775, - "p": 0.77 - }, - { - "x": 267, - "y": 222, - "t": 1695827137792, - "p": 0.74 - }, - { - "x": 270, - "y": 216, - "t": 1695827137808, - "p": 0.78 - }, - { - "x": 273, - "y": 210, - "t": 1695827137826, - "p": 0.78 - }, - { - "x": 277, - "y": 206, - "t": 1695827137842, - "p": 0.76 - }, - { - "x": 279, - "y": 203, - "t": 1695827137859, - "p": 0.7 - }, - { - "x": 282, - "y": 201, - "t": 1695827137876, - "p": 0.7 - }, - { - "x": 286, - "y": 198, - "t": 1695827137892, - "p": 0.74 - }, - { - "x": 289, - "y": 196, - "t": 1695827137909, - "p": 0.7 - }, - { - "x": 292, - "y": 195, - "t": 1695827137925, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 274, - "y": 222, - "t": 1695827138250, - "p": 0.1 - }, - { - "x": 278, - "y": 220, - "t": 1695827138326, - "p": 0.73 - }, - { - "x": 282, - "y": 219, - "t": 1695827138343, - "p": 0.72 - }, - { - "x": 286, - "y": 219, - "t": 1695827138359, - "p": 0.71 - }, - { - "x": 289, - "y": 220, - "t": 1695827138376, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 289, - "y": 231, - "t": 1695827138671, - "p": 0.1 - }, - { - "x": 293, - "y": 231, - "t": 1695827138725, - "p": 0.71 - }, - { - "x": 296, - "y": 230, - "t": 1695827138742, - "p": 0.68 - }, - { - "x": 300, - "y": 229, - "t": 1695827138759, - "p": 0.72 - }, - { - "x": 306, - "y": 227, - "t": 1695827138792, - "p": 0.77 - }, - { - "x": 307, - "y": 224, - "t": 1695827138825, - "p": 0.68 - }, - { - "x": 304, - "y": 223, - "t": 1695827138876, - "p": 0.68 - }, - { - "x": 300, - "y": 224, - "t": 1695827138891, - "p": 0.72 - }, - { - "x": 295, - "y": 226, - "t": 1695827138909, - "p": 0.75 - }, - { - "x": 290, - "y": 230, - "t": 1695827138924, - "p": 0.77 - }, - { - "x": 288, - "y": 233, - "t": 1695827138942, - "p": 0.7 - }, - { - "x": 287, - "y": 236, - "t": 1695827138958, - "p": 0.68 - }, - { - "x": 289, - "y": 239, - "t": 1695827138992, - "p": 0.7 - }, - { - "x": 292, - "y": 240, - "t": 1695827139008, - "p": 0.68 - }, - { - "x": 295, - "y": 240, - "t": 1695827139025, - "p": 0.68 - }, - { - "x": 298, - "y": 240, - "t": 1695827139059, - "p": 0.68 - }, - { - "x": 301, - "y": 240, - "t": 1695827139074, - "p": 0.68 - }, - { - "x": 304, - "y": 240, - "t": 1695827139092, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 329, - "y": 242, - "t": 1695827139299, - "p": 0.1 - }, - { - "x": 325, - "y": 239, - "t": 1695827139341, - "p": 0.74 - }, - { - "x": 323, - "y": 236, - "t": 1695827139358, - "p": 0.7 - }, - { - "x": 321, - "y": 232, - "t": 1695827139375, - "p": 0.73 - }, - { - "x": 320, - "y": 228, - "t": 1695827139391, - "p": 0.72 - }, - { - "x": 321, - "y": 224, - "t": 1695827139408, - "p": 0.72 - }, - { - "x": 322, - "y": 220, - "t": 1695827139424, - "p": 0.72 - }, - { - "x": 324, - "y": 216, - "t": 1695827139441, - "p": 0.73 - }, - { - "x": 326, - "y": 212, - "t": 1695827139458, - "p": 0.73 - }, - { - "x": 330, - "y": 208, - "t": 1695827139474, - "p": 0.76 - }, - { - "x": 338, - "y": 201, - "t": 1695827139492, - "p": 0.67 - }, - { - "x": 343, - "y": 198, - "t": 1695827139508, - "p": 0.76 - }, - { - "x": 351, - "y": 192, - "t": 1695827139525, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 330, - "y": 224, - "t": 1695827140057, - "p": 0.1 - }, - { - "x": 325, - "y": 224, - "t": 1695827140123, - "p": 0.74 - }, - { - "x": 326, - "y": 221, - "t": 1695827140207, - "p": 0.68 - }, - { - "x": 330, - "y": 219, - "t": 1695827140241, - "p": 0.73 - }, - { - "x": 335, - "y": 219, - "t": 1695827140258, - "p": 0.74 - }, - { - "x": 338, - "y": 219, - "t": 1695827140273, - "p": 0.68 - }, - { - "x": 341, - "y": 218, - "t": 1695827140291, - "p": 0.68 - }, - { - "x": 344, - "y": 218, - "t": 1695827140307, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 347, - "y": 235, - "t": 1695827140569, - "p": 0.1 - }, - { - "x": 353, - "y": 232, - "t": 1695827140640, - "p": 0.78 - }, - { - "x": 359, - "y": 230, - "t": 1695827140657, - "p": 0.77 - }, - { - "x": 362, - "y": 229, - "t": 1695827140674, - "p": 0.68 - }, - { - "x": 365, - "y": 227, - "t": 1695827140707, - "p": 0.7 - }, - { - "x": 359, - "y": 224, - "t": 1695827140773, - "p": 0.78 - }, - { - "x": 355, - "y": 225, - "t": 1695827140790, - "p": 0.72 - }, - { - "x": 352, - "y": 226, - "t": 1695827140806, - "p": 0.68 - }, - { - "x": 349, - "y": 230, - "t": 1695827140840, - "p": 0.74 - }, - { - "x": 348, - "y": 233, - "t": 1695827140856, - "p": 0.68 - }, - { - "x": 349, - "y": 237, - "t": 1695827140907, - "p": 0.72 - }, - { - "x": 352, - "y": 237, - "t": 1695827140922, - "p": 0.68 - }, - { - "x": 355, - "y": 237, - "t": 1695827140940, - "p": 0.68 - }, - { - "x": 358, - "y": 237, - "t": 1695827140956, - "p": 0.68 - }, - { - "x": 361, - "y": 237, - "t": 1695827140973, - "p": 0.68 - }, - { - "x": 364, - "y": 237, - "t": 1695827140990, - "p": 0.68 - }, - { - "x": 367, - "y": 238, - "t": 1695827141006, - "p": 0.68 - } - ] - } -] diff --git a/test/integration/strokes/equation1.json b/test/integration/strokes/equation1.json deleted file mode 100644 index d23d6813e..000000000 --- a/test/integration/strokes/equation1.json +++ /dev/null @@ -1,402 +0,0 @@ -[ - { - "x": [ - 73, - 74, - 74, - 75, - 75, - 76, - 77, - 82, - 85, - 89, - 93, - 95, - 95, - 95, - 96, - 96, - 96, - 96, - 95, - 94, - 93, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 91, - 87, - 83, - 78, - 73, - 69, - 69, - 69, - 70, - 72, - 77, - 81, - 84, - 90, - 94, - 97, - 101, - 107, - 110, - 113, - 119, - 122 - ], - "y": [ - 168, - 173, - 176, - 179, - 182, - 185, - 188, - 189, - 188, - 185, - 182, - 177, - 173, - 170, - 165, - 161, - 164, - 168, - 172, - 176, - 181, - 188, - 191, - 198, - 205, - 214, - 224, - 233, - 240, - 244, - 249, - 252, - 252, - 250, - 246, - 242, - 238, - 234, - 231, - 228, - 223, - 220, - 219, - 217, - 214, - 213, - 211, - 209, - 208, - 206, - 202, - 201 - ] - }, - { - "x": [ - 176, - 184, - 189, - 195, - 199 - ], - "y": [ - 171, - 170, - 168, - 167, - 166 - ] - }, - { - "x": [ - 170, - 176, - 185, - 194, - 199, - 202, - 205, - 211, - 214 - ], - "y": [ - 189, - 189, - 189, - 188, - 187, - 187, - 187, - 187, - 187 - ] - }, - { - "x": [ - 270, - 276, - 279, - 282, - 285, - 286, - 286, - 286, - 286, - 283, - 278, - 274, - 271, - 267, - 271, - 274, - 276, - 277, - 278, - 278, - 272, - 269, - 265, - 262, - 259, - 255 - ], - "y": [ - 145, - 145, - 145, - 146, - 149, - 152, - 156, - 161, - 164, - 167, - 168, - 169, - 170, - 170, - 170, - 172, - 175, - 178, - 181, - 184, - 187, - 189, - 191, - 191, - 192, - 192 - ] - }, - { - "x": [ - 311, - 314, - 317, - 321, - 324, - 327, - 331, - 335, - 337, - 337, - 337, - 334, - 331, - 326, - 323, - 320, - 315 - ], - "y": [ - 180, - 175, - 171, - 168, - 167, - 167, - 168, - 171, - 174, - 177, - 181, - 183, - 185, - 186, - 186, - 187, - 187 - ] - }, - { - "x": [ - 349, - 344, - 341, - 338, - 336, - 335, - 335, - 337, - 340, - 343, - 347, - 351, - 354, - 357 - ], - "y": [ - 170, - 170, - 170, - 172, - 175, - 178, - 181, - 184, - 185, - 186, - 186, - 186, - 186, - 186 - ] - }, - { - "x": [ - 381, - 386, - 393, - 400, - 403, - 407, - 410, - 415, - 419 - ], - "y": [ - 181, - 181, - 181, - 181, - 180, - 180, - 180, - 180, - 180 - ] - }, - { - "x": [ - 402, - 401, - 401, - 401, - 401, - 401, - 401, - 401 - ], - "y": [ - 169, - 175, - 178, - 181, - 186, - 190, - 193, - 196 - ] - }, - { - "x": [ - 461, - 457, - 456, - 455, - 455, - 461, - 465, - 469, - 473, - 476, - 478, - 479, - 480, - 481, - 481, - 481, - 480, - 478, - 476, - 473, - 470, - 465, - 460, - 457, - 455, - 462, - 470, - 476, - 480, - 485, - 491, - 495, - 498 - ], - "y": [ - 165, - 160, - 157, - 152, - 149, - 147, - 147, - 147, - 147, - 147, - 150, - 154, - 158, - 162, - 165, - 168, - 171, - 174, - 177, - 181, - 184, - 184, - 186, - 187, - 191, - 193, - 193, - 193, - 193, - 193, - 193, - 193, - 193 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/equation2.json b/test/integration/strokes/equation2.json deleted file mode 100644 index 119692948..000000000 --- a/test/integration/strokes/equation2.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "x": [ - 73, 74, 74, 75, 75, 76, 77, 82, 85, 89, 93, 95, 95, 95, 96, 96, 96, 96, - 95, 94, 93, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 87, 83, 78, 73, 69, - 69, 69, 70, 72, 77, 81, 84, 90, 94, 97, 101, 107, 110, 113, 119, 122 - ], - "y": [ - 168, 173, 176, 179, 182, 185, 188, 189, 188, 185, 182, 177, 173, 170, 165, - 161, 164, 168, 172, 176, 181, 188, 191, 198, 205, 214, 224, 233, 240, 244, - 249, 252, 252, 250, 246, 242, 238, 234, 231, 228, 223, 220, 219, 217, 214, - 213, 211, 209, 208, 206, 202, 201 - ] - }, - { - "x": [176, 184, 189, 195, 199], - "y": [171, 170, 168, 167, 166] - }, - { - "x": [170, 176, 185, 194, 199, 202, 205, 211, 214], - "y": [189, 189, 189, 188, 187, 187, 187, 187, 187] - }, - { - "x": [ - 270, 276, 279, 282, 285, 286, 286, 286, 286, 283, 278, 274, 271, 267, 271, - 274, 276, 277, 278, 278, 272, 269, 265, 262, 259, 255 - ], - "y": [ - 145, 145, 145, 146, 149, 152, 156, 161, 164, 167, 168, 169, 170, 170, 170, - 172, 175, 178, 181, 184, 187, 189, 191, 191, 192, 192 - ] - }, - { - "x": [ - 311, 314, 317, 321, 324, 327, 331, 335, 337, 337, 337, 334, 331, 326, 323, - 320, 315 - ], - "y": [ - 180, 175, 171, 168, 167, 167, 168, 171, 174, 177, 181, 183, 185, 186, 186, - 187, 187 - ] - }, - { - "x": [349, 344, 341, 338, 336, 335, 335, 337, 340, 343, 347, 351, 354, 357], - "y": [170, 170, 170, 172, 175, 178, 181, 184, 185, 186, 186, 186, 186, 186] - }, - { - "x": [381, 386, 393, 400, 403, 407, 410, 415, 419], - "y": [181, 181, 181, 181, 180, 180, 180, 180, 180] - }, - { - "x": [402, 401, 401, 401, 401, 401, 401, 401], - "y": [169, 175, 178, 181, 186, 190, 193, 196] - }, - { - "x": [ - 461, 457, 456, 455, 455, 461, 465, 469, 473, 476, 478, 479, 480, 481, 481, - 481, 480, 478, 476, 473, 470, 465, 460, 457, 455, 462, 470, 476, 480, 485, - 491, 495, 498 - ], - "y": [ - 165, 160, 157, 152, 149, 147, 147, 147, 147, 147, 150, 154, 158, 162, 165, - 168, 171, 174, 177, 181, 184, 184, 186, 187, 191, 193, 193, 193, 193, 193, - 193, 193, 193 - ] - } -] diff --git a/test/integration/strokes/fence.json b/test/integration/strokes/fence.json deleted file mode 100644 index 4d8150690..000000000 --- a/test/integration/strokes/fence.json +++ /dev/null @@ -1,466 +0,0 @@ -[ - { - "x": [ - 234, - 237, - 238, - 239, - 242, - 244, - 246, - 247, - 249, - 250, - 252, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 254, - 255, - 257, - 258, - 258, - 262, - 266, - 273, - 283, - 297, - 313, - 325, - 338, - 345, - 349, - 353 - ], - "y": [ - 90, - 94, - 98, - 103, - 110, - 114, - 118, - 122, - 125, - 128, - 131, - 127, - 123, - 119, - 114, - 109, - 105, - 101, - 98, - 95, - 91, - 87, - 82, - 77, - 71, - 68, - 65, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64 - ] - }, - { - "x": [ - 297, - 301, - 305, - 310, - 313, - 317, - 322, - 324, - 324, - 324, - 322, - 319, - 315, - 311, - 314, - 318, - 322, - 326, - 326, - 326, - 322, - 317, - 312, - 307, - 302, - 298, - 294, - 290 - ], - "y": [ - 82, - 82, - 82, - 81, - 81, - 82, - 83, - 86, - 89, - 93, - 96, - 98, - 98, - 98, - 100, - 102, - 105, - 107, - 110, - 113, - 114, - 117, - 118, - 119, - 121, - 121, - 121, - 120 - ] - }, - { - "x": [ - 250, - 250, - 253, - 255, - 258, - 260, - 263, - 266, - 268, - 270, - 273, - 274, - 277, - 277, - 277, - 277, - 277, - 278, - 279, - 280, - 280, - 280, - 280, - 286, - 294, - 302, - 312, - 326, - 344, - 365, - 385, - 401, - 413, - 416 - ], - "y": [ - 198, - 202, - 209, - 215, - 222, - 229, - 237, - 243, - 250, - 256, - 262, - 265, - 260, - 254, - 246, - 236, - 223, - 208, - 198, - 194, - 189, - 185, - 182, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181 - ] - }, - { - "x": [ - 361, - 358, - 353, - 349, - 346, - 342, - 336, - 334, - 330, - 328, - 326, - 324, - 323, - 323, - 323, - 323, - 323, - 326, - 327, - 330, - 334, - 337, - 341, - 345, - 348, - 350, - 350, - 347, - 343, - 340, - 332, - 327, - 324, - 319 - ], - "y": [ - 212, - 210, - 209, - 208, - 208, - 208, - 211, - 214, - 218, - 221, - 225, - 230, - 234, - 242, - 247, - 254, - 258, - 264, - 267, - 269, - 270, - 270, - 268, - 266, - 262, - 259, - 254, - 253, - 251, - 250, - 248, - 248, - 248, - 248 - ] - }, - { - "x": [ - 229, - 226, - 223, - 220, - 216, - 213, - 210, - 206, - 205, - 202, - 201, - 200, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 198, - 196, - 194, - 190, - 186, - 182, - 176, - 169, - 163, - 156, - 151, - 146, - 143, - 139, - 136, - 134, - 133, - 133, - 135, - 138, - 142, - 146, - 150, - 151, - 154, - 156, - 157, - 157, - 157, - 157, - 157, - 157, - 157, - 154, - 151, - 148, - 145, - 140, - 135, - 134, - 134, - 134, - 134, - 135, - 136, - 136, - 138, - 144, - 151, - 162, - 174, - 183, - 193, - 202, - 214, - 222, - 228, - 233, - 236, - 241, - 244 - ], - "y": [ - 35, - 34, - 33, - 33, - 33, - 33, - 33, - 35, - 38, - 41, - 45, - 48, - 54, - 64, - 76, - 87, - 98, - 107, - 116, - 130, - 142, - 155, - 171, - 186, - 202, - 219, - 236, - 252, - 268, - 278, - 288, - 295, - 297, - 295, - 293, - 291, - 289, - 286, - 283, - 278, - 275, - 275, - 277, - 283, - 288, - 294, - 302, - 312, - 317, - 321, - 326, - 331, - 337, - 342, - 350, - 358, - 370, - 385, - 402, - 432, - 453, - 470, - 487, - 503, - 515, - 528, - 532, - 535, - 538, - 539, - 540, - 540, - 540, - 540, - 540, - 539, - 537, - 535, - 532, - 530, - 527, - 525, - 522 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/h.json b/test/integration/strokes/h.json deleted file mode 100644 index 6ce8f758d..000000000 --- a/test/integration/strokes/h.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "x": [ - 397, 400, 404, 408, 411, 414, 417, 418, 418, 419, 419, 418, 414, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 413, 417, - 418, 419, 419, 421, 425, 426 - ], - "y": [ - 254, 249, 247, 242, 240, 235, 231, 227, 224, 220, 216, 211, 210, 213, 217, 221, 226, 230, 234, 238, 243, 247, 251, 255, 252, 248, 244, 241, 240, - 243, 247, 251, 254, 253, 250 - ] - } -] diff --git a/test/integration/strokes/hello.json b/test/integration/strokes/hello.json deleted file mode 100644 index 02810bbfc..000000000 --- a/test/integration/strokes/hello.json +++ /dev/null @@ -1,264 +0,0 @@ -[ - { - "x": [ - 397, - 400, - 404, - 408, - 411, - 414, - 417, - 418, - 418, - 419, - 419, - 418, - 414, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 413, - 417, - 418, - 419, - 419, - 421, - 425, - 426 - ], - "y": [ - 254, - 249, - 247, - 242, - 240, - 235, - 231, - 227, - 224, - 220, - 216, - 211, - 210, - 213, - 217, - 221, - 226, - 230, - 234, - 238, - 243, - 247, - 251, - 255, - 252, - 248, - 244, - 241, - 240, - 243, - 247, - 251, - 254, - 253, - 250 - ] - }, - { - "x": [ - 427, - 433, - 437, - 440, - 439, - 435, - 430, - 428, - 428, - 429, - 432, - 436, - 440, - 443 - ], - "y": [ - 244, - 248, - 245, - 242, - 238, - 238, - 240, - 245, - 249, - 253, - 253, - 253, - 251, - 251 - ] - }, - { - "x": [ - 443, - 450, - 453, - 456, - 459, - 460, - 461, - 461, - 461, - 460, - 456, - 452, - 450, - 450, - 450, - 450, - 450, - 450, - 450, - 450, - 449, - 449, - 451, - 455, - 460, - 463, - 464 - ], - "y": [ - 242, - 242, - 242, - 238, - 236, - 233, - 230, - 226, - 222, - 217, - 214, - 214, - 219, - 223, - 227, - 231, - 234, - 238, - 242, - 246, - 249, - 253, - 257, - 257, - 255, - 252, - 249 - ] - }, - { - "x": [ - 464, - 466, - 469, - 471, - 472, - 474, - 475, - 473, - 469, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 466, - 467, - 470, - 474, - 480, - 482 - ], - "y": [ - 243, - 236, - 234, - 230, - 227, - 223, - 219, - 216, - 215, - 216, - 220, - 225, - 229, - 233, - 237, - 240, - 244, - 248, - 252, - 255, - 256, - 254, - 250, - 247 - ] - }, - { - "x": [ - 489, - 483, - 482, - 482, - 482, - 485, - 489, - 494, - 495, - 495, - 492, - 490, - 494, - 497, - 501, - 504 - ], - "y": [ - 238, - 242, - 245, - 249, - 253, - 254, - 252, - 248, - 244, - 239, - 238, - 242, - 242, - 239, - 238, - 236 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/helloHowAreYou.json b/test/integration/strokes/helloHowAreYou.json deleted file mode 100644 index 622f263d4..000000000 --- a/test/integration/strokes/helloHowAreYou.json +++ /dev/null @@ -1,762 +0,0 @@ -[ - { - "x": [ - 306, - 311, - 315, - 320, - 323, - 326, - 330, - 331, - 332, - 334, - 335, - 335, - 335, - 331, - 327, - 326, - 326, - 326, - 326, - 326, - 326, - 327, - 328, - 328, - 329, - 329, - 330, - 330, - 331, - 331, - 331, - 332, - 334, - 338, - 340, - 340, - 341, - 345, - 348, - 352, - 357, - 360, - 363, - 364, - 363, - 359, - 356, - 353, - 353, - 353, - 358, - 363, - 367, - 371, - 376, - 379, - 382, - 383, - 384, - 386, - 386, - 386, - 386, - 386, - 383, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 379, - 383, - 388, - 391, - 393, - 396, - 399, - 401, - 402, - 402, - 402, - 402, - 402, - 399, - 396, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 395, - 399, - 402, - 404, - 407, - 410, - 412, - 414, - 411, - 410, - 410, - 411, - 415, - 418, - 421, - 424, - 425, - 426, - 426, - 422, - 418, - 416, - 419, - 423, - 428, - 432, - 436, - 440 - ], - "y": [ - 255, - 257, - 254, - 250, - 246, - 241, - 235, - 232, - 228, - 224, - 220, - 216, - 212, - 210, - 214, - 217, - 221, - 225, - 228, - 231, - 234, - 237, - 242, - 246, - 250, - 253, - 258, - 262, - 259, - 256, - 252, - 248, - 243, - 243, - 247, - 251, - 256, - 258, - 257, - 255, - 252, - 248, - 245, - 241, - 238, - 240, - 242, - 246, - 249, - 253, - 254, - 254, - 254, - 254, - 252, - 248, - 242, - 238, - 234, - 229, - 226, - 223, - 219, - 215, - 213, - 215, - 218, - 223, - 228, - 232, - 235, - 238, - 242, - 247, - 251, - 251, - 252, - 249, - 246, - 244, - 239, - 234, - 230, - 226, - 222, - 219, - 216, - 212, - 212, - 215, - 220, - 224, - 228, - 232, - 235, - 239, - 243, - 247, - 250, - 254, - 258, - 258, - 258, - 255, - 253, - 249, - 246, - 242, - 242, - 246, - 249, - 253, - 253, - 253, - 253, - 252, - 249, - 245, - 240, - 236, - 236, - 241, - 242, - 242, - 242, - 242, - 240, - 240 - ] - }, - { - "x": [ - 483, - 489, - 493, - 496, - 500, - 503, - 506, - 508, - 511, - 511, - 511, - 508, - 504, - 502, - 502, - 502, - 502, - 502, - 502, - 502, - 503, - 503, - 503, - 503, - 503, - 504, - 509, - 511, - 512, - 512, - 515, - 520, - 523, - 524, - 525, - 526, - 526, - 526, - 526, - 530, - 534, - 538, - 540, - 540, - 539, - 536, - 533, - 528, - 525, - 524, - 527, - 530, - 533, - 537, - 541, - 546, - 550, - 554, - 552, - 552, - 552, - 552, - 552, - 554, - 557, - 560, - 563, - 564, - 564, - 564, - 564, - 564, - 564, - 564, - 564, - 567, - 571, - 576, - 580, - 582, - 582, - 582, - 582, - 579, - 580, - 585, - 588 - ], - "y": [ - 240, - 240, - 240, - 240, - 240, - 238, - 233, - 230, - 224, - 221, - 217, - 215, - 216, - 221, - 226, - 229, - 232, - 236, - 240, - 243, - 248, - 252, - 256, - 253, - 249, - 244, - 243, - 247, - 251, - 254, - 256, - 257, - 254, - 251, - 248, - 244, - 248, - 252, - 255, - 257, - 257, - 254, - 249, - 245, - 242, - 239, - 237, - 237, - 240, - 244, - 244, - 243, - 243, - 242, - 242, - 242, - 239, - 236, - 241, - 244, - 247, - 251, - 254, - 258, - 255, - 254, - 249, - 245, - 242, - 239, - 235, - 238, - 241, - 245, - 249, - 253, - 254, - 256, - 252, - 248, - 245, - 242, - 237, - 235, - 238, - 238, - 238 - ] - }, - { - "x": [ - 661, - 656, - 654, - 654, - 654, - 655, - 658, - 661, - 665, - 669, - 672, - 675, - 675, - 674, - 670, - 666, - 662, - 659, - 655, - 655 - ], - "y": [ - 234, - 234, - 238, - 241, - 245, - 249, - 254, - 254, - 254, - 252, - 249, - 245, - 241, - 238, - 234, - 232, - 232, - 232, - 236, - 239 - ] - }, - { - "x": [ - 677, - 677, - 677, - 677, - 680, - 684, - 688, - 693, - 694, - 694, - 695, - 694, - 697, - 701, - 704, - 707, - 710, - 710, - 710, - 710, - 712, - 716, - 719, - 722, - 725, - 730, - 732, - 735, - 735, - 733, - 729, - 725, - 725, - 725, - 725, - 733, - 740, - 743, - 750, - 753, - 759, - 763, - 770, - 774 - ], - "y": [ - 236, - 242, - 246, - 251, - 253, - 254, - 254, - 252, - 248, - 244, - 241, - 238, - 233, - 233, - 233, - 232, - 234, - 237, - 241, - 245, - 248, - 249, - 249, - 249, - 249, - 246, - 243, - 241, - 237, - 232, - 231, - 237, - 241, - 245, - 248, - 254, - 256, - 256, - 255, - 253, - 250, - 250, - 250, - 250 - ] - }, - { - "x": [ - 829, - 829, - 830, - 832, - 837, - 841, - 844, - 847, - 848, - 846, - 846, - 846, - 848, - 850, - 851, - 851, - 852, - 853, - 853, - 853, - 850, - 845, - 841, - 841, - 843, - 845, - 848, - 852, - 854, - 858, - 863, - 866, - 868, - 864, - 864, - 864, - 865, - 868, - 871, - 871, - 873, - 874, - 871, - 867, - 867, - 871, - 875, - 880, - 884, - 885, - 884, - 884, - 886, - 889, - 891, - 894, - 895, - 897, - 897, - 897, - 897, - 899, - 903, - 908, - 913 - ], - "y": [ - 231, - 241, - 246, - 249, - 249, - 245, - 240, - 237, - 232, - 237, - 243, - 249, - 254, - 260, - 263, - 267, - 271, - 274, - 277, - 282, - 284, - 281, - 278, - 273, - 269, - 263, - 259, - 255, - 251, - 248, - 243, - 241, - 238, - 238, - 243, - 246, - 250, - 252, - 250, - 247, - 244, - 239, - 235, - 236, - 239, - 240, - 239, - 238, - 236, - 240, - 244, - 247, - 252, - 251, - 248, - 244, - 241, - 237, - 241, - 244, - 251, - 255, - 260, - 259, - 256 - ] - }, - { - "x": [ - 951, - 948, - 948, - 949, - 952, - 956, - 960, - 963, - 963, - 961, - 959, - 954, - 953, - 953 - ], - "y": [ - 233, - 228, - 225, - 221, - 217, - 217, - 217, - 222, - 226, - 230, - 233, - 237, - 240, - 244 - ] - }, - { - "x": [ - 955 - ], - "y": [ - 255 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/helloOneStroke.json b/test/integration/strokes/helloOneStroke.json deleted file mode 100644 index 761ac9bbc..000000000 --- a/test/integration/strokes/helloOneStroke.json +++ /dev/null @@ -1,442 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 335, - 340, - 352, - 359, - 366, - 368, - 367, - 363, - 359, - 356, - 352, - 349, - 345, - 341, - 340, - 341, - 341, - 341, - 342, - 342, - 344, - 342, - 342, - 343, - 345, - 346, - 349, - 351, - 357, - 359, - 360, - 360, - 360, - 363, - 366, - 372, - 376, - 380, - 383, - 382, - 378, - 375, - 372, - 372, - 371, - 372, - 375, - 380, - 383, - 390, - 396, - 400, - 403, - 405, - 403, - 400, - 398, - 395, - 393, - 392, - 392, - 392, - 393, - 395, - 399, - 402, - 408, - 412, - 417, - 421, - 423, - 424, - 422, - 420, - 417, - 414, - 412, - 409, - 409, - 410, - 413, - 414, - 416, - 417, - 417, - 419, - 422, - 425, - 430, - 434, - 437, - 438, - 437, - 436, - 440, - 443, - 446, - 442, - 439, - 436, - 433, - 437, - 441, - 448, - 452, - 455, - 458 - ], - "y": [ - 229, - 224, - 216, - 210, - 204, - 196, - 191, - 187, - 184, - 184, - 187, - 193, - 202, - 211, - 218, - 223, - 226, - 231, - 234, - 238, - 242, - 239, - 234, - 231, - 228, - 225, - 222, - 219, - 223, - 226, - 232, - 237, - 241, - 243, - 242, - 238, - 236, - 232, - 228, - 224, - 224, - 225, - 229, - 232, - 235, - 238, - 240, - 242, - 242, - 240, - 237, - 232, - 227, - 218, - 213, - 204, - 200, - 199, - 207, - 212, - 220, - 229, - 238, - 241, - 243, - 243, - 241, - 238, - 234, - 231, - 226, - 222, - 216, - 213, - 211, - 209, - 206, - 205, - 212, - 217, - 222, - 228, - 232, - 236, - 239, - 242, - 243, - 242, - 242, - 241, - 239, - 236, - 233, - 236, - 239, - 239, - 238, - 234, - 231, - 230, - 230, - 226, - 226, - 226, - 226, - 227, - 226 - ], - "t": [ - 1689715440342, - 1689715440389, - 1689715440405, - 1689715440421, - 1689715440438, - 1689715440455, - 1689715440471, - 1689715440488, - 1689715440505, - 1689715440521, - 1689715440574, - 1689715440588, - 1689715440605, - 1689715440621, - 1689715440638, - 1689715440655, - 1689715440671, - 1689715440687, - 1689715440704, - 1689715440738, - 1689715441024, - 1689715441154, - 1689715441170, - 1689715441204, - 1689715441237, - 1689715441254, - 1689715441271, - 1689715441304, - 1689715441403, - 1689715441437, - 1689715441454, - 1689715441471, - 1689715441487, - 1689715441520, - 1689715441620, - 1689715441636, - 1689715441654, - 1689715441671, - 1689715441686, - 1689715441721, - 1689715441753, - 1689715441770, - 1689715441820, - 1689715441836, - 1689715441853, - 1689715441870, - 1689715441887, - 1689715441903, - 1689715441920, - 1689715441953, - 1689715441970, - 1689715441986, - 1689715442003, - 1689715442020, - 1689715442037, - 1689715442053, - 1689715442069, - 1689715442170, - 1689715442187, - 1689715442203, - 1689715442219, - 1689715442237, - 1689715442253, - 1689715442269, - 1689715442353, - 1689715442370, - 1689715442402, - 1689715442419, - 1689715442436, - 1689715442453, - 1689715442469, - 1689715442486, - 1689715442503, - 1689715442519, - 1689715442536, - 1689715442553, - 1689715442587, - 1689715442669, - 1689715442686, - 1689715442702, - 1689715442719, - 1689715442736, - 1689715442752, - 1689715442769, - 1689715442786, - 1689715442819, - 1689715442869, - 1689715442902, - 1689715442919, - 1689715442936, - 1689715442969, - 1689715443002, - 1689715443052, - 1689715443145, - 1689715443185, - 1689715443202, - 1689715443219, - 1689715443335, - 1689715443352, - 1689715443368, - 1689715443385, - 1689715443535, - 1689715443552, - 1689715443569, - 1689715443585, - 1689715443602, - 1689715443685 - ], - "p": [ - 0.5, - 0.73, - 0.66, - 0.81, - 0.81, - 0.8, - 0.75, - 0.76, - 0.74, - 0.68, - 0.74, - 0.78, - 0.82, - 0.82, - 0.79, - 0.75, - 0.68, - 0.74, - 0.68, - 0.71, - 0.73, - 0.7, - 0.74, - 0.68, - 0.7, - 0.68, - 0.72, - 0.7, - 0.79, - 0.7, - 0.77, - 0.74, - 0.71, - 0.7, - 0.68, - 0.79, - 0.73, - 0.76, - 0.74, - 0.72, - 0.71, - 0.68, - 0.74, - 0.68, - 0.68, - 0.68, - 0.7, - 0.75, - 0.68, - 0.79, - 0.78, - 0.77, - 0.76, - 0.81, - 0.75, - 0.82, - 0.73, - 0.68, - 0.8, - 0.75, - 0.8, - 0.81, - 0.81, - 0.7, - 0.73, - 0.68, - 0.77, - 0.74, - 0.77, - 0.74, - 0.75, - 0.72, - 0.77, - 0.7, - 0.7, - 0.7, - 0.7, - 0.68, - 0.78, - 0.75, - 0.76, - 0.77, - 0.73, - 0.72, - 0.68, - 0.7, - 0.68, - 0.68, - 0.74, - 0.72, - 0.7, - 0.68, - 0.68, - 0.68, - 0.74, - 0.68, - 0.68, - 0.76, - 0.72, - 0.68, - 0.68, - 0.76, - 0.71, - 0.78, - 0.71, - 0.68, - 0.68 - ] - } -] diff --git a/test/integration/strokes/helloOneStrokeSurrounded.json b/test/integration/strokes/helloOneStrokeSurrounded.json deleted file mode 100644 index e8e3d0a5d..000000000 --- a/test/integration/strokes/helloOneStrokeSurrounded.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "x": [ - 335, 340, 352, 359, 366, 368, 367, 363, 359, 356, 352, 349, 345, 341, 340, 341, 341, 341, 342, 342, 344, 342, 342, 343, 345, 346, 349, 351, 357, - 359, 360, 360, 360, 363, 366, 372, 376, 380, 383, 382, 378, 375, 372, 372, 371, 372, 375, 380, 383, 390, 396, 400, 403, 405, 403, 400, 398, 395, - 393, 392, 392, 392, 393, 395, 399, 402, 408, 412, 417, 421, 423, 424, 422, 420, 417, 414, 412, 409, 409, 410, 413, 414, 416, 417, 417, 419, 422, - 425, 430, 434, 437, 438, 437, 436, 440, 443, 446, 442, 439, 436, 433, 437, 441, 448, 452, 455, 458 - ], - "y": [ - 229, 224, 216, 210, 204, 196, 191, 187, 184, 184, 187, 193, 202, 211, 218, 223, 226, 231, 234, 238, 242, 239, 234, 231, 228, 225, 222, 219, 223, - 226, 232, 237, 241, 243, 242, 238, 236, 232, 228, 224, 224, 225, 229, 232, 235, 238, 240, 242, 242, 240, 237, 232, 227, 218, 213, 204, 200, 199, - 207, 212, 220, 229, 238, 241, 243, 243, 241, 238, 234, 231, 226, 222, 216, 213, 211, 209, 206, 205, 212, 217, 222, 228, 232, 236, 239, 242, 243, - 242, 242, 241, 239, 236, 233, 236, 239, 239, 238, 234, 231, 230, 230, 226, 226, 226, 226, 227, 226 - ], - "t": [ - 1689715440342, 1689715440389, 1689715440405, 1689715440421, 1689715440438, 1689715440455, 1689715440471, 1689715440488, 1689715440505, - 1689715440521, 1689715440574, 1689715440588, 1689715440605, 1689715440621, 1689715440638, 1689715440655, 1689715440671, 1689715440687, - 1689715440704, 1689715440738, 1689715441024, 1689715441154, 1689715441170, 1689715441204, 1689715441237, 1689715441254, 1689715441271, - 1689715441304, 1689715441403, 1689715441437, 1689715441454, 1689715441471, 1689715441487, 1689715441520, 1689715441620, 1689715441636, - 1689715441654, 1689715441671, 1689715441686, 1689715441721, 1689715441753, 1689715441770, 1689715441820, 1689715441836, 1689715441853, - 1689715441870, 1689715441887, 1689715441903, 1689715441920, 1689715441953, 1689715441970, 1689715441986, 1689715442003, 1689715442020, - 1689715442037, 1689715442053, 1689715442069, 1689715442170, 1689715442187, 1689715442203, 1689715442219, 1689715442237, 1689715442253, - 1689715442269, 1689715442353, 1689715442370, 1689715442402, 1689715442419, 1689715442436, 1689715442453, 1689715442469, 1689715442486, - 1689715442503, 1689715442519, 1689715442536, 1689715442553, 1689715442587, 1689715442669, 1689715442686, 1689715442702, 1689715442719, - 1689715442736, 1689715442752, 1689715442769, 1689715442786, 1689715442819, 1689715442869, 1689715442902, 1689715442919, 1689715442936, - 1689715442969, 1689715443002, 1689715443052, 1689715443145, 1689715443185, 1689715443202, 1689715443219, 1689715443335, 1689715443352, - 1689715443368, 1689715443385, 1689715443535, 1689715443552, 1689715443569, 1689715443585, 1689715443602, 1689715443685 - ], - "p": [ - 0.5, 0.73, 0.66, 0.81, 0.81, 0.8, 0.75, 0.76, 0.74, 0.68, 0.74, 0.78, 0.82, 0.82, 0.79, 0.75, 0.68, 0.74, 0.68, 0.71, 0.73, 0.7, 0.74, 0.68, - 0.7, 0.68, 0.72, 0.7, 0.79, 0.7, 0.77, 0.74, 0.71, 0.7, 0.68, 0.79, 0.73, 0.76, 0.74, 0.72, 0.71, 0.68, 0.74, 0.68, 0.68, 0.68, 0.7, 0.75, 0.68, - 0.79, 0.78, 0.77, 0.76, 0.81, 0.75, 0.82, 0.73, 0.68, 0.8, 0.75, 0.8, 0.81, 0.81, 0.7, 0.73, 0.68, 0.77, 0.74, 0.77, 0.74, 0.75, 0.72, 0.77, - 0.7, 0.7, 0.7, 0.7, 0.68, 0.78, 0.75, 0.76, 0.77, 0.73, 0.72, 0.68, 0.7, 0.68, 0.68, 0.74, 0.72, 0.7, 0.68, 0.68, 0.68, 0.74, 0.68, 0.68, 0.76, - 0.72, 0.68, 0.68, 0.76, 0.71, 0.78, 0.71, 0.68, 0.68 - ] - }, - { - "x": [ - 386, 382, 368, 360, 352, 347, 343, 339, 335, 332, 328, 325, 323, 319, 317, 314, 311, 309, 309, 308, 308, 307, 307, 307, 307, 307, 307, 307, 308, - 311, 315, 323, 330, 334, 339, 345, 350, 356, 362, 365, 374, 377, 382, 385, 388, 391, 396, 399, 403, 407, 412, 419, 428, 438, 442, 446, 451, 454, - 458, 461, 465, 469, 469, 470, 471, 471, 471, 471, 470, 468, 466, 464, 462, 460, 457, 455, 451, 445, 440, 437, 429, 425, 421, 418, 415, 410, 404, - 396, 392, 389, 384, 381, 376, 373 - ], - "y": [ - 168, 168, 168, 168, 168, 168, 169, 169, 170, 171, 174, 176, 180, 182, 185, 191, 197, 203, 207, 212, 216, 219, 225, 228, 231, 238, 244, 247, 251, - 254, 256, 256, 257, 258, 258, 258, 258, 260, 260, 260, 261, 262, 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 263, 263, 262, - 261, 259, 256, 251, 248, 245, 242, 237, 233, 230, 225, 222, 219, 215, 212, 208, 205, 202, 196, 191, 188, 184, 181, 179, 178, 177, 177, 176, 174, - 172, 172, 171, 170, 169, 168, 167 - ], - "t": [ - 1689777777997, 1689777778043, 1689777778095, 1689777778112, 1689777778131, 1689777778145, 1689777778162, 1689777778195, 1689777778212, - 1689777778229, 1689777778262, 1689777778279, 1689777778295, 1689777778312, 1689777778328, 1689777778345, 1689777778361, 1689777778395, - 1689777778411, 1689777778428, 1689777778462, 1689777778478, 1689777778512, 1689777778528, 1689777778545, 1689777778578, 1689777778612, - 1689777778628, 1689777778645, 1689777778679, 1689777778695, 1689777778728, 1689777778746, 1689777778762, 1689777778779, 1689777778795, - 1689777778812, 1689777778829, 1689777778846, 1689777778862, 1689777778879, 1689777778896, 1689777778913, 1689777778929, 1689777778946, - 1689777778979, 1689777779013, 1689777779046, 1689777779079, 1689777779096, 1689777779113, 1689777779129, 1689777779146, 1689777779162, - 1689777779179, 1689777779196, 1689777779212, 1689777779229, 1689777779246, 1689777779330, 1689777779363, 1689777779396, 1689777779412, - 1689777779430, 1689777779446, 1689777779462, 1689777779480, 1689777779496, 1689777779529, 1689777779547, 1689777779563, 1689777779597, - 1689777779612, 1689777779646, 1689777779679, 1689777779696, 1689777779730, 1689777779763, 1689777779797, 1689777779813, 1689777779847, - 1689777779863, 1689777779880, 1689777779896, 1689777779913, 1689777779946, 1689777779980, 1689777779997, 1689777780013, 1689777780030, - 1689777780063, 1689777780097, 1689777780130, 1689777780163 - ], - "p": [ - 0.5, 0.8, 0.56, 0.8, 0.8, 0.74, 0.72, 0.71, 0.72, 0.68, 0.74, 0.7, 0.73, 0.73, 0.7, 0.78, 0.78, 0.77, 0.71, 0.75, 0.71, 0.68, 0.77, 0.68, 0.68, - 0.78, 0.77, 0.68, 0.72, 0.72, 0.73, 0.8, 0.79, 0.72, 0.74, 0.77, 0.74, 0.77, 0.77, 0.68, 0.81, 0.68, 0.75, 0.68, 0.68, 0.68, 0.74, 0.68, 0.71, - 0.71, 0.74, 0.78, 0.81, 0.68, 0.71, 0.72, 0.74, 0.68, 0.72, 0.7, 0.74, 0.77, 0.68, 0.68, 0.68, 0.74, 0.71, 0.68, 0.75, 0.7, 0.7, 0.73, 0.7, - 0.73, 0.72, 0.7, 0.79, 0.8, 0.76, 0.74, 0.81, 0.73, 0.72, 0.68, 0.68, 0.75, 0.77, 0.8, 0.71, 0.68, 0.75, 0.68, 0.75, 0.68 - ] - } -] diff --git a/test/integration/strokes/helloStrike.json b/test/integration/strokes/helloStrike.json deleted file mode 100644 index 6f0a0b12b..000000000 --- a/test/integration/strokes/helloStrike.json +++ /dev/null @@ -1,410 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 261, - 262, - 265, - 270, - 276, - 280, - 282, - 283, - 280, - 273, - 269, - 266, - 266, - 264, - 263, - 264, - 264, - 264, - 264, - 264, - 264, - 265, - 268, - 271, - 275, - 277, - 281, - 286, - 290, - 293, - 293, - 290, - 287, - 287, - 290, - 295, - 299, - 304, - 313, - 325, - 331, - 332, - 328, - 323, - 319, - 318, - 316, - 315, - 315, - 315, - 318, - 320, - 323, - 327, - 331, - 334, - 337, - 342, - 347, - 349, - 348, - 346, - 343, - 341, - 340, - 338, - 337, - 338, - 338, - 340, - 345, - 348, - 352, - 353, - 352, - 357, - 361, - 364, - 367, - 370, - 370, - 369, - 365, - 361, - 368, - 376, - 382, - 386 - ], - "y": [ - 292, - 289, - 285, - 282, - 273, - 263, - 258, - 251, - 247, - 244, - 249, - 256, - 261, - 267, - 272, - 279, - 285, - 291, - 294, - 291, - 288, - 285, - 282, - 281, - 286, - 289, - 293, - 288, - 287, - 285, - 282, - 283, - 284, - 287, - 290, - 291, - 291, - 289, - 284, - 275, - 267, - 260, - 250, - 244, - 246, - 252, - 259, - 265, - 271, - 278, - 284, - 288, - 291, - 292, - 293, - 292, - 288, - 281, - 272, - 263, - 256, - 252, - 253, - 256, - 260, - 265, - 273, - 279, - 286, - 289, - 292, - 292, - 289, - 284, - 289, - 292, - 291, - 290, - 288, - 286, - 283, - 279, - 277, - 277, - 277, - 277, - 278, - 279 - ], - "t": [ - 1691512951866, - 1691512951913, - 1691512951935, - 1691512951952, - 1691512951968, - 1691512951985, - 1691512952001, - 1691512952018, - 1691512952036, - 1691512952051, - 1691512952085, - 1691512952102, - 1691512952118, - 1691512952135, - 1691512952152, - 1691512952168, - 1691512952186, - 1691512952202, - 1691512952262, - 1691512952385, - 1691512952402, - 1691512952419, - 1691512952452, - 1691512952486, - 1691512952536, - 1691512952552, - 1691512952585, - 1691512952668, - 1691512952686, - 1691512952702, - 1691512952735, - 1691512952752, - 1691512952785, - 1691512952819, - 1691512952852, - 1691512952885, - 1691512952902, - 1691512952918, - 1691512952935, - 1691512952952, - 1691512952968, - 1691512952985, - 1691512953002, - 1691512953018, - 1691512953068, - 1691512953085, - 1691512953102, - 1691512953118, - 1691512953136, - 1691512953152, - 1691512953168, - 1691512953185, - 1691512953202, - 1691512953218, - 1691512953252, - 1691512953269, - 1691512953286, - 1691512953302, - 1691512953319, - 1691512953335, - 1691512953352, - 1691512953368, - 1691512953436, - 1691512953452, - 1691512953469, - 1691512953485, - 1691512953502, - 1691512953518, - 1691512953535, - 1691512953552, - 1691512953585, - 1691512953602, - 1691512953672, - 1691512953702, - 1691512953785, - 1691512953818, - 1691512953835, - 1691512953852, - 1691512953868, - 1691512953885, - 1691512953902, - 1691512953919, - 1691512953935, - 1691512953952, - 1691512954085, - 1691512954102, - 1691512954119, - 1691512954135 - ], - "p": [ - 0.5, - 0.82, - 0.74, - 0.76, - 0.67, - 0.67, - 0.75, - 0.79, - 0.74, - 0.79, - 0.77, - 0.79, - 0.74, - 0.77, - 0.75, - 0.79, - 0.77, - 0.77, - 0.68, - 0.68, - 0.68, - 0.68, - 0.72, - 0.68, - 0.77, - 0.7, - 0.76, - 0.79, - 0.72, - 0.7, - 0.68, - 0.68, - 0.68, - 0.68, - 0.72, - 0.75, - 0.71, - 0.75, - 0.68, - 0.61, - 0.68, - 0.79, - 0.67, - 0.8, - 0.73, - 0.77, - 0.79, - 0.77, - 0.77, - 0.78, - 0.78, - 0.73, - 0.72, - 0.72, - 0.72, - 0.68, - 0.74, - 0.81, - 0.68, - 0.81, - 0.79, - 0.73, - 0.68, - 0.7, - 0.72, - 0.75, - 0.8, - 0.77, - 0.78, - 0.7, - 0.76, - 0.68, - 0.74, - 0.75, - 0.75, - 0.76, - 0.72, - 0.68, - 0.7, - 0.7, - 0.68, - 0.72, - 0.73, - 0.71, - 0.78, - 0.8, - 0.77, - 0.72 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 252, - 255, - 275, - 313, - 355, - 388, - 395, - 391 - ], - "y": [ - 287, - 287, - 290, - 290, - 283, - 279, - 278, - 276 - ], - "t": [ - 1691512954733, - 1691512954752, - 1691512954769, - 1691512954786, - 1691512954803, - 1691512954819, - 1691512954836, - 1691512954885 - ], - "p": [ - 0.5, - 0.83, - 0.45, - 0.38, - 0.35, - 0.42, - 0.79, - 0.73 - ] - } -] diff --git a/test/integration/strokes/interact/buenosAires.json b/test/integration/strokes/interact/buenosAires.json deleted file mode 100644 index 989714234..000000000 --- a/test/integration/strokes/interact/buenosAires.json +++ /dev/null @@ -1,1082 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 108, - "y": 140, - "t": 1695826051889, - "p": 0.1 - }, - { - "x": 108, - "y": 143, - "t": 1695826051956, - "p": 0.68 - }, - { - "x": 109, - "y": 147, - "t": 1695826051972, - "p": 0.72 - }, - { - "x": 110, - "y": 152, - "t": 1695826051989, - "p": 0.75 - }, - { - "x": 110, - "y": 158, - "t": 1695826052005, - "p": 0.77 - }, - { - "x": 111, - "y": 165, - "t": 1695826052023, - "p": 0.79 - }, - { - "x": 112, - "y": 169, - "t": 1695826052039, - "p": 0.72 - }, - { - "x": 112, - "y": 172, - "t": 1695826052055, - "p": 0.68 - }, - { - "x": 112, - "y": 175, - "t": 1695826052072, - "p": 0.68 - }, - { - "x": 112, - "y": 179, - "t": 1695826052089, - "p": 0.71 - }, - { - "x": 113, - "y": 183, - "t": 1695826052122, - "p": 0.72 - }, - { - "x": 113, - "y": 179, - "t": 1695826052405, - "p": 0.71 - }, - { - "x": 113, - "y": 176, - "t": 1695826052421, - "p": 0.68 - }, - { - "x": 113, - "y": 173, - "t": 1695826052455, - "p": 0.68 - }, - { - "x": 115, - "y": 170, - "t": 1695826052488, - "p": 0.7 - }, - { - "x": 117, - "y": 167, - "t": 1695826052522, - "p": 0.7 - }, - { - "x": 120, - "y": 166, - "t": 1695826052588, - "p": 0.68 - }, - { - "x": 124, - "y": 168, - "t": 1695826052605, - "p": 0.73 - }, - { - "x": 127, - "y": 171, - "t": 1695826052622, - "p": 0.72 - }, - { - "x": 130, - "y": 173, - "t": 1695826052638, - "p": 0.7 - }, - { - "x": 132, - "y": 176, - "t": 1695826052655, - "p": 0.7 - }, - { - "x": 133, - "y": 179, - "t": 1695826052705, - "p": 0.68 - }, - { - "x": 132, - "y": 182, - "t": 1695826052739, - "p": 0.68 - }, - { - "x": 127, - "y": 185, - "t": 1695826052772, - "p": 0.76 - }, - { - "x": 119, - "y": 189, - "t": 1695826052789, - "p": 0.81 - }, - { - "x": 112, - "y": 191, - "t": 1695826052805, - "p": 0.79 - }, - { - "x": 109, - "y": 192, - "t": 1695826052878, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 141, - "y": 161, - "t": 1695826053292, - "p": 0.1 - }, - { - "x": 140, - "y": 165, - "t": 1695826053337, - "p": 0.72 - }, - { - "x": 139, - "y": 169, - "t": 1695826053354, - "p": 0.72 - }, - { - "x": 139, - "y": 173, - "t": 1695826053371, - "p": 0.71 - }, - { - "x": 139, - "y": 177, - "t": 1695826053388, - "p": 0.71 - }, - { - "x": 139, - "y": 181, - "t": 1695826053404, - "p": 0.71 - }, - { - "x": 139, - "y": 184, - "t": 1695826053438, - "p": 0.68 - }, - { - "x": 143, - "y": 183, - "t": 1695826053520, - "p": 0.72 - }, - { - "x": 146, - "y": 179, - "t": 1695826053537, - "p": 0.74 - }, - { - "x": 150, - "y": 172, - "t": 1695826053554, - "p": 0.8 - }, - { - "x": 152, - "y": 167, - "t": 1695826053587, - "p": 0.75 - }, - { - "x": 153, - "y": 164, - "t": 1695826053620, - "p": 0.68 - }, - { - "x": 153, - "y": 169, - "t": 1695826053687, - "p": 0.74 - }, - { - "x": 153, - "y": 172, - "t": 1695826053704, - "p": 0.68 - }, - { - "x": 153, - "y": 176, - "t": 1695826053721, - "p": 0.71 - }, - { - "x": 154, - "y": 179, - "t": 1695826053737, - "p": 0.68 - }, - { - "x": 155, - "y": 182, - "t": 1695826053771, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 164, - "y": 177, - "t": 1695826054104, - "p": 0.1 - }, - { - "x": 167, - "y": 175, - "t": 1695826054204, - "p": 0.7 - }, - { - "x": 171, - "y": 174, - "t": 1695826054219, - "p": 0.72 - }, - { - "x": 174, - "y": 173, - "t": 1695826054237, - "p": 0.68 - }, - { - "x": 178, - "y": 171, - "t": 1695826054253, - "p": 0.73 - }, - { - "x": 179, - "y": 168, - "t": 1695826054286, - "p": 0.68 - }, - { - "x": 175, - "y": 167, - "t": 1695826054387, - "p": 0.72 - }, - { - "x": 171, - "y": 168, - "t": 1695826054403, - "p": 0.72 - }, - { - "x": 168, - "y": 170, - "t": 1695826054421, - "p": 0.7 - }, - { - "x": 165, - "y": 173, - "t": 1695826054454, - "p": 0.72 - }, - { - "x": 165, - "y": 176, - "t": 1695826054486, - "p": 0.68 - }, - { - "x": 168, - "y": 178, - "t": 1695826054503, - "p": 0.7 - }, - { - "x": 172, - "y": 180, - "t": 1695826054537, - "p": 0.73 - }, - { - "x": 176, - "y": 182, - "t": 1695826054570, - "p": 0.73 - }, - { - "x": 179, - "y": 182, - "t": 1695826054603, - "p": 0.68 - }, - { - "x": 182, - "y": 183, - "t": 1695826054637, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 191, - "y": 167, - "t": 1695826054845, - "p": 0.1 - }, - { - "x": 190, - "y": 171, - "t": 1695826054869, - "p": 0.72 - }, - { - "x": 190, - "y": 175, - "t": 1695826054887, - "p": 0.71 - }, - { - "x": 190, - "y": 178, - "t": 1695826054903, - "p": 0.68 - }, - { - "x": 190, - "y": 181, - "t": 1695826054920, - "p": 0.68 - }, - { - "x": 191, - "y": 178, - "t": 1695826055070, - "p": 0.68 - }, - { - "x": 192, - "y": 174, - "t": 1695826055086, - "p": 0.72 - }, - { - "x": 193, - "y": 170, - "t": 1695826055103, - "p": 0.72 - }, - { - "x": 196, - "y": 166, - "t": 1695826055136, - "p": 0.74 - }, - { - "x": 199, - "y": 167, - "t": 1695826055202, - "p": 0.68 - }, - { - "x": 201, - "y": 170, - "t": 1695826055220, - "p": 0.7 - }, - { - "x": 204, - "y": 174, - "t": 1695826055235, - "p": 0.74 - }, - { - "x": 205, - "y": 177, - "t": 1695826055253, - "p": 0.68 - }, - { - "x": 207, - "y": 182, - "t": 1695826055286, - "p": 0.75 - }, - { - "x": 208, - "y": 185, - "t": 1695826055319, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 217, - "y": 175, - "t": 1695826055635, - "p": 0.1 - }, - { - "x": 217, - "y": 178, - "t": 1695826055669, - "p": 0.68 - }, - { - "x": 217, - "y": 181, - "t": 1695826055686, - "p": 0.68 - }, - { - "x": 218, - "y": 185, - "t": 1695826055703, - "p": 0.72 - }, - { - "x": 220, - "y": 188, - "t": 1695826055736, - "p": 0.7 - }, - { - "x": 223, - "y": 187, - "t": 1695826055752, - "p": 0.68 - }, - { - "x": 226, - "y": 186, - "t": 1695826055785, - "p": 0.68 - }, - { - "x": 229, - "y": 184, - "t": 1695826055802, - "p": 0.7 - }, - { - "x": 235, - "y": 180, - "t": 1695826055820, - "p": 0.79 - }, - { - "x": 236, - "y": 177, - "t": 1695826055835, - "p": 0.68 - }, - { - "x": 232, - "y": 174, - "t": 1695826055868, - "p": 0.74 - }, - { - "x": 229, - "y": 173, - "t": 1695826055886, - "p": 0.68 - }, - { - "x": 225, - "y": 172, - "t": 1695826055902, - "p": 0.72 - }, - { - "x": 221, - "y": 172, - "t": 1695826055919, - "p": 0.71 - }, - { - "x": 217, - "y": 173, - "t": 1695826055935, - "p": 0.72 - }, - { - "x": 214, - "y": 175, - "t": 1695826055952, - "p": 0.7 - }, - { - "x": 211, - "y": 177, - "t": 1695826055985, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 254, - "y": 166, - "t": 1695826056453, - "p": 0.1 - }, - { - "x": 248, - "y": 169, - "t": 1695826056485, - "p": 0.78 - }, - { - "x": 245, - "y": 171, - "t": 1695826056502, - "p": 0.7 - }, - { - "x": 243, - "y": 175, - "t": 1695826056534, - "p": 0.73 - }, - { - "x": 246, - "y": 176, - "t": 1695826056585, - "p": 0.68 - }, - { - "x": 251, - "y": 177, - "t": 1695826056618, - "p": 0.75 - }, - { - "x": 255, - "y": 180, - "t": 1695826056652, - "p": 0.74 - }, - { - "x": 254, - "y": 183, - "t": 1695826056701, - "p": 0.68 - }, - { - "x": 249, - "y": 186, - "t": 1695826056734, - "p": 0.76 - }, - { - "x": 245, - "y": 188, - "t": 1695826056752, - "p": 0.73 - }, - { - "x": 242, - "y": 190, - "t": 1695826056768, - "p": 0.7 - }, - { - "x": 239, - "y": 191, - "t": 1695826056801, - "p": 0.68 - }, - { - "x": 235, - "y": 192, - "t": 1695826056835, - "p": 0.72 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 293, - "y": 174, - "t": 1695826057890, - "p": 0.1 - }, - { - "x": 289, - "y": 178, - "t": 1695826057917, - "p": 0.76 - }, - { - "x": 289, - "y": 181, - "t": 1695826057934, - "p": 0.68 - }, - { - "x": 293, - "y": 183, - "t": 1695826057967, - "p": 0.73 - }, - { - "x": 296, - "y": 184, - "t": 1695826057984, - "p": 0.68 - }, - { - "x": 299, - "y": 184, - "t": 1695826058000, - "p": 0.68 - }, - { - "x": 303, - "y": 183, - "t": 1695826058018, - "p": 0.72 - }, - { - "x": 306, - "y": 182, - "t": 1695826058033, - "p": 0.68 - }, - { - "x": 310, - "y": 179, - "t": 1695826058051, - "p": 0.74 - }, - { - "x": 312, - "y": 175, - "t": 1695826058084, - "p": 0.73 - }, - { - "x": 307, - "y": 171, - "t": 1695826058117, - "p": 0.77 - }, - { - "x": 302, - "y": 170, - "t": 1695826058133, - "p": 0.75 - }, - { - "x": 297, - "y": 169, - "t": 1695826058151, - "p": 0.75 - }, - { - "x": 293, - "y": 169, - "t": 1695826058167, - "p": 0.71 - }, - { - "x": 289, - "y": 172, - "t": 1695826058200, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 312, - "y": 168, - "t": 1695826058669, - "p": 0.1 - }, - { - "x": 313, - "y": 173, - "t": 1695826058699, - "p": 0.75 - }, - { - "x": 313, - "y": 177, - "t": 1695826058716, - "p": 0.71 - }, - { - "x": 313, - "y": 181, - "t": 1695826058733, - "p": 0.71 - }, - { - "x": 314, - "y": 184, - "t": 1695826058750, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 326, - "y": 166, - "t": 1695826059196, - "p": 0.1 - }, - { - "x": 327, - "y": 172, - "t": 1695826059283, - "p": 0.77 - }, - { - "x": 327, - "y": 175, - "t": 1695826059299, - "p": 0.68 - }, - { - "x": 327, - "y": 178, - "t": 1695826059316, - "p": 0.68 - }, - { - "x": 328, - "y": 181, - "t": 1695826059365, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 324, - "y": 152, - "t": 1695826059729, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 338, - "y": 171, - "t": 1695826060147, - "p": 0.1 - }, - { - "x": 337, - "y": 174, - "t": 1695826060166, - "p": 0.68 - }, - { - "x": 337, - "y": 179, - "t": 1695826060198, - "p": 0.74 - }, - { - "x": 339, - "y": 183, - "t": 1695826060232, - "p": 0.73 - }, - { - "x": 336, - "y": 177, - "t": 1695826060431, - "p": 0.78 - }, - { - "x": 336, - "y": 174, - "t": 1695826060449, - "p": 0.68 - }, - { - "x": 338, - "y": 171, - "t": 1695826060464, - "p": 0.7 - }, - { - "x": 341, - "y": 169, - "t": 1695826060481, - "p": 0.7 - }, - { - "x": 344, - "y": 167, - "t": 1695826060498, - "p": 0.7 - }, - { - "x": 347, - "y": 166, - "t": 1695826060549, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 353, - "y": 173, - "t": 1695826060888, - "p": 0.1 - }, - { - "x": 356, - "y": 173, - "t": 1695826060948, - "p": 0.68 - }, - { - "x": 359, - "y": 173, - "t": 1695826060981, - "p": 0.68 - }, - { - "x": 363, - "y": 171, - "t": 1695826061014, - "p": 0.73 - }, - { - "x": 364, - "y": 168, - "t": 1695826061081, - "p": 0.68 - }, - { - "x": 357, - "y": 170, - "t": 1695826061131, - "p": 0.79 - }, - { - "x": 353, - "y": 171, - "t": 1695826061147, - "p": 0.72 - }, - { - "x": 350, - "y": 173, - "t": 1695826061165, - "p": 0.7 - }, - { - "x": 350, - "y": 176, - "t": 1695826061214, - "p": 0.68 - }, - { - "x": 352, - "y": 179, - "t": 1695826061248, - "p": 0.7 - }, - { - "x": 356, - "y": 182, - "t": 1695826061281, - "p": 0.74 - }, - { - "x": 359, - "y": 184, - "t": 1695826061314, - "p": 0.7 - }, - { - "x": 363, - "y": 183, - "t": 1695826061364, - "p": 0.72 - }, - { - "x": 366, - "y": 182, - "t": 1695826061381, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 386, - "y": 168, - "t": 1695826061719, - "p": 0.1 - }, - { - "x": 382, - "y": 168, - "t": 1695826061764, - "p": 0.71 - }, - { - "x": 378, - "y": 169, - "t": 1695826061780, - "p": 0.72 - }, - { - "x": 375, - "y": 172, - "t": 1695826061813, - "p": 0.72 - }, - { - "x": 376, - "y": 175, - "t": 1695826061864, - "p": 0.68 - }, - { - "x": 381, - "y": 177, - "t": 1695826061913, - "p": 0.75 - }, - { - "x": 384, - "y": 179, - "t": 1695826061946, - "p": 0.7 - }, - { - "x": 386, - "y": 182, - "t": 1695826061997, - "p": 0.7 - }, - { - "x": 384, - "y": 185, - "t": 1695826062030, - "p": 0.7 - }, - { - "x": 381, - "y": 187, - "t": 1695826062047, - "p": 0.7 - }, - { - "x": 375, - "y": 189, - "t": 1695826062063, - "p": 0.77 - }, - { - "x": 369, - "y": 191, - "t": 1695826062080, - "p": 0.77 - } - ] - } -] diff --git a/test/integration/strokes/interact/madrid.json b/test/integration/strokes/interact/madrid.json deleted file mode 100644 index 23ecb9360..000000000 --- a/test/integration/strokes/interact/madrid.json +++ /dev/null @@ -1,560 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 158, - "y": 184, - "t": 1695826930199, - "p": 0.1 - }, - { - "x": 158, - "y": 181, - "t": 1695826930381, - "p": 0.68 - }, - { - "x": 157, - "y": 178, - "t": 1695826930397, - "p": 0.68 - }, - { - "x": 159, - "y": 173, - "t": 1695826930431, - "p": 0.75 - }, - { - "x": 162, - "y": 173, - "t": 1695826930465, - "p": 0.68 - }, - { - "x": 165, - "y": 175, - "t": 1695826930531, - "p": 0.7 - }, - { - "x": 167, - "y": 178, - "t": 1695826930581, - "p": 0.7 - }, - { - "x": 169, - "y": 182, - "t": 1695826930615, - "p": 0.73 - }, - { - "x": 169, - "y": 187, - "t": 1695826930648, - "p": 0.74 - }, - { - "x": 167, - "y": 184, - "t": 1695826930781, - "p": 0.7 - }, - { - "x": 167, - "y": 180, - "t": 1695826930798, - "p": 0.71 - }, - { - "x": 167, - "y": 177, - "t": 1695826930814, - "p": 0.68 - }, - { - "x": 170, - "y": 174, - "t": 1695826930831, - "p": 0.72 - }, - { - "x": 172, - "y": 171, - "t": 1695826930848, - "p": 0.7 - }, - { - "x": 175, - "y": 170, - "t": 1695826930882, - "p": 0.68 - }, - { - "x": 177, - "y": 174, - "t": 1695826930931, - "p": 0.73 - }, - { - "x": 178, - "y": 177, - "t": 1695826930948, - "p": 0.68 - }, - { - "x": 179, - "y": 180, - "t": 1695826930981, - "p": 0.68 - }, - { - "x": 179, - "y": 184, - "t": 1695826931014, - "p": 0.71 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 188, - "y": 178, - "t": 1695826931372, - "p": 0.1 - }, - { - "x": 185, - "y": 181, - "t": 1695826931413, - "p": 0.72 - }, - { - "x": 185, - "y": 184, - "t": 1695826931447, - "p": 0.68 - }, - { - "x": 190, - "y": 186, - "t": 1695826931480, - "p": 0.75 - }, - { - "x": 193, - "y": 185, - "t": 1695826931497, - "p": 0.68 - }, - { - "x": 196, - "y": 185, - "t": 1695826931513, - "p": 0.68 - }, - { - "x": 199, - "y": 184, - "t": 1695826931547, - "p": 0.68 - }, - { - "x": 200, - "y": 181, - "t": 1695826931597, - "p": 0.68 - }, - { - "x": 196, - "y": 178, - "t": 1695826931630, - "p": 0.74 - }, - { - "x": 191, - "y": 176, - "t": 1695826931664, - "p": 0.75 - }, - { - "x": 188, - "y": 177, - "t": 1695826931697, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 197, - "y": 176, - "t": 1695826932140, - "p": 0.1 - }, - { - "x": 197, - "y": 179, - "t": 1695826932180, - "p": 0.68 - }, - { - "x": 197, - "y": 182, - "t": 1695826932196, - "p": 0.68 - }, - { - "x": 199, - "y": 187, - "t": 1695826932230, - "p": 0.75 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 208, - "y": 180, - "t": 1695826932608, - "p": 0.1 - }, - { - "x": 207, - "y": 185, - "t": 1695826932679, - "p": 0.75 - }, - { - "x": 208, - "y": 188, - "t": 1695826932697, - "p": 0.68 - }, - { - "x": 211, - "y": 189, - "t": 1695826932713, - "p": 0.68 - }, - { - "x": 214, - "y": 189, - "t": 1695826932746, - "p": 0.68 - }, - { - "x": 217, - "y": 188, - "t": 1695826932779, - "p": 0.68 - }, - { - "x": 218, - "y": 183, - "t": 1695826932813, - "p": 0.75 - }, - { - "x": 213, - "y": 179, - "t": 1695826932846, - "p": 0.77 - }, - { - "x": 210, - "y": 177, - "t": 1695826932880, - "p": 0.7 - }, - { - "x": 204, - "y": 180, - "t": 1695826932929, - "p": 0.78 - }, - { - "x": 200, - "y": 183, - "t": 1695826932946, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 215, - "y": 152, - "t": 1695826933235, - "p": 0.1 - }, - { - "x": 215, - "y": 155, - "t": 1695826933262, - "p": 0.68 - }, - { - "x": 215, - "y": 160, - "t": 1695826933278, - "p": 0.74 - }, - { - "x": 217, - "y": 167, - "t": 1695826933296, - "p": 0.79 - }, - { - "x": 217, - "y": 174, - "t": 1695826933312, - "p": 0.78 - }, - { - "x": 218, - "y": 179, - "t": 1695826933329, - "p": 0.75 - }, - { - "x": 219, - "y": 183, - "t": 1695826933345, - "p": 0.72 - }, - { - "x": 219, - "y": 188, - "t": 1695826933362, - "p": 0.74 - }, - { - "x": 220, - "y": 194, - "t": 1695826933378, - "p": 0.77 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 229, - "y": 191, - "t": 1695826933768, - "p": 0.1 - }, - { - "x": 228, - "y": 187, - "t": 1695826933829, - "p": 0.72 - }, - { - "x": 227, - "y": 184, - "t": 1695826933845, - "p": 0.68 - }, - { - "x": 228, - "y": 178, - "t": 1695826933878, - "p": 0.77 - }, - { - "x": 232, - "y": 175, - "t": 1695826933912, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 246, - "y": 175, - "t": 1695826934210, - "p": 0.1 - }, - { - "x": 243, - "y": 181, - "t": 1695826934245, - "p": 0.78 - }, - { - "x": 242, - "y": 185, - "t": 1695826934261, - "p": 0.72 - }, - { - "x": 241, - "y": 188, - "t": 1695826934278, - "p": 0.68 - }, - { - "x": 242, - "y": 191, - "t": 1695826934361, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 242, - "y": 158, - "t": 1695826934598, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 260, - "y": 175, - "t": 1695826935051, - "p": 0.1 - }, - { - "x": 257, - "y": 177, - "t": 1695826935110, - "p": 0.7 - }, - { - "x": 256, - "y": 180, - "t": 1695826935128, - "p": 0.68 - }, - { - "x": 257, - "y": 183, - "t": 1695826935161, - "p": 0.68 - }, - { - "x": 261, - "y": 183, - "t": 1695826935194, - "p": 0.71 - }, - { - "x": 265, - "y": 183, - "t": 1695826935228, - "p": 0.71 - }, - { - "x": 268, - "y": 181, - "t": 1695826935294, - "p": 0.7 - }, - { - "x": 269, - "y": 178, - "t": 1695826935344, - "p": 0.68 - }, - { - "x": 263, - "y": 173, - "t": 1695826935378, - "p": 0.8 - }, - { - "x": 257, - "y": 172, - "t": 1695826935393, - "p": 0.77 - }, - { - "x": 255, - "y": 175, - "t": 1695826935478, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 269, - "y": 155, - "t": 1695826935764, - "p": 0.1 - }, - { - "x": 268, - "y": 158, - "t": 1695826935793, - "p": 0.68 - }, - { - "x": 266, - "y": 168, - "t": 1695826935810, - "p": 0.68 - }, - { - "x": 265, - "y": 175, - "t": 1695826935827, - "p": 0.79 - }, - { - "x": 264, - "y": 180, - "t": 1695826935843, - "p": 0.75 - }, - { - "x": 264, - "y": 183, - "t": 1695826935860, - "p": 0.68 - }, - { - "x": 264, - "y": 186, - "t": 1695826935960, - "p": 0.68 - } - ] - } -] diff --git a/test/integration/strokes/interact/paris.json b/test/integration/strokes/interact/paris.json deleted file mode 100644 index 33a0d37bd..000000000 --- a/test/integration/strokes/interact/paris.json +++ /dev/null @@ -1,500 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 102, - "y": 187, - "t": 1695825896206, - "p": 0.1 - }, - { - "x": 108, - "y": 183, - "t": 1695825896289, - "p": 0.79 - }, - { - "x": 113, - "y": 180, - "t": 1695825896306, - "p": 0.76 - }, - { - "x": 115, - "y": 176, - "t": 1695825896321, - "p": 0.73 - }, - { - "x": 117, - "y": 173, - "t": 1695825896339, - "p": 0.7 - }, - { - "x": 118, - "y": 170, - "t": 1695825896356, - "p": 0.68 - }, - { - "x": 118, - "y": 167, - "t": 1695825896372, - "p": 0.68 - }, - { - "x": 117, - "y": 176, - "t": 1695825896505, - "p": 0.81 - }, - { - "x": 117, - "y": 182, - "t": 1695825896522, - "p": 0.77 - }, - { - "x": 117, - "y": 189, - "t": 1695825896538, - "p": 0.78 - }, - { - "x": 117, - "y": 194, - "t": 1695825896555, - "p": 0.74 - }, - { - "x": 117, - "y": 200, - "t": 1695825896571, - "p": 0.77 - }, - { - "x": 116, - "y": 205, - "t": 1695825896589, - "p": 0.75 - }, - { - "x": 117, - "y": 208, - "t": 1695825896638, - "p": 0.68 - }, - { - "x": 115, - "y": 203, - "t": 1695825896755, - "p": 0.75 - }, - { - "x": 115, - "y": 199, - "t": 1695825896772, - "p": 0.71 - }, - { - "x": 115, - "y": 194, - "t": 1695825896788, - "p": 0.74 - }, - { - "x": 116, - "y": 190, - "t": 1695825896805, - "p": 0.72 - }, - { - "x": 117, - "y": 187, - "t": 1695825896822, - "p": 0.68 - }, - { - "x": 117, - "y": 184, - "t": 1695825896838, - "p": 0.68 - }, - { - "x": 118, - "y": 180, - "t": 1695825896872, - "p": 0.72 - }, - { - "x": 119, - "y": 177, - "t": 1695825896905, - "p": 0.68 - }, - { - "x": 121, - "y": 174, - "t": 1695825896938, - "p": 0.7 - }, - { - "x": 123, - "y": 177, - "t": 1695825897088, - "p": 0.7 - }, - { - "x": 124, - "y": 180, - "t": 1695825897106, - "p": 0.68 - }, - { - "x": 125, - "y": 184, - "t": 1695825897139, - "p": 0.72 - }, - { - "x": 128, - "y": 184, - "t": 1695825897205, - "p": 0.68 - }, - { - "x": 132, - "y": 183, - "t": 1695825897239, - "p": 0.72 - }, - { - "x": 136, - "y": 179, - "t": 1695825897272, - "p": 0.76 - }, - { - "x": 137, - "y": 176, - "t": 1695825897305, - "p": 0.68 - }, - { - "x": 135, - "y": 181, - "t": 1695825897422, - "p": 0.75 - }, - { - "x": 139, - "y": 185, - "t": 1695825897455, - "p": 0.76 - }, - { - "x": 142, - "y": 184, - "t": 1695825897489, - "p": 0.68 - }, - { - "x": 145, - "y": 184, - "t": 1695825897505, - "p": 0.68 - }, - { - "x": 148, - "y": 183, - "t": 1695825897521, - "p": 0.68 - }, - { - "x": 151, - "y": 181, - "t": 1695825897554, - "p": 0.7 - }, - { - "x": 148, - "y": 178, - "t": 1695825897587, - "p": 0.72 - }, - { - "x": 144, - "y": 176, - "t": 1695825897605, - "p": 0.73 - }, - { - "x": 140, - "y": 175, - "t": 1695825897620, - "p": 0.72 - }, - { - "x": 137, - "y": 174, - "t": 1695825897638, - "p": 0.68 - }, - { - "x": 141, - "y": 177, - "t": 1695825897737, - "p": 0.74 - }, - { - "x": 145, - "y": 178, - "t": 1695825897771, - "p": 0.72 - }, - { - "x": 149, - "y": 179, - "t": 1695825897788, - "p": 0.72 - }, - { - "x": 152, - "y": 179, - "t": 1695825897821, - "p": 0.68 - }, - { - "x": 153, - "y": 183, - "t": 1695825897871, - "p": 0.72 - }, - { - "x": 157, - "y": 185, - "t": 1695825897904, - "p": 0.73 - }, - { - "x": 161, - "y": 183, - "t": 1695825897954, - "p": 0.73 - }, - { - "x": 166, - "y": 178, - "t": 1695825897988, - "p": 0.79 - }, - { - "x": 169, - "y": 174, - "t": 1695825898004, - "p": 0.74 - }, - { - "x": 171, - "y": 169, - "t": 1695825898037, - "p": 0.75 - }, - { - "x": 170, - "y": 166, - "t": 1695825898070, - "p": 0.68 - }, - { - "x": 174, - "y": 168, - "t": 1695825898170, - "p": 0.73 - }, - { - "x": 177, - "y": 173, - "t": 1695825898204, - "p": 0.76 - }, - { - "x": 177, - "y": 177, - "t": 1695825898220, - "p": 0.71 - }, - { - "x": 177, - "y": 181, - "t": 1695825898237, - "p": 0.71 - }, - { - "x": 177, - "y": 184, - "t": 1695825898254, - "p": 0.68 - }, - { - "x": 180, - "y": 186, - "t": 1695825898287, - "p": 0.7 - }, - { - "x": 184, - "y": 185, - "t": 1695825898321, - "p": 0.72 - }, - { - "x": 188, - "y": 182, - "t": 1695825898354, - "p": 0.74 - }, - { - "x": 191, - "y": 179, - "t": 1695825898371, - "p": 0.72 - }, - { - "x": 196, - "y": 172, - "t": 1695825898404, - "p": 0.81 - }, - { - "x": 197, - "y": 169, - "t": 1695825898437, - "p": 0.68 - }, - { - "x": 195, - "y": 173, - "t": 1695825898554, - "p": 0.73 - }, - { - "x": 195, - "y": 177, - "t": 1695825898587, - "p": 0.71 - }, - { - "x": 196, - "y": 181, - "t": 1695825898620, - "p": 0.72 - }, - { - "x": 198, - "y": 185, - "t": 1695825898671, - "p": 0.73 - }, - { - "x": 201, - "y": 186, - "t": 1695825898737, - "p": 0.68 - }, - { - "x": 204, - "y": 184, - "t": 1695825898803, - "p": 0.7 - }, - { - "x": 209, - "y": 180, - "t": 1695825898836, - "p": 0.77 - }, - { - "x": 212, - "y": 177, - "t": 1695825898854, - "p": 0.72 - }, - { - "x": 213, - "y": 174, - "t": 1695825898887, - "p": 0.68 - }, - { - "x": 217, - "y": 175, - "t": 1695825899003, - "p": 0.72 - }, - { - "x": 221, - "y": 179, - "t": 1695825899020, - "p": 0.76 - }, - { - "x": 225, - "y": 181, - "t": 1695825899053, - "p": 0.73 - }, - { - "x": 228, - "y": 183, - "t": 1695825899088, - "p": 0.7 - }, - { - "x": 225, - "y": 183, - "t": 1695825899170, - "p": 0.68 - }, - { - "x": 220, - "y": 183, - "t": 1695825899187, - "p": 0.74 - }, - { - "x": 212, - "y": 182, - "t": 1695825899203, - "p": 0.8 - }, - { - "x": 205, - "y": 180, - "t": 1695825899220, - "p": 0.79 - }, - { - "x": 201, - "y": 179, - "t": 1695825899236, - "p": 0.72 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 199, - "y": 150, - "t": 1695825899936, - "p": 0.1 - } - ] - } -] diff --git a/test/integration/strokes/interact/rome.json b/test/integration/strokes/interact/rome.json deleted file mode 100644 index a65915de5..000000000 --- a/test/integration/strokes/interact/rome.json +++ /dev/null @@ -1,434 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 101, - "y": 173, - "t": 1695825959660, - "p": 0.1 - }, - { - "x": 101, - "y": 170, - "t": 1695825959709, - "p": 0.68 - }, - { - "x": 104, - "y": 167, - "t": 1695825959760, - "p": 0.72 - }, - { - "x": 109, - "y": 164, - "t": 1695825959793, - "p": 0.76 - }, - { - "x": 110, - "y": 160, - "t": 1695825959809, - "p": 0.72 - }, - { - "x": 109, - "y": 157, - "t": 1695825959826, - "p": 0.68 - }, - { - "x": 106, - "y": 155, - "t": 1695825959842, - "p": 0.7 - }, - { - "x": 111, - "y": 157, - "t": 1695825959925, - "p": 0.75 - }, - { - "x": 115, - "y": 157, - "t": 1695825959942, - "p": 0.71 - }, - { - "x": 119, - "y": 158, - "t": 1695825959959, - "p": 0.72 - }, - { - "x": 122, - "y": 164, - "t": 1695825959992, - "p": 0.78 - }, - { - "x": 120, - "y": 168, - "t": 1695825960009, - "p": 0.73 - }, - { - "x": 118, - "y": 172, - "t": 1695825960025, - "p": 0.73 - }, - { - "x": 116, - "y": 176, - "t": 1695825960060, - "p": 0.73 - }, - { - "x": 120, - "y": 178, - "t": 1695825960144, - "p": 0.73 - }, - { - "x": 123, - "y": 178, - "t": 1695825960159, - "p": 0.68 - }, - { - "x": 126, - "y": 178, - "t": 1695825960193, - "p": 0.68 - }, - { - "x": 129, - "y": 178, - "t": 1695825960209, - "p": 0.68 - }, - { - "x": 134, - "y": 177, - "t": 1695825960226, - "p": 0.75 - }, - { - "x": 138, - "y": 175, - "t": 1695825960242, - "p": 0.73 - }, - { - "x": 138, - "y": 180, - "t": 1695825960409, - "p": 0.74 - }, - { - "x": 144, - "y": 180, - "t": 1695825960443, - "p": 0.77 - }, - { - "x": 149, - "y": 180, - "t": 1695825960476, - "p": 0.74 - }, - { - "x": 147, - "y": 176, - "t": 1695825960559, - "p": 0.73 - }, - { - "x": 141, - "y": 173, - "t": 1695825960575, - "p": 0.78 - }, - { - "x": 137, - "y": 172, - "t": 1695825960592, - "p": 0.72 - }, - { - "x": 141, - "y": 172, - "t": 1695825960675, - "p": 0.71 - }, - { - "x": 146, - "y": 172, - "t": 1695825960692, - "p": 0.74 - }, - { - "x": 150, - "y": 172, - "t": 1695825960708, - "p": 0.71 - }, - { - "x": 153, - "y": 172, - "t": 1695825960725, - "p": 0.68 - }, - { - "x": 156, - "y": 172, - "t": 1695825960772, - "p": 0.68 - }, - { - "x": 159, - "y": 170, - "t": 1695825960792, - "p": 0.7 - }, - { - "x": 162, - "y": 166, - "t": 1695825960808, - "p": 0.74 - }, - { - "x": 165, - "y": 163, - "t": 1695825960825, - "p": 0.72 - }, - { - "x": 168, - "y": 162, - "t": 1695825960841, - "p": 0.68 - }, - { - "x": 172, - "y": 164, - "t": 1695825960908, - "p": 0.73 - }, - { - "x": 175, - "y": 168, - "t": 1695825960925, - "p": 0.74 - }, - { - "x": 176, - "y": 175, - "t": 1695825960942, - "p": 0.79 - }, - { - "x": 176, - "y": 180, - "t": 1695825960959, - "p": 0.74 - }, - { - "x": 176, - "y": 183, - "t": 1695825960975, - "p": 0.68 - }, - { - "x": 177, - "y": 180, - "t": 1695825961075, - "p": 0.68 - }, - { - "x": 178, - "y": 176, - "t": 1695825961091, - "p": 0.72 - }, - { - "x": 180, - "y": 173, - "t": 1695825961108, - "p": 0.7 - }, - { - "x": 182, - "y": 169, - "t": 1695825961125, - "p": 0.73 - }, - { - "x": 185, - "y": 166, - "t": 1695825961141, - "p": 0.72 - }, - { - "x": 188, - "y": 171, - "t": 1695825961241, - "p": 0.76 - }, - { - "x": 188, - "y": 175, - "t": 1695825961258, - "p": 0.71 - }, - { - "x": 187, - "y": 180, - "t": 1695825961275, - "p": 0.75 - }, - { - "x": 187, - "y": 183, - "t": 1695825961307, - "p": 0.68 - }, - { - "x": 188, - "y": 177, - "t": 1695825961374, - "p": 0.77 - }, - { - "x": 191, - "y": 170, - "t": 1695825961392, - "p": 0.79 - }, - { - "x": 195, - "y": 166, - "t": 1695825961407, - "p": 0.76 - }, - { - "x": 198, - "y": 163, - "t": 1695825961425, - "p": 0.72 - }, - { - "x": 199, - "y": 166, - "t": 1695825961497, - "p": 0.68 - }, - { - "x": 199, - "y": 169, - "t": 1695825961508, - "p": 0.68 - }, - { - "x": 199, - "y": 174, - "t": 1695825961524, - "p": 0.74 - }, - { - "x": 199, - "y": 177, - "t": 1695825961542, - "p": 0.68 - }, - { - "x": 199, - "y": 180, - "t": 1695825961557, - "p": 0.68 - }, - { - "x": 203, - "y": 180, - "t": 1695825961608, - "p": 0.71 - }, - { - "x": 207, - "y": 179, - "t": 1695825961624, - "p": 0.72 - }, - { - "x": 212, - "y": 177, - "t": 1695825961642, - "p": 0.75 - }, - { - "x": 222, - "y": 173, - "t": 1695825961657, - "p": 0.67 - }, - { - "x": 228, - "y": 171, - "t": 1695825961675, - "p": 0.77 - }, - { - "x": 231, - "y": 169, - "t": 1695825961724, - "p": 0.7 - }, - { - "x": 227, - "y": 170, - "t": 1695825961795, - "p": 0.72 - }, - { - "x": 218, - "y": 173, - "t": 1695825961825, - "p": 0.82 - }, - { - "x": 214, - "y": 175, - "t": 1695825961840, - "p": 0.73 - }, - { - "x": 220, - "y": 175, - "t": 1695825961891, - "p": 0.77 - }, - { - "x": 223, - "y": 176, - "t": 1695825961908, - "p": 0.68 - }, - { - "x": 226, - "y": 177, - "t": 1695825961924, - "p": 0.68 - }, - { - "x": 230, - "y": 177, - "t": 1695825961941, - "p": 0.71 - } - ] - } -] diff --git a/test/integration/strokes/interact/tokyo.json b/test/integration/strokes/interact/tokyo.json deleted file mode 100644 index 6a96ba5dd..000000000 --- a/test/integration/strokes/interact/tokyo.json +++ /dev/null @@ -1,578 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 120, - "y": 140, - "t": 1695826076775, - "p": 0.1 - }, - { - "x": 120, - "y": 145, - "t": 1695826076841, - "p": 0.74 - }, - { - "x": 119, - "y": 150, - "t": 1695826076858, - "p": 0.75 - }, - { - "x": 119, - "y": 154, - "t": 1695826076875, - "p": 0.71 - }, - { - "x": 119, - "y": 161, - "t": 1695826076891, - "p": 0.78 - }, - { - "x": 119, - "y": 169, - "t": 1695826076908, - "p": 0.8 - }, - { - "x": 119, - "y": 173, - "t": 1695826076924, - "p": 0.71 - }, - { - "x": 119, - "y": 176, - "t": 1695826076942, - "p": 0.68 - }, - { - "x": 120, - "y": 179, - "t": 1695826076975, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 117, - "y": 161, - "t": 1695826077479, - "p": 0.1 - }, - { - "x": 121, - "y": 159, - "t": 1695826077525, - "p": 0.73 - }, - { - "x": 125, - "y": 159, - "t": 1695826077574, - "p": 0.71 - }, - { - "x": 128, - "y": 157, - "t": 1695826077624, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 131, - "y": 167, - "t": 1695826078034, - "p": 0.1 - }, - { - "x": 126, - "y": 173, - "t": 1695826078074, - "p": 0.8 - }, - { - "x": 126, - "y": 176, - "t": 1695826078107, - "p": 0.68 - }, - { - "x": 130, - "y": 179, - "t": 1695826078140, - "p": 0.74 - }, - { - "x": 133, - "y": 179, - "t": 1695826078157, - "p": 0.68 - }, - { - "x": 138, - "y": 179, - "t": 1695826078174, - "p": 0.74 - }, - { - "x": 142, - "y": 179, - "t": 1695826078191, - "p": 0.71 - }, - { - "x": 145, - "y": 178, - "t": 1695826078207, - "p": 0.68 - }, - { - "x": 148, - "y": 178, - "t": 1695826078224, - "p": 0.68 - }, - { - "x": 148, - "y": 175, - "t": 1695826078257, - "p": 0.68 - }, - { - "x": 144, - "y": 172, - "t": 1695826078273, - "p": 0.74 - }, - { - "x": 138, - "y": 170, - "t": 1695826078290, - "p": 0.77 - }, - { - "x": 135, - "y": 169, - "t": 1695826078324, - "p": 0.68 - }, - { - "x": 130, - "y": 173, - "t": 1695826078357, - "p": 0.77 - }, - { - "x": 130, - "y": 176, - "t": 1695826078423, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 155, - "y": 143, - "t": 1695826078713, - "p": 0.1 - }, - { - "x": 155, - "y": 147, - "t": 1695826078740, - "p": 0.71 - }, - { - "x": 155, - "y": 155, - "t": 1695826078756, - "p": 0.8 - }, - { - "x": 156, - "y": 162, - "t": 1695826078774, - "p": 0.79 - }, - { - "x": 156, - "y": 167, - "t": 1695826078789, - "p": 0.74 - }, - { - "x": 156, - "y": 171, - "t": 1695826078806, - "p": 0.71 - }, - { - "x": 156, - "y": 175, - "t": 1695826078823, - "p": 0.71 - }, - { - "x": 157, - "y": 178, - "t": 1695826078840, - "p": 0.68 - }, - { - "x": 158, - "y": 181, - "t": 1695826078873, - "p": 0.68 - }, - { - "x": 158, - "y": 178, - "t": 1695826079057, - "p": 0.68 - }, - { - "x": 158, - "y": 173, - "t": 1695826079073, - "p": 0.74 - }, - { - "x": 158, - "y": 168, - "t": 1695826079090, - "p": 0.74 - }, - { - "x": 158, - "y": 164, - "t": 1695826079106, - "p": 0.71 - }, - { - "x": 159, - "y": 161, - "t": 1695826079123, - "p": 0.68 - }, - { - "x": 161, - "y": 158, - "t": 1695826079139, - "p": 0.7 - }, - { - "x": 165, - "y": 157, - "t": 1695826079173, - "p": 0.72 - }, - { - "x": 169, - "y": 158, - "t": 1695826079206, - "p": 0.72 - }, - { - "x": 171, - "y": 162, - "t": 1695826079239, - "p": 0.73 - }, - { - "x": 170, - "y": 165, - "t": 1695826079256, - "p": 0.68 - }, - { - "x": 169, - "y": 168, - "t": 1695826079272, - "p": 0.68 - }, - { - "x": 166, - "y": 170, - "t": 1695826079306, - "p": 0.7 - }, - { - "x": 169, - "y": 174, - "t": 1695826079456, - "p": 0.74 - }, - { - "x": 172, - "y": 176, - "t": 1695826079489, - "p": 0.7 - }, - { - "x": 176, - "y": 177, - "t": 1695826079523, - "p": 0.72 - }, - { - "x": 180, - "y": 177, - "t": 1695826079539, - "p": 0.71 - }, - { - "x": 183, - "y": 177, - "t": 1695826079557, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 187, - "y": 163, - "t": 1695826079925, - "p": 0.1 - }, - { - "x": 187, - "y": 168, - "t": 1695826079973, - "p": 0.74 - }, - { - "x": 187, - "y": 173, - "t": 1695826079988, - "p": 0.74 - }, - { - "x": 189, - "y": 177, - "t": 1695826080005, - "p": 0.73 - }, - { - "x": 192, - "y": 179, - "t": 1695826080039, - "p": 0.7 - }, - { - "x": 195, - "y": 179, - "t": 1695826080072, - "p": 0.68 - }, - { - "x": 199, - "y": 176, - "t": 1695826080122, - "p": 0.74 - }, - { - "x": 203, - "y": 173, - "t": 1695826080138, - "p": 0.74 - }, - { - "x": 206, - "y": 169, - "t": 1695826080155, - "p": 0.74 - }, - { - "x": 208, - "y": 166, - "t": 1695826080188, - "p": 0.7 - }, - { - "x": 205, - "y": 168, - "t": 1695826080255, - "p": 0.7 - }, - { - "x": 201, - "y": 174, - "t": 1695826080271, - "p": 0.79 - }, - { - "x": 196, - "y": 181, - "t": 1695826080288, - "p": 0.81 - }, - { - "x": 193, - "y": 188, - "t": 1695826080305, - "p": 0.79 - }, - { - "x": 191, - "y": 193, - "t": 1695826080322, - "p": 0.75 - }, - { - "x": 189, - "y": 196, - "t": 1695826080338, - "p": 0.7 - }, - { - "x": 186, - "y": 200, - "t": 1695826080355, - "p": 0.74 - }, - { - "x": 184, - "y": 204, - "t": 1695826080371, - "p": 0.73 - }, - { - "x": 189, - "y": 200, - "t": 1695826080496, - "p": 0.77 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 219, - "y": 173, - "t": 1695826080817, - "p": 0.1 - }, - { - "x": 216, - "y": 173, - "t": 1695826080838, - "p": 0.68 - }, - { - "x": 213, - "y": 177, - "t": 1695826080855, - "p": 0.74 - }, - { - "x": 212, - "y": 181, - "t": 1695826080872, - "p": 0.72 - }, - { - "x": 212, - "y": 184, - "t": 1695826080905, - "p": 0.68 - }, - { - "x": 215, - "y": 184, - "t": 1695826080938, - "p": 0.68 - }, - { - "x": 218, - "y": 184, - "t": 1695826080955, - "p": 0.68 - }, - { - "x": 222, - "y": 184, - "t": 1695826080971, - "p": 0.71 - }, - { - "x": 227, - "y": 184, - "t": 1695826080988, - "p": 0.74 - }, - { - "x": 231, - "y": 183, - "t": 1695826081004, - "p": 0.72 - }, - { - "x": 234, - "y": 181, - "t": 1695826081022, - "p": 0.7 - }, - { - "x": 233, - "y": 177, - "t": 1695826081055, - "p": 0.72 - }, - { - "x": 229, - "y": 173, - "t": 1695826081088, - "p": 0.76 - }, - { - "x": 225, - "y": 172, - "t": 1695826081121, - "p": 0.72 - }, - { - "x": 222, - "y": 172, - "t": 1695826081137, - "p": 0.68 - }, - { - "x": 216, - "y": 175, - "t": 1695826081170, - "p": 0.78 - }, - { - "x": 213, - "y": 177, - "t": 1695826081188, - "p": 0.7 - } - ] - } -] diff --git a/test/integration/strokes/line.json b/test/integration/strokes/line.json deleted file mode 100644 index 4fd10495c..000000000 --- a/test/integration/strokes/line.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "p": [ - 0.5, - 0.77, - 0.63, - 0.59, - 0.55, - 0.53, - 0.5, - 0.52, - 0.63, - 0.75, - 0.68 - ], - "t": [ - 1688462301914, - 1688462302006, - 1688462302021, - 1688462302038, - 1688462302055, - 1688462302072, - 1688462302088, - 1688462302105, - 1688462302121, - 1688462302138, - 1688462302180 - ], - "x": [ - 227, - 232, - 244, - 261, - 281, - 303, - 328, - 351, - 365, - 370, - 373 - ], - "y": [ - 177, - 178, - 179, - 179, - 179, - 179, - 179, - 179, - 178, - 177, - 176 - ] - } -] diff --git a/test/integration/strokes/multiple-inputs/1943.json b/test/integration/strokes/multiple-inputs/1943.json deleted file mode 100644 index 8f1c2732a..000000000 --- a/test/integration/strokes/multiple-inputs/1943.json +++ /dev/null @@ -1,688 +0,0 @@ -[ - { - "id": "mouse-1694171176026", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 165, - "y": 80, - "t": 1694171176026, - "p": 0.1 - }, - { - "x": 168, - "y": 78, - "t": 1694171176066, - "p": 0.7 - }, - { - "x": 174, - "y": 74, - "t": 1694171176084, - "p": 0.79 - }, - { - "x": 206, - "y": 50, - "t": 1694171176099, - "p": 0.37 - }, - { - "x": 220, - "y": 38, - "t": 1694171176116, - "p": 0.57 - }, - { - "x": 227, - "y": 29, - "t": 1694171176132, - "p": 0.66 - }, - { - "x": 230, - "y": 24, - "t": 1694171176149, - "p": 0.76 - }, - { - "x": 231, - "y": 20, - "t": 1694171176167, - "p": 0.72 - }, - { - "x": 229, - "y": 23, - "t": 1694171176216, - "p": 0.7 - }, - { - "x": 229, - "y": 43, - "t": 1694171176234, - "p": 0.55 - }, - { - "x": 231, - "y": 61, - "t": 1694171176249, - "p": 0.57 - }, - { - "x": 231, - "y": 76, - "t": 1694171176267, - "p": 0.61 - }, - { - "x": 230, - "y": 87, - "t": 1694171176283, - "p": 0.67 - }, - { - "x": 228, - "y": 97, - "t": 1694171176300, - "p": 0.68 - } - ], - "length": 351.94248431746627, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171176928", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 262, - "y": 33, - "t": 1694171176928, - "p": 0.1 - }, - { - "x": 255, - "y": 37, - "t": 1694171176948, - "p": 0.8 - }, - { - "x": 251, - "y": 41, - "t": 1694171176966, - "p": 0.76 - }, - { - "x": 249, - "y": 44, - "t": 1694171176982, - "p": 0.7 - }, - { - "x": 248, - "y": 48, - "t": 1694171176999, - "p": 0.72 - }, - { - "x": 252, - "y": 52, - "t": 1694171177015, - "p": 0.76 - }, - { - "x": 256, - "y": 53, - "t": 1694171177032, - "p": 0.72 - }, - { - "x": 260, - "y": 53, - "t": 1694171177049, - "p": 0.71 - }, - { - "x": 272, - "y": 54, - "t": 1694171177066, - "p": 0.65 - }, - { - "x": 291, - "y": 56, - "t": 1694171177082, - "p": 0.56 - }, - { - "x": 300, - "y": 54, - "t": 1694171177099, - "p": 0.81 - }, - { - "x": 304, - "y": 51, - "t": 1694171177115, - "p": 0.74 - }, - { - "x": 306, - "y": 48, - "t": 1694171177132, - "p": 0.7 - }, - { - "x": 304, - "y": 43, - "t": 1694171177148, - "p": 0.75 - }, - { - "x": 297, - "y": 40, - "t": 1694171177166, - "p": 0.79 - }, - { - "x": 291, - "y": 36, - "t": 1694171177181, - "p": 0.79 - }, - { - "x": 288, - "y": 35, - "t": 1694171177216, - "p": 0.68 - }, - { - "x": 285, - "y": 34, - "t": 1694171177232, - "p": 0.68 - }, - { - "x": 281, - "y": 31, - "t": 1694171177249, - "p": 0.74 - }, - { - "x": 274, - "y": 29, - "t": 1694171177266, - "p": 0.79 - }, - { - "x": 271, - "y": 29, - "t": 1694171177281, - "p": 0.68 - }, - { - "x": 265, - "y": 31, - "t": 1694171177299, - "p": 0.77 - } - ], - "length": 396.41071971359753, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171177782", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 301, - "y": 37, - "t": 1694171177782, - "p": 0.1 - }, - { - "x": 300, - "y": 42, - "t": 1694171177832, - "p": 0.75 - }, - { - "x": 306, - "y": 50, - "t": 1694171177849, - "p": 0.68 - }, - { - "x": 308, - "y": 54, - "t": 1694171177865, - "p": 0.73 - }, - { - "x": 310, - "y": 57, - "t": 1694171177881, - "p": 0.7 - }, - { - "x": 312, - "y": 60, - "t": 1694171177898, - "p": 0.7 - }, - { - "x": 312, - "y": 63, - "t": 1694171177914, - "p": 0.68 - }, - { - "x": 312, - "y": 67, - "t": 1694171177932, - "p": 0.71 - }, - { - "x": 311, - "y": 71, - "t": 1694171177947, - "p": 0.72 - }, - { - "x": 309, - "y": 76, - "t": 1694171177982, - "p": 0.75 - }, - { - "x": 305, - "y": 80, - "t": 1694171177998, - "p": 0.76 - }, - { - "x": 301, - "y": 85, - "t": 1694171178015, - "p": 0.77 - }, - { - "x": 295, - "y": 88, - "t": 1694171178031, - "p": 0.78 - }, - { - "x": 290, - "y": 90, - "t": 1694171178048, - "p": 0.75 - }, - { - "x": 284, - "y": 91, - "t": 1694171178064, - "p": 0.77 - }, - { - "x": 281, - "y": 91, - "t": 1694171178082, - "p": 0.68 - }, - { - "x": 276, - "y": 92, - "t": 1694171178097, - "p": 0.75 - }, - { - "x": 268, - "y": 92, - "t": 1694171178115, - "p": 0.8 - }, - { - "x": 261, - "y": 92, - "t": 1694171178131, - "p": 0.78 - }, - { - "x": 270, - "y": 92, - "t": 1694171178214, - "p": 0.81 - }, - { - "x": 280, - "y": 92, - "t": 1694171178218, - "p": 0.68 - } - ], - "length": 418.89121791708436, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171178666", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 351, - "y": 32, - "t": 1694171178666, - "p": 0.1 - }, - { - "x": 349, - "y": 35, - "t": 1694171178730, - "p": 0.7 - }, - { - "x": 347, - "y": 39, - "t": 1694171178748, - "p": 0.73 - }, - { - "x": 345, - "y": 42, - "t": 1694171178764, - "p": 0.7 - }, - { - "x": 343, - "y": 45, - "t": 1694171178781, - "p": 0.7 - }, - { - "x": 341, - "y": 49, - "t": 1694171178797, - "p": 0.73 - }, - { - "x": 339, - "y": 53, - "t": 1694171178815, - "p": 0.73 - }, - { - "x": 339, - "y": 56, - "t": 1694171178831, - "p": 0.68 - }, - { - "x": 343, - "y": 57, - "t": 1694171178981, - "p": 0.72 - }, - { - "x": 350, - "y": 55, - "t": 1694171178997, - "p": 0.79 - }, - { - "x": 353, - "y": 56, - "t": 1694171179015, - "p": 0.68 - }, - { - "x": 357, - "y": 56, - "t": 1694171179084, - "p": 0.71 - }, - { - "x": 362, - "y": 56, - "t": 1694171179097, - "p": 0.74 - }, - { - "x": 369, - "y": 55, - "t": 1694171179113, - "p": 0.79 - }, - { - "x": 374, - "y": 55, - "t": 1694171179131, - "p": 0.74 - }, - { - "x": 372, - "y": 60, - "t": 1694171179231, - "p": 0.75 - }, - { - "x": 370, - "y": 63, - "t": 1694171179264, - "p": 0.7 - }, - { - "x": 368, - "y": 66, - "t": 1694171179281, - "p": 0.7 - }, - { - "x": 367, - "y": 69, - "t": 1694171179298, - "p": 0.68 - }, - { - "x": 367, - "y": 72, - "t": 1694171179314, - "p": 0.68 - }, - { - "x": 367, - "y": 78, - "t": 1694171179347, - "p": 0.77 - }, - { - "x": 368, - "y": 81, - "t": 1694171179364, - "p": 0.68 - }, - { - "x": 369, - "y": 84, - "t": 1694171179381, - "p": 0.68 - } - ], - "length": 446.40839398843275, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171179854", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 388, - "y": 39, - "t": 1694171179854, - "p": 0.1 - }, - { - "x": 393, - "y": 35, - "t": 1694171179954, - "p": 0.77 - }, - { - "x": 397, - "y": 34, - "t": 1694171179970, - "p": 0.72 - }, - { - "x": 401, - "y": 33, - "t": 1694171179988, - "p": 0.72 - }, - { - "x": 403, - "y": 38, - "t": 1694171180088, - "p": 0.75 - }, - { - "x": 400, - "y": 44, - "t": 1694171180103, - "p": 0.78 - }, - { - "x": 399, - "y": 47, - "t": 1694171180121, - "p": 0.68 - }, - { - "x": 396, - "y": 49, - "t": 1694171180154, - "p": 0.7 - }, - { - "x": 400, - "y": 48, - "t": 1694171180221, - "p": 0.72 - }, - { - "x": 403, - "y": 48, - "t": 1694171180237, - "p": 0.68 - }, - { - "x": 407, - "y": 48, - "t": 1694171180270, - "p": 0.71 - }, - { - "x": 412, - "y": 49, - "t": 1694171180287, - "p": 0.75 - }, - { - "x": 415, - "y": 51, - "t": 1694171180303, - "p": 0.7 - }, - { - "x": 417, - "y": 54, - "t": 1694171180321, - "p": 0.7 - }, - { - "x": 418, - "y": 57, - "t": 1694171180353, - "p": 0.68 - }, - { - "x": 415, - "y": 62, - "t": 1694171180387, - "p": 0.76 - }, - { - "x": 412, - "y": 65, - "t": 1694171180420, - "p": 0.72 - }, - { - "x": 408, - "y": 67, - "t": 1694171180436, - "p": 0.73 - }, - { - "x": 403, - "y": 70, - "t": 1694171180453, - "p": 0.76 - }, - { - "x": 400, - "y": 71, - "t": 1694171180470, - "p": 0.68 - }, - { - "x": 397, - "y": 71, - "t": 1694171180588, - "p": 0.68 - } - ], - "length": 476.60012222966833, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/multiple-inputs/1993.json b/test/integration/strokes/multiple-inputs/1993.json deleted file mode 100644 index ceca2c6c3..000000000 --- a/test/integration/strokes/multiple-inputs/1993.json +++ /dev/null @@ -1,722 +0,0 @@ -[ - { - "id": "mouse-1694173367053", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 234, - "y": 78, - "t": 1694173367053, - "p": 0.1 - }, - { - "x": 242, - "y": 70, - "t": 1694173367121, - "p": 0.66 - }, - { - "x": 253, - "y": 55, - "t": 1694173367136, - "p": 0.57 - }, - { - "x": 259, - "y": 46, - "t": 1694173367154, - "p": 0.67 - }, - { - "x": 264, - "y": 37, - "t": 1694173367171, - "p": 0.68 - }, - { - "x": 267, - "y": 28, - "t": 1694173367187, - "p": 0.82 - }, - { - "x": 267, - "y": 23, - "t": 1694173367204, - "p": 0.74 - }, - { - "x": 267, - "y": 36, - "t": 1694173367270, - "p": 0.64 - }, - { - "x": 267, - "y": 51, - "t": 1694173367286, - "p": 0.61 - }, - { - "x": 267, - "y": 64, - "t": 1694173367304, - "p": 0.64 - }, - { - "x": 268, - "y": 72, - "t": 1694173367319, - "p": 0.8 - }, - { - "x": 269, - "y": 81, - "t": 1694173367337, - "p": 0.81 - }, - { - "x": 270, - "y": 87, - "t": 1694173367353, - "p": 0.77 - }, - { - "x": 272, - "y": 90, - "t": 1694173367371, - "p": 0.7 - } - ], - "length": 379.9775148699389, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173367903", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 292, - "y": 38, - "t": 1694173367903, - "p": 0.1 - }, - { - "x": 286, - "y": 41, - "t": 1694173367937, - "p": 0.78 - }, - { - "x": 282, - "y": 46, - "t": 1694173367954, - "p": 0.77 - }, - { - "x": 280, - "y": 50, - "t": 1694173367970, - "p": 0.73 - }, - { - "x": 282, - "y": 53, - "t": 1694173368004, - "p": 0.7 - }, - { - "x": 288, - "y": 54, - "t": 1694173368019, - "p": 0.77 - }, - { - "x": 294, - "y": 54, - "t": 1694173368037, - "p": 0.77 - }, - { - "x": 299, - "y": 52, - "t": 1694173368054, - "p": 0.75 - }, - { - "x": 303, - "y": 50, - "t": 1694173368070, - "p": 0.73 - }, - { - "x": 305, - "y": 44, - "t": 1694173368120, - "p": 0.77 - }, - { - "x": 303, - "y": 39, - "t": 1694173368137, - "p": 0.75 - }, - { - "x": 301, - "y": 36, - "t": 1694173368153, - "p": 0.7 - }, - { - "x": 299, - "y": 33, - "t": 1694173368170, - "p": 0.7 - }, - { - "x": 292, - "y": 32, - "t": 1694173368204, - "p": 0.79 - }, - { - "x": 285, - "y": 32, - "t": 1694173368219, - "p": 0.78 - }, - { - "x": 282, - "y": 34, - "t": 1694173368237, - "p": 0.7 - }, - { - "x": 279, - "y": 37, - "t": 1694173368252, - "p": 0.72 - }, - { - "x": 278, - "y": 40, - "t": 1694173368286, - "p": 0.68 - }, - { - "x": 288, - "y": 40, - "t": 1694173368353, - "p": 0.68 - } - ], - "length": 391.5936604914115, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173368722", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 301, - "y": 37, - "t": 1694173368722, - "p": 0.1 - }, - { - "x": 303, - "y": 42, - "t": 1694173368771, - "p": 0.75 - }, - { - "x": 317, - "y": 54, - "t": 1694173368788, - "p": 0.57 - }, - { - "x": 327, - "y": 63, - "t": 1694173368804, - "p": 0.63 - }, - { - "x": 332, - "y": 69, - "t": 1694173368822, - "p": 0.8 - }, - { - "x": 333, - "y": 75, - "t": 1694173368837, - "p": 0.77 - }, - { - "x": 333, - "y": 78, - "t": 1694173368855, - "p": 0.68 - }, - { - "x": 334, - "y": 81, - "t": 1694173368889, - "p": 0.68 - }, - { - "x": 330, - "y": 84, - "t": 1694173368904, - "p": 0.74 - }, - { - "x": 325, - "y": 87, - "t": 1694173368921, - "p": 0.76 - }, - { - "x": 314, - "y": 93, - "t": 1694173368937, - "p": 0.65 - }, - { - "x": 303, - "y": 97, - "t": 1694173368955, - "p": 0.66 - }, - { - "x": 300, - "y": 97, - "t": 1694173368971, - "p": 0.68 - }, - { - "x": 297, - "y": 95, - "t": 1694173369022, - "p": 0.7 - } - ], - "length": 402.26989499669963, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173369439", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 345, - "y": 37, - "t": 1694173369439, - "p": 0.1 - }, - { - "x": 343, - "y": 41, - "t": 1694173369455, - "p": 0.73 - }, - { - "x": 341, - "y": 45, - "t": 1694173369488, - "p": 0.73 - }, - { - "x": 340, - "y": 48, - "t": 1694173369505, - "p": 0.68 - }, - { - "x": 344, - "y": 51, - "t": 1694173369539, - "p": 0.74 - }, - { - "x": 348, - "y": 52, - "t": 1694173369554, - "p": 0.72 - }, - { - "x": 352, - "y": 52, - "t": 1694173369571, - "p": 0.71 - }, - { - "x": 356, - "y": 51, - "t": 1694173369587, - "p": 0.72 - }, - { - "x": 360, - "y": 49, - "t": 1694173369604, - "p": 0.73 - }, - { - "x": 366, - "y": 45, - "t": 1694173369621, - "p": 0.79 - }, - { - "x": 369, - "y": 41, - "t": 1694173369638, - "p": 0.74 - }, - { - "x": 370, - "y": 38, - "t": 1694173369655, - "p": 0.68 - }, - { - "x": 368, - "y": 34, - "t": 1694173369671, - "p": 0.73 - }, - { - "x": 365, - "y": 31, - "t": 1694173369688, - "p": 0.72 - }, - { - "x": 357, - "y": 31, - "t": 1694173369704, - "p": 0.8 - }, - { - "x": 344, - "y": 33, - "t": 1694173369721, - "p": 0.64 - }, - { - "x": 335, - "y": 36, - "t": 1694173369738, - "p": 0.82 - }, - { - "x": 329, - "y": 40, - "t": 1694173369754, - "p": 0.79 - }, - { - "x": 326, - "y": 42, - "t": 1694173369787, - "p": 0.7 - }, - { - "x": 330, - "y": 44, - "t": 1694173369854, - "p": 0.73 - }, - { - "x": 338, - "y": 46, - "t": 1694173369865, - "p": 0.8 - } - ], - "length": 459.06621957468275, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173370316", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 367, - "y": 33, - "t": 1694173370316, - "p": 0.1 - }, - { - "x": 368, - "y": 36, - "t": 1694173370349, - "p": 0.68 - }, - { - "x": 370, - "y": 48, - "t": 1694173370382, - "p": 0.65 - }, - { - "x": 373, - "y": 57, - "t": 1694173370399, - "p": 0.82 - }, - { - "x": 375, - "y": 63, - "t": 1694173370415, - "p": 0.77 - }, - { - "x": 376, - "y": 69, - "t": 1694173370432, - "p": 0.77 - }, - { - "x": 378, - "y": 73, - "t": 1694173370449, - "p": 0.73 - }, - { - "x": 379, - "y": 76, - "t": 1694173370465, - "p": 0.68 - }, - { - "x": 375, - "y": 80, - "t": 1694173370548, - "p": 0.76 - }, - { - "x": 370, - "y": 82, - "t": 1694173370564, - "p": 0.75 - }, - { - "x": 360, - "y": 88, - "t": 1694173370582, - "p": 0.66 - }, - { - "x": 356, - "y": 91, - "t": 1694173370614, - "p": 0.74 - } - ], - "length": 441.04095436363826, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173371113", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 383, - "y": 36, - "t": 1694173371113, - "p": 0.1 - }, - { - "x": 386, - "y": 34, - "t": 1694173371198, - "p": 0.7 - }, - { - "x": 391, - "y": 30, - "t": 1694173371214, - "p": 0.77 - }, - { - "x": 395, - "y": 30, - "t": 1694173371231, - "p": 0.71 - }, - { - "x": 400, - "y": 29, - "t": 1694173371247, - "p": 0.75 - }, - { - "x": 405, - "y": 28, - "t": 1694173371264, - "p": 0.75 - }, - { - "x": 408, - "y": 29, - "t": 1694173371315, - "p": 0.68 - }, - { - "x": 409, - "y": 34, - "t": 1694173371331, - "p": 0.75 - }, - { - "x": 406, - "y": 38, - "t": 1694173371348, - "p": 0.74 - }, - { - "x": 401, - "y": 44, - "t": 1694173371364, - "p": 0.8 - }, - { - "x": 398, - "y": 46, - "t": 1694173371381, - "p": 0.7 - }, - { - "x": 394, - "y": 47, - "t": 1694173371398, - "p": 0.72 - }, - { - "x": 399, - "y": 47, - "t": 1694173371465, - "p": 0.74 - }, - { - "x": 402, - "y": 47, - "t": 1694173371480, - "p": 0.68 - }, - { - "x": 407, - "y": 48, - "t": 1694173371514, - "p": 0.75 - }, - { - "x": 410, - "y": 51, - "t": 1694173371531, - "p": 0.72 - }, - { - "x": 410, - "y": 58, - "t": 1694173371564, - "p": 0.78 - }, - { - "x": 408, - "y": 62, - "t": 1694173371581, - "p": 0.73 - }, - { - "x": 406, - "y": 65, - "t": 1694173371597, - "p": 0.7 - }, - { - "x": 403, - "y": 68, - "t": 1694173371614, - "p": 0.72 - }, - { - "x": 400, - "y": 70, - "t": 1694173371630, - "p": 0.7 - }, - { - "x": 397, - "y": 71, - "t": 1694173371647, - "p": 0.68 - }, - { - "x": 393, - "y": 72, - "t": 1694173371663, - "p": 0.72 - }, - { - "x": 389, - "y": 73, - "t": 1694173371681, - "p": 0.72 - } - ], - "length": 489.371132013743, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/multiple-inputs/centralProcessingUnit.json b/test/integration/strokes/multiple-inputs/centralProcessingUnit.json deleted file mode 100644 index fceddeba6..000000000 --- a/test/integration/strokes/multiple-inputs/centralProcessingUnit.json +++ /dev/null @@ -1,1820 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 29, - "y": 62, - "t": 1695828886232, - "p": 0.17 - }, - { - "x": 26, - "y": 62, - "t": 1695828886313, - "p": 0.68 - }, - { - "x": 21, - "y": 62, - "t": 1695828886347, - "p": 0.74 - }, - { - "x": 17, - "y": 63, - "t": 1695828886364, - "p": 0.72 - }, - { - "x": 14, - "y": 64, - "t": 1695828886381, - "p": 0.68 - }, - { - "x": 11, - "y": 66, - "t": 1695828886414, - "p": 0.7 - }, - { - "x": 10, - "y": 70, - "t": 1695828886463, - "p": 0.72 - }, - { - "x": 8, - "y": 73, - "t": 1695828886497, - "p": 0.7 - }, - { - "x": 10, - "y": 76, - "t": 1695828886547, - "p": 0.7 - }, - { - "x": 15, - "y": 78, - "t": 1695828886580, - "p": 0.75 - }, - { - "x": 19, - "y": 78, - "t": 1695828886613, - "p": 0.71 - }, - { - "x": 22, - "y": 78, - "t": 1695828886630, - "p": 0.68 - }, - { - "x": 25, - "y": 78, - "t": 1695828886647, - "p": 0.68 - }, - { - "x": 28, - "y": 78, - "t": 1695828886664, - "p": 0.68 - }, - { - "x": 31, - "y": 78, - "t": 1695828886697, - "p": 0.68 - }, - { - "x": 34, - "y": 77, - "t": 1695828886795, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 39, - "y": 71, - "t": 1695828887187, - "p": 0.1 - }, - { - "x": 42, - "y": 71, - "t": 1695828887230, - "p": 0.68 - }, - { - "x": 45, - "y": 71, - "t": 1695828887247, - "p": 0.68 - }, - { - "x": 49, - "y": 71, - "t": 1695828887264, - "p": 0.71 - }, - { - "x": 52, - "y": 70, - "t": 1695828887280, - "p": 0.68 - }, - { - "x": 56, - "y": 69, - "t": 1695828887297, - "p": 0.72 - }, - { - "x": 59, - "y": 68, - "t": 1695828887313, - "p": 0.68 - }, - { - "x": 60, - "y": 65, - "t": 1695828887346, - "p": 0.68 - }, - { - "x": 59, - "y": 62, - "t": 1695828887363, - "p": 0.68 - }, - { - "x": 56, - "y": 60, - "t": 1695828887379, - "p": 0.7 - }, - { - "x": 52, - "y": 59, - "t": 1695828887413, - "p": 0.72 - }, - { - "x": 46, - "y": 61, - "t": 1695828887446, - "p": 0.77 - }, - { - "x": 41, - "y": 64, - "t": 1695828887462, - "p": 0.76 - }, - { - "x": 37, - "y": 65, - "t": 1695828887479, - "p": 0.72 - }, - { - "x": 34, - "y": 67, - "t": 1695828887497, - "p": 0.7 - }, - { - "x": 34, - "y": 70, - "t": 1695828887513, - "p": 0.68 - }, - { - "x": 35, - "y": 73, - "t": 1695828887530, - "p": 0.68 - }, - { - "x": 37, - "y": 76, - "t": 1695828887546, - "p": 0.7 - }, - { - "x": 40, - "y": 78, - "t": 1695828887629, - "p": 0.7 - }, - { - "x": 45, - "y": 79, - "t": 1695828887680, - "p": 0.75 - }, - { - "x": 49, - "y": 79, - "t": 1695828887695, - "p": 0.71 - }, - { - "x": 54, - "y": 79, - "t": 1695828887713, - "p": 0.74 - }, - { - "x": 57, - "y": 79, - "t": 1695828887783, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 66, - "y": 66, - "t": 1695828888117, - "p": 0.1 - }, - { - "x": 67, - "y": 71, - "t": 1695828888162, - "p": 0.75 - }, - { - "x": 67, - "y": 75, - "t": 1695828888179, - "p": 0.71 - }, - { - "x": 67, - "y": 78, - "t": 1695828888196, - "p": 0.68 - }, - { - "x": 69, - "y": 75, - "t": 1695828888362, - "p": 0.7 - }, - { - "x": 70, - "y": 72, - "t": 1695828888395, - "p": 0.68 - }, - { - "x": 73, - "y": 69, - "t": 1695828888428, - "p": 0.72 - }, - { - "x": 77, - "y": 72, - "t": 1695828888545, - "p": 0.74 - }, - { - "x": 79, - "y": 76, - "t": 1695828888563, - "p": 0.73 - }, - { - "x": 81, - "y": 80, - "t": 1695828888596, - "p": 0.73 - }, - { - "x": 80, - "y": 83, - "t": 1695828888629, - "p": 0.68 - }, - { - "x": 79, - "y": 77, - "t": 1695828888745, - "p": 0.77 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 83, - "y": 45, - "t": 1695828889101, - "p": 0.1 - }, - { - "x": 85, - "y": 49, - "t": 1695828889178, - "p": 0.73 - }, - { - "x": 86, - "y": 52, - "t": 1695828889195, - "p": 0.68 - }, - { - "x": 87, - "y": 55, - "t": 1695828889211, - "p": 0.68 - }, - { - "x": 88, - "y": 60, - "t": 1695828889244, - "p": 0.75 - }, - { - "x": 89, - "y": 64, - "t": 1695828889262, - "p": 0.72 - }, - { - "x": 90, - "y": 68, - "t": 1695828889278, - "p": 0.72 - }, - { - "x": 91, - "y": 71, - "t": 1695828889311, - "p": 0.68 - }, - { - "x": 91, - "y": 74, - "t": 1695828889455, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 88, - "y": 59, - "t": 1695828889940, - "p": 0.1 - }, - { - "x": 91, - "y": 58, - "t": 1695828889994, - "p": 0.68 - }, - { - "x": 94, - "y": 58, - "t": 1695828890010, - "p": 0.68 - }, - { - "x": 98, - "y": 57, - "t": 1695828890027, - "p": 0.72 - }, - { - "x": 102, - "y": 56, - "t": 1695828890043, - "p": 0.72 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 101, - "y": 79, - "t": 1695828890560, - "p": 0.1 - }, - { - "x": 101, - "y": 76, - "t": 1695828890631, - "p": 0.68 - }, - { - "x": 101, - "y": 72, - "t": 1695828890660, - "p": 0.71 - }, - { - "x": 103, - "y": 69, - "t": 1695828890693, - "p": 0.7 - }, - { - "x": 106, - "y": 64, - "t": 1695828890727, - "p": 0.76 - }, - { - "x": 109, - "y": 63, - "t": 1695828890777, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 118, - "y": 69, - "t": 1695828891143, - "p": 0.1 - }, - { - "x": 116, - "y": 73, - "t": 1695828891210, - "p": 0.73 - }, - { - "x": 116, - "y": 76, - "t": 1695828891259, - "p": 0.68 - }, - { - "x": 120, - "y": 77, - "t": 1695828891326, - "p": 0.72 - }, - { - "x": 123, - "y": 77, - "t": 1695828891343, - "p": 0.68 - }, - { - "x": 127, - "y": 75, - "t": 1695828891392, - "p": 0.73 - }, - { - "x": 127, - "y": 72, - "t": 1695828891443, - "p": 0.68 - }, - { - "x": 123, - "y": 70, - "t": 1695828891477, - "p": 0.73 - }, - { - "x": 117, - "y": 69, - "t": 1695828891510, - "p": 0.77 - }, - { - "x": 112, - "y": 69, - "t": 1695828891542, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 123, - "y": 71, - "t": 1695828892082, - "p": 0.1 - }, - { - "x": 123, - "y": 74, - "t": 1695828892125, - "p": 0.68 - }, - { - "x": 124, - "y": 77, - "t": 1695828892175, - "p": 0.68 - }, - { - "x": 124, - "y": 80, - "t": 1695828892307, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 136, - "y": 45, - "t": 1695828892776, - "p": 0.1 - }, - { - "x": 137, - "y": 51, - "t": 1695828892824, - "p": 0.77 - }, - { - "x": 137, - "y": 56, - "t": 1695828892842, - "p": 0.74 - }, - { - "x": 137, - "y": 60, - "t": 1695828892858, - "p": 0.71 - }, - { - "x": 137, - "y": 64, - "t": 1695828892875, - "p": 0.71 - }, - { - "x": 137, - "y": 67, - "t": 1695828892892, - "p": 0.68 - }, - { - "x": 138, - "y": 70, - "t": 1695828892925, - "p": 0.68 - }, - { - "x": 138, - "y": 73, - "t": 1695828892958, - "p": 0.68 - }, - { - "x": 137, - "y": 76, - "t": 1695828892991, - "p": 0.68 - }, - { - "x": 137, - "y": 81, - "t": 1695828893158, - "p": 0.74 - }, - { - "x": 137, - "y": 84, - "t": 1695828893208, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 166, - "y": 74, - "t": 1695828894357, - "p": 0.1 - }, - { - "x": 167, - "y": 79, - "t": 1695828894423, - "p": 0.75 - }, - { - "x": 167, - "y": 82, - "t": 1695828894440, - "p": 0.68 - }, - { - "x": 167, - "y": 86, - "t": 1695828894457, - "p": 0.71 - }, - { - "x": 167, - "y": 89, - "t": 1695828894473, - "p": 0.68 - }, - { - "x": 168, - "y": 92, - "t": 1695828894507, - "p": 0.68 - }, - { - "x": 165, - "y": 88, - "t": 1695828894691, - "p": 0.74 - }, - { - "x": 164, - "y": 85, - "t": 1695828894707, - "p": 0.68 - }, - { - "x": 164, - "y": 82, - "t": 1695828894724, - "p": 0.68 - }, - { - "x": 165, - "y": 79, - "t": 1695828894740, - "p": 0.68 - }, - { - "x": 166, - "y": 74, - "t": 1695828894773, - "p": 0.75 - }, - { - "x": 168, - "y": 70, - "t": 1695828894807, - "p": 0.73 - }, - { - "x": 172, - "y": 66, - "t": 1695828894839, - "p": 0.76 - }, - { - "x": 175, - "y": 64, - "t": 1695828894873, - "p": 0.7 - }, - { - "x": 179, - "y": 65, - "t": 1695828894923, - "p": 0.72 - }, - { - "x": 182, - "y": 67, - "t": 1695828894940, - "p": 0.7 - }, - { - "x": 185, - "y": 68, - "t": 1695828894956, - "p": 0.68 - }, - { - "x": 185, - "y": 73, - "t": 1695828895006, - "p": 0.74 - }, - { - "x": 183, - "y": 76, - "t": 1695828895023, - "p": 0.7 - }, - { - "x": 178, - "y": 79, - "t": 1695828895056, - "p": 0.76 - }, - { - "x": 174, - "y": 80, - "t": 1695828895073, - "p": 0.72 - }, - { - "x": 170, - "y": 82, - "t": 1695828895090, - "p": 0.73 - }, - { - "x": 167, - "y": 83, - "t": 1695828895123, - "p": 0.68 - }, - { - "x": 169, - "y": 80, - "t": 1695828895227, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 191, - "y": 81, - "t": 1695828895628, - "p": 0.1 - }, - { - "x": 190, - "y": 78, - "t": 1695828895690, - "p": 0.68 - }, - { - "x": 189, - "y": 74, - "t": 1695828895723, - "p": 0.72 - }, - { - "x": 189, - "y": 71, - "t": 1695828895740, - "p": 0.68 - }, - { - "x": 190, - "y": 68, - "t": 1695828895773, - "p": 0.68 - }, - { - "x": 193, - "y": 65, - "t": 1695828895806, - "p": 0.72 - }, - { - "x": 196, - "y": 63, - "t": 1695828895840, - "p": 0.7 - }, - { - "x": 199, - "y": 65, - "t": 1695828895922, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 198, - "y": 72, - "t": 1695828896159, - "p": 0.1 - }, - { - "x": 198, - "y": 75, - "t": 1695828896205, - "p": 0.68 - }, - { - "x": 203, - "y": 76, - "t": 1695828896238, - "p": 0.75 - }, - { - "x": 206, - "y": 77, - "t": 1695828896254, - "p": 0.68 - }, - { - "x": 209, - "y": 77, - "t": 1695828896295, - "p": 0.68 - }, - { - "x": 211, - "y": 72, - "t": 1695828896355, - "p": 0.75 - }, - { - "x": 213, - "y": 69, - "t": 1695828896389, - "p": 0.7 - }, - { - "x": 210, - "y": 67, - "t": 1695828896473, - "p": 0.7 - }, - { - "x": 204, - "y": 67, - "t": 1695828896505, - "p": 0.77 - }, - { - "x": 201, - "y": 68, - "t": 1695828896538, - "p": 0.68 - }, - { - "x": 199, - "y": 71, - "t": 1695828896642, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 230, - "y": 62, - "t": 1695828897180, - "p": 0.1 - }, - { - "x": 227, - "y": 63, - "t": 1695828897238, - "p": 0.68 - }, - { - "x": 223, - "y": 66, - "t": 1695828897271, - "p": 0.74 - }, - { - "x": 220, - "y": 71, - "t": 1695828897304, - "p": 0.76 - }, - { - "x": 219, - "y": 75, - "t": 1695828897321, - "p": 0.72 - }, - { - "x": 218, - "y": 78, - "t": 1695828897354, - "p": 0.68 - }, - { - "x": 221, - "y": 80, - "t": 1695828897420, - "p": 0.7 - }, - { - "x": 226, - "y": 80, - "t": 1695828897472, - "p": 0.74 - }, - { - "x": 231, - "y": 79, - "t": 1695828897505, - "p": 0.75 - }, - { - "x": 235, - "y": 78, - "t": 1695828897520, - "p": 0.72 - }, - { - "x": 240, - "y": 77, - "t": 1695828897554, - "p": 0.75 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 239, - "y": 72, - "t": 1695828897888, - "p": 0.1 - }, - { - "x": 242, - "y": 72, - "t": 1695828897954, - "p": 0.68 - }, - { - "x": 245, - "y": 71, - "t": 1695828897971, - "p": 0.68 - }, - { - "x": 248, - "y": 71, - "t": 1695828897987, - "p": 0.68 - }, - { - "x": 251, - "y": 70, - "t": 1695828898020, - "p": 0.68 - }, - { - "x": 252, - "y": 67, - "t": 1695828898073, - "p": 0.68 - }, - { - "x": 248, - "y": 67, - "t": 1695828898154, - "p": 0.71 - }, - { - "x": 245, - "y": 67, - "t": 1695828898170, - "p": 0.68 - }, - { - "x": 242, - "y": 68, - "t": 1695828898187, - "p": 0.68 - }, - { - "x": 239, - "y": 70, - "t": 1695828898256, - "p": 0.7 - }, - { - "x": 239, - "y": 74, - "t": 1695828898304, - "p": 0.71 - }, - { - "x": 239, - "y": 77, - "t": 1695828898337, - "p": 0.68 - }, - { - "x": 243, - "y": 78, - "t": 1695828898387, - "p": 0.72 - }, - { - "x": 247, - "y": 78, - "t": 1695828898421, - "p": 0.71 - }, - { - "x": 250, - "y": 78, - "t": 1695828898436, - "p": 0.68 - }, - { - "x": 253, - "y": 78, - "t": 1695828898469, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 268, - "y": 61, - "t": 1695828898996, - "p": 0.1 - }, - { - "x": 264, - "y": 62, - "t": 1695828899036, - "p": 0.72 - }, - { - "x": 261, - "y": 65, - "t": 1695828899087, - "p": 0.72 - }, - { - "x": 261, - "y": 68, - "t": 1695828899139, - "p": 0.68 - }, - { - "x": 265, - "y": 69, - "t": 1695828899169, - "p": 0.72 - }, - { - "x": 268, - "y": 69, - "t": 1695828899203, - "p": 0.68 - }, - { - "x": 267, - "y": 72, - "t": 1695828899269, - "p": 0.68 - }, - { - "x": 266, - "y": 76, - "t": 1695828899302, - "p": 0.72 - }, - { - "x": 263, - "y": 79, - "t": 1695828899337, - "p": 0.72 - }, - { - "x": 260, - "y": 81, - "t": 1695828899370, - "p": 0.7 - }, - { - "x": 255, - "y": 83, - "t": 1695828899402, - "p": 0.75 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 283, - "y": 63, - "t": 1695828899938, - "p": 0.1 - }, - { - "x": 280, - "y": 63, - "t": 1695828899969, - "p": 0.68 - }, - { - "x": 275, - "y": 65, - "t": 1695828900003, - "p": 0.75 - }, - { - "x": 272, - "y": 68, - "t": 1695828900052, - "p": 0.72 - }, - { - "x": 272, - "y": 71, - "t": 1695828900085, - "p": 0.68 - }, - { - "x": 275, - "y": 73, - "t": 1695828900152, - "p": 0.7 - }, - { - "x": 277, - "y": 76, - "t": 1695828900218, - "p": 0.7 - }, - { - "x": 278, - "y": 79, - "t": 1695828900286, - "p": 0.68 - }, - { - "x": 274, - "y": 82, - "t": 1695828900319, - "p": 0.74 - }, - { - "x": 271, - "y": 83, - "t": 1695828900335, - "p": 0.68 - }, - { - "x": 267, - "y": 84, - "t": 1695828900368, - "p": 0.72 - }, - { - "x": 264, - "y": 84, - "t": 1695828900451, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 288, - "y": 66, - "t": 1695828900881, - "p": 0.1 - }, - { - "x": 288, - "y": 71, - "t": 1695828900934, - "p": 0.74 - }, - { - "x": 287, - "y": 74, - "t": 1695828900952, - "p": 0.68 - }, - { - "x": 287, - "y": 78, - "t": 1695828900985, - "p": 0.71 - }, - { - "x": 287, - "y": 81, - "t": 1695828901034, - "p": 0.68 - }, - { - "x": 286, - "y": 84, - "t": 1695828901084, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 292, - "y": 49, - "t": 1695828901486, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 295, - "y": 68, - "t": 1695828902006, - "p": 0.1 - }, - { - "x": 296, - "y": 71, - "t": 1695828902067, - "p": 0.68 - }, - { - "x": 295, - "y": 74, - "t": 1695828902084, - "p": 0.68 - }, - { - "x": 295, - "y": 78, - "t": 1695828902117, - "p": 0.71 - }, - { - "x": 295, - "y": 81, - "t": 1695828902150, - "p": 0.68 - }, - { - "x": 292, - "y": 78, - "t": 1695828902350, - "p": 0.72 - }, - { - "x": 291, - "y": 75, - "t": 1695828902367, - "p": 0.68 - }, - { - "x": 293, - "y": 71, - "t": 1695828902383, - "p": 0.73 - }, - { - "x": 296, - "y": 68, - "t": 1695828902416, - "p": 0.72 - }, - { - "x": 299, - "y": 68, - "t": 1695828902517, - "p": 0.68 - }, - { - "x": 302, - "y": 72, - "t": 1695828902550, - "p": 0.74 - }, - { - "x": 303, - "y": 75, - "t": 1695828902583, - "p": 0.68 - }, - { - "x": 304, - "y": 78, - "t": 1695828902634, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 313, - "y": 68, - "t": 1695828903137, - "p": 0.1 - }, - { - "x": 312, - "y": 72, - "t": 1695828903183, - "p": 0.72 - }, - { - "x": 314, - "y": 75, - "t": 1695828903233, - "p": 0.7 - }, - { - "x": 317, - "y": 76, - "t": 1695828903273, - "p": 0.68 - }, - { - "x": 322, - "y": 74, - "t": 1695828903332, - "p": 0.75 - }, - { - "x": 327, - "y": 71, - "t": 1695828903365, - "p": 0.76 - }, - { - "x": 326, - "y": 68, - "t": 1695828903434, - "p": 0.68 - }, - { - "x": 323, - "y": 67, - "t": 1695828903466, - "p": 0.68 - }, - { - "x": 320, - "y": 67, - "t": 1695828903499, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 328, - "y": 66, - "t": 1695828903878, - "p": 0.1 - }, - { - "x": 328, - "y": 70, - "t": 1695828903916, - "p": 0.71 - }, - { - "x": 329, - "y": 73, - "t": 1695828903949, - "p": 0.68 - }, - { - "x": 332, - "y": 78, - "t": 1695828903982, - "p": 0.76 - }, - { - "x": 333, - "y": 81, - "t": 1695828903998, - "p": 0.68 - }, - { - "x": 334, - "y": 84, - "t": 1695828904016, - "p": 0.68 - }, - { - "x": 335, - "y": 87, - "t": 1695828904049, - "p": 0.68 - }, - { - "x": 334, - "y": 91, - "t": 1695828904082, - "p": 0.72 - }, - { - "x": 331, - "y": 94, - "t": 1695828904115, - "p": 0.72 - }, - { - "x": 328, - "y": 96, - "t": 1695828904200, - "p": 0.7 - }, - { - "x": 324, - "y": 94, - "t": 1695828904232, - "p": 0.73 - }, - { - "x": 323, - "y": 89, - "t": 1695828904265, - "p": 0.75 - }, - { - "x": 326, - "y": 84, - "t": 1695828904299, - "p": 0.76 - }, - { - "x": 329, - "y": 81, - "t": 1695828904331, - "p": 0.72 - }, - { - "x": 332, - "y": 77, - "t": 1695828904364, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 363, - "y": 63, - "t": 1695828905623, - "p": 0.1 - }, - { - "x": 362, - "y": 68, - "t": 1695828905680, - "p": 0.75 - }, - { - "x": 361, - "y": 71, - "t": 1695828905714, - "p": 0.68 - }, - { - "x": 361, - "y": 75, - "t": 1695828905747, - "p": 0.71 - }, - { - "x": 365, - "y": 77, - "t": 1695828905814, - "p": 0.73 - }, - { - "x": 369, - "y": 77, - "t": 1695828905863, - "p": 0.71 - }, - { - "x": 373, - "y": 71, - "t": 1695828905914, - "p": 0.79 - }, - { - "x": 376, - "y": 66, - "t": 1695828905947, - "p": 0.76 - }, - { - "x": 377, - "y": 63, - "t": 1695828905980, - "p": 0.68 - }, - { - "x": 377, - "y": 70, - "t": 1695828906114, - "p": 0.78 - }, - { - "x": 377, - "y": 73, - "t": 1695828906129, - "p": 0.68 - }, - { - "x": 377, - "y": 76, - "t": 1695828906164, - "p": 0.68 - }, - { - "x": 379, - "y": 79, - "t": 1695828906197, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 386, - "y": 62, - "t": 1695828906715, - "p": 0.1 - }, - { - "x": 386, - "y": 65, - "t": 1695828906763, - "p": 0.68 - }, - { - "x": 387, - "y": 68, - "t": 1695828906779, - "p": 0.68 - }, - { - "x": 387, - "y": 73, - "t": 1695828906812, - "p": 0.74 - }, - { - "x": 387, - "y": 76, - "t": 1695828906830, - "p": 0.68 - }, - { - "x": 387, - "y": 72, - "t": 1695828907013, - "p": 0.71 - }, - { - "x": 387, - "y": 69, - "t": 1695828907029, - "p": 0.68 - }, - { - "x": 389, - "y": 66, - "t": 1695828907062, - "p": 0.7 - }, - { - "x": 391, - "y": 69, - "t": 1695828907213, - "p": 0.7 - }, - { - "x": 392, - "y": 72, - "t": 1695828907228, - "p": 0.68 - }, - { - "x": 393, - "y": 76, - "t": 1695828907262, - "p": 0.72 - }, - { - "x": 394, - "y": 79, - "t": 1695828907295, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 402, - "y": 62, - "t": 1695828907759, - "p": 0.1 - }, - { - "x": 402, - "y": 66, - "t": 1695828907828, - "p": 0.71 - }, - { - "x": 402, - "y": 71, - "t": 1695828907862, - "p": 0.74 - }, - { - "x": 402, - "y": 75, - "t": 1695828907895, - "p": 0.71 - }, - { - "x": 402, - "y": 79, - "t": 1695828907978, - "p": 0.71 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 402, - "y": 50, - "t": 1695828908403, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 410, - "y": 45, - "t": 1695828908880, - "p": 0.1 - }, - { - "x": 410, - "y": 51, - "t": 1695828908945, - "p": 0.77 - }, - { - "x": 410, - "y": 55, - "t": 1695828908960, - "p": 0.71 - }, - { - "x": 410, - "y": 58, - "t": 1695828908977, - "p": 0.68 - }, - { - "x": 411, - "y": 61, - "t": 1695828908994, - "p": 0.68 - }, - { - "x": 411, - "y": 65, - "t": 1695828909027, - "p": 0.71 - }, - { - "x": 412, - "y": 70, - "t": 1695828909061, - "p": 0.75 - }, - { - "x": 412, - "y": 74, - "t": 1695828909094, - "p": 0.71 - }, - { - "x": 412, - "y": 77, - "t": 1695828909127, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 414, - "y": 58, - "t": 1695828909798, - "p": 0.1 - }, - { - "x": 418, - "y": 58, - "t": 1695828909960, - "p": 0.71 - }, - { - "x": 421, - "y": 56, - "t": 1695828910426, - "p": 0.7 - } - ] - } -] diff --git a/test/integration/strokes/one.json b/test/integration/strokes/one.json deleted file mode 100644 index 70d92fe70..000000000 --- a/test/integration/strokes/one.json +++ /dev/null @@ -1,128 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 95, - "y": 93, - "t": 1695886395822, - "p": 0.1 - }, - { - "x": 99, - "y": 90, - "t": 1695886395889, - "p": 0.74 - }, - { - "x": 103, - "y": 87, - "t": 1695886395921, - "p": 0.74 - }, - { - "x": 109, - "y": 84, - "t": 1695886395938, - "p": 0.78 - }, - { - "x": 113, - "y": 82, - "t": 1695886395955, - "p": 0.73 - }, - { - "x": 118, - "y": 76, - "t": 1695886395971, - "p": 0.8 - }, - { - "x": 123, - "y": 71, - "t": 1695886395988, - "p": 0.79 - }, - { - "x": 126, - "y": 65, - "t": 1695886396006, - "p": 0.78 - }, - { - "x": 126, - "y": 62, - "t": 1695886396022, - "p": 0.68 - }, - { - "x": 125, - "y": 65, - "t": 1695886396126, - "p": 0.68 - }, - { - "x": 124, - "y": 70, - "t": 1695886396154, - "p": 0.75 - }, - { - "x": 124, - "y": 77, - "t": 1695886396188, - "p": 0.78 - }, - { - "x": 124, - "y": 83, - "t": 1695886396205, - "p": 0.77 - }, - { - "x": 123, - "y": 87, - "t": 1695886396222, - "p": 0.72 - }, - { - "x": 123, - "y": 91, - "t": 1695886396237, - "p": 0.71 - }, - { - "x": 122, - "y": 98, - "t": 1695886396255, - "p": 0.79 - }, - { - "x": 122, - "y": 103, - "t": 1695886396271, - "p": 0.74 - }, - { - "x": 122, - "y": 107, - "t": 1695886396304, - "p": 0.71 - }, - { - "x": 122, - "y": 110, - "t": 1695886396338, - "p": 0.68 - }, - { - "x": 121, - "y": 114, - "t": 1695886396421, - "p": 0.72 - } - ] - } -] diff --git a/test/integration/strokes/ponyErase.json b/test/integration/strokes/ponyErase.json deleted file mode 100644 index 2a3c6cc99..000000000 --- a/test/integration/strokes/ponyErase.json +++ /dev/null @@ -1,434 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 228, - 233, - 237, - 244, - 250, - 254, - 257, - 258, - 259, - 258, - 257, - 254, - 253, - 252, - 252, - 252, - 253, - 254, - 251, - 250, - 249, - 248, - 249, - 250, - 251, - 254, - 257, - 259, - 261, - 262, - 265, - 268, - 273, - 277, - 277, - 274, - 278, - 281, - 284, - 291, - 293, - 294, - 290, - 286, - 280, - 274, - 273, - 278, - 283, - 286, - 289, - 292, - 296, - 299, - 303, - 306, - 310, - 313, - 315, - 316, - 317, - 317, - 317, - 318, - 321, - 323, - 325, - 327, - 329, - 330, - 333, - 336, - 341, - 345, - 345, - 342, - 344, - 346, - 347, - 347, - 351, - 354, - 357, - 360, - 361, - 365, - 367, - 372, - 375, - 377, - 377, - 375, - 372, - 367, - 365, - 366, - 369, - 374, - 379, - 384, - 388 - ], - "y": [ - 353, - 348, - 345, - 340, - 335, - 331, - 327, - 324, - 321, - 330, - 337, - 345, - 352, - 360, - 367, - 372, - 376, - 379, - 375, - 370, - 364, - 354, - 350, - 347, - 344, - 341, - 345, - 348, - 351, - 354, - 355, - 355, - 354, - 351, - 348, - 354, - 357, - 358, - 359, - 358, - 355, - 350, - 347, - 347, - 345, - 344, - 347, - 349, - 350, - 350, - 348, - 348, - 346, - 344, - 339, - 337, - 338, - 342, - 346, - 350, - 353, - 356, - 353, - 349, - 345, - 342, - 345, - 348, - 352, - 356, - 356, - 353, - 349, - 345, - 342, - 340, - 343, - 348, - 351, - 354, - 353, - 351, - 347, - 343, - 346, - 351, - 354, - 358, - 362, - 365, - 369, - 373, - 374, - 370, - 366, - 362, - 357, - 350, - 345, - 342, - 341 - ], - "t": [ - 1691671459764, - 1691671459821, - 1691671459837, - 1691671459854, - 1691671459871, - 1691671459888, - 1691671459904, - 1691671459921, - 1691671459954, - 1691671460037, - 1691671460054, - 1691671460070, - 1691671460087, - 1691671460104, - 1691671460120, - 1691671460137, - 1691671460154, - 1691671460170, - 1691671460304, - 1691671460320, - 1691671460337, - 1691671460370, - 1691671460387, - 1691671460420, - 1691671460437, - 1691671460470, - 1691671460687, - 1691671460704, - 1691671460720, - 1691671460737, - 1691671460754, - 1691671460787, - 1691671460837, - 1691671460870, - 1691671460903, - 1691671461004, - 1691671461037, - 1691671461053, - 1691671461070, - 1691671461087, - 1691671461153, - 1691671461186, - 1691671461219, - 1691671461236, - 1691671461253, - 1691671461269, - 1691671461369, - 1691671461436, - 1691671461453, - 1691671461470, - 1691671461503, - 1691671461519, - 1691671461552, - 1691671461586, - 1691671461619, - 1691671461653, - 1691671461786, - 1691671461803, - 1691671461819, - 1691671461836, - 1691671461853, - 1691671461869, - 1691671462169, - 1691671462202, - 1691671462236, - 1691671462269, - 1691671462419, - 1691671462435, - 1691671462468, - 1691671462503, - 1691671462569, - 1691671462619, - 1691671462668, - 1691671462702, - 1691671462752, - 1691671463021, - 1691671463385, - 1691671463418, - 1691671463468, - 1691671463551, - 1691671463634, - 1691671463734, - 1691671463784, - 1691671463818, - 1691671464101, - 1691671464117, - 1691671464134, - 1691671464167, - 1691671464184, - 1691671464201, - 1691671464217, - 1691671464267, - 1691671464334, - 1691671464351, - 1691671464367, - 1691671464384, - 1691671464400, - 1691671464417, - 1691671464434, - 1691671464450, - 1691671464467 - ], - "p": [ - 0.5, - 0.73, - 0.74, - 0.81, - 0.8, - 0.76, - 0.74, - 0.68, - 0.68, - 0.81, - 0.79, - 0.81, - 0.79, - 0.8, - 0.78, - 0.74, - 0.72, - 0.68, - 0.74, - 0.75, - 0.77, - 0.68, - 0.72, - 0.68, - 0.68, - 0.72, - 0.74, - 0.7, - 0.7, - 0.68, - 0.68, - 0.68, - 0.75, - 0.74, - 0.68, - 0.78, - 0.74, - 0.68, - 0.68, - 0.79, - 0.7, - 0.75, - 0.74, - 0.71, - 0.77, - 0.77, - 0.68, - 0.75, - 0.75, - 0.68, - 0.7, - 0.68, - 0.73, - 0.7, - 0.77, - 0.7, - 0.72, - 0.74, - 0.73, - 0.72, - 0.68, - 0.68, - 0.68, - 0.72, - 0.74, - 0.7, - 0.7, - 0.7, - 0.73, - 0.72, - 0.68, - 0.72, - 0.77, - 0.76, - 0.68, - 0.7, - 0.7, - 0.75, - 0.68, - 0.68, - 0.72, - 0.7, - 0.74, - 0.74, - 0.68, - 0.77, - 0.7, - 0.77, - 0.74, - 0.7, - 0.71, - 0.73, - 0.68, - 0.77, - 0.73, - 0.72, - 0.76, - 0.81, - 0.79, - 0.76, - 0.72 - ] - }, - { - "pointerType": "eraser", - "pointerId": 0, - "x": [ - 231 - ], - "y": [ - 350 - ], - "t": [ - 1691671470393 - ], - "p": [ - 0.5 - ] - } -] diff --git a/test/integration/strokes/rectangle.json b/test/integration/strokes/rectangle.json deleted file mode 100644 index 2146db1bd..000000000 --- a/test/integration/strokes/rectangle.json +++ /dev/null @@ -1,338 +0,0 @@ -[ - { - "p": [ - 0.5, - 0.83, - 0.71, - 0.74, - 0.74, - 0.78, - 0.79, - 0.78, - 0.71, - 0.71, - 0.71, - 0.75, - 0.68, - 0.68, - 0.71, - 0.68, - 0.68, - 0.71 - ], - "t": [ - 1688461352900, - 1688461352959, - 1688461352975, - 1688461352991, - 1688461353008, - 1688461353025, - 1688461353042, - 1688461353058, - 1688461353075, - 1688461353091, - 1688461353108, - 1688461353124, - 1688461353142, - 1688461353159, - 1688461353175, - 1688461353191, - 1688461353317, - 1688461353425 - ], - "x": [ - 217, - 217, - 217, - 217, - 217, - 217, - 216, - 216, - 216, - 216, - 216, - 215, - 215, - 215, - 215, - 214, - 214, - 214 - ], - "y": [ - 197, - 200, - 204, - 209, - 214, - 221, - 228, - 235, - 239, - 243, - 247, - 252, - 255, - 258, - 262, - 265, - 268, - 272 - ] - }, - { - "p": [ - 0.5, - 0.82, - 0.8, - 0.61, - 0.51, - 0.67, - 0.78, - 0.68, - 0.68, - 0.68, - 0.74, - 0.75, - 0.71, - 0.68, - 0.71, - 0.68, - 0.71, - 0.68, - 0.75, - 0.71, - 0.7, - 0.71, - 0.77, - 0.68, - 0.71, - 0.71, - 0.79, - 0.8, - 0.71, - 0.77, - 0.72, - 0.68, - 0.68, - 0.68, - 0.68, - 0.74, - 0.68, - 0.68, - 0.68, - 0.7, - 0.8, - 0.64, - 0.65, - 0.67, - 0.77, - 0.68, - 0.68, - 0.74, - 0.8, - 0.78, - 0.74, - 0.68, - 0.68, - 0.74, - 0.74, - 0.71, - 0.77, - 0.71, - 0.72, - 0.73, - 0.68 - ], - "t": [ - 1688461354290, - 1688461354376, - 1688461354393, - 1688461354409, - 1688461354426, - 1688461354442, - 1688461354459, - 1688461354475, - 1688461354493, - 1688461354509, - 1688461354543, - 1688461354559, - 1688461354576, - 1688461354592, - 1688461354609, - 1688461354642, - 1688461354659, - 1688461354693, - 1688461354776, - 1688461354792, - 1688461354826, - 1688461354876, - 1688461354977, - 1688461354993, - 1688461355010, - 1688461355026, - 1688461355043, - 1688461355059, - 1688461355076, - 1688461355093, - 1688461355109, - 1688461355126, - 1688461355143, - 1688461355177, - 1688461355193, - 1688461355226, - 1688461355243, - 1688461355277, - 1688461355530, - 1688461355578, - 1688461355626, - 1688461355644, - 1688461355661, - 1688461355677, - 1688461355694, - 1688461355710, - 1688461355727, - 1688461355744, - 1688461355760, - 1688461355777, - 1688461355794, - 1688461355811, - 1688461355828, - 1688461355860, - 1688461355878, - 1688461355894, - 1688461355910, - 1688461355927, - 1688461356127, - 1688461356144, - 1688461356177 - ], - "x": [ - 219, - 222, - 230, - 245, - 269, - 280, - 287, - 290, - 293, - 296, - 301, - 306, - 310, - 313, - 317, - 320, - 324, - 327, - 332, - 336, - 339, - 343, - 342, - 341, - 341, - 341, - 340, - 339, - 339, - 339, - 338, - 338, - 337, - 337, - 336, - 336, - 336, - 336, - 336, - 333, - 325, - 312, - 300, - 289, - 283, - 280, - 277, - 272, - 264, - 257, - 252, - 249, - 246, - 241, - 236, - 232, - 226, - 222, - 218, - 214, - 211 - ], - "y": [ - 195, - 196, - 197, - 197, - 200, - 200, - 200, - 200, - 200, - 200, - 200, - 201, - 201, - 201, - 201, - 201, - 201, - 201, - 200, - 200, - 198, - 198, - 204, - 207, - 211, - 215, - 222, - 230, - 234, - 240, - 244, - 247, - 250, - 253, - 256, - 261, - 264, - 267, - 270, - 272, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 269, - 270, - 270, - 270, - 270, - 270, - 270, - 271, - 269, - 270 - ] - } -] diff --git a/test/integration/strokes/sum.json b/test/integration/strokes/sum.json deleted file mode 100644 index 0665372a1..000000000 --- a/test/integration/strokes/sum.json +++ /dev/null @@ -1,330 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 255, - 259, - 263, - 268, - 271, - 275, - 279, - 283, - 286, - 286, - 284, - 280, - 276, - 281, - 286, - 296, - 299, - 298, - 294, - 290, - 285, - 281, - 276, - 271, - 265, - 258 - ], - "y": [ - 223, - 221, - 219, - 215, - 214, - 215, - 217, - 220, - 221, - 224, - 230, - 234, - 236, - 236, - 236, - 236, - 236, - 239, - 243, - 247, - 249, - 251, - 254, - 255, - 256, - 258 - ], - "t": [ - 1689748306049, - 1689748306129, - 1689748306146, - 1689748306178, - 1689748306195, - 1689748306212, - 1689748306229, - 1689748306245, - 1689748306262, - 1689748306312, - 1689748306328, - 1689748306362, - 1689748306378, - 1689748306562, - 1689748306578, - 1689748306595, - 1689748306629, - 1689748306661, - 1689748306695, - 1689748306711, - 1689748306728, - 1689748306745, - 1689748306778, - 1689748306794, - 1689748306811, - 1689748306829 - ], - "p": [ - 0.5, - 0.79, - 0.73, - 0.77, - 0.68, - 0.72, - 0.73, - 0.74, - 0.68, - 0.68, - 0.77, - 0.76, - 0.73, - 0.74, - 0.74, - 0.68, - 0.68, - 0.68, - 0.76, - 0.76, - 0.75, - 0.73, - 0.76, - 0.75, - 0.77, - 0.79 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 306, - 312, - 324, - 335, - 341, - 344 - ], - "y": [ - 233, - 232, - 232, - 234, - 234, - 234 - ], - "t": [ - 1689748307331, - 1689748307360, - 1689748307377, - 1689748307394, - 1689748307410, - 1689748307427 - ], - "p": [ - 0.5, - 0.75, - 0.67, - 0.67, - 0.77, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 333, - 331, - 329, - 329, - 330 - ], - "y": [ - 218, - 223, - 232, - 238, - 243 - ], - "t": [ - 1689748307920, - 1689748307977, - 1689748307994, - 1689748308011, - 1689748308027 - ], - "p": [ - 0.5, - 0.77, - 0.81, - 0.77, - 0.75 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 355, - 360, - 363, - 367, - 369, - 371, - 370, - 370, - 370, - 370, - 370, - 372, - 372, - 372 - ], - "y": [ - 228, - 224, - 222, - 220, - 217, - 214, - 211, - 214, - 218, - 222, - 227, - 231, - 234, - 237 - ], - "t": [ - 1689748308672, - 1689748308743, - 1689748308759, - 1689748308776, - 1689748308793, - 1689748308810, - 1689748308860, - 1689748308921, - 1689748308943, - 1689748308960, - 1689748308976, - 1689748308992, - 1689748309009, - 1689748309065 - ], - "p": [ - 0.5, - 0.75, - 0.7, - 0.73, - 0.7, - 0.7, - 0.68, - 0.68, - 0.71, - 0.71, - 0.74, - 0.73, - 0.68, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 393, - 397, - 402, - 409, - 413, - 416 - ], - "y": [ - 224, - 222, - 223, - 223, - 224, - 225 - ], - "t": [ - 1689748309782, - 1689748309825, - 1689748309842, - 1689748309859, - 1689748309876, - 1689748309892 - ], - "p": [ - 0.5, - 0.79, - 0.75, - 0.78, - 0.72, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 392, - 397, - 400, - 407, - 413, - 417, - 420 - ], - "y": [ - 230, - 228, - 228, - 228, - 229, - 229, - 230 - ], - "t": [ - 1689748310171, - 1689748310225, - 1689748310242, - 1689748310258, - 1689748310275, - 1689748310291, - 1689748310325 - ], - "p": [ - 0.5, - 0.77, - 0.68, - 0.78, - 0.77, - 0.71, - 0.68 - ] - } -] diff --git a/test/integration/strokes/sumSimple.json b/test/integration/strokes/sumSimple.json deleted file mode 100644 index dfbd787a3..000000000 --- a/test/integration/strokes/sumSimple.json +++ /dev/null @@ -1,101 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 461, "y": 215, "t": 1694506504676, "p": 0.1 }, - { "x": 464, "y": 213, "t": 1694506504695, "p": 0.7 }, - { "x": 471, "y": 206, "t": 1694506504728, "p": 0.82 }, - { "x": 475, "y": 201, "t": 1694506504744, "p": 0.77 }, - { "x": 482, "y": 194, "t": 1694506504760, "p": 0.82 }, - { "x": 486, "y": 185, "t": 1694506504777, "p": 0.82 }, - { "x": 491, "y": 176, "t": 1694506504793, "p": 0.68 }, - { "x": 494, "y": 167, "t": 1694506504809, "p": 0.82 }, - { "x": 496, "y": 172, "t": 1694506504955, "p": 0.75 }, - { "x": 496, "y": 177, "t": 1694506504972, "p": 0.74 }, - { "x": 496, "y": 207, "t": 1694506504988, "p": 0.45 }, - { "x": 497, "y": 232, "t": 1694506505004, "p": 0.5 }, - { "x": 497, "y": 245, "t": 1694506505021, "p": 0.64 }, - { "x": 497, "y": 258, "t": 1694506505036, "p": 0.64 }, - { "x": 497, "y": 267, "t": 1694506505053, "p": 0.81 }, - { "x": 497, "y": 272, "t": 1694506505069, "p": 0.74 }, - { "x": 497, "y": 276, "t": 1694506505086, "p": 0.71 }, - { "x": 498, "y": 281, "t": 1694506505102, "p": 0.75 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 583, "y": 180, "t": 1694506505627, "p": 0.1 }, - { "x": 583, "y": 187, "t": 1694506505693, "p": 0.78 }, - { "x": 583, "y": 197, "t": 1694506505708, "p": 0.68 }, - { "x": 580, "y": 231, "t": 1694506505725, "p": 0.42 }, - { "x": 580, "y": 242, "t": 1694506505741, "p": 0.67 }, - { "x": 578, "y": 253, "t": 1694506505757, "p": 0.67 }, - { "x": 578, "y": 260, "t": 1694506505774, "p": 0.78 }, - { "x": 578, "y": 266, "t": 1694506505790, "p": 0.77 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 557, "y": 236, "t": 1694506506167, "p": 0.1 }, - { "x": 560, "y": 235, "t": 1694506506196, "p": 0.68 }, - { "x": 564, "y": 234, "t": 1694506506228, "p": 0.72 }, - { "x": 569, "y": 232, "t": 1694506506261, "p": 0.75 }, - { "x": 573, "y": 232, "t": 1694506506277, "p": 0.71 }, - { "x": 576, "y": 232, "t": 1694506506293, "p": 0.68 }, - { "x": 583, "y": 232, "t": 1694506506310, "p": 0.78 }, - { "x": 590, "y": 232, "t": 1694506506326, "p": 0.78 }, - { "x": 595, "y": 231, "t": 1694506506342, "p": 0.75 }, - { "x": 598, "y": 231, "t": 1694506506358, "p": 0.68 }, - { "x": 601, "y": 230, "t": 1694506506374, "p": 0.68 }, - { "x": 605, "y": 229, "t": 1694506506405, "p": 0.72 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 649, "y": 176, "t": 1694506506971, "p": 0.1 }, - { "x": 656, "y": 175, "t": 1694506507003, "p": 0.79 }, - { "x": 659, "y": 174, "t": 1694506507019, "p": 0.68 }, - { "x": 663, "y": 174, "t": 1694506507036, "p": 0.71 }, - { "x": 668, "y": 174, "t": 1694506507052, "p": 0.74 }, - { "x": 671, "y": 174, "t": 1694506507068, "p": 0.68 }, - { "x": 674, "y": 179, "t": 1694506507084, "p": 0.76 }, - { "x": 680, "y": 186, "t": 1694506507101, "p": 0.81 }, - { "x": 683, "y": 191, "t": 1694506507117, "p": 0.76 }, - { "x": 685, "y": 196, "t": 1694506507133, "p": 0.75 }, - { "x": 686, "y": 199, "t": 1694506507149, "p": 0.68 }, - { "x": 686, "y": 202, "t": 1694506507165, "p": 0.68 }, - { "x": 680, "y": 208, "t": 1694506507198, "p": 0.81 }, - { "x": 676, "y": 210, "t": 1694506507215, "p": 0.73 }, - { "x": 666, "y": 216, "t": 1694506507230, "p": 0.66 }, - { "x": 658, "y": 220, "t": 1694506507247, "p": 0.81 }, - { "x": 645, "y": 228, "t": 1694506507263, "p": 0.61 }, - { "x": 640, "y": 229, "t": 1694506507279, "p": 0.75 }, - { "x": 644, "y": 230, "t": 1694506507409, "p": 0.72 }, - { "x": 652, "y": 230, "t": 1694506507425, "p": 0.8 }, - { "x": 660, "y": 230, "t": 1694506507441, "p": 0.8 }, - { "x": 671, "y": 230, "t": 1694506507457, "p": 0.67 }, - { "x": 677, "y": 230, "t": 1694506507474, "p": 0.77 }, - { "x": 682, "y": 230, "t": 1694506507490, "p": 0.74 }, - { "x": 687, "y": 234, "t": 1694506507506, "p": 0.77 }, - { "x": 690, "y": 236, "t": 1694506507522, "p": 0.7 }, - { "x": 693, "y": 240, "t": 1694506507554, "p": 0.74 }, - { "x": 693, "y": 244, "t": 1694506507570, "p": 0.71 }, - { "x": 692, "y": 248, "t": 1694506507603, "p": 0.72 }, - { "x": 687, "y": 252, "t": 1694506507619, "p": 0.77 }, - { "x": 681, "y": 254, "t": 1694506507635, "p": 0.77 }, - { "x": 678, "y": 255, "t": 1694506507651, "p": 0.68 }, - { "x": 664, "y": 257, "t": 1694506507668, "p": 0.62 }, - { "x": 659, "y": 257, "t": 1694506507684, "p": 0.74 }, - { "x": 653, "y": 257, "t": 1694506507700, "p": 0.77 }, - { "x": 649, "y": 257, "t": 1694506507716, "p": 0.71 }, - { "x": 646, "y": 257, "t": 1694506507732, "p": 0.68 } - ] - } -] diff --git a/test/integration/strokesDatas.js b/test/integration/strokesDatas.js deleted file mode 100644 index 3ebad519a..000000000 --- a/test/integration/strokesDatas.js +++ /dev/null @@ -1,523 +0,0 @@ -const hStrokes = require("./strokes/h.json") -module.exports.h = { - type: "TEXT", - strokes: hStrokes, - exports: { - "text/plain": ["h"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloStrokes = require("./strokes/hello.json") -module.exports.hello = { - type: "TEXT", - strokes: helloStrokes, - exports: { - "text/plain": ["h", "he", "hel", "hell", "hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "kello", "helloo", "hellor", "hello"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloStrike = require("./strokes/helloStrike.json") -module.exports.helloStrikeStroke = { - name: "helloStrike", - type: "TEXT", - strokes: helloStrike, - apiVersion: "V4", - exports: { - "text/plain": ["hello", ""], - }, -} - -const helloOne = require("./strokes/helloOneStroke.json") -module.exports.helloOneStroke = { - type: "TEXT", - strokes: helloOne, - exports: { - "text/plain": ["hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "helto", "helts", "kelto", "felto"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloHowAreYouStrokes = require("./strokes/helloHowAreYou.json") -module.exports.helloHowAreYou = { - type: "TEXT", - strokes: helloHowAreYouStrokes, - exports: { - "text/plain": [ - "hello", - "hello how", - "hello how o", - "hello how are", - "hello how are you", - "hello how are you?", - "hello how are you?", - ], - }, -} - -const oneStrokes = require("./strokes/one.json") -module.exports.one = { - type: "MATH", - strokes: oneStrokes, - exports: { - LATEX: ["1"], - }, -} - -const equation1Stroke = require("./strokes/equation1.json") -module.exports.equation1 = { - type: "MATH", - strokes: equation1Stroke, - exports: { - LATEX: ['y', 'y-', 'y=', 'y=3', 'y=30', 'y=3x', 'y=3x-', 'y=3x+', 'y=3x+2'], - MATHML: { - STANDARD: ` y = 3 x + 2 ` - } - }, -} - -const equation2Stroke = require('./strokes/equation2.json') -module.exports.equation2 = { - type: 'MATH', - strokes: equation2Stroke, - exports: { - LATEX: ['-', '\\sqrt {2}', 'r', ''] - }, -} - -const fenceStroke = require("./strokes/fence.json") -module.exports.fence = { - type: "MATH", - strokes: fenceStroke, - exports: { - MATHML: { - STANDARD: [ - "\n" + - " \n" + - " { \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 3 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 6 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - ], - MSOFFICE: [ - "\n" + - ' \n' + - " \n" + - " \n" + - " \n" + - " \n" + - " 3 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 6 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - ], - }, - }, -} - -const lineStroke = require("./strokes/line.json") -module.exports.line = { - type: "DIAGRAM", - strokes: lineStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Edge", - kind: "line", - connected: [], - ports: [], - x1: 60.0628433, - y1: 47.2759705, - x2: 98.6923065, - y2: 47.0647392, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const rectangleStroke = require("./strokes/rectangle.json") -module.exports.rectangle = { - type: "DIAGRAM", - strokes: rectangleStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Edge", - kind: "line", - connected: [], - ports: [], - x1: 57.5701027, - y1: 52.1299248, - x2: 56.6754189, - y2: 71.9691315, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Node", - kind: "rectangle", - x: 56.8398209, - y: 51.9560471, - width: 33.1532364, - height: 19.9649887, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const ponyEraseStroke = require("./strokes/ponyErase.json") -module.exports.ponyErase = { - type: "TEXT", - strokes: ponyEraseStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "Pony", "pong", "pory", "fony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "ony", - words: [ - { - label: "ony", - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -module.exports.ponyErasePrecisely = { - type: "TEXT", - strokes: ponyEraseStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "Pony", "pong", "pory", "fony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "oony", "rony", "wony", "pony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const sumStroke = require('./strokes/sum.json') -module.exports.sum = { - type: 'MATH', - strokes: sumStroke, - exports: { - LATEX: ['3', '3-', '3+', '3+1', '3+1-', '3+1='] - }, - converts: { - LATEX: ['3+1=4'] - } -} - -const sumSimpleStroke = require('./strokes/sumSimple.json') -module.exports.sumSimple = { - type: 'MATH', - strokes: sumSimpleStroke, - exports: { - LATEX: ['1', '1-', '1+', '1+3'] - }, - converts: { - LATEX: ['1+3=4'] - } -} - -const parisStrokes = require("./strokes/interact/paris.json") -module.exports.paris = { - type: "TEXT", - strokes: parisStrokes, - exports: { - "text/plain": ["paris"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "paris", - words: [ - { - label: "paris", - candidates: ["paris"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const tokyoStrokes = require("./strokes/interact/tokyo.json") -module.exports.tokyo = { - type: "TEXT", - strokes: tokyoStrokes, - exports: { - "text/plain": ["t", "to", "tok", "toky", "tokyo"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "tokyo", - words: [ - { - label: "tokyo", - candidates: ["tokyo"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const madridStrokes = require("./strokes/interact/madrid.json") -module.exports.madrid = { - type: "TEXT", - strokes: madridStrokes, - exports: { - "text/plain": ["madrid"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "madrid", - words: [ - { - label: "madrid", - candidates: ["madrid"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const romeStrokes = require("./strokes/interact/rome.json") -module.exports.rome = { - type: "TEXT", - strokes: romeStrokes, - exports: { - "text/plain": ["rome"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "rome", - words: [ - { - label: "rome", - candidates: ["rome"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const buenosAiresStrokes = require("./strokes/interact/buenosAires.json") -module.exports.buenosAires = { - type: "TEXT", - strokes: buenosAiresStrokes, - exports: { - "text/plain": ["buenos aires"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "buenos aires", - words: [ - { - label: "buenos aires", - candidates: ["buenos aires"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const abrausorusStrokes = require("./strokes/abrausorus.json") -module.exports.abrausorus = { - type: "TEXT", - strokes: abrausorusStrokes, - exports: { - "text/plain": ["abrausorus"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "abrausorus", - words: [ - { - label: "abrausorus", - candidates: ["abrausorus"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const centralProcessingUnitStrokes = require("./strokes/multiple-inputs/centralProcessingUnit.json") -module.exports.centralProcessingUnit = { - type: "TEXT", - strokes: centralProcessingUnitStrokes, - exports: { - "text/plain": "central processing unit", - }, -} - -const Strokes1943 = require("./strokes/multiple-inputs/1943.json") -module.exports.oneThousandNineHundredAndFortyThree = { - type: "TEXT", - strokes: Strokes1943, - exports: { - "text/plain": "1943", - }, -} - -const Strokes1993 = require("./strokes/multiple-inputs/1993.json") -module.exports.oneThousandNineHundredAndNintyThree = { - type: "TEXT", - strokes: Strokes1993, - exports: { - "text/plain": "1993", - }, -} - -const helloOneSurrounded = require("./strokes/helloOneStrokeSurrounded.json") -module.exports.helloOneSurrounded = { - type: "TEXT", - strokes: helloOneSurrounded, - exports: { - "text/plain": ["hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "helto", "helts", "kelto", "felto"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const covfefeStrokes = require("./strokes/covfefe.json") -module.exports.covfefe = { - type: "TEXT", - strokes: covfefeStrokes, - exports: { - "text/plain": ["covfefe"], - }, -} diff --git a/test/unit/00-configuration/00-DefaultConfiguration.test.ts b/test/unit/00-configuration/00-DefaultConfiguration.test.ts deleted file mode 100644 index 57389ea15..000000000 --- a/test/unit/00-configuration/00-DefaultConfiguration.test.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { configuration } from "../../../src/iink" - -describe("DefaultConfiguration.ts", () => -{ - const { DefaultConfiguration } = configuration - describe("should have DefaultServerConfiguration", () => - { - test("should have protocol", () => - { - expect(DefaultConfiguration.server.protocol).toStrictEqual("WEBSOCKET") - }) - test("should have scheme", () => - { - expect(DefaultConfiguration.server.scheme).toStrictEqual("https") - }) - test("should have host", () => - { - expect(DefaultConfiguration.server.host).toStrictEqual("cloud.myscript.com") - }) - test("should not have applicationKey", () => - { - expect(DefaultConfiguration.server.applicationKey).toStrictEqual("") - }) - test("should not have hmacKey", () => - { - expect(DefaultConfiguration.server.hmacKey).toStrictEqual("") - }) - test("should not useWindowLocation", () => - { - expect(DefaultConfiguration.server.useWindowLocation).toStrictEqual(false) - }) - }) - - describe("should have DefaultRecognitionConfiguration", () => - { - test("should have type", () => - { - expect(DefaultConfiguration.recognition.type).toStrictEqual("TEXT") - }) - test("should have lang", () => - { - expect(DefaultConfiguration.recognition.lang).toStrictEqual("en_US") - }) - test("should have gesture", () => - { - expect(DefaultConfiguration.recognition.gesture.enable).toStrictEqual(true) - }) - test("should have renderer", () => - { - expect(DefaultConfiguration.recognition.renderer.debug["draw-image-boxes"]).toStrictEqual(false) - expect(DefaultConfiguration.recognition.renderer.debug["draw-image-boxes"]).toStrictEqual(false) - }) - test("should have math", () => - { - expect(DefaultConfiguration.recognition.math.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.math.solver?.enable).toStrictEqual(true) - expect(DefaultConfiguration.recognition.math.eraser?.["erase-precisely"]).toStrictEqual(false) - expect(DefaultConfiguration.recognition.math["undo-redo"]?.mode).toStrictEqual("stroke") - }) - test("should have text", () => - { - expect(DefaultConfiguration.recognition.text.guides?.enable).toStrictEqual(true) - expect(DefaultConfiguration.recognition.text.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.text.eraser?.["erase-precisely"]).toStrictEqual(false) - }) - test("should have diagram", () => - { - expect(DefaultConfiguration.recognition.diagram.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.diagram.eraser?.["erase-precisely"]).toStrictEqual(false) - }) - test("should have raw-content", () => - { - expect(DefaultConfiguration.recognition["raw-content"]).not.toHaveProperty("mimeTypes") - expect(DefaultConfiguration.recognition["raw-content"].recognition?.text).toStrictEqual(true) - expect(DefaultConfiguration.recognition["raw-content"].recognition?.shape).toStrictEqual(true) - expect(DefaultConfiguration.recognition["raw-content"].eraser?.["erase-precisely"]).toStrictEqual(false) - }) - }) - - describe("should have DefaultGrabberConfiguration", () => - { - test("should have listenerOptions", () => - { - expect(DefaultConfiguration.grabber.listenerOptions.capture).toStrictEqual(false) - expect(DefaultConfiguration.grabber.listenerOptions.passive).toStrictEqual(true) - }) - test("should have xyFloatPrecision", () => - { - expect(DefaultConfiguration.grabber.xyFloatPrecision).toStrictEqual(0) - }) - test("should have timestampFloatPrecision", () => - { - expect(DefaultConfiguration.grabber.timestampFloatPrecision).toStrictEqual(0) - }) - }) - - describe("should have DefaultRenderingConfiguration", () => - { - test("should have minHeight", () => - { - expect(DefaultConfiguration.rendering.minHeight).toStrictEqual(100) - }) - test("should have minWidth", () => - { - expect(DefaultConfiguration.rendering.minWidth).toStrictEqual(100) - }) - test("should have smartGuide", () => - { - expect(DefaultConfiguration.rendering.smartGuide.enable).toStrictEqual(true) - expect(DefaultConfiguration.rendering.smartGuide.fadeOut.enable).toStrictEqual(false) - expect(DefaultConfiguration.rendering.smartGuide.fadeOut.duration).toStrictEqual(5000) - }) - }) - - describe("should have DefaultTriggerConfiguration", () => - { - test("should have exportContent", () => - { - expect(DefaultConfiguration.triggers.exportContent).toStrictEqual("POINTER_UP") - }) - test("should have exportContentDelay", () => - { - expect(DefaultConfiguration.triggers.exportContentDelay).toStrictEqual(1000) - }) - test("should have resizeTriggerDelay", () => - { - expect(DefaultConfiguration.triggers.resizeTriggerDelay).toStrictEqual(100) - }) - }) - - describe("should have DefaultEventsConfiguration", () => - { - test("should have processDelay", () => - { - expect(DefaultConfiguration.events.processDelay).toStrictEqual(10) - }) - }) - - describe("should have DefaultUndoRedoConfiguration", () => - { - test("should have maxStackSize", () => - { - expect(DefaultConfiguration["undo-redo"].maxStackSize).toStrictEqual(100) - }) - }) -}) diff --git a/test/unit/00-configuration/01-Configuration.test.ts b/test/unit/00-configuration/01-Configuration.test.ts deleted file mode 100644 index 46343167a..000000000 --- a/test/unit/00-configuration/01-Configuration.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import -{ - ConfigurationTextWebsocket, - ConfigurationTextRest, - ConfigurationDiagramRest, - ConfigurationRawContentRest, - AllOverrideConfiguration, -} from "../_dataset/configuration.dataset" -import { TConfiguration, TConfigurationClient } from "../../../src/@types" -import { configuration } from "../../../src/iink" - -describe("Configuration.ts", () => -{ - const { Configuration, DefaultConfiguration } = configuration - - test("should be default configuration", () => - { - const configurationDefault = new Configuration() - expect(configurationDefault.events).toStrictEqual(DefaultConfiguration.events) - expect(configurationDefault.grabber).toStrictEqual(DefaultConfiguration.grabber) - expect(configurationDefault.recognition).toStrictEqual(DefaultConfiguration.recognition) - expect(configurationDefault.rendering).toStrictEqual(DefaultConfiguration.rendering) - expect(configurationDefault.server).toStrictEqual(DefaultConfiguration.server) - expect(configurationDefault.triggers).toStrictEqual(DefaultConfiguration.triggers) - expect(configurationDefault["undo-redo"]).toStrictEqual(DefaultConfiguration["undo-redo"]) - }) - - const configurationsClient: { name: string, config: TConfigurationClient }[] = [ - { name: "ConfigurationTextWebsocket", config: ConfigurationTextWebsocket }, - { name: "ConfigurationTextRest", config: ConfigurationTextRest }, - { name: "ConfigurationDiagramRest", config: ConfigurationDiagramRest }, - { name: "ConfigurationRawContentRest", config: ConfigurationRawContentRest } - ] - - configurationsClient.forEach(cc => - { - const configuration: TConfiguration = new Configuration(cc.config) - describe(`should merge ${ cc.name } with DefaultConfiguration`, () => - { - test("should have server.protocol", () => - { - expect(configuration.server.protocol).toStrictEqual(cc.config?.server?.protocol) - }) - test("should have server.scheme", () => - { - expect(configuration.server.scheme).toStrictEqual(cc.config?.server?.scheme) - }) - test("should have server.host", () => - { - expect(configuration.server.host).toStrictEqual(cc.config?.server?.host) - }) - test("should have server.applicationKey", () => - { - expect(configuration.server.applicationKey).toStrictEqual(cc.config?.server?.applicationKey) - }) - test("should have server.hmacKey", () => - { - expect(configuration.server.hmacKey).toStrictEqual(cc.config?.server?.hmacKey) - }) - test("should have default server.websocket", () => - { - expect(configuration.server.websocket).toStrictEqual(DefaultConfiguration.server.websocket) - }) - test("should have recognition.type", () => - { - expect(configuration.recognition.type).toStrictEqual(cc.config?.recognition?.type) - }) - if (cc.config.recognition?.type === "Raw Content") { - test("should not have recognition[raw-content].mimeTypes", () => - { - expect(configuration.recognition["raw-content"]).not.toHaveProperty("raw-content") - }) - } else { - test("should have recognition.text.mimeTypes", () => - { - switch (configuration.recognition.type) { - case "MATH": - expect(configuration.recognition.math.mimeTypes).toStrictEqual(cc.config?.recognition?.math?.mimeTypes) - break - case "DIAGRAM": - expect(configuration.recognition.diagram.mimeTypes).toStrictEqual(cc.config?.recognition?.diagram?.mimeTypes) - break - case "TEXT": - expect(configuration.recognition.text.mimeTypes).toStrictEqual(cc.config?.recognition?.text?.mimeTypes) - break - default: - break - } - }) - } - }) - }) - - describe("should override all values", () => - { - const overrideConfig: TConfiguration = new Configuration(AllOverrideConfiguration) - - test("should override events", () => - { - expect(overrideConfig.events).toStrictEqual(AllOverrideConfiguration.events) - }) - - test("should override grabber", () => - { - expect(overrideConfig.grabber).toStrictEqual(AllOverrideConfiguration.grabber) - }) - - test("should override recognition", () => - { - expect(overrideConfig.recognition).toStrictEqual(AllOverrideConfiguration.recognition) - }) - - test("should override rendering", () => - { - expect(overrideConfig.rendering).toStrictEqual(AllOverrideConfiguration.rendering) - }) - - test("should override server", () => - { - expect(overrideConfig.server).toStrictEqual(AllOverrideConfiguration.server) - }) - - test("should override triggers", () => - { - expect(overrideConfig.triggers).toStrictEqual(AllOverrideConfiguration.triggers) - }) - - test("should override undo-redo", () => - { - expect(overrideConfig["undo-redo"]).toStrictEqual(AllOverrideConfiguration["undo-redo"]) - }) - }) - - describe("specifics rules", () => - { - test("should add mimeType JIIX if rendering.smartGuide = true", () => - { - const conf = JSON.parse(JSON.stringify(DefaultConfiguration)) as TConfiguration - conf.server.protocol = "WEBSOCKET" - conf.recognition.type = "TEXT" - conf.rendering.smartGuide.enable = true - conf.recognition.text.mimeTypes = ["text/plain"] - expect(conf.recognition.text.mimeTypes).not.toContain("application/vnd.myscript.jiix") - const c: TConfiguration = new Configuration(conf) - expect(c.recognition.text.mimeTypes).toContain("application/vnd.myscript.jiix") - }) - - test("should set rendering.smartGuide = false if REST", () => - { - const conf = { ...DefaultConfiguration } - conf.server.protocol = "REST" - conf.rendering.smartGuide.enable = true - const c: TConfiguration = new Configuration(conf) - expect(c.rendering.smartGuide.enable).toStrictEqual(false) - }) - - test("should set triggers.exportContent = QUIET_PERIOD if REST", () => - { - const conf = { ...DefaultConfiguration } - conf.server.protocol = "REST" - conf.triggers.exportContent = "POINTER_UP" - const c: TConfiguration = new Configuration(conf) - expect(c.triggers.exportContent).toStrictEqual("QUIET_PERIOD") - }) - - test("should set rendering.smartGuide = false if not TEXT", () => - { - const conf = { ...DefaultConfiguration } - conf.recognition.type = "MATH" - conf.rendering.smartGuide.enable = true - const c: TConfiguration = new Configuration(conf) - expect(c.rendering.smartGuide.enable).toStrictEqual(false) - }) - - test("should set server.scheme & server.host if server.useWindowLocation = true", () => - { - const conf = { ...DefaultConfiguration } - conf.server.useWindowLocation = true - - Object.defineProperty(window, "location", { - value: new URL("https://localhost:3000") - }) - - const c: TConfiguration = new Configuration(conf) - expect(c.server.scheme).toStrictEqual(window.location.protocol.replace(":", "")) - expect(c.server.host).toStrictEqual(window.location.host) - }) - }) - -}) diff --git a/test/unit/01-grabber/00-PointerEventGrabber.test.ts b/test/unit/01-grabber/00-PointerEventGrabber.test.ts deleted file mode 100644 index 753b6eb29..000000000 --- a/test/unit/01-grabber/00-PointerEventGrabber.test.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { DoubleTouchEventFake, LeftClickEventFake, RightClickEventFake, TouchEventFake } from "../utils/PointerEventFake" -import { TGrabberConfiguration, IGrabber } from "../../../src/@types" -import { configuration, grabber } from "../../../src/iink" - -describe("PointerEventGrabber.ts", () => -{ - const { DefaultConfiguration } = configuration - const { PointerEventGrabber} = grabber - - test("should create with default configuration", () => - { - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - expect(grabber).toBeDefined() - }) - - describe("should attach & detach", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.attach(wrapperHTML) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - - const pointerMoveEvt = new LeftClickEventFake("pointermove", { - pointerType: "pen", - clientX: 15, - clientY: 15, - pressure: 1 - }) - pointerMoveEvt.pointerId = pointerDownEvt.pointerId - - const pointerUpEvt = new LeftClickEventFake("pointerup", { - pointerType: "pen", - clientX: 15, - clientY: 15, - pressure: 1 - }) - pointerUpEvt.pointerId = pointerDownEvt.pointerId - - test("should listen pointerdown event", () => - { - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).toBeCalledTimes(1) - }) - - test("should listen pointermove event", () => - { - wrapperHTML.dispatchEvent(pointerMoveEvt) - expect(grabber.onPointerMove).toBeCalledTimes(1) - }) - - test("should listen pointerup event", () => - { - wrapperHTML.dispatchEvent(pointerUpEvt) - expect(grabber.onPointerUp).toBeCalledTimes(1) - }) - - test("should call detach if already attach", () => - { - const g: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - g.onPointerDown = jest.fn() - g.onPointerMove = jest.fn() - g.onPointerUp = jest.fn() - g.detach = jest.fn() - g.attach(wrapperHTML) - g.attach(wrapperHTML) - expect(g.detach).toBeCalledTimes(1) - }) - - test("should not listen pointerdown event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - }) - - test("should not listen pointermove event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerMoveEvt) - expect(grabber.onPointerMove).not.toBeCalled() - }) - - test("should not listen pointerup event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerUpEvt) - expect(grabber.onPointerUp).not.toBeCalled() - }) - }) - - describe("Should extract TPointer from event", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.onPointerDown = jest.fn() - grabber.attach(wrapperHTML) - - test("should extract TPointer from mouseEvent", () => - { - const mouseDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - wrapperHTML.dispatchEvent(mouseDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - mouseDownEvt, - expect.objectContaining({ - x: mouseDownEvt.clientX, - y: mouseDownEvt.clientY, - p: mouseDownEvt.pressure - }) - ) - }) - - test("should extract TPointer from touchEvent", () => - { - const touchDownEvt = new TouchEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - wrapperHTML.dispatchEvent(touchDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - touchDownEvt, - expect.objectContaining({ - x: touchDownEvt.changedTouches[0].clientX, - y: touchDownEvt.changedTouches[0].clientY, - p: touchDownEvt.pressure - }) - ) - }) - }) - - describe("Should use configuration", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - test("should not round values with default configuration", () => - { - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: pointerDownEvt.clientX, - y: pointerDownEvt.clientY, - p: pointerDownEvt.pressure - }) - ) - grabber.detach() - }) - - test("should round values from configuration", () => - { - const grabberConfig: TGrabberConfiguration = { ...DefaultConfiguration.grabber, xyFloatPrecision: 2 } - const grabber: IGrabber = new PointerEventGrabber(grabberConfig) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - grabber.onPointerDown = jest.fn() - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: Math.round(pointerDownEvt.clientX / 100) * 100, - y: Math.round(pointerDownEvt.clientY / 100) * 100, - p: pointerDownEvt.pressure - }) - ) - }) - - test("should not round values from configuration if negative precision", () => - { - const grabberConfig: TGrabberConfiguration = { ...DefaultConfiguration.grabber, xyFloatPrecision: -2 } - const grabber: IGrabber = new PointerEventGrabber(grabberConfig) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - grabber.onPointerDown = jest.fn() - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: pointerDownEvt.clientX, - y: pointerDownEvt.clientY, - p: pointerDownEvt.pressure - }) - ) - }) - }) - - describe("Should ignore Event", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.attach(wrapperHTML) - grabber.onPointerDown = jest.fn() - - test("should not listen right click event", () => - { - const pointerDownEvt = new RightClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 300, - clientY: 500, - pressure: 1 - }) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - grabber.detach(wrapperHTML) - }) - - test("should not listen right click event", () => - { - const pointerDownEvt = new DoubleTouchEventFake("pointerdown", { - pointerType: "pen", - clientX: 300, - clientY: 500, - pressure: 1 - }) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - grabber.detach(wrapperHTML) - }) - }) - -}) diff --git a/test/unit/02-model/00-Stroke.test.ts b/test/unit/02-model/00-Stroke.test.ts deleted file mode 100644 index 8d4b95d9b..000000000 --- a/test/unit/02-model/00-Stroke.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { TStroke, TPenStyle } from "../../../src/@types" -import { model, style } from "../../../src/iink" - -describe("Stroke.ts", () => -{ - const { Stroke } = model - const { DefaultPenStyle } = style - test("should create with default pointerType", () => - { - const stroke: TStroke = new Stroke(DefaultPenStyle, 12) - expect(stroke).toBeDefined() - expect(stroke.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(stroke.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(stroke.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(stroke.style.color).toBe(DefaultPenStyle.color) - expect(stroke.style.width).toBe(DefaultPenStyle.width) - expect(stroke.elementType).toBeUndefined() - expect(stroke.pointers).toHaveLength(0) - expect(stroke.pointerId).toBe(12) - expect(stroke.pointerType).toBe("pen") - expect(stroke.type).toBe("stroke") - }) - - test("should create with pointerType mouse", () => - { - const stroke: TStroke = new Stroke(DefaultPenStyle, 12, "mouse") - expect(stroke.pointerType).toBe("mouse") - }) - - test("should create with custom PenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "purple", - "-myscript-pen-width": 12, - color: "green", - width: 42 - } - - const stroke: TStroke = new Stroke(penStyle, 12) - expect(stroke).toBeDefined() - expect(stroke.style["-myscript-pen-fill-color"]).toBe(penStyle["-myscript-pen-fill-color"]) - expect(stroke.style["-myscript-pen-fill-style"]).toBe(penStyle["-myscript-pen-fill-style"]) - expect(stroke.style["-myscript-pen-width"]).toBe(penStyle["-myscript-pen-width"]) - expect(stroke.style.color).toBe(penStyle.color) - expect(stroke.style.width).toBe(penStyle.width) - }) -}) diff --git a/test/unit/02-model/01-Model.test.ts b/test/unit/02-model/01-Model.test.ts deleted file mode 100644 index 566bece57..000000000 --- a/test/unit/02-model/01-Model.test.ts +++ /dev/null @@ -1,592 +0,0 @@ -import { delay } from "../utils/helpers" -import { IModel, TExport, TPointer } from "../../../src/@types" -import { model, style } from "../../../src/iink" - -describe("Model.ts", () => -{ - const { Model, Stroke } = model - const { DefaultPenStyle } = style - const width = 100, height = 100 - test("should create", () => - { - const model: IModel = new Model(width, height) - expect(model).toBeDefined() - }) - - describe("mergeExport", () => - { - test("should initialize export if toBeUndefined", () => - { - const model: IModel = new Model(width, height) - const e: TExport = { "text/plain": "poney" } - expect(model.exports).toBeUndefined() - model.mergeExport(e) - expect(model.exports).toEqual(e) - }) - test("should merge export", () => - { - const model: IModel = new Model(width, height) - const originExport: TExport = { - "application/vnd.myscript.jiix": { - "type": "Text", - "label": "poney", - "words": [ - { - "label": "poney", - "candidates": ["poney", "Poney", "ponay", "ponex", "pony"] - } - ], - "version": "3", - "id": "MainBlock" - } - } - model.exports = originExport - const e: TExport = { "text/plain": "poney" } - - model.mergeExport(e) - expect(model.exports).toMatchObject(originExport) - expect(model.exports).toMatchObject(e) - }) - }) - - describe("mergeConvert", () => - { - test("should initialize export if toBeUndefined", () => - { - const model: IModel = new Model(width, height) - const e: TExport = { "text/plain": "poney" } - expect(model.converts).toBeUndefined() - model.mergeConvert(e) - expect(model.converts).toEqual(e) - }) - test("should merge export", () => - { - const model: IModel = new Model(width, height) - const originExport: TExport = { - "application/vnd.myscript.jiix": { - "type": "Text", - "label": "poney", - "words": [ - { - "label": "poney", - "candidates": ["poney", "Poney", "ponay", "ponex", "pony"] - } - ], - "version": "3", - "id": "MainBlock" - } - } - model.converts = originExport - const e: TExport = { "text/plain": "poney" } - - model.mergeConvert(e) - expect(model.converts).toMatchObject(originExport) - expect(model.converts).toMatchObject(e) - }) - }) - - describe("addPoint", () => - { - const model: IModel = new Model(width, height) - test("should add point to x, y, t & t array", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - model.addPoint(stroke, point) - - expect(stroke.pointers).toHaveLength(1) - expect(stroke.pointers[0].x).toBe(point.x) - expect(stroke.pointers[0].y).toBe(point.y) - expect(stroke.pointers[0].p).toBe(point.p) - expect(stroke.pointers[0].t).toBe(point.t) - }) - - test("should not add point if x is too close", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 10, - p: 10, - x: 1, - y: 10 - } - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - }) - - test("should not add point if y is too close", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 10, - p: 10, - x: 10, - y: 1 - } - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - }) - }) - - describe("updateStroke", () => - { - test("should updateStroke", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - const strokeUpdated = new Stroke(DefaultPenStyle, 1) - strokeUpdated.id = stroke.id - strokeUpdated.pointers.push({ p: 0.5, t: 0.5, x: 100, y: 27 }) - model.updateStroke(strokeUpdated) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(strokeUpdated) - }) - test("should not updateStroke if id not exist", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - const strokeUpdated = new Stroke(DefaultPenStyle, 1) - strokeUpdated.id = "pouette" - strokeUpdated.pointers.push({ p: 0.5, t: 0.5, x: 100, y: 27 }) - model.updateStroke(strokeUpdated) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).not.toStrictEqual(strokeUpdated) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - }) - }) - - describe("removeStroke", () => - { - test("should removeStroke", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - model.removeStroke(stroke.id) - expect(model.rawStrokes).toHaveLength(0) - }) - test("should not removeStroke if id not exist", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - model.removeStroke("pouette") - expect(model.rawStrokes).toHaveLength(1) - }) - }) - - describe("rawStrokes", () => - { - test("should addStrokes", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - }) - - test("should extractUnsentStrokes", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - const extractStroke = model.extractUnsentStrokes() - expect(extractStroke).toHaveLength(1) - expect(extractStroke[0]).toStrictEqual(stroke) - expect(model.rawStrokes).toHaveLength(1) - }) - }) - - describe("currentStroke", () => - { - const model: IModel = new Model(width, height) - test("should initCurrentStroke", async () => - { - expect(model.currentStroke).toBeUndefined() - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - expect(model.creationTime).toStrictEqual(model.modificationDate) - await delay(100) - model.initCurrentStroke(point, 42, "mouse", DefaultPenStyle) - expect(model.modificationDate - model.creationTime).toBeGreaterThanOrEqual(100) - expect(model.currentStroke).toBeDefined() - expect(model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(model.currentStroke?.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(model.currentStroke?.style.color).toBe(DefaultPenStyle.color) - expect(model.currentStroke?.style.width).toBe(DefaultPenStyle.width) - expect(model.currentStroke?.pointers).toHaveLength(1) - expect(model.currentStroke?.pointers[0].x).toBe(point.x) - expect(model.currentStroke?.pointers[0].y).toBe(point.y) - expect(model.currentStroke?.pointers[0].t).toBe(point.t) - expect(model.currentStroke?.pointers[0].p).toBe(point.p) - }) - test("should initCurrentStroke with -myscript-pen-width", async () => - { - const _model: IModel = new Model(width, height) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - const style = { ...DefaultPenStyle } - style["-myscript-pen-width"] = 2 - expect(_model.creationTime).toStrictEqual(_model.modificationDate) - await delay(101) - _model.initCurrentStroke(point, 42, "mouse", style) - expect(_model.modificationDate - _model.creationTime).toBeGreaterThanOrEqual(100) - expect(_model.currentStroke).toBeDefined() - expect(_model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(style["-myscript-pen-fill-color"]) - expect(_model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(style["-myscript-pen-fill-style"]) - expect(_model.currentStroke?.style["-myscript-pen-width"]).toBe(style["-myscript-pen-width"]) - expect(_model.currentStroke?.style.color).toBe(style.color) - expect(_model.currentStroke?.style.width).toBe(style.width) - expect(model.currentStroke?.pointers).toHaveLength(1) - expect(model.currentStroke?.pointers[0].x).toBe(point.x) - expect(model.currentStroke?.pointers[0].y).toBe(point.y) - expect(model.currentStroke?.pointers[0].t).toBe(point.t) - expect(model.currentStroke?.pointers[0].p).toBe(point.p) - }) - - test("should appendToCurrentStroke", () => - { - expect(model.currentStroke).toBeDefined() - const point: TPointer = { - t: 15, - p: 15, - x: 15, - y: 15 - } - model.appendToCurrentStroke(point) - expect(model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(model.currentStroke?.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(model.currentStroke?.style.color).toBe(DefaultPenStyle.color) - expect(model.currentStroke?.style.width).toBe(DefaultPenStyle.width) - expect(model.currentStroke?.pointers).toHaveLength(2) - expect(model.currentStroke?.pointers[1].x).toBe(point.x) - expect(model.currentStroke?.pointers[1].y).toBe(point.y) - expect(model.currentStroke?.pointers[1].t).toBe(point.t) - expect(model.currentStroke?.pointers[1].p).toBe(point.p) - }) - - test("should endCurrentStroke", () => - { - model.addPoint = jest.fn() - model.addStroke = jest.fn() - expect(model.currentStroke).toBeDefined() - const currentStroke = { ...model.currentStroke } - const point: TPointer = { - t: 25, - p: 25, - x: 25, - y: 25 - } - model.endCurrentStroke(point) - expect(model.currentStroke).toBeUndefined() - expect(model.addPoint).toBeCalledTimes(1) - expect(model.addPoint).toBeCalledWith(currentStroke, point) - expect(model.addStroke).toBeCalledTimes(1) - expect(model.addStroke).toBeCalledWith(currentStroke) - }) - }) - - describe("appendSelectedStrokesFromPoint", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - test("shoud select stroke when point on stroke", () => - { - model.appendSelectedStrokesFromPoint({ x: 1, y: 1 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-1") - }) - test("shoud reset selectedStrokes", () => - { - expect(model.selectedStrokes).toHaveLength(1) - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - }) - test("should select the stroke when the point is at a distance less than 10", () => - { - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 36, y: 41 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - }) - test("should not select the stroke when the point is at a distance less than 10", () => - { - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 56, y: 51 }) - expect(model.selectedStrokes).toHaveLength(0) - }) - test("should not select the same stroke twice", () => - { - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 36, y: 41 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - model.appendSelectedStrokesFromPoint({ x: 36, y: 40 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - }) - }) - - describe("removeStrokesFromPoint", () => - { - test("shoud remove stroke when point on stroke", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 1, y: 1 }) - expect(idsRemoves).toHaveLength(1) - expect(idsRemoves[0]).toEqual("stroke-1") - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0].id).toEqual("stroke-2") - }) - test("should remove the stroke when the point is at a distance less than 10", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 36, y: 41 }) - expect(idsRemoves).toHaveLength(1) - expect(idsRemoves[0]).toEqual("stroke-2") - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0].id).toEqual("stroke-1") - }) - test("should not remove the stroke when the point is at a distance less than 10", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 56, y: 51 }) - expect(idsRemoves).toHaveLength(0) - expect(model.rawStrokes).toHaveLength(2) - }) - }) - - describe("position", () => - { - const model: IModel = new Model(width, height) - test("should initialize position", () => - { - expect(model.positions.lastReceivedPosition).toBe(0) - expect(model.positions.lastSentPosition).toBe(0) - }) - test("should updatePositionSent", () => - { - model.updatePositionSent(5) - expect(model.positions.lastSentPosition).toBe(5) - }) - test("should updatePositionReceived", () => - { - model.updatePositionReceived() - expect(model.positions.lastReceivedPosition).toBe(model.positions.lastSentPosition) - }) - }) - - describe("clone", () => - { - const model: IModel = new Model(27, 5) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - model.initCurrentStroke(point, 666, "pen", DefaultPenStyle) - model.exports = { "text/plain": "M" } - test("should getClone", () => - { - const clone = model.getClone() - expect(clone != model).toBeTruthy() - expect(clone.currentStroke).toEqual(model.currentStroke) - expect(clone.currentStroke).not.toBe(model.currentStroke) - - expect(clone.exports).toEqual(model.exports) - expect(clone.exports).not.toBe(model.exports) - - expect(clone.height).toEqual(model.height) - - expect(clone.idle).toEqual(model.idle) - - expect(clone.positions).toEqual(model.positions) - expect(clone.positions).not.toBe(model.positions) - - expect(clone.rawStrokes).toEqual(model.rawStrokes) - expect(clone.rawStrokes).not.toBe(model.rawStrokes) - - expect(clone.width).toEqual(model.width) - }) - }) - - describe("clear", () => - { - test("should clear model", () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 10, x: 10, y: 10 } - const p3: TPointer = { t: 10, p: 10, x: 10, y: 10 } - - model.initCurrentStroke(p1, 42, "mouse", DefaultPenStyle) - model.endCurrentStroke(p2) - model.initCurrentStroke(p3, 51, "mouse", DefaultPenStyle) - expect(model.currentStroke).toBeDefined() - expect(model.rawStrokes).toHaveLength(1) - - model.clear() - expect(model.currentStroke).toBeUndefined() - expect(model.rawStrokes).toHaveLength(0) - }) - }) - -}) diff --git a/test/unit/03-renderer/00-QuadraticUtils.test.ts b/test/unit/03-renderer/00-QuadraticUtils.test.ts deleted file mode 100644 index 91649a1b2..000000000 --- a/test/unit/03-renderer/00-QuadraticUtils.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { TPointer } from "../../../src/@types" -import { renderer } from "../../../src/iink" - -describe("QuadraticUtils.ts", () => -{ - const { quadradicsUtils } = renderer - const p1: TPointer = { - p: 1, - t: 1, - x: 1, - y: 1 - } - const p2: TPointer = { - p: 1, - t: 1, - x: 2, - y: 5 - } - test("should computeLinksPoints", () => - { - const points = quadradicsUtils.computeLinksPoints(p1, 90, 1) - expect(points).toStrictEqual([ - { - x: 0.10600333639944215, - y: 0.5519263838708298 - }, - { - x: 1.8939966636005579, - y: 1.4480736161291703 - } - ]) - }) - - test("should computeMiddlePoint", () => - { - const point = quadradicsUtils.computeMiddlePoint(p1, p2) - expect(point).toStrictEqual({ x: 1.5, y: 3, p: 1, t: 1 }) - }) - - test('should computeAxeAngle', () => - { - const angle = quadradicsUtils.computeAxeAngle(p1, p2) - expect(angle).toBe(1.3258176636680326) - }) - -}) diff --git a/test/unit/03-renderer/01-CanvasRenderer.test.ts b/test/unit/03-renderer/01-CanvasRenderer.test.ts deleted file mode 100644 index 3e2597819..000000000 --- a/test/unit/03-renderer/01-CanvasRenderer.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TRenderingConfiguration } from "../../../src/@types" -import { renderer } from "../../../src/iink" - -describe("CanvasRenderer.ts", () => -{ - const { CanvasRenderer, CanvasStroker } = renderer - const height = 10, width = 10 - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = `${ height }px` - wrapperHTML.style.width = `${ width }px` - - const stroker = new CanvasStroker() - stroker.drawStroke = jest.fn() - - const conf: TRenderingConfiguration = { - minHeight: 100, - minWidth: 100, - smartGuide: { - enable: true, - fadeOut: { - enable: false, - duration: 100 - } - }, - guides: { - enable: true, - gap: 50 - } - } - const canvasRenderer = new CanvasRenderer(conf) - - test("should set configuration when instanciate", () => - { - expect(canvasRenderer.config).toStrictEqual(conf) - }) - - test("should init", () => - { - canvasRenderer.init(wrapperHTML) - expect(wrapperHTML.querySelector(".ms-rendering-canvas")).toBeDefined() - expect(wrapperHTML.querySelector(".ms-capture-canvas")).toBeDefined() - expect(canvasRenderer.context).toBeDefined() - }) - - test("should destroy", () => - { - canvasRenderer.destroy() - expect(wrapperHTML.querySelector(".ms-rendering-canvas")).toBeNull() - expect(wrapperHTML.querySelector(".ms-capture-canvas")).toBeNull() - }) -}) diff --git a/test/unit/03-renderer/02-CanvasStroker.test.ts b/test/unit/03-renderer/02-CanvasStroker.test.ts deleted file mode 100644 index 6185839c4..000000000 --- a/test/unit/03-renderer/02-CanvasStroker.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { renderer, model, style } from "../../../src/iink" - -describe("CanvasStroker.ts", () => -{ - const { CanvasStroker } = renderer - const { Stroke } = model - const { DefaultPenStyle } = style - const canvas: HTMLCanvasElement = document.createElement("canvas") - - const context = { - canvas, - canvasContext: canvas.getContext("2d") as CanvasRenderingContext2D - } - - test("should instanciate CanvasStroker", () => - { - const stroker = new CanvasStroker() - expect(stroker).toBeDefined() - }) - - test("should drawStroke", () => - { - const stroker = new CanvasStroker() - const stroke = new Stroke(DefaultPenStyle, 1) - for (let i = 0; i < 5; i++) { - stroke.pointers.push({ - p: 0.5, - t: 1, - x: i, - y: i - }) - } - stroker.drawStroke(context.canvasContext, stroke) - }) - - -}) diff --git a/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts b/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts deleted file mode 100644 index d16af26f7..000000000 --- a/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { TLineSymbol, TShapeSymbol } from "../../../src/@types" -import { renderer, style } from "../../../src/iink" - -describe("CanvasRendererShapeSymbol.ts", () => -{ - const { canvasRendererShape } = renderer - const { DefaultPenStyle } = style - - const canvas: HTMLCanvasElement = document.createElement("canvas") - const canvasContext = canvas.getContext("2d") as CanvasRenderingContext2D - - canvasContext.moveTo = jest.fn() - canvasContext.lineTo = jest.fn() - const p1 = { x: 1, y: 2 } - const p2 = { x: 3, y: 4 } - - - test("should drawLine", () => - { - canvasRendererShape.drawLine(canvasContext, p1, p2) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) - - test("should drawShapeSymbol with type line", () => - { - const lineSymbol: TLineSymbol = { - elementType: "line", - type: "pen", - style: DefaultPenStyle, - data: { p1, p2 } - } - canvasRendererShape.drawShapeSymbol(canvasContext, lineSymbol) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) - - test("should drawShapeSymbol with type shape", () => - { - const lineSymbol: TLineSymbol = { - elementType: "line", - type: "pen", - style: DefaultPenStyle, - data: { p1, p2 } - } - const shapeSymbol: TShapeSymbol = { - elementType: "shape", - type: "pen", - style: DefaultPenStyle, - selectedCandidateIndex: 0, - candidates: [lineSymbol] - } - canvasRendererShape.drawShapeSymbol(canvasContext, shapeSymbol) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) -}) diff --git a/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts b/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts deleted file mode 100644 index 981f77394..000000000 --- a/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { TStroke } from "../../../src/@types" -import { renderer, style } from "../../../src/iink" - -describe("CanvasRendererStrokeSymbol.ts", () => -{ - const { CanvasStroker, canvasRendererStroke } = renderer - const { DefaultPenStyle } = style - - const canvas: HTMLCanvasElement = document.createElement("canvas") - const canvasContext = canvas.getContext("2d") as CanvasRenderingContext2D - - canvasContext.moveTo = jest.fn() - canvasContext.lineTo = jest.fn() - const stroker = new CanvasStroker() - stroker.drawStroke = jest.fn() - - - test("should drawStroke", () => - { - //@ts-ignore - const stroke: TStroke = { - id: "test-id", - type: "pen", - pointerType: "pen", - pointerId: 0, - style: DefaultPenStyle, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - canvasRendererStroke.drawStroke(canvasContext, stroke, stroker) - expect(stroker.drawStroke).toBeCalledTimes(1) - expect(stroker.drawStroke).toBeCalledWith(canvasContext, stroke) - }) - - test("should not drawStroke if eraser", () => - { - //@ts-ignore - const stroke: TStroke = { - id: "test-id", - type: "pen", - pointerType: "eraser", - pointerId: 0, - style: DefaultPenStyle, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - canvasRendererStroke.drawStroke(canvasContext, stroke, stroker) - expect(stroker.drawStroke).toBeCalledTimes(0) - }) - - -}) diff --git a/test/unit/03-renderer/05-WSSVGRenderer.test.ts b/test/unit/03-renderer/05-WSSVGRenderer.test.ts deleted file mode 100644 index da86f8964..000000000 --- a/test/unit/03-renderer/05-WSSVGRenderer.test.ts +++ /dev/null @@ -1,567 +0,0 @@ -import { delay } from "../utils/helpers" -import -{ - TUpdatePatchAppendChild, - TUpdatePatchInsertBefore, - TUpdatePatchRemoveAttribut, - TUpdatePatchRemoveChild, - TUpdatePatchRemoveElement, - TUpdatePatchReplaceAll, - TUpdatePatchReplaceELement, - TUpdatePatchSetAttribut, - TStroke -} from "../../../src/@types" -import { renderer, configuration, model, style } from "../../../src/iink" - -describe("WSSVGRenderer.ts", () => -{ - const { WSSVGRenderer } = renderer - const { Model } = model - const { DefaultRenderingConfiguration } = configuration - const { DefaultPenStyle } = style - - const stroke: TStroke = { - type: 'pen', - pointerType: 'pen', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - - test("should instanciate", () => - { - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - expect(renderer).toBeDefined() - expect(renderer.config).toStrictEqual(DefaultRenderingConfiguration) - expect(renderer.stroker).toBeDefined() - }) - - test("should initialise context", () => - { - const domElement = document.createElement("div") as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - expect(renderer.context.parent).toBe(domElement) - }) - - test("should updatesLayer when type = REPLACE_ALL on layer CAPTURE", () => - { - const domElement = document.createElement("div") as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: "REPLACE_ALL", - svg: '' - } - renderer.updatesLayer("CAPTURE", [update]) - - expect(domElement.children).toHaveLength(1) - const layerCapture = domElement.querySelector('svg[data-layer="CAPTURE"') - expect(layerCapture).toBeDefined() - }) - - test('should updatesLayer when type = REPLACE_ALL on layer MODEL', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - "type": "REPLACE_ALL", - svg: '' - } - renderer.updatesLayer('MODEL', [update]) - - expect(domElement.children).toHaveLength(1) - const layerCapture = domElement.querySelector('svg[data-layer="MODEL"') - expect(layerCapture).toBeDefined() - const pendingGroup = layerCapture?.querySelector('#pendingStrokes') - expect(pendingGroup).toBeDefined() - }) - - test('should updatesLayer when type = REPLACE_ELEMENT', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateReplaceElement: TUpdatePatchReplaceELement = { - type: 'REPLACE_ELEMENT', - id: "CAPTURE-ps0", - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateReplaceElement]) - - const parendNode = domElement.querySelector('svg[data-layer="CAPTURE"]') - expect(parendNode?.children).toHaveLength(1) - - const elementReplaced = domElement.querySelector(`#${ updateReplaceElement.id }`) - expect(parendNode?.children.item(0)).toBe(elementReplaced) - }) - - test('should updatesLayer when type = REMOVE_ELEMENT on layer CAPTURE', async () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - let elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove).toBeDefined() - - const updateRemove: TUpdatePatchRemoveElement = { - type: 'REMOVE_ELEMENT', - id: 'CAPTURE-dg7f8d807ab560' - } - renderer.updatesLayer('MODEL', [updateRemove]) - elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove?.classList).toContain('removed-stroke') - - await delay(100) - elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove).toBeNull() - }) - - test('should updatesLayer when type = REMOVE_ELEMENT on layer MODEL', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('MODEL', [update]) - let elementToRemove = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(elementToRemove).toBeDefined() - - const updateRemove: TUpdatePatchRemoveElement = { - type: 'REMOVE_ELEMENT', - id: 'MODEL-dg7f8d807ab560' - } - renderer.updatesLayer('MODEL', [updateRemove]) - elementToRemove = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(elementToRemove).toBeNull() - }) - - test('should updatesLayer when type = APPEND_CHILD with parentId', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - ` - } - renderer.updatesLayer('MODEL', [update]) - - const updateAppendChild: TUpdatePatchAppendChild = { - type: "APPEND_CHILD", - parentId: "MODEL-dg7f8d807ab560", - svg: '' - } - renderer.updatesLayer('MODEL', [updateAppendChild]) - - const parendNode = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(parendNode?.children).toHaveLength(1) - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children.item(0)).toBe(elementInserted) - }) - - test('should updatesLayer when type = APPEND_CHILD without parentId', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateAppendChild: TUpdatePatchAppendChild = { - type: "APPEND_CHILD", - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateAppendChild]) - - const parendNode = domElement.querySelector('svg') - expect(parendNode?.children).toHaveLength(2) - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children.item(1)).toBe(elementInserted) - }) - - test('should updatesLayer when type = REMOVE_CHILD', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - - - ` - } - renderer.updatesLayer('MODEL', [update]) - - const updateRmoveChild: TUpdatePatchRemoveChild = { - type: 'REMOVE_CHILD', - parentId: 'MODEL-dg7f6394110df0', - index: 2 - } - renderer.updatesLayer('MODEL', [updateRmoveChild]) - - const parendNode = domElement.querySelector(`#${ updateRmoveChild.parentId }`) - expect(parendNode?.children).toHaveLength(2) - }) - - test('should updatesLayer when type = INSERT_BEFORE', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateInsertBefore: TUpdatePatchInsertBefore = { - type: 'INSERT_BEFORE', - refId: 'CAPTURE-pc9a1234856ze6', - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateInsertBefore]) - - const parendNode = domElement.querySelector('#CAPTURE-dg7f6394110df0') - expect(parendNode?.children).toHaveLength(2) - - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children?.item(0)).toBe(elementInserted) - }) - - test('should updatesLayer when type = SET_ATTRIBUTE with id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateSetAttribut: TUpdatePatchSetAttribut = { - type: 'SET_ATTRIBUTE', - id: 'CAPTURE-pc9a1234856ze6', - name: 'data-test', - value: 'value-test' - } - renderer.updatesLayer('CAPTURE', [updateSetAttribut]) - - const element = domElement.querySelector(`#${ updateSetAttribut.id }`) - expect(element?.getAttribute(updateSetAttribut.name)).toBe(updateSetAttribut.value) - }) - - test('should updatesLayer when type = SET_ATTRIBUTE without id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateSetAttribut: TUpdatePatchSetAttribut = { - type: 'SET_ATTRIBUTE', - name: 'data-test', - value: 'value-test' - } - renderer.updatesLayer('CAPTURE', [updateSetAttribut]) - - const element = domElement.querySelector('svg') - expect(element?.getAttribute(updateSetAttribut.name)).toBe(updateSetAttribut.value) - }) - - test('should updatesLayer when type = REMOVE_ATTRIBUTE with id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateRemoveAttribut: TUpdatePatchRemoveAttribut = { - type: 'REMOVE_ATTRIBUTE', - id: 'CAPTURE-pc9a1234856ze6', - name: 'data-test', - } - renderer.updatesLayer('CAPTURE', [updateRemoveAttribut]) - - const element = domElement.querySelector(updateRemoveAttribut.id as string) - expect(element?.getAttribute(updateRemoveAttribut.name)).toBeUndefined() - }) - - test('should updatesLayer when type = REMOVE_ATTRIBUTE without id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateRemoveAttribut: TUpdatePatchRemoveAttribut = { - type: 'REMOVE_ATTRIBUTE', - name: 'data-test', - } - renderer.updatesLayer('CAPTURE', [updateRemoveAttribut]) - - const element = domElement.querySelector('svg') - expect(element?.getAttribute(updateRemoveAttribut.name)).toBeNull() - }) - - test('should drawPendingStroke', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - renderer.drawPendingStroke(stroke) - - expect(renderer.stroker.drawStroke).toBeCalledTimes(1) - expect(renderer.stroker.drawStroke).toBeCalledWith(pendingStrokesGroup, stroke, [{ name: "style", value: "fill:undefined;stroke:transparent;" }]) - }) - - test('should drawPendingStroke when pointerType = eraser', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const eraseStroke: TStroke = { - type: 'pen', - pointerType: 'eraser', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - renderer.drawPendingStroke(eraseStroke) - - expect(renderer.stroker.drawStroke).toBeCalledTimes(1) - expect(renderer.stroker.drawStroke).toBeCalledWith(pendingStrokesGroup, eraseStroke, [{ name: "style", value: "fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;" }]) - }) - - test('should delete erasing strokes', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const eraseStroke: TStroke = { - type: 'pen', - pointerType: 'eraser', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - renderer.drawPendingStroke(eraseStroke) - expect(domElement.querySelectorAll("[type=eraser]").length).toStrictEqual(1) - renderer.clearPendingStroke() - expect(domElement.querySelectorAll("[type=eraser]").length).toStrictEqual(0) - }) - - test('should clearPendingStroke', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgCaptureElement.setAttribute('data-layer', 'CAPTURE') - domElement.appendChild(svgCaptureElement) - - renderer.drawPendingStroke(stroke) - expect(pendingStrokesGroup.children).toHaveLength(1) - - renderer.clearPendingStroke() - - expect(pendingStrokesGroup.children).toHaveLength(0) - }) - - test('should resize', () => - { - const width = 100, height = 50 - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - const model = new Model(width, height) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - svgModelElement.setAttribute('viewBox', `0 0 ${ width }, ${ height }`) - svgModelElement.setAttribute('width', `${ width }px`) - svgModelElement.setAttribute('height', `${ height }px`) - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgCaptureElement.setAttribute('data-layer', 'CAPTURE') - svgCaptureElement.setAttribute('viewBox', `0 0 ${ width }, ${ height }`) - svgCaptureElement.setAttribute('width', `${ width }px`) - svgCaptureElement.setAttribute('height', `${ height }px`) - domElement.appendChild(svgCaptureElement) - - model.width += 42 - model.height += 50 - renderer.resize(model) - - expect(svgCaptureElement.getAttribute('width')).toBe(`${ model.width }px`) - expect(svgCaptureElement.getAttribute('height')).toBe(`${ model.height }px`) - }) - - test('should destroy', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - domElement.appendChild(svgCaptureElement) - - renderer.destroy() - - expect(domElement.children).toHaveLength(0) - }) -}) diff --git a/test/unit/03-renderer/06-SVGStroker.test.ts b/test/unit/03-renderer/06-SVGStroker.test.ts deleted file mode 100644 index d1706e8e0..000000000 --- a/test/unit/03-renderer/06-SVGStroker.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { TStroke } from "../../../src/@types" -import { renderer } from "../../../src/iink" - -describe("SVGStroker.ts", () => -{ - const { SVGStroker } = renderer - - //@ts-ignore - const stroke: TStroke = { - type: "pen", - pointerType: "pen", - pointerId: 0, - id: "test", - style: { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "none", - "-myscript-pen-width": 1, - color: "red", - width: 1, - }, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - - test("should instanciate", () => - { - const stroker = new SVGStroker() - expect(stroker).toBeDefined() - }) - - test("should drawStroke", () => - { - const svgElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGElement - const stroker = new SVGStroker() - stroker.drawStroke(svgElement, stroke) - const pathElement = svgElement.querySelector("path") - expect(pathElement?.getAttribute("id")).toEqual(stroke.id) - expect(pathElement?.getAttribute("type")).toEqual("pen") - }) - - test("should drawStroke with attrs", () => - { - const svgElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGElement - const stroker = new SVGStroker() - stroker.drawStroke(svgElement, stroke, [{ name: "style", value: `fill:${ stroke.style.color };stroke:transparent;` }]) - const pathElement = svgElement.querySelector("path") - expect(pathElement?.getAttribute("id")).toEqual(stroke.id) - expect(pathElement?.getAttribute("type")).toEqual("pen") - expect(pathElement?.getAttribute("style")).toEqual(`fill:${ stroke.style.color };stroke:transparent;`) - }) -}) diff --git a/test/unit/04-style/00-StyleHelper.test.ts b/test/unit/04-style/00-StyleHelper.test.ts deleted file mode 100644 index 6a8ba2cc1..000000000 --- a/test/unit/04-style/00-StyleHelper.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { TPenStyle, TTheme } from "../../../src/@types" -import { style } from "../../../src/iink" - -const DefaultPenStyleString = "" -const DefaultThemeString = `ink {color: #000000;width: 1;-myscript-pen-width: 1;-myscript-pen-fill-style: none;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: #A8A8A8FF;}.text {font-family: MyScriptInter;font-size: 10;}` - -describe("StyleHelper.ts", () => -{ - const { StyleHelper, DefaultPenStyle, DefaultTheme } = style - test("should penStyleToCSS for DefaultPenStyle", () => - { - const styleString = StyleHelper.penStyleToCSS(DefaultPenStyle) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - expect(styleStringInline).toEqual(DefaultPenStyleString) - }) - - test("should penStyleToCSS for customPenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "none", - "-myscript-pen-width": 1, - color: "green", - width: 2 - } - const penStyleStringExpected = `-myscript-pen-fill-color: red;-myscript-pen-fill-style: none;-myscript-pen-width: 1;color: green;width: 2;` - - const styleString = StyleHelper.penStyleToCSS(penStyle) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - - expect(styleStringInline).toEqual(penStyleStringExpected) - }) - - test("should penStyleToJSON for DefaultPenStyle", () => - { - const style = StyleHelper.penStyleToJSON(DefaultPenStyleString) - expect(style).toEqual(DefaultPenStyle) - }) - - test("should penStyleToJSON for customPenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "purple", - "-myscript-pen-width": 1, - color: "green", - width: 2 - } - const penStyleString = `-myscript-pen-fill-color: red;-myscript-pen-fill-style: purple;-myscript-pen-width: 1;color: green;width: 2;` - const style = StyleHelper.penStyleToJSON(penStyleString) - expect(style).toEqual(penStyle) - }) - - test("should themeToCSS for DefaultTheme", () => - { - const styleString = StyleHelper.themeToCSS(DefaultTheme) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - expect(styleStringInline).toStrictEqual(DefaultThemeString) - }) - - test("should themeToCSS for CustomTheme", () => - { - const theme: TTheme = { - ink: { - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - const themeStringExpected = "ink {color: #2E7D32;-myscript-pen-width: 2;-myscript-pen-fill-style: purple;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: blue;}.text {font-family: Rubik Distressed;font-size: 10;}" - const themeString = StyleHelper.themeToCSS(theme) - const themeStringInline = themeString.replace(/[\r\n]+/gm, "") - expect(themeStringInline).toStrictEqual(themeStringExpected) - }) - - test("should themeToJSON for DefaultTheme", () => - { - const style = StyleHelper.themeToJSON(DefaultThemeString) - expect(style).toStrictEqual(DefaultTheme) - }) - - test("should themeToJSON for v", () => - { - const theme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - const themeString = "ink {width: 42;color: #2E7D32;-myscript-pen-width: 2;-myscript-pen-fill-style: purple;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: blue;}.text {font-family: Rubik Distressed;font-size: 10;}" - - const style = StyleHelper.themeToJSON(themeString) - expect(style).toStrictEqual(theme) - }) -}) diff --git a/test/unit/04-style/01-StyleManager.test.ts b/test/unit/04-style/01-StyleManager.test.ts deleted file mode 100644 index ca099f4d3..000000000 --- a/test/unit/04-style/01-StyleManager.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { style } from "../../../src/iink" - -describe("StyleManager.ts", () => -{ - const { StyleManager, DefaultPenStyle, DefaultTheme } = style - describe("constructor", () => - { - test("should instanciate with DefaultPenStyle & DefaultTheme", () => - { - const styleManager = new StyleManager() - expect(styleManager.penStyle).toStrictEqual(DefaultPenStyle) - expect(styleManager.theme).toStrictEqual(DefaultTheme) - }) - test("should instanciate and override DefaultPenStyle", () => - { - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - const styleManager = new StyleManager(customPenStyle, undefined) - expect(styleManager.penStyle).toStrictEqual(customPenStyle) - }) - test("should instanciate and override DefaultTheme", () => - { - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - const styleManager = new StyleManager(undefined, customTheme) - expect(styleManager.theme).toStrictEqual(customTheme) - }) - }) - - describe("penStyle", () => - { - test("should override DefaultPenStyle", () => - { - const styleManager = new StyleManager() - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - styleManager.setPenStyle(customPenStyle) - expect(styleManager.penStyle).toStrictEqual(customPenStyle) - }) - - test("should define currentPenStyle", () => - { - const styleManager = new StyleManager() - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - styleManager.setPenStyle(customPenStyle) - expect(styleManager.currentPenStyle).toStrictEqual(customPenStyle) - }) - }) - - describe("theme", () => - { - test("should override DefaultTheme", () => - { - const styleManager = new StyleManager() - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - styleManager.setTheme(customTheme) - expect(styleManager.theme).toStrictEqual(customTheme) - }) - }) - - describe("penStyleClasses", () => - { - test("should set penStyleClasses", () => - { - const styleManager = new StyleManager() - styleManager.setPenStyleClasses("pouet") - expect(styleManager.penStyleClasses).toStrictEqual("pouet") - }) - test("should define currentPenStyle", () => - { - const styleManager = new StyleManager() - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - styleManager.setPenStyleClasses("math") - expect(styleManager.currentPenStyle).toStrictEqual(customTheme[".math"]) - }) - }) - - -}) diff --git a/test/unit/05-recognizer/01-RestRecognizer.test.ts b/test/unit/05-recognizer/01-RestRecognizer.test.ts deleted file mode 100644 index e8ac6899d..000000000 --- a/test/unit/05-recognizer/01-RestRecognizer.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import fetchMock from "jest-fetch-mock" -import -{ - IModel, - TPointer, - TRecognitionConfiguration, - TRecognitionType -} from "../../../src/@types" -import { recognizer, configuration, style, model } from "../../../src/iink" - -describe("RestRecognizer.ts", () => -{ - const { RestRecognizer } = recognizer - const { DefaultRecognitionConfiguration, DefaultServerConfiguration } = configuration - const { DefaultPenStyle } = style - const { Model } = model - const height = 100, width = 100 - - beforeAll(() => - { - fetchMock.enableMocks() - }) - afterEach(() => - { - fetchMock.resetMocks() - }) - - test("should instanciate RestRecognizer", () => - { - const rr = new RestRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - expect(rr).toBeDefined() - }) - - const recognitionTypeList: TRecognitionType[] = ["TEXT", "DIAGRAM", "MATH", "Raw Content"] - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should export ${ recognitionType }`, async () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const rr = new RestRecognizer(DefaultServerConfiguration, recognitionConfig) - const newModel = await rr.export(model) - model.exports = {} - - let mimeType = "" - switch (recognitionType) { - case "TEXT": - mimeType = DefaultRecognitionConfiguration.text.mimeTypes[0] - break - case "DIAGRAM": - mimeType = DefaultRecognitionConfiguration.diagram.mimeTypes[0] - break - case "MATH": - mimeType = DefaultRecognitionConfiguration.math.mimeTypes[0] - break - case "Raw Content": - mimeType = "application/vnd.myscript.jiix" - break - - default: - throw new Error("invalid recognition type") - } - expect(fetchMock).toHaveBeenCalledTimes(1) - model.exports[mimeType] = "" - expect(newModel).toEqual(model) - }) - }) - - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should convert ${ recognitionType }`, async () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const rr = new RestRecognizer(DefaultServerConfiguration, recognitionConfig) - const newModel = await rr.convert(model, "DIGITAL_EDIT") - model.converts = {} - - let mimeType = "" - switch (recognitionType) { - case "TEXT": - mimeType = DefaultRecognitionConfiguration.text.mimeTypes[0] - break - case "DIAGRAM": - mimeType = DefaultRecognitionConfiguration.diagram.mimeTypes[0] - break - case "MATH": - mimeType = DefaultRecognitionConfiguration.math.mimeTypes[0] - break - case "Raw Content": - mimeType = "application/vnd.myscript.jiix" - break - - default: - throw new Error("invalid recognition type") - } - - expect(fetchMock).toHaveBeenCalledTimes(1) - model.converts[mimeType] = "" - expect(model).toEqual(newModel) - }) - }) - -}) diff --git a/test/unit/05-recognizer/02-WSRecognizer.test.ts b/test/unit/05-recognizer/02-WSRecognizer.test.ts deleted file mode 100644 index a9112851e..000000000 --- a/test/unit/05-recognizer/02-WSRecognizer.test.ts +++ /dev/null @@ -1,1046 +0,0 @@ -//@ts-nocheck -import Server from "jest-websocket-mock" -import { DeserializedMessage } from "jest-websocket-mock/lib/websocket" -import { delay } from "../utils/helpers" -import -{ - TWebSocketEvent, - IModel, - TTheme, - TPenStyle, - TServerConfiguration, - TConverstionState, - TRecognitionConfiguration, - TRecognitionType, -} from "../../../src/@types" - -import { recognizer, configuration, style, model, constants } from "../../../src/iink" - -const { WSRecognizer } = recognizer -const { DefaultRecognitionConfiguration, DefaultServerConfiguration } = configuration -const { DefaultPenStyle } = style -const { Model, Stroke } = model - -const ackMessage = { "type": "ack", "hmacChallenge": "1f434e8b-cc46-4a8c-be76-708eea2ff305", "iinkSessionId": "c7e72186-6299-4782-b612-3e725aa126f1" } -const contentPackageDescriptionMessage = { "type": "contentPackageDescription", "contentPartCount": 0 } -const partChangeMessage = { "type": "partChanged", "partIdx": 0, "partId": "yyrrutgk", "partCount": 1 } -const newPartMessage = { "type": "newPart", "idx": 0, "id": "lqrcoxjl" } - -const emptyJIIX = { - "type": "Text", - "label": "", - "words": [], -} -const emptyExportedMessage = { - "type": "exported", - "partId": "wyybaqsp", - "exports": { - "application/vnd.myscript.jiix": JSON.stringify(emptyJIIX) - } -} -const hJIIX = { - "type": "Text", - "label": "hello", - "words": [{ - "label": "H", - "candidates": ["h"] - }] -} -const hExportedMessage = { - "type": "exported", - "partid": 0, - "exports": { - "application/vnd.myscript.jiix": JSON.stringify(hJIIX) - } -} -const svgPatchMessage = { - "type": "svgPatch", - "updates": [ - { - "type": "REMOVE_ELEMENT", - "id": "MODEL-dg7f8894033c80" - }, - { - "type": "SET_ATTRIBUTE", - "name": "viewBox", - "value": "0 0 967 790" - }, - { - "type": "SET_ATTRIBUTE", - "name": "width", - "value": "967px" - }, - { - "type": "INSERT_BEFORE", - "refId": "G7f8814290820-", - "svg": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" - }, - { - "type": "REMOVE_ELEMENT", - "id": "G7f8814290820-" - } - ], - "layer": "MODEL" -} -const errorMessage = { "type": "error", "message": "Access not granted", "code": "access.not.granted" } -const recognitionTypeList: TRecognitionType[] = ["TEXT", "DIAGRAM", "MATH", "Raw Content"] - -const getMessages = (messages: DeserializedMessage[], type: string): DeserializedMessage[] => -{ - return messages.filter((m: DeserializedMessage) => - { - const parseMessage = JSON.parse(m as string) as TWebSocketEvent - return parseMessage.type === type - }) -} - -describe("WSRecognizer.ts", () => -{ - let mockServer: Server - const height = 100, width = 100 - beforeEach(() => - { - mockServer = new Server(`wss://${ DefaultServerConfiguration.host }/api/v4.0/iink/document`, {}) - - mockServer.on("connection", (socket) => - { - socket.on("message", (message: string | Blob | ArrayBuffer | ArrayBufferView) => - { - const parsedMessage: TWebSocketEvent = JSON.parse(message as string) - switch (parsedMessage.type) { - case "newContentPackage": - socket.send(JSON.stringify(ackMessage)) - break - case "hmac": - socket.send(JSON.stringify(contentPackageDescriptionMessage)) - break - case "configuration": - socket.send(JSON.stringify(partChangeMessage)) - break - case "newContentPart": - socket.send(JSON.stringify(newPartMessage)) - break - default: - break - } - }) - }) - }) - - afterEach(() => - { - Server.clean() - }) - - test("should instanciate WSRecognizer", () => - { - const wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - expect(wsr).toBeDefined() - }) - - describe("Properties", () => - { - test("should get url", () => - { - const serverConfig = { - ...DefaultServerConfiguration, - scheme: "http", - host: "pony", - applicationKey: "applicationKey" - } as TServerConfiguration - const wsr = new WSRecognizer(serverConfig, DefaultRecognitionConfiguration) - expect(wsr.url).toEqual("ws://pony/api/v4.0/iink/document?applicationKey=applicationKey") - }) - recognitionTypeList.forEach(recognitionType => - { - test(`should get mimeTypes for ${ recognitionType }`, () => - { - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const wsr = new WSRecognizer(DefaultServerConfiguration, recognitionConfig) - let mimeTypes: string[] - switch (recognitionType) { - case "TEXT": - mimeTypes = recognitionConfig.text.mimeTypes - break - case "DIAGRAM": - mimeTypes = recognitionConfig.diagram.mimeTypes - break - case "MATH": - mimeTypes = recognitionConfig.math.mimeTypes - break - case "Raw Content": - mimeTypes = [] - break - default: - throw new Error("invalid recognition type") - } - expect(wsr.mimeTypes).toEqual(mimeTypes) - }) - }) - }) - - describe("init", () => - { - const serverConfigToCloseTest: TServerConfiguration = { - ...DefaultServerConfiguration, - host: "init-test" - } - let addStroMockServerForInitTest: Server - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - - beforeEach(() => - { - addStroMockServerForInitTest = new Server(`wss://${ serverConfigToCloseTest.host }/api/v4.0/iink/document`, {}) - wsr = new WSRecognizer(serverConfigToCloseTest, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - spyEmitError.mockResolvedValue(() => Promise.resolve()) - }) - afterEach(async () => - { - await wsr.destroy() - addStroMockServerForInitTest.close() - }) - test("should sent newContentPackage message", async () => - { - expect.assertions(2) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPackage")).toHaveLength(0) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPackage")).toHaveLength(1) - }) - test("should sent hmac message when receive hmacChallenge message", async () => - { - expect.assertions(2) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "hmac")).toHaveLength(0) - addStroMockServerForInitTest.send(JSON.stringify(ackMessage)) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "hmac")).toHaveLength(1) - }) - test("should sent hmac & newPart messages when receive hmacChallenge message", async () => - { - expect.assertions(4) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "configuration")).toHaveLength(0) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPart")).toHaveLength(0) - addStroMockServerForInitTest.send(JSON.stringify(contentPackageDescriptionMessage)) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "configuration")).toHaveLength(1) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPart")).toHaveLength(1) - }) - test.skip("should resolve when receive newPart message", async () => - { - expect.assertions(1) - const promise = wsr.init(height, width) - addStroMockServerForInitTest.send(JSON.stringify(newPartMessage)) - await promise - expect(1).toEqual(1) - }) - test.skip("should reject if receive error message", async () => - { - expect.assertions(3) - const promise = wsr.init(height, width) - addStroMockServerForInitTest.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Ping", () => - { - test("should send ping message", async () => - { - expect.assertions(2) - const conf = JSON.parse(JSON.stringify(DefaultServerConfiguration)) as TServerConfiguration - conf.websocket.pingDelay = 200 - const wsr = new WSRecognizer(conf, DefaultRecognitionConfiguration) - await wsr.init(height, width) - await delay(conf.websocket.pingDelay) - await delay(100) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(1) - await delay(conf.websocket.pingDelay) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(2) - }) - test("should not send ping message", async () => - { - expect.assertions(2) - const conf = JSON.parse(JSON.stringify(DefaultServerConfiguration)) as TServerConfiguration - conf.websocket.pingDelay = 200 - conf.websocket.pingEnabled = false - const wsr = new WSRecognizer(conf, DefaultRecognitionConfiguration) - await wsr.init(height, width) - await delay(conf.websocket.pingDelay) - await delay(100) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(0) - await delay(conf.websocket.pingDelay) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(0) - }) - }) - - describe("send", () => - { - let wsr: typeof WSRecognizer - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - const testDataToSend = { type: "test", data: "test-data" } - await expect(wsr.send(testDataToSend)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const testDataToSend = { type: "test", data: "test-data" } - await wsr.send(testDataToSend) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const messageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - expect(messageSent).toEqual(testDataToSend) - }) - //TODO fix test - test.skip("should reconnect before send message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - await wsr.close(1000, "CLOSE_RECOGNIZER") - const testDataToSend = { type: "test", data: "test-data" } - await wsr.send(testDataToSend) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const messageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - expect(messageSent).toEqual(testDataToSend) - }) - }) - - describe("addStrokes", () => - { - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - await expect(wsr.addStrokes([stroke])).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send addStrokes message", async () => - { - expect.assertions(1) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - stroke.pointers.push({ p: 2, t: 4, x: 8, y: 16}) - await wsr.init(height, width) - wsr.addStrokes([stroke]) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const addStrokesMessageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - const addStrokesMessageSentToTest = { - type: "addStrokes", - strokes: [{ - "p": [1, 2], - "pointerType": "pen", - "t": [1, 4], - "x": [1, 8], - "y": [1, 16], - }] - } - await expect(addStrokesMessageSent).toMatchObject(addStrokesMessageSentToTest) - }) - test("should not send addStrokes message if model.extractUnsentStrokes return 0 strokes", async () => - { - expect.assertions(1) - await wsr.init(height, width) - await wsr.addStrokes([]) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const addStrokesMessageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - await expect(addStrokesMessageSent.type).not.toEqual("addStrokes") - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - stroke.pointers.push({ p: 2, t: 4, x: 8, y: 16}) - await wsr.init(height, width) - const promise = wsr.addStrokes([stroke]) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await promise - await expect(promise).resolves.toEqual( - expect.objectContaining({ - "application/vnd.myscript.jiix": emptyJIIX - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - stroke.pointers.push({ p: 2, t: 4, x: 8, y: 16}) - await wsr.init(height, width) - const promise = wsr.addStrokes([stroke]) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Style", () => - { - let wsr: typeof WSRecognizer - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should setPenStyle", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const CustomPenStyle: TPenStyle = { color: "#d1d1d1" } - await wsr.setPenStyle(CustomPenStyle) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const setPenStyle = mockServer.messages[mockServer.messages.length - 1] - const setPenStyleToTest = JSON.stringify({ - type: "setPenStyle", - style: "color: #d1d1d1;" - }) - expect(setPenStyle).toContain(setPenStyleToTest) - }) - test("should setPenStyleClasses", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const styleClasses = "pony" - await wsr.setPenStyleClasses(styleClasses) - await delay(100) - //¯\_(ツ)_/¯ required to wait server received message - const setPenStyleClasses = mockServer.messages[mockServer.messages.length - 1] - const setPenStyleClassesToTest = JSON.stringify({ - type: "setPenStyleClasses", - styleClasses - }) - expect(setPenStyleClasses).toContain(setPenStyleClassesToTest) - }) - test("should setTheme", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const theme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - await wsr.setTheme(theme) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - - const setThemeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const setThemeMessageSentToTest = "{\"type\":\"setTheme\",\"theme\":\"ink {\\nwidth: 42;\\ncolor: #2E7D32;\\n-myscript-pen-width: 2;\\n-myscript-pen-fill-style: purple;\\n-myscript-pen-fill-color: #FFFFFF00;\\n}\\n.math {\\nfont-family: STIXGeneral;\\n}\\n.math-solved {\\nfont-family: STIXGeneral;\\ncolor: blue;\\n}\\n.text {\\nfont-family: Rubik Distressed;\\nfont-size: 10;\\n}\\n\"}" - expect(setThemeMessageSent).toContain(setThemeMessageSentToTest) - }) - }) - - describe("export", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.export(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should send export message for ${ recognitionType }`, async () => - { - expect.assertions(1) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const my_wsr = new WSRecognizer(DefaultServerConfiguration, recognitionConfig) - await my_wsr.init(height, width) - my_wsr.export(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const exportMessageSent = mockServer.messages[mockServer.messages.length - 1] - let mimeTypes: string[] - switch (recognitionType) { - case "TEXT": - mimeTypes = DefaultRecognitionConfiguration.text.mimeTypes - break - case "DIAGRAM": - mimeTypes = DefaultRecognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = DefaultRecognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - default: - throw new Error("invalid recognition type") - } - - const exportMessageSentToTest = JSON.stringify({ - type: "export", - partId: partChangeMessage.partId, - mimeTypes - }) - expect(exportMessageSent).toContain(exportMessageSentToTest) - my_wsr.destroy() - }) - }) - test("should resolve when receive fileChunckAck message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.export(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(hExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": hJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.export(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("import", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - const mimeType = "text/plain" - const textImport = "winter is comming" - const blobToImport = new Blob([textImport]) - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - await expect(wsr.import(model, blobToImport, mimeType)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send import message", async () => - { - await wsr.init(height, width) - wsr.import(model, blobToImport, mimeType) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const parsedMessage = mockServer.messages.map((m: DeserializedMessage) => - { - return JSON.parse(m as string) as TWebSocketEvent - }) - await expect(parsedMessage.filter(m => m.type === "importFile")).toHaveLength(1) - await expect(parsedMessage.filter(m => m.type === "importFile")[0]).toEqual( - expect.objectContaining({ - type: "importFile", - mimeType - }) - ) - await expect(parsedMessage.filter(m => m.type === "fileChunk")).toHaveLength(1) - await expect(parsedMessage.filter(m => m.type === "fileChunk")[0]).toEqual( - expect.objectContaining({ - type: "fileChunk", - data: textImport - }) - ) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.import(model, blobToImport, mimeType) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.import(model, blobToImport, mimeType) - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("resize", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.resize(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send resize message", async () => - { - expect.assertions(1) - model.height = 27 - model.width = 5 - await wsr.init(height, width) - wsr.resize(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "changeViewSize", height: model.height, width: model.width }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive svg patch message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.resize(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(svgPatchMessage)) - await expect(promise).resolves.toEqual(model) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.resize(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("convert", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.convert(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send convert message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const conversionState: TConverstionState = "DIGITAL_EDIT" - wsr.convert(model, conversionState) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "convert", conversionState }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.convert(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - converts: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.convert(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("undo", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.undo(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send undo message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.undo(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "undo" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.undo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.undo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("redo", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.redo(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send redo message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.redo(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "redo" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.redo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.redo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("clear", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.clear(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send clear message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.clear(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "clear" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.clear(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.clear(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Connection lost", () => - { - const serverConfigToCloseTest: TServerConfiguration = { - ...DefaultServerConfiguration, - host: "close-test" - } - let mockServerForCloseTest: Server - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(() => - { - mockServerForCloseTest = new Server(`wss://${ serverConfigToCloseTest.host }/api/v4.0/iink/document`, {}) - mockServerForCloseTest.on("connection", (socket) => - { - socket.on("message", (message: string | Blob | ArrayBuffer | ArrayBufferView) => - { - const parsedMessage: TWebSocketEvent = JSON.parse(message as string) - switch (parsedMessage.type) { - case "newContentPackage": - socket.send(JSON.stringify(ackMessage)) - break - case "hmac": - socket.send(JSON.stringify(contentPackageDescriptionMessage)) - break - case "configuration": - socket.send(JSON.stringify(partChangeMessage)) - break - case "newContentPart": - socket.send(JSON.stringify(newPartMessage)) - break - default: - break - } - }) - }) - wsr = new WSRecognizer(serverConfigToCloseTest, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - spyEmitError.mockReset() - await wsr.destroy() - }) - const closeMessageOptions = [ - { code: 1001, message: constants.Error.GOING_AWAY }, - { code: 1002, message: constants.Error.PROTOCOL_ERROR }, - { code: 1003, message: constants.Error.UNSUPPORTED_DATA }, - { code: 1006, message: constants.Error.ABNORMAL_CLOSURE }, - { code: 1007, message: constants.Error.INVALID_FRAME_PAULOAD }, - { code: 1008, message: constants.Error.POLICY_VIOLATION }, - { code: 1009, message: constants.Error.MESSAGE_TOO_BIG }, - { code: 1011, message: constants.Error.INTERNAL_ERROR }, - { code: 1012, message: constants.Error.SERVICE_RESTART }, - { code: 1013, message: constants.Error.TRY_AGAIN }, - { code: 1014, message: constants.Error.BAD_GATEWAY }, - { code: 1015, message: constants.Error.TLS_HANDSHAKE }, - { code: 42, message: constants.Error.CANT_ESTABLISH }, - ] - closeMessageOptions.forEach(async (closeEvent) => - { - test(`should emit error if the server closes the connection abnormally code == ${ closeEvent.code }`, async () => - { - expect.assertions(2) - await wsr.init(height, width) - mockServerForCloseTest.server.close({ code: closeEvent.code, reason: closeEvent.message, wasClean: false }) - expect(spyEmitError).toHaveBeenCalledTimes(1) - expect(spyEmitError).toHaveBeenCalledWith(new Error(closeEvent.message)) - }) - }) - }) - - describe("destroy", () => - { - test("should close socket", async () => - { - expect.assertions(2) - const wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - await wsr.init(height, width) - // 1 -> OPEN - await expect(mockServer.server.clients()[0].readyState).toEqual(1) - wsr.destroy() - // 2 -> CLOSING - await expect(mockServer.server.clients()[0].readyState).toEqual(2) - }) - }) -}) diff --git a/test/unit/06-undo-redo/00-UndoRedoContext.test.ts b/test/unit/06-undo-redo/00-UndoRedoContext.test.ts deleted file mode 100644 index 045e3d8d7..000000000 --- a/test/unit/06-undo-redo/00-UndoRedoContext.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { undoredo, model } from "../../../src/iink" - -const { UndoRedoContext } = undoredo -const { Model } = model - -describe("UndoRedoContext.ts", () => -{ - const width = 100, height = 100 - test("should instanciate UndoRedoContext", () => - { - const context = new UndoRedoContext(new Model(width, height)) - expect(context).toBeDefined() - }) - - test("should be initialize", () => - { - const model = new Model(width, height) - const context = new UndoRedoContext(model) - - expect(context.stackIndex).toStrictEqual(0) - - expect(context.stack).toHaveLength(1) - expect(context.stack[context.stackIndex]).toEqual(model) - expect(context.stack[context.stackIndex]).not.toBe(model) - - expect(context.canUndo).toStrictEqual(false) - expect(context.canUndo).toStrictEqual(false) - }) -}) diff --git a/test/unit/06-undo-redo/01-UndoRedoManager.test.ts b/test/unit/06-undo-redo/01-UndoRedoManager.test.ts deleted file mode 100644 index c8bdd0077..000000000 --- a/test/unit/06-undo-redo/01-UndoRedoManager.test.ts +++ /dev/null @@ -1,249 +0,0 @@ -import -{ - IModel, - TPointer, - TUndoRedoConfiguration -} from "../../../src/@types" -import { delay } from "../utils/helpers" -import { undoredo, model, configuration, style } from "../../../src/iink" - -const { UndoRedoContext, UndoRedoManager } = undoredo -const { Model } = model -const { DefaultConfiguration } = configuration -const { DefaultPenStyle } = style - -describe("UndoRedoManager.ts", () => -{ - const width = 100, height = 100 - test("should instanciate UndoRedoManager", () => - { - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], new Model(width, height)) - expect(manager).toBeDefined() - }) - - test("should initialize UndoRedoContext", () => - { - const model = new Model(width, height) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - const context = new UndoRedoContext(model) - expect(manager.context).toStrictEqual(context) - }) - - describe("addModelToStack", () => - { - const configuration: TUndoRedoConfiguration = { maxStackSize: 5 } - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(configuration, model) - - test("should add model to stack", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - - test("should splice end of stack if stackIndex no last", () => - { - const NB_STROKE = 4 - for (let i = 0; i < NB_STROKE; i++) { - const p1: TPointer = { t: i * 5, p: 1, x: i * 10, y: 10 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: i * 10, p: 1, x: i * 10, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - } - expect(manager.context.stackIndex).toStrictEqual(NB_STROKE) - expect(manager.context.stack).toHaveLength(NB_STROKE + 1) - - manager.context.stackIndex = 0 - - const p1: TPointer = { t: 27, p: 0.5, x: 1989, y: 2022 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 75, p: 1, x: 200, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - - expect(manager.context.stackIndex).toEqual(1) - expect(manager.context.stack).toHaveLength(2) - - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - }) - - test("should shift the first element of the stack when maxStackSize is exceeded", () => - { - const NB_STROKE = 10 - for (let i = 0; i < NB_STROKE; i++) { - const p1: TPointer = { t: i * 42, p: 0.5, x: i / 2, y: i * 20 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: i * 10, p: 1, x: i * 10, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - } - - manager.addModelToStack(model) - expect(manager.context.stackIndex + 1).toStrictEqual(configuration.maxStackSize) - - expect(manager.context.stack).toHaveLength(configuration.maxStackSize) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - }) - - describe("undo", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should get the previous model", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const previousModel = manager.undo() - expect(manager.context.stackIndex).toStrictEqual(0) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(previousModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(previousModel) - - expect(manager.context.canUndo).toStrictEqual(false) - expect(manager.context.canRedo).toStrictEqual(true) - }) - }) - - describe("redo", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should get the next model", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - manager.undo() - const lastModel = manager.redo() - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(lastModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(lastModel) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - }) - - describe("updateModelInStack", () => - { - test("should update last model in stack", async () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - // wait a few seconds and have a different model.modificationDate - await delay(100) - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - - model.exports = { "text/plain": "-" } - manager.updateModelInStack(model) - - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - }) - - test("should update previous model in stack", async () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - // wait a few seconds and have a different model.modificationDate - await delay(100) - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - const firstModel = model.getClone() - manager.addModelToStack(model) - - const p3: TPointer = { t: 100, p: 0.5, x: 1, y: 10 } - // wait a few seconds and have a different model.modificationDate - await delay(100) - model.initCurrentStroke(p3, 666, "pen", DefaultPenStyle) - - const p4: TPointer = { t: 150, p: 0.5, x: 1, y: 10 } - model.endCurrentStroke(p4) - manager.addModelToStack(model) - - firstModel.exports = { "text/plain": "-" } - manager.updateModelInStack(firstModel) - - expect(manager.context.stack.at(-2)).toMatchObject(firstModel) - expect(manager.context.stack.at(-2)).not.toBe(firstModel) - }) - }) - - test("should reset context", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const newModel = new Model(width, height) - manager.reset(newModel) - - expect(manager.context.stackIndex).toStrictEqual(0) - - expect(manager.context.stack).toHaveLength(1) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(newModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(newModel) - - expect(manager.context.canUndo).toStrictEqual(false) - expect(manager.context.canRedo).toStrictEqual(false) - }) - -}) diff --git a/test/unit/07-behaviors/00-RestBehaviors.test.ts b/test/unit/07-behaviors/00-RestBehaviors.test.ts deleted file mode 100644 index 9ca1154c5..000000000 --- a/test/unit/07-behaviors/00-RestBehaviors.test.ts +++ /dev/null @@ -1,213 +0,0 @@ - -import { delay } from "../utils/helpers" -import { TBehaviorOptions, TConfiguration, IModel, TPointer } from "../../../src/@types" -import { behaviors, model, configuration, style } from "../../../src/iink" - -describe("RestBehaviors.ts", () => -{ - const { RestBehaviors } = behaviors - const { Model } = model - const { DefaultConfiguration } = configuration - const { DefaultPenStyle } = style - - const height = 100, width = 100 - const DefaultBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration - } - - test("should instanciate RestBehaviors", () => - { - const rb = new RestBehaviors(DefaultBehaviorsOptions) - expect(rb).toBeDefined() - }) - - test("should init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - rb.grabber.attach = jest.fn() - rb.renderer.init = jest.fn() - await rb.init(wrapperHTML) - expect(rb.grabber.attach).toBeCalledTimes(1) - expect(rb.grabber.attach).toBeCalledWith(wrapperHTML) - expect(rb.renderer.init).toBeCalledTimes(1) - expect(rb.renderer.init).toBeCalledWith(wrapperHTML) - }) - - test("should call renderer on drawCurrentStroke", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawPendingStroke = jest.fn() - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - rb.drawCurrentStroke() - expect(rb.renderer.drawPendingStroke).toBeCalledTimes(1) - expect(rb.renderer.drawPendingStroke).toBeCalledWith(rb.model.currentStroke) - }) - - describe("updateModelRendering", () => - { - test("should call renderer.drawModel", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.updateModelRendering() - expect(rb.renderer.drawModel).toBeCalledTimes(1) - }) - - test("should call recognizer.export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await rb.updateModelRendering() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(1) - }) - - test("should reject if recognizer.export in error", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(() => Promise.reject("pouet")) - expect(rb.updateModelRendering()).rejects.toEqual("pouet") - }) - - test("should not call recognizer.export when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const rb = new RestBehaviors({ configuration }) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await rb.updateModelRendering() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(0) - }) - }) - - test("should export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.export() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(1) - }) - - test("should convert", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.recognizer.convert = jest.fn(m => Promise.resolve(m)) - rb.convert("DIGITAL_EDIT", ["mime-type"]) - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.convert).toBeCalledTimes(1) - }) - - test("should resize", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - rb.renderer.resize = jest.fn() - rb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await rb.init(wrapperHTML) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - await rb.resize(1, 2) - expect(rb.renderer.resize).toBeCalledTimes(1) - expect(rb.recognizer.resize).toBeCalledTimes(1) - }) - - test("should not call recognizer on resize if no strokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.resize = jest.fn() - rb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await rb.resize(1, 2) - expect(rb.renderer.resize).toBeCalledTimes(1) - expect(rb.recognizer.resize).toBeCalledTimes(0) - }) - - test("should undo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - const model1 = new Model() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.renderer.drawModel = jest.fn() - rb.undoRedoManager.undo = jest.fn(() => model1) - await await rb.updateModelRendering() - const undoModel = await rb.undo() - expect(undoModel).toEqual(model1) - }) - - test("should redo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - const model2: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model2.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model2.endCurrentStroke(p2) - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.renderer.drawModel = jest.fn() - rb.undoRedoManager.redo = jest.fn(() => model2) - const redoModel = await rb.redo() - expect(redoModel.creationTime).toEqual(model2.creationTime) - }) - - test("should clear", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - expect(rb.model.rawStrokes.length).toBeGreaterThan(0) - const clearedModel = await rb.clear() - expect(rb.model.rawStrokes).toHaveLength(0) - expect(clearedModel).toBe(rb.model) - }) - - test("should destroy", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.grabber.detach = jest.fn() - rb.renderer.destroy = jest.fn() - rb.undoRedoManager.reset = jest.fn(m => m) - rb.destroy() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.grabber.detach).toBeCalledTimes(1) - expect(rb.renderer.destroy).toBeCalledTimes(1) - }) - -}) diff --git a/test/unit/07-behaviors/01-WSBehaviors.test.ts b/test/unit/07-behaviors/01-WSBehaviors.test.ts deleted file mode 100644 index db9ba9a80..000000000 --- a/test/unit/07-behaviors/01-WSBehaviors.test.ts +++ /dev/null @@ -1,805 +0,0 @@ -import { delay } from "../utils/helpers" -import -{ - TBehaviorOptions, - TConfiguration, - TExport, - TStroke, - TWebSocketSVGPatchEvent, - TPointer, - TPenStyle, - TTheme -} from "../../../src/@types" - -import { behaviors, event, model, configuration, style } from "../../../src/iink" - -describe("WSBehaviors.ts", () => -{ - const { WSBehaviors } = behaviors - const { InternalEvent } = event - const { Model } = model - const { DefaultConfiguration } = configuration - const { DefaultPenStyle } = style - - const height = 100, width = 100 - const DefaultBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration - } - - test("should instanciate WSBehaviors", () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - expect(wsb).toBeDefined() - }) - - test("should have internalEvent property", () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - expect(wsb.internalEvent).toBe(InternalEvent.getInstance()) - expect(wsb.internalEvent).toEqual(InternalEvent.getInstance()) - }) - - describe("init", () => - { - test("should init grabber, renderer & recognizer & context", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.init(wrapperHTML) - await expect(wsb.context).toMatchObject({ - canRedo: false, - canUndo: false, - empty: true, - stackIndex: 0, - possibleUndoCount: 0 - }) - await expect(wsb.grabber.attach).toBeCalledTimes(1) - await expect(wsb.grabber.attach).toBeCalledWith(wrapperHTML) - await expect(wsb.renderer.init).toBeCalledTimes(1) - await expect(wsb.renderer.init).toBeCalledWith(wrapperHTML) - await expect(wsb.recognizer.init).toBeCalledTimes(1) - }) - - test("should resolve init when recognizer.init is resolve", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.init).toBeCalledTimes(1) - }) - - test("should reject init when recognizer.init is reject", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.reject("pouet")) - await expect(wsb.init(wrapperHTML)).rejects.toEqual("pouet") - }) - }) - - describe("drawCurrentStroke", () => - { - test("should call renderer.drawPendingStroke", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.drawPendingStroke = jest.fn() - await wsb.init(wrapperHTML) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - wsb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - wsb.drawCurrentStroke() - await expect(wsb.renderer.drawPendingStroke).toBeCalledTimes(1) - await expect(wsb.renderer.drawPendingStroke).toBeCalledWith(wsb.model.currentStroke) - }) - test("should not call renderer.drawPendingStroke if currentStroke is null", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.drawPendingStroke = jest.fn() - await wsb.init(wrapperHTML) - wsb.drawCurrentStroke() - await expect(wsb.renderer.drawPendingStroke).toBeCalledTimes(0) - }) - }) - - describe("updateModelRendering", () => - { - test("should call recognizer.addStrokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearErasingStrokes = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(1) - }) - test("should call renderer.clearErasingStrokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearErasingStrokes = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.renderer.clearErasingStrokes).toBeCalledTimes(1) - }) - test("should not call recognizer.addStrokes when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(0) - }) - test("should reject if recognizer.addStrokes rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearErasingStrokes = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.updateModelRendering()).rejects.toEqual("poney") - }) - }) - - describe("export", () => - { - test("should call recognizer.export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.export() - await expect(wsb.recognizer.export).toBeCalledTimes(1) - }) - test("should reject if recognizer.export rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.export = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.export()).rejects.toEqual("poney") - }) - test("should call recognizer.addStrokes when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - wsb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.export() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(1) - await expect(wsb.recognizer.export).toBeCalledTimes(0) - }) - test("should reject if recognizer.addStrokes rejected when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.export()).rejects.toEqual("poney") - }) - }) - - describe("convert", () => - { - test("should call recognizer.convert", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.convert = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.convert() - await expect(wsb.recognizer.convert).toBeCalledTimes(1) - }) - }) - - describe("import", () => - { - test("should call recognizer.import", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.import = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - const mimeType = "text/plain" - const textImport = "winter is comming" - const blob = new Blob([textImport], { type: mimeType }) - await wsb.import(blob, mimeType) - await expect(wsb.recognizer.import).toBeCalledTimes(1) - }) - test("should return model form recognizer when recognizer emit EXPORTED", async () => - { - const exportExpected: TExport = { "test/plain": "cofveve" } - const wrapperHTML: HTMLElement = document.createElement("div") - const model = new Model(width, height) - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.import = jest.fn(() => - { - model.exports = exportExpected - return Promise.resolve(model) - }) - await wsb.init(wrapperHTML) - const mimeType = "text/plain" - const textImport = "winter is comming" - const blob = new Blob([textImport], { type: mimeType }) - const modelReceive = await wsb.import(blob, mimeType) - await await expect(modelReceive.exports).toBe(exportExpected) - }) - }) - - describe("importPointsEvent", () => - { - test("should call recognizer.importPointsEvents", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn() - wsb.recognizer.importPointEvents = jest.fn() - await wsb.init(wrapperHTML) - const tstrokeToImport: TStroke[] = JSON.parse(`[{ - "pointerType": "PEN", - "pointerId": 1, - "x": [128, 125, 122, 119, 118, 117, 116, 117, 119, 123, 127, 135, 139, 141, 144, 144, 143, 142, 141, 142], - "y": [83, 91, 99, 107, 114, 121, 125, 120, 112, 101, 90, 76, 70, 66, 76, 88, 101, 111, 118, 123], - "t": [1516190046205, 1516190046247, 1516190046264, 1516190046280, 1516190046297, 1516190046314, 1516190046330, 1516190046380, 1516190046397, 1516190046413, 1516190046430, 1516190046447, 1516190046463, 1516190046480, 1516190046547, 1516190046563, 1516190046581, 1516190046597, 1516190046614, 1516190046630], - "p": [0.5, 0.7076987214308235, 0.8060672826037246, 0.8060672826037246, 0.785875329883628, 0.785875329883628, 0.7185264889882718, 0.7461846839143089, 0.8024894359144054, 0.6578786777951477, 0.6578786777951477, 0.5984465727129564, 0.7880849230110567, 0.7292125754002905, 0.6768853685004259, 0.6535898384862245, 0.6389126863152722, 0.6829846120277299, 0.785875329883628, 0.7461846839143089] - },{ - "pointerType": "PEN", - "pointerId": 1, - "x": [117, 122, 128, 139, 146], - "y": [105, 105, 106, 107, 106], - "t": [1516190046870, 1516190046930, 1516190046947, 1516190046963, 1516190046980], - "p": [0.5, 0.7763932022500211, 0.7681880209236327, 0.6676543814462531, 0.785875329883628] - }]`) - await wsb.importPointEvents(tstrokeToImport) - expect(wsb.recognizer.importPointEvents).toBeCalledTimes(1) - expect(wsb.recognizer.importPointEvents).toBeCalledWith(tstrokeToImport) - }) - }) - - describe("resize", () => - { - test("should call renderer.resize", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.resize(1, 2) - await expect(wsb.renderer.resize).toBeCalledTimes(1) - }) - test("should reject if renderer.resize rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(() => Promise.reject("pony")) - await wsb.init(wrapperHTML) - await expect(wsb.resize(1, 2)).rejects.toEqual("pony") - }) - test("should call recognizer.resize after resizeTriggerDelay", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.resize(1, 2) - await delay(DefaultConfiguration.triggers.resizeTriggerDelay) - await expect(wsb.recognizer.resize).toBeCalledTimes(1) - }) - }) - - describe("undo", () => - { - test("should call recognizer.undo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canUndo = true - wsb.context.stackIndex = 1 - wsb.context.stack.push(new Model(100, 200)) - await wsb.undo() - await expect(wsb.recognizer.undo).toBeCalledTimes(1) - }) - test("should return previous model", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - expect(wsb.model).toEqual(wsb.context.stack[0]) - wsb.context.canUndo = true - wsb.context.stackIndex = 1 - wsb.context.stack.push(new Model(100, 200)) - await expect(wsb.undo()).resolves.toEqual(wsb.context.stack[0]) - }) - test("should throw error if context.canUndo = false", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await expect(wsb.undo()).rejects.toEqual(new Error("Undo not allowed")) - }) - }) - - describe("redo", () => - { - test("should call recognizer.redo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - wsb.context.stack.push(new Model(100, 200)) - await wsb.redo() - await expect(wsb.recognizer.redo).toBeCalledTimes(1) - }) - test("should return next model", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - const nextModel = new Model(100, 200) - wsb.context.stack.push(nextModel) - await expect(wsb.redo()).resolves.toEqual(wsb.context.stack[1]) - }) - test("should reject if recognizer.redo rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(() => Promise.reject("pony")) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - wsb.context.stack.push(new Model(100, 200)) - wsb.context.stack.push(new Model(42, 12)) - await expect(wsb.redo()).rejects.toEqual("pony") - }) - test("should throw error if context.canRedo = false", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await expect(wsb.redo()).rejects.toEqual(new Error("Redo not allowed")) - }) - }) - - describe("clear", () => - { - test("should call recognizer.clear", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.clear = jest.fn() - await wsb.init(wrapperHTML) - await wsb.clear() - await expect(wsb.recognizer.clear).toBeCalledTimes(1) - }) - }) - - describe("destroy", () => - { - test("should call grabber.detach", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.grabber.detach).toBeCalledTimes(1) - }) - - test("should call renderer.destroy", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.renderer.destroy).toBeCalledTimes(1) - }) - - test("should call recognizer.destroy", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.destroy = jest.fn() - wsb.destroy() - await expect(wsb.recognizer.destroy).toBeCalledTimes(1) - }) - - }) - - describe("Event", () => - { - test("should updatesLayer when recognizer emit SVG_PATCH", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.updatesLayer = jest.fn() - await wsb.init(wrapperHTML) - const svgPatch: TWebSocketSVGPatchEvent = { - type: "REPLACE_ALL", - layer: "MODEL", - updates: [] - } - wsb.recognizer.internalEvent.emitSVGPatch(svgPatch) - await expect(wsb.renderer.updatesLayer).toBeCalledTimes(1) - await expect(wsb.renderer.updatesLayer).toBeCalledWith(svgPatch.layer, svgPatch.updates) - }) - }) - - describe("Style", () => - { - test("should call styleManager.setPenStyle & recognizer.setPenStyle on init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const customPenStyle: TPenStyle = { color: "#d1d1d1" } - const customBehaviorsOptions: TBehaviorOptions = JSON.parse(JSON.stringify(DefaultBehaviorsOptions)) - customBehaviorsOptions.penStyle = customPenStyle - const wsb = new WSBehaviors(customBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyle = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.styleManager.setPenStyle).toBeCalledTimes(1) - await expect(wsb.styleManager.setPenStyle).toBeCalledWith(customPenStyle) - await expect(wsb.recognizer.setPenStyle).toBeCalledTimes(1) - await expect(wsb.recognizer.setPenStyle).toBeCalledWith(customPenStyle) - }) - test("should change PenStyle", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyle = jest.fn() - await wsb.init(wrapperHTML) - const customPenStyle: TPenStyle = { color: "#d1d1d1" } - await wsb.setPenStyle(customPenStyle) - await expect(wsb.styleManager.setPenStyle).toBeCalledTimes(2) - await expect(wsb.styleManager.setPenStyle).toHaveBeenNthCalledWith(2, customPenStyle) - await expect(wsb.recognizer.setPenStyle).toBeCalledTimes(2) - await expect(wsb.recognizer.setPenStyle).toHaveBeenNthCalledWith(2, wsb.styleManager.penStyle) - }) - test("should call styleManager.setTheme & recognizer.setTheme on init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const customBehaviorsOptions: TBehaviorOptions = JSON.parse(JSON.stringify(DefaultBehaviorsOptions)) - const customTheme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - customBehaviorsOptions.theme = customTheme - const wsb = new WSBehaviors(customBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.styleManager.setTheme = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(1) - await expect(wsb.styleManager.setTheme).toBeCalledWith(customTheme) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(1) - await expect(wsb.recognizer.setTheme).toBeCalledWith(wsb.styleManager.theme) - }) - test("should change Theme", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.styleManager.setTheme = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(1) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(1) - const customTheme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - await wsb.setTheme(customTheme) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(2) - await expect(wsb.styleManager.setTheme).toHaveBeenNthCalledWith(2, customTheme) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(2) - await expect(wsb.recognizer.setTheme).toHaveBeenNthCalledWith(2, wsb.styleManager.theme) - }) - test("should change PenStyleClasses", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyleClasses = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.setPenStyleClasses).toBeCalledTimes(1) - await expect(wsb.styleManager.setPenStyleClasses).toBeCalledTimes(1) - await wsb.setPenStyleClasses("pouet") - await expect(wsb.styleManager.setPenStyleClasses).toBeCalledTimes(2) - await expect(wsb.styleManager.setPenStyleClasses).toHaveBeenNthCalledWith(2, "pouet") - await expect(wsb.recognizer.setPenStyleClasses).toBeCalledTimes(2) - await expect(wsb.recognizer.setPenStyleClasses).toHaveBeenNthCalledWith(2, wsb.styleManager.penStyleClasses) - }) - }) - -}) diff --git a/test/unit/08-smart-guide/00-SmartGuide.test.ts b/test/unit/08-smart-guide/00-SmartGuide.test.ts deleted file mode 100644 index 24d2ef0e2..000000000 --- a/test/unit/08-smart-guide/00-SmartGuide.test.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { delay } from "../utils/helpers" -import { LeftClickEventFake } from "../utils/PointerEventFake" -import { TRenderingConfiguration, TMarginConfiguration } from "../../../src/@types" -import { smartguide, configuration, event } from "../../../src/iink" - -describe("SmartGuide.ts", () => -{ - const { SmartGuide } = smartguide - const { DefaultRenderingConfiguration } = configuration - const { InternalEvent } = event - const margin: TMarginConfiguration = { - bottom: 100, - top: 20, - left: 30, - right: 40 - } - test("should instanciate SmartGuide", () => - { - const sm = new SmartGuide() - expect(sm).toBeDefined() - }) - - test("should have internalEvent property", () => - { - const sm = new SmartGuide() - expect(sm.internalEvent).toBe(InternalEvent.getInstance()) - }) - - describe("Initilize", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - test("should init wrapper", () => - { - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide).toBeDefined() - expect(smartguide.id).toBe(`smartguide-${ sm.uuid }`) - }) - test("should init prompter", () => - { - const prompter = domElement.querySelector(".prompter-container") as HTMLDivElement - expect(prompter).toBeDefined() - expect(prompter.id).toBe(`prompter-container-${ sm.uuid }`) - - const prompterText = domElement.querySelector(".prompter-text") as HTMLDivElement - expect(prompterText).toBeDefined() - expect(prompterText.id).toBe(`prompter-text-${ sm.uuid }`) - }) - test("should init ellipsis", () => - { - const wrapper = domElement.querySelector(".ellipsis") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`ellipsis-${ sm.uuid }`) - }) - test("should init ellipsis", () => - { - const wrapper = domElement.querySelector(".tag-icon") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`tag-icon-${ sm.uuid }`) - }) - test("should init candidates", () => - { - const wrapper = domElement.querySelector(".candidates") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`candidates-${ sm.uuid }`) - }) - test("should init more-menu", () => - { - const wrapper = domElement.querySelector(".more-menu") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`more-menu-${ sm.uuid }`) - - const copyBtn = domElement.querySelector(`#copy-${ sm.uuid }`) as HTMLDivElement - expect(copyBtn).toBeDefined() - expect(copyBtn.classList).toContain("options-label-button") - - const deleteBtn = domElement.querySelector(`#delete-${ sm.uuid }`) as HTMLDivElement - expect(deleteBtn).toBeDefined() - expect(deleteBtn.classList).toContain("options-label-button") - }) - }) - - describe("Smartguide visibility", () => - { - test("should be displayed on initialization", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide.classList).not.toContain("smartguide-out") - expect(smartguide.classList).toContain("smartguide-in") - }) - test("should be hide after fadeOut delay", async () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - const renderingConfiguration: TRenderingConfiguration = { - ...DefaultRenderingConfiguration - } - renderingConfiguration.smartGuide.fadeOut.enable = true - renderingConfiguration.smartGuide.fadeOut.duration = 100 - sm.init(domElement, margin, renderingConfiguration) - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide.classList).not.toContain("smartguide-out") - expect(smartguide.classList).toContain("smartguide-in") - - await delay(renderingConfiguration.smartGuide.fadeOut.duration + 10) - expect(smartguide.classList).toContain("smartguide-out") - expect(smartguide.classList).not.toContain("smartguide-in") - }) - }) - - describe("Menu visibility", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - test("should hidden by default", () => - { - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).toContain("close") - expect(menu.classList).not.toContain("open") - }) - test("should open menu", () => - { - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).not.toContain("close") - expect(menu.classList).toContain("open") - }) - test("should close menu", () => - { - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).toContain("close") - expect(menu.classList).not.toContain("open") - }) - }) - - describe("Menu actions", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.internalEvent.emitConvert = jest.fn() - sm.internalEvent.emitClear = jest.fn() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - test("should emit CONVERT", () => - { - const btn = domElement.querySelector(`#convert-${ sm.uuid }`) as HTMLDivElement - btn.dispatchEvent(pointerDownEvt) - expect(sm.internalEvent.emitConvert).toBeCalledTimes(1) - }) - test.skip("should COPY", () => - { - // TODO - }) - test("should emit CLEAR", () => - { - const btn = domElement.querySelector(`#delete-${ sm.uuid }`) as HTMLDivElement - btn.dispatchEvent(pointerDownEvt) - expect(sm.internalEvent.emitClear).toBeCalledTimes(1) - }) - }) - - describe("Display", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - const jiix = { - "type": "Text", - "label": "hello how", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": ["hello", "helle", "hellor", "hells", "hellon"] - }, - { - "label": " " - }, - { - "id": "2", - "label": "how", - "candidates": ["how", "hou", "hore", "hon", "hor"] - } - ], - "version": "3", - "id": "MainBlock" - } - - test("should display jiix label into prompter-text", () => - { - sm.update(jiix) - const prompterText = domElement.querySelector(".prompter-text") as HTMLDivElement - expect(prompterText).toBeDefined() - expect(prompterText.textContent).toContain(jiix.words[0].label) - expect(prompterText.textContent).toContain(jiix.words[2].label) - expect(prompterText.children.length).toBeGreaterThan(0) - const candidates = domElement.querySelector(".candidates") as HTMLDivElement - expect(candidates.children).toHaveLength(0) - }) - - test.skip("should open candidates", () => - { - // cannot be tested here, you have to simulate an event with a target different from the prompter - const prompterTextElement = domElement.querySelector(".prompter-text") as HTMLDivElement - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1, - }) - - prompterTextElement.dispatchEvent(pointerDownEvt) - const candidates = domElement.querySelector(".candidates") as HTMLDivElement - expect(candidates.children).toHaveLength(jiix.words.length) - }) - }) - -}) diff --git a/test/unit/09-event/00-PublicEvent.test.ts b/test/unit/09-event/00-PublicEvent.test.ts deleted file mode 100644 index 6f5ff87a2..000000000 --- a/test/unit/09-event/00-PublicEvent.test.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { - TExport, - TJIIXExport -} from '../../../src/@types' -import { event, constants, model } from "../../../src/iink" - -describe('PublicEvent.ts', () => -{ - const { PublicEvent } = event - const { Model } = model - const publicEvent = PublicEvent.getInstance() - - test('should have singleton', () => - { - const publicEvent1 = PublicEvent.getInstance() - const publicEvent2 = PublicEvent.getInstance() - expect(publicEvent1).toBe(publicEvent2) - expect(publicEvent1).toEqual(publicEvent2) - expect(publicEvent1).toStrictEqual(publicEvent2) - }) - - test('should emit & listen LOADED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.LOADED, testFunction) - publicEvent.emitLoaded() - expect(testFunction).toBeCalledTimes(1) - }) - - test('should emit & listen EXPORTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.EXPORTED, testFunction) - const exports:TExport = { 'text/plain': 'tatapouet' } - publicEvent.emitExported(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - - test('should emit & listen CHANGED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CHANGED, testFunction) - const undoRedoContext = { - canUndo: true, - canRedo: false, - canClear: true, - stackIndex: 10, - empty: false, - possibleUndoCount: 10, - stack: [] - } - publicEvent.emitChanged(undoRedoContext) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: undoRedoContext - }), - ) - }) - - test('should emit & listen IDLE', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.IDLE, testFunction) - publicEvent.emitIdle(true) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: true - }), - ) - }) - - test('should emit & listen CLEARED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CLEARED, testFunction) - const model = new Model(100, 50) - publicEvent.emitCleared(model) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: model - }), - ) - }) - - test('should emit & listen CONVERTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CONVERTED, testFunction) - const exports: TExport = { 'text/plain': 'tatapouet' } - publicEvent.emitConverted(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - - test('should emit & listen IMPORTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.IMPORTED, testFunction) - const jiix: TJIIXExport = { - "type": "Text", - "label": "hello", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": [ "hello", "helle", "hellor", "hells", "hellon" ] - } - ], - "version": "3", - "id": "MainBlock" - } - const exports: TExport = { - "application/vnd.myscript.jiix": jiix - } - publicEvent.emitImported(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - -}) diff --git a/test/unit/09-event/01-InternalEvent.test.ts b/test/unit/09-event/01-InternalEvent.test.ts deleted file mode 100644 index 3e7603164..000000000 --- a/test/unit/09-event/01-InternalEvent.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { TWebSocketSVGPatchEvent } from "../../../src/@types" -import { event } from "../../../src/iink" - -describe("InternalEvent.ts", () => -{ - const { InternalEvent } = event - const internalEvent = InternalEvent.getInstance() - - test("should have singleton", () => - { - const iEvent1 = InternalEvent.getInstance() - const iEvent2 = InternalEvent.getInstance() - expect(iEvent1).toBe(iEvent2) - expect(iEvent1).toEqual(iEvent2) - expect(iEvent1).toStrictEqual(iEvent2) - }) - - test("should execute callback on emitSVGPatch", () => - { - const testFunction = jest.fn() - internalEvent.addSVGPatchListener(testFunction) - const svgPatch: TWebSocketSVGPatchEvent = { - type: "svgPatch", - layer: "MODEL", - updates: [] - } - internalEvent.emitSVGPatch(svgPatch) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(svgPatch) - }) - - test("should execute callback on emitNotif", () => - { - const testFunction = jest.fn() - internalEvent.addNotifListener(testFunction) - const notif = { message: "this is the end", timeout: 666 } - internalEvent.emitNotif(notif) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(notif) - }) - - test("should execute callback on emitError", () => - { - const testFunction = jest.fn() - internalEvent.addErrorListener(testFunction) - const error = new Error("this is un error message") - internalEvent.emitError(error) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(error) - }) - - test("should execute callback on emitClear", () => - { - const testFunction = jest.fn() - internalEvent.addClearListener(testFunction) - internalEvent.emitClear() - expect(testFunction).toBeCalledTimes(1) - }) - - test("should execute callback on emitConvert", () => - { - const testFunction = jest.fn() - internalEvent.addConvertListener(testFunction) - internalEvent.emitConvert("DIGITAL_EDIT") - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith("DIGITAL_EDIT") - }) - - test("should execute callback on emitImportJIIX", () => - { - const testFunction = jest.fn() - internalEvent.addImportJIIXListener(testFunction) - const jiix = { - "type": "Text", - "label": "hello", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": [ "hello", "helle", "hellor", "hells", "hellon" ] - } - ], - "version": "3", - "id": "MainBlock" - } - internalEvent.emitImportJIIX(jiix) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(jiix) - }) - - test("should execute callback on emitClearMessage", () => - { - const testFunction = jest.fn() - internalEvent.addClearMessageListener(testFunction) - internalEvent.emitClearMessage() - expect(testFunction).toBeCalledTimes(1) - }) -}) diff --git a/test/unit/99-iink/00-Editor.test.ts b/test/unit/99-iink/00-Editor.test.ts deleted file mode 100644 index af0bd6ab5..000000000 --- a/test/unit/99-iink/00-Editor.test.ts +++ /dev/null @@ -1,701 +0,0 @@ -import { AllOverrideConfiguration } from "../_dataset/configuration.dataset" -import { delay } from "../utils/helpers" -// import { LeftClickEventFake } from "../utils/PointerEventFake" -import -{ - TBehaviorOptions, - TStroke, - TTheme, - TPenStyle, - TJIIXExport, - TConfiguration -} from "../../../src/@types" -import -{ - Editor, - configuration, - style, - model, - grabber, - recognizer, - constants, - event -} from "../../../src/iink" - -describe("Editor.ts", () => -{ - const { DefaultConfiguration } = configuration - const { DefaultPenStyle, DefaultTheme } = style - const { Model} = model - const { PointerEventGrabber } = grabber - const { WSRecognizer } = recognizer - const { PublicEvent, InternalEvent } = event - const publicEvent = PublicEvent.getInstance() - const DefaultBehaviorsOptions: TBehaviorOptions = { configuration: DefaultConfiguration } - - describe("constructor", () => - { - test("should instantiate Editor", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor).toBeDefined() - expect(editor.configuration).toBeDefined() - expect(editor.model).toBeDefined() - }) - test("should instantiate Editor with custom configuration", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, { configuration: (AllOverrideConfiguration as TConfiguration) }) - editor.initialize() - expect(editor).toBeDefined() - expect(editor.configuration).toBeDefined() - expect(editor.model).toBeDefined() - }) - test("should define default grabber", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.grabber).not.toBe(customGrabber) - }) - test("should override grabber", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - const customBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration, - behaviors: { - grabber: customGrabber - } - } - const editor = new Editor(wrapperHTML, customBehaviorsOptions) - expect(editor.grabber).toBe(customGrabber) - }) - test("should define default recognizer", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customRecognizer = new WSRecognizer(DefaultConfiguration.server, DefaultConfiguration.recognition) - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.behaviors.recognizer).not.toBe(customRecognizer) - }) - test("should override recognizer", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customRecognizer = new WSRecognizer(DefaultConfiguration.server, DefaultConfiguration.recognition) - const customBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration, - behaviors: { - recognizer: customRecognizer - } - } - const editor = new Editor(wrapperHTML, customBehaviorsOptions) - expect(editor.behaviors.recognizer).toBe(customRecognizer) - }) - test("should throw error if instantiate Editor without configuration", () => - { - expect.assertions(1) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - try { - //@ts-ignore - new Editor(wrapperHTML, {}) - } - catch (error) { - expect((error as Error).message).toEqual("Configuration required") - } - }) - test("should append loader element", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(wrapperHTML.querySelector(".loader")).toBeDefined() - }) - test("should append error element", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(wrapperHTML.querySelector(".error-msg")).toBeDefined() - }) - }) - - describe("initialize", () => - { - test("should display and hide loader", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - const LOAD_TIMEOUT = 200 - editor.behaviors.init = jest.fn(async () => { await delay(LOAD_TIMEOUT); return Promise.resolve() }) - const loaderElement = wrapperHTML.getElementsByClassName("loader") - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("none") - editor.initialize() - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("initial") - await delay(LOAD_TIMEOUT) - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("none") - }) - test("should resolve when behaviors.init is resolved", async () => - { - expect.assertions(1) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - expect(editor.initializationPromise).toBeDefined() - }) - test("should reject when behaviors.init is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.reject("pouet")) - expect(editor.initialize()).rejects.toEqual("pouet") - }) - test("should show error when behaviors.init is rejected", async () => - { - expect.assertions(3) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.reject(new Error("pouet"))) - const messageElement = wrapperHTML.getElementsByClassName("message") - try { - //@ts-ignore - expect(messageElement.item(0)?.style.display).toEqual("none") - await editor.initialize() - } catch (error) { - //@ts-ignore - expect(messageElement.item(0)?.style.display).toEqual("initial") - //@ts-ignore - expect(messageElement.item(0)?.innerText).toEqual("pouet") - } - }) - }) - - describe("configuration", () => - { - test("should change behaviors", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.behaviors.name).toEqual("WSBehaviors") - editor.behaviors.destroy = jest.fn(() => Promise.resolve()) - //@ts-ignore - editor.configuration = { ...DefaultBehaviorsOptions, server: { protocol: "REST" } } - expect(editor.behaviors.name).toEqual("RestBehaviors") - }) - }) - - describe("intention", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - test("should init intention = Write", () => - { - expect(editor.intention).toBe(constants.Intention.Write) - }) - test("should set intention = erase", () => - { - editor.intention = constants.Intention.Erase - expect(wrapperHTML.classList).toContain("erasing") - }) - test("should toggle intention", () => - { - editor.intention = constants.Intention.Erase - expect(wrapperHTML.classList).toContain("erasing") - editor.intention = constants.Intention.Write - expect(wrapperHTML.classList).not.toContain("erasing") - }) - }) - - describe("context", () => - { - test("should get context", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.context).toBe(editor.behaviors.context) - }) - }) - - describe('undo', () => - { - test("should resolve when behaviors.undo is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.undo = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.undo() - expect(editor.behaviors.undo).toBeCalledTimes(1) - }) - test("should reject when behaviors.undo is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.undo = jest.fn(() => Promise.reject("pouet")) - expect(editor.undo()).rejects.toEqual("pouet") - }) - }) - - describe("redo", () => - { - test("should resolve when behaviors.redo is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.redo = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.redo() - expect(editor.behaviors.redo).toBeCalledTimes(1) - }) - test("should reject when behaviors.redo is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.redo = jest.fn(() => Promise.reject("pouet")) - expect(editor.redo()).rejects.toEqual("pouet") - }) - }) - - describe("clear", () => - { - test("should resolve when behaviors.clear is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.clear = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.clear() - expect(editor.behaviors.clear).toBeCalledTimes(1) - }) - test("should reject when behaviors.clear is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.clear = jest.fn(() => Promise.reject("pouet")) - expect(editor.clear()).rejects.toEqual("pouet") - }) - test("should emit cleared event", async () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CLEARED, testFunction) - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - const modelExpected = new Model(100, 100) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.clear = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.clear() - expect(testFunction).toBeCalledTimes(1) - }) - }) - - describe("resize", () => - { - test("should resolve when behaviors.resize is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.resize = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.resize() - expect(editor.behaviors.resize).toBeCalledTimes(1) - }) - test("should reject when behaviors.resize is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.resize = jest.fn(() => Promise.reject("pouet")) - expect(editor.resize()).rejects.toEqual("pouet") - }) - }) - - describe("export", () => - { - test("should resolve when behaviors.export is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.export = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.export() - expect(editor.behaviors.export).toBeCalledTimes(1) - }) - test("should reject when behaviors.export is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.export = jest.fn(() => Promise.reject("pouet")) - expect(editor.export()).rejects.toEqual("pouet") - }) - }) - - describe("convert", () => - { - test("should resolve when behaviors.convert is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.convert = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.convert() - expect(editor.behaviors.convert).toBeCalledTimes(1) - }) - test("should reject when behaviors.convert is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.convert = jest.fn(() => Promise.reject("pouet")) - expect(editor.convert()).rejects.toEqual("pouet") - }) - }) - - describe("import", () => - { - test("should resolve import Blob when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - await editor.import(new Blob(), "text/plain") - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import Blob if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - expect(editor.import(new Blob(), "text/plain")).rejects.toEqual("pouet") - }) - test("should reject import Blob if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - expect(editor.import(new Blob(), "text/plain")).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import Text when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - await editor.import("hello", "text/plain") - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import Text if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - expect(editor.import("hello", "text/plain")).rejects.toEqual("pouet") - }) - test("should reject import Text if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - expect(editor.import("hello", "text/plain")).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import JIIX when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - await editor.import(jiix) - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import JIIX if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - expect(editor.import(jiix)).rejects.toEqual("pouet") - }) - test("should reject import JIIX if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - expect(editor.import(jiix)).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import points Events when behaviors.importPointEvents is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = jest.fn(() => Promise.resolve(model)) - await editor.importPointEvents(tstrokeToImport) - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.importPointEvents).toBeCalledTimes(1) - }) - test("should resolve import points Events when behaviors.importPointEvents is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = jest.fn(() => Promise.reject("pouet")) - expect(editor.importPointEvents(tstrokeToImport)).rejects.toEqual("pouet") - }) - test("should reject import Points if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = undefined - expect(editor.importPointEvents(tstrokeToImport)).rejects.toEqual("Import impossible, behaviors has no importPointEvents function") - }) - }) - - describe("Style", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - let editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - test("should init theme", () => - { - expect(editor.theme).toStrictEqual(DefaultTheme) - }) - test("should set theme", () => - { - editor.behaviors.setTheme = jest.fn() - //@ts-ignore - const customTheme: TTheme = { - ink: { - width: 42, - color: "red", - "-myscript-pen-fill-color": "blue", - "-myscript-pen-fill-style": "style", - "-myscript-pen-width": 5 - } - } - editor.theme = customTheme - expect(editor.behaviors.setTheme).toBeCalledTimes(1) - expect(editor.behaviors.setTheme).toBeCalledWith(customTheme) - }) - test("should set penStyleClasses", () => - { - editor.behaviors.setPenStyleClasses = jest.fn() - const customPenStyleClasses = "customPenStyleClasses" - editor.penStyleClasses = customPenStyleClasses - expect(editor.behaviors.setPenStyleClasses).toBeCalledTimes(1) - expect(editor.behaviors.setPenStyleClasses).toBeCalledWith(customPenStyleClasses) - }) - test("should init penStyle", () => - { - expect(editor.penStyle).toStrictEqual(DefaultPenStyle) - }) - test("should init penStyle", () => - { - editor.behaviors.setPenStyle = jest.fn() - const customPenStyle: TPenStyle = { - width: 42, - color: "red", - "-myscript-pen-fill-color": "blue", - "-myscript-pen-fill-style": "style", - "-myscript-pen-width": 5 - } - editor.penStyle = customPenStyle - expect(editor.behaviors.setPenStyle).toBeCalledTimes(1) - expect(editor.behaviors.setPenStyle).toBeCalledWith(customPenStyle) - }) - }) - - describe("Events", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - // TODO problem with internal event singleton - test.skip("should call clear when internalEvent emit clear", () => - { - editor.clear = jest.fn() - expect(editor.clear).toBeCalledTimes(0) - InternalEvent.getInstance().emitClear() - expect(editor.clear).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should call convert when internalEvent emit convert", () => - { - editor.convert = jest.fn() - expect(editor.convert).toBeCalledTimes(0) - InternalEvent.getInstance().emitConvert() - expect(editor.convert).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should emit changed when internalEvent emit changed", () => - { - editor.events.emitChanged = jest.fn() - expect(editor.events.emitChanged).toBeCalledTimes(0) - InternalEvent.getInstance().emitContextChange({ canRedo: true, canUndo: true, empty: false, possibleUndoCount: 10, stack: [], stackIndex: 11 }) - expect(editor.events.emitChanged).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should emit idle when internalEvent emit idle", () => - { - editor.events.emitIdle = jest.fn() - expect(editor.events.emitIdle).toBeCalledTimes(0) - InternalEvent.getInstance().emitIdle(true) - expect(editor.events.emitIdle).toBeCalledTimes(1) - }) - }) - -}) diff --git a/test/unit/99-iink/01-utils.test.ts b/test/unit/99-iink/01-utils.test.ts deleted file mode 100644 index e4d7f1d26..000000000 --- a/test/unit/99-iink/01-utils.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { ConfigurationTextWebsocket } from "../_dataset/configuration.dataset" -import { utils } from "../../../src/iink" - -describe("utils", () => -{ - const { getAvailableLanguageList, getAvailableFontList, version, geometric, crypto } = utils - describe("getAvailableLanguageList", () => - { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => Promise.resolve({ fr: "fr_FR" }), - }), - ) as jest.Mock - - test("should call fetch with good url", async () => - { - await getAvailableLanguageList(ConfigurationTextWebsocket) - expect(fetch).toBeCalledTimes(1) - expect(fetch).toBeCalledWith(`${ ConfigurationTextWebsocket?.server?.scheme }://${ ConfigurationTextWebsocket?.server?.host }/api/v4.0/iink/availableLanguageList`) - }) - - test("should reject getAvailableLanguageList if no configuration", async () => - { - // @ts-ignore - getAvailableLanguageList() - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server.scheme is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.scheme - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.host - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - }) - - describe("getAvailableFontList", () => - { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => Promise.resolve({ result: [] }), - }), - ) as jest.Mock - - test("should call fetch with good url", async () => - { - await getAvailableFontList(ConfigurationTextWebsocket) - expect(fetch).toBeCalledTimes(1) - expect(fetch).toBeCalledWith(`${ ConfigurationTextWebsocket?.server?.scheme }://${ ConfigurationTextWebsocket?.server?.host }/api/v4.0/iink/font/google/language/${ ConfigurationTextWebsocket?.recognition?.lang }`) - }) - - test("should reject getAvailableFontList if no configuration", async () => - { - // @ts-ignore - getAvailableFontList() - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.scheme is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.scheme - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.host - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.recognition?.lang - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.recognition.lang is required!") - }) - }) - }) - - describe("version", () => - { - const testDatas = [ - { source: "1.0.1", target: "1.0.0", expected: true }, - { source: "1.1.0", target: "1.0.0", expected: true }, - { source: "2.0.0", target: "1.0.0", expected: true }, - { source: "2.0.0", target: "1.9.14", expected: true }, - { source: "2.12.90", target: "2.12.88", expected: true }, - { source: "1.99.99", target: "2.0.0", expected: false }, - { source: "2.0.9", target: "2.0.91", expected: false }, - { source: "2.11.9", target: "2.12.88", expected: false }, - { source: "1.0.0", target: "1.0.0", expected: true }, - ] - - testDatas.forEach(d => - { - test(`shoud get ${ d.source } is ${ d.expected ? "higher" : "lower" } than ${ d.target }`, () => - { - expect(version.isVersionSuperiorOrEqual(d.source, d.target)).toEqual(d.expected) - }) - }) - }) - - describe("geometric", () => - { - describe("computeDistance", () => - { - const testDatas = [ - { - p1: { x: 0, y: 0 }, - p2: { x: 0, y: 3 }, - expected: 3 - }, - { - p1: { x: 0, y: 0 }, - p2: { x: 3, y: 0 }, - expected: 3 - }, - { - p1: { x: 0, y: 0 }, - p2: { x: 1, y: 1 }, - expected: Math.sqrt(2) - }, - ] - testDatas.forEach(d => - { - test(`should computed distance of P1: [${ JSON.stringify(d.p1) }] & P2: [${ JSON.stringify(d.p2) }] to equal ${ d.expected }`, () => - { - expect(geometric.computeDistance(d.p1, d.p2)).toEqual(d.expected) - }) - }) - }) - }) - - describe("crypto", () => - { - test("should computeHmac", () => - { - const computedHmac = crypto.computeHmac("Message", "AppKey", "HMACKey") - expect(computedHmac) - .toBe("b4d62a1900a4010a140e31fc4a07b6445499e6c7488f3214962427b2d539056182d0990f4d042ace794704f03dc6fdc2f73e25dd6ea35d3e0fd537d1dd4c1223") - }) - - }) -}) diff --git a/test/unit/_dataset/configuration.dataset.ts b/test/unit/_dataset/configuration.dataset.ts deleted file mode 100644 index 8dbce36ec..000000000 --- a/test/unit/_dataset/configuration.dataset.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { TConfigurationClient } from "../../../src/@types/configuration" - -export const ConfigurationTextWebsocket: TConfigurationClient = { - server: { - protocol: 'WEBSOCKET', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - lang: "en_US", - type: 'TEXT', - text: { - mimeTypes: ['text/plain', 'application/vnd.myscript.jiix'], - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - } - } -} - -export const ConfigurationTextRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'TEXT', - text: { - mimeTypes: ['text/plain', 'application/vnd.myscript.jiix'], - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - } - } -} - -export const ConfigurationDiagramRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'DIAGRAM', - diagram: { - mimeTypes: ['application/vnd.myscript.jiix'] - } - } -} - -export const ConfigurationRawContentRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'Raw Content', - } -} - -export const AllOverrideConfiguration: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'host', - applicationKey: 'applicationKey', - hmacKey: 'hmacKey', - version: '2.0.4', - useWindowLocation: false, - websocket: { - pingEnabled: false, - pingDelay: 42, - maxPingLostCount: 42, - autoReconnect: false, - maxRetryCount: 42, - fileChunkSize: 42 - } - }, - recognition: { - type: 'DIAGRAM', - alwaysConnected: false, - lang: 'fr_FR', - gesture: { - enable: false - }, - export: { - 'image-resolution': 12, - jiix: { - 'bounding-box': true, - strokes: true, - text: { - chars: true, - words: false - } - }, - }, - renderer: { - debug: { - 'draw-text-boxes': true, - 'draw-image-boxes': true - } - }, - math: { - mimeTypes: ['application/mathml+xml'], // 'application/mathml+xml', 'application/vnd.myscript.jiix', - solver: { - enable: false, - 'fractional-part-digits': 4, - 'decimal-separator': ',', - 'rounding-mode': 'truncate', - 'angle-unit': 'rad' - }, - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - eraser: { - 'erase-precisely': true - }, - 'undo-redo': { - mode: 'session' - } - }, - text: { - guides: { - enable: false - }, - mimeTypes: ['application/vnd.myscript.jiix'], - margin: { - top: 21, - left: 21, - right: 21, - bottom: 21 - }, - eraser: { - 'erase-precisely': true - } - }, - diagram: { - mimeTypes: ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], - eraser: { - 'erase-precisely': true - }, - convert: { - "match-text-size": true, - }, - }, - 'raw-content': { - recognition: { - text: false, - shape: true - }, - eraser: { - 'erase-precisely': true - } - } - }, - grabber: { - listenerOptions: { - capture: true, - passive: false - }, - xyFloatPrecision: 27, - timestampFloatPrecision: 27 - }, - rendering: { - minHeight: 42, - minWidth: 42, - smartGuide: { - enable: false, - fadeOut: { - enable: true, - duration: 42 - } - }, - guides: { - enable: false, - gap: 100 - } - }, - triggers: { - exportContent: 'DEMAND', - exportContentDelay: 5, - resizeTriggerDelay: 5 - }, - events: { - processDelay: 0 - }, - 'undo-redo': { - maxStackSize: 10 - } -} diff --git a/test/unit/jest.setup.js b/test/unit/jest.setup.js deleted file mode 100644 index ba3a43285..000000000 --- a/test/unit/jest.setup.js +++ /dev/null @@ -1,4 +0,0 @@ -global.structuredClone = (val) => JSON.parse(JSON.stringify(val)) -console.log = jest.fn() -console.warn = jest.fn() -console.error = jest.fn() diff --git a/test/unit/utils/PointerEventFake.ts b/test/unit/utils/PointerEventFake.ts deleted file mode 100644 index 4aea108af..000000000 --- a/test/unit/utils/PointerEventFake.ts +++ /dev/null @@ -1,84 +0,0 @@ -type EventFakeProps = { - clientX: number - clientY: number - pressure: number - pointerType: string -} - -type CompleteEventFakeProps = EventFakeProps & { - button: number - buttons: number -} - -type TouchListFake = ({clientX: number, clientY: number})[] - -export class PointerEventFake extends Event { - clientX: number - clientY: number - pressure: number - pointerType: string - button: number - buttons: number - pointerId: number - constructor(type: string, props: CompleteEventFakeProps) { - super(type, props as EventInit); - this.clientX = props.clientX - this.clientY = props.clientY - this.pointerType = props.pointerType - this.pressure = props.pressure - this.button = props.button - this.buttons = props.buttons - this.pointerId = Math.floor(Math.random() * 100) - } -} - -export class LeftClickEventFake extends PointerEventFake { - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 1 - }) - } -} - -export class RightClickEventFake extends PointerEventFake { - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 1, - buttons: 1 - }) - } -} - - -export class TouchEventFake extends PointerEventFake { - changedTouches: TouchListFake - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 1 - }) - this.changedTouches = [{ - clientX: props.clientX, - clientY: props.clientY, - }] - } -} - -export class DoubleTouchEventFake extends PointerEventFake { - changedTouches: TouchListFake - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 2 - }) - this.changedTouches = [{ - clientX: props.clientX, - clientY: props.clientY, - }] - } -} \ No newline at end of file diff --git a/test/unit/utils/helpers.ts b/test/unit/utils/helpers.ts deleted file mode 100644 index 3097053eb..000000000 --- a/test/unit/utils/helpers.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export const delay = (delayInms: number) => { - return new Promise(resolve => setTimeout(resolve, delayInms)); -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 86b38b117..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "compilerOptions": { - "outDir": "dist", - "target": "ES2015", - "module": "ES2015", - "moduleResolution": "node", - "lib": [ - "DOM", - "ES2015", - "ES2016", - "ES2017" - ], - "declaration": false, - "declarationMap": false, - "removeComments": false, - "preserveConstEnums": true, - "sourceMap": true, - "strict": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "allowSyntheticDefaultImports": true, - "alwaysStrict": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "skipLibCheck": true, - "esModuleInterop": true - }, - "types": [ - "./node_modules/@types/**", - "@types/jest", - "jest-websocket-mock", - "jest-playwright-preset", - "expect-playwright", - ], - "include": [ - "." - ], - "exclude": [ - "node_modules", - "dist", - "examples/**", - "plugins" - ] -} diff --git a/typedoc.css b/typedoc.css deleted file mode 100644 index c04d8ea26..000000000 --- a/typedoc.css +++ /dev/null @@ -1,3 +0,0 @@ -.tsd-accordion-summary { - display: flex; -} diff --git a/typedoc.json b/typedoc.json deleted file mode 100644 index 5bb768e2c..000000000 --- a/typedoc.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "entryPoints": [ - "src/iink.ts" - ], - "includes": "src", - "exclude": [ - "config", - "coverage", - "dist", - "docker", - "docs", - "examples", - "test", - "node_modules" - ], - "plugin": [ - "typedoc-plugin-missing-exports", - "./plugins/typdoc-default-object.ts" - ], - "sort": [ - "alphabetical", - ], - "excludeExternals": true, - "readme": "README.md", - "includeVersion": true, - "disableSources": false, - "githubPages": true, - "cleanOutputDir": true, - "categorizeByGroup": true, - "navigation": { - "includeCategories": false, - "includeGroups": true - }, - "visibilityFilters": { - "protected": false, - "private": false, - "inherited": true, - "external": false, - "@alpha": false, - "@beta": false, - }, - "out": "./docs", - "pretty": true, - "customCss": "./typedoc.css" -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 305ade28e..000000000 --- a/yarn.lock +++ /dev/null @@ -1,5749 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== - dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== - -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.5.2" - 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" - -"@eslint/js@8.43.0": - version "8.43.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" - integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - 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" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - 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" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - 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" - -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== - dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== - dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - 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" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - 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" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - 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" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - dependencies: - "@jest/schemas" "^28.1.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" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - 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" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/plugin-node-resolve@^13.3.0": - version "13.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" - integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - deepmerge "^4.2.2" - is-builtin-module "^3.1.0" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@rollup/pluginutils@^4.1.2": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@*": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.2.0": - version "29.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" - integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jsdom@^16.2.4": - version "16.2.15" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.15.tgz#6c09990ec43b054e49636cba4d11d54367fc90d6" - integrity sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ== - dependencies: - "@types/node" "*" - "@types/parse5" "^6.0.3" - "@types/tough-cookie" "*" - -"@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== - -"@types/node@^18.11.5": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== - -"@types/parse5@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== - -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== - -"@types/wait-on@^5.2.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@types/wait-on/-/wait-on-5.3.1.tgz#bc5520d1d8b90b9caab1bef23315685ded73320d" - integrity sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.33.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" - integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/type-utils" "5.60.0" - "@typescript-eslint/utils" "5.60.0" - debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.33.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" - integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== - dependencies: - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" - integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== - dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" - -"@typescript-eslint/type-utils@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" - integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== - dependencies: - "@typescript-eslint/typescript-estree" "5.60.0" - "@typescript-eslint/utils" "5.60.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" - integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== - -"@typescript-eslint/typescript-estree@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" - integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== - dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.60.0", "@typescript-eslint/utils@^5.10.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" - integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" - integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== - dependencies: - "@typescript-eslint/types" "5.60.0" - eslint-visitor-keys "^3.3.0" - -abab@^2.0.5, abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.2: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-sequence-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" - integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^29.2.2, babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - 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" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - 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" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - 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" - -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001503: - version "1.0.30001507" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz#fae53f6286e7564783eadea9b447819410a59534" - integrity sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A== - -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^3.5.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -common-tags@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-with-sourcemaps@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^3.0.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== - dependencies: - node-fetch "^2.6.11" - -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-js@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" - integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== - -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssfontparser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" - integrity sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg== - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.1: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -cwd@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" - integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== - dependencies: - find-pkg "^0.1.2" - fs-exists-sync "^0.1.0" - -data-urls@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js@^10.3.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== - dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -electron-to-chromium@^1.4.431: - version "1.4.439" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.439.tgz#d0748e8128c18f92354d3412dfb2104c3fb90e8f" - integrity sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== - dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-jest@^27.1.3: - version "27.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz#be4ded5f91905d9ec89aa8968d39c71f3b072c0c" - integrity sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-playwright@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.3.tgz#9fd8753688351bcaf41797eb6a7df8807fd5eb1b" - integrity sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@^8.22.0: - version "8.43.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" - integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.43.0" - "@humanwhocodes/config-array" "^0.11.10" - "@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.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" - 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" - graphemer "^1.4.0" - 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-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" - -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - 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" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== - dependencies: - os-homedir "^1.0.1" - -expect-playwright@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/expect-playwright/-/expect-playwright-0.8.0.tgz#6d4ebe0bdbdd3c1693d880d97153b96a129ae4e8" - integrity sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg== - -expect@^29.0.0, expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - 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" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - 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" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.2.0, find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-file-up@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" - integrity sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== - dependencies: - fs-exists-sync "^0.1.0" - resolve-dir "^0.1.0" - -find-pkg@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" - integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== - dependencies: - find-file-up "^0.1.2" - -find-process@^1.4.4: - version "1.4.7" - resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121" - integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg== - dependencies: - chalk "^4.0.0" - commander "^5.1.0" - debug "^4.1.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -generic-names@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-4.0.0.tgz#0bd8a2fd23fe8ea16cbd0a279acd69c06933d9a3" - integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== - dependencies: - loader-utils "^3.2.0" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - 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" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - 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" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -homedir-polyfill@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== - -icss-utils@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" - integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== - dependencies: - import-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.1, is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - 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" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-canvas-mock@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.5.1.tgz#81509af658ef485e9a1bf39c64e06761517bdbcb" - integrity sha512-IVnRiz+v4EYn3ydM/pBo8GW/J+nU/Hg5gHBQQOUQhdRyNfvHnabB8ReqARLO0p+kvQghqr4V0tA92CF3JcUSRg== - dependencies: - cssfontparser "^1.2.1" - moo-color "^1.0.2" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - 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" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - 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" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - 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" - -jest-diff@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - 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" - -jest-environment-jsdom@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" - integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/jsdom" "^16.2.4" - "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - jsdom "^19.0.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - 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" - -jest-fetch-mock@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" - integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== - dependencies: - cross-fetch "^3.0.4" - promise-polyfill "^8.1.3" - -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - 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" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - 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" - -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-playwright-preset@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jest-playwright-preset/-/jest-playwright-preset-3.0.1.tgz#91c5c2bf4c87ba879d8d9a7ef914ff4904b05c3d" - integrity sha512-tHqv+JUmheNMZpmH7XyT5CAMHr3ExTUIY9baMPzcJiLYPvCaPTwig9YvuGGnXV2n+Epmch0Ld4429g6py0nq0w== - dependencies: - expect-playwright "^0.8.0" - jest-process-manager "^0.3.1" - nyc "^15.1.0" - playwright-core ">=1.2.0" - rimraf "^3.0.2" - uuid "^8.3.2" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-process-manager@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jest-process-manager/-/jest-process-manager-0.3.1.tgz#e748da83ea66ac5073087feb1150ba1270332b2e" - integrity sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw== - dependencies: - "@types/wait-on" "^5.2.0" - chalk "^4.1.0" - cwd "^0.10.0" - exit "^0.1.2" - find-process "^1.4.4" - prompts "^2.4.1" - signal-exit "^3.0.3" - spawnd "^5.0.0" - tree-kill "^1.2.2" - wait-on "^5.3.0" - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - 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" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - 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" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - 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" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - 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" - -jest-transform-css@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jest-transform-css/-/jest-transform-css-6.0.1.tgz#95c579c98945734439c1f243b9843d5f477a9c60" - integrity sha512-i78Pi2MW6vcdsUFSRx1kPbjbEIO0pBWwh1Y+PcDrLwTv/6e5p7fzsV/gxFW/SYMHS8DUvMdRVTwVCkA/y+t0iQ== - dependencies: - common-tags "1.8.2" - cross-spawn "7.0.3" - postcss-load-config "4.0.1" - postcss-modules "4.3.1" - style-inject "0.3.0" - -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.0.0, jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - 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" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - 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" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - 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" - -jest-websocket-mock@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz#95ab1f89f809e57d2714427736ab7b1094fb1c3c" - integrity sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA== - dependencies: - jest-diff "^28.0.2" - mock-socket "^9.1.0" - -jest-worker@^26.2.1: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -joi@^17.3.0: - version "17.9.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== - dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-css@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/json-css/-/json-css-1.5.6.tgz#eb964f834a2e4eaa1bc2f698ff5db007a26c7c00" - integrity sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@2.2.2, json5@^2.2.2, json5@^2.2.3: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== - -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@^2.0.3, lilconfig@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -livereload-js@^3.3.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.4.1.tgz#ba90fbc708ed1b9a024bb89c4ee12c96ea03d66f" - integrity sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g== - -livereload@^0.9.1: - version "0.9.3" - resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" - integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== - dependencies: - chokidar "^3.5.0" - livereload-js "^3.3.1" - opts ">= 1.2.0" - ws "^7.4.3" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-utils@3.2.1, loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - -lodash.memoize@4.x, lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -magic-string@^0.25.2: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -magic-string@^0.26.6: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -marked@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@>=2.4.6: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mock-socket@^9.1.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.2.1.tgz#cc9c0810aa4d0afe02d721dcb2b7e657c00e2282" - integrity sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag== - -moo-color@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/moo-color/-/moo-color-1.0.3.tgz#d56435f8359c8284d83ac58016df7427febece74" - integrity sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ== - dependencies: - color-name "^1.1.4" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== - -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -opener@1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - 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" - -"opts@>= 1.2.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" - integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== - -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - 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" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -playwright-core@1.36.1: - version "1.36.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.36.1.tgz#f5f275d70548768ca892583519c89b237a381c77" - integrity sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg== - -playwright-core@>=1.2.0: - version "1.35.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" - integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== - -playwright@^1.36.1: - version "1.36.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.36.1.tgz#bd01541048b4ea54bcf1989e61e0129f34d2df71" - integrity sha512-2ZqHpD0U0COKR8bqR3W5IkyIAAM0mT9FgGJB9xWCI1qAUkqLxJskA1ueeQOTH2Qfz3+oxdwwf2EzdOX+RkZmmQ== - dependencies: - playwright-core "1.36.1" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-load-config@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-load-config@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-modules@4.3.1, postcss-modules@^4.0.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.3.1.tgz#517c06c09eab07d133ae0effca2c510abba18048" - integrity sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q== - dependencies: - generic-names "^4.0.0" - icss-replace-symbols "^1.1.0" - lodash.camelcase "^4.3.0" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - string-hash "^1.1.1" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.16: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -promise-polyfill@^8.1.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" - integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== - -promise.series@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" - integrity sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ== - -prompts@^2.0.1, prompts@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp.prototype.flags@^1.4.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.19.0, resolve@^1.20.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-commonjs@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" - integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== - dependencies: - estree-walker "^0.6.1" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-delete@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz#262acf80660d48c3b167fb0baabd0c3ab985c153" - integrity sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA== - dependencies: - del "^5.1.0" - -rollup-plugin-dts@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-4.2.3.tgz#04c3615df1ffab4228aa9d540697eaca61e01f47" - integrity sha512-jlcpItqM2efqfIiKzDB/IKOS9E9fDvbkJSGw5GtK/PqPGS9eC3R3JKyw2VvpTktZA+TNgJRMu1NTv244aTUzzQ== - dependencies: - magic-string "^0.26.6" - optionalDependencies: - "@babel/code-frame" "^7.18.6" - -rollup-plugin-livereload@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz#4747fa292a2cceb0c972c573d71b3d66b4252b37" - integrity sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA== - dependencies: - livereload "^0.9.1" - -rollup-plugin-postcss@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz#15e9462f39475059b368ce0e49c800fa4b1f7050" - integrity sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w== - dependencies: - chalk "^4.1.0" - concat-with-sourcemaps "^1.1.0" - cssnano "^5.0.1" - import-cwd "^3.0.0" - p-queue "^6.6.2" - pify "^5.0.0" - postcss-load-config "^3.0.0" - postcss-modules "^4.0.0" - promise.series "^0.2.0" - resolve "^1.19.0" - rollup-pluginutils "^2.8.2" - safe-identifier "^0.4.2" - style-inject "^0.3.0" - -rollup-plugin-serve@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-serve/-/rollup-plugin-serve-2.0.2.tgz#f49958b0725c9bd2fef976d23025a361e20bdee2" - integrity sha512-ALqyTbPhlf7FZ5RzlbDvMYvbKuCHWginJkTo6dMsbgji/a78IbsXox+pC83HENdkTRz8OXrTj+aShp3+3ratpg== - dependencies: - mime ">=2.4.6" - opener "1" - -rollup-plugin-terser@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - -rollup-plugin-typescript2@^0.32.1: - version "0.32.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz#470ded8e1965efac02043cc0ef4a7fa36bed83b9" - integrity sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw== - dependencies: - "@rollup/pluginutils" "^4.1.2" - find-cache-dir "^3.3.2" - fs-extra "^10.0.0" - resolve "^1.20.0" - tslib "^2.4.0" - -rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - -rollup@^2.76.0: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-identifier@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" - integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shiki@^0.14.1: - version "0.14.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.2.tgz#d51440800b701392b31ce2336036058e338247a1" - integrity sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A== - dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spawnd@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-5.0.0.tgz#ea72200bdc468998e84e1c3e7b914ce85fc1c32c" - integrity sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA== - dependencies: - exit "^0.1.2" - signal-exit "^3.0.3" - tree-kill "^1.2.2" - wait-port "^0.2.9" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-hash@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.padend@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" - integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-inject@0.3.0, style-inject@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" - integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terser@^5.0.0: - version "5.18.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" - integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-jest@^29.0.3: - version "29.1.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" - integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.4.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedoc-plugin-missing-exports@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-2.1.0.tgz#f283a407eb7b3a43dafc598f44bbfc2d36dc1704" - integrity sha512-+1DhqZCEu7Vu5APnrqpPwl31D+hXpt1fV0Le9ycCRL1eLVdatdl6KVt4SEVwPxnEpKwgOn2dNX6I9+0F1aO2aA== - -typedoc@^0.25.2: - version "0.25.2" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.2.tgz#39f525c28b6eb61da54dda4ec6b1500df620bed8" - integrity sha512-286F7BeATBiWe/qC4PCOCKlSTwfnsLbC/4cZ68oGBbvAqb9vV33quEOXx7q176OXotD+JdEerdQ1OZGJ818lnA== - dependencies: - lunr "^2.3.9" - marked "^4.3.0" - minimatch "^9.0.3" - shiki "^0.14.1" - -typescript@^4.7.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== - dependencies: - xml-name-validator "^4.0.0" - -wait-on@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.3.0.tgz#584e17d4b3fe7b46ac2b9f8e5e102c005c2776c7" - integrity sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg== - dependencies: - axios "^0.21.1" - joi "^17.3.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^6.6.3" - -wait-port@^0.2.9: - version "0.2.14" - resolved "https://registry.yarnpkg.com/wait-port/-/wait-port-0.2.14.tgz#6df40629be2c95aa4073ceb895abef7d872b28c6" - integrity sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ== - dependencies: - chalk "^2.4.2" - commander "^3.0.2" - debug "^4.1.1" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@^1.2.12, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^7.4.3: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.2.3: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - 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" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==