@plainkey/vue 0.4.12 → 0.5.1
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.
|
@@ -37,4 +37,4 @@ declare function usePlainKey(usePlainKeyParams: usePlainKeyParams): {
|
|
|
37
37
|
};
|
|
38
38
|
//#endregion
|
|
39
39
|
export { AddCredentialParams, ErrorResponse, LoginParams, RegisterParams, usePlainKey, usePlainKeyParams };
|
|
40
|
-
//# sourceMappingURL=index.d.
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/usePlainkey/index.ts"],"sourcesContent":[],"mappings":";;;;KAcY,aAAA;EAAA,KAAA,EAAA,MAAA;AAIZ,CAAA;AAIY,KAJA,iBAAA,GAIc;EACd,SAAA,EAAA,MAAA;AACZ,CAAA;AAEgB,KAJJ,WAAA,GAAc,iBAIC;AAAoB,KAHnC,mBAAA,GAAsB,0BAGa;AAwB3B,KA1BR,cAAA,GAAiB,wBA0BT;AACP,iBAzBG,WAAA,CAyBH,iBAAA,EAzBkC,iBAyBlC,CAAA,EAAA;EAA+B,QAAA,EAAA,CAAA,cAAA,EADxB,cACwB,EAAA,GAAvC,OAAuC,CAA/B,4BAA+B,GAAA,aAAA,CAAA;EAAvC,aAAA,KAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;;;;;IA4BoB,UAAA,EAAA,MAAA;EACZ,CAAA,GAAA,IAAA,CAAA;EAAiC,kBAAA,KAAA,6BAAA,GAAA,IAAA,8BAAA,GAAA,IAAA,CAAA;EAAzC,aAAA,EAAA,CAAA,mBAAA,EADoB,mBACpB,EAAA,GAAA,OAAA,CAAQ,8BAAR,GAAyC,aAAzC,CAAA;;;;;uBAuB+B,gBAAc,QAAQ;;EAAtB,UAAA,KAAA,CAAA,MAAA,GAAA,IAAA,EAAA,MAAA,GAAA,IAAA,CAAA;EAAsB,YAAA,KAAA,CAAA,OAAA,EAAA,OAAA,CAAA;EAAR,gBAAA,KAAA,sBAAA,GAAA,IAAA,uBAAA,GAAA,IAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["registerError: Ref<string | null>","registeredCredential: Ref<RegistrationCompleteResponse[\"credential\"] | null>","registeredResponse: Ref<RegistrationCompleteResponse | null>","addCredentialError: Ref<string | null>","addedCredentialResponse: Ref<UserCredentialCompleteResponse | null>","loginError: Ref<string | null>","loggedInResponse: Ref<LoginCompleteResponse | null>","registrationResult: RegistrationCompleteResponse","credentialResult: UserCredentialCompleteResponse","loginResult: LoginCompleteResponse"],"sources":["../src/usePlainkey/index.ts"],"sourcesContent":["import { Ref, ref } from \"vue\"\nimport { PlainKeyClient } from \"@plainkey/browser\"\nimport type {\n RegistrationCompleteResponse,\n UserCredentialCompleteResponse,\n LoginCompleteResponse\n} from \"@plainkey/types\"\n\nimport type {\n LoginBeginRequest,\n RegistrationBeginRequest,\n UserCredentialBeginRequest\n} from \"@plainkey/types\"\n\nexport type ErrorResponse = {\n error: string\n}\n\nexport type usePlainKeyParams = {\n projectId: string\n}\n\nexport type LoginParams = LoginBeginRequest\nexport type AddCredentialParams = UserCredentialBeginRequest\nexport type RegisterParams = RegistrationBeginRequest\n\nexport function usePlainKey(usePlainKeyParams: usePlainKeyParams) {\n const { projectId } = usePlainKeyParams\n const plainKeyClient = new PlainKeyClient({ projectId })\n\n // Registration (user creation + passkey registration)\n const isRegistering = ref(false)\n const registerError: Ref<string | null> = ref(null)\n const registerSuccess = ref(false)\n const registeredCredential: Ref<RegistrationCompleteResponse[\"credential\"] | null> = ref(null)\n const registeredResponse: Ref<RegistrationCompleteResponse | null> = ref(null)\n\n // Credential registration (passkey registration to existing user)\n const isAddingCredential = ref(false)\n const addCredentialError: Ref<string | null> = ref(null)\n const addCredentialSuccess = ref(false)\n const addedCredentialResponse: Ref<UserCredentialCompleteResponse | null> = ref(null)\n\n // Login\n const isLoggingIn = ref(false)\n const loginError: Ref<string | null> = ref(null)\n const loginSuccess = ref(false)\n const loggedInResponse: Ref<LoginCompleteResponse | null> = ref(null)\n\n async function register(\n registerParams: RegisterParams\n ): Promise<RegistrationCompleteResponse | ErrorResponse> {\n try {\n isRegistering.value = true\n registerError.value = null\n registerSuccess.value = false\n registeredCredential.value = null\n\n const registrationResult: RegistrationCompleteResponse = await plainKeyClient.Registration({\n userName: registerParams?.userName\n } satisfies RegistrationBeginRequest)\n\n registerSuccess.value = registrationResult.success\n registeredCredential.value = registrationResult.credential\n registeredResponse.value = registrationResult\n return registrationResult\n } catch (err) {\n registerError.value = err instanceof Error ? err.message : \"Registration failed\"\n return { error: registerError.value }\n } finally {\n isRegistering.value = false\n }\n }\n\n /**\n * The user must be logged in first. Pass in their user token and project ID in beginParams.\n * However, do not store the token in local storage, database, etc. Always keep it in memory.\n */\n async function addCredential(\n addCredentialParams: AddCredentialParams\n ): Promise<UserCredentialCompleteResponse | ErrorResponse> {\n try {\n isAddingCredential.value = true\n addCredentialError.value = null\n addCredentialSuccess.value = false\n addedCredentialResponse.value = null\n\n const credentialResult: UserCredentialCompleteResponse = await plainKeyClient.AddCredential({\n userIdentifier: addCredentialParams.userIdentifier,\n userToken: addCredentialParams.userToken\n } satisfies UserCredentialBeginRequest)\n\n addCredentialSuccess.value = credentialResult.success\n addedCredentialResponse.value = credentialResult\n return credentialResult\n } catch (err) {\n addCredentialError.value = err instanceof Error ? err.message : \"Add credential failed\"\n return { error: addCredentialError.value }\n } finally {\n isAddingCredential.value = false\n }\n }\n\n async function login(loginParams: LoginParams): Promise<LoginCompleteResponse> {\n try {\n isLoggingIn.value = true\n loginError.value = null\n loginSuccess.value = false\n loggedInResponse.value = null\n\n const loginResult: LoginCompleteResponse = await plainKeyClient.Login({\n userIdentifier: loginParams.userIdentifier\n } satisfies LoginBeginRequest)\n\n // Update refs\n loginSuccess.value = loginResult.verified\n loggedInResponse.value = loginResult\n return loginResult\n } catch (err) {\n loginError.value = err instanceof Error ? err.message : \"Login failed\"\n return {\n verified: false,\n user: { id: \"\" },\n token: { token: \"\", expiresInSeconds: 0, tokenType: \"\" },\n session: undefined\n }\n } finally {\n isLoggingIn.value = false\n }\n }\n\n return {\n register,\n isRegistering,\n error: registerError,\n registerSuccess,\n registeredCredential,\n registeredResponse,\n addCredential,\n isAddingCredential,\n addCredentialError,\n addCredentialSuccess,\n addedCredentialResponse,\n login,\n isLoggingIn,\n loginError,\n loginSuccess,\n loggedInResponse\n }\n}\n"],"mappings":";;;;AA0BA,SAAgB,YAAY,mBAAsC;CAChE,MAAM,EAAE,cAAc;CACtB,MAAM,iBAAiB,IAAI,eAAe,EAAE,WAAW,CAAC;CAGxD,MAAM,gBAAgB,IAAI,MAAM;CAChC,MAAMA,gBAAoC,IAAI,KAAK;CACnD,MAAM,kBAAkB,IAAI,MAAM;CAClC,MAAMC,uBAA+E,IAAI,KAAK;CAC9F,MAAMC,qBAA+D,IAAI,KAAK;CAG9E,MAAM,qBAAqB,IAAI,MAAM;CACrC,MAAMC,qBAAyC,IAAI,KAAK;CACxD,MAAM,uBAAuB,IAAI,MAAM;CACvC,MAAMC,0BAAsE,IAAI,KAAK;CAGrF,MAAM,cAAc,IAAI,MAAM;CAC9B,MAAMC,aAAiC,IAAI,KAAK;CAChD,MAAM,eAAe,IAAI,MAAM;CAC/B,MAAMC,mBAAsD,IAAI,KAAK;CAErE,eAAe,SACb,gBACuD;AACvD,MAAI;AACF,iBAAc,QAAQ;AACtB,iBAAc,QAAQ;AACtB,mBAAgB,QAAQ;AACxB,wBAAqB,QAAQ;GAE7B,MAAMC,qBAAmD,MAAM,eAAe,aAAa,EACzF,UAAU,gBAAgB,UAC3B,CAAoC;AAErC,mBAAgB,QAAQ,mBAAmB;AAC3C,wBAAqB,QAAQ,mBAAmB;AAChD,sBAAmB,QAAQ;AAC3B,UAAO;WACA,KAAK;AACZ,iBAAc,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAC3D,UAAO,EAAE,OAAO,cAAc,OAAO;YAC7B;AACR,iBAAc,QAAQ;;;;;;;CAQ1B,eAAe,cACb,qBACyD;AACzD,MAAI;AACF,sBAAmB,QAAQ;AAC3B,sBAAmB,QAAQ;AAC3B,wBAAqB,QAAQ;AAC7B,2BAAwB,QAAQ;GAEhC,MAAMC,mBAAmD,MAAM,eAAe,cAAc;IAC1F,gBAAgB,oBAAoB;IACpC,WAAW,oBAAoB;IAChC,CAAsC;AAEvC,wBAAqB,QAAQ,iBAAiB;AAC9C,2BAAwB,QAAQ;AAChC,UAAO;WACA,KAAK;AACZ,sBAAmB,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAChE,UAAO,EAAE,OAAO,mBAAmB,OAAO;YAClC;AACR,sBAAmB,QAAQ;;;CAI/B,eAAe,MAAM,aAA0D;AAC7E,MAAI;AACF,eAAY,QAAQ;AACpB,cAAW,QAAQ;AACnB,gBAAa,QAAQ;AACrB,oBAAiB,QAAQ;GAEzB,MAAMC,cAAqC,MAAM,eAAe,MAAM,EACpE,gBAAgB,YAAY,gBAC7B,CAA6B;AAG9B,gBAAa,QAAQ,YAAY;AACjC,oBAAiB,QAAQ;AACzB,UAAO;WACA,KAAK;AACZ,cAAW,QAAQ,eAAe,QAAQ,IAAI,UAAU;AACxD,UAAO;IACL,UAAU;IACV,MAAM,EAAE,IAAI,IAAI;IAChB,OAAO;KAAE,OAAO;KAAI,kBAAkB;KAAG,WAAW;KAAI;IACxD,SAAS;IACV;YACO;AACR,eAAY,QAAQ;;;AAIxB,QAAO;EACL;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plainkey/vue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "PlainKey Vue SDK (composable)",
|
|
5
|
-
"
|
|
6
|
-
"main": "./dist/index.
|
|
7
|
-
"
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
8
9
|
"sideEffects": false,
|
|
9
10
|
"files": [
|
|
10
11
|
"dist"
|
|
11
12
|
],
|
|
12
13
|
"exports": {
|
|
13
|
-
".": "./dist/index.
|
|
14
|
+
".": "./dist/index.js",
|
|
14
15
|
"./package.json": "./package.json"
|
|
15
16
|
},
|
|
16
17
|
"peerDependencies": {
|
|
@@ -21,11 +22,14 @@
|
|
|
21
22
|
"@plainkey/types": "*"
|
|
22
23
|
},
|
|
23
24
|
"scripts": {
|
|
24
|
-
"build": "tsdown
|
|
25
|
+
"build": "tsdown --clean --config tsdown.config.ts",
|
|
25
26
|
"prepare": "npm run build",
|
|
26
27
|
"prepublishOnly": "npm run build"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"tsdown": "^0.15.5"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
30
34
|
}
|
|
31
35
|
}
|
package/dist/index.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/usePlainkey/index.ts"],"sourcesContent":[],"mappings":";;;;KAcY,aAAA;EAAA,KAAA,EAAA,MAAA;AAIZ,CAAA;AAIY,KAJA,iBAAA,GAIc;EACd,SAAA,EAAA,MAAA;AACZ,CAAA;AAEgB,KAJJ,WAAA,GAAc,iBAIC;AAAA,KAHf,mBAAA,GAAsB,0BAGP;AAAoB,KAFnC,cAAA,GAAiB,wBAEkB;AAwB3B,iBAxBJ,WAAA,CAwBI,iBAAA,EAxB2B,iBAwB3B,CAAA,EAAA;UACP,EAAA,CAAA,cAAA,EADO,cACP,EAAA,GAAR,OAAQ,CAAA,4BAAA,GAA+B,aAA/B,CAAA;eAA+B,KAAA,CAAA,OAAA,EAAA,OAAA,CAAA;OAAvC,KAAA,CAAA,MAAA,GAAA,IAAA,EAAA,MAAA,GAAA,IAAA,CAAA;;;;;;;;MA4BoB,IAAA,CAAA;oBACZ,KAAA,6BAAA,GAAA,IAAA,8BAAA,GAAA,IAAA,CAAA;eAAiC,EAAA,CAAA,mBAAA,EADrB,mBACqB,EAAA,GAAzC,OAAyC,CAAjC,8BAAiC,GAAA,aAAA,CAAA;oBAAzC,KAAA,CAAA,OAAA,EAAA,OAAA,CAAA;;;;uBAuB+B,gBAAc,QAAQ;;;cAAtB,KAAA,CAAA,OAAA,EAAA,OAAA,CAAA;kBAAsB,KAAA,sBAAA,GAAA,IAAA,uBAAA,GAAA,IAAA,CAAA"}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["registerError: Ref<string | null>","registeredCredential: Ref<RegistrationCompleteResponse[\"credential\"] | null>","registeredResponse: Ref<RegistrationCompleteResponse | null>","addCredentialError: Ref<string | null>","addedCredentialResponse: Ref<UserCredentialCompleteResponse | null>","loginError: Ref<string | null>","loggedInResponse: Ref<LoginCompleteResponse | null>","registrationResult: RegistrationCompleteResponse","credentialResult: UserCredentialCompleteResponse","loginResult: LoginCompleteResponse"],"sources":["../src/usePlainkey/index.ts"],"sourcesContent":["import { Ref, ref } from \"vue\"\nimport { PlainKeyClient } from \"@plainkey/browser\"\nimport type {\n RegistrationCompleteResponse,\n UserCredentialCompleteResponse,\n LoginCompleteResponse\n} from \"@plainkey/types\"\n\nimport type {\n LoginBeginRequest,\n RegistrationBeginRequest,\n UserCredentialBeginRequest\n} from \"@plainkey/types\"\n\nexport type ErrorResponse = {\n error: string\n}\n\nexport type usePlainKeyParams = {\n projectId: string\n}\n\nexport type LoginParams = LoginBeginRequest\nexport type AddCredentialParams = UserCredentialBeginRequest\nexport type RegisterParams = RegistrationBeginRequest\n\nexport function usePlainKey(usePlainKeyParams: usePlainKeyParams) {\n const { projectId } = usePlainKeyParams\n const plainKeyClient = new PlainKeyClient({ projectId })\n\n // Registration (user creation + passkey registration)\n const isRegistering = ref(false)\n const registerError: Ref<string | null> = ref(null)\n const registerSuccess = ref(false)\n const registeredCredential: Ref<RegistrationCompleteResponse[\"credential\"] | null> = ref(null)\n const registeredResponse: Ref<RegistrationCompleteResponse | null> = ref(null)\n\n // Credential registration (passkey registration to existing user)\n const isAddingCredential = ref(false)\n const addCredentialError: Ref<string | null> = ref(null)\n const addCredentialSuccess = ref(false)\n const addedCredentialResponse: Ref<UserCredentialCompleteResponse | null> = ref(null)\n\n // Login\n const isLoggingIn = ref(false)\n const loginError: Ref<string | null> = ref(null)\n const loginSuccess = ref(false)\n const loggedInResponse: Ref<LoginCompleteResponse | null> = ref(null)\n\n async function register(\n registerParams: RegisterParams\n ): Promise<RegistrationCompleteResponse | ErrorResponse> {\n try {\n isRegistering.value = true\n registerError.value = null\n registerSuccess.value = false\n registeredCredential.value = null\n\n const registrationResult: RegistrationCompleteResponse = await plainKeyClient.Registration({\n userName: registerParams?.userName\n } satisfies RegistrationBeginRequest)\n\n registerSuccess.value = registrationResult.success\n registeredCredential.value = registrationResult.credential\n registeredResponse.value = registrationResult\n return registrationResult\n } catch (err) {\n registerError.value = err instanceof Error ? err.message : \"Registration failed\"\n return { error: registerError.value }\n } finally {\n isRegistering.value = false\n }\n }\n\n /**\n * The user must be logged in first. Pass in their user token and project ID in beginParams.\n * However, do not store the token in local storage, database, etc. Always keep it in memory.\n */\n async function addCredential(\n addCredentialParams: AddCredentialParams\n ): Promise<UserCredentialCompleteResponse | ErrorResponse> {\n try {\n isAddingCredential.value = true\n addCredentialError.value = null\n addCredentialSuccess.value = false\n addedCredentialResponse.value = null\n\n const credentialResult: UserCredentialCompleteResponse = await plainKeyClient.AddCredential({\n userIdentifier: addCredentialParams.userIdentifier,\n userToken: addCredentialParams.userToken\n } satisfies UserCredentialBeginRequest)\n\n addCredentialSuccess.value = credentialResult.success\n addedCredentialResponse.value = credentialResult\n return credentialResult\n } catch (err) {\n addCredentialError.value = err instanceof Error ? err.message : \"Add credential failed\"\n return { error: addCredentialError.value }\n } finally {\n isAddingCredential.value = false\n }\n }\n\n async function login(loginParams: LoginParams): Promise<LoginCompleteResponse> {\n try {\n isLoggingIn.value = true\n loginError.value = null\n loginSuccess.value = false\n loggedInResponse.value = null\n\n const loginResult: LoginCompleteResponse = await plainKeyClient.Login({\n userIdentifier: loginParams.userIdentifier\n } satisfies LoginBeginRequest)\n\n // Update refs\n loginSuccess.value = loginResult.verified\n loggedInResponse.value = loginResult\n return loginResult\n } catch (err) {\n loginError.value = err instanceof Error ? err.message : \"Login failed\"\n return {\n verified: false,\n user: { id: \"\" },\n token: { token: \"\", expiresInSeconds: 0, tokenType: \"\" },\n session: undefined\n }\n } finally {\n isLoggingIn.value = false\n }\n }\n\n return {\n register,\n isRegistering,\n error: registerError,\n registerSuccess,\n registeredCredential,\n registeredResponse,\n addCredential,\n isAddingCredential,\n addCredentialError,\n addCredentialSuccess,\n addedCredentialResponse,\n login,\n isLoggingIn,\n loginError,\n loginSuccess,\n loggedInResponse\n }\n}\n"],"mappings":";;;;AA0BA,SAAgB,YAAY,mBAAsC;CAChE,MAAM,EAAE,cAAc;CACtB,MAAM,iBAAiB,IAAI,eAAe,EAAE,WAAW,CAAC;CAGxD,MAAM,gBAAgB,IAAI,MAAM;CAChC,MAAMA,gBAAoC,IAAI,KAAK;CACnD,MAAM,kBAAkB,IAAI,MAAM;CAClC,MAAMC,uBAA+E,IAAI,KAAK;CAC9F,MAAMC,qBAA+D,IAAI,KAAK;CAG9E,MAAM,qBAAqB,IAAI,MAAM;CACrC,MAAMC,qBAAyC,IAAI,KAAK;CACxD,MAAM,uBAAuB,IAAI,MAAM;CACvC,MAAMC,0BAAsE,IAAI,KAAK;CAGrF,MAAM,cAAc,IAAI,MAAM;CAC9B,MAAMC,aAAiC,IAAI,KAAK;CAChD,MAAM,eAAe,IAAI,MAAM;CAC/B,MAAMC,mBAAsD,IAAI,KAAK;CAErE,eAAe,SACb,gBACuD;AACvD,MAAI;AACF,iBAAc,QAAQ;AACtB,iBAAc,QAAQ;AACtB,mBAAgB,QAAQ;AACxB,wBAAqB,QAAQ;GAE7B,MAAMC,qBAAmD,MAAM,eAAe,aAAa,EACzF,UAAU,gBAAgB,UAC3B,CAAoC;AAErC,mBAAgB,QAAQ,mBAAmB;AAC3C,wBAAqB,QAAQ,mBAAmB;AAChD,sBAAmB,QAAQ;AAC3B,UAAO;WACA,KAAK;AACZ,iBAAc,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAC3D,UAAO,EAAE,OAAO,cAAc,OAAO;YAC7B;AACR,iBAAc,QAAQ;;;;;;;CAQ1B,eAAe,cACb,qBACyD;AACzD,MAAI;AACF,sBAAmB,QAAQ;AAC3B,sBAAmB,QAAQ;AAC3B,wBAAqB,QAAQ;AAC7B,2BAAwB,QAAQ;GAEhC,MAAMC,mBAAmD,MAAM,eAAe,cAAc;IAC1F,gBAAgB,oBAAoB;IACpC,WAAW,oBAAoB;IAChC,CAAsC;AAEvC,wBAAqB,QAAQ,iBAAiB;AAC9C,2BAAwB,QAAQ;AAChC,UAAO;WACA,KAAK;AACZ,sBAAmB,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAChE,UAAO,EAAE,OAAO,mBAAmB,OAAO;YAClC;AACR,sBAAmB,QAAQ;;;CAI/B,eAAe,MAAM,aAA0D;AAC7E,MAAI;AACF,eAAY,QAAQ;AACpB,cAAW,QAAQ;AACnB,gBAAa,QAAQ;AACrB,oBAAiB,QAAQ;GAEzB,MAAMC,cAAqC,MAAM,eAAe,MAAM,EACpE,gBAAgB,YAAY,gBAC7B,CAA6B;AAG9B,gBAAa,QAAQ,YAAY;AACjC,oBAAiB,QAAQ;AACzB,UAAO;WACA,KAAK;AACZ,cAAW,QAAQ,eAAe,QAAQ,IAAI,UAAU;AACxD,UAAO;IACL,UAAU;IACV,MAAM,EAAE,IAAI,IAAI;IAChB,OAAO;KAAE,OAAO;KAAI,kBAAkB;KAAG,WAAW;KAAI;IACxD,SAAS;IACV;YACO;AACR,eAAY,QAAQ;;;AAIxB,QAAO;EACL;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
|