@prosopo/procaptcha-pow 2.1.6 → 2.1.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/procaptcha-pow",
3
- "version": "2.1.6",
3
+ "version": "2.1.8",
4
4
  "author": "PROSOPO LIMITED <info@prosopo.io>",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./dist/index.js",
@@ -27,15 +27,15 @@
27
27
  "browserslist": ["> 0.5%, last 2 versions, not dead"],
28
28
  "dependencies": {
29
29
  "@polkadot/util": "12.6.2",
30
- "@prosopo/account": "2.1.6",
31
- "@prosopo/api": "2.1.6",
32
- "@prosopo/common": "2.1.6",
33
- "@prosopo/locale-browser": "2.1.6",
34
- "@prosopo/procaptcha": "2.1.6",
35
- "@prosopo/procaptcha-common": "2.1.6",
36
- "@prosopo/types": "2.1.6",
37
- "@prosopo/util": "2.1.6",
38
- "@prosopo/web-components": "2.1.6",
30
+ "@prosopo/account": "2.1.8",
31
+ "@prosopo/api": "2.1.8",
32
+ "@prosopo/common": "2.1.8",
33
+ "@prosopo/locale-browser": "2.1.8",
34
+ "@prosopo/procaptcha": "2.1.8",
35
+ "@prosopo/procaptcha-common": "2.1.8",
36
+ "@prosopo/types": "2.1.8",
37
+ "@prosopo/util": "2.1.8",
38
+ "@prosopo/web-components": "2.1.8",
39
39
  "react": "18.3.1"
40
40
  },
41
41
  "overrides": {
@@ -46,7 +46,7 @@
46
46
  }
47
47
  },
48
48
  "devDependencies": {
49
- "@prosopo/config": "2.1.6",
49
+ "@prosopo/config": "2.1.8",
50
50
  "@vitest/coverage-v8": "2.1.1",
51
51
  "concurrently": "9.0.1",
52
52
  "npm-run-all": "4.1.5",
@@ -1,6 +0,0 @@
1
- import { ProcaptchaCallbacks, ProcaptchaClientConfigInput, ProcaptchaState, ProcaptchaStateUpdateFn } from '@prosopo/types';
2
- export declare const Manager: (configInput: ProcaptchaClientConfigInput, state: ProcaptchaState, onStateUpdate: ProcaptchaStateUpdateFn, callbacks: ProcaptchaCallbacks) => {
3
- start: () => Promise<void>;
4
- resetState: () => void;
5
- };
6
- //# sourceMappingURL=Manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/Services/Manager.ts"],"names":[],"mappings":"AAaA,OAAO,EAGH,mBAAmB,EACnB,2BAA2B,EAG3B,eAAe,EACf,uBAAuB,EAG1B,MAAM,gBAAgB,CAAA;AASvB,eAAO,MAAM,OAAO,gBACH,2BAA2B,SACjC,eAAe,iBACP,uBAAuB,aAC3B,mBAAmB;;;CAuMjC,CAAA"}
@@ -1,144 +0,0 @@
1
- import { ApiParams, ProcaptchaConfigSchema, encodeProcaptchaOutput, } from '@prosopo/types';
2
- import { ExtensionWeb2 } from '@prosopo/account';
3
- import { ProsopoEnvError } from '@prosopo/common';
4
- import { ProviderApi } from '@prosopo/api';
5
- import { buildUpdateState, getDefaultEvents } from '@prosopo/procaptcha-common';
6
- import { sleep } from '@prosopo/procaptcha';
7
- import { at, solvePoW } from '@prosopo/util';
8
- import { loadBalancer } from '@prosopo/load-balancer';
9
- export const Manager = (configInput, state, onStateUpdate, callbacks) => {
10
- const events = getDefaultEvents(onStateUpdate, state, callbacks);
11
- const defaultState = () => {
12
- return {
13
- showModal: false,
14
- loading: false,
15
- index: 0,
16
- challenge: undefined,
17
- solutions: undefined,
18
- isHuman: false,
19
- captchaApi: undefined,
20
- account: undefined,
21
- };
22
- };
23
- const clearTimeout = () => {
24
- window.clearTimeout(state.timeout);
25
- updateState({ timeout: undefined });
26
- };
27
- const clearSuccessfulChallengeTimeout = () => {
28
- window.clearTimeout(state.successfullChallengeTimeout);
29
- updateState({ successfullChallengeTimeout: undefined });
30
- };
31
- const getConfig = () => {
32
- const config = {
33
- userAccountAddress: '',
34
- ...configInput,
35
- };
36
- return ProcaptchaConfigSchema.parse(config);
37
- };
38
- const getNetwork = (config) => {
39
- const network = config.networks[config.defaultNetwork];
40
- if (!network) {
41
- throw new ProsopoEnvError('DEVELOPER.NETWORK_NOT_FOUND', {
42
- context: { error: `No network found for environment ${config.defaultEnvironment}` },
43
- });
44
- }
45
- return network;
46
- };
47
- const getAccount = () => {
48
- if (!state.account) {
49
- throw new ProsopoEnvError('GENERAL.ACCOUNT_NOT_FOUND', { context: { error: 'Account not loaded' } });
50
- }
51
- const account = state.account;
52
- return account;
53
- };
54
- const getDappAccount = () => {
55
- if (!state.dappAccount) {
56
- throw new ProsopoEnvError('GENERAL.SITE_KEY_MISSING');
57
- }
58
- const dappAccount = state.dappAccount;
59
- return dappAccount;
60
- };
61
- const updateState = buildUpdateState(state, onStateUpdate);
62
- const resetState = () => {
63
- clearTimeout();
64
- clearSuccessfulChallengeTimeout();
65
- updateState(defaultState());
66
- };
67
- const setValidChallengeTimeout = () => {
68
- const timeMillis = getConfig().captchas.pow.solutionTimeout;
69
- const successfullChallengeTimeout = setTimeout(() => {
70
- updateState({ isHuman: false });
71
- events.onExpired();
72
- }, timeMillis);
73
- updateState({ successfullChallengeTimeout });
74
- };
75
- const start = async () => {
76
- if (state.loading) {
77
- return;
78
- }
79
- if (state.isHuman) {
80
- return;
81
- }
82
- resetState();
83
- updateState({
84
- loading: true,
85
- });
86
- const config = getConfig();
87
- const ext = new ExtensionWeb2();
88
- const userAccount = config.userAccountAddress || (await ext.getAccount(config)).account.address;
89
- updateState({
90
- account: { account: { address: userAccount } },
91
- });
92
- updateState({ dappAccount: config.account.address });
93
- await sleep(100);
94
- if (!config.web2 && !config.userAccountAddress) {
95
- throw new ProsopoEnvError('GENERAL.ACCOUNT_NOT_FOUND', {
96
- context: { error: 'Account address has not been set for web3 mode' },
97
- });
98
- }
99
- const getRandomProviderResponse = getRandomActiveProvider();
100
- const events = getDefaultEvents(onStateUpdate, state, callbacks);
101
- const providerUrl = getRandomProviderResponse.provider.url;
102
- const providerApi = new ProviderApi(getNetwork(getConfig()), providerUrl, getDappAccount());
103
- const challenge = await providerApi.getPowCaptchaChallenge(userAccount, getDappAccount());
104
- const solution = solvePoW(challenge.challenge, challenge.difficulty);
105
- const verifiedSolution = await providerApi.submitPowCaptchaSolution(challenge, getAccount().account.address, getDappAccount(), getRandomProviderResponse, solution, config.captchas.pow.verifiedTimeout);
106
- if (verifiedSolution[ApiParams.verified]) {
107
- updateState({
108
- isHuman: true,
109
- loading: false,
110
- });
111
- events.onHuman(encodeProcaptchaOutput({
112
- [ApiParams.providerUrl]: providerUrl,
113
- [ApiParams.user]: getAccount().account.address,
114
- [ApiParams.dapp]: getDappAccount(),
115
- [ApiParams.challenge]: challenge.challenge,
116
- [ApiParams.blockNumber]: getRandomProviderResponse.blockNumber,
117
- [ApiParams.nonce]: solution,
118
- [ApiParams.timestamp]: challenge.timestamp,
119
- [ApiParams.timestampSignature]: challenge.timestampSignature,
120
- }));
121
- setValidChallengeTimeout();
122
- }
123
- };
124
- const getRandomActiveProvider = () => {
125
- const randomIntBetween = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);
126
- const environment = getConfig().defaultEnvironment;
127
- const PROVIDERS = loadBalancer(environment);
128
- const randomProvderObj = at(PROVIDERS, randomIntBetween(0, PROVIDERS.length - 1));
129
- return {
130
- providerAccount: randomProvderObj.address,
131
- provider: {
132
- url: randomProvderObj.url,
133
- datasetId: randomProvderObj.datasetId,
134
- datasetIdContent: randomProvderObj.datasetIdContent,
135
- },
136
- blockNumber: 0,
137
- };
138
- };
139
- return {
140
- start,
141
- resetState,
142
- };
143
- };
144
- //# sourceMappingURL=Manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Manager.js","sourceRoot":"","sources":["../../src/Services/Manager.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("@emotion/react/jsx-runtime");
4
- const webComponents = require("@prosopo/web-components");
5
- const react = require("react");
6
- const _interopNamespaceDefaultOnly = (e) => Object.freeze(Object.defineProperty({ __proto__: null, default: e }, Symbol.toStringTag, { value: "Module" }));
7
- const ProcaptchaWidget = react.lazy(async () => Promise.resolve().then(() => /* @__PURE__ */ _interopNamespaceDefaultOnly(require("./ProcaptchaWidget.cjs"))));
8
- const ProcaptchaPow = (props) => /* @__PURE__ */ jsxRuntime.jsx(
9
- react.Suspense,
10
- {
11
- fallback: /* @__PURE__ */ jsxRuntime.jsx(
12
- webComponents.ProcaptchaPlaceholder,
13
- {
14
- config: props.config,
15
- callbacks: props.callbacks
16
- }
17
- ),
18
- children: /* @__PURE__ */ jsxRuntime.jsx(
19
- ProcaptchaWidget,
20
- {
21
- config: props.config,
22
- callbacks: props.callbacks,
23
- frictionlessState: props.frictionlessState
24
- }
25
- )
26
- }
27
- );
28
- exports.ProcaptchaPow = ProcaptchaPow;
@@ -1,130 +0,0 @@
1
- "use strict";
2
- const jsxRuntime = require("@emotion/react/jsx-runtime");
3
- const localeBrowser = require("@prosopo/locale-browser");
4
- const procaptchaCommon = require("@prosopo/procaptcha-common");
5
- const webComponents = require("@prosopo/web-components");
6
- const react = require("react");
7
- const Manager = require("../services/Manager.cjs");
8
- const Procaptcha = (props) => {
9
- const { t } = localeBrowser.useTranslation();
10
- const config = props.config;
11
- const themeColor = config.theme === "light" ? "light" : "dark";
12
- const frictionlessState = props.frictionlessState;
13
- const theme = props.config.theme === "light" ? webComponents.lightTheme : webComponents.darkTheme;
14
- const callbacks = props.callbacks || {};
15
- const [state, _updateState] = procaptchaCommon.useProcaptcha(react.useState, react.useRef);
16
- const updateState = procaptchaCommon.buildUpdateState(state, _updateState);
17
- const manager = react.useRef(
18
- Manager.Manager(config, state, updateState, callbacks, frictionlessState)
19
- );
20
- const captchaRef = react.useRef(null);
21
- react.useEffect(() => {
22
- if (config.language) {
23
- localeBrowser.i18n.changeLanguage(config.language);
24
- }
25
- }, [config.language]);
26
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: captchaRef, children: /* @__PURE__ */ jsxRuntime.jsx(
27
- "div",
28
- {
29
- style: {
30
- maxWidth: webComponents.WIDGET_MAX_WIDTH,
31
- maxHeight: "100%",
32
- overflowX: "auto"
33
- },
34
- children: /* @__PURE__ */ jsxRuntime.jsx(webComponents.ContainerDiv, { children: /* @__PURE__ */ jsxRuntime.jsx(webComponents.WidthBasedStylesDiv, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: webComponents.WIDGET_DIMENSIONS, "data-cy": "button-human", children: [
35
- " ",
36
- /* @__PURE__ */ jsxRuntime.jsxs(
37
- "div",
38
- {
39
- style: {
40
- padding: webComponents.WIDGET_PADDING,
41
- border: webComponents.WIDGET_BORDER,
42
- backgroundColor: theme.palette.background.default,
43
- borderColor: theme.palette.grey[300],
44
- borderRadius: webComponents.WIDGET_BORDER_RADIUS,
45
- display: "flex",
46
- alignItems: "center",
47
- flexWrap: "wrap",
48
- justifyContent: "space-between",
49
- minHeight: `${webComponents.WIDGET_INNER_HEIGHT}px`,
50
- overflow: "hidden"
51
- },
52
- children: [
53
- /* @__PURE__ */ jsxRuntime.jsx(
54
- "div",
55
- {
56
- style: { display: "inline-flex", flexDirection: "column" },
57
- children: /* @__PURE__ */ jsxRuntime.jsx(
58
- "div",
59
- {
60
- style: {
61
- display: "flex",
62
- justifyContent: "flex-start",
63
- alignItems: "center",
64
- flexWrap: "wrap"
65
- },
66
- children: /* @__PURE__ */ jsxRuntime.jsx(
67
- "div",
68
- {
69
- style: {
70
- display: "flex",
71
- alignItems: "center",
72
- justifyContent: "center",
73
- flexDirection: "column",
74
- verticalAlign: "middle"
75
- },
76
- children: /* @__PURE__ */ jsxRuntime.jsx(
77
- "div",
78
- {
79
- style: {
80
- display: "flex"
81
- },
82
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1 }, children: state.loading ? /* @__PURE__ */ jsxRuntime.jsx(
83
- webComponents.LoadingSpinner,
84
- {
85
- themeColor,
86
- "aria-label": "Loading spinner"
87
- }
88
- ) : /* @__PURE__ */ jsxRuntime.jsx(
89
- webComponents.Checkbox,
90
- {
91
- checked: state.isHuman,
92
- onChange: manager.current.start,
93
- themeColor,
94
- labelText: t("WIDGET.I_AM_HUMAN"),
95
- error: state.error,
96
- "aria-label": "human checkbox"
97
- }
98
- ) })
99
- }
100
- )
101
- }
102
- )
103
- }
104
- )
105
- }
106
- ),
107
- /* @__PURE__ */ jsxRuntime.jsx(
108
- "div",
109
- {
110
- style: { display: "inline-flex", flexDirection: "column" },
111
- children: /* @__PURE__ */ jsxRuntime.jsx(
112
- "a",
113
- {
114
- href: webComponents.WIDGET_URL,
115
- target: "_blank",
116
- "aria-label": webComponents.WIDGET_URL_TEXT,
117
- rel: "noreferrer",
118
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(webComponents.Logo, { themeColor, "aria-label": "Prosopo logo" }) })
119
- }
120
- )
121
- }
122
- )
123
- ]
124
- }
125
- )
126
- ] }) }) })
127
- }
128
- ) });
129
- };
130
- module.exports = Procaptcha;
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- require("./components/ProcaptchaWidget.cjs");
4
- const ProcaptchaPoW = require("./components/ProcaptchaPoW.cjs");
5
- exports.ProcaptchaPow = ProcaptchaPoW.ProcaptchaPow;
@@ -1,191 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const string = require("@polkadot/util/string");
4
- const account = require("@prosopo/account");
5
- const api = require("@prosopo/api");
6
- const common = require("@prosopo/common");
7
- const procaptchaCommon = require("@prosopo/procaptcha-common");
8
- const types = require("@prosopo/types");
9
- const util = require("@prosopo/util");
10
- const Manager = (configInput, state, onStateUpdate, callbacks, frictionlessState) => {
11
- const events = procaptchaCommon.getDefaultEvents(onStateUpdate, state, callbacks);
12
- const defaultState = () => {
13
- return {
14
- // note order matters! see buildUpdateState. These fields are set in order, so disable modal first, then set loading to false, etc.
15
- showModal: false,
16
- loading: false,
17
- index: 0,
18
- challenge: void 0,
19
- solutions: void 0,
20
- isHuman: false,
21
- captchaApi: void 0,
22
- account: void 0
23
- // don't handle timeout here, this should be handled by the state management
24
- };
25
- };
26
- const clearTimeout = () => {
27
- window.clearTimeout(Number(state.timeout));
28
- updateState({ timeout: void 0 });
29
- };
30
- const clearSuccessfulChallengeTimeout = () => {
31
- window.clearTimeout(Number(state.successfullChallengeTimeout));
32
- updateState({ successfullChallengeTimeout: void 0 });
33
- };
34
- const getConfig = () => {
35
- const config = {
36
- userAccountAddress: "",
37
- ...configInput
38
- };
39
- if (state.account) {
40
- config.userAccountAddress = state.account.account.address;
41
- }
42
- return types.ProcaptchaConfigSchema.parse(config);
43
- };
44
- const getAccount = () => {
45
- if (!state.account) {
46
- throw new common.ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
47
- context: { error: "Account not loaded" }
48
- });
49
- }
50
- const account2 = state.account;
51
- return { account: account2 };
52
- };
53
- const getDappAccount = () => {
54
- if (!state.dappAccount) {
55
- throw new common.ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
56
- }
57
- const dappAccount = state.dappAccount;
58
- return dappAccount;
59
- };
60
- const updateState = procaptchaCommon.buildUpdateState(state, onStateUpdate);
61
- const resetState = () => {
62
- clearTimeout();
63
- clearSuccessfulChallengeTimeout();
64
- updateState(defaultState());
65
- events.onReset();
66
- };
67
- const setValidChallengeTimeout = () => {
68
- const timeMillis = getConfig().captchas.pow.solutionTimeout;
69
- const successfullChallengeTimeout = setTimeout(() => {
70
- updateState({ isHuman: false });
71
- events.onExpired();
72
- }, timeMillis);
73
- updateState({ successfullChallengeTimeout });
74
- };
75
- const start = async () => {
76
- await procaptchaCommon.providerRetry(
77
- async () => {
78
- if (state.loading) {
79
- return;
80
- }
81
- if (state.isHuman) {
82
- return;
83
- }
84
- resetState();
85
- updateState({
86
- loading: true
87
- });
88
- updateState({ attemptCount: state.attemptCount + 1 });
89
- const config = getConfig();
90
- const ext = config.web2 ? new account.ExtensionWeb2() : new account.ExtensionWeb3();
91
- const user = await ext.getAccount(config);
92
- const userAccount = user.account.address;
93
- updateState({
94
- account: { account: { address: userAccount } }
95
- });
96
- updateState({ dappAccount: config.account.address });
97
- await util.sleep(100);
98
- if (!config.web2 && !config.userAccountAddress) {
99
- throw new common.ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
100
- context: {
101
- error: "Account address has not been set for web3 mode"
102
- }
103
- });
104
- }
105
- let getRandomProviderResponse = void 0;
106
- if (frictionlessState?.provider) {
107
- getRandomProviderResponse = frictionlessState.provider;
108
- } else {
109
- getRandomProviderResponse = await procaptchaCommon.getRandomActiveProvider(
110
- getConfig()
111
- );
112
- }
113
- const events2 = procaptchaCommon.getDefaultEvents(onStateUpdate, state, callbacks);
114
- const providerUrl = getRandomProviderResponse.provider.url;
115
- const providerApi = new api.ProviderApi(providerUrl, getDappAccount());
116
- const challenge = await providerApi.getPowCaptchaChallenge(
117
- userAccount,
118
- getDappAccount(),
119
- frictionlessState?.sessionId
120
- );
121
- if (challenge.error) {
122
- updateState({
123
- loading: false,
124
- error: challenge.error.message
125
- });
126
- } else {
127
- const solution = util.solvePoW(challenge.challenge, challenge.difficulty);
128
- const signer = user.extension?.signer;
129
- if (!signer || !signer.signRaw) {
130
- throw new common.ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", {
131
- context: {
132
- error: "Signer is not defined, cannot sign message to prove account ownership"
133
- }
134
- });
135
- }
136
- const userTimestampSignature = await signer.signRaw({
137
- address: userAccount,
138
- data: string.stringToHex(challenge[types.ApiParams.timestamp].toString()),
139
- type: "bytes"
140
- });
141
- const verifiedSolution = await providerApi.submitPowCaptchaSolution(
142
- challenge,
143
- getAccount().account.account.address,
144
- getDappAccount(),
145
- solution,
146
- userTimestampSignature.signature.toString(),
147
- config.captchas.pow.verifiedTimeout
148
- );
149
- if (verifiedSolution[types.ApiParams.verified]) {
150
- updateState({
151
- isHuman: true,
152
- loading: false
153
- });
154
- events2.onHuman(
155
- types.encodeProcaptchaOutput({
156
- [types.ApiParams.providerUrl]: providerUrl,
157
- [types.ApiParams.user]: getAccount().account.account.address,
158
- [types.ApiParams.dapp]: getDappAccount(),
159
- [types.ApiParams.challenge]: challenge.challenge,
160
- [types.ApiParams.nonce]: solution,
161
- [types.ApiParams.timestamp]: challenge.timestamp,
162
- [types.ApiParams.signature]: {
163
- [types.ApiParams.provider]: challenge.signature.provider,
164
- [types.ApiParams.user]: {
165
- [types.ApiParams.timestamp]: userTimestampSignature.signature.toString()
166
- }
167
- }
168
- })
169
- );
170
- setValidChallengeTimeout();
171
- } else {
172
- updateState({
173
- isHuman: false,
174
- loading: false
175
- });
176
- events2.onFailed();
177
- }
178
- }
179
- },
180
- start,
181
- resetState,
182
- state.attemptCount,
183
- 10
184
- );
185
- };
186
- return {
187
- start,
188
- resetState
189
- };
190
- };
191
- exports.Manager = Manager;
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Captcha.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Captcha.d.ts","sourceRoot":"","sources":["../../src/components/Captcha.tsx"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Captcha.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Captcha.js","sourceRoot":"","sources":["../../src/components/Captcha.tsx"],"names":[],"mappings":""}
@@ -1,8 +0,0 @@
1
- import type { ProcaptchaEvents } from "@prosopo/types";
2
- import { type LazyExoticComponent } from "react";
3
- import type { ReactElement } from "react";
4
- type ProcaptchaProps = React.ComponentProps<typeof ProcaptchaWidget>;
5
- declare const ProcaptchaWidget: LazyExoticComponent<(props: any, callbacks: Partial<ProcaptchaEvents>) => ReactElement>;
6
- export declare const ProcaptchaPow: (props: ProcaptchaProps) => import("@emotion/react/jsx-runtime").JSX.Element;
7
- export {};
8
- //# sourceMappingURL=ProcaptchaPoW.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProcaptchaPoW.d.ts","sourceRoot":"","sources":["../../src/components/ProcaptchaPoW.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,KAAK,mBAAmB,EAAkB,MAAM,OAAO,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAErE,QAAA,MAAM,gBAAgB,EAAE,mBAAmB,CAE1C,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,YAAY,CACd,CAAC;AAEtD,eAAO,MAAM,aAAa,UAAW,eAAe,qDAenD,CAAC"}
@@ -1,6 +0,0 @@
1
- import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
- import { ProcaptchaPlaceholder } from "@prosopo/web-components";
3
- import { Suspense, lazy } from "react";
4
- const ProcaptchaWidget = lazy(async () => import("./ProcaptchaWidget.js"));
5
- export const ProcaptchaPow = (props) => (_jsx(Suspense, { fallback: _jsx(ProcaptchaPlaceholder, { config: props.config, callbacks: props.callbacks }), children: _jsx(ProcaptchaWidget, { config: props.config, callbacks: props.callbacks, frictionlessState: props.frictionlessState }) }));
6
- //# sourceMappingURL=ProcaptchaPoW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProcaptchaPoW.js","sourceRoot":"","sources":["../../src/components/ProcaptchaPoW.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAA4B,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAKjE,MAAM,gBAAgB,GAGlB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CACxD,KAAC,QAAQ,IACR,QAAQ,EACP,KAAC,qBAAqB,IACrB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,SAAS,EAAE,KAAK,CAAC,SAAS,GACzB,YAGH,KAAC,gBAAgB,IAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,GACzC,GACQ,CACX,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { ProcaptchaProps } from "@prosopo/types";
2
- declare const Procaptcha: (props: ProcaptchaProps) => import("@emotion/react/jsx-runtime").JSX.Element;
3
- export default Procaptcha;
4
- //# sourceMappingURL=ProcaptchaWidget.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProcaptchaWidget.d.ts","sourceRoot":"","sources":["../../src/components/ProcaptchaWidget.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAqBtD,QAAA,MAAM,UAAU,UAAW,eAAe,qDAqHzC,CAAC;AACF,eAAe,UAAU,CAAC"}
@@ -1,55 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
- import { i18n, useTranslation } from "@prosopo/locale-browser";
3
- import { buildUpdateState, useProcaptcha } from "@prosopo/procaptcha-common";
4
- import { Checkbox, ContainerDiv, LoadingSpinner, Logo, WIDGET_BORDER, WIDGET_BORDER_RADIUS, WIDGET_DIMENSIONS, WIDGET_INNER_HEIGHT, WIDGET_MAX_WIDTH, WIDGET_PADDING, WIDGET_URL, WIDGET_URL_TEXT, WidthBasedStylesDiv, darkTheme, lightTheme, } from "@prosopo/web-components";
5
- import { useEffect, useRef, useState } from "react";
6
- import { Manager } from "../services/Manager.js";
7
- const Procaptcha = (props) => {
8
- const { t } = useTranslation();
9
- const config = props.config;
10
- const themeColor = config.theme === "light" ? "light" : "dark";
11
- const frictionlessState = props.frictionlessState;
12
- const theme = props.config.theme === "light" ? lightTheme : darkTheme;
13
- const callbacks = props.callbacks || {};
14
- const [state, _updateState] = useProcaptcha(useState, useRef);
15
- const updateState = buildUpdateState(state, _updateState);
16
- const manager = useRef(Manager(config, state, updateState, callbacks, frictionlessState));
17
- const captchaRef = useRef(null);
18
- useEffect(() => {
19
- if (config.language) {
20
- i18n.changeLanguage(config.language);
21
- }
22
- }, [config.language]);
23
- return (_jsx("div", { ref: captchaRef, children: _jsx("div", { style: {
24
- maxWidth: WIDGET_MAX_WIDTH,
25
- maxHeight: "100%",
26
- overflowX: "auto",
27
- }, children: _jsx(ContainerDiv, { children: _jsx(WidthBasedStylesDiv, { children: _jsxs("div", { style: WIDGET_DIMENSIONS, "data-cy": "button-human", children: [" ", _jsxs("div", { style: {
28
- padding: WIDGET_PADDING,
29
- border: WIDGET_BORDER,
30
- backgroundColor: theme.palette.background.default,
31
- borderColor: theme.palette.grey[300],
32
- borderRadius: WIDGET_BORDER_RADIUS,
33
- display: "flex",
34
- alignItems: "center",
35
- flexWrap: "wrap",
36
- justifyContent: "space-between",
37
- minHeight: `${WIDGET_INNER_HEIGHT}px`,
38
- overflow: "hidden",
39
- }, children: [_jsx("div", { style: { display: "inline-flex", flexDirection: "column" }, children: _jsx("div", { style: {
40
- display: "flex",
41
- justifyContent: "flex-start",
42
- alignItems: "center",
43
- flexWrap: "wrap",
44
- }, children: _jsx("div", { style: {
45
- display: "flex",
46
- alignItems: "center",
47
- justifyContent: "center",
48
- flexDirection: "column",
49
- verticalAlign: "middle",
50
- }, children: _jsx("div", { style: {
51
- display: "flex",
52
- }, children: _jsx("div", { style: { flex: 1 }, children: state.loading ? (_jsx(LoadingSpinner, { themeColor: themeColor, "aria-label": "Loading spinner" })) : (_jsx(Checkbox, { checked: state.isHuman, onChange: manager.current.start, themeColor: themeColor, labelText: t("WIDGET.I_AM_HUMAN"), error: state.error, "aria-label": "human checkbox" })) }) }) }) }) }), _jsx("div", { style: { display: "inline-flex", flexDirection: "column" }, children: _jsx("a", { href: WIDGET_URL, target: "_blank", "aria-label": WIDGET_URL_TEXT, rel: "noreferrer", children: _jsx("div", { style: { flex: 1 }, children: _jsx(Logo, { themeColor: themeColor, "aria-label": "Prosopo logo" }) }) }) })] })] }) }) }) }) }));
53
- };
54
- export default Procaptcha;
55
- //# sourceMappingURL=ProcaptchaWidget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProcaptchaWidget.js","sourceRoot":"","sources":["../../src/components/ProcaptchaWidget.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from "./components/ProcaptchaWidget.js";
2
- export * from "./components/ProcaptchaPoW.js";
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC"}
package/dist/index.js DELETED
@@ -1,3 +0,0 @@
1
- export * from "./components/ProcaptchaWidget.js";
2
- export * from "./components/ProcaptchaPoW.js";
3
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC"}
@@ -1,6 +0,0 @@
1
- import { type FrictionlessState, type ProcaptchaCallbacks, type ProcaptchaClientConfigInput, type ProcaptchaState, type ProcaptchaStateUpdateFn } from "@prosopo/types";
2
- export declare const Manager: (configInput: ProcaptchaClientConfigInput, state: ProcaptchaState, onStateUpdate: ProcaptchaStateUpdateFn, callbacks: ProcaptchaCallbacks, frictionlessState?: FrictionlessState) => {
3
- start: () => Promise<void>;
4
- resetState: () => void;
5
- };
6
- //# sourceMappingURL=Manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Manager.d.ts","sourceRoot":"","sources":["../../src/services/Manager.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGN,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAEhC,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAE5B,MAAM,gBAAgB,CAAC;AAIxB,eAAO,MAAM,OAAO,gBACN,2BAA2B,SACjC,eAAe,iBACP,uBAAuB,aAC3B,mBAAmB,sBACV,iBAAiB;;;CA6OrC,CAAC"}
@@ -1,170 +0,0 @@
1
- import { stringToHex } from "@polkadot/util/string";
2
- import { ExtensionWeb2, ExtensionWeb3 } from "@prosopo/account";
3
- import { ProviderApi } from "@prosopo/api";
4
- import { ProsopoEnvError } from "@prosopo/common";
5
- import { buildUpdateState, getDefaultEvents, getRandomActiveProvider, providerRetry, } from "@prosopo/procaptcha-common";
6
- import { ApiParams, ProcaptchaConfigSchema, encodeProcaptchaOutput, } from "@prosopo/types";
7
- import { sleep } from "@prosopo/util";
8
- import { solvePoW } from "@prosopo/util";
9
- export const Manager = (configInput, state, onStateUpdate, callbacks, frictionlessState) => {
10
- const events = getDefaultEvents(onStateUpdate, state, callbacks);
11
- const defaultState = () => {
12
- return {
13
- showModal: false,
14
- loading: false,
15
- index: 0,
16
- challenge: undefined,
17
- solutions: undefined,
18
- isHuman: false,
19
- captchaApi: undefined,
20
- account: undefined,
21
- };
22
- };
23
- const clearTimeout = () => {
24
- window.clearTimeout(Number(state.timeout));
25
- updateState({ timeout: undefined });
26
- };
27
- const clearSuccessfulChallengeTimeout = () => {
28
- window.clearTimeout(Number(state.successfullChallengeTimeout));
29
- updateState({ successfullChallengeTimeout: undefined });
30
- };
31
- const getConfig = () => {
32
- const config = {
33
- userAccountAddress: "",
34
- ...configInput,
35
- };
36
- if (state.account) {
37
- config.userAccountAddress = state.account.account.address;
38
- }
39
- return ProcaptchaConfigSchema.parse(config);
40
- };
41
- const getAccount = () => {
42
- if (!state.account) {
43
- throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
44
- context: { error: "Account not loaded" },
45
- });
46
- }
47
- const account = state.account;
48
- return { account };
49
- };
50
- const getDappAccount = () => {
51
- if (!state.dappAccount) {
52
- throw new ProsopoEnvError("GENERAL.SITE_KEY_MISSING");
53
- }
54
- const dappAccount = state.dappAccount;
55
- return dappAccount;
56
- };
57
- const updateState = buildUpdateState(state, onStateUpdate);
58
- const resetState = () => {
59
- clearTimeout();
60
- clearSuccessfulChallengeTimeout();
61
- updateState(defaultState());
62
- events.onReset();
63
- };
64
- const setValidChallengeTimeout = () => {
65
- const timeMillis = getConfig().captchas.pow.solutionTimeout;
66
- const successfullChallengeTimeout = setTimeout(() => {
67
- updateState({ isHuman: false });
68
- events.onExpired();
69
- }, timeMillis);
70
- updateState({ successfullChallengeTimeout });
71
- };
72
- const start = async () => {
73
- await providerRetry(async () => {
74
- if (state.loading) {
75
- return;
76
- }
77
- if (state.isHuman) {
78
- return;
79
- }
80
- resetState();
81
- updateState({
82
- loading: true,
83
- });
84
- updateState({ attemptCount: state.attemptCount + 1 });
85
- const config = getConfig();
86
- const ext = config.web2 ? new ExtensionWeb2() : new ExtensionWeb3();
87
- const user = await ext.getAccount(config);
88
- const userAccount = user.account.address;
89
- updateState({
90
- account: { account: { address: userAccount } },
91
- });
92
- updateState({ dappAccount: config.account.address });
93
- await sleep(100);
94
- if (!config.web2 && !config.userAccountAddress) {
95
- throw new ProsopoEnvError("GENERAL.ACCOUNT_NOT_FOUND", {
96
- context: {
97
- error: "Account address has not been set for web3 mode",
98
- },
99
- });
100
- }
101
- let getRandomProviderResponse = undefined;
102
- if (frictionlessState?.provider) {
103
- getRandomProviderResponse = frictionlessState.provider;
104
- }
105
- else {
106
- getRandomProviderResponse = await getRandomActiveProvider(getConfig());
107
- }
108
- const events = getDefaultEvents(onStateUpdate, state, callbacks);
109
- const providerUrl = getRandomProviderResponse.provider.url;
110
- const providerApi = new ProviderApi(providerUrl, getDappAccount());
111
- const challenge = await providerApi.getPowCaptchaChallenge(userAccount, getDappAccount(), frictionlessState?.sessionId);
112
- if (challenge.error) {
113
- updateState({
114
- loading: false,
115
- error: challenge.error.message,
116
- });
117
- }
118
- else {
119
- const solution = solvePoW(challenge.challenge, challenge.difficulty);
120
- const signer = user.extension?.signer;
121
- if (!signer || !signer.signRaw) {
122
- throw new ProsopoEnvError("GENERAL.CANT_FIND_KEYRINGPAIR", {
123
- context: {
124
- error: "Signer is not defined, cannot sign message to prove account ownership",
125
- },
126
- });
127
- }
128
- const userTimestampSignature = await signer.signRaw({
129
- address: userAccount,
130
- data: stringToHex(challenge[ApiParams.timestamp].toString()),
131
- type: "bytes",
132
- });
133
- const verifiedSolution = await providerApi.submitPowCaptchaSolution(challenge, getAccount().account.account.address, getDappAccount(), solution, userTimestampSignature.signature.toString(), config.captchas.pow.verifiedTimeout);
134
- if (verifiedSolution[ApiParams.verified]) {
135
- updateState({
136
- isHuman: true,
137
- loading: false,
138
- });
139
- events.onHuman(encodeProcaptchaOutput({
140
- [ApiParams.providerUrl]: providerUrl,
141
- [ApiParams.user]: getAccount().account.account.address,
142
- [ApiParams.dapp]: getDappAccount(),
143
- [ApiParams.challenge]: challenge.challenge,
144
- [ApiParams.nonce]: solution,
145
- [ApiParams.timestamp]: challenge.timestamp,
146
- [ApiParams.signature]: {
147
- [ApiParams.provider]: challenge.signature.provider,
148
- [ApiParams.user]: {
149
- [ApiParams.timestamp]: userTimestampSignature.signature.toString(),
150
- },
151
- },
152
- }));
153
- setValidChallengeTimeout();
154
- }
155
- else {
156
- updateState({
157
- isHuman: false,
158
- loading: false,
159
- });
160
- events.onFailed();
161
- }
162
- }
163
- }, start, resetState, state.attemptCount, 10);
164
- };
165
- return {
166
- start,
167
- resetState,
168
- };
169
- };
170
- //# sourceMappingURL=Manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Manager.js","sourceRoot":"","sources":["../../src/services/Manager.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEN,SAAS,EAIT,sBAAsB,EAGtB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,CACtB,WAAwC,EACxC,KAAsB,EACtB,aAAsC,EACtC,SAA8B,EAC9B,iBAAqC,EACpC,EAAE;IACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,GAA6B,EAAE;QACnD,OAAO;YAEN,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,SAAS;SAElB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QAEzB,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAE3C,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,+BAA+B,GAAG,GAAG,EAAE;QAE5C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAE/D,WAAW,CAAC,EAAE,2BAA2B,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,MAAM,MAAM,GAAgC;YAC3C,kBAAkB,EAAE,EAAE;YACtB,GAAG,WAAW;SACd,CAAC;QAIF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3D,CAAC;QAED,OAAO,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;gBACtD,OAAO,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;aACxC,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,WAAW,GAAW,KAAK,CAAC,WAAW,CAAC;QAC9C,OAAO,WAAW,CAAC;IACpB,CAAC,CAAC;IAGF,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG,GAAG,EAAE;QAEvB,YAAY,EAAE,CAAC;QACf,+BAA+B,EAAE,CAAC;QAClC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,wBAAwB,GAAG,GAAG,EAAE;QACrC,MAAM,UAAU,GAAW,SAAS,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;QACpE,MAAM,2BAA2B,GAAG,UAAU,CAAC,GAAG,EAAE;YAEnD,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEhC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,WAAW,CAAC,EAAE,2BAA2B,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,aAAa,CAClB,KAAK,IAAI,EAAE;YACV,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YAED,UAAU,EAAE,CAAC;YAGb,WAAW,CAAC;gBACX,OAAO,EAAE,IAAI;aACb,CAAC,CAAC;YACH,WAAW,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAG3B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;YAGpE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAGzC,WAAW,CAAC;gBACX,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;aAC9C,CAAC,CAAC;YAGH,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAGrD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAGjB,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAChD,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;oBACtD,OAAO,EAAE;wBACR,KAAK,EAAE,gDAAgD;qBACvD;iBACD,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,yBAAyB,GAAG,SAAS,CAAC;YAE1C,IAAI,iBAAiB,EAAE,QAAQ,EAAE,CAAC;gBACjC,yBAAyB,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACxD,CAAC;iBAAM,CAAC;gBAEP,yBAAyB,GAAG,MAAM,uBAAuB,CACxD,SAAS,EAAE,CACX,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAEjE,MAAM,WAAW,GAAG,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAE3D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;YAEnE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,sBAAsB,CACzD,WAAW,EACX,cAAc,EAAE,EAChB,iBAAiB,EAAE,SAAS,CAC5B,CAAC;YAEF,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACrB,WAAW,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO;iBAC9B,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBAErE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEtC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAChC,MAAM,IAAI,eAAe,CAAC,+BAA+B,EAAE;wBAC1D,OAAO,EAAE;4BACR,KAAK,EACJ,uEAAuE;yBACxE;qBACD,CAAC,CAAC;gBACJ,CAAC;gBAED,MAAM,sBAAsB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;oBACnD,OAAO,EAAE,WAAW;oBACpB,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC5D,IAAI,EAAE,OAAO;iBACb,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,wBAAwB,CAClE,SAAS,EACT,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EACpC,cAAc,EAAE,EAChB,QAAQ,EACR,sBAAsB,CAAC,SAAS,CAAC,QAAQ,EAAE,EAC3C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CACnC,CAAC;gBACF,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,WAAW,CAAC;wBACX,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,KAAK;qBACd,CAAC,CAAC;oBAEH,MAAM,CAAC,OAAO,CACb,sBAAsB,CAAC;wBACtB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW;wBACpC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;wBACtD,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE;wBAClC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS;wBAC1C,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ;wBAC3B,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS;wBAC1C,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;4BACtB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ;4BAClD,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gCACjB,CAAC,SAAS,CAAC,SAAS,CAAC,EACpB,sBAAsB,CAAC,SAAS,CAAC,QAAQ,EAAE;6BAC5C;yBACD;qBACD,CAAC,CACF,CAAC;oBACF,wBAAwB,EAAE,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACP,WAAW,CAAC;wBACX,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,KAAK;qBACd,CAAC,CAAC;oBACH,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACnB,CAAC;YACF,CAAC;QACF,CAAC,EACD,KAAK,EACL,UAAU,EACV,KAAK,CAAC,YAAY,EAClB,EAAE,CACF,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACN,KAAK;QACL,UAAU;KACV,CAAC;AACH,CAAC,CAAC"}