{"version":3,"sources":["../../src/wampy.ts","../../src/constants.ts","../../src/errors.ts","../../src/utils.ts","../../src/serializers/json-serializer.ts"],"sourcesContent":["/**\n * Project: wampy.js\n *\n * https://github.com/KSDaemon/wampy.js\n *\n * A lightweight client-side implementation of\n * WAMP (The WebSocket Application Messaging Protocol v2)\n * https://wamp-proto.org\n *\n * Provides asynchronous RPC/PubSub over WebSocket.\n *\n * Copyright 2014 KSDaemon. Licensed under the MIT License.\n * See @license text at http://www.opensource.org/licenses/mit-license.php\n *\n */\n\nimport { E2EE_SERIALIZERS, SUCCESS, WAMP_ERROR_MSG, WAMP_MSG_SPEC, WAMP_CUSTOM_ATTR_REGEX } from './constants.js';\nimport * as Errors from './errors.js';\nimport { WebsocketError } from './errors.js';\nimport { getNewPromise, getWebSocket } from './utils.js';\nimport { JsonSerializer } from './serializers/json-serializer.js';\nimport type { Serializer } from './serializers/serializer.js';\nimport type {\n    WampyOptions,\n    WampyCache,\n    WampyOpStatus,\n    WampFeatures,\n    SubscriptionCallbacksHash,\n    RegistrationCallbacksHash,\n    WampRequest,\n    WampCall,\n    TopicType,\n    WampRole,\n    Payload,\n    PayloadWithArgsKwargs,\n    PackPPTPayloadResult,\n    UnpackPPTPayloadResult,\n    EventCallback,\n    RPCCallback,\n    CallResult,\n    InvocationResult,\n    InvocationErrorData,\n    SubscribeAdvancedOptions,\n    PublishAdvancedOptions,\n    CallAdvancedOptions,\n    CancelAdvancedOptions,\n    RegisterAdvancedOptions,\n    ProgressiveCallSendDataOptions,\n    ProgressiveCallReturn,\n    SubscribeSuccessResult,\n    UnsubscribeSuccessResult,\n    PublishSuccessResult,\n    RegisterSuccessResult,\n    UnregisterSuccessResult,\n    SubscribeRequestCallbacks,\n    RegisterRequestCallbacks,\n    SubscribeRequest,\n    UnsubscribeRequest,\n    PublishRequest,\n    RegisterRequest,\n    UnregisterRequest,\n    ServerWampFeatures,\n} from './types.js';\n\nconst jsonSerializer: Serializer = new JsonSerializer();\n\n/**\n * WAMP Client Class\n */\nclass Wampy {\n\n    /** Wampy version */\n    version: string = 'v8.0.0';\n\n    /** WS Url */\n    private _url: string | null;\n\n    /** WS protocols */\n    private _protocols: string[];\n\n    /** WAMP features, supported by Wampy */\n    private readonly _wamp_features: WampFeatures;\n\n    /** Internal cache for object lifetime */\n    private _cache: WampyCache;\n\n    /** WebSocket object */\n    private _ws: WebSocket | null;\n\n    /** Internal queue for websocket requests, for case of disconnect */\n    private _wsQueue: (string | ArrayBuffer | Uint8Array | undefined)[];\n\n    /** Internal queue for wamp requests */\n    private _requests: Record<number, WampRequest>;\n\n    /** Stored RPC */\n    private _calls: Record<number, WampCall>;\n\n    /** Stored Pub/Subs to access by ID */\n    private readonly _subscriptionsById: Map<number, SubscriptionCallbacksHash>;\n\n    /** Stored Pub/Subs to access by Key */\n    private _subscriptionsByKey: Map<string, SubscriptionCallbacksHash>;\n\n    /** Stored RPC Registrations */\n    private _rpcRegs: Record<string | number, RegistrationCallbacksHash>;\n\n    /** Stored RPC names */\n    private _rpcNames: Set<string>;\n\n    /** Options hash-table */\n    private _options: Required<WampyOptions>;\n\n    constructor ();\n    constructor (url: string);\n    constructor (options: WampyOptions);\n    constructor (url: string, options: WampyOptions);\n    constructor (url?: string | WampyOptions, options?: WampyOptions) {\n\n        this._url = (typeof url === 'string') ? url : null;\n\n        this._protocols = ['wamp.2.json'];\n\n        this._wamp_features = {\n            agent: 'Wampy.js ' + this.version,\n            roles: {\n                publisher : {\n                    features: {\n                        subscriber_blackwhite_listing: true,\n                        publisher_exclusion          : true,\n                        publisher_identification     : true,\n                        payload_passthru_mode        : true\n                    }\n                },\n                subscriber: {\n                    features: {\n                        pattern_based_subscription: true,\n                        publication_trustlevels   : true,\n                        publisher_identification  : true,\n                        payload_passthru_mode     : true\n                    }\n                },\n                caller    : {\n                    features: {\n                        caller_identification   : true,\n                        progressive_call_results: true,\n                        call_canceling          : true,\n                        call_timeout            : true,\n                        payload_passthru_mode   : true\n                    }\n                },\n                callee    : {\n                    features: {\n                        caller_identification     : true,\n                        call_trustlevels          : true,\n                        pattern_based_registration: true,\n                        shared_registration       : true,\n                        payload_passthru_mode     : true\n\n                    }\n                }\n            }\n        };\n\n        this._cache = {\n            sessionId: null,\n            reqId: 0,\n            server_wamp_features: { roles: {} },\n            isSayingGoodbye: false,\n            opStatus: {\n                code: 0,\n                error: null,\n                reqId: 0\n            },\n            timer: null,\n            reconnectingAttempts: 0,\n            connectPromise: null,\n            closePromise: null\n        };\n\n        this._ws = null;\n        this._wsQueue = [];\n        this._requests = {};\n        this._calls = {};\n        this._subscriptionsById = new Map();\n        this._subscriptionsByKey = new Map();\n        this._rpcRegs = {};\n        this._rpcNames = new Set();\n\n        this._options = {\n            debug: false,\n            logger: null,\n            autoReconnect: true,\n            reconnectInterval: 2 * 1000,\n            maxRetries: 25,\n            realm: null,\n            helloCustomDetails: null,\n            uriValidation: 'strict',\n            authid: null,\n            authmethods: [],\n            authextra: {},\n            authPlugins: {},\n            authMode: 'manual',\n            onChallenge: null,\n            onClose: null,\n            onError: null,\n            onReconnect: null,\n            onReconnectSuccess: null,\n            ws: null,\n            additionalHeaders: null,\n            wsRequestOptions: null,\n            serializer: jsonSerializer,\n            payloadSerializers: {\n                json: jsonSerializer\n            }\n        };\n\n        if (this._isPlainObject(options)) {\n            this._options = { ...this._options, ...options as WampyOptions };\n        } else if (this._isPlainObject(url)) {\n            this._options = { ...this._options, ...url as WampyOptions };\n        }\n    }\n\n    /* Internal utils methods */\n\n    /** Internal logger */\n    private _log (...args: unknown[]): void {\n        if (!this._options.debug) { return; }\n\n        if (this._options.logger) {\n            return this._options.logger(args);\n        }\n\n        return console.log('[wampy]', args);\n    }\n\n    /** Get the new unique request id */\n    private _getReqId (): number {\n        return ++this._cache.reqId;\n    }\n\n    /** Check if input is an object literal */\n    private _isPlainObject (input: unknown): input is Record<string, unknown> {\n        const constructor = (input as Record<string, unknown>)?.constructor;\n        const prototype = (constructor as { prototype?: unknown })?.prototype;\n\n        return Object.prototype.toString.call(input) === '[object Object]'     // checks for primitives, null, Arrays, DOM, etc.\n            && typeof constructor === 'function'                               // checks for modified constructors\n            && Object.prototype.toString.call(prototype) === '[object Object]' // checks for modified prototypes\n            && Object.hasOwnProperty.call(prototype, 'isPrototypeOf');         // checks for missing object-specific property\n    }\n\n    /** Set websocket protocol based on options */\n    private _setWsProtocols (): void {\n        this._protocols = ['wamp.2.' + this._options.serializer.protocol];\n        // FIXME: Temporary commented out due to bug in Nexus\n        // if (!(this._options.serializer instanceof JsonSerializer)) {\n        //     this._protocols.unshift('wamp.2.' + this._options.serializer.protocol);\n        // }\n    }\n\n    /** Fill instance operation status */\n    private _fillOpStatusByError (err: Error & { code: number }): void {\n        this._cache.opStatus = {\n            code: err.code,\n            error: err,\n            reqId: 0\n        };\n    }\n\n    /** Prerequisite checks for any wampy api call */\n    private _preReqChecks (topicType: TopicType | null, role: WampRole): boolean {\n        if (this._cache.sessionId && !this._cache.server_wamp_features.roles[role]) {\n            const errorsByRole: Record<WampRole, Error & { code: number }> = {\n                dealer: new Errors.NoDealerError(),\n                broker: new Errors.NoBrokerError(),\n            };\n\n            this._fillOpStatusByError(errorsByRole[role]);\n            return false;\n        }\n\n        if (topicType && !this._validateURI(topicType.topic, topicType.patternBased, topicType.allowWAMP)) {\n            this._fillOpStatusByError(new Errors.UriError());\n            return false;\n        }\n\n        return true;\n    }\n\n    /** Check for specified feature in a role of connected WAMP Router */\n    private _checkRouterFeature (role: string, feature: string): boolean {\n        if (!this._cache.server_wamp_features.roles[role].features[feature]) {\n            this._fillOpStatusByError(new Errors.FeatureNotSupportedError(role, feature));\n            return false;\n        }\n\n        return true;\n    }\n\n    /** Check for PPT mode options correctness */\n    private _checkPPTOptions (role: string, options: Record<string, unknown>): boolean {\n        if (!this._checkRouterFeature(role, 'payload_passthru_mode')) {\n            this._fillOpStatusByError(new Errors.PPTNotSupportedError());\n            return false;\n        }\n\n        if ((options.ppt_scheme as string).search(/^(wamp$|mqtt$|x_)/) < 0) {\n            this._fillOpStatusByError(new Errors.PPTInvalidSchemeError());\n            return false;\n        }\n\n        if (options.ppt_scheme === 'wamp' && !E2EE_SERIALIZERS.includes(options.ppt_serializer as string)) {\n            this._fillOpStatusByError(new Errors.PPTSerializerInvalidError());\n            return false;\n        }\n\n        return true;\n    }\n\n    /** Validate uri */\n    private _validateURI (uri: string, isPatternBased: boolean, isWampAllowed: boolean): boolean {\n        const isStrictValidation = this._options.uriValidation === 'strict';\n        const isLooseValidation = this._options.uriValidation === 'loose';\n        const isValidationTypeUnknown = !isStrictValidation && !isLooseValidation;\n\n        if (isValidationTypeUnknown || (uri.startsWith('wamp.') && !isWampAllowed)) {\n            return false;\n        }\n\n        let reBase: RegExp | undefined, rePattern: RegExp | undefined;\n        if (isStrictValidation) {\n            reBase = /^(\\w+\\.)*(\\w+)$/;\n            rePattern = /^(\\w+\\.{1,2})*(\\w+)$/;\n        } else if (isLooseValidation) {\n            reBase = /^([^\\s#.]+\\.)*([^\\s#.]+)$/;\n            rePattern = /^([^\\s#.]+\\.{1,2})*([^\\s#.]+)$/;\n        }\n\n        return (isPatternBased ? rePattern! : reBase!).test(uri);\n    }\n\n    /** Prepares PPT/E2EE payload for adding to WAMP message */\n    private _packPPTPayload (payload: Payload, options: Record<string, unknown>): PackPPTPayloadResult {\n        const payloadObj = payload as PayloadWithArgsKwargs;\n        const isArgsListInvalid = payloadObj?.argsList && !Array.isArray(payloadObj.argsList);\n        const isArgsDictInvalid = payloadObj?.argsDict && !this._isPlainObject(payloadObj.argsDict);\n\n        if (isArgsListInvalid || isArgsDictInvalid) {\n            const invalidParameter = isArgsListInvalid ? payloadObj.argsList : payloadObj.argsDict;\n            this._fillOpStatusByError(new Errors.InvalidParamError(String(invalidParameter)));\n            return { err: true, payloadItems: [] };\n        }\n\n        const isPayloadAnObject = this._isPlainObject(payload);\n        const { argsList, argsDict } = payloadObj ?? {};\n        let args: unknown[] | undefined, kwargs: Record<string, unknown> | undefined;\n\n        if (isPayloadAnObject && !argsList && !argsDict) {\n            kwargs = payload as Record<string, unknown>;\n        } else if (isPayloadAnObject) {\n            args = argsList;\n            kwargs = argsDict;\n        } else if (Array.isArray(payload)) {\n            args = payload;\n        } else {  // assume it's a single value\n            args = [payload];\n        }\n\n        const payloadItems: unknown[] = [];\n\n        if (!options.ppt_scheme) {\n            if (args) {\n                payloadItems.push(args);\n            }\n            if (kwargs) {\n                if (!args) {\n                    payloadItems.push([]);\n                }\n                payloadItems.push(kwargs);\n            }\n            return { err: false, payloadItems };\n        }\n\n        const pptPayload = { args, kwargs };\n        let binPayload: unknown = pptPayload;\n\n        // Check and handle Payload PassThru Mode\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n        if (options.ppt_serializer && options.ppt_serializer !== 'native') {\n            const pptSerializer = this._options.payloadSerializers[options.ppt_serializer as string];\n\n            if (!pptSerializer) {\n                this._fillOpStatusByError(new Errors.PPTSerializerInvalidError());\n                return { err: true, payloadItems };\n            }\n\n            try {\n                binPayload = pptSerializer.encode(pptPayload);\n            } catch {\n                this._fillOpStatusByError(new Errors.PPTSerializationError());\n                return { err: true, payloadItems };\n            }\n        }\n\n        // TODO: implement End-to-End Encryption\n        // wamp scheme means Payload End-to-End Encryption\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-end-to-end-encrypti\n        // if (options.ppt_scheme === 'wamp') {\n        //\n        // }\n\n        payloadItems.push([binPayload]);\n\n        return { err: false, payloadItems };\n    }\n\n    /** Unpack PPT/E2EE payload to common */\n    private _unpackPPTPayload (role: string, pptPayload: unknown, options: Record<string, unknown>): UnpackPPTPayloadResult {\n        let decodedPayload: { args?: unknown[]; kwargs?: Record<string, unknown> };\n\n        if (!this._checkPPTOptions(role, options)) {\n            return { err: this._cache.opStatus.error || false };\n        }\n\n        // TODO: implement End-to-End Encryption\n        // wamp scheme means Payload End-to-End Encryption\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-end-to-end-encrypti\n        // if (options.ppt_scheme === 'wamp') {\n        //\n        // }\n\n        if (options.ppt_serializer && options.ppt_serializer !== 'native') {\n            const pptSerializer = this._options.payloadSerializers[options.ppt_serializer as string];\n\n            if (!pptSerializer) {\n                return { err: new Errors.PPTSerializerInvalidError() };\n            }\n\n            try {\n                decodedPayload = pptSerializer.decode(pptPayload as string | ArrayBuffer | Uint8Array) as { args?: unknown[]; kwargs?: Record<string, unknown> };\n            } catch {\n                return { err: new Errors.PPTSerializationError() };\n            }\n        } else {\n            decodedPayload = pptPayload as { args?: unknown[]; kwargs?: Record<string, unknown> };\n        }\n        return { err: false, args: decodedPayload.args, kwargs: decodedPayload.kwargs };\n    }\n\n    /** Encode WAMP message */\n    private _encode (msg: unknown[]): string | ArrayBuffer | Uint8Array | undefined {\n        try {\n            return this._options.serializer.encode(msg);\n        } catch {\n            this._hardClose('wamp.error.protocol_violation', 'Can not encode message', true);\n        }\n    }\n\n    /** Decode WAMP message */\n    private _decode (msg: unknown): unknown[] {\n        try {\n            return this._options.serializer.decode(msg as string | ArrayBuffer | Uint8Array) as unknown[];\n        } catch {\n            this._hardClose('wamp.error.protocol_violation', 'Can not decode received message');\n            return [];\n        }\n    }\n\n    /** Hard close of connection due to protocol violations */\n    private _hardClose (errorUri: string, details: string, noSend: boolean = false): void {\n        this._log(details);\n        // Cleanup outgoing message queue\n        this._wsQueue = [];\n\n        if (!noSend) {\n            this._send([WAMP_MSG_SPEC.ABORT, { message: details }, errorUri]);\n        }\n\n        const protocolViolationError = new Errors.ProtocolViolationError(errorUri, details);\n\n        // In case we were just making first connection\n        if (this._cache.connectPromise) {\n            this._cache.connectPromise.onError(protocolViolationError);\n            this._cache.connectPromise = null;\n        }\n\n        if (this._options.onError) {\n            this._options.onError(protocolViolationError);\n        }\n\n        this._ws!.close();\n    }\n\n    /** Send encoded message to server */\n    private _send (msg?: unknown[]): void {\n        if (msg) {\n            this._wsQueue.push(this._encode(msg));\n        }\n\n        if (this._ws && this._ws.readyState === 1 && this._cache.sessionId) {\n            while (this._wsQueue.length > 0) {\n                this._ws.send(this._wsQueue.shift() as string | ArrayBuffer);\n            }\n        }\n    }\n\n    /** Reject (fail) all ongoing promises on connection closing */\n    private async _reject_ongoing_promises (error: Error): Promise<void> {\n        const promises: (void | Promise<void>)[] = [];\n\n        for (const call of Object.values(this._calls)) {\n            if (call.onError) {\n                promises.push(call.onError(error));\n            }\n        }\n        for (const req of Object.values(this._requests)) {\n            if (req.callbacks?.onError) {\n                promises.push(req.callbacks.onError(error));\n            }\n        }\n\n        await Promise.allSettled(promises);\n        this._requests = {};\n        this._calls = {};\n    }\n\n    /** Reset internal state and cache */\n    private _resetState (): void {\n        this._wsQueue = [];\n        this._subscriptionsById.clear();\n        this._subscriptionsByKey.clear();\n        this._requests = {};\n        this._calls = {};\n        this._rpcRegs = {};\n        this._rpcNames = new Set();\n\n        // Just keep attrs that are have to be present\n        this._cache = {\n            reqId               : 0,\n            reconnectingAttempts: 0,\n            opStatus            : SUCCESS,\n            closePromise        : null,\n            connectPromise      : null,\n        } as WampyCache;\n    }\n\n    /** Initialize internal websocket callbacks */\n    private _initWsCallbacks (): void {\n        this._ws!.onopen = () => this._wsOnOpen();\n        this._ws!.onclose = async (event: CloseEvent) => this._wsOnClose(event);\n        this._ws!.onmessage = (event: MessageEvent) => this._wsOnMessage(event);\n        this._ws!.onerror = async (error: Event) => this._wsOnError(error);\n    }\n\n    /** Internal websocket on open callback */\n    private _wsOnOpen (): void {\n        const { helloCustomDetails, authmethods, authid, authextra, serializer, onError, realm } = this._options;\n        const serverProtocol = this._ws!.protocol?.split('.')?.[2];\n        const hasServerChosenOurPreferredProtocol = serverProtocol === serializer.protocol;\n\n        this._log(`Websocket connected. Server has chosen protocol: \"${serverProtocol}\"`);\n\n        if (!hasServerChosenOurPreferredProtocol) {\n            if (serverProtocol === 'json') {\n                this._options.serializer = new JsonSerializer();\n            } else {\n                const noSerializerAvailableError = new Errors.NoSerializerAvailableError();\n                this._fillOpStatusByError(noSerializerAvailableError);\n\n                if (this._cache.connectPromise) {\n                    this._cache.connectPromise.onError(noSerializerAvailableError);\n                    this._cache.connectPromise = null;\n                }\n\n                if (onError) {\n                    onError(noSerializerAvailableError);\n                }\n            }\n        }\n\n        if (serializer.isBinary) {\n            this._ws!.binaryType = 'arraybuffer';\n        }\n\n        const messageOptions = {\n            ...helloCustomDetails,\n            ...this._wamp_features,\n            ...(authid ? { authid, authmethods, authextra } : {}),\n        };\n        const encodedMessage = this._encode([WAMP_MSG_SPEC.HELLO, realm, messageOptions]);\n\n        if (encodedMessage) {\n            // Sending directly 'cause it's a hello message and no sessionId check is needed\n            this._ws!.send(encodedMessage as string | ArrayBuffer);\n        }\n    }\n\n    /** Internal websocket on close callback */\n    async _wsOnClose (event: CloseEvent): Promise<void> {\n        this._log('websocket disconnected. Info: ', event);\n\n        await this._reject_ongoing_promises(new WebsocketError('Connection closed'));\n\n        // Automatic reconnection\n        if ((this._cache.sessionId || this._cache.reconnectingAttempts) &&\n            this._options.autoReconnect &&\n            (this._options.maxRetries === 0 ||\n             this._cache.reconnectingAttempts < this._options.maxRetries) &&\n            !this._cache.isSayingGoodbye) {\n            this._cache.sessionId = null;\n            this._cache.timer = setTimeout(() => {\n                this._wsReconnect();\n            }, this._options.reconnectInterval);\n        } else {\n            // No reconnection needed or reached max retries count\n            if (this._options.onClose) {\n                this._options.onClose();\n            }\n            if (this._cache.closePromise) {\n                this._cache.closePromise.onSuccess(undefined as never);\n                this._cache.closePromise = null;\n            }\n            this._resetState();\n            this._ws = null;\n        }\n    }\n\n    /** Internal websocket on event callback */\n    async _wsOnMessage (event: MessageEvent): Promise<void> {\n        const data = this._decode(event.data);\n\n        this._log('websocket message received: ', data);\n\n        const messageType = data[0] as number;\n        const messageHandlers: Record<number, () => void | Promise<void>> = {\n            [WAMP_MSG_SPEC.WELCOME]:      () => this._onWelcomeMessage(data as [unknown, number, ServerWampFeatures]),\n            [WAMP_MSG_SPEC.ABORT]:        () => this._onAbortMessage(data as [unknown, Record<string, unknown>, string]),\n            [WAMP_MSG_SPEC.CHALLENGE]:    () => this._onChallengeMessage(data as [unknown, string, Record<string, unknown>]),\n            [WAMP_MSG_SPEC.GOODBYE]:      () => this._onGoodbyeMessage(),\n            [WAMP_MSG_SPEC.ERROR]:        () => this._onErrorMessage(data as [unknown, number, number, Record<string, unknown>, string, unknown[]?, Record<string, unknown>?]),\n            [WAMP_MSG_SPEC.SUBSCRIBED]:   () => this._onSubscribedMessage(data as [unknown, number, number]),\n            [WAMP_MSG_SPEC.UNSUBSCRIBED]: () => this._onUnsubscribedMessage(data as [unknown, number]),\n            [WAMP_MSG_SPEC.PUBLISHED]:    () => this._onPublishedMessage(data as [unknown, number, number]),\n            [WAMP_MSG_SPEC.EVENT]:        () => this._onEventMessage(data as [unknown, number, number, Record<string, unknown>, unknown[]?, Record<string, unknown>?]),\n            [WAMP_MSG_SPEC.RESULT]:       () => this._onResultMessage(data as [unknown, number, Record<string, unknown>, unknown[]?, Record<string, unknown>?]),\n            // [WAMP_MSG_SPEC.REGISTER]:     () => {},\n            [WAMP_MSG_SPEC.REGISTERED]:   () => this._onRegisteredMessage(data as [unknown, number, number]),\n            // [WAMP_MSG_SPEC.UNREGISTER]:  () => {},\n            [WAMP_MSG_SPEC.UNREGISTERED]: () => this._onUnregisteredMessage(data as [unknown, number]),\n            [WAMP_MSG_SPEC.INVOCATION]:   () => this._onInvocationMessage(data as [unknown, number, number, Record<string, unknown>, unknown[]?, Record<string, unknown>?]),\n            // [WAMP_MSG_SPEC.INTERRUPT]:    () => {},\n            // [WAMP_MSG_SPEC.YIELD]:        () => {},\n        };\n        const handler = messageHandlers[messageType];\n        const errorURI = 'wamp.error.protocol_violation';\n\n        if (!handler) {\n            return this._hardClose(errorURI, `Received non-compliant WAMP message: \"${messageType}\"`);\n        }\n\n        const needNoSession = ([WAMP_MSG_SPEC.WELCOME, WAMP_MSG_SPEC.CHALLENGE] as number[]).includes(messageType);\n        const needValidSession = !needNoSession && messageType !== WAMP_MSG_SPEC.ABORT;\n\n        if (needNoSession && this._cache.sessionId) {\n            return this._hardClose(errorURI, `Received message \"${messageType}\" after session was established`);\n        }\n\n        if (needValidSession && !this._cache.sessionId) {\n            return this._hardClose(errorURI, `Received message \"${messageType}\" before session was established`);\n        }\n\n        if (this._isRequestIdValid(data)) {\n            await handler();\n        }\n    }\n\n    /** Validates the requestId for message types that need this kind of validation */\n    _isRequestIdValid ([messageType, requestId]: unknown[]): boolean {\n        const isRequestIdValidationNeeded = ([\n            WAMP_MSG_SPEC.SUBSCRIBED,\n            WAMP_MSG_SPEC.UNSUBSCRIBED,\n            WAMP_MSG_SPEC.PUBLISHED,\n            WAMP_MSG_SPEC.RESULT,\n            WAMP_MSG_SPEC.REGISTERED,\n            WAMP_MSG_SPEC.UNREGISTERED\n        ] as number[]).includes(messageType as number);\n\n        if (!isRequestIdValidationNeeded) {\n            return true;\n        }\n\n        if (messageType === WAMP_MSG_SPEC.RESULT && this._calls[requestId as number]) {\n            return true;\n        }\n\n        if (this._requests[requestId as number]) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Handles websocket welcome message event\n     * WAMP SPEC: [WELCOME, Session|id, Details|dict]\n     */\n    async _onWelcomeMessage ([, sessionId, details]: [unknown, number, ServerWampFeatures]): Promise<void> {\n        this._cache.sessionId = sessionId;\n        this._cache.server_wamp_features = details;\n\n        if (this._cache.reconnectingAttempts) {\n            this._cache.reconnectingAttempts = 0;\n\n            if (this._options.onReconnectSuccess) {\n                await this._options.onReconnectSuccess(details as unknown as Record<string, unknown>);\n            }\n\n            // Renew all previous state\n            await Promise.allSettled([this._renewSubscriptions(), this._renewRegistrations()]);\n        } else {\n            // Fire onConnect event on real connection to WAMP server\n            this._cache.connectPromise!.onSuccess(details as unknown as Record<string, unknown>);\n            this._cache.connectPromise = null;\n        }\n\n        // Send local queue if there is something out there\n        this._send();\n    }\n\n    /**\n     * Handles websocket abort message event\n     * WAMP SPEC: [ABORT, Details|dict, Error|uri]\n     */\n    async _onAbortMessage ([, details, error]: [unknown, Record<string, unknown>, string]): Promise<void> {\n        const err = new Errors.AbortError({ error, details });\n        if (this._cache.connectPromise) {\n            this._cache.connectPromise.onError(err);\n            this._cache.connectPromise = null;\n        }\n        if (this._options.onError) {\n            await this._options.onError(err);\n        }\n        this._ws!.close();\n    }\n\n    /**\n     * Handles websocket challenge message event\n     * WAMP SPEC: [CHALLENGE, AuthMethod|string, Extra|dict]\n     */\n    async _onChallengeMessage ([, authMethod, extra]: [unknown, string, Record<string, unknown>]): Promise<void> {\n        let promise: Promise<string>;\n\n        const { authid, authMode, onChallenge, onError, authPlugins } = this._options;\n\n        if (authid && authMode === 'manual' && typeof onChallenge === 'function') {\n            promise = new Promise((resolve) => {\n                resolve(onChallenge(authMethod, extra));\n            });\n        } else if (authid && authMode === 'auto' && typeof authPlugins[authMethod] === 'function') {\n            promise = new Promise((resolve) => {\n                resolve(authPlugins[authMethod](authMethod, extra));\n            });\n        } else {\n            const noCRACallbackOrIdError = new Errors.NoCRACallbackOrIdError();\n\n            this._fillOpStatusByError(noCRACallbackOrIdError);\n            this._ws!.send(this._encode([\n                WAMP_MSG_SPEC.ABORT,\n                { message: noCRACallbackOrIdError.message },\n                'wamp.error.cannot_authenticate'\n            ]) as string | ArrayBuffer);\n\n            if (onError) {\n                await onError(noCRACallbackOrIdError);\n            }\n\n            return this._ws!.close() as unknown as void;\n        }\n\n        try {\n            const key = await promise;\n\n            // Sending directly 'cause it's a challenge msg and no sessionId check is needed\n            this._ws!.send(this._encode([WAMP_MSG_SPEC.AUTHENTICATE, key, {}]) as string | ArrayBuffer);\n        } catch {\n            const challengeExceptionError = new Errors.ChallengeExceptionError();\n\n            this._fillOpStatusByError(challengeExceptionError);\n            this._ws!.send(this._encode([\n                WAMP_MSG_SPEC.ABORT,\n                { message: challengeExceptionError.message },\n                'wamp.error.cannot_authenticate'\n            ]) as string | ArrayBuffer);\n\n            if (onError) {\n                await onError(challengeExceptionError);\n            }\n\n            this._ws!.close();\n        }\n    }\n\n    /**\n     * Handles websocket goodbye message event\n     * WAMP SPEC: [GOODBYE, Details|dict, Reason|uri]\n     */\n    async _onGoodbyeMessage (): Promise<void> {\n        if (!this._cache.isSayingGoodbye) {    // get goodbye, initiated by server\n            this._cache.isSayingGoodbye = true;\n            this._send([WAMP_MSG_SPEC.GOODBYE, {}, 'wamp.close.goodbye_and_out']);\n        }\n        this._cache.sessionId = null;\n        this._ws!.close();\n    }\n\n    /**\n     * Handles websocket error message event\n     * WAMP SPEC: [ERROR, REQUEST.Type|int, REQUEST.Request|id, Details|dict,\n     *             Error|uri, (Arguments|list, ArgumentsKw|dict)]\n     */\n    async _onErrorMessage ([, requestType, requestId, details, error, argsList, argsDict]: [unknown, number, number, Record<string, unknown>, string, unknown[]?, Record<string, unknown>?]): Promise<void> {\n        const errorOptions = { error, details, argsList, argsDict };\n        const errorsByRequestType: Record<number, Error> = {\n            [WAMP_MSG_SPEC.SUBSCRIBE]: new Errors.SubscribeError(errorOptions),\n            [WAMP_MSG_SPEC.UNSUBSCRIBE]: new Errors.UnsubscribeError(errorOptions),\n            [WAMP_MSG_SPEC.PUBLISH]: new Errors.PublishError(errorOptions),\n            [WAMP_MSG_SPEC.REGISTER]: new Errors.RegisterError(errorOptions),\n            [WAMP_MSG_SPEC.UNREGISTER]: new Errors.UnregisterError(errorOptions),\n            // [WAMP_MSG_SPEC.INVOCATION]:\n            [WAMP_MSG_SPEC.CALL]: new Errors.CallError(errorOptions),\n        };\n        const currentError = errorsByRequestType[requestType];\n\n        if (!currentError) {\n            return this._hardClose('wamp.error.protocol_violation', 'Received invalid ERROR message');\n        }\n\n        if (requestType === WAMP_MSG_SPEC.CALL) {\n            const call = this._calls[requestId];\n            if (call?.onError) {\n                await call.onError(currentError);\n            }\n            delete this._calls[requestId];\n        } else {\n            const req = this._requests[requestId];\n            if (req?.callbacks?.onError) {\n                await req.callbacks.onError(currentError);\n            }\n            delete this._requests[requestId];\n        }\n    }\n\n    /**\n     * Handles websocket subscribed message event\n     * WAMP SPEC: [SUBSCRIBED, SUBSCRIBE.Request|id, Subscription|id]\n     */\n    async _onSubscribedMessage ([, requestId, subscriptionId]: [unknown, number, number]): Promise<void> {\n        const { topic, advancedOptions, callbacks } = this._requests[requestId] as SubscribeRequest;\n        const subscription: SubscriptionCallbacksHash = {\n            id: subscriptionId,\n            topic,\n            advancedOptions,\n            callbacks: [callbacks.onEvent]\n        };\n        const subscriptionKey = this._getSubscriptionKey(topic, advancedOptions);\n\n        this._subscriptionsById.set(subscriptionId, subscription);\n        this._subscriptionsByKey.set(subscriptionKey, subscription);\n\n        if (callbacks.onSuccess) {\n            await callbacks.onSuccess({ topic, requestId, subscriptionId, subscriptionKey });\n        }\n\n        delete this._requests[requestId];\n    }\n\n    /**\n     * Handles websocket unsubscribed message event\n     * WAMP SPEC: [UNSUBSCRIBED, UNSUBSCRIBE.Request|id]\n     */\n    async _onUnsubscribedMessage ([, requestId]: [unknown, number]): Promise<void> {\n        const { topic, advancedOptions, callbacks } = this._requests[requestId] as UnsubscribeRequest;\n        const subscriptionKey = this._getSubscriptionKey(topic, advancedOptions);\n        const subscriptionId = this._subscriptionsByKey.get(subscriptionKey)!.id;\n        this._subscriptionsByKey.delete(subscriptionKey);\n        this._subscriptionsById.delete(subscriptionId);\n\n        if (callbacks.onSuccess) {\n            await callbacks.onSuccess({ topic, requestId });\n        }\n\n        delete this._requests[requestId];\n    }\n\n    /**\n     * Handles websocket published message event\n     * WAMP SPEC: [PUBLISHED, PUBLISH.Request|id, Publication|id]\n     */\n    async _onPublishedMessage ([, requestId, publicationId]: [unknown, number, number]): Promise<void> {\n        const { topic, callbacks } = this._requests[requestId] as PublishRequest;\n\n        if (callbacks?.onSuccess) {\n            await callbacks.onSuccess({ topic, requestId, publicationId });\n        }\n\n        delete this._requests[requestId];\n    }\n\n    /**\n     * Handles websocket event message event\n     * WAMP SPEC: [EVENT, SUBSCRIBED.Subscription|id, PUBLISHED.Publication|id,\n     *            Details|dict, PUBLISH.Arguments|list, PUBLISH.ArgumentKw|dict]\n     */\n    async _onEventMessage ([, subscriptionId, publicationId, details, argsList, argsDict]: [unknown, number, number, Record<string, unknown>, unknown[]?, Record<string, unknown>?]): Promise<void> {\n        const subscription = this._subscriptionsById.get(subscriptionId);\n\n        if (!subscription) {\n            return;\n        }\n\n        let args = argsList;\n        let kwargs = argsDict;\n\n        // Check and handle Payload PassThru Mode\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n        if (details.ppt_scheme) {\n            const pptPayload = argsList![0];\n            const decodedPayload = this._unpackPPTPayload('broker', pptPayload, details as Record<string, unknown>);\n\n            if (decodedPayload.err) {\n                // Since it is async publication, and no link to\n                // original publication - as it was already published\n                // we can not reply with error, only log it.\n                // Although the router should handle it\n                return this._log((decodedPayload.err as Error).message);\n            }\n\n            args = decodedPayload.args;\n            kwargs = decodedPayload.kwargs;\n        }\n\n        const callbackOptions = { details: details as Record<string, unknown>, argsList: args, argsDict: kwargs };\n        const callbackPromises = subscription.callbacks.map((c) => c(callbackOptions));\n\n        await Promise.all(callbackPromises);\n    }\n\n    /**\n     * Handles websocket result message event\n     * WAMP SPEC: [RESULT, CALL.Request|id, Details|dict,\n     *             YIELD.Arguments|list, YIELD.ArgumentsKw|dict]\n     */\n    async _onResultMessage ([, requestId, details, argsList, argsDict]: [unknown, number, Record<string, unknown>, unknown[]?, Record<string, unknown>?]): Promise<void> {\n        let args = argsList;\n        let kwargs = argsDict;\n\n        // Check and handle Payload PassThru Mode\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n        if (details.ppt_scheme) {\n            const pptPayload = argsList![0];\n            const decodedPayload = this._unpackPPTPayload('dealer', pptPayload, details as Record<string, unknown>);\n\n            if (decodedPayload.err) {\n                this._log((decodedPayload.err as Error).message);\n                this._cache.opStatus = decodedPayload.err as unknown as WampyOpStatus;\n                await this._calls[requestId].onError(new Errors.CallError({\n                    details: details as Record<string, unknown>,\n                    error     : 'wamp.error.invocation_exception',\n                    argsList  : [(decodedPayload.err as Error).message],\n                    argsDict  : undefined\n                }));\n                delete this._calls[requestId];\n\n                return;\n            }\n\n            args = decodedPayload.args;\n            kwargs = decodedPayload.kwargs;\n        }\n\n        const callbackOptions: CallResult = { details: details as Record<string, unknown>, argsList: args, argsDict: kwargs };\n\n        if (details.progress) {\n            await this._calls[requestId].onProgress!(callbackOptions);\n        } else {\n            // We received final result (progressive or not)\n            await this._calls[requestId].onSuccess(callbackOptions);\n            delete this._calls[requestId];\n        }\n    }\n\n    /**\n     * Handles websocket registered message event\n     * WAMP SPEC: [REGISTERED, REGISTER.Request|id, Registration|id]\n     */\n    async _onRegisteredMessage ([, requestId, registrationId]: [unknown, number, number]): Promise<void> {\n        const { topic, callbacks, options } = this._requests[requestId] as RegisterRequest;\n\n        this._rpcRegs[registrationId] = { id: registrationId, callbacks: [callbacks.rpc], options };\n        this._rpcRegs[topic] = this._rpcRegs[registrationId];\n        this._rpcNames.add(topic);\n\n        if (callbacks?.onSuccess) {\n            await callbacks.onSuccess({ topic, requestId, registrationId });\n        }\n\n        delete this._requests[requestId];\n    }\n\n    /**\n     * Handles websocket unregistered message event\n     * WAMP SPEC: [UNREGISTERED, UNREGISTER.Request|id]\n     */\n    async _onUnregisteredMessage ([, requestId]: [unknown, number]): Promise<void> {\n        const { topic, callbacks } = this._requests[requestId] as UnregisterRequest;\n\n        delete this._rpcRegs[this._rpcRegs[topic].id];\n        delete this._rpcRegs[topic];\n\n        if (this._rpcNames.has(topic)) {\n            this._rpcNames.delete(topic);\n        }\n\n        if (callbacks?.onSuccess) {\n            await callbacks.onSuccess({ topic, requestId });\n        }\n\n        delete this._requests[requestId];\n    }\n\n    /**\n     * Handles websocket invocation message event\n     * WAMP SPEC: [INVOCATION, Request|id, REGISTERED.Registration|id, Details|dict,\n     *             CALL.Arguments|list, CALL.ArgumentsKw|dict]\n     */\n    async _onInvocationMessage ([, requestId, registrationId, details, argsList, argsDict]: [unknown, number, number, Record<string, unknown>, unknown[]?, Record<string, unknown>?]): Promise<void> {\n        const self = this;\n        const handleInvocationError = ({ error, details, argsList, argsDict }: InvocationErrorData): void => {\n            const message: unknown[] = [\n                WAMP_MSG_SPEC.ERROR,\n                WAMP_MSG_SPEC.INVOCATION,\n                requestId,\n                details || {},\n                error || 'wamp.error.invocation_exception',\n            ];\n\n            if (Array.isArray(argsList)) {\n                message.push(argsList);\n            }\n\n            if (self._isPlainObject(argsDict)) {\n                if (!Array.isArray(argsList)) {\n                    message.push([]);\n                }\n                message.push(argsDict);\n            }\n\n            self._send(message);\n        };\n\n        if (!this._rpcRegs[registrationId]) {\n            this._log(WAMP_ERROR_MSG.NON_EXIST_RPC_INVOCATION);\n            return handleInvocationError({ error: 'wamp.error.no_such_procedure' });\n        }\n\n        let args = argsList;\n        let kwargs = argsDict;\n\n        // Check and handle Payload PassThru Mode\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n        if (details?.ppt_scheme) {\n            const pptPayload = argsList![0];\n            const decodedPayload = this._unpackPPTPayload('dealer', pptPayload, details as Record<string, unknown>);\n\n            // This case should not happen at all, but for safety\n            if (decodedPayload.err) {\n                this._log((decodedPayload.err as Error).message);\n\n                if (decodedPayload.err instanceof Errors.PPTNotSupportedError) {\n                    // This case should not happen at all, but for safety\n                    return this._hardClose('wamp.error.protocol_violation',\n                        'Received INVOCATION in PPT Mode, while Dealer didn\\'t announce it');\n                }\n\n                return handleInvocationError({\n                    details: details as Record<string, unknown>,\n                    error: 'wamp.error.invocation_exception',\n                    argsList: [(decodedPayload.err as Error).message],\n                });\n            }\n\n            args = decodedPayload.args;\n            kwargs = decodedPayload.kwargs;\n        }\n\n        const handleInvocationResult = (result: InvocationResult | null | void): void => {\n            const options = result?.options || {};\n            const { ppt_scheme, ppt_serializer, ppt_cipher, ppt_keyid } = options;\n\n            // Check and handle Payload PassThru Mode\n            // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n            if (ppt_scheme && !this._checkPPTOptions('dealer', options as Record<string, unknown>)) {\n                if (this._cache.opStatus.error instanceof Errors.PPTNotSupportedError) {\n                    // This case should not happen at all, but for safety\n                    return this._hardClose('wamp.error.protocol_violation',\n                        'Trying to send YIELD in PPT Mode, while Dealer didn\\'t announce it');\n                }\n\n                return handleInvocationError({\n                    details : options as Record<string, unknown>,\n                    error   : 'wamp.error.invalid_option',\n                    argsList: [this._cache.opStatus.error!.message],\n                });\n            }\n\n            const { err, payloadItems } = result ? this._packPPTPayload(result as unknown as Payload, options as Record<string, unknown>) : {} as Partial<PackPPTPayloadResult>;\n\n            if (err) {\n                return handleInvocationError({\n                    details : options as Record<string, unknown>,\n                    error   : 'wamp.error.invocation_exception',\n                    argsList: [this._cache.opStatus.error!.message],\n                });\n            }\n\n            const messageOptions: Record<string, unknown> = {\n                ...options,\n                ...(ppt_scheme ? { ppt_scheme } : {}),\n                ...(ppt_serializer ? { ppt_serializer } : {}),\n                ...(ppt_cipher ? { ppt_cipher } : {}),\n                ...(ppt_keyid ? { ppt_keyid } : {}),\n                ...this._extractCustomOptions(options as Record<string, unknown>)\n            };\n\n            // WAMP SPEC: [YIELD, INVOCATION.Request|id, Options|dict, Arguments|list, ArgumentsKw|dict]\n            self._send([WAMP_MSG_SPEC.YIELD, requestId, messageOptions, ...(payloadItems || [])]);\n        };\n\n        try {\n            const result = await this._rpcRegs[registrationId].callbacks[0]({\n                details: details as Record<string, unknown>,\n                argsList      : args,\n                argsDict      : kwargs,\n                result_handler: handleInvocationResult,\n                error_handler : handleInvocationError\n            });\n            handleInvocationResult(result);\n        } catch (e) {\n            handleInvocationError(e as InvocationErrorData);\n        }\n    }\n\n    /** Internal websocket on error callback */\n    async _wsOnError (error: Event): Promise<void> {\n        this._log('websocket error');\n        const websocketError = new Errors.WebsocketError(error);\n\n        await this._reject_ongoing_promises(websocketError);\n\n        if (this._cache.connectPromise) {\n            this._cache.connectPromise.onError(websocketError);\n            this._cache.connectPromise = null;\n        }\n\n        if (this._options.onError) {\n            this._options.onError(websocketError);\n        }\n    }\n\n    /** Reconnect to server in case of websocket error */\n    _wsReconnect (): void {\n        this._log('websocket reconnecting...');\n\n        if (this._options.onReconnect) {\n            this._options.onReconnect();\n        }\n\n        this._cache.reconnectingAttempts++;\n        this._ws = getWebSocket({\n            url: this._url!,\n            protocols: this._protocols,\n            options: this._options as Record<string, unknown>\n        });\n        this._initWsCallbacks();\n    }\n\n    /** Resubscribe to topics in case of communication error */\n    async _renewSubscriptions (): Promise<void> {\n        let i: number;\n        const subs = new Map(this._subscriptionsById);\n\n        this._subscriptionsById.clear();\n        this._subscriptionsByKey.clear();\n\n        for (const sub of subs.values()) {\n            i = sub.callbacks.length;\n            while (i--) {\n                try {\n                    await this.subscribe(sub.topic, sub.callbacks[i], sub.advancedOptions);\n                } catch (err) {\n                    this._log(`cannot resubscribe to topic: ${sub.topic}`, err);\n\n                    if (this._options.onError) {\n                        this._options.onError(err as Error);\n                    }\n                }\n            }\n        }\n    }\n\n    /** ReRegister RPCs in case of communication error */\n    async _renewRegistrations (): Promise<void> {\n        const rpcs = this._rpcRegs,\n            rn = this._rpcNames;\n\n        this._rpcRegs = {};\n        this._rpcNames = new Set();\n\n        for (const rpcName of rn) {\n            try {\n                await this.register(rpcName, rpcs[rpcName].callbacks[0], rpcs[rpcName].options);\n            } catch (err) {\n                this._log(`cannot renew registration of rpc: ${rpcName}`, err);\n\n                if (this._options.onError) {\n                    this._options.onError(err as Error);\n                }\n            }\n        }\n    }\n\n    /**\n     * Generate a unique key for combination of topic and options\n     *\n     * This is needed to allow subscriptions to the same topic URI but with different options\n     */\n    _getSubscriptionKey (topic: string, options?: SubscribeAdvancedOptions): string {\n        return `${topic}${options ? `-${JSON.stringify(options)}` : ''}`;\n    }\n\n    /*************************************************************************\n     * Wampy public API\n     *************************************************************************/\n\n    /** Wampy options getter */\n    getOptions (): Required<WampyOptions> {\n        return this._options;\n    }\n\n    /** Wampy options setter */\n    setOptions (newOptions: WampyOptions): Wampy | undefined {\n        if (this._isPlainObject(newOptions)) {\n            this._options = { ...this._options, ...newOptions as WampyOptions };\n            return this;\n        }\n    }\n\n    /**\n     * Get the status of last operation\n     *\n     * Returns an object with 3 fields: code, error, reqId\n     *      code: 0 - if operation was successful\n     *      code > 0 - if error occurred\n     *      error: error instance containing details\n     *      reqId: last successfully sent request ID\n     */\n    getOpStatus (): WampyOpStatus {\n        return this._cache.opStatus;\n    }\n\n    /** Get the WAMP Session ID */\n    getSessionId (): number | null {\n        return this._cache.sessionId;\n    }\n\n    /** Connect to server */\n    async connect (url?: string): Promise<Record<string, unknown>> {\n        if (url) {\n            this._url = url;\n        }\n\n        if (!this._options.realm) {\n            const noRealmError = new Errors.NoRealmError();\n            this._fillOpStatusByError(noRealmError);\n            throw noRealmError;\n        }\n\n        const numberOfAuthOptions = (this._options.authid ? 1 : 0) +\n                ((Array.isArray(this._options.authmethods) && this._options.authmethods.length > 0) ? 1 : 0) +\n                (typeof this._options.onChallenge === 'function' ||\n                 Object.keys(this._options.authPlugins).length > 0 ? 1 : 0);\n\n        if (numberOfAuthOptions > 0 && numberOfAuthOptions < 3) {\n            const noCRACallbackOrIdError = new Errors.NoCRACallbackOrIdError();\n            this._fillOpStatusByError(noCRACallbackOrIdError);\n            throw noCRACallbackOrIdError;\n        }\n\n        this._setWsProtocols();\n        this._ws = getWebSocket({\n            url: this._url!,\n            protocols: this._protocols,\n            options: this._options as Record<string, unknown>\n        });\n\n        if (!this._ws) {\n            const noWsOrUrlError = new Errors.NoWsOrUrlError();\n            this._fillOpStatusByError(noWsOrUrlError);\n            throw noWsOrUrlError;\n        }\n\n        this._initWsCallbacks();\n\n        const defer = getNewPromise<Record<string, unknown>>();\n        this._cache.connectPromise = defer;\n        return defer.promise;\n    }\n\n    /** Disconnect from server */\n    async disconnect (): Promise<unknown> {\n        if (this._cache.sessionId) {\n            const defer = getNewPromise<void>();\n            this._cache.opStatus = { ...SUCCESS, reqId: 0 };\n            this._cache.closePromise = defer;\n            // need to send goodbye message to server\n            this._cache.isSayingGoodbye = true;\n            this._send([WAMP_MSG_SPEC.GOODBYE, {}, 'wamp.close.system_shutdown']);\n\n            return defer.promise;\n\n        } else if (this._ws) {\n            this._ws.close();\n        }\n\n        return true;\n    }\n\n    /** Abort WAMP session establishment */\n    abort (): Wampy {\n\n        if (!this._cache.sessionId && this._ws!.readyState === 1) {\n            this._send([WAMP_MSG_SPEC.ABORT, {}, 'wamp.error.abort']);\n            this._cache.sessionId = null;\n        }\n\n        this._ws!.close();\n        this._cache.opStatus = { ...SUCCESS, reqId: 0 };\n\n        return this;\n    }\n\n    /** Subscribe to a topic on a broker */\n    async subscribe (topic: string, onEvent: EventCallback, advancedOptions?: SubscribeAdvancedOptions): Promise<SubscribeSuccessResult> {\n        const isAdvancedOptionsAnObject = this._isPlainObject(advancedOptions);\n\n        if (!isAdvancedOptionsAnObject && ((advancedOptions) !== undefined)) {\n            const invalidParamError = new Errors.InvalidParamError('advancedOptions');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        const { match, get_retained } = advancedOptions || {};\n        let patternBased = false;\n        if (match) {\n            if (!['exact', 'prefix', 'wildcard'].includes(match)) {\n                const invalidParamError = new Errors.InvalidParamError('match');\n                this._fillOpStatusByError(invalidParamError);\n                throw invalidParamError;\n            }\n\n            patternBased = match !== 'exact';\n        }\n\n        if (get_retained && typeof get_retained !== 'boolean') {\n            const invalidParamError = new Errors.InvalidParamError('get_retained');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        if (!this._preReqChecks({ topic, patternBased, allowWAMP: true }, 'broker')) {\n            throw this._cache.opStatus.error;\n        }\n\n        if (typeof onEvent !== 'function') {\n            const noCallbackError = new Errors.NoCallbackError();\n            this._fillOpStatusByError(noCallbackError);\n            throw noCallbackError;\n        }\n\n        const subscriptionKey = this._getSubscriptionKey(topic, advancedOptions);\n        const subscription = this._subscriptionsByKey.get(subscriptionKey);\n\n        if (subscription && subscription.callbacks.length > 0) {\n            if (!subscription.callbacks.includes(onEvent)) {\n                subscription.callbacks.push(onEvent);\n            }\n\n            return { topic, requestId: 0, subscriptionId: subscription.id, subscriptionKey };\n        }\n\n        const reqId = this._getReqId();\n        const callbacks = getNewPromise<SubscribeSuccessResult>() as SubscribeRequestCallbacks;\n\n        callbacks.onEvent = onEvent;\n        this._requests[reqId] = { topic, callbacks, advancedOptions };\n\n        // WAMP SPEC: [SUBSCRIBE, Request|id, Options|dict, Topic|uri]\n        const options = { match, get_retained, ...this._extractCustomOptions(advancedOptions) };\n        this._send([WAMP_MSG_SPEC.SUBSCRIBE, reqId, options, topic]);\n        this._cache.opStatus = { ...SUCCESS, reqId: reqId || 0 };\n\n        return callbacks.promise;\n    }\n\n    /** Unsubscribe from topic */\n    async unsubscribe (subscriptionIdOrKey: number | string, onEvent?: EventCallback): Promise<UnsubscribeSuccessResult | true> {\n        if (!this._preReqChecks(null, 'broker')) {\n            throw this._cache.opStatus.error;\n        }\n\n        const subscription = this._subscriptionsById.get(subscriptionIdOrKey as number) ||\n            this._subscriptionsByKey.get(subscriptionIdOrKey as string);\n\n        if (!subscription) {\n            const nonExistUnsubscribeError = new Errors.NonExistUnsubscribeError();\n            this._fillOpStatusByError(nonExistUnsubscribeError);\n            throw nonExistUnsubscribeError;\n        }\n\n        subscription.callbacks = typeof onEvent === 'function'\n            ? subscription.callbacks.filter((callback) => callback !== onEvent)\n            : [];\n\n        const isThereOtherCallbackForThisTopic = subscription.callbacks.length > 0;\n\n        if (isThereOtherCallbackForThisTopic) {\n            this._cache.opStatus = { ...SUCCESS, reqId: 0 };\n            return true;\n        }\n\n        const reqId = this._getReqId();\n\n        this._requests[reqId] = { topic: subscription.topic, callbacks: getNewPromise<UnsubscribeSuccessResult>() };\n\n        // WAMP_SPEC: [UNSUBSCRIBE, Request|id, SUBSCRIBED.Subscription|id]\n        this._send([WAMP_MSG_SPEC.UNSUBSCRIBE, reqId, subscription.id]);\n        this._cache.opStatus = { ...SUCCESS, reqId: reqId };\n\n        return (this._requests[reqId] as UnsubscribeRequest).callbacks.promise;\n    }\n\n    /** Publish an event to the topic */\n    async publish (topic: string, payload?: Payload, advancedOptions?: PublishAdvancedOptions): Promise<PublishSuccessResult> {\n        if (!this._preReqChecks({ topic, patternBased: false, allowWAMP: false }, 'broker')) {\n            throw this._cache.opStatus.error;\n        }\n\n        const isAdvancedOptionsAnObject = this._isPlainObject(advancedOptions);\n\n        if (advancedOptions && !isAdvancedOptionsAnObject) {\n            const error = new Errors.InvalidParamError('advancedOptions');\n            this._fillOpStatusByError(error);\n            throw error;\n        }\n\n        let messageOptions: Record<string, unknown> = {};\n        const _optionsConvertHelper = (option: string, sourceType: string): boolean => {\n            if ((advancedOptions as Record<string, unknown>)[option]) {\n                if (Array.isArray((advancedOptions as Record<string, unknown>)[option]) && ((advancedOptions as Record<string, unknown>)[option] as unknown[]).length > 0) {\n                    messageOptions[option] = (advancedOptions as Record<string, unknown>)[option];\n                } else if (typeof (advancedOptions as Record<string, unknown>)[option] === sourceType) {\n                    messageOptions[option] = [(advancedOptions as Record<string, unknown>)[option]];\n                } else {\n                    return false;\n                }\n            }\n\n            return true;\n        };\n\n        if (isAdvancedOptionsAnObject && (\n            !_optionsConvertHelper('exclude', 'number') ||\n            !_optionsConvertHelper('exclude_authid', 'string') ||\n            !_optionsConvertHelper('exclude_authrole', 'string') ||\n            !_optionsConvertHelper('eligible', 'number') ||\n            !_optionsConvertHelper('eligible_authid', 'string') ||\n            !_optionsConvertHelper('eligible_authrole', 'string')\n        )) {\n            const invalidParamError = new Errors.InvalidParamError('advancedOptions');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        const { ppt_scheme, ppt_serializer, ppt_cipher, ppt_keyid, exclude_me, disclose_me, retain } = advancedOptions || {} as PublishAdvancedOptions;\n\n        if (retain && typeof retain !== 'boolean') {\n            const invalidParamError = new Errors.InvalidParamError('retain');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        // Check and handle Payload PassThru Mode\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n        if (ppt_scheme && !this._checkPPTOptions('broker', advancedOptions as Record<string, unknown>)) {\n            throw this._cache.opStatus.error;\n        }\n\n        messageOptions = {\n            acknowledge: true,\n            ...messageOptions,\n            ...(ppt_scheme ? { ppt_scheme } : {}),\n            ...(ppt_scheme ? { ppt_scheme } : {}),\n            ...(ppt_serializer ? { ppt_serializer } : {}),\n            ...(ppt_cipher ? { ppt_cipher } : {}),\n            ...(ppt_keyid ? { ppt_keyid } : {}),\n            ...(exclude_me ? { exclude_me } : {}),\n            ...(disclose_me ? { disclose_me } : {}),\n            ...this._extractCustomOptions(advancedOptions)\n        };\n\n        const { err, payloadItems } = payload ? this._packPPTPayload(payload, messageOptions) : {} as Partial<PackPPTPayloadResult>;\n        const reqId = this._getReqId();\n\n        if (err) {\n            throw this._cache.opStatus.error;\n        }\n\n        this._requests[reqId] = { topic, callbacks: getNewPromise<PublishSuccessResult>() };\n        this._cache.opStatus = { ...SUCCESS, reqId };\n        this._send([WAMP_MSG_SPEC.PUBLISH, reqId, messageOptions, topic, ...(payloadItems || [])]);\n\n        return (this._requests[reqId] as PublishRequest).callbacks.promise;\n    }\n\n    /** Extract custom options from advanced options as per WAMP spec 3.1 */\n    _extractCustomOptions(advancedOptions?: Record<string, unknown>): Record<string, unknown> {\n        const customOptions: Record<string, unknown> = {};\n        for (const key in advancedOptions || {}) {\n            if (WAMP_CUSTOM_ATTR_REGEX.test(key)) {\n                customOptions[key] = advancedOptions![key];\n            }\n        }\n        return customOptions;\n    }\n\n    /** Process CALL advanced options and transform them for the WAMP CALL message Options */\n    _getCallMessageOptionsFromAdvancedOptions(advancedOptions?: CallAdvancedOptions): Record<string, unknown> {\n        const {\n            timeout,\n            progress,\n            progress_callback,\n            disclose_me,\n            ppt_scheme,\n            ppt_serializer,\n            ppt_cipher,\n            ppt_keyid,\n            ...rest\n        } = advancedOptions || {} as CallAdvancedOptions;\n\n        const result: Record<string, unknown> = {};\n\n        if (progress_callback) {result.receive_progress = true;}\n        if (progress) {result.progress = true;}\n        if (disclose_me) {result.disclose_me = true;}\n        if (timeout) {result.timeout = timeout;}\n        if (ppt_scheme) {result.ppt_scheme = ppt_scheme;}\n        if (ppt_serializer) {result.ppt_serializer = ppt_serializer;}\n        if (ppt_cipher) {result.ppt_cipher = ppt_cipher;}\n        if (ppt_keyid) {result.ppt_keyid = ppt_keyid;}\n\n        // Extract custom options (starting with underscore) as per WAMP spec 3.1\n        return { ...result, ...this._extractCustomOptions(rest) };\n    }\n\n    /** Remote Procedure Call Internal Implementation */\n    _callInternal(topic: string, payload?: Payload, advancedOptions?: CallAdvancedOptions): number {\n        if (!this._preReqChecks({ topic, patternBased: false, allowWAMP: true }, 'dealer')) {\n            throw this._cache.opStatus.error;\n        }\n\n        if (advancedOptions && !this._isPlainObject(advancedOptions)) {\n            const invalidParamError = new Errors.InvalidParamError('advancedOptions');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        const { timeout, progress_callback, ppt_scheme } = advancedOptions || {} as CallAdvancedOptions;\n        const isTimeoutInvalid = (timeout && typeof timeout !== 'number');\n        const isProgressCallbackInvalid = (progress_callback && typeof progress_callback !== 'function');\n\n        if (isTimeoutInvalid || isProgressCallbackInvalid) {\n            const paramName = isTimeoutInvalid ? 'timeout' : 'progress_callback';\n            const invalidParamError = new Errors.InvalidParamError(paramName);\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        // Check and handle Payload PassThru Mode\n        // @see https://wamp-proto.org/wamp_latest_ietf.html#name-payload-passthru-mode\n        if (ppt_scheme && !this._checkPPTOptions('dealer', advancedOptions as Record<string, unknown>)) {\n            throw this._cache.opStatus.error;\n        }\n\n        let reqId: number;\n        do {\n            reqId = this._getReqId();\n        } while (reqId in this._calls);\n\n        const messageOptions = this._getCallMessageOptionsFromAdvancedOptions(advancedOptions);\n\n        const { err, payloadItems } = payload ? this._packPPTPayload(payload, messageOptions) : {} as Partial<PackPPTPayloadResult>;\n\n        if (err) {\n            throw this._cache.opStatus.error;\n        }\n\n        // WAMP SPEC: [CALL, Request|id, Options|dict, Procedure|uri, (Arguments|list, ArgumentsKw|dict)]\n        this._send([WAMP_MSG_SPEC.CALL, reqId, messageOptions, topic, ...(payloadItems || [])]);\n        this._cache.opStatus = { ...SUCCESS, reqId };\n        this._calls[reqId] = getNewPromise<CallResult>() as WampCall;\n\n        if (progress_callback) {\n            this._calls[reqId].onProgress = progress_callback;\n        }\n\n        return reqId;\n    }\n\n    /** Remote Procedure Call */\n    async call (topic: string, payload?: Payload, advancedOptions?: CallAdvancedOptions): Promise<CallResult> {\n        const reqId = this._callInternal(topic, payload, advancedOptions);\n        return this._calls[reqId].promise;\n    }\n\n    /**\n     * Remote Procedure Progressive Call\n     *\n     * You can send additional input data which won't be treated as a new independent but instead\n     * will be transferred as another input data chunk to the same remote procedure call. Of course\n     * Callee and Dealer should support the \"progressive_call_invocations\" feature as well.\n     */\n    progressiveCall (topic: string, payload?: Payload, advancedOptions?: CallAdvancedOptions): ProgressiveCallReturn {\n        if (!this._checkRouterFeature('dealer', 'progressive_call_invocations')) {\n            throw this._cache.opStatus.error;\n        }\n\n        advancedOptions = advancedOptions || {} as CallAdvancedOptions;\n        (advancedOptions as Record<string, unknown>).progress = true;    // Implicitly set the progress flag before making the first call\n        const reqId = this._callInternal(topic, payload, advancedOptions);\n\n        const messageOptions = this._getCallMessageOptionsFromAdvancedOptions(advancedOptions);\n\n        // Now we need to construct the function tha client may call to pass another input data chunk\n        const cb = (payload?: Payload, advancedOptions?: ProgressiveCallSendDataOptions): void => {\n            if (advancedOptions && !this._isPlainObject(advancedOptions)) {\n                const invalidParamError = new Errors.InvalidParamError('advancedOptions');\n                this._fillOpStatusByError(invalidParamError);\n                throw invalidParamError;\n            }\n\n            const msgOpt = messageOptions;\n            const { progress } = advancedOptions || {} as ProgressiveCallSendDataOptions;\n            if (progress !== undefined) {\n                if (typeof progress === 'boolean') {\n                    msgOpt.progress = progress;\n                } else {\n                    const invalidParamError = new Errors.InvalidParamError('progress');\n                    this._fillOpStatusByError(invalidParamError);\n                    throw invalidParamError;\n                }\n            }\n\n            const { err, payloadItems } = payload ? this._packPPTPayload(payload, messageOptions) : {} as Partial<PackPPTPayloadResult>;\n\n            if (err) {\n                throw this._cache.opStatus.error;\n            }\n\n            // WAMP SPEC: [CALL, Request|id, Options|dict, Procedure|uri, (Arguments|list, ArgumentsKw|dict)]\n            this._send([WAMP_MSG_SPEC.CALL, reqId, messageOptions, topic, ...(payloadItems || [])]);\n            this._cache.opStatus = { ...SUCCESS, reqId };\n        };\n\n        return {\n            result: this._calls[reqId].promise,\n            sendData: cb\n        };\n    }\n\n    /** RPC invocation cancelling */\n    cancel (reqId: number, advancedOptions?: CancelAdvancedOptions): boolean {\n        if (!this._preReqChecks(null, 'dealer') || !this._checkRouterFeature('dealer', 'call_canceling')) {\n            throw this._cache.opStatus.error;\n        }\n\n        if (!reqId || !this._calls[reqId]) {\n            const nonExistRPCReqIdError = new Errors.NonExistRPCReqIdError();\n            this._fillOpStatusByError(nonExistRPCReqIdError);\n            throw nonExistRPCReqIdError;\n        }\n\n        if (!this._isPlainObject(advancedOptions) && (advancedOptions) !== undefined) {\n            const invalidParamError = new Errors.InvalidParamError('advancedOptions');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        let mode: string | undefined;\n        if (this._isPlainObject(advancedOptions) && Object.hasOwnProperty.call(advancedOptions, 'mode')) {\n            if (!['skip', 'kill', 'killnowait'].includes(advancedOptions.mode as string)) {\n                const error = new Errors.InvalidParamError('mode');\n                this._fillOpStatusByError(error);\n                throw error;\n            }\n            mode = advancedOptions.mode;\n        }\n\n        // WAMP SPEC: [CANCEL, CALL.Request|id, Options|dict]\n        const options: Record<string, unknown> = {\n            ...(mode ? { mode } : {}),\n            ...this._extractCustomOptions(advancedOptions)\n        };\n        this._send([WAMP_MSG_SPEC.CANCEL, reqId, options]);\n        this._cache.opStatus = { ...SUCCESS, reqId: reqId };\n\n        return true;\n    }\n\n    /** RPC registration for invocation */\n    async register (topic: string, rpc: RPCCallback, advancedOptions?: RegisterAdvancedOptions): Promise<RegisterSuccessResult> {\n        if (this._rpcRegs[topic]?.callbacks?.length) {\n            const rpcAlreadyRegisteredError = new Errors.RPCAlreadyRegisteredError();\n            this._fillOpStatusByError(rpcAlreadyRegisteredError);\n            throw rpcAlreadyRegisteredError;\n        }\n\n        if (typeof rpc !== 'function') {\n            const noCallbackError = new Errors.NoCallbackError();\n            this._fillOpStatusByError(noCallbackError);\n            throw noCallbackError;\n        }\n\n        if (advancedOptions && !this._isPlainObject(advancedOptions)) {\n            const invalidParamError = new Errors.InvalidParamError('advancedOptions');\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        const { match, invoke } = advancedOptions || {} as RegisterAdvancedOptions;\n        const isMatchInvalid = match && !['exact', 'prefix', 'wildcard'].includes(match);\n        const isInvokeInvalid = invoke && !['single', 'roundrobin', 'random', 'first', 'last'].includes(invoke);\n\n        if (isMatchInvalid || isInvokeInvalid) {\n            const parameter = isMatchInvalid ? 'match' : 'invoke';\n            const invalidParamError = new Errors.InvalidParamError(parameter);\n            this._fillOpStatusByError(invalidParamError);\n            throw invalidParamError;\n        }\n\n        if (!this._preReqChecks({ topic, patternBased: Boolean(match), allowWAMP: false }, 'dealer')) {\n            throw this._cache.opStatus.error;\n        }\n\n        const reqId = this._getReqId();\n        const callbacks = getNewPromise<RegisterSuccessResult>() as RegisterRequestCallbacks;\n        const options: Record<string, unknown> = {\n            ... (match ? { match } : {}),\n            ... (invoke ? { invoke } : {}),\n            ...this._extractCustomOptions(advancedOptions)\n        };\n\n        if (rpc) {\n            callbacks.rpc = rpc;\n        }\n\n        this._requests[reqId] = { topic, callbacks, options: options as RegisterAdvancedOptions };\n\n        // WAMP SPEC: [REGISTER, Request|id, Options|dict, Procedure|uri]\n        this._send([WAMP_MSG_SPEC.REGISTER, reqId, options, topic]);\n        this._cache.opStatus = { ...SUCCESS, reqId };\n\n        return callbacks.promise;\n    }\n\n    /** RPC unregistration for invocation */\n    async unregister (topic: string): Promise<UnregisterSuccessResult> {\n        if (!this._preReqChecks({ topic, patternBased: false, allowWAMP: false }, 'dealer')) {\n            throw this._cache.opStatus.error;\n        }\n\n        if (!this._rpcRegs[topic]) {\n            const nonExistRpcUnregistrationError = new Errors.NonExistRPCUnregistrationError();\n            this._fillOpStatusByError(nonExistRpcUnregistrationError);\n            throw nonExistRpcUnregistrationError;\n        }\n\n        const reqId = this._getReqId();\n        const callbacks = getNewPromise<UnregisterSuccessResult>();\n\n        this._requests[reqId] = { topic, callbacks };\n\n        // WAMP SPEC: [UNREGISTER, Request|id, REGISTERED.Registration|id]\n        this._send([WAMP_MSG_SPEC.UNREGISTER, reqId, this._rpcRegs[topic].id]);\n        this._cache.opStatus = { ...SUCCESS, reqId };\n\n        return callbacks.promise;\n    }\n}\n\nexport default Wampy;\nexport { Wampy };\nexport * as Errors from './errors.js';\n","export const WAMP_MSG_SPEC = {\n    HELLO: 1,\n    WELCOME: 2,\n    ABORT: 3,\n    CHALLENGE: 4,\n    AUTHENTICATE: 5,\n    GOODBYE: 6,\n    ERROR: 8,\n    PUBLISH: 16,\n    PUBLISHED: 17,\n    SUBSCRIBE: 32,\n    SUBSCRIBED: 33,\n    UNSUBSCRIBE: 34,\n    UNSUBSCRIBED: 35,\n    EVENT: 36,\n    CALL: 48,\n    CANCEL: 49,\n    RESULT: 50,\n    REGISTER: 64,\n    REGISTERED: 65,\n    UNREGISTER: 66,\n    UNREGISTERED: 67,\n    INVOCATION: 68,\n    INTERRUPT: 69,\n    YIELD: 70\n} as const;\n\nexport const SUCCESS: { readonly code: 0; readonly error: null } = {\n    code: 0,\n    error: null\n};\n\nexport const WAMP_ERROR_MSG: Record<string, string> = {\n    SUCCESS: 'Success!',\n    URI_ERROR: 'Topic URI doesn\\'t meet requirements!',\n    NO_BROKER: 'Server doesn\\'t provide broker role!',\n    NO_CALLBACK_SPEC: 'No required callback function specified!',\n    INVALID_PARAM: 'Invalid parameter(s) specified!',\n    NO_SERIALIZER_AVAILABLE: 'Server has chosen a serializer, which is not available!',\n    NON_EXIST_UNSUBSCRIBE: 'Trying to unsubscribe from non existent subscription!',\n    NO_DEALER: 'Server doesn\\'t provide dealer role!',\n    RPC_ALREADY_REGISTERED: 'RPC already registered!',\n    NON_EXIST_RPC_UNREG: 'Received rpc unregistration for non existent rpc!',\n    NON_EXIST_RPC_INVOCATION: 'Received invocation for non existent rpc!',\n    NON_EXIST_RPC_REQ_ID: 'No RPC calls in action with specified request ID!',\n    NO_REALM: 'No realm specified!',\n    NO_WS_OR_URL: 'No websocket provided or URL specified is incorrect!',\n    NO_CRA_CB_OR_ID: 'No onChallenge callback or authid was provided for authentication!',\n    CHALLENGE_EXCEPTION: 'Exception raised during challenge processing',\n    PPT_NOT_SUPPORTED: 'Payload Passthru Mode is not supported by the router',\n    PPT_INVALID_SCHEME: 'Provided PPT scheme is invalid',\n    PPT_SRLZ_INVALID: 'Provided PPT serializer is invalid or not supported',\n    PPT_SRLZ_ERR: 'Can not serialize/deserialize payload',\n    PROTOCOL_VIOLATION: 'Protocol violation',\n    WAMP_ABORT: 'Router aborted connection',\n    WAMP_GENERAL_ERROR: 'Wamp error',\n    WEBSOCKET_ERROR: 'Websocket error',\n    FEATURE_NOT_SUPPORTED: 'Feature not supported'\n};\n\nexport const E2EE_SERIALIZERS: readonly string[] = ['cbor'] as const;\n\nexport const isNode: boolean = (typeof process === 'object' && Object.prototype.toString.call(process) === '[object process]');\n\nexport const WAMP_CUSTOM_ATTR_REGEX: RegExp = /^_[a-z0-9_]{3,}$/;\n","import { WAMP_ERROR_MSG } from './constants.js';\n\nexport class UriError extends Error {\n    readonly code = 1;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.URI_ERROR);\n        this.name = 'UriError';\n    }\n}\n\nexport class NoBrokerError extends Error {\n    readonly code = 2;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_BROKER);\n        this.name = 'NoBrokerError';\n    }\n}\n\nexport class NoCallbackError extends Error {\n    readonly code = 3;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_CALLBACK_SPEC);\n        this.name = 'NoCallbackError';\n    }\n}\n\nexport class InvalidParamError extends Error {\n    readonly code = 4;\n    readonly parameter: string;\n\n    constructor (parameter: string) {\n        super(WAMP_ERROR_MSG.INVALID_PARAM);\n        this.name = 'InvalidParamError';\n        this.parameter = parameter;\n    }\n}\n\nexport class NoSerializerAvailableError extends Error {\n    readonly code = 6;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_SERIALIZER_AVAILABLE);\n        this.name = 'NoSerializerAvailableError';\n    }\n}\n\nexport class NonExistUnsubscribeError extends Error {\n    readonly code = 7;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NON_EXIST_UNSUBSCRIBE);\n        this.name = 'NonExistUnsubscribeError';\n    }\n}\n\nexport class NoDealerError extends Error {\n    readonly code = 12;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_DEALER);\n        this.name = 'NoDealerError';\n    }\n}\n\nexport class RPCAlreadyRegisteredError extends Error {\n    readonly code = 15;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.RPC_ALREADY_REGISTERED);\n        this.name = 'RPCAlreadyRegisteredError';\n    }\n}\n\nexport class NonExistRPCUnregistrationError extends Error {\n    readonly code = 17;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NON_EXIST_RPC_UNREG);\n        this.name = 'NonExistRPCUnregistrationError';\n    }\n}\n\n// Not being used at the moment, but left commented here in case we need it\n// export class NonExistRPCInvocationError extends Error {\n//     readonly code = 19;\n//\n//     constructor () {\n//         super(WAMP_ERROR_MSG.NON_EXIST_RPC_INVOCATION);\n//         this.name = 'NonExistRPCInvocationError';\n//     }\n// }\n\nexport class NonExistRPCReqIdError extends Error {\n    readonly code = 20;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NON_EXIST_RPC_REQ_ID);\n        this.name = 'NonExistRPCReqIdError';\n    }\n}\n\nexport class NoRealmError extends Error {\n    readonly code = 21;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_REALM);\n        this.name = 'NoRealmError';\n    }\n}\n\nexport class NoWsOrUrlError extends Error {\n    readonly code = 22;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_WS_OR_URL);\n        this.name = 'NoWsOrUrlError';\n    }\n}\n\nexport class NoCRACallbackOrIdError extends Error {\n    readonly code = 23;\n    readonly errorUri = 'wamp.error.cannot_authenticate';\n\n    constructor () {\n        super(WAMP_ERROR_MSG.NO_CRA_CB_OR_ID);\n        this.name = 'NoCRACallbackOrIdError';\n    }\n}\n\nexport class ChallengeExceptionError extends Error {\n    readonly code = 24;\n    readonly errorUri = 'wamp.error.cannot_authenticate';\n\n    constructor () {\n        super(WAMP_ERROR_MSG.CHALLENGE_EXCEPTION);\n        this.name = 'ChallengeExceptionError';\n    }\n}\n\nexport class PPTNotSupportedError extends Error {\n    readonly code = 25;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.PPT_NOT_SUPPORTED);\n        this.name = 'PPTNotSupportedError';\n    }\n}\n\nexport class PPTInvalidSchemeError extends Error {\n    readonly code = 26;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.PPT_INVALID_SCHEME);\n        this.name = 'PPTInvalidSchemeError';\n    }\n}\n\nexport class PPTSerializerInvalidError extends Error {\n    readonly code = 27;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.PPT_SRLZ_INVALID);\n        this.name = 'PPTSerializerInvalidError';\n    }\n}\n\nexport class PPTSerializationError extends Error {\n    readonly code = 28;\n\n    constructor () {\n        super(WAMP_ERROR_MSG.PPT_SRLZ_ERR);\n        this.name = 'PPTSerializationError';\n    }\n}\n\nexport interface ProtocolViolationErrorParams {\n    errorUri: string;\n    details?: string;\n}\n\nexport class ProtocolViolationError extends Error {\n    readonly code = 29;\n    readonly errorUri: string;\n\n    constructor (errorUri: string, details?: string) {\n        super(details || WAMP_ERROR_MSG.PROTOCOL_VIOLATION);\n        this.name = 'ProtocolViolationError';\n        this.errorUri = errorUri;\n    }\n}\n\nexport interface WampErrorParams {\n    error: string;\n    details: Record<string, unknown>;\n    argsList?: unknown[];\n    argsDict?: Record<string, unknown>;\n}\n\nexport class AbortError extends Error {\n    readonly code = 30;\n    readonly errorUri: string;\n    readonly details: Record<string, unknown>;\n\n    constructor ({ error, details }: { error: string; details: Record<string, unknown> }) {\n        super(WAMP_ERROR_MSG.WAMP_ABORT);\n        this.name = 'AbortedError';\n        this.errorUri = error;\n        this.details = details;\n    }\n}\n\nexport class WampError extends Error {\n    readonly code: number = 31;\n    readonly errorUri: string;\n    readonly details: Record<string, unknown>;\n    readonly argsList?: unknown[];\n    readonly argsDict?: Record<string, unknown>;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super(WAMP_ERROR_MSG.WAMP_GENERAL_ERROR);\n        this.name = 'WampError';\n        this.errorUri = error;\n        this.details = details;\n        this.argsList = argsList;\n        this.argsDict = argsDict;\n    }\n}\n\nexport class SubscribeError extends WampError {\n    override readonly code = 32;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super({ error, details, argsList, argsDict });\n        this.name = 'SubscribeError';\n    }\n}\n\nexport class UnsubscribeError extends WampError {\n    override readonly code = 33;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super({ error, details, argsList, argsDict });\n        this.name = 'UnsubscribeError';\n    }\n}\n\nexport class PublishError extends WampError {\n    override readonly code = 34;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super({ error, details, argsList, argsDict });\n        this.name = 'PublishError';\n    }\n}\n\nexport class RegisterError extends WampError {\n    override readonly code = 35;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super({ error, details, argsList, argsDict });\n        this.name = 'RegisterError';\n    }\n}\n\nexport class UnregisterError extends WampError {\n    override readonly code = 36;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super({ error, details, argsList, argsDict });\n        this.name = 'UnregisterError';\n    }\n}\n\nexport class CallError extends WampError {\n    override readonly code = 37;\n\n    constructor ({ error, details, argsList, argsDict }: WampErrorParams) {\n        super({ error, details, argsList, argsDict });\n        this.name = 'CallError';\n    }\n}\n\nexport class WebsocketError extends Error {\n    readonly code = 38;\n    readonly error: unknown;\n\n    constructor (error: unknown) {\n        super(WAMP_ERROR_MSG.WEBSOCKET_ERROR);\n        this.name = 'WebsocketError';\n        this.error = error;\n    }\n}\n\nexport class FeatureNotSupportedError extends Error {\n    readonly code = 39;\n    readonly role: string;\n    readonly feature: string;\n\n    constructor (role: string, feature: string) {\n        super(WAMP_ERROR_MSG.FEATURE_NOT_SUPPORTED);\n        this.name = 'FeatureNotSupportedError';\n        this.role = role;\n        this.feature = feature;\n    }\n}\n","import { isNode } from './constants.js';\n\n/**\n * Deferred promise object with exposed resolve and reject callbacks.\n */\nexport interface Deferred<T = unknown> {\n    promise: Promise<T>;\n    onSuccess: (value: T) => void | Promise<void>;\n    onError: (reason?: unknown) => void | Promise<void>;\n}\n\n/**\n * Configuration object for getWebSocket.\n */\ninterface GetWebSocketConfig {\n    url?: string;\n    protocols?: string[];\n    options?: {\n        ws?: { new (url: string, protocols?: string[], origin?: null, headers?: Record<string, string>, requestOptions?: Record<string, unknown>): WebSocket };\n        additionalHeaders?: Record<string, string>;\n        wsRequestOptions?: Record<string, unknown>;\n    };\n    isBrowserMock?: boolean;\n}\n\nfunction isWebSocketSchemeSpecified (url: string): boolean {\n    return /^ws(s)?:\\/\\//.test(url);\n}\n\nfunction getServerUrlForNode (url: string): string | null {\n    return isWebSocketSchemeSpecified(url) ? url : null;\n}\n\nfunction getServerUrlForBrowser (url?: string): string | null {\n    if (url && isWebSocketSchemeSpecified(url)) {\n        return url;\n    }\n\n    const isSecureProtocol = globalThis.location.protocol === 'https:';\n    const scheme = isSecureProtocol ? 'wss://' : 'ws://';\n    const port = globalThis.location.port ? `:${globalThis.location.port}` : '';\n\n    if (!url) {\n        return `${scheme}${globalThis.location.hostname}${port}/ws`;\n    }\n\n    if (url.startsWith('/')) {    // just path on current server\n        return `${scheme}${globalThis.location.hostname}${port}${url}`;\n    }\n\n    // assuming just domain + path\n    return `${scheme}${url}`;\n}\n\n/** Get a WebSocket object from the browser's window global variable */\nfunction getWebSocketFromWindowObject (parsedUrl: string, protocols?: string[]): WebSocket | null {\n    if (globalThis?.WebSocket) {\n        return new globalThis.WebSocket(parsedUrl, protocols);\n    }\n\n    return null;\n}\n\n/** Get a WebSocket object according to the user's current environment */\nexport function getWebSocket ({ url, protocols, options, isBrowserMock }: GetWebSocketConfig = {}): WebSocket | null {\n    const { ws, additionalHeaders, wsRequestOptions } = options || {};\n    const isActualNode = isNode && !isBrowserMock;\n\n    if (!ws && isActualNode) {\n        return null;\n    }\n\n    const parsedUrl = isActualNode ? getServerUrlForNode(url!) : getServerUrlForBrowser(url);\n\n    if (!parsedUrl) {\n        return null;\n    }\n\n    if (ws) {    // User-provided WebSocket class\n        return new ws(parsedUrl, protocols, null, additionalHeaders, wsRequestOptions);\n    }\n\n    return getWebSocketFromWindowObject(parsedUrl, protocols);\n}\n\n/** Create a new deferred promise with exposed resolve and reject callbacks */\nexport function getNewPromise<T = unknown> (): Deferred<T> {\n    const deferred = {} as Deferred<T>;\n\n    deferred.promise = new Promise<T>(function (resolve, reject) {\n        deferred.onSuccess = resolve;\n        deferred.onError = reject;\n    });\n\n    return deferred;\n}\n","import type { Serializer } from './serializer.js';\n\nexport class JsonSerializer implements Serializer {\n    protocol: string = 'json';\n    isBinary: boolean = false;\n\n    encode (data: unknown): string {\n        return JSON.stringify(data);\n    }\n\n    decode (data: string | ArrayBuffer | Uint8Array): unknown {\n        return JSON.parse(data as string);\n    }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,gBAAgB;AAAA,EACzB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AACX;AAEO,IAAM,UAAsD;AAAA,EAC/D,MAAM;AAAA,EACN,OAAO;AACX;AAEO,IAAM,iBAAyC;AAAA,EAClD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,uBAAuB;AAC3B;AAEO,IAAM,mBAAsC,CAAC,MAAM;AAEnD,IAAM,SAAmB,OAAO,YAAY,YAAY,OAAO,UAAU,SAAS,KAAK,OAAO,MAAM;AAEpG,IAAM,yBAAiC;;;AChE9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EACvB,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,SAAS;AAC9B,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC5B,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,SAAS;AAC9B,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAC9B,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,gBAAgB;AACrC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAChC,OAAO;AAAA,EACP;AAAA,EAET,YAAa,WAAmB;AAC5B,UAAM,eAAe,aAAa;AAClC,SAAK,OAAO;AACZ,SAAK,YAAY;AAAA,EACrB;AACJ;AAEO,IAAM,6BAAN,cAAyC,MAAM;AAAA,EACzC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,uBAAuB;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACvC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,qBAAqB;AAC1C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC5B,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,SAAS;AAC9B,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACxC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,sBAAsB;AAC3C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,iCAAN,cAA6C,MAAM;AAAA,EAC7C,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,mBAAmB;AACxC,SAAK,OAAO;AAAA,EAChB;AACJ;AAYO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACpC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,oBAAoB;AACzC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC3B,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,QAAQ;AAC7B,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC7B,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,YAAY;AACjC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACrC,OAAO;AAAA,EACP,WAAW;AAAA,EAEpB,cAAe;AACX,UAAM,eAAe,eAAe;AACpC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,0BAAN,cAAsC,MAAM;AAAA,EACtC,OAAO;AAAA,EACP,WAAW;AAAA,EAEpB,cAAe;AACX,UAAM,eAAe,mBAAmB;AACxC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACnC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,iBAAiB;AACtC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACpC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,kBAAkB;AACvC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACxC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,gBAAgB;AACrC,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACpC,OAAO;AAAA,EAEhB,cAAe;AACX,UAAM,eAAe,YAAY;AACjC,SAAK,OAAO;AAAA,EAChB;AACJ;AAOO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACrC,OAAO;AAAA,EACP;AAAA,EAET,YAAa,UAAkB,SAAkB;AAC7C,UAAM,WAAW,eAAe,kBAAkB;AAClD,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EACpB;AACJ;AASO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACzB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAa,EAAE,OAAO,QAAQ,GAAwD;AAClF,UAAM,eAAe,UAAU;AAC/B,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACnB;AACJ;AAEO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACxB,OAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,eAAe,kBAAkB;AACvC,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EACpB;AACJ;AAEO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EACxB,OAAO;AAAA,EAEzB,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,EAAE,OAAO,SAAS,UAAU,SAAS,CAAC;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,mBAAN,cAA+B,UAAU;AAAA,EAC1B,OAAO;AAAA,EAEzB,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,EAAE,OAAO,SAAS,UAAU,SAAS,CAAC;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,eAAN,cAA2B,UAAU;AAAA,EACtB,OAAO;AAAA,EAEzB,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,EAAE,OAAO,SAAS,UAAU,SAAS,CAAC;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EACvB,OAAO;AAAA,EAEzB,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,EAAE,OAAO,SAAS,UAAU,SAAS,CAAC;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EACzB,OAAO;AAAA,EAEzB,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,EAAE,OAAO,SAAS,UAAU,SAAS,CAAC;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,YAAN,cAAwB,UAAU;AAAA,EACnB,OAAO;AAAA,EAEzB,YAAa,EAAE,OAAO,SAAS,UAAU,SAAS,GAAoB;AAClE,UAAM,EAAE,OAAO,SAAS,UAAU,SAAS,CAAC;AAC5C,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC7B,OAAO;AAAA,EACP;AAAA,EAET,YAAa,OAAgB;AACzB,UAAM,eAAe,eAAe;AACpC,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACjB;AACJ;AAEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACvC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAa,MAAc,SAAiB;AACxC,UAAM,eAAe,qBAAqB;AAC1C,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AACJ;;;AC1RA,SAAS,2BAA4B,KAAsB;AACvD,SAAO,eAAe,KAAK,GAAG;AAClC;AAEA,SAAS,oBAAqB,KAA4B;AACtD,SAAO,2BAA2B,GAAG,IAAI,MAAM;AACnD;AAEA,SAAS,uBAAwB,KAA6B;AAC1D,MAAI,OAAO,2BAA2B,GAAG,GAAG;AACxC,WAAO;AAAA,EACX;AAEA,QAAM,mBAAmB,WAAW,SAAS,aAAa;AAC1D,QAAM,SAAS,mBAAmB,WAAW;AAC7C,QAAM,OAAO,WAAW,SAAS,OAAO,IAAI,WAAW,SAAS,IAAI,KAAK;AAEzE,MAAI,CAAC,KAAK;AACN,WAAO,GAAG,MAAM,GAAG,WAAW,SAAS,QAAQ,GAAG,IAAI;AAAA,EAC1D;AAEA,MAAI,IAAI,WAAW,GAAG,GAAG;AACrB,WAAO,GAAG,MAAM,GAAG,WAAW,SAAS,QAAQ,GAAG,IAAI,GAAG,GAAG;AAAA,EAChE;AAGA,SAAO,GAAG,MAAM,GAAG,GAAG;AAC1B;AAGA,SAAS,6BAA8B,WAAmB,WAAwC;AAC9F,MAAI,YAAY,WAAW;AACvB,WAAO,IAAI,WAAW,UAAU,WAAW,SAAS;AAAA,EACxD;AAEA,SAAO;AACX;AAGO,SAAS,aAAc,EAAE,KAAK,WAAW,SAAS,cAAc,IAAwB,CAAC,GAAqB;AACjH,QAAM,EAAE,IAAI,mBAAmB,iBAAiB,IAAI,WAAW,CAAC;AAChE,QAAM,eAAe,UAAU,CAAC;AAEhC,MAAI,CAAC,MAAM,cAAc;AACrB,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,eAAe,oBAAoB,GAAI,IAAI,uBAAuB,GAAG;AAEvF,MAAI,CAAC,WAAW;AACZ,WAAO;AAAA,EACX;AAEA,MAAI,IAAI;AACJ,WAAO,IAAI,GAAG,WAAW,WAAW,MAAM,mBAAmB,gBAAgB;AAAA,EACjF;AAEA,SAAO,6BAA6B,WAAW,SAAS;AAC5D;AAGO,SAAS,gBAA2C;AACvD,QAAM,WAAW,CAAC;AAElB,WAAS,UAAU,IAAI,QAAW,SAAU,SAAS,QAAQ;AACzD,aAAS,YAAY;AACrB,aAAS,UAAU;AAAA,EACvB,CAAC;AAED,SAAO;AACX;;;AC7FO,IAAM,iBAAN,MAA2C;AAAA,EAC9C,WAAmB;AAAA,EACnB,WAAoB;AAAA,EAEpB,OAAQ,MAAuB;AAC3B,WAAO,KAAK,UAAU,IAAI;AAAA,EAC9B;AAAA,EAEA,OAAQ,MAAkD;AACtD,WAAO,KAAK,MAAM,IAAc;AAAA,EACpC;AACJ;;;AJmDA,IAAM,iBAA6B,IAAI,eAAe;AAKtD,IAAM,QAAN,MAAY;AAAA;AAAA,EAGR,UAAkB;AAAA;AAAA,EAGV;AAAA;AAAA,EAGA;AAAA;AAAA,EAGS;AAAA;AAAA,EAGT;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGS;AAAA;AAAA,EAGT;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAMR,YAAa,KAA6B,SAAwB;AAE9D,SAAK,OAAQ,OAAO,QAAQ,WAAY,MAAM;AAE9C,SAAK,aAAa,CAAC,aAAa;AAEhC,SAAK,iBAAiB;AAAA,MAClB,OAAO,cAAc,KAAK;AAAA,MAC1B,OAAO;AAAA,QACH,WAAY;AAAA,UACR,UAAU;AAAA,YACN,+BAA+B;AAAA,YAC/B,qBAA+B;AAAA,YAC/B,0BAA+B;AAAA,YAC/B,uBAA+B;AAAA,UACnC;AAAA,QACJ;AAAA,QACA,YAAY;AAAA,UACR,UAAU;AAAA,YACN,4BAA4B;AAAA,YAC5B,yBAA4B;AAAA,YAC5B,0BAA4B;AAAA,YAC5B,uBAA4B;AAAA,UAChC;AAAA,QACJ;AAAA,QACA,QAAY;AAAA,UACR,UAAU;AAAA,YACN,uBAA0B;AAAA,YAC1B,0BAA0B;AAAA,YAC1B,gBAA0B;AAAA,YAC1B,cAA0B;AAAA,YAC1B,uBAA0B;AAAA,UAC9B;AAAA,QACJ;AAAA,QACA,QAAY;AAAA,UACR,UAAU;AAAA,YACN,uBAA4B;AAAA,YAC5B,kBAA4B;AAAA,YAC5B,4BAA4B;AAAA,YAC5B,qBAA4B;AAAA,YAC5B,uBAA4B;AAAA,UAEhC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,SAAS;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,sBAAsB,EAAE,OAAO,CAAC,EAAE;AAAA,MAClC,iBAAiB;AAAA,MACjB,UAAU;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACX;AAAA,MACA,OAAO;AAAA,MACP,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAClB;AAEA,SAAK,MAAM;AACX,SAAK,WAAW,CAAC;AACjB,SAAK,YAAY,CAAC;AAClB,SAAK,SAAS,CAAC;AACf,SAAK,qBAAqB,oBAAI,IAAI;AAClC,SAAK,sBAAsB,oBAAI,IAAI;AACnC,SAAK,WAAW,CAAC;AACjB,SAAK,YAAY,oBAAI,IAAI;AAEzB,SAAK,WAAW;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,mBAAmB,IAAI;AAAA,MACvB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,aAAa,CAAC;AAAA,MACd,WAAW,CAAC;AAAA,MACZ,aAAa,CAAC;AAAA,MACd,UAAU;AAAA,MACV,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,IAAI;AAAA,MACJ,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,oBAAoB;AAAA,QAChB,MAAM;AAAA,MACV;AAAA,IACJ;AAEA,QAAI,KAAK,eAAe,OAAO,GAAG;AAC9B,WAAK,WAAW,EAAE,GAAG,KAAK,UAAU,GAAG,QAAwB;AAAA,IACnE,WAAW,KAAK,eAAe,GAAG,GAAG;AACjC,WAAK,WAAW,EAAE,GAAG,KAAK,UAAU,GAAG,IAAoB;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA;AAAA,EAKQ,QAAS,MAAuB;AACpC,QAAI,CAAC,KAAK,SAAS,OAAO;AAAE;AAAA,IAAQ;AAEpC,QAAI,KAAK,SAAS,QAAQ;AACtB,aAAO,KAAK,SAAS,OAAO,IAAI;AAAA,IACpC;AAEA,WAAO,QAAQ,IAAI,WAAW,IAAI;AAAA,EACtC;AAAA;AAAA,EAGQ,YAAqB;AACzB,WAAO,EAAE,KAAK,OAAO;AAAA,EACzB;AAAA;AAAA,EAGQ,eAAgB,OAAkD;AACtE,UAAM,cAAe,OAAmC;AACxD,UAAM,YAAa,aAAyC;AAE5D,WAAO,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM,qBAC1C,OAAO,gBAAgB,cACvB,OAAO,UAAU,SAAS,KAAK,SAAS,MAAM,qBAC9C,OAAO,eAAe,KAAK,WAAW,eAAe;AAAA,EAChE;AAAA;AAAA,EAGQ,kBAAyB;AAC7B,SAAK,aAAa,CAAC,YAAY,KAAK,SAAS,WAAW,QAAQ;AAAA,EAKpE;AAAA;AAAA,EAGQ,qBAAsB,KAAqC;AAC/D,SAAK,OAAO,WAAW;AAAA,MACnB,MAAM,IAAI;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA,EAGQ,cAAe,WAA6B,MAAyB;AACzE,QAAI,KAAK,OAAO,aAAa,CAAC,KAAK,OAAO,qBAAqB,MAAM,IAAI,GAAG;AACxE,YAAM,eAA2D;AAAA,QAC7D,QAAQ,IAAW,cAAc;AAAA,QACjC,QAAQ,IAAW,cAAc;AAAA,MACrC;AAEA,WAAK,qBAAqB,aAAa,IAAI,CAAC;AAC5C,aAAO;AAAA,IACX;AAEA,QAAI,aAAa,CAAC,KAAK,aAAa,UAAU,OAAO,UAAU,cAAc,UAAU,SAAS,GAAG;AAC/F,WAAK,qBAAqB,IAAW,SAAS,CAAC;AAC/C,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,oBAAqB,MAAc,SAA0B;AACjE,QAAI,CAAC,KAAK,OAAO,qBAAqB,MAAM,IAAI,EAAE,SAAS,OAAO,GAAG;AACjE,WAAK,qBAAqB,IAAW,yBAAyB,MAAM,OAAO,CAAC;AAC5E,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,iBAAkB,MAAc,SAA2C;AAC/E,QAAI,CAAC,KAAK,oBAAoB,MAAM,uBAAuB,GAAG;AAC1D,WAAK,qBAAqB,IAAW,qBAAqB,CAAC;AAC3D,aAAO;AAAA,IACX;AAEA,QAAK,QAAQ,WAAsB,OAAO,mBAAmB,IAAI,GAAG;AAChE,WAAK,qBAAqB,IAAW,sBAAsB,CAAC;AAC5D,aAAO;AAAA,IACX;AAEA,QAAI,QAAQ,eAAe,UAAU,CAAC,iBAAiB,SAAS,QAAQ,cAAwB,GAAG;AAC/F,WAAK,qBAAqB,IAAW,0BAA0B,CAAC;AAChE,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,aAAc,KAAa,gBAAyB,eAAiC;AACzF,UAAM,qBAAqB,KAAK,SAAS,kBAAkB;AAC3D,UAAM,oBAAoB,KAAK,SAAS,kBAAkB;AAC1D,UAAM,0BAA0B,CAAC,sBAAsB,CAAC;AAExD,QAAI,2BAA4B,IAAI,WAAW,OAAO,KAAK,CAAC,eAAgB;AACxE,aAAO;AAAA,IACX;AAEA,QAAI,QAA4B;AAChC,QAAI,oBAAoB;AACpB,eAAS;AACT,kBAAY;AAAA,IAChB,WAAW,mBAAmB;AAC1B,eAAS;AACT,kBAAY;AAAA,IAChB;AAEA,YAAQ,iBAAiB,YAAa,QAAS,KAAK,GAAG;AAAA,EAC3D;AAAA;AAAA,EAGQ,gBAAiB,SAAkB,SAAwD;AAC/F,UAAM,aAAa;AACnB,UAAM,oBAAoB,YAAY,YAAY,CAAC,MAAM,QAAQ,WAAW,QAAQ;AACpF,UAAM,oBAAoB,YAAY,YAAY,CAAC,KAAK,eAAe,WAAW,QAAQ;AAE1F,QAAI,qBAAqB,mBAAmB;AACxC,YAAM,mBAAmB,oBAAoB,WAAW,WAAW,WAAW;AAC9E,WAAK,qBAAqB,IAAW,kBAAkB,OAAO,gBAAgB,CAAC,CAAC;AAChF,aAAO,EAAE,KAAK,MAAM,cAAc,CAAC,EAAE;AAAA,IACzC;AAEA,UAAM,oBAAoB,KAAK,eAAe,OAAO;AACrD,UAAM,EAAE,UAAU,SAAS,IAAI,cAAc,CAAC;AAC9C,QAAI,MAA6B;AAEjC,QAAI,qBAAqB,CAAC,YAAY,CAAC,UAAU;AAC7C,eAAS;AAAA,IACb,WAAW,mBAAmB;AAC1B,aAAO;AACP,eAAS;AAAA,IACb,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC/B,aAAO;AAAA,IACX,OAAO;AACH,aAAO,CAAC,OAAO;AAAA,IACnB;AAEA,UAAM,eAA0B,CAAC;AAEjC,QAAI,CAAC,QAAQ,YAAY;AACrB,UAAI,MAAM;AACN,qBAAa,KAAK,IAAI;AAAA,MAC1B;AACA,UAAI,QAAQ;AACR,YAAI,CAAC,MAAM;AACP,uBAAa,KAAK,CAAC,CAAC;AAAA,QACxB;AACA,qBAAa,KAAK,MAAM;AAAA,MAC5B;AACA,aAAO,EAAE,KAAK,OAAO,aAAa;AAAA,IACtC;AAEA,UAAM,aAAa,EAAE,MAAM,OAAO;AAClC,QAAI,aAAsB;AAI1B,QAAI,QAAQ,kBAAkB,QAAQ,mBAAmB,UAAU;AAC/D,YAAM,gBAAgB,KAAK,SAAS,mBAAmB,QAAQ,cAAwB;AAEvF,UAAI,CAAC,eAAe;AAChB,aAAK,qBAAqB,IAAW,0BAA0B,CAAC;AAChE,eAAO,EAAE,KAAK,MAAM,aAAa;AAAA,MACrC;AAEA,UAAI;AACA,qBAAa,cAAc,OAAO,UAAU;AAAA,MAChD,QAAQ;AACJ,aAAK,qBAAqB,IAAW,sBAAsB,CAAC;AAC5D,eAAO,EAAE,KAAK,MAAM,aAAa;AAAA,MACrC;AAAA,IACJ;AASA,iBAAa,KAAK,CAAC,UAAU,CAAC;AAE9B,WAAO,EAAE,KAAK,OAAO,aAAa;AAAA,EACtC;AAAA;AAAA,EAGQ,kBAAmB,MAAc,YAAqB,SAA0D;AACpH,QAAI;AAEJ,QAAI,CAAC,KAAK,iBAAiB,MAAM,OAAO,GAAG;AACvC,aAAO,EAAE,KAAK,KAAK,OAAO,SAAS,SAAS,MAAM;AAAA,IACtD;AASA,QAAI,QAAQ,kBAAkB,QAAQ,mBAAmB,UAAU;AAC/D,YAAM,gBAAgB,KAAK,SAAS,mBAAmB,QAAQ,cAAwB;AAEvF,UAAI,CAAC,eAAe;AAChB,eAAO,EAAE,KAAK,IAAW,0BAA0B,EAAE;AAAA,MACzD;AAEA,UAAI;AACA,yBAAiB,cAAc,OAAO,UAA+C;AAAA,MACzF,QAAQ;AACJ,eAAO,EAAE,KAAK,IAAW,sBAAsB,EAAE;AAAA,MACrD;AAAA,IACJ,OAAO;AACH,uBAAiB;AAAA,IACrB;AACA,WAAO,EAAE,KAAK,OAAO,MAAM,eAAe,MAAM,QAAQ,eAAe,OAAO;AAAA,EAClF;AAAA;AAAA,EAGQ,QAAS,KAA+D;AAC5E,QAAI;AACA,aAAO,KAAK,SAAS,WAAW,OAAO,GAAG;AAAA,IAC9C,QAAQ;AACJ,WAAK,WAAW,iCAAiC,0BAA0B,IAAI;AAAA,IACnF;AAAA,EACJ;AAAA;AAAA,EAGQ,QAAS,KAAyB;AACtC,QAAI;AACA,aAAO,KAAK,SAAS,WAAW,OAAO,GAAwC;AAAA,IACnF,QAAQ;AACJ,WAAK,WAAW,iCAAiC,iCAAiC;AAClF,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA,EAGQ,WAAY,UAAkB,SAAiB,SAAkB,OAAa;AAClF,SAAK,KAAK,OAAO;AAEjB,SAAK,WAAW,CAAC;AAEjB,QAAI,CAAC,QAAQ;AACT,WAAK,MAAM,CAAC,cAAc,OAAO,EAAE,SAAS,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACpE;AAEA,UAAM,yBAAyB,IAAW,uBAAuB,UAAU,OAAO;AAGlF,QAAI,KAAK,OAAO,gBAAgB;AAC5B,WAAK,OAAO,eAAe,QAAQ,sBAAsB;AACzD,WAAK,OAAO,iBAAiB;AAAA,IACjC;AAEA,QAAI,KAAK,SAAS,SAAS;AACvB,WAAK,SAAS,QAAQ,sBAAsB;AAAA,IAChD;AAEA,SAAK,IAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGQ,MAAO,KAAuB;AAClC,QAAI,KAAK;AACL,WAAK,SAAS,KAAK,KAAK,QAAQ,GAAG,CAAC;AAAA,IACxC;AAEA,QAAI,KAAK,OAAO,KAAK,IAAI,eAAe,KAAK,KAAK,OAAO,WAAW;AAChE,aAAO,KAAK,SAAS,SAAS,GAAG;AAC7B,aAAK,IAAI,KAAK,KAAK,SAAS,MAAM,CAAyB;AAAA,MAC/D;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,MAAc,yBAA0B,OAA6B;AACjE,UAAM,WAAqC,CAAC;AAE5C,eAAW,QAAQ,OAAO,OAAO,KAAK,MAAM,GAAG;AAC3C,UAAI,KAAK,SAAS;AACd,iBAAS,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,MACrC;AAAA,IACJ;AACA,eAAW,OAAO,OAAO,OAAO,KAAK,SAAS,GAAG;AAC7C,UAAI,IAAI,WAAW,SAAS;AACxB,iBAAS,KAAK,IAAI,UAAU,QAAQ,KAAK,CAAC;AAAA,MAC9C;AAAA,IACJ;AAEA,UAAM,QAAQ,WAAW,QAAQ;AACjC,SAAK,YAAY,CAAC;AAClB,SAAK,SAAS,CAAC;AAAA,EACnB;AAAA;AAAA,EAGQ,cAAqB;AACzB,SAAK,WAAW,CAAC;AACjB,SAAK,mBAAmB,MAAM;AAC9B,SAAK,oBAAoB,MAAM;AAC/B,SAAK,YAAY,CAAC;AAClB,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,CAAC;AACjB,SAAK,YAAY,oBAAI,IAAI;AAGzB,SAAK,SAAS;AAAA,MACV,OAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,UAAsB;AAAA,MACtB,cAAsB;AAAA,MACtB,gBAAsB;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA,EAGQ,mBAA0B;AAC9B,SAAK,IAAK,SAAS,MAAM,KAAK,UAAU;AACxC,SAAK,IAAK,UAAU,OAAO,UAAsB,KAAK,WAAW,KAAK;AACtE,SAAK,IAAK,YAAY,CAAC,UAAwB,KAAK,aAAa,KAAK;AACtE,SAAK,IAAK,UAAU,OAAO,UAAiB,KAAK,WAAW,KAAK;AAAA,EACrE;AAAA;AAAA,EAGQ,YAAmB;AACvB,UAAM,EAAE,oBAAoB,aAAa,QAAQ,WAAW,YAAY,SAAS,MAAM,IAAI,KAAK;AAChG,UAAM,iBAAiB,KAAK,IAAK,UAAU,MAAM,GAAG,IAAI,CAAC;AACzD,UAAM,sCAAsC,mBAAmB,WAAW;AAE1E,SAAK,KAAK,qDAAqD,cAAc,GAAG;AAEhF,QAAI,CAAC,qCAAqC;AACtC,UAAI,mBAAmB,QAAQ;AAC3B,aAAK,SAAS,aAAa,IAAI,eAAe;AAAA,MAClD,OAAO;AACH,cAAM,6BAA6B,IAAW,2BAA2B;AACzE,aAAK,qBAAqB,0BAA0B;AAEpD,YAAI,KAAK,OAAO,gBAAgB;AAC5B,eAAK,OAAO,eAAe,QAAQ,0BAA0B;AAC7D,eAAK,OAAO,iBAAiB;AAAA,QACjC;AAEA,YAAI,SAAS;AACT,kBAAQ,0BAA0B;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,WAAW,UAAU;AACrB,WAAK,IAAK,aAAa;AAAA,IAC3B;AAEA,UAAM,iBAAiB;AAAA,MACnB,GAAG;AAAA,MACH,GAAG,KAAK;AAAA,MACR,GAAI,SAAS,EAAE,QAAQ,aAAa,UAAU,IAAI,CAAC;AAAA,IACvD;AACA,UAAM,iBAAiB,KAAK,QAAQ,CAAC,cAAc,OAAO,OAAO,cAAc,CAAC;AAEhF,QAAI,gBAAgB;AAEhB,WAAK,IAAK,KAAK,cAAsC;AAAA,IACzD;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAY,OAAkC;AAChD,SAAK,KAAK,kCAAkC,KAAK;AAEjD,UAAM,KAAK,yBAAyB,IAAI,eAAe,mBAAmB,CAAC;AAG3E,SAAK,KAAK,OAAO,aAAa,KAAK,OAAO,yBACtC,KAAK,SAAS,kBACb,KAAK,SAAS,eAAe,KAC7B,KAAK,OAAO,uBAAuB,KAAK,SAAS,eAClD,CAAC,KAAK,OAAO,iBAAiB;AAC9B,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,QAAQ,WAAW,MAAM;AACjC,aAAK,aAAa;AAAA,MACtB,GAAG,KAAK,SAAS,iBAAiB;AAAA,IACtC,OAAO;AAEH,UAAI,KAAK,SAAS,SAAS;AACvB,aAAK,SAAS,QAAQ;AAAA,MAC1B;AACA,UAAI,KAAK,OAAO,cAAc;AAC1B,aAAK,OAAO,aAAa,UAAU,MAAkB;AACrD,aAAK,OAAO,eAAe;AAAA,MAC/B;AACA,WAAK,YAAY;AACjB,WAAK,MAAM;AAAA,IACf;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aAAc,OAAoC;AACpD,UAAM,OAAO,KAAK,QAAQ,MAAM,IAAI;AAEpC,SAAK,KAAK,gCAAgC,IAAI;AAE9C,UAAM,cAAc,KAAK,CAAC;AAC1B,UAAM,kBAA8D;AAAA,MAChE,CAAC,cAAc,OAAO,GAAQ,MAAM,KAAK,kBAAkB,IAA6C;AAAA,MACxG,CAAC,cAAc,KAAK,GAAU,MAAM,KAAK,gBAAgB,IAAkD;AAAA,MAC3G,CAAC,cAAc,SAAS,GAAM,MAAM,KAAK,oBAAoB,IAAkD;AAAA,MAC/G,CAAC,cAAc,OAAO,GAAQ,MAAM,KAAK,kBAAkB;AAAA,MAC3D,CAAC,cAAc,KAAK,GAAU,MAAM,KAAK,gBAAgB,IAAwG;AAAA,MACjK,CAAC,cAAc,UAAU,GAAK,MAAM,KAAK,qBAAqB,IAAiC;AAAA,MAC/F,CAAC,cAAc,YAAY,GAAG,MAAM,KAAK,uBAAuB,IAAyB;AAAA,MACzF,CAAC,cAAc,SAAS,GAAM,MAAM,KAAK,oBAAoB,IAAiC;AAAA,MAC9F,CAAC,cAAc,KAAK,GAAU,MAAM,KAAK,gBAAgB,IAAgG;AAAA,MACzJ,CAAC,cAAc,MAAM,GAAS,MAAM,KAAK,iBAAiB,IAAwF;AAAA;AAAA,MAElJ,CAAC,cAAc,UAAU,GAAK,MAAM,KAAK,qBAAqB,IAAiC;AAAA;AAAA,MAE/F,CAAC,cAAc,YAAY,GAAG,MAAM,KAAK,uBAAuB,IAAyB;AAAA,MACzF,CAAC,cAAc,UAAU,GAAK,MAAM,KAAK,qBAAqB,IAAgG;AAAA;AAAA;AAAA,IAGlK;AACA,UAAM,UAAU,gBAAgB,WAAW;AAC3C,UAAM,WAAW;AAEjB,QAAI,CAAC,SAAS;AACV,aAAO,KAAK,WAAW,UAAU,yCAAyC,WAAW,GAAG;AAAA,IAC5F;AAEA,UAAM,gBAAiB,CAAC,cAAc,SAAS,cAAc,SAAS,EAAe,SAAS,WAAW;AACzG,UAAM,mBAAmB,CAAC,iBAAiB,gBAAgB,cAAc;AAEzE,QAAI,iBAAiB,KAAK,OAAO,WAAW;AACxC,aAAO,KAAK,WAAW,UAAU,qBAAqB,WAAW,iCAAiC;AAAA,IACtG;AAEA,QAAI,oBAAoB,CAAC,KAAK,OAAO,WAAW;AAC5C,aAAO,KAAK,WAAW,UAAU,qBAAqB,WAAW,kCAAkC;AAAA,IACvG;AAEA,QAAI,KAAK,kBAAkB,IAAI,GAAG;AAC9B,YAAM,QAAQ;AAAA,IAClB;AAAA,EACJ;AAAA;AAAA,EAGA,kBAAmB,CAAC,aAAa,SAAS,GAAuB;AAC7D,UAAM,8BAA+B;AAAA,MACjC,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAClB,EAAe,SAAS,WAAqB;AAE7C,QAAI,CAAC,6BAA6B;AAC9B,aAAO;AAAA,IACX;AAEA,QAAI,gBAAgB,cAAc,UAAU,KAAK,OAAO,SAAmB,GAAG;AAC1E,aAAO;AAAA,IACX;AAEA,QAAI,KAAK,UAAU,SAAmB,GAAG;AACrC,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAmB,CAAC,EAAE,WAAW,OAAO,GAAyD;AACnG,SAAK,OAAO,YAAY;AACxB,SAAK,OAAO,uBAAuB;AAEnC,QAAI,KAAK,OAAO,sBAAsB;AAClC,WAAK,OAAO,uBAAuB;AAEnC,UAAI,KAAK,SAAS,oBAAoB;AAClC,cAAM,KAAK,SAAS,mBAAmB,OAA6C;AAAA,MACxF;AAGA,YAAM,QAAQ,WAAW,CAAC,KAAK,oBAAoB,GAAG,KAAK,oBAAoB,CAAC,CAAC;AAAA,IACrF,OAAO;AAEH,WAAK,OAAO,eAAgB,UAAU,OAA6C;AACnF,WAAK,OAAO,iBAAiB;AAAA,IACjC;AAGA,SAAK,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAiB,CAAC,EAAE,SAAS,KAAK,GAA8D;AAClG,UAAM,MAAM,IAAW,WAAW,EAAE,OAAO,QAAQ,CAAC;AACpD,QAAI,KAAK,OAAO,gBAAgB;AAC5B,WAAK,OAAO,eAAe,QAAQ,GAAG;AACtC,WAAK,OAAO,iBAAiB;AAAA,IACjC;AACA,QAAI,KAAK,SAAS,SAAS;AACvB,YAAM,KAAK,SAAS,QAAQ,GAAG;AAAA,IACnC;AACA,SAAK,IAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAqB,CAAC,EAAE,YAAY,KAAK,GAA8D;AACzG,QAAI;AAEJ,UAAM,EAAE,QAAQ,UAAU,aAAa,SAAS,YAAY,IAAI,KAAK;AAErE,QAAI,UAAU,aAAa,YAAY,OAAO,gBAAgB,YAAY;AACtE,gBAAU,IAAI,QAAQ,CAAC,YAAY;AAC/B,gBAAQ,YAAY,YAAY,KAAK,CAAC;AAAA,MAC1C,CAAC;AAAA,IACL,WAAW,UAAU,aAAa,UAAU,OAAO,YAAY,UAAU,MAAM,YAAY;AACvF,gBAAU,IAAI,QAAQ,CAAC,YAAY;AAC/B,gBAAQ,YAAY,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,MACtD,CAAC;AAAA,IACL,OAAO;AACH,YAAM,yBAAyB,IAAW,uBAAuB;AAEjE,WAAK,qBAAqB,sBAAsB;AAChD,WAAK,IAAK,KAAK,KAAK,QAAQ;AAAA,QACxB,cAAc;AAAA,QACd,EAAE,SAAS,uBAAuB,QAAQ;AAAA,QAC1C;AAAA,MACJ,CAAC,CAAyB;AAE1B,UAAI,SAAS;AACT,cAAM,QAAQ,sBAAsB;AAAA,MACxC;AAEA,aAAO,KAAK,IAAK,MAAM;AAAA,IAC3B;AAEA,QAAI;AACA,YAAM,MAAM,MAAM;AAGlB,WAAK,IAAK,KAAK,KAAK,QAAQ,CAAC,cAAc,cAAc,KAAK,CAAC,CAAC,CAAC,CAAyB;AAAA,IAC9F,QAAQ;AACJ,YAAM,0BAA0B,IAAW,wBAAwB;AAEnE,WAAK,qBAAqB,uBAAuB;AACjD,WAAK,IAAK,KAAK,KAAK,QAAQ;AAAA,QACxB,cAAc;AAAA,QACd,EAAE,SAAS,wBAAwB,QAAQ;AAAA,QAC3C;AAAA,MACJ,CAAC,CAAyB;AAE1B,UAAI,SAAS;AACT,cAAM,QAAQ,uBAAuB;AAAA,MACzC;AAEA,WAAK,IAAK,MAAM;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoC;AACtC,QAAI,CAAC,KAAK,OAAO,iBAAiB;AAC9B,WAAK,OAAO,kBAAkB;AAC9B,WAAK,MAAM,CAAC,cAAc,SAAS,CAAC,GAAG,4BAA4B,CAAC;AAAA,IACxE;AACA,SAAK,OAAO,YAAY;AACxB,SAAK,IAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAiB,CAAC,EAAE,aAAa,WAAW,SAAS,OAAO,UAAU,QAAQ,GAAoH;AACpM,UAAM,eAAe,EAAE,OAAO,SAAS,UAAU,SAAS;AAC1D,UAAM,sBAA6C;AAAA,MAC/C,CAAC,cAAc,SAAS,GAAG,IAAW,eAAe,YAAY;AAAA,MACjE,CAAC,cAAc,WAAW,GAAG,IAAW,iBAAiB,YAAY;AAAA,MACrE,CAAC,cAAc,OAAO,GAAG,IAAW,aAAa,YAAY;AAAA,MAC7D,CAAC,cAAc,QAAQ,GAAG,IAAW,cAAc,YAAY;AAAA,MAC/D,CAAC,cAAc,UAAU,GAAG,IAAW,gBAAgB,YAAY;AAAA;AAAA,MAEnE,CAAC,cAAc,IAAI,GAAG,IAAW,UAAU,YAAY;AAAA,IAC3D;AACA,UAAM,eAAe,oBAAoB,WAAW;AAEpD,QAAI,CAAC,cAAc;AACf,aAAO,KAAK,WAAW,iCAAiC,gCAAgC;AAAA,IAC5F;AAEA,QAAI,gBAAgB,cAAc,MAAM;AACpC,YAAM,OAAO,KAAK,OAAO,SAAS;AAClC,UAAI,MAAM,SAAS;AACf,cAAM,KAAK,QAAQ,YAAY;AAAA,MACnC;AACA,aAAO,KAAK,OAAO,SAAS;AAAA,IAChC,OAAO;AACH,YAAM,MAAM,KAAK,UAAU,SAAS;AACpC,UAAI,KAAK,WAAW,SAAS;AACzB,cAAM,IAAI,UAAU,QAAQ,YAAY;AAAA,MAC5C;AACA,aAAO,KAAK,UAAU,SAAS;AAAA,IACnC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAsB,CAAC,EAAE,WAAW,cAAc,GAA6C;AACjG,UAAM,EAAE,OAAO,iBAAiB,UAAU,IAAI,KAAK,UAAU,SAAS;AACtE,UAAM,eAA0C;AAAA,MAC5C,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,WAAW,CAAC,UAAU,OAAO;AAAA,IACjC;AACA,UAAM,kBAAkB,KAAK,oBAAoB,OAAO,eAAe;AAEvE,SAAK,mBAAmB,IAAI,gBAAgB,YAAY;AACxD,SAAK,oBAAoB,IAAI,iBAAiB,YAAY;AAE1D,QAAI,UAAU,WAAW;AACrB,YAAM,UAAU,UAAU,EAAE,OAAO,WAAW,gBAAgB,gBAAgB,CAAC;AAAA,IACnF;AAEA,WAAO,KAAK,UAAU,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBAAwB,CAAC,EAAE,SAAS,GAAqC;AAC3E,UAAM,EAAE,OAAO,iBAAiB,UAAU,IAAI,KAAK,UAAU,SAAS;AACtE,UAAM,kBAAkB,KAAK,oBAAoB,OAAO,eAAe;AACvE,UAAM,iBAAiB,KAAK,oBAAoB,IAAI,eAAe,EAAG;AACtE,SAAK,oBAAoB,OAAO,eAAe;AAC/C,SAAK,mBAAmB,OAAO,cAAc;AAE7C,QAAI,UAAU,WAAW;AACrB,YAAM,UAAU,UAAU,EAAE,OAAO,UAAU,CAAC;AAAA,IAClD;AAEA,WAAO,KAAK,UAAU,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAqB,CAAC,EAAE,WAAW,aAAa,GAA6C;AAC/F,UAAM,EAAE,OAAO,UAAU,IAAI,KAAK,UAAU,SAAS;AAErD,QAAI,WAAW,WAAW;AACtB,YAAM,UAAU,UAAU,EAAE,OAAO,WAAW,cAAc,CAAC;AAAA,IACjE;AAEA,WAAO,KAAK,UAAU,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAiB,CAAC,EAAE,gBAAgB,eAAe,SAAS,UAAU,QAAQ,GAA4G;AAC5L,UAAM,eAAe,KAAK,mBAAmB,IAAI,cAAc;AAE/D,QAAI,CAAC,cAAc;AACf;AAAA,IACJ;AAEA,QAAI,OAAO;AACX,QAAI,SAAS;AAIb,QAAI,QAAQ,YAAY;AACpB,YAAM,aAAa,SAAU,CAAC;AAC9B,YAAM,iBAAiB,KAAK,kBAAkB,UAAU,YAAY,OAAkC;AAEtG,UAAI,eAAe,KAAK;AAKpB,eAAO,KAAK,KAAM,eAAe,IAAc,OAAO;AAAA,MAC1D;AAEA,aAAO,eAAe;AACtB,eAAS,eAAe;AAAA,IAC5B;AAEA,UAAM,kBAAkB,EAAE,SAA6C,UAAU,MAAM,UAAU,OAAO;AACxG,UAAM,mBAAmB,aAAa,UAAU,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;AAE7E,UAAM,QAAQ,IAAI,gBAAgB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAkB,CAAC,EAAE,WAAW,SAAS,UAAU,QAAQ,GAAoG;AACjK,QAAI,OAAO;AACX,QAAI,SAAS;AAIb,QAAI,QAAQ,YAAY;AACpB,YAAM,aAAa,SAAU,CAAC;AAC9B,YAAM,iBAAiB,KAAK,kBAAkB,UAAU,YAAY,OAAkC;AAEtG,UAAI,eAAe,KAAK;AACpB,aAAK,KAAM,eAAe,IAAc,OAAO;AAC/C,aAAK,OAAO,WAAW,eAAe;AACtC,cAAM,KAAK,OAAO,SAAS,EAAE,QAAQ,IAAW,UAAU;AAAA,UACtD;AAAA,UACA,OAAY;AAAA,UACZ,UAAY,CAAE,eAAe,IAAc,OAAO;AAAA,UAClD,UAAY;AAAA,QAChB,CAAC,CAAC;AACF,eAAO,KAAK,OAAO,SAAS;AAE5B;AAAA,MACJ;AAEA,aAAO,eAAe;AACtB,eAAS,eAAe;AAAA,IAC5B;AAEA,UAAM,kBAA8B,EAAE,SAA6C,UAAU,MAAM,UAAU,OAAO;AAEpH,QAAI,QAAQ,UAAU;AAClB,YAAM,KAAK,OAAO,SAAS,EAAE,WAAY,eAAe;AAAA,IAC5D,OAAO;AAEH,YAAM,KAAK,OAAO,SAAS,EAAE,UAAU,eAAe;AACtD,aAAO,KAAK,OAAO,SAAS;AAAA,IAChC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAsB,CAAC,EAAE,WAAW,cAAc,GAA6C;AACjG,UAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,KAAK,UAAU,SAAS;AAE9D,SAAK,SAAS,cAAc,IAAI,EAAE,IAAI,gBAAgB,WAAW,CAAC,UAAU,GAAG,GAAG,QAAQ;AAC1F,SAAK,SAAS,KAAK,IAAI,KAAK,SAAS,cAAc;AACnD,SAAK,UAAU,IAAI,KAAK;AAExB,QAAI,WAAW,WAAW;AACtB,YAAM,UAAU,UAAU,EAAE,OAAO,WAAW,eAAe,CAAC;AAAA,IAClE;AAEA,WAAO,KAAK,UAAU,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBAAwB,CAAC,EAAE,SAAS,GAAqC;AAC3E,UAAM,EAAE,OAAO,UAAU,IAAI,KAAK,UAAU,SAAS;AAErD,WAAO,KAAK,SAAS,KAAK,SAAS,KAAK,EAAE,EAAE;AAC5C,WAAO,KAAK,SAAS,KAAK;AAE1B,QAAI,KAAK,UAAU,IAAI,KAAK,GAAG;AAC3B,WAAK,UAAU,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,WAAW,WAAW;AACtB,YAAM,UAAU,UAAU,EAAE,OAAO,UAAU,CAAC;AAAA,IAClD;AAEA,WAAO,KAAK,UAAU,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAsB,CAAC,EAAE,WAAW,gBAAgB,SAAS,UAAU,QAAQ,GAA4G;AAC7L,UAAM,OAAO;AACb,UAAM,wBAAwB,CAAC,EAAE,OAAO,SAAAA,UAAS,UAAAC,WAAU,UAAAC,UAAS,MAAiC;AACjG,YAAM,UAAqB;AAAA,QACvB,cAAc;AAAA,QACd,cAAc;AAAA,QACd;AAAA,QACAF,YAAW,CAAC;AAAA,QACZ,SAAS;AAAA,MACb;AAEA,UAAI,MAAM,QAAQC,SAAQ,GAAG;AACzB,gBAAQ,KAAKA,SAAQ;AAAA,MACzB;AAEA,UAAI,KAAK,eAAeC,SAAQ,GAAG;AAC/B,YAAI,CAAC,MAAM,QAAQD,SAAQ,GAAG;AAC1B,kBAAQ,KAAK,CAAC,CAAC;AAAA,QACnB;AACA,gBAAQ,KAAKC,SAAQ;AAAA,MACzB;AAEA,WAAK,MAAM,OAAO;AAAA,IACtB;AAEA,QAAI,CAAC,KAAK,SAAS,cAAc,GAAG;AAChC,WAAK,KAAK,eAAe,wBAAwB;AACjD,aAAO,sBAAsB,EAAE,OAAO,+BAA+B,CAAC;AAAA,IAC1E;AAEA,QAAI,OAAO;AACX,QAAI,SAAS;AAIb,QAAI,SAAS,YAAY;AACrB,YAAM,aAAa,SAAU,CAAC;AAC9B,YAAM,iBAAiB,KAAK,kBAAkB,UAAU,YAAY,OAAkC;AAGtG,UAAI,eAAe,KAAK;AACpB,aAAK,KAAM,eAAe,IAAc,OAAO;AAE/C,YAAI,eAAe,eAAsB,sBAAsB;AAE3D,iBAAO,KAAK;AAAA,YAAW;AAAA,YACnB;AAAA,UAAmE;AAAA,QAC3E;AAEA,eAAO,sBAAsB;AAAA,UACzB;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAE,eAAe,IAAc,OAAO;AAAA,QACpD,CAAC;AAAA,MACL;AAEA,aAAO,eAAe;AACtB,eAAS,eAAe;AAAA,IAC5B;AAEA,UAAM,yBAAyB,CAAC,WAAiD;AAC7E,YAAM,UAAU,QAAQ,WAAW,CAAC;AACpC,YAAM,EAAE,YAAY,gBAAgB,YAAY,UAAU,IAAI;AAI9D,UAAI,cAAc,CAAC,KAAK,iBAAiB,UAAU,OAAkC,GAAG;AACpF,YAAI,KAAK,OAAO,SAAS,iBAAwB,sBAAsB;AAEnE,iBAAO,KAAK;AAAA,YAAW;AAAA,YACnB;AAAA,UAAoE;AAAA,QAC5E;AAEA,eAAO,sBAAsB;AAAA,UACzB,SAAU;AAAA,UACV,OAAU;AAAA,UACV,UAAU,CAAC,KAAK,OAAO,SAAS,MAAO,OAAO;AAAA,QAClD,CAAC;AAAA,MACL;AAEA,YAAM,EAAE,KAAK,aAAa,IAAI,SAAS,KAAK,gBAAgB,QAA8B,OAAkC,IAAI,CAAC;AAEjI,UAAI,KAAK;AACL,eAAO,sBAAsB;AAAA,UACzB,SAAU;AAAA,UACV,OAAU;AAAA,UACV,UAAU,CAAC,KAAK,OAAO,SAAS,MAAO,OAAO;AAAA,QAClD,CAAC;AAAA,MACL;AAEA,YAAM,iBAA0C;AAAA,QAC5C,GAAG;AAAA,QACH,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,QACnC,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,QAC3C,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,QACnC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,QACjC,GAAG,KAAK,sBAAsB,OAAkC;AAAA,MACpE;AAGA,WAAK,MAAM,CAAC,cAAc,OAAO,WAAW,gBAAgB,GAAI,gBAAgB,CAAC,CAAE,CAAC;AAAA,IACxF;AAEA,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,SAAS,cAAc,EAAE,UAAU,CAAC,EAAE;AAAA,QAC5D;AAAA,QACA,UAAgB;AAAA,QAChB,UAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,eAAgB;AAAA,MACpB,CAAC;AACD,6BAAuB,MAAM;AAAA,IACjC,SAAS,GAAG;AACR,4BAAsB,CAAwB;AAAA,IAClD;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAY,OAA6B;AAC3C,SAAK,KAAK,iBAAiB;AAC3B,UAAM,iBAAiB,IAAW,eAAe,KAAK;AAEtD,UAAM,KAAK,yBAAyB,cAAc;AAElD,QAAI,KAAK,OAAO,gBAAgB;AAC5B,WAAK,OAAO,eAAe,QAAQ,cAAc;AACjD,WAAK,OAAO,iBAAiB;AAAA,IACjC;AAEA,QAAI,KAAK,SAAS,SAAS;AACvB,WAAK,SAAS,QAAQ,cAAc;AAAA,IACxC;AAAA,EACJ;AAAA;AAAA,EAGA,eAAsB;AAClB,SAAK,KAAK,2BAA2B;AAErC,QAAI,KAAK,SAAS,aAAa;AAC3B,WAAK,SAAS,YAAY;AAAA,IAC9B;AAEA,SAAK,OAAO;AACZ,SAAK,MAAM,aAAa;AAAA,MACpB,KAAK,KAAK;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,IAClB,CAAC;AACD,SAAK,iBAAiB;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,sBAAsC;AACxC,QAAI;AACJ,UAAM,OAAO,IAAI,IAAI,KAAK,kBAAkB;AAE5C,SAAK,mBAAmB,MAAM;AAC9B,SAAK,oBAAoB,MAAM;AAE/B,eAAW,OAAO,KAAK,OAAO,GAAG;AAC7B,UAAI,IAAI,UAAU;AAClB,aAAO,KAAK;AACR,YAAI;AACA,gBAAM,KAAK,UAAU,IAAI,OAAO,IAAI,UAAU,CAAC,GAAG,IAAI,eAAe;AAAA,QACzE,SAAS,KAAK;AACV,eAAK,KAAK,gCAAgC,IAAI,KAAK,IAAI,GAAG;AAE1D,cAAI,KAAK,SAAS,SAAS;AACvB,iBAAK,SAAS,QAAQ,GAAY;AAAA,UACtC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBAAsC;AACxC,UAAM,OAAO,KAAK,UACd,KAAK,KAAK;AAEd,SAAK,WAAW,CAAC;AACjB,SAAK,YAAY,oBAAI,IAAI;AAEzB,eAAW,WAAW,IAAI;AACtB,UAAI;AACA,cAAM,KAAK,SAAS,SAAS,KAAK,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,OAAO,EAAE,OAAO;AAAA,MAClF,SAAS,KAAK;AACV,aAAK,KAAK,qCAAqC,OAAO,IAAI,GAAG;AAE7D,YAAI,KAAK,SAAS,SAAS;AACvB,eAAK,SAAS,QAAQ,GAAY;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAqB,OAAe,SAA4C;AAC5E,WAAO,GAAG,KAAK,GAAG,UAAU,IAAI,KAAK,UAAU,OAAO,CAAC,KAAK,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAsC;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,WAAY,YAA6C;AACrD,QAAI,KAAK,eAAe,UAAU,GAAG;AACjC,WAAK,WAAW,EAAE,GAAG,KAAK,UAAU,GAAG,WAA2B;AAClE,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAA8B;AAC1B,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA;AAAA,EAGA,eAA+B;AAC3B,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,QAAS,KAAgD;AAC3D,QAAI,KAAK;AACL,WAAK,OAAO;AAAA,IAChB;AAEA,QAAI,CAAC,KAAK,SAAS,OAAO;AACtB,YAAM,eAAe,IAAW,aAAa;AAC7C,WAAK,qBAAqB,YAAY;AACtC,YAAM;AAAA,IACV;AAEA,UAAM,uBAAuB,KAAK,SAAS,SAAS,IAAI,MAC9C,MAAM,QAAQ,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,YAAY,SAAS,IAAK,IAAI,MACzF,OAAO,KAAK,SAAS,gBAAgB,cACrC,OAAO,KAAK,KAAK,SAAS,WAAW,EAAE,SAAS,IAAI,IAAI;AAEjE,QAAI,sBAAsB,KAAK,sBAAsB,GAAG;AACpD,YAAM,yBAAyB,IAAW,uBAAuB;AACjE,WAAK,qBAAqB,sBAAsB;AAChD,YAAM;AAAA,IACV;AAEA,SAAK,gBAAgB;AACrB,SAAK,MAAM,aAAa;AAAA,MACpB,KAAK,KAAK;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,IAClB,CAAC;AAED,QAAI,CAAC,KAAK,KAAK;AACX,YAAM,iBAAiB,IAAW,eAAe;AACjD,WAAK,qBAAqB,cAAc;AACxC,YAAM;AAAA,IACV;AAEA,SAAK,iBAAiB;AAEtB,UAAM,QAAQ,cAAuC;AACrD,SAAK,OAAO,iBAAiB;AAC7B,WAAO,MAAM;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,aAAgC;AAClC,QAAI,KAAK,OAAO,WAAW;AACvB,YAAM,QAAQ,cAAoB;AAClC,WAAK,OAAO,WAAW,EAAE,GAAG,SAAS,OAAO,EAAE;AAC9C,WAAK,OAAO,eAAe;AAE3B,WAAK,OAAO,kBAAkB;AAC9B,WAAK,MAAM,CAAC,cAAc,SAAS,CAAC,GAAG,4BAA4B,CAAC;AAEpE,aAAO,MAAM;AAAA,IAEjB,WAAW,KAAK,KAAK;AACjB,WAAK,IAAI,MAAM;AAAA,IACnB;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,QAAgB;AAEZ,QAAI,CAAC,KAAK,OAAO,aAAa,KAAK,IAAK,eAAe,GAAG;AACtD,WAAK,MAAM,CAAC,cAAc,OAAO,CAAC,GAAG,kBAAkB,CAAC;AACxD,WAAK,OAAO,YAAY;AAAA,IAC5B;AAEA,SAAK,IAAK,MAAM;AAChB,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,OAAO,EAAE;AAE9C,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,UAAW,OAAe,SAAwB,iBAA6E;AACjI,UAAM,4BAA4B,KAAK,eAAe,eAAe;AAErE,QAAI,CAAC,6BAA+B,oBAAqB,QAAY;AACjE,YAAM,oBAAoB,IAAW,kBAAkB,iBAAiB;AACxE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,UAAM,EAAE,OAAO,aAAa,IAAI,mBAAmB,CAAC;AACpD,QAAI,eAAe;AACnB,QAAI,OAAO;AACP,UAAI,CAAC,CAAC,SAAS,UAAU,UAAU,EAAE,SAAS,KAAK,GAAG;AAClD,cAAM,oBAAoB,IAAW,kBAAkB,OAAO;AAC9D,aAAK,qBAAqB,iBAAiB;AAC3C,cAAM;AAAA,MACV;AAEA,qBAAe,UAAU;AAAA,IAC7B;AAEA,QAAI,gBAAgB,OAAO,iBAAiB,WAAW;AACnD,YAAM,oBAAoB,IAAW,kBAAkB,cAAc;AACrE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,QAAI,CAAC,KAAK,cAAc,EAAE,OAAO,cAAc,WAAW,KAAK,GAAG,QAAQ,GAAG;AACzE,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,QAAI,OAAO,YAAY,YAAY;AAC/B,YAAM,kBAAkB,IAAW,gBAAgB;AACnD,WAAK,qBAAqB,eAAe;AACzC,YAAM;AAAA,IACV;AAEA,UAAM,kBAAkB,KAAK,oBAAoB,OAAO,eAAe;AACvE,UAAM,eAAe,KAAK,oBAAoB,IAAI,eAAe;AAEjE,QAAI,gBAAgB,aAAa,UAAU,SAAS,GAAG;AACnD,UAAI,CAAC,aAAa,UAAU,SAAS,OAAO,GAAG;AAC3C,qBAAa,UAAU,KAAK,OAAO;AAAA,MACvC;AAEA,aAAO,EAAE,OAAO,WAAW,GAAG,gBAAgB,aAAa,IAAI,gBAAgB;AAAA,IACnF;AAEA,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,YAAY,cAAsC;AAExD,cAAU,UAAU;AACpB,SAAK,UAAU,KAAK,IAAI,EAAE,OAAO,WAAW,gBAAgB;AAG5D,UAAM,UAAU,EAAE,OAAO,cAAc,GAAG,KAAK,sBAAsB,eAAe,EAAE;AACtF,SAAK,MAAM,CAAC,cAAc,WAAW,OAAO,SAAS,KAAK,CAAC;AAC3D,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,OAAO,SAAS,EAAE;AAEvD,WAAO,UAAU;AAAA,EACrB;AAAA;AAAA,EAGA,MAAM,YAAa,qBAAsC,SAAmE;AACxH,QAAI,CAAC,KAAK,cAAc,MAAM,QAAQ,GAAG;AACrC,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,UAAM,eAAe,KAAK,mBAAmB,IAAI,mBAA6B,KAC1E,KAAK,oBAAoB,IAAI,mBAA6B;AAE9D,QAAI,CAAC,cAAc;AACf,YAAM,2BAA2B,IAAW,yBAAyB;AACrE,WAAK,qBAAqB,wBAAwB;AAClD,YAAM;AAAA,IACV;AAEA,iBAAa,YAAY,OAAO,YAAY,aACtC,aAAa,UAAU,OAAO,CAAC,aAAa,aAAa,OAAO,IAChE,CAAC;AAEP,UAAM,mCAAmC,aAAa,UAAU,SAAS;AAEzE,QAAI,kCAAkC;AAClC,WAAK,OAAO,WAAW,EAAE,GAAG,SAAS,OAAO,EAAE;AAC9C,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,KAAK,UAAU;AAE7B,SAAK,UAAU,KAAK,IAAI,EAAE,OAAO,aAAa,OAAO,WAAW,cAAwC,EAAE;AAG1G,SAAK,MAAM,CAAC,cAAc,aAAa,OAAO,aAAa,EAAE,CAAC;AAC9D,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAa;AAElD,WAAQ,KAAK,UAAU,KAAK,EAAyB,UAAU;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,QAAS,OAAe,SAAmB,iBAAyE;AACtH,QAAI,CAAC,KAAK,cAAc,EAAE,OAAO,cAAc,OAAO,WAAW,MAAM,GAAG,QAAQ,GAAG;AACjF,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,UAAM,4BAA4B,KAAK,eAAe,eAAe;AAErE,QAAI,mBAAmB,CAAC,2BAA2B;AAC/C,YAAM,QAAQ,IAAW,kBAAkB,iBAAiB;AAC5D,WAAK,qBAAqB,KAAK;AAC/B,YAAM;AAAA,IACV;AAEA,QAAI,iBAA0C,CAAC;AAC/C,UAAM,wBAAwB,CAAC,QAAgB,eAAgC;AAC3E,UAAK,gBAA4C,MAAM,GAAG;AACtD,YAAI,MAAM,QAAS,gBAA4C,MAAM,CAAC,KAAO,gBAA4C,MAAM,EAAgB,SAAS,GAAG;AACvJ,yBAAe,MAAM,IAAK,gBAA4C,MAAM;AAAA,QAChF,WAAW,OAAQ,gBAA4C,MAAM,MAAM,YAAY;AACnF,yBAAe,MAAM,IAAI,CAAE,gBAA4C,MAAM,CAAC;AAAA,QAClF,OAAO;AACH,iBAAO;AAAA,QACX;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAEA,QAAI,8BACA,CAAC,sBAAsB,WAAW,QAAQ,KAC1C,CAAC,sBAAsB,kBAAkB,QAAQ,KACjD,CAAC,sBAAsB,oBAAoB,QAAQ,KACnD,CAAC,sBAAsB,YAAY,QAAQ,KAC3C,CAAC,sBAAsB,mBAAmB,QAAQ,KAClD,CAAC,sBAAsB,qBAAqB,QAAQ,IACrD;AACC,YAAM,oBAAoB,IAAW,kBAAkB,iBAAiB;AACxE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,UAAM,EAAE,YAAY,gBAAgB,YAAY,WAAW,YAAY,aAAa,OAAO,IAAI,mBAAmB,CAAC;AAEnH,QAAI,UAAU,OAAO,WAAW,WAAW;AACvC,YAAM,oBAAoB,IAAW,kBAAkB,QAAQ;AAC/D,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAIA,QAAI,cAAc,CAAC,KAAK,iBAAiB,UAAU,eAA0C,GAAG;AAC5F,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,qBAAiB;AAAA,MACb,aAAa;AAAA,MACb,GAAG;AAAA,MACH,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACnC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACrC,GAAG,KAAK,sBAAsB,eAAe;AAAA,IACjD;AAEA,UAAM,EAAE,KAAK,aAAa,IAAI,UAAU,KAAK,gBAAgB,SAAS,cAAc,IAAI,CAAC;AACzF,UAAM,QAAQ,KAAK,UAAU;AAE7B,QAAI,KAAK;AACL,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,SAAK,UAAU,KAAK,IAAI,EAAE,OAAO,WAAW,cAAoC,EAAE;AAClF,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAM;AAC3C,SAAK,MAAM,CAAC,cAAc,SAAS,OAAO,gBAAgB,OAAO,GAAI,gBAAgB,CAAC,CAAE,CAAC;AAEzF,WAAQ,KAAK,UAAU,KAAK,EAAqB,UAAU;AAAA,EAC/D;AAAA;AAAA,EAGA,sBAAsB,iBAAoE;AACtF,UAAM,gBAAyC,CAAC;AAChD,eAAW,OAAO,mBAAmB,CAAC,GAAG;AACrC,UAAI,uBAAuB,KAAK,GAAG,GAAG;AAClC,sBAAc,GAAG,IAAI,gBAAiB,GAAG;AAAA,MAC7C;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,0CAA0C,iBAAgE;AACtG,UAAM;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACP,IAAI,mBAAmB,CAAC;AAExB,UAAM,SAAkC,CAAC;AAEzC,QAAI,mBAAmB;AAAC,aAAO,mBAAmB;AAAA,IAAK;AACvD,QAAI,UAAU;AAAC,aAAO,WAAW;AAAA,IAAK;AACtC,QAAI,aAAa;AAAC,aAAO,cAAc;AAAA,IAAK;AAC5C,QAAI,SAAS;AAAC,aAAO,UAAU;AAAA,IAAQ;AACvC,QAAI,YAAY;AAAC,aAAO,aAAa;AAAA,IAAW;AAChD,QAAI,gBAAgB;AAAC,aAAO,iBAAiB;AAAA,IAAe;AAC5D,QAAI,YAAY;AAAC,aAAO,aAAa;AAAA,IAAW;AAChD,QAAI,WAAW;AAAC,aAAO,YAAY;AAAA,IAAU;AAG7C,WAAO,EAAE,GAAG,QAAQ,GAAG,KAAK,sBAAsB,IAAI,EAAE;AAAA,EAC5D;AAAA;AAAA,EAGA,cAAc,OAAe,SAAmB,iBAA+C;AAC3F,QAAI,CAAC,KAAK,cAAc,EAAE,OAAO,cAAc,OAAO,WAAW,KAAK,GAAG,QAAQ,GAAG;AAChF,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,QAAI,mBAAmB,CAAC,KAAK,eAAe,eAAe,GAAG;AAC1D,YAAM,oBAAoB,IAAW,kBAAkB,iBAAiB;AACxE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,UAAM,EAAE,SAAS,mBAAmB,WAAW,IAAI,mBAAmB,CAAC;AACvE,UAAM,mBAAoB,WAAW,OAAO,YAAY;AACxD,UAAM,4BAA6B,qBAAqB,OAAO,sBAAsB;AAErF,QAAI,oBAAoB,2BAA2B;AAC/C,YAAM,YAAY,mBAAmB,YAAY;AACjD,YAAM,oBAAoB,IAAW,kBAAkB,SAAS;AAChE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAIA,QAAI,cAAc,CAAC,KAAK,iBAAiB,UAAU,eAA0C,GAAG;AAC5F,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,QAAI;AACJ,OAAG;AACC,cAAQ,KAAK,UAAU;AAAA,IAC3B,SAAS,SAAS,KAAK;AAEvB,UAAM,iBAAiB,KAAK,0CAA0C,eAAe;AAErF,UAAM,EAAE,KAAK,aAAa,IAAI,UAAU,KAAK,gBAAgB,SAAS,cAAc,IAAI,CAAC;AAEzF,QAAI,KAAK;AACL,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAGA,SAAK,MAAM,CAAC,cAAc,MAAM,OAAO,gBAAgB,OAAO,GAAI,gBAAgB,CAAC,CAAE,CAAC;AACtF,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAM;AAC3C,SAAK,OAAO,KAAK,IAAI,cAA0B;AAE/C,QAAI,mBAAmB;AACnB,WAAK,OAAO,KAAK,EAAE,aAAa;AAAA,IACpC;AAEA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,KAAM,OAAe,SAAmB,iBAA4D;AACtG,UAAM,QAAQ,KAAK,cAAc,OAAO,SAAS,eAAe;AAChE,WAAO,KAAK,OAAO,KAAK,EAAE;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAiB,OAAe,SAAmB,iBAA8D;AAC7G,QAAI,CAAC,KAAK,oBAAoB,UAAU,8BAA8B,GAAG;AACrE,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,sBAAkB,mBAAmB,CAAC;AACtC,IAAC,gBAA4C,WAAW;AACxD,UAAM,QAAQ,KAAK,cAAc,OAAO,SAAS,eAAe;AAEhE,UAAM,iBAAiB,KAAK,0CAA0C,eAAe;AAGrF,UAAM,KAAK,CAACC,UAAmBC,qBAA2D;AACtF,UAAIA,oBAAmB,CAAC,KAAK,eAAeA,gBAAe,GAAG;AAC1D,cAAM,oBAAoB,IAAW,kBAAkB,iBAAiB;AACxE,aAAK,qBAAqB,iBAAiB;AAC3C,cAAM;AAAA,MACV;AAEA,YAAM,SAAS;AACf,YAAM,EAAE,SAAS,IAAIA,oBAAmB,CAAC;AACzC,UAAI,aAAa,QAAW;AACxB,YAAI,OAAO,aAAa,WAAW;AAC/B,iBAAO,WAAW;AAAA,QACtB,OAAO;AACH,gBAAM,oBAAoB,IAAW,kBAAkB,UAAU;AACjE,eAAK,qBAAqB,iBAAiB;AAC3C,gBAAM;AAAA,QACV;AAAA,MACJ;AAEA,YAAM,EAAE,KAAK,aAAa,IAAID,WAAU,KAAK,gBAAgBA,UAAS,cAAc,IAAI,CAAC;AAEzF,UAAI,KAAK;AACL,cAAM,KAAK,OAAO,SAAS;AAAA,MAC/B;AAGA,WAAK,MAAM,CAAC,cAAc,MAAM,OAAO,gBAAgB,OAAO,GAAI,gBAAgB,CAAC,CAAE,CAAC;AACtF,WAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAM;AAAA,IAC/C;AAEA,WAAO;AAAA,MACH,QAAQ,KAAK,OAAO,KAAK,EAAE;AAAA,MAC3B,UAAU;AAAA,IACd;AAAA,EACJ;AAAA;AAAA,EAGA,OAAQ,OAAe,iBAAkD;AACrE,QAAI,CAAC,KAAK,cAAc,MAAM,QAAQ,KAAK,CAAC,KAAK,oBAAoB,UAAU,gBAAgB,GAAG;AAC9F,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,QAAI,CAAC,SAAS,CAAC,KAAK,OAAO,KAAK,GAAG;AAC/B,YAAM,wBAAwB,IAAW,sBAAsB;AAC/D,WAAK,qBAAqB,qBAAqB;AAC/C,YAAM;AAAA,IACV;AAEA,QAAI,CAAC,KAAK,eAAe,eAAe,KAAM,oBAAqB,QAAW;AAC1E,YAAM,oBAAoB,IAAW,kBAAkB,iBAAiB;AACxE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,QAAI;AACJ,QAAI,KAAK,eAAe,eAAe,KAAK,OAAO,eAAe,KAAK,iBAAiB,MAAM,GAAG;AAC7F,UAAI,CAAC,CAAC,QAAQ,QAAQ,YAAY,EAAE,SAAS,gBAAgB,IAAc,GAAG;AAC1E,cAAM,QAAQ,IAAW,kBAAkB,MAAM;AACjD,aAAK,qBAAqB,KAAK;AAC/B,cAAM;AAAA,MACV;AACA,aAAO,gBAAgB;AAAA,IAC3B;AAGA,UAAM,UAAmC;AAAA,MACrC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAG,KAAK,sBAAsB,eAAe;AAAA,IACjD;AACA,SAAK,MAAM,CAAC,cAAc,QAAQ,OAAO,OAAO,CAAC;AACjD,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAa;AAElD,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,SAAU,OAAe,KAAkB,iBAA2E;AACxH,QAAI,KAAK,SAAS,KAAK,GAAG,WAAW,QAAQ;AACzC,YAAM,4BAA4B,IAAW,0BAA0B;AACvE,WAAK,qBAAqB,yBAAyB;AACnD,YAAM;AAAA,IACV;AAEA,QAAI,OAAO,QAAQ,YAAY;AAC3B,YAAM,kBAAkB,IAAW,gBAAgB;AACnD,WAAK,qBAAqB,eAAe;AACzC,YAAM;AAAA,IACV;AAEA,QAAI,mBAAmB,CAAC,KAAK,eAAe,eAAe,GAAG;AAC1D,YAAM,oBAAoB,IAAW,kBAAkB,iBAAiB;AACxE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,UAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,CAAC;AAC9C,UAAM,iBAAiB,SAAS,CAAC,CAAC,SAAS,UAAU,UAAU,EAAE,SAAS,KAAK;AAC/E,UAAM,kBAAkB,UAAU,CAAC,CAAC,UAAU,cAAc,UAAU,SAAS,MAAM,EAAE,SAAS,MAAM;AAEtG,QAAI,kBAAkB,iBAAiB;AACnC,YAAM,YAAY,iBAAiB,UAAU;AAC7C,YAAM,oBAAoB,IAAW,kBAAkB,SAAS;AAChE,WAAK,qBAAqB,iBAAiB;AAC3C,YAAM;AAAA,IACV;AAEA,QAAI,CAAC,KAAK,cAAc,EAAE,OAAO,cAAc,QAAQ,KAAK,GAAG,WAAW,MAAM,GAAG,QAAQ,GAAG;AAC1F,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,YAAY,cAAqC;AACvD,UAAM,UAAmC;AAAA,MACrC,GAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC1B,GAAK,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC5B,GAAG,KAAK,sBAAsB,eAAe;AAAA,IACjD;AAEA,QAAI,KAAK;AACL,gBAAU,MAAM;AAAA,IACpB;AAEA,SAAK,UAAU,KAAK,IAAI,EAAE,OAAO,WAAW,QAA4C;AAGxF,SAAK,MAAM,CAAC,cAAc,UAAU,OAAO,SAAS,KAAK,CAAC;AAC1D,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAM;AAE3C,WAAO,UAAU;AAAA,EACrB;AAAA;AAAA,EAGA,MAAM,WAAY,OAAiD;AAC/D,QAAI,CAAC,KAAK,cAAc,EAAE,OAAO,cAAc,OAAO,WAAW,MAAM,GAAG,QAAQ,GAAG;AACjF,YAAM,KAAK,OAAO,SAAS;AAAA,IAC/B;AAEA,QAAI,CAAC,KAAK,SAAS,KAAK,GAAG;AACvB,YAAM,iCAAiC,IAAW,+BAA+B;AACjF,WAAK,qBAAqB,8BAA8B;AACxD,YAAM;AAAA,IACV;AAEA,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,YAAY,cAAuC;AAEzD,SAAK,UAAU,KAAK,IAAI,EAAE,OAAO,UAAU;AAG3C,SAAK,MAAM,CAAC,cAAc,YAAY,OAAO,KAAK,SAAS,KAAK,EAAE,EAAE,CAAC;AACrE,SAAK,OAAO,WAAW,EAAE,GAAG,SAAS,MAAM;AAE3C,WAAO,UAAU;AAAA,EACrB;AACJ;AAEA,IAAO,gBAAQ;","names":["details","argsList","argsDict","payload","advancedOptions"]}