@elementor/editor-current-user 0.6.0 → 3.32.0-20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -108,10 +108,15 @@ var useCurrentUserCapabilities = () => {
108
108
  var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
109
109
  function ensureCurrentUser({ queryClient }) {
110
110
  (0, import_editor_v1_adapters.registerDataHook)("after", "editor/documents/attach-preview", async () => {
111
- await queryClient.ensureQueryData({
112
- queryKey: [EDITOR_CURRENT_USER_QUERY_KEY],
113
- queryFn: apiClient.get
114
- });
111
+ try {
112
+ await queryClient.ensureQueryData({
113
+ queryKey: [EDITOR_CURRENT_USER_QUERY_KEY],
114
+ queryFn: getCurrentUser,
115
+ retry: false
116
+ });
117
+ } catch {
118
+ queryClient.setQueryData([EDITOR_CURRENT_USER_QUERY_KEY], null);
119
+ }
115
120
  });
116
121
  return queryClient.getQueryData([EDITOR_CURRENT_USER_QUERY_KEY]);
117
122
  }
package/dist/index.mjs CHANGED
@@ -79,10 +79,15 @@ var useCurrentUserCapabilities = () => {
79
79
  import { registerDataHook } from "@elementor/editor-v1-adapters";
80
80
  function ensureCurrentUser({ queryClient }) {
81
81
  registerDataHook("after", "editor/documents/attach-preview", async () => {
82
- await queryClient.ensureQueryData({
83
- queryKey: [EDITOR_CURRENT_USER_QUERY_KEY],
84
- queryFn: apiClient.get
85
- });
82
+ try {
83
+ await queryClient.ensureQueryData({
84
+ queryKey: [EDITOR_CURRENT_USER_QUERY_KEY],
85
+ queryFn: getCurrentUser,
86
+ retry: false
87
+ });
88
+ } catch {
89
+ queryClient.setQueryData([EDITOR_CURRENT_USER_QUERY_KEY], null);
90
+ }
86
91
  });
87
92
  return queryClient.getQueryData([EDITOR_CURRENT_USER_QUERY_KEY]);
88
93
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-current-user",
3
3
  "description": "Elementor Editor Current User",
4
- "version": "0.6.0",
4
+ "version": "3.32.0-20",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -19,11 +19,11 @@
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",
22
- "url": "https://github.com/elementor/elementor-packages.git",
22
+ "url": "https://github.com/elementor/elementor.git",
23
23
  "directory": "packages/libs/editor-current-user"
24
24
  },
25
25
  "bugs": {
26
- "url": "https://github.com/elementor/elementor-packages/issues"
26
+ "url": "https://github.com/elementor/elementor/issues"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"
@@ -36,9 +36,9 @@
36
36
  "react": "^18.3.1"
37
37
  },
38
38
  "dependencies": {
39
- "@elementor/editor-v1-adapters": "0.12.1",
40
- "@elementor/http-client": "0.3.0",
41
- "@elementor/query": "0.2.4"
39
+ "@elementor/editor-v1-adapters": "3.32.0-20",
40
+ "@elementor/http-client": "3.32.0-20",
41
+ "@elementor/query": "3.32.0-20"
42
42
  },
43
43
  "devDependencies": {
44
44
  "tsup": "^8.3.5"
@@ -0,0 +1,36 @@
1
+ import { registerDataHook } from '@elementor/editor-v1-adapters';
2
+ import { type QueryClient } from '@elementor/query';
3
+
4
+ import { ensureCurrentUser } from '../ensure-current-user';
5
+
6
+ jest.mock( '@elementor/editor-v1-adapters', () => ( {
7
+ ...jest.requireActual( '@elementor/editor-v1-adapters' ),
8
+ registerDataHook: jest.fn(),
9
+ } ) );
10
+
11
+ describe( 'ensureCurrentUser', () => {
12
+ it( 'should not fail the attach preview command is user fetch failed', async () => {
13
+ // Arrange.
14
+ const queryClient = {
15
+ ensureQueryData: jest.fn().mockRejectedValue( new Error( 'Failed to fetch current user' ) ),
16
+ setQueryData: jest.fn(),
17
+ getQueryData: jest.fn().mockReturnValue( null ),
18
+ } as unknown as QueryClient;
19
+
20
+ jest.mocked( registerDataHook ).mockImplementation( ( _hook, _command, callback ) => {
21
+ return callback( {} ) as never;
22
+ } );
23
+
24
+ // Act.
25
+ const result = await ensureCurrentUser( { queryClient } );
26
+
27
+ // Assert.
28
+ expect( queryClient.ensureQueryData ).toHaveBeenCalledWith( {
29
+ queryKey: [ 'editor-current-user' ],
30
+ queryFn: expect.any( Function ),
31
+ retry: false,
32
+ } );
33
+
34
+ expect( result ).toBeNull();
35
+ } );
36
+ } );
@@ -1,15 +1,20 @@
1
1
  import { registerDataHook } from '@elementor/editor-v1-adapters';
2
2
  import { type QueryClient } from '@elementor/query';
3
3
 
4
- import { apiClient } from './api';
4
+ import { getCurrentUser } from './get-current-user';
5
5
  import { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';
6
6
 
7
7
  export function ensureCurrentUser( { queryClient }: { queryClient: QueryClient } ) {
8
8
  registerDataHook( 'after', 'editor/documents/attach-preview', async () => {
9
- await queryClient.ensureQueryData( {
10
- queryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],
11
- queryFn: apiClient.get,
12
- } );
9
+ try {
10
+ await queryClient.ensureQueryData( {
11
+ queryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],
12
+ queryFn: getCurrentUser,
13
+ retry: false,
14
+ } );
15
+ } catch {
16
+ queryClient.setQueryData( [ EDITOR_CURRENT_USER_QUERY_KEY ], null );
17
+ }
13
18
  } );
14
19
 
15
20
  return queryClient.getQueryData( [ EDITOR_CURRENT_USER_QUERY_KEY ] );
@@ -1,22 +0,0 @@
1
-
2
- > @elementor/editor-current-user@0.6.0 build
3
- > tsup --config=../../tsup.build.ts
4
-
5
- CLI Building entry: src/index.ts
6
- CLI Using tsconfig: ../../../tsconfig.json
7
- CLI tsup v8.5.0
8
- CLI Using tsup config: /home/runner/work/elementor-packages/elementor-packages/tsup.build.ts
9
- CLI Target: esnext
10
- CLI Cleaning output folder
11
- ESM Build start
12
- CJS Build start
13
- CJS dist/index.js 4.08 KB
14
- CJS dist/index.js.map 6.06 KB
15
- CJS ⚡️ Build success in 68ms
16
- ESM dist/index.mjs 2.78 KB
17
- ESM dist/index.mjs.map 5.73 KB
18
- ESM ⚡️ Build success in 71ms
19
- DTS Build start
20
- DTS ⚡️ Build success in 8486ms
21
- DTS dist/index.d.mts 608.00 B
22
- DTS dist/index.d.ts 608.00 B
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/use-current-user.ts","../src/api.ts","../src/get-current-user.ts","../src/use-update-current-user.ts","../src/use-suppressed-message.ts","../src/use-current-user-capabilities.ts","../src/ensure-current-user.ts"],"sourcesContent":["export { useSuppressedMessage } from './use-suppressed-message';\nexport { useCurrentUserCapabilities } from './use-current-user-capabilities';\nexport { getCurrentUser } from './get-current-user';\nexport { ensureCurrentUser } from './ensure-current-user';\n","import { useQuery } from '@elementor/query';\n\nimport { getCurrentUser } from './get-current-user';\n\nexport const EDITOR_CURRENT_USER_QUERY_KEY = 'editor-current-user';\n\nexport const useCurrentUser = () =>\n\tuseQuery( {\n\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\tqueryFn: getCurrentUser,\n\t} );\n","import { httpService } from '@elementor/http-client';\n\nimport { type User } from './types';\n\nconst RESOURCE_URL = '/users/me';\n\ntype GetUserPayload = {\n\tparams: { context?: 'edit' };\n};\n\ntype UserModel = {\n\telementor_introduction: Record< string, boolean >;\n\tcapabilities: Partial< Record< string, true > >;\n};\n\nconst getUserPayload: GetUserPayload = { params: { context: 'edit' } };\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< UserModel >( 'wp/v2' + RESOURCE_URL, getUserPayload )\n\t\t\t.then( ( res ) => {\n\t\t\t\treturn responseToUser( res.data );\n\t\t\t} ),\n\tupdate: ( data: Partial< User > ) =>\n\t\thttpService().patch< Partial< UserModel > >( 'wp/v2' + RESOURCE_URL, userToRequest( data ) ),\n};\n\nconst responseToUser = ( response: UserModel ): User => {\n\treturn {\n\t\tsuppressedMessages: Object.entries( response.elementor_introduction )\n\t\t\t.filter( ( [ , value ] ) => value )\n\t\t\t.map( ( [ message ] ) => message ),\n\t\tcapabilities: Object.keys( response.capabilities ),\n\t};\n};\n\nconst userToRequest = ( user: Partial< User > ): Partial< UserModel > => {\n\treturn {\n\t\telementor_introduction: user.suppressedMessages?.reduce(\n\t\t\t( acc, message ) => {\n\t\t\t\tacc[ message ] = true;\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record< string, boolean >\n\t\t),\n\t};\n};\n","import { apiClient } from './api';\n\nexport const getCurrentUser = () => {\n\treturn apiClient.get();\n};\n","import { useMutation, useQueryClient } from '@elementor/query';\n\nimport { apiClient } from './api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';\n\nexport const useUpdateCurrentUser = () => {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation( {\n\t\tmutationFn: apiClient.update,\n\t\tonSuccess: () => queryClient.invalidateQueries( { queryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ] } ),\n\t} );\n};\n","import { useCurrentUser } from './use-current-user';\nimport { useUpdateCurrentUser } from './use-update-current-user';\n\nexport const useSuppressedMessage = ( messageKey: string ) => {\n\tconst { data } = useCurrentUser();\n\tconst { mutate } = useUpdateCurrentUser();\n\n\tconst isMessageSuppressed = !! data?.suppressedMessages.includes( messageKey );\n\n\tconst suppressMessage = () => {\n\t\tif ( ! isMessageSuppressed ) {\n\t\t\tmutate( {\n\t\t\t\tsuppressedMessages: [ ...( data?.suppressedMessages ?? [] ), messageKey ],\n\t\t\t} );\n\t\t}\n\t};\n\n\treturn [ isMessageSuppressed, suppressMessage ] as const;\n};\n","import { useCurrentUser } from './use-current-user';\n\nexport const useCurrentUserCapabilities = () => {\n\tconst { data } = useCurrentUser();\n\n\tconst canUser = ( capability: string ) => {\n\t\treturn Boolean( data?.capabilities.includes( capability ) );\n\t};\n\n\treturn { canUser, capabilities: data?.capabilities };\n};\n","import { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { type QueryClient } from '@elementor/query';\n\nimport { apiClient } from './api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';\n\nexport function ensureCurrentUser( { queryClient }: { queryClient: QueryClient } ) {\n\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\tawait queryClient.ensureQueryData( {\n\t\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\t\tqueryFn: apiClient.get,\n\t\t} );\n\t} );\n\n\treturn queryClient.getQueryData( [ EDITOR_CURRENT_USER_QUERY_KEY ] );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAyB;;;ACAzB,yBAA4B;AAI5B,IAAM,eAAe;AAWrB,IAAM,iBAAiC,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE;AAE9D,IAAM,YAAY;AAAA,EACxB,KAAK,UACJ,gCAAY,EACV,IAAkB,UAAU,cAAc,cAAe,EACzD,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,aACT,gCAAY,EAAE,MAA+B,UAAU,cAAc,cAAe,IAAK,CAAE;AAC7F;AAEA,IAAM,iBAAiB,CAAE,aAA+B;AACvD,SAAO;AAAA,IACN,oBAAoB,OAAO,QAAS,SAAS,sBAAuB,EAClE,OAAQ,CAAE,CAAE,EAAE,KAAM,MAAO,KAAM,EACjC,IAAK,CAAE,CAAE,OAAQ,MAAO,OAAQ;AAAA,IAClC,cAAc,OAAO,KAAM,SAAS,YAAa;AAAA,EAClD;AACD;AAEA,IAAM,gBAAgB,CAAE,SAAiD;AACxE,SAAO;AAAA,IACN,wBAAwB,KAAK,oBAAoB;AAAA,MAChD,CAAE,KAAK,YAAa;AACnB,YAAK,OAAQ,IAAI;AAEjB,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;AC9CO,IAAM,iBAAiB,MAAM;AACnC,SAAO,UAAU,IAAI;AACtB;;;AFAO,IAAM,gCAAgC;AAEtC,IAAM,iBAAiB,UAC7B,uBAAU;AAAA,EACT,UAAU,CAAE,6BAA8B;AAAA,EAC1C,SAAS;AACV,CAAE;;;AGVH,IAAAA,gBAA4C;AAKrC,IAAM,uBAAuB,MAAM;AACzC,QAAM,kBAAc,8BAAe;AAEnC,aAAO,2BAAa;AAAA,IACnB,YAAY,UAAU;AAAA,IACtB,WAAW,MAAM,YAAY,kBAAmB,EAAE,UAAU,CAAE,6BAA8B,EAAE,CAAE;AAAA,EACjG,CAAE;AACH;;;ACTO,IAAM,uBAAuB,CAAE,eAAwB;AAC7D,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,OAAO,IAAI,qBAAqB;AAExC,QAAM,sBAAsB,CAAC,CAAE,MAAM,mBAAmB,SAAU,UAAW;AAE7E,QAAM,kBAAkB,MAAM;AAC7B,QAAK,CAAE,qBAAsB;AAC5B,aAAQ;AAAA,QACP,oBAAoB,CAAE,GAAK,MAAM,sBAAsB,CAAC,GAAK,UAAW;AAAA,MACzE,CAAE;AAAA,IACH;AAAA,EACD;AAEA,SAAO,CAAE,qBAAqB,eAAgB;AAC/C;;;AChBO,IAAM,6BAA6B,MAAM;AAC/C,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,QAAM,UAAU,CAAE,eAAwB;AACzC,WAAO,QAAS,MAAM,aAAa,SAAU,UAAW,CAAE;AAAA,EAC3D;AAEA,SAAO,EAAE,SAAS,cAAc,MAAM,aAAa;AACpD;;;ACVA,gCAAiC;AAM1B,SAAS,kBAAmB,EAAE,YAAY,GAAkC;AAClF,kDAAkB,SAAS,mCAAmC,YAAY;AACzE,UAAM,YAAY,gBAAiB;AAAA,MAClC,UAAU,CAAE,6BAA8B;AAAA,MAC1C,SAAS,UAAU;AAAA,IACpB,CAAE;AAAA,EACH,CAAE;AAEF,SAAO,YAAY,aAAc,CAAE,6BAA8B,CAAE;AACpE;","names":["import_query"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/use-current-user.ts","../src/api.ts","../src/get-current-user.ts","../src/use-update-current-user.ts","../src/use-suppressed-message.ts","../src/use-current-user-capabilities.ts","../src/ensure-current-user.ts"],"sourcesContent":["import { useQuery } from '@elementor/query';\n\nimport { getCurrentUser } from './get-current-user';\n\nexport const EDITOR_CURRENT_USER_QUERY_KEY = 'editor-current-user';\n\nexport const useCurrentUser = () =>\n\tuseQuery( {\n\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\tqueryFn: getCurrentUser,\n\t} );\n","import { httpService } from '@elementor/http-client';\n\nimport { type User } from './types';\n\nconst RESOURCE_URL = '/users/me';\n\ntype GetUserPayload = {\n\tparams: { context?: 'edit' };\n};\n\ntype UserModel = {\n\telementor_introduction: Record< string, boolean >;\n\tcapabilities: Partial< Record< string, true > >;\n};\n\nconst getUserPayload: GetUserPayload = { params: { context: 'edit' } };\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< UserModel >( 'wp/v2' + RESOURCE_URL, getUserPayload )\n\t\t\t.then( ( res ) => {\n\t\t\t\treturn responseToUser( res.data );\n\t\t\t} ),\n\tupdate: ( data: Partial< User > ) =>\n\t\thttpService().patch< Partial< UserModel > >( 'wp/v2' + RESOURCE_URL, userToRequest( data ) ),\n};\n\nconst responseToUser = ( response: UserModel ): User => {\n\treturn {\n\t\tsuppressedMessages: Object.entries( response.elementor_introduction )\n\t\t\t.filter( ( [ , value ] ) => value )\n\t\t\t.map( ( [ message ] ) => message ),\n\t\tcapabilities: Object.keys( response.capabilities ),\n\t};\n};\n\nconst userToRequest = ( user: Partial< User > ): Partial< UserModel > => {\n\treturn {\n\t\telementor_introduction: user.suppressedMessages?.reduce(\n\t\t\t( acc, message ) => {\n\t\t\t\tacc[ message ] = true;\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record< string, boolean >\n\t\t),\n\t};\n};\n","import { apiClient } from './api';\n\nexport const getCurrentUser = () => {\n\treturn apiClient.get();\n};\n","import { useMutation, useQueryClient } from '@elementor/query';\n\nimport { apiClient } from './api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';\n\nexport const useUpdateCurrentUser = () => {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation( {\n\t\tmutationFn: apiClient.update,\n\t\tonSuccess: () => queryClient.invalidateQueries( { queryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ] } ),\n\t} );\n};\n","import { useCurrentUser } from './use-current-user';\nimport { useUpdateCurrentUser } from './use-update-current-user';\n\nexport const useSuppressedMessage = ( messageKey: string ) => {\n\tconst { data } = useCurrentUser();\n\tconst { mutate } = useUpdateCurrentUser();\n\n\tconst isMessageSuppressed = !! data?.suppressedMessages.includes( messageKey );\n\n\tconst suppressMessage = () => {\n\t\tif ( ! isMessageSuppressed ) {\n\t\t\tmutate( {\n\t\t\t\tsuppressedMessages: [ ...( data?.suppressedMessages ?? [] ), messageKey ],\n\t\t\t} );\n\t\t}\n\t};\n\n\treturn [ isMessageSuppressed, suppressMessage ] as const;\n};\n","import { useCurrentUser } from './use-current-user';\n\nexport const useCurrentUserCapabilities = () => {\n\tconst { data } = useCurrentUser();\n\n\tconst canUser = ( capability: string ) => {\n\t\treturn Boolean( data?.capabilities.includes( capability ) );\n\t};\n\n\treturn { canUser, capabilities: data?.capabilities };\n};\n","import { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { type QueryClient } from '@elementor/query';\n\nimport { apiClient } from './api';\nimport { EDITOR_CURRENT_USER_QUERY_KEY } from './use-current-user';\n\nexport function ensureCurrentUser( { queryClient }: { queryClient: QueryClient } ) {\n\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\tawait queryClient.ensureQueryData( {\n\t\t\tqueryKey: [ EDITOR_CURRENT_USER_QUERY_KEY ],\n\t\t\tqueryFn: apiClient.get,\n\t\t} );\n\t} );\n\n\treturn queryClient.getQueryData( [ EDITOR_CURRENT_USER_QUERY_KEY ] );\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;;;ACAzB,SAAS,mBAAmB;AAI5B,IAAM,eAAe;AAWrB,IAAM,iBAAiC,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE;AAE9D,IAAM,YAAY;AAAA,EACxB,KAAK,MACJ,YAAY,EACV,IAAkB,UAAU,cAAc,cAAe,EACzD,KAAM,CAAE,QAAS;AACjB,WAAO,eAAgB,IAAI,IAAK;AAAA,EACjC,CAAE;AAAA,EACJ,QAAQ,CAAE,SACT,YAAY,EAAE,MAA+B,UAAU,cAAc,cAAe,IAAK,CAAE;AAC7F;AAEA,IAAM,iBAAiB,CAAE,aAA+B;AACvD,SAAO;AAAA,IACN,oBAAoB,OAAO,QAAS,SAAS,sBAAuB,EAClE,OAAQ,CAAE,CAAE,EAAE,KAAM,MAAO,KAAM,EACjC,IAAK,CAAE,CAAE,OAAQ,MAAO,OAAQ;AAAA,IAClC,cAAc,OAAO,KAAM,SAAS,YAAa;AAAA,EAClD;AACD;AAEA,IAAM,gBAAgB,CAAE,SAAiD;AACxE,SAAO;AAAA,IACN,wBAAwB,KAAK,oBAAoB;AAAA,MAChD,CAAE,KAAK,YAAa;AACnB,YAAK,OAAQ,IAAI;AAEjB,eAAO;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;AC9CO,IAAM,iBAAiB,MAAM;AACnC,SAAO,UAAU,IAAI;AACtB;;;AFAO,IAAM,gCAAgC;AAEtC,IAAM,iBAAiB,MAC7B,SAAU;AAAA,EACT,UAAU,CAAE,6BAA8B;AAAA,EAC1C,SAAS;AACV,CAAE;;;AGVH,SAAS,aAAa,sBAAsB;AAKrC,IAAM,uBAAuB,MAAM;AACzC,QAAM,cAAc,eAAe;AAEnC,SAAO,YAAa;AAAA,IACnB,YAAY,UAAU;AAAA,IACtB,WAAW,MAAM,YAAY,kBAAmB,EAAE,UAAU,CAAE,6BAA8B,EAAE,CAAE;AAAA,EACjG,CAAE;AACH;;;ACTO,IAAM,uBAAuB,CAAE,eAAwB;AAC7D,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,EAAE,OAAO,IAAI,qBAAqB;AAExC,QAAM,sBAAsB,CAAC,CAAE,MAAM,mBAAmB,SAAU,UAAW;AAE7E,QAAM,kBAAkB,MAAM;AAC7B,QAAK,CAAE,qBAAsB;AAC5B,aAAQ;AAAA,QACP,oBAAoB,CAAE,GAAK,MAAM,sBAAsB,CAAC,GAAK,UAAW;AAAA,MACzE,CAAE;AAAA,IACH;AAAA,EACD;AAEA,SAAO,CAAE,qBAAqB,eAAgB;AAC/C;;;AChBO,IAAM,6BAA6B,MAAM;AAC/C,QAAM,EAAE,KAAK,IAAI,eAAe;AAEhC,QAAM,UAAU,CAAE,eAAwB;AACzC,WAAO,QAAS,MAAM,aAAa,SAAU,UAAW,CAAE;AAAA,EAC3D;AAEA,SAAO,EAAE,SAAS,cAAc,MAAM,aAAa;AACpD;;;ACVA,SAAS,wBAAwB;AAM1B,SAAS,kBAAmB,EAAE,YAAY,GAAkC;AAClF,mBAAkB,SAAS,mCAAmC,YAAY;AACzE,UAAM,YAAY,gBAAiB;AAAA,MAClC,UAAU,CAAE,6BAA8B;AAAA,MAC1C,SAAS,UAAU;AAAA,IACpB,CAAE;AAAA,EACH,CAAE;AAEF,SAAO,YAAY,aAAc,CAAE,6BAA8B,CAAE;AACpE;","names":[]}