@campnetwork/origin 0.0.1 → 0.0.2
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/core.cjs +54 -108
- package/dist/core.d.ts +1 -75
- package/dist/core.esm.d.ts +1 -75
- package/dist/core.esm.js +61 -115
- package/dist/react/index.esm.d.ts +232 -2
- package/dist/react/index.esm.js +1130 -449
- package/package.json +1 -1
package/dist/react/index.esm.js
CHANGED
|
@@ -1,42 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import React, { createContext, useState, useContext,
|
|
3
|
-
import {
|
|
2
|
+
import React, { createContext, useState, useContext, useEffect, useLayoutEffect, useRef, useSyncExternalStore } from 'react';
|
|
3
|
+
import { custom, createWalletClient, createPublicClient, http, getAbiItem, encodeFunctionData } from 'viem';
|
|
4
|
+
import { toAccount } from 'viem/accounts';
|
|
5
|
+
import { createSiweMessage } from 'viem/siwe';
|
|
6
|
+
import axios from 'axios';
|
|
4
7
|
import { WagmiContext, useAccount, useConnectorClient } from 'wagmi';
|
|
5
|
-
import 'axios';
|
|
6
|
-
import 'viem';
|
|
7
|
-
import 'viem/accounts';
|
|
8
|
-
import 'viem/siwe';
|
|
9
|
-
import { EthereumProvider } from '@walletconnect/ethereum-provider';
|
|
10
8
|
import ReactDOM, { createPortal } from 'react-dom';
|
|
11
9
|
import { useQuery } from '@tanstack/react-query';
|
|
12
10
|
|
|
13
|
-
const ModalContext = createContext({
|
|
14
|
-
isButtonDisabled: false,
|
|
15
|
-
setIsButtonDisabled: () => { },
|
|
16
|
-
isVisible: false,
|
|
17
|
-
setIsVisible: () => { },
|
|
18
|
-
isLinkingVisible: false,
|
|
19
|
-
setIsLinkingVisible: () => { },
|
|
20
|
-
currentlyLinking: null,
|
|
21
|
-
setCurrentlyLinking: () => { },
|
|
22
|
-
});
|
|
23
|
-
const ModalProvider = ({ children }) => {
|
|
24
|
-
const [isVisible, setIsVisible] = useState(false);
|
|
25
|
-
const [isLinkingVisible, setIsLinkingVisible] = useState(false);
|
|
26
|
-
const [currentlyLinking, setCurrentlyLinking] = useState(null);
|
|
27
|
-
const [isButtonDisabled, setIsButtonDisabled] = useState(false);
|
|
28
|
-
return (React.createElement(ModalContext.Provider, { value: {
|
|
29
|
-
isButtonDisabled,
|
|
30
|
-
setIsButtonDisabled,
|
|
31
|
-
isVisible,
|
|
32
|
-
setIsVisible,
|
|
33
|
-
isLinkingVisible,
|
|
34
|
-
setIsLinkingVisible,
|
|
35
|
-
currentlyLinking,
|
|
36
|
-
setCurrentlyLinking,
|
|
37
|
-
} }, children));
|
|
38
|
-
};
|
|
39
|
-
|
|
40
11
|
/******************************************************************************
|
|
41
12
|
Copyright (c) Microsoft Corporation.
|
|
42
13
|
|
|
@@ -76,42 +47,39 @@ function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
76
47
|
});
|
|
77
48
|
}
|
|
78
49
|
|
|
50
|
+
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|
51
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
52
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
53
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
57
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
58
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
59
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
60
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
61
|
+
}
|
|
62
|
+
|
|
79
63
|
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
80
64
|
var e = new Error(message);
|
|
81
65
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
82
66
|
};
|
|
83
67
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const formatAddress = (address, n = 8) => {
|
|
91
|
-
return `${address.slice(0, n)}...${address.slice(-n)}`;
|
|
92
|
-
};
|
|
93
|
-
/**
|
|
94
|
-
* Capitalizes the first letter of a string.
|
|
95
|
-
* @param {string} str - The string to capitalize.
|
|
96
|
-
* @return {string} - The capitalized string.
|
|
97
|
-
*/
|
|
98
|
-
const capitalize = (str) => {
|
|
99
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
100
|
-
};
|
|
101
|
-
/**
|
|
102
|
-
* Formats a Camp amount to a human-readable string.
|
|
103
|
-
* @param {number} amount - The Camp amount to format.
|
|
104
|
-
* @returns {string} - The formatted Camp amount.
|
|
105
|
-
*/
|
|
106
|
-
const formatCampAmount = (amount) => {
|
|
107
|
-
if (amount >= 1000) {
|
|
108
|
-
const formatted = (amount / 1000).toFixed(1);
|
|
109
|
-
return formatted.endsWith(".0")
|
|
110
|
-
? formatted.slice(0, -2) + "k"
|
|
111
|
-
: formatted + "k";
|
|
68
|
+
class APIError extends Error {
|
|
69
|
+
constructor(message, statusCode) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.name = "APIError";
|
|
72
|
+
this.statusCode = statusCode || 500;
|
|
73
|
+
Error.captureStackTrace(this, this.constructor);
|
|
112
74
|
}
|
|
113
|
-
|
|
114
|
-
|
|
75
|
+
toJSON() {
|
|
76
|
+
return {
|
|
77
|
+
error: this.name,
|
|
78
|
+
message: this.message,
|
|
79
|
+
statusCode: this.statusCode || 500,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
115
83
|
|
|
116
84
|
const testnet = {
|
|
117
85
|
id: 123420001114,
|
|
@@ -137,6 +105,41 @@ const testnet = {
|
|
|
137
105
|
},
|
|
138
106
|
};
|
|
139
107
|
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
let client = null;
|
|
110
|
+
let publicClient = null;
|
|
111
|
+
const getClient = (provider, name = "window.ethereum", address) => {
|
|
112
|
+
var _a;
|
|
113
|
+
if (!provider && !client) {
|
|
114
|
+
console.warn("Provider is required to create a client.");
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (!client ||
|
|
118
|
+
(client.transport.name !== name && provider) ||
|
|
119
|
+
(address !== ((_a = client.account) === null || _a === void 0 ? void 0 : _a.address) && provider)) {
|
|
120
|
+
const obj = {
|
|
121
|
+
chain: testnet,
|
|
122
|
+
transport: custom(provider, {
|
|
123
|
+
name: name,
|
|
124
|
+
}),
|
|
125
|
+
};
|
|
126
|
+
if (address) {
|
|
127
|
+
obj.account = toAccount(address);
|
|
128
|
+
}
|
|
129
|
+
client = createWalletClient(obj);
|
|
130
|
+
}
|
|
131
|
+
return client;
|
|
132
|
+
};
|
|
133
|
+
const getPublicClient = () => {
|
|
134
|
+
if (!publicClient) {
|
|
135
|
+
publicClient = createPublicClient({
|
|
136
|
+
chain: testnet,
|
|
137
|
+
transport: http(),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return publicClient;
|
|
141
|
+
};
|
|
142
|
+
|
|
140
143
|
var constants = {
|
|
141
144
|
SIWE_MESSAGE_STATEMENT: "Connect with Camp Network",
|
|
142
145
|
AUTH_HUB_BASE_API: "https://wv2h4to5qa.execute-api.us-east-2.amazonaws.com/dev",
|
|
@@ -182,391 +185,1028 @@ const providerStore = {
|
|
|
182
185
|
};
|
|
183
186
|
|
|
184
187
|
/**
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
190
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
191
|
-
in the Software without restriction, including without limitation the rights
|
|
192
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
193
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
194
|
-
furnished to do so, subject to the following conditions:
|
|
195
|
-
|
|
196
|
-
The above copyright notice and this permission notice shall be included in
|
|
197
|
-
all copies or substantial portions of the Software.
|
|
198
|
-
|
|
199
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
200
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
201
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
202
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
203
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
204
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
205
|
-
THE SOFTWARE.
|
|
206
|
-
*/
|
|
207
|
-
const isBrowser = typeof window !== "undefined";
|
|
208
|
-
const navigator = isBrowser
|
|
209
|
-
? window === null || window === void 0 ? void 0 : window.navigator
|
|
210
|
-
: {
|
|
211
|
-
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
|
|
212
|
-
language: "en",
|
|
213
|
-
languages: [],
|
|
214
|
-
platform: "",
|
|
215
|
-
vendor: "",
|
|
216
|
-
maxTouchPoints: 0,
|
|
217
|
-
hardwareConcurrency: 0,
|
|
218
|
-
deviceMemory: 0,
|
|
219
|
-
};
|
|
220
|
-
const location = isBrowser
|
|
221
|
-
? window === null || window === void 0 ? void 0 : window.location
|
|
222
|
-
: {
|
|
223
|
-
href: "",
|
|
224
|
-
protocol: "",
|
|
225
|
-
host: "",
|
|
226
|
-
hostname: "",
|
|
227
|
-
port: "",
|
|
228
|
-
pathname: "",
|
|
229
|
-
search: "",
|
|
230
|
-
hash: "",
|
|
231
|
-
};
|
|
232
|
-
/**
|
|
233
|
-
* Validates options and sets defaults for undefined properties.
|
|
234
|
-
* @param {?Object} opts
|
|
235
|
-
* @returns {Object} opts - Validated options.
|
|
236
|
-
*/
|
|
237
|
-
const validate = function (opts = {}) {
|
|
238
|
-
// Create new object to avoid changes by reference
|
|
239
|
-
const _opts = {};
|
|
240
|
-
// Defaults to false
|
|
241
|
-
_opts.detailed = opts.detailed === true;
|
|
242
|
-
// Defaults to true
|
|
243
|
-
_opts.ignoreLocalhost = opts.ignoreLocalhost !== false;
|
|
244
|
-
// Defaults to true
|
|
245
|
-
_opts.ignoreOwnVisits = opts.ignoreOwnVisits !== false;
|
|
246
|
-
return _opts;
|
|
247
|
-
};
|
|
248
|
-
/**
|
|
249
|
-
* Determines if a host is a localhost.
|
|
250
|
-
* @param {String} hostname - Hostname that should be tested.
|
|
251
|
-
* @returns {Boolean} isLocalhost
|
|
252
|
-
*/
|
|
253
|
-
const isLocalhost = function (hostname) {
|
|
254
|
-
return (hostname === "" ||
|
|
255
|
-
hostname === "localhost" ||
|
|
256
|
-
hostname === "127.0.0.1" ||
|
|
257
|
-
hostname === "::1");
|
|
258
|
-
};
|
|
259
|
-
/**
|
|
260
|
-
* Determines if user agent is a bot. Approach is to get most bots, assuming other bots don't run JS.
|
|
261
|
-
* Source: https://stackoverflow.com/questions/20084513/detect-search-crawlers-via-javascript/20084661
|
|
262
|
-
* @param {String} userAgent - User agent that should be tested.
|
|
263
|
-
* @returns {Boolean} isBot
|
|
264
|
-
*/
|
|
265
|
-
const isBot = function (userAgent) {
|
|
266
|
-
return /bot|crawler|spider|crawling/i.test(userAgent);
|
|
267
|
-
};
|
|
268
|
-
/**
|
|
269
|
-
* Checks if an id is a fake id. This is the case when Ackee ignores you because of the `ackee_ignore` cookie.
|
|
270
|
-
* @param {String} id - Id that should be tested.
|
|
271
|
-
* @returns {Boolean} isFakeId
|
|
272
|
-
*/
|
|
273
|
-
const isFakeId = function (id) {
|
|
274
|
-
return id === "88888888-8888-8888-8888-888888888888";
|
|
275
|
-
};
|
|
276
|
-
/**
|
|
277
|
-
* Checks if the website is in background (e.g. user has minimzed or switched tabs).
|
|
278
|
-
* @returns {boolean}
|
|
279
|
-
*/
|
|
280
|
-
const isInBackground = function () {
|
|
281
|
-
return document.visibilityState === "hidden";
|
|
282
|
-
};
|
|
283
|
-
/**
|
|
284
|
-
* Get the optional source parameter.
|
|
285
|
-
* @returns {String} source
|
|
286
|
-
*/
|
|
287
|
-
const source = function () {
|
|
288
|
-
const source = (location.search.split(`source=`)[1] || "").split("&")[0];
|
|
289
|
-
return source === "" ? undefined : source;
|
|
290
|
-
};
|
|
291
|
-
/**
|
|
292
|
-
* Gathers all platform-, screen- and user-related information.
|
|
293
|
-
* @param {Boolean} detailed - Include personal data.
|
|
294
|
-
* @returns {Object} attributes - User-related information.
|
|
295
|
-
*/
|
|
296
|
-
const attributes = function (detailed = false) {
|
|
297
|
-
var _a;
|
|
298
|
-
const defaultData = {
|
|
299
|
-
siteLocation: (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.href,
|
|
300
|
-
siteReferrer: document.referrer,
|
|
301
|
-
source: source(),
|
|
302
|
-
};
|
|
303
|
-
const detailedData = {
|
|
304
|
-
siteLanguage: navigator
|
|
305
|
-
? ((navigator === null || navigator === void 0 ? void 0 : navigator.language) || (navigator === null || navigator === void 0 ? void 0 : navigator.language) || "").substr(0, 2)
|
|
306
|
-
: "",
|
|
307
|
-
screenWidth: screen.width,
|
|
308
|
-
screenHeight: screen.height,
|
|
309
|
-
screenColorDepth: screen.colorDepth,
|
|
310
|
-
browserWidth: window === null || window === void 0 ? void 0 : window.outerWidth,
|
|
311
|
-
browserHeight: window === null || window === void 0 ? void 0 : window.outerHeight,
|
|
312
|
-
};
|
|
313
|
-
return Object.assign(Object.assign({}, defaultData), (detailed === true ? detailedData : {}));
|
|
314
|
-
};
|
|
315
|
-
/**
|
|
316
|
-
* Creates an object with a query and variables property to create a record on the server.
|
|
317
|
-
* @param {String} domainId - Id of the domain.
|
|
318
|
-
* @param {Object} input - Data that should be transferred to the server.
|
|
319
|
-
* @returns {Object} Create record body.
|
|
188
|
+
* Formats an Ethereum address by truncating it to the first and last n characters.
|
|
189
|
+
* @param {string} address - The Ethereum address to format.
|
|
190
|
+
* @param {number} n - The number of characters to keep from the start and end of the address.
|
|
191
|
+
* @return {string} - The formatted address.
|
|
320
192
|
*/
|
|
321
|
-
const
|
|
322
|
-
return {
|
|
323
|
-
query: `
|
|
324
|
-
mutation createRecord($domainId: ID!, $input: CreateRecordInput!) {
|
|
325
|
-
createRecord(domainId: $domainId, input: $input) {
|
|
326
|
-
payload {
|
|
327
|
-
id
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
`,
|
|
332
|
-
variables: {
|
|
333
|
-
domainId,
|
|
334
|
-
input,
|
|
335
|
-
},
|
|
336
|
-
};
|
|
193
|
+
const formatAddress = (address, n = 8) => {
|
|
194
|
+
return `${address.slice(0, n)}...${address.slice(-n)}`;
|
|
337
195
|
};
|
|
338
196
|
/**
|
|
339
|
-
*
|
|
340
|
-
* @param {
|
|
341
|
-
* @
|
|
197
|
+
* Capitalizes the first letter of a string.
|
|
198
|
+
* @param {string} str - The string to capitalize.
|
|
199
|
+
* @return {string} - The capitalized string.
|
|
342
200
|
*/
|
|
343
|
-
const
|
|
344
|
-
return
|
|
345
|
-
query: `
|
|
346
|
-
mutation updateRecord($recordId: ID!) {
|
|
347
|
-
updateRecord(id: $recordId) {
|
|
348
|
-
success
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
`,
|
|
352
|
-
variables: {
|
|
353
|
-
recordId,
|
|
354
|
-
},
|
|
355
|
-
};
|
|
201
|
+
const capitalize = (str) => {
|
|
202
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
356
203
|
};
|
|
357
204
|
/**
|
|
358
|
-
*
|
|
359
|
-
* @param {
|
|
360
|
-
* @
|
|
361
|
-
* @returns {Object} Create action body.
|
|
205
|
+
* Formats a Camp amount to a human-readable string.
|
|
206
|
+
* @param {number} amount - The Camp amount to format.
|
|
207
|
+
* @returns {string} - The formatted Camp amount.
|
|
362
208
|
*/
|
|
363
|
-
const
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
`,
|
|
374
|
-
variables: {
|
|
375
|
-
eventId,
|
|
376
|
-
input,
|
|
377
|
-
},
|
|
378
|
-
};
|
|
209
|
+
const formatCampAmount = (amount) => {
|
|
210
|
+
if (amount >= 1000) {
|
|
211
|
+
const formatted = (amount / 1000).toFixed(1);
|
|
212
|
+
return formatted.endsWith(".0")
|
|
213
|
+
? formatted.slice(0, -2) + "k"
|
|
214
|
+
: formatted + "k";
|
|
215
|
+
}
|
|
216
|
+
return amount.toString();
|
|
379
217
|
};
|
|
380
218
|
/**
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
* @param {
|
|
384
|
-
* @
|
|
219
|
+
* Uploads a file to a specified URL with progress tracking.
|
|
220
|
+
* Falls back to a simple fetch request if XMLHttpRequest is not available.
|
|
221
|
+
* @param {File} file - The file to upload.
|
|
222
|
+
* @param {string} url - The URL to upload the file to.
|
|
223
|
+
* @param {UploadProgressCallback} onProgress - A callback function to track upload progress.
|
|
224
|
+
* @returns {Promise<string>} - A promise that resolves with the response from the server.
|
|
385
225
|
*/
|
|
386
|
-
const
|
|
387
|
-
return {
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
226
|
+
const uploadWithProgress = (file, url, onProgress) => {
|
|
227
|
+
return new Promise((resolve, reject) => {
|
|
228
|
+
axios
|
|
229
|
+
.put(url, file, Object.assign({ headers: {
|
|
230
|
+
"Content-Type": file.type,
|
|
231
|
+
} }, (typeof window !== "undefined" && typeof onProgress === "function"
|
|
232
|
+
? {
|
|
233
|
+
onUploadProgress: (progressEvent) => {
|
|
234
|
+
if (progressEvent.total) {
|
|
235
|
+
const percent = (progressEvent.loaded / progressEvent.total) * 100;
|
|
236
|
+
onProgress(percent);
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
}
|
|
240
|
+
: {})))
|
|
241
|
+
.then((res) => {
|
|
242
|
+
resolve(res.data);
|
|
243
|
+
})
|
|
244
|
+
.catch((error) => {
|
|
245
|
+
var _a;
|
|
246
|
+
const message = ((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) || (error === null || error === void 0 ? void 0 : error.message) || "Upload failed";
|
|
247
|
+
reject(message);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
400
250
|
};
|
|
251
|
+
|
|
252
|
+
var _Origin_generateURL, _Origin_setOriginStatus;
|
|
401
253
|
/**
|
|
402
|
-
*
|
|
403
|
-
*
|
|
404
|
-
* @returns {String} endpoint - URL to the GraphQL endpoint of the Ackee server.
|
|
254
|
+
* The Origin class
|
|
255
|
+
* Handles the upload of files to Origin, as well as querying the user's stats
|
|
405
256
|
*/
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
257
|
+
class Origin {
|
|
258
|
+
constructor(jwt) {
|
|
259
|
+
_Origin_generateURL.set(this, (file) => __awaiter(this, void 0, void 0, function* () {
|
|
260
|
+
const uploadRes = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/origin/upload-url`, {
|
|
261
|
+
method: "POST",
|
|
262
|
+
body: JSON.stringify({
|
|
263
|
+
name: file.name,
|
|
264
|
+
type: file.type,
|
|
265
|
+
}),
|
|
266
|
+
headers: {
|
|
267
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
const data = yield uploadRes.json();
|
|
271
|
+
return data.isError ? data.message : data.data;
|
|
272
|
+
}));
|
|
273
|
+
_Origin_setOriginStatus.set(this, (key, status) => __awaiter(this, void 0, void 0, function* () {
|
|
274
|
+
const res = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/origin/update-status`, {
|
|
275
|
+
method: "PATCH",
|
|
276
|
+
body: JSON.stringify({
|
|
277
|
+
status,
|
|
278
|
+
fileKey: key,
|
|
279
|
+
}),
|
|
280
|
+
headers: {
|
|
281
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
282
|
+
"Content-Type": "application/json",
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
if (!res.ok) {
|
|
286
|
+
console.error("Failed to update origin status");
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
}));
|
|
290
|
+
this.uploadFile = (file, options) => __awaiter(this, void 0, void 0, function* () {
|
|
291
|
+
const uploadURL = yield __classPrivateFieldGet(this, _Origin_generateURL, "f").call(this, file);
|
|
292
|
+
if (!uploadURL) {
|
|
293
|
+
console.error("Failed to generate upload URL");
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
yield uploadWithProgress(file, uploadURL.url, (options === null || options === void 0 ? void 0 : options.progressCallback) || (() => { }));
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
yield __classPrivateFieldGet(this, _Origin_setOriginStatus, "f").call(this, uploadURL.key, "failed");
|
|
301
|
+
throw new Error("Failed to upload file: " + error);
|
|
302
|
+
}
|
|
303
|
+
yield __classPrivateFieldGet(this, _Origin_setOriginStatus, "f").call(this, uploadURL.key, "success");
|
|
304
|
+
});
|
|
305
|
+
this.getOriginUploads = () => __awaiter(this, void 0, void 0, function* () {
|
|
306
|
+
const res = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/origin/files`, {
|
|
307
|
+
method: "GET",
|
|
308
|
+
headers: {
|
|
309
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
if (!res.ok) {
|
|
313
|
+
console.error("Failed to get origin uploads");
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
const data = yield res.json();
|
|
317
|
+
return data.data;
|
|
318
|
+
});
|
|
319
|
+
this.jwt = jwt;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get the user's Origin stats (multiplier, consent, usage, etc.).
|
|
323
|
+
* @returns {Promise<OriginUsageReturnType>} A promise that resolves with the user's Origin stats.
|
|
324
|
+
*/
|
|
325
|
+
getOriginUsage() {
|
|
326
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
327
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/origin/usage`, {
|
|
328
|
+
method: "GET",
|
|
329
|
+
headers: {
|
|
330
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
331
|
+
// "x-client-id": this.clientId,
|
|
332
|
+
"Content-Type": "application/json",
|
|
333
|
+
},
|
|
334
|
+
}).then((res) => res.json());
|
|
335
|
+
if (!data.isError && data.data.user) {
|
|
336
|
+
return data;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
throw new APIError(data.message || "Failed to fetch Origin usage");
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Set the user's consent for Origin usage.
|
|
345
|
+
* @param {boolean} consent The user's consent.
|
|
346
|
+
* @returns {Promise<void>}
|
|
347
|
+
* @throws {Error|APIError} - Throws an error if the user is not authenticated. Also throws an error if the consent is not provided.
|
|
348
|
+
*/
|
|
349
|
+
setOriginConsent(consent) {
|
|
350
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
351
|
+
if (consent === undefined) {
|
|
352
|
+
throw new APIError("Consent is required");
|
|
353
|
+
}
|
|
354
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/origin/status`, {
|
|
355
|
+
method: "PATCH",
|
|
356
|
+
headers: {
|
|
357
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
358
|
+
// "x-client-id": this.clientId,
|
|
359
|
+
"Content-Type": "application/json",
|
|
360
|
+
},
|
|
361
|
+
body: JSON.stringify({
|
|
362
|
+
active: consent,
|
|
363
|
+
}),
|
|
364
|
+
}).then((res) => res.json());
|
|
365
|
+
if (!data.isError) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
throw new APIError(data.message || "Failed to set Origin consent");
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Set the user's Origin multiplier.
|
|
375
|
+
* @param {number} multiplier The user's Origin multiplier.
|
|
376
|
+
* @returns {Promise<void>}
|
|
377
|
+
* @throws {Error|APIError} - Throws an error if the user is not authenticated. Also throws an error if the multiplier is not provided.
|
|
378
|
+
*/
|
|
379
|
+
setOriginMultiplier(multiplier) {
|
|
380
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
381
|
+
if (multiplier === undefined) {
|
|
382
|
+
throw new APIError("Multiplier is required");
|
|
383
|
+
}
|
|
384
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/origin/multiplier`, {
|
|
385
|
+
method: "PATCH",
|
|
386
|
+
headers: {
|
|
387
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
388
|
+
// "x-client-id": this.clientId,
|
|
389
|
+
"Content-Type": "application/json",
|
|
390
|
+
},
|
|
391
|
+
body: JSON.stringify({
|
|
392
|
+
multiplier,
|
|
393
|
+
}),
|
|
394
|
+
}).then((res) => res.json());
|
|
395
|
+
if (!data.isError) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
throw new APIError(data.message || "Failed to set Origin multiplier");
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
_Origin_generateURL = new WeakMap(), _Origin_setOriginStatus = new WeakMap();
|
|
405
|
+
|
|
406
|
+
var _Auth_instances, _Auth_triggers, _Auth_ackeeInstance, _Auth_trigger, _Auth_loadAuthStatusFromStorage, _Auth_requestAccount, _Auth_fetchNonce, _Auth_verifySignature, _Auth_createMessage, _Auth_sendAnalyticsEvent, _Auth_waitForTxReceipt, _Auth_ensureChainId;
|
|
407
|
+
const createRedirectUriObject = (redirectUri) => {
|
|
408
|
+
const keys = ["twitter", "discord", "spotify"];
|
|
409
|
+
if (typeof redirectUri === "object") {
|
|
410
|
+
return keys.reduce((object, key) => {
|
|
411
|
+
object[key] =
|
|
412
|
+
redirectUri[key] ||
|
|
413
|
+
(typeof window !== "undefined" ? window.location.href : "");
|
|
414
|
+
return object;
|
|
415
|
+
}, {});
|
|
416
|
+
}
|
|
417
|
+
else if (typeof redirectUri === "string") {
|
|
418
|
+
return keys.reduce((object, key) => {
|
|
419
|
+
object[key] = redirectUri;
|
|
420
|
+
return object;
|
|
421
|
+
}, {});
|
|
422
|
+
}
|
|
423
|
+
else if (!redirectUri) {
|
|
424
|
+
return keys.reduce((object, key) => {
|
|
425
|
+
object[key] = typeof window !== "undefined" ? window.location.href : "";
|
|
426
|
+
return object;
|
|
427
|
+
}, {});
|
|
428
|
+
}
|
|
429
|
+
return {};
|
|
409
430
|
};
|
|
410
431
|
/**
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
* @param {String} url - URL to the GraphQL endpoint of the Ackee server.
|
|
415
|
-
* @param {Object} body - JSON which will be send to the server.
|
|
416
|
-
* @param {Object} opts - Options.
|
|
417
|
-
* @param {?Function} next - The callback that handles the response. Receives the following properties: json.
|
|
432
|
+
* The Auth class.
|
|
433
|
+
* @class
|
|
434
|
+
* @classdesc The Auth class is used to authenticate the user.
|
|
418
435
|
*/
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
436
|
+
class Auth {
|
|
437
|
+
/**
|
|
438
|
+
* Constructor for the Auth class.
|
|
439
|
+
* @param {object} options The options object.
|
|
440
|
+
* @param {string} options.clientId The client ID.
|
|
441
|
+
* @param {string|object} options.redirectUri The redirect URI used for oauth. Leave empty if you want to use the current URL. If you want different redirect URIs for different socials, pass an object with the socials as keys and the redirect URIs as values.
|
|
442
|
+
* @param {boolean} [options.allowAnalytics=true] Whether to allow analytics to be sent.
|
|
443
|
+
* @param {object} [options.ackeeInstance] The Ackee instance.
|
|
444
|
+
* @throws {APIError} - Throws an error if the clientId is not provided.
|
|
445
|
+
*/
|
|
446
|
+
constructor({ clientId, redirectUri, allowAnalytics = true, ackeeInstance, }) {
|
|
447
|
+
_Auth_instances.add(this);
|
|
448
|
+
_Auth_triggers.set(this, void 0);
|
|
449
|
+
_Auth_ackeeInstance.set(this, void 0);
|
|
450
|
+
if (!clientId) {
|
|
451
|
+
throw new Error("clientId is required");
|
|
429
452
|
}
|
|
430
|
-
|
|
431
|
-
|
|
453
|
+
this.viem = null;
|
|
454
|
+
// if (typeof window !== "undefined") {
|
|
455
|
+
// if (window.ethereum) this.viem = getClient(window.ethereum);
|
|
456
|
+
// }
|
|
457
|
+
this.redirectUri = createRedirectUriObject(redirectUri);
|
|
458
|
+
if (ackeeInstance)
|
|
459
|
+
__classPrivateFieldSet(this, _Auth_ackeeInstance, ackeeInstance, "f");
|
|
460
|
+
if (allowAnalytics &&
|
|
461
|
+
!__classPrivateFieldGet(this, _Auth_ackeeInstance, "f") &&
|
|
462
|
+
typeof window !== "undefined") ;
|
|
463
|
+
this.clientId = clientId;
|
|
464
|
+
this.isAuthenticated = false;
|
|
465
|
+
this.jwt = null;
|
|
466
|
+
this.origin = null;
|
|
467
|
+
this.walletAddress = null;
|
|
468
|
+
this.userId = null;
|
|
469
|
+
__classPrivateFieldSet(this, _Auth_triggers, {}, "f");
|
|
470
|
+
providerStore.subscribe((providers) => {
|
|
471
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "providers", providers);
|
|
472
|
+
});
|
|
473
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_loadAuthStatusFromStorage).call(this);
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Subscribe to an event. Possible events are "state", "provider", "providers", and "viem".
|
|
477
|
+
* @param {("state"|"provider"|"providers"|"viem")} event The event.
|
|
478
|
+
* @param {function} callback The callback function.
|
|
479
|
+
* @returns {void}
|
|
480
|
+
* @example
|
|
481
|
+
* auth.on("state", (state) => {
|
|
482
|
+
* console.log(state);
|
|
483
|
+
* });
|
|
484
|
+
*/
|
|
485
|
+
on(event, callback) {
|
|
486
|
+
if (!__classPrivateFieldGet(this, _Auth_triggers, "f")[event]) {
|
|
487
|
+
__classPrivateFieldGet(this, _Auth_triggers, "f")[event] = [];
|
|
432
488
|
}
|
|
433
|
-
|
|
434
|
-
|
|
489
|
+
__classPrivateFieldGet(this, _Auth_triggers, "f")[event].push(callback);
|
|
490
|
+
if (event === "providers") {
|
|
491
|
+
callback(providerStore.value());
|
|
435
492
|
}
|
|
436
|
-
|
|
437
|
-
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Set the loading state.
|
|
496
|
+
* @param {boolean} loading The loading state.
|
|
497
|
+
* @returns {void}
|
|
498
|
+
*/
|
|
499
|
+
setLoading(loading) {
|
|
500
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "state", loading
|
|
501
|
+
? "loading"
|
|
502
|
+
: this.isAuthenticated
|
|
503
|
+
? "authenticated"
|
|
504
|
+
: "unauthenticated");
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Set the provider. This is useful for setting the provider when the user selects a provider from the UI or when dApp wishes to use a specific provider.
|
|
508
|
+
* @param {object} options The options object. Includes the provider and the provider info.
|
|
509
|
+
* @returns {void}
|
|
510
|
+
* @throws {APIError} - Throws an error if the provider is not provided.
|
|
511
|
+
*/
|
|
512
|
+
setProvider({ provider, info, address, }) {
|
|
513
|
+
if (!provider) {
|
|
514
|
+
throw new APIError("provider is required");
|
|
438
515
|
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
/**
|
|
459
|
-
* Creates a new instance.
|
|
460
|
-
* @param {String} server - URL of the Ackee server.
|
|
461
|
-
* @param {?Object} opts
|
|
462
|
-
* @returns {Object} instance
|
|
463
|
-
*/
|
|
464
|
-
const create = function (server, opts) {
|
|
465
|
-
opts = validate(opts);
|
|
466
|
-
const url = endpoint(server);
|
|
467
|
-
const noop = () => { };
|
|
468
|
-
// Fake instance when Ackee ignores you
|
|
469
|
-
const fakeInstance = {
|
|
470
|
-
record: () => ({ stop: noop }),
|
|
471
|
-
updateRecord: () => ({ stop: noop }),
|
|
472
|
-
action: noop,
|
|
473
|
-
updateAction: noop,
|
|
474
|
-
};
|
|
475
|
-
if (opts.ignoreLocalhost === true &&
|
|
476
|
-
isLocalhost(location.hostname) === true &&
|
|
477
|
-
isBrowser === true) {
|
|
478
|
-
// console.warn("Ackee ignores you because you are on localhost");
|
|
479
|
-
return fakeInstance;
|
|
480
|
-
}
|
|
481
|
-
if (isBot(navigator ? navigator.userAgent : "") === true) {
|
|
482
|
-
// console.warn("Ackee ignores you because you are a bot");
|
|
483
|
-
return fakeInstance;
|
|
484
|
-
}
|
|
485
|
-
// Creates a new record on the server and updates the record
|
|
486
|
-
// very x seconds to track the duration of the visit. Tries to use
|
|
487
|
-
// the default attributes when there're no custom attributes defined.
|
|
488
|
-
const _record = (domainId, attrs = attributes(opts.detailed), next) => {
|
|
489
|
-
// Function to stop updating the record
|
|
490
|
-
let isStopped = false;
|
|
491
|
-
const stop = () => {
|
|
492
|
-
isStopped = true;
|
|
493
|
-
};
|
|
494
|
-
send(url, createRecordBody(domainId, attrs), opts, (json) => {
|
|
495
|
-
const recordId = json.data.createRecord.payload.id;
|
|
496
|
-
if (isFakeId(recordId) === true) {
|
|
497
|
-
// return console.warn("Ackee ignores you because this is your own site");
|
|
516
|
+
this.viem = getClient(provider, info.name, address);
|
|
517
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "viem", this.viem);
|
|
518
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "provider", { provider, info });
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Set the wallet address. This is useful for edge cases where the provider can't return the wallet address. Don't use this unless you know what you're doing.
|
|
522
|
+
* @param {string} walletAddress The wallet address.
|
|
523
|
+
* @returns {void}
|
|
524
|
+
*/
|
|
525
|
+
setWalletAddress(walletAddress) {
|
|
526
|
+
this.walletAddress = walletAddress;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Disconnect the user.
|
|
530
|
+
* @returns {Promise<void>}
|
|
531
|
+
*/
|
|
532
|
+
disconnect() {
|
|
533
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
534
|
+
if (!this.isAuthenticated) {
|
|
498
535
|
return;
|
|
499
536
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
537
|
+
this.isAuthenticated = false;
|
|
538
|
+
this.walletAddress = null;
|
|
539
|
+
this.userId = null;
|
|
540
|
+
this.jwt = null;
|
|
541
|
+
this.origin = null;
|
|
542
|
+
localStorage.removeItem("camp-sdk:wallet-address");
|
|
543
|
+
localStorage.removeItem("camp-sdk:user-id");
|
|
544
|
+
localStorage.removeItem("camp-sdk:jwt");
|
|
545
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "state", "unauthenticated");
|
|
546
|
+
yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_sendAnalyticsEvent).call(this, constants.ACKEE_EVENTS.USER_DISCONNECTED, "User Disconnected");
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Connect the user's wallet and sign the message.
|
|
551
|
+
* @returns {Promise<{ success: boolean; message: string; walletAddress: string }>} A promise that resolves with the authentication result.
|
|
552
|
+
* @throws {APIError} - Throws an error if the user cannot be authenticated.
|
|
553
|
+
*/
|
|
554
|
+
connect() {
|
|
555
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
556
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "state", "loading");
|
|
557
|
+
try {
|
|
558
|
+
if (!this.walletAddress) {
|
|
559
|
+
yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_requestAccount).call(this);
|
|
560
|
+
}
|
|
561
|
+
const nonce = yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_fetchNonce).call(this);
|
|
562
|
+
const message = __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_createMessage).call(this, nonce);
|
|
563
|
+
const signature = yield this.viem.signMessage({
|
|
564
|
+
account: this.walletAddress,
|
|
565
|
+
message: message,
|
|
566
|
+
});
|
|
567
|
+
const res = yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_verifySignature).call(this, message, signature);
|
|
568
|
+
if (res.success) {
|
|
569
|
+
this.isAuthenticated = true;
|
|
570
|
+
this.userId = res.userId;
|
|
571
|
+
this.jwt = res.token;
|
|
572
|
+
this.origin = new Origin(this.jwt);
|
|
573
|
+
localStorage.setItem("camp-sdk:jwt", this.jwt);
|
|
574
|
+
localStorage.setItem("camp-sdk:wallet-address", this.walletAddress);
|
|
575
|
+
localStorage.setItem("camp-sdk:user-id", this.userId);
|
|
576
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "state", "authenticated");
|
|
577
|
+
yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_sendAnalyticsEvent).call(this, constants.ACKEE_EVENTS.USER_CONNECTED, "User Connected");
|
|
578
|
+
return {
|
|
579
|
+
success: true,
|
|
580
|
+
message: "Successfully authenticated",
|
|
581
|
+
walletAddress: this.walletAddress,
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
this.isAuthenticated = false;
|
|
586
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "state", "unauthenticated");
|
|
587
|
+
throw new APIError("Failed to authenticate");
|
|
504
588
|
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
return next(recordId);
|
|
589
|
+
}
|
|
590
|
+
catch (e) {
|
|
591
|
+
this.isAuthenticated = false;
|
|
592
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "state", "unauthenticated");
|
|
593
|
+
throw new APIError(e);
|
|
511
594
|
}
|
|
512
595
|
});
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Get the user's linked social accounts.
|
|
599
|
+
* @returns {Promise<Record<string, boolean>>} A promise that resolves with the user's linked social accounts.
|
|
600
|
+
* @throws {Error|APIError} - Throws an error if the user is not authenticated or if the request fails.
|
|
601
|
+
* @example
|
|
602
|
+
* const auth = new Auth({ clientId: "your-client-id" });
|
|
603
|
+
* const socials = await auth.getLinkedSocials();
|
|
604
|
+
* console.log(socials);
|
|
605
|
+
*/
|
|
606
|
+
getLinkedSocials() {
|
|
607
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
608
|
+
if (!this.isAuthenticated)
|
|
609
|
+
throw new Error("User needs to be authenticated");
|
|
610
|
+
const connections = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/client-user/connections-sdk`, {
|
|
611
|
+
method: "GET",
|
|
612
|
+
headers: {
|
|
613
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
614
|
+
"x-client-id": this.clientId,
|
|
615
|
+
"Content-Type": "application/json",
|
|
616
|
+
},
|
|
617
|
+
}).then((res) => res.json());
|
|
618
|
+
if (!connections.isError) {
|
|
619
|
+
const socials = {};
|
|
620
|
+
Object.keys(connections.data.data).forEach((key) => {
|
|
621
|
+
socials[key.split("User")[0]] = connections.data.data[key];
|
|
622
|
+
});
|
|
623
|
+
return socials;
|
|
530
624
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
send(url, updateRecordBody(recordId));
|
|
534
|
-
}, 15000);
|
|
535
|
-
return { stop };
|
|
536
|
-
};
|
|
537
|
-
// Creates a new action on the server
|
|
538
|
-
const _action = (eventId, attrs, next) => {
|
|
539
|
-
send(url, createActionBody(eventId, attrs), opts, (json) => {
|
|
540
|
-
const actionId = json.data.createAction.payload.id;
|
|
541
|
-
if (isFakeId(actionId) === true) {
|
|
542
|
-
// return console.warn("Ackee ignores you because this is your own site");
|
|
543
|
-
return;
|
|
625
|
+
else {
|
|
626
|
+
throw new APIError(connections.message || "Failed to fetch connections");
|
|
544
627
|
}
|
|
545
|
-
|
|
546
|
-
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Link the user's Twitter account.
|
|
632
|
+
* @returns {Promise<void>}
|
|
633
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
634
|
+
*/
|
|
635
|
+
linkTwitter() {
|
|
636
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
637
|
+
if (!this.isAuthenticated) {
|
|
638
|
+
throw new Error("User needs to be authenticated");
|
|
547
639
|
}
|
|
640
|
+
// await this.#sendAnalyticsEvent(
|
|
641
|
+
// constants.ACKEE_EVENTS.TWITTER_LINKED,
|
|
642
|
+
// "Twitter Linked"
|
|
643
|
+
// );
|
|
644
|
+
window.location.href = `${constants.AUTH_HUB_BASE_API}/twitter/connect?clientId=${this.clientId}&userId=${this.userId}&redirect_url=${this.redirectUri["twitter"]}`;
|
|
548
645
|
});
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Link the user's Discord account.
|
|
649
|
+
* @returns {Promise<void>}
|
|
650
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
651
|
+
*/
|
|
652
|
+
linkDiscord() {
|
|
653
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
654
|
+
if (!this.isAuthenticated) {
|
|
655
|
+
throw new Error("User needs to be authenticated");
|
|
656
|
+
}
|
|
657
|
+
// await this.#sendAnalyticsEvent(
|
|
658
|
+
// constants.ACKEE_EVENTS.DISCORD_LINKED,
|
|
659
|
+
// "Discord Linked"
|
|
660
|
+
// );
|
|
661
|
+
window.location.href = `${constants.AUTH_HUB_BASE_API}/discord/connect?clientId=${this.clientId}&userId=${this.userId}&redirect_url=${this.redirectUri["discord"]}`;
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Link the user's Spotify account.
|
|
666
|
+
* @returns {Promise<void>}
|
|
667
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
668
|
+
*/
|
|
669
|
+
linkSpotify() {
|
|
670
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
671
|
+
if (!this.isAuthenticated) {
|
|
672
|
+
throw new Error("User needs to be authenticated");
|
|
673
|
+
}
|
|
674
|
+
// await this.#sendAnalyticsEvent(
|
|
675
|
+
// constants.ACKEE_EVENTS.SPOTIFY_LINKED,
|
|
676
|
+
// "Spotify Linked"
|
|
677
|
+
// );
|
|
678
|
+
window.location.href = `${constants.AUTH_HUB_BASE_API}/spotify/connect?clientId=${this.clientId}&userId=${this.userId}&redirect_url=${this.redirectUri["spotify"]}`;
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Link the user's TikTok account.
|
|
683
|
+
* @param {string} handle The user's TikTok handle.
|
|
684
|
+
* @returns {Promise<any>} A promise that resolves with the TikTok account data.
|
|
685
|
+
* @throws {Error|APIError} - Throws an error if the user is not authenticated.
|
|
686
|
+
*/
|
|
687
|
+
linkTikTok(handle) {
|
|
688
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
689
|
+
if (!this.isAuthenticated) {
|
|
690
|
+
throw new Error("User needs to be authenticated");
|
|
691
|
+
}
|
|
692
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/tiktok/connect-sdk`, {
|
|
693
|
+
method: "POST",
|
|
694
|
+
redirect: "follow",
|
|
695
|
+
headers: {
|
|
696
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
697
|
+
"x-client-id": this.clientId,
|
|
698
|
+
"Content-Type": "application/json",
|
|
699
|
+
},
|
|
700
|
+
body: JSON.stringify({
|
|
701
|
+
userHandle: handle,
|
|
702
|
+
clientId: this.clientId,
|
|
703
|
+
userId: this.userId,
|
|
704
|
+
}),
|
|
705
|
+
}).then((res) => res.json());
|
|
706
|
+
if (!data.isError) {
|
|
707
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_sendAnalyticsEvent).call(this, constants.ACKEE_EVENTS.TIKTOK_LINKED, "TikTok Linked");
|
|
708
|
+
return data.data;
|
|
709
|
+
}
|
|
710
|
+
else {
|
|
711
|
+
if (data.message === "Request failed with status code 502") {
|
|
712
|
+
throw new APIError("TikTok service is currently unavailable, try again later");
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
throw new APIError(data.message || "Failed to link TikTok account");
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* Send an OTP to the user's Telegram account.
|
|
722
|
+
* @param {string} phoneNumber The user's phone number.
|
|
723
|
+
* @returns {Promise<any>} A promise that resolves with the OTP data.
|
|
724
|
+
* @throws {Error|APIError} - Throws an error if the user is not authenticated.
|
|
725
|
+
*/
|
|
726
|
+
sendTelegramOTP(phoneNumber) {
|
|
727
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
728
|
+
if (!this.isAuthenticated)
|
|
729
|
+
throw new Error("User needs to be authenticated");
|
|
730
|
+
if (!phoneNumber)
|
|
731
|
+
throw new APIError("Phone number is required");
|
|
732
|
+
yield this.unlinkTelegram();
|
|
733
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/telegram/sendOTP-sdk`, {
|
|
734
|
+
method: "POST",
|
|
735
|
+
redirect: "follow",
|
|
736
|
+
headers: {
|
|
737
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
738
|
+
"x-client-id": this.clientId,
|
|
739
|
+
"Content-Type": "application/json",
|
|
740
|
+
},
|
|
741
|
+
body: JSON.stringify({
|
|
742
|
+
phone: phoneNumber,
|
|
743
|
+
}),
|
|
744
|
+
}).then((res) => res.json());
|
|
745
|
+
if (!data.isError) {
|
|
746
|
+
return data.data;
|
|
747
|
+
}
|
|
748
|
+
else {
|
|
749
|
+
throw new APIError(data.message || "Failed to send Telegram OTP");
|
|
750
|
+
}
|
|
751
|
+
});
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* Link the user's Telegram account.
|
|
755
|
+
* @param {string} phoneNumber The user's phone number.
|
|
756
|
+
* @param {string} otp The OTP.
|
|
757
|
+
* @param {string} phoneCodeHash The phone code hash.
|
|
758
|
+
* @returns {Promise<object>} A promise that resolves with the Telegram account data.
|
|
759
|
+
* @throws {APIError|Error} - Throws an error if the user is not authenticated. Also throws an error if the phone number, OTP, and phone code hash are not provided.
|
|
760
|
+
*/
|
|
761
|
+
linkTelegram(phoneNumber, otp, phoneCodeHash) {
|
|
762
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
763
|
+
if (!this.isAuthenticated)
|
|
764
|
+
throw new Error("User needs to be authenticated");
|
|
765
|
+
if (!phoneNumber || !otp || !phoneCodeHash)
|
|
766
|
+
throw new APIError("Phone number, OTP, and phone code hash are required");
|
|
767
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/telegram/signIn-sdk`, {
|
|
768
|
+
method: "POST",
|
|
769
|
+
redirect: "follow",
|
|
770
|
+
headers: {
|
|
771
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
772
|
+
"x-client-id": this.clientId,
|
|
773
|
+
"Content-Type": "application/json",
|
|
774
|
+
},
|
|
775
|
+
body: JSON.stringify({
|
|
776
|
+
phone: phoneNumber,
|
|
777
|
+
code: otp,
|
|
778
|
+
phone_code_hash: phoneCodeHash,
|
|
779
|
+
userId: this.userId,
|
|
780
|
+
clientId: this.clientId,
|
|
781
|
+
}),
|
|
782
|
+
}).then((res) => res.json());
|
|
783
|
+
if (!data.isError) {
|
|
784
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_sendAnalyticsEvent).call(this, constants.ACKEE_EVENTS.TELEGRAM_LINKED, "Telegram Linked");
|
|
785
|
+
return data.data;
|
|
786
|
+
}
|
|
787
|
+
else {
|
|
788
|
+
throw new APIError(data.message || "Failed to link Telegram account");
|
|
789
|
+
}
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Unlink the user's Twitter account.
|
|
794
|
+
* @returns {Promise<any>} A promise that resolves with the unlink result.
|
|
795
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
796
|
+
* @throws {APIError} - Throws an error if the request fails.
|
|
797
|
+
*/
|
|
798
|
+
unlinkTwitter() {
|
|
799
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
800
|
+
if (!this.isAuthenticated) {
|
|
801
|
+
throw new Error("User needs to be authenticated");
|
|
802
|
+
}
|
|
803
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/twitter/disconnect-sdk`, {
|
|
804
|
+
method: "POST",
|
|
805
|
+
redirect: "follow",
|
|
806
|
+
headers: {
|
|
807
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
808
|
+
"x-client-id": this.clientId,
|
|
809
|
+
"Content-Type": "application/json",
|
|
810
|
+
},
|
|
811
|
+
body: JSON.stringify({
|
|
812
|
+
id: this.userId,
|
|
813
|
+
}),
|
|
814
|
+
}).then((res) => res.json());
|
|
815
|
+
if (!data.isError) {
|
|
816
|
+
return data.data;
|
|
817
|
+
}
|
|
818
|
+
else {
|
|
819
|
+
throw new APIError(data.message || "Failed to unlink Twitter account");
|
|
820
|
+
}
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
/**
|
|
824
|
+
* Unlink the user's Discord account.
|
|
825
|
+
* @returns {Promise<any>} A promise that resolves with the unlink result.
|
|
826
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
827
|
+
* @throws {APIError} - Throws an error if the request fails.
|
|
828
|
+
*/
|
|
829
|
+
unlinkDiscord() {
|
|
830
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
831
|
+
if (!this.isAuthenticated) {
|
|
832
|
+
throw new APIError("User needs to be authenticated");
|
|
833
|
+
}
|
|
834
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/discord/disconnect-sdk`, {
|
|
835
|
+
method: "POST",
|
|
836
|
+
redirect: "follow",
|
|
837
|
+
headers: {
|
|
838
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
839
|
+
"x-client-id": this.clientId,
|
|
840
|
+
"Content-Type": "application/json",
|
|
841
|
+
},
|
|
842
|
+
body: JSON.stringify({
|
|
843
|
+
id: this.userId,
|
|
844
|
+
}),
|
|
845
|
+
}).then((res) => res.json());
|
|
846
|
+
if (!data.isError) {
|
|
847
|
+
return data.data;
|
|
848
|
+
}
|
|
849
|
+
else {
|
|
850
|
+
throw new APIError(data.message || "Failed to unlink Discord account");
|
|
851
|
+
}
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
/**
|
|
855
|
+
* Unlink the user's Spotify account.
|
|
856
|
+
* @returns {Promise<any>} A promise that resolves with the unlink result.
|
|
857
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
858
|
+
* @throws {APIError} - Throws an error if the request fails.
|
|
859
|
+
*/
|
|
860
|
+
unlinkSpotify() {
|
|
861
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
862
|
+
if (!this.isAuthenticated) {
|
|
863
|
+
throw new APIError("User needs to be authenticated");
|
|
864
|
+
}
|
|
865
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/spotify/disconnect-sdk`, {
|
|
866
|
+
method: "POST",
|
|
867
|
+
redirect: "follow",
|
|
868
|
+
headers: {
|
|
869
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
870
|
+
"x-client-id": this.clientId,
|
|
871
|
+
"Content-Type": "application/json",
|
|
872
|
+
},
|
|
873
|
+
body: JSON.stringify({
|
|
874
|
+
id: this.userId,
|
|
875
|
+
}),
|
|
876
|
+
}).then((res) => res.json());
|
|
877
|
+
if (!data.isError) {
|
|
878
|
+
return data.data;
|
|
879
|
+
}
|
|
880
|
+
else {
|
|
881
|
+
throw new APIError(data.message || "Failed to unlink Spotify account");
|
|
882
|
+
}
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Unlink the user's TikTok account.
|
|
887
|
+
* @returns {Promise<any>} A promise that resolves with the unlink result.
|
|
888
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
889
|
+
* @throws {APIError} - Throws an error if the request fails.
|
|
890
|
+
*/
|
|
891
|
+
unlinkTikTok() {
|
|
892
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
893
|
+
if (!this.isAuthenticated) {
|
|
894
|
+
throw new APIError("User needs to be authenticated");
|
|
895
|
+
}
|
|
896
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/tiktok/disconnect-sdk`, {
|
|
897
|
+
method: "POST",
|
|
898
|
+
redirect: "follow",
|
|
899
|
+
headers: {
|
|
900
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
901
|
+
"x-client-id": this.clientId,
|
|
902
|
+
"Content-Type": "application/json",
|
|
903
|
+
},
|
|
904
|
+
body: JSON.stringify({
|
|
905
|
+
userId: this.userId,
|
|
906
|
+
}),
|
|
907
|
+
}).then((res) => res.json());
|
|
908
|
+
if (!data.isError) {
|
|
909
|
+
return data.data;
|
|
910
|
+
}
|
|
911
|
+
else {
|
|
912
|
+
throw new APIError(data.message || "Failed to unlink TikTok account");
|
|
913
|
+
}
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Unlink the user's Telegram account.
|
|
918
|
+
* @returns {Promise<any>} A promise that resolves with the unlink result.
|
|
919
|
+
* @throws {Error} - Throws an error if the user is not authenticated.
|
|
920
|
+
* @throws {APIError} - Throws an error if the request fails.
|
|
921
|
+
*/
|
|
922
|
+
unlinkTelegram() {
|
|
923
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
924
|
+
if (!this.isAuthenticated) {
|
|
925
|
+
throw new APIError("User needs to be authenticated");
|
|
926
|
+
}
|
|
927
|
+
const data = yield fetch(`${constants.AUTH_HUB_BASE_API}/telegram/disconnect-sdk`, {
|
|
928
|
+
method: "POST",
|
|
929
|
+
redirect: "follow",
|
|
930
|
+
headers: {
|
|
931
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
932
|
+
"x-client-id": this.clientId,
|
|
933
|
+
"Content-Type": "application/json",
|
|
934
|
+
},
|
|
935
|
+
body: JSON.stringify({
|
|
936
|
+
userId: this.userId,
|
|
937
|
+
}),
|
|
938
|
+
}).then((res) => res.json());
|
|
939
|
+
if (!data.isError) {
|
|
940
|
+
return data.data;
|
|
941
|
+
}
|
|
942
|
+
else {
|
|
943
|
+
throw new APIError(data.message || "Failed to unlink Telegram account");
|
|
944
|
+
}
|
|
945
|
+
});
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* Call a contract method.
|
|
949
|
+
* @param {string} contractAddress The contract address.
|
|
950
|
+
* @param {Abi} abi The contract ABI.
|
|
951
|
+
* @param {string} methodName The method name.
|
|
952
|
+
* @param {any[]} params The method parameters.
|
|
953
|
+
* @param {CallOptions} [options] The call options.
|
|
954
|
+
* @returns {Promise<any>} A promise that resolves with the result of the contract call or transaction hash.
|
|
955
|
+
* @throws {Error} - Throws an error if the wallet client is not connected or if the method is not a view function.
|
|
956
|
+
*/
|
|
957
|
+
callContractMethod(contractAddress_1, abi_1, methodName_1, params_1) {
|
|
958
|
+
return __awaiter(this, arguments, void 0, function* (contractAddress, abi, methodName, params, options = {}) {
|
|
959
|
+
const abiItem = getAbiItem({ abi, name: methodName });
|
|
960
|
+
const isView = abiItem &&
|
|
961
|
+
"stateMutability" in abiItem &&
|
|
962
|
+
(abiItem.stateMutability === "view" ||
|
|
963
|
+
abiItem.stateMutability === "pure");
|
|
964
|
+
if (!isView && !this.viem) {
|
|
965
|
+
throw new Error("WalletClient not connected.");
|
|
966
|
+
}
|
|
967
|
+
if (isView) {
|
|
968
|
+
const publicClient = getPublicClient();
|
|
969
|
+
const result = (yield publicClient.readContract({
|
|
970
|
+
address: contractAddress,
|
|
971
|
+
abi,
|
|
972
|
+
functionName: methodName,
|
|
973
|
+
args: params,
|
|
974
|
+
})) || null;
|
|
975
|
+
return result;
|
|
976
|
+
}
|
|
977
|
+
else {
|
|
978
|
+
const [account] = yield this.viem.getAddresses();
|
|
979
|
+
const data = encodeFunctionData({
|
|
980
|
+
abi,
|
|
981
|
+
functionName: methodName,
|
|
982
|
+
args: params,
|
|
983
|
+
});
|
|
984
|
+
yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_ensureChainId).call(this, testnet);
|
|
985
|
+
const txHash = yield this.viem.sendTransaction({
|
|
986
|
+
to: contractAddress,
|
|
987
|
+
data,
|
|
988
|
+
account,
|
|
989
|
+
value: options.value,
|
|
990
|
+
gas: options.gas,
|
|
991
|
+
});
|
|
992
|
+
if (options.waitForReceipt) {
|
|
993
|
+
const receipt = yield __classPrivateFieldGet(this, _Auth_instances, "m", _Auth_waitForTxReceipt).call(this, txHash);
|
|
994
|
+
return receipt;
|
|
995
|
+
}
|
|
996
|
+
return txHash;
|
|
997
|
+
}
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
_Auth_triggers = new WeakMap(), _Auth_ackeeInstance = new WeakMap(), _Auth_instances = new WeakSet(), _Auth_trigger = function _Auth_trigger(event, data) {
|
|
1002
|
+
if (__classPrivateFieldGet(this, _Auth_triggers, "f")[event]) {
|
|
1003
|
+
__classPrivateFieldGet(this, _Auth_triggers, "f")[event].forEach((callback) => callback(data));
|
|
1004
|
+
}
|
|
1005
|
+
}, _Auth_loadAuthStatusFromStorage = function _Auth_loadAuthStatusFromStorage(provider) {
|
|
1006
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1007
|
+
var _a, _b;
|
|
1008
|
+
if (typeof localStorage === "undefined") {
|
|
554
1009
|
return;
|
|
555
1010
|
}
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
1011
|
+
const walletAddress = localStorage === null || localStorage === void 0 ? void 0 : localStorage.getItem("camp-sdk:wallet-address");
|
|
1012
|
+
const userId = localStorage === null || localStorage === void 0 ? void 0 : localStorage.getItem("camp-sdk:user-id");
|
|
1013
|
+
const jwt = localStorage === null || localStorage === void 0 ? void 0 : localStorage.getItem("camp-sdk:jwt");
|
|
1014
|
+
if (walletAddress && userId && jwt) {
|
|
1015
|
+
this.walletAddress = walletAddress;
|
|
1016
|
+
this.userId = userId;
|
|
1017
|
+
this.jwt = jwt;
|
|
1018
|
+
this.origin = new Origin(this.jwt);
|
|
1019
|
+
this.isAuthenticated = true;
|
|
1020
|
+
let selectedProvider = provider;
|
|
1021
|
+
if (!selectedProvider) {
|
|
1022
|
+
const providers = (_a = providerStore.value()) !== null && _a !== void 0 ? _a : [];
|
|
1023
|
+
for (const p of providers) {
|
|
1024
|
+
try {
|
|
1025
|
+
const accounts = yield p.provider.request({
|
|
1026
|
+
method: "eth_accounts",
|
|
1027
|
+
});
|
|
1028
|
+
if (((_b = accounts[0]) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === walletAddress.toLowerCase()) {
|
|
1029
|
+
selectedProvider = p.provider;
|
|
1030
|
+
break;
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
catch (err) {
|
|
1034
|
+
console.warn("Failed to fetch accounts from provider:", err);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
if (selectedProvider) {
|
|
1039
|
+
this.viem = getClient(selectedProvider, new Date().getTime().toString(), walletAddress);
|
|
1040
|
+
__classPrivateFieldGet(this, _Auth_instances, "m", _Auth_trigger).call(this, "viem", this.viem);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
this.isAuthenticated = false;
|
|
1045
|
+
}
|
|
1046
|
+
});
|
|
1047
|
+
}, _Auth_requestAccount = function _Auth_requestAccount() {
|
|
1048
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1049
|
+
try {
|
|
1050
|
+
const [account] = yield this.viem.requestAddresses();
|
|
1051
|
+
this.walletAddress = account;
|
|
1052
|
+
return account;
|
|
1053
|
+
}
|
|
1054
|
+
catch (e) {
|
|
1055
|
+
throw new APIError(e);
|
|
1056
|
+
}
|
|
1057
|
+
});
|
|
1058
|
+
}, _Auth_fetchNonce = function _Auth_fetchNonce() {
|
|
1059
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1060
|
+
try {
|
|
1061
|
+
const res = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/client-user/nonce`, {
|
|
1062
|
+
method: "POST",
|
|
1063
|
+
headers: {
|
|
1064
|
+
"Content-Type": "application/json",
|
|
1065
|
+
"x-client-id": this.clientId,
|
|
1066
|
+
},
|
|
1067
|
+
body: JSON.stringify({ walletAddress: this.walletAddress }),
|
|
1068
|
+
});
|
|
1069
|
+
const data = yield res.json();
|
|
1070
|
+
if (res.status !== 200) {
|
|
1071
|
+
return Promise.reject(data.message || "Failed to fetch nonce");
|
|
1072
|
+
}
|
|
1073
|
+
return data.data;
|
|
1074
|
+
}
|
|
1075
|
+
catch (e) {
|
|
1076
|
+
throw new Error(e);
|
|
1077
|
+
}
|
|
1078
|
+
});
|
|
1079
|
+
}, _Auth_verifySignature = function _Auth_verifySignature(message, signature) {
|
|
1080
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1081
|
+
try {
|
|
1082
|
+
const res = yield fetch(`${constants.AUTH_HUB_BASE_API}/auth/client-user/verify`, {
|
|
1083
|
+
method: "POST",
|
|
1084
|
+
headers: {
|
|
1085
|
+
"Content-Type": "application/json",
|
|
1086
|
+
"x-client-id": this.clientId,
|
|
1087
|
+
},
|
|
1088
|
+
body: JSON.stringify({
|
|
1089
|
+
message,
|
|
1090
|
+
signature,
|
|
1091
|
+
walletAddress: this.walletAddress,
|
|
1092
|
+
}),
|
|
1093
|
+
});
|
|
1094
|
+
const data = yield res.json();
|
|
1095
|
+
const payload = data.data.split(".")[1];
|
|
1096
|
+
const decoded = JSON.parse(atob(payload));
|
|
1097
|
+
return {
|
|
1098
|
+
success: !data.isError,
|
|
1099
|
+
userId: decoded.id,
|
|
1100
|
+
token: data.data,
|
|
1101
|
+
};
|
|
1102
|
+
}
|
|
1103
|
+
catch (e) {
|
|
1104
|
+
throw new APIError(e);
|
|
1105
|
+
}
|
|
1106
|
+
});
|
|
1107
|
+
}, _Auth_createMessage = function _Auth_createMessage(nonce) {
|
|
1108
|
+
return createSiweMessage({
|
|
1109
|
+
domain: window.location.host,
|
|
1110
|
+
address: this.walletAddress,
|
|
1111
|
+
statement: constants.SIWE_MESSAGE_STATEMENT,
|
|
1112
|
+
uri: window.location.origin,
|
|
1113
|
+
version: "1",
|
|
1114
|
+
chainId: this.viem.chain.id,
|
|
1115
|
+
nonce: nonce,
|
|
1116
|
+
});
|
|
1117
|
+
}, _Auth_sendAnalyticsEvent = function _Auth_sendAnalyticsEvent(event_1, message_1) {
|
|
1118
|
+
return __awaiter(this, arguments, void 0, function* (event, message, count = 1) {
|
|
1119
|
+
// if (this.#ackeeInstance)
|
|
1120
|
+
// await sendAnalyticsEvent(this.#ackeeInstance, event, message, count);
|
|
1121
|
+
// else return;
|
|
1122
|
+
});
|
|
1123
|
+
}, _Auth_waitForTxReceipt = function _Auth_waitForTxReceipt(txHash) {
|
|
1124
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1125
|
+
if (!this.viem)
|
|
1126
|
+
throw new Error("WalletClient not connected.");
|
|
1127
|
+
while (true) {
|
|
1128
|
+
const receipt = yield this.viem.request({
|
|
1129
|
+
method: "eth_getTransactionReceipt",
|
|
1130
|
+
params: [txHash],
|
|
1131
|
+
});
|
|
1132
|
+
if (receipt && receipt.blockNumber) {
|
|
1133
|
+
return receipt;
|
|
1134
|
+
}
|
|
1135
|
+
yield new Promise((res) => setTimeout(res, 1000));
|
|
1136
|
+
}
|
|
1137
|
+
});
|
|
1138
|
+
}, _Auth_ensureChainId = function _Auth_ensureChainId(chain) {
|
|
1139
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1140
|
+
// return;
|
|
1141
|
+
if (!this.viem)
|
|
1142
|
+
throw new Error("WalletClient not connected.");
|
|
1143
|
+
let currentChainId = yield this.viem.request({
|
|
1144
|
+
method: "eth_chainId",
|
|
1145
|
+
params: [],
|
|
1146
|
+
});
|
|
1147
|
+
if (typeof currentChainId === "string") {
|
|
1148
|
+
currentChainId = parseInt(currentChainId, 16);
|
|
1149
|
+
}
|
|
1150
|
+
if (currentChainId !== chain.id) {
|
|
1151
|
+
try {
|
|
1152
|
+
yield this.viem.request({
|
|
1153
|
+
method: "wallet_switchEthereumChain",
|
|
1154
|
+
params: [{ chainId: "0x" + BigInt(chain.id).toString(16) }],
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1157
|
+
catch (switchError) {
|
|
1158
|
+
// Unrecognized chain
|
|
1159
|
+
if (switchError.code === 4902) {
|
|
1160
|
+
yield this.viem.request({
|
|
1161
|
+
method: "wallet_addEthereumChain",
|
|
1162
|
+
params: [
|
|
1163
|
+
{
|
|
1164
|
+
chainId: "0x" + BigInt(chain.id).toString(16),
|
|
1165
|
+
chainName: chain.name,
|
|
1166
|
+
rpcUrls: chain.rpcUrls.default.http,
|
|
1167
|
+
nativeCurrency: chain.nativeCurrency,
|
|
1168
|
+
},
|
|
1169
|
+
],
|
|
1170
|
+
});
|
|
1171
|
+
yield this.viem.request({
|
|
1172
|
+
method: "wallet_switchEthereumChain",
|
|
1173
|
+
params: [{ chainId: "0x" + BigInt(chain.id).toString(16) }],
|
|
1174
|
+
});
|
|
1175
|
+
}
|
|
1176
|
+
else {
|
|
1177
|
+
throw switchError;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
});
|
|
1182
|
+
};
|
|
1183
|
+
|
|
1184
|
+
const ModalContext = createContext({
|
|
1185
|
+
isButtonDisabled: false,
|
|
1186
|
+
setIsButtonDisabled: () => { },
|
|
1187
|
+
isVisible: false,
|
|
1188
|
+
setIsVisible: () => { },
|
|
1189
|
+
isLinkingVisible: false,
|
|
1190
|
+
setIsLinkingVisible: () => { },
|
|
1191
|
+
currentlyLinking: null,
|
|
1192
|
+
setCurrentlyLinking: () => { },
|
|
1193
|
+
});
|
|
1194
|
+
const ModalProvider = ({ children }) => {
|
|
1195
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
1196
|
+
const [isLinkingVisible, setIsLinkingVisible] = useState(false);
|
|
1197
|
+
const [currentlyLinking, setCurrentlyLinking] = useState(null);
|
|
1198
|
+
const [isButtonDisabled, setIsButtonDisabled] = useState(false);
|
|
1199
|
+
return (React.createElement(ModalContext.Provider, { value: {
|
|
1200
|
+
isButtonDisabled,
|
|
1201
|
+
setIsButtonDisabled,
|
|
1202
|
+
isVisible,
|
|
1203
|
+
setIsVisible,
|
|
1204
|
+
isLinkingVisible,
|
|
1205
|
+
setIsLinkingVisible,
|
|
1206
|
+
currentlyLinking,
|
|
1207
|
+
setCurrentlyLinking,
|
|
1208
|
+
} }, children));
|
|
565
1209
|
};
|
|
566
|
-
// Only run Ackee automatically when executed in a browser environment
|
|
567
|
-
if (isBrowser === true) {
|
|
568
|
-
detect();
|
|
569
|
-
}
|
|
570
1210
|
|
|
571
1211
|
const SocialsContext = createContext({
|
|
572
1212
|
query: null,
|
|
@@ -574,12 +1214,12 @@ const SocialsContext = createContext({
|
|
|
574
1214
|
const SocialsProvider = ({ children }) => {
|
|
575
1215
|
const { authenticated } = useAuthState();
|
|
576
1216
|
const { auth } = useContext(CampContext);
|
|
577
|
-
if (!auth) {
|
|
1217
|
+
if (!auth && typeof window !== "undefined") {
|
|
578
1218
|
throw new Error("Auth instance is not available");
|
|
579
1219
|
}
|
|
580
1220
|
const query = useQuery({
|
|
581
1221
|
queryKey: ["socials", authenticated],
|
|
582
|
-
queryFn: () => auth.getLinkedSocials()
|
|
1222
|
+
queryFn: () => { var _a; return (_a = auth === null || auth === void 0 ? void 0 : auth.getLinkedSocials()) !== null && _a !== void 0 ? _a : Promise.resolve(null); }
|
|
583
1223
|
});
|
|
584
1224
|
return (React.createElement(SocialsContext.Provider, { value: {
|
|
585
1225
|
query,
|
|
@@ -641,9 +1281,7 @@ const Tooltip = ({ content, position = "top", backgroundColor = "#333", textColo
|
|
|
641
1281
|
const tooltipStyles = Object.assign({ backgroundColor, color: textColor, position: "absolute", zIndex: 1000 }, getTooltipPosition(tooltipPosition, position));
|
|
642
1282
|
return (React.createElement("div", { className: styles$1["tooltip-container"], onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, style: containerStyle },
|
|
643
1283
|
children,
|
|
644
|
-
isVisible &&
|
|
645
|
-
tooltipPosition &&
|
|
646
|
-
ReactDOM.createPortal(React.createElement("div", { className: `${styles$1.tooltip} ${styles$1[position]} ${styles$1["show"]}`, style: tooltipStyles }, content), document.body)));
|
|
1284
|
+
isVisible && tooltipPosition && typeof document !== "undefined" && ReactDOM.createPortal(React.createElement("div", { className: `${styles$1.tooltip} ${styles$1[position]} ${styles$1["show"]}`, style: tooltipStyles }, content), document.body)));
|
|
647
1285
|
};
|
|
648
1286
|
/**
|
|
649
1287
|
* Calculate the position of the tooltip based on the target element's position and the desired tooltip position.
|
|
@@ -655,6 +1293,8 @@ const Tooltip = ({ content, position = "top", backgroundColor = "#333", textColo
|
|
|
655
1293
|
const getTooltipPosition = (rect, position) => {
|
|
656
1294
|
if (!rect)
|
|
657
1295
|
return {};
|
|
1296
|
+
if (typeof window === "undefined")
|
|
1297
|
+
return {};
|
|
658
1298
|
const spacing = 8; // Space between the tooltip and the target element
|
|
659
1299
|
const viewportWidth = window.innerWidth;
|
|
660
1300
|
const viewportHeight = window.innerHeight;
|
|
@@ -700,7 +1340,7 @@ const getTooltipPosition = (rect, position) => {
|
|
|
700
1340
|
return { top, left, transform };
|
|
701
1341
|
};
|
|
702
1342
|
|
|
703
|
-
var css_248z$1 = "@import url(\"https://api.fontshare.com/v2/css?f[]=satoshi@1&display=swap\");.auth-module_modal__yyg5L{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#000;background-color:rgba(0,0,0,.4);height:100%;left:0;overflow:auto;position:fixed;top:0;transition:all .3s;width:100%;z-index:85}.auth-module_modal__yyg5L .auth-module_outer-container__RraOQ{align-items:center;box-sizing:border-box;display:flex;flex-direction:row;font-family:Satoshi,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);@media screen and (max-width:440px){border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:0;top:auto;transform:translate(-50%);width:100%}}.auth-module_outer-container__RraOQ .auth-module_container__7utns{align-items:center;background-color:#fefefe;border:1px solid #888;border-radius:1.5rem;box-sizing:border-box;flex-direction:column;justify-content:center;padding:1.5rem 1.5rem 1rem;position:relative;text-align:center;width:400px;@media screen and (max-width:440px){border-radius:0;height:auto;max-height:100vh;overflow-y:auto;padding-bottom:1rem;padding-bottom:.5rem;padding-left:1rem;padding-right:1rem;padding-top:1rem;width:100%}}.auth-module_container__7utns.auth-module_linking-container__mYNwD{max-width:300px}.auth-module_origin-tab__miOUK{align-items:center;display:flex;flex-direction:column;gap:.5rem;height:100%;justify-content:space-between;width:100%}.auth-module_origin-section__UBhBB{align-items:center;display:flex;flex-direction:row;gap:.5rem;justify-content:space-evenly;width:100%}.auth-module_origin-section__UBhBB .auth-module_origin-container__ZIk4c{align-items:center;color:#333;display:flex;flex-direction:column;font-size:.875rem;font-weight:400;justify-content:center;margin-bottom:.5rem;margin-top:.5rem;min-height:3rem;min-width:1rem;text-align:center;width:100%}.auth-module_origin-wrapper__JQfEI{align-items:center;display:flex;flex-direction:column;gap:.5rem;justify-content:center;width:100%}.auth-module_origin-container__ZIk4c .auth-module_origin-label__l-1q9{color:#777;font-size:.75rem;font-weight:400;margin-bottom:.25rem;text-align:center}.auth-module_horizontal-divider__YfWCy{background-color:#ddd;height:1px;margin-bottom:.5rem;margin-top:.5rem;width:100%}.auth-module_origin-section__UBhBB .auth-module_divider__z65Me{background-color:#ddd;height:1rem;width:1px}.auth-module_origin-dashboard-button__-pch4{align-items:center;border:none;color:#ff6f00;display:flex;flex-direction:row;font-size:.875rem;gap:.5rem;justify-content:center;padding:.25rem;width:100%}.auth-module_origin-dashboard-button__-pch4:hover{color:#cc4e02;cursor:pointer}.auth-module_origin-dashboard-button__-pch4:disabled{background-color:#ccc;cursor:not-allowed}.auth-module_container__7utns h2{font-size:1.25rem;margin-bottom:1rem;margin-top:0}.auth-module_container__7utns .auth-module_header__pX9nM{align-items:center;color:#333;display:flex;flex-direction:row;font-weight:700;gap:.5rem;justify-content:flex-start;margin-bottom:1rem;text-align:left;width:100%;@media screen and (max-width:440px){margin-bottom:.5rem;margin-top:0}}.auth-module_linking-container__mYNwD .auth-module_header__pX9nM{justify-content:center}.auth-module_container__7utns .auth-module_auth-header__LsM1f{align-items:center;color:#333;display:flex;flex-direction:column;font-weight:700;justify-content:center;margin-bottom:1rem;text-align:center;width:100%}.auth-module_container__7utns .auth-module_header__pX9nM .auth-module_small-modal-icon__YayD1{height:2rem;margin-bottom:.5rem;margin-top:.5rem;width:2rem}.auth-module_container__7utns .auth-module_header__pX9nM .auth-module_wallet-address__AVVA5{color:#777;font-size:.75rem;font-weight:400;margin-top:.2rem}.auth-module_container__7utns .auth-module_close-button__uZrho{background-color:#fff;border:2px solid #ddd;border-radius:100%;color:#aaa;font-size:1.5rem;height:1.25rem;position:absolute;right:1rem;top:1rem;transition:color .15s;width:1.25rem}.auth-module_close-button__uZrho>.auth-module_close-icon__SSCni{display:block;height:1rem;padding:.15rem;position:relative;width:1rem}.auth-module_container__7utns .auth-module_close-button__uZrho:hover{background-color:#ddd;color:#888;cursor:pointer}.auth-module_container__7utns .auth-module_linking-text__uz3ud{color:#777;font-size:1rem;text-align:center}.auth-module_provider-list__6vISy{box-sizing:border-box;display:flex;flex-direction:column;gap:.5rem;margin-bottom:.75rem;max-height:17.9rem;overflow-y:auto;padding-left:.5rem;padding-right:.5rem;scrollbar-color:#ccc #f1f1f1;scrollbar-width:thin;width:100%}.auth-module_provider-list__6vISy.auth-module_big__jQxvN{max-height:16rem}.auth-module_provider-list__6vISy::-webkit-scrollbar{border-radius:.25rem;width:.5rem}.auth-module_provider-list__6vISy::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:.25rem}.auth-module_provider-list__6vISy::-webkit-scrollbar-track{background-color:#f1f1f1;border-radius:.25rem}.auth-module_spinner__hfzlH:after{animation:auth-module_spin__tm9l6 1s linear infinite;border:.25rem solid #f3f3f3;border-radius:50%;border-top-color:#ff6f00;content:\"\";display:block;height:1rem;width:1rem}.auth-module_spinner__hfzlH{align-self:center;display:flex;justify-content:center;margin-left:auto;margin-right:.25rem}@keyframes auth-module_spin__tm9l6{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.auth-module_modal-icon__CV7ah{align-items:center;display:flex;height:4rem;justify-content:center;margin-bottom:.25rem;margin-top:.5rem;padding:.35rem;width:4rem}.auth-module_modal-icon__CV7ah svg{height:3.6rem;width:3.6rem}.auth-module_container__7utns a.auth-module_footer-text__CQnh6{color:#bbb;font-size:.75rem;text-decoration:none}.auth-module_container__7utns a.auth-module_footer-text__CQnh6:hover{text-decoration:underline}.auth-module_disconnect-button__bsu-3{background-color:#ff6f00;border:none;border-radius:.75rem;box-shadow:inset 0 2px 0 hsla(0,0%,100%,.15),inset 0 -2px 4px rgba(0,0,0,.05),0 1px 1px rgba(46,54,80,.075);color:#fff;font-size:1rem;height:2.5rem;margin-bottom:.75rem;margin-top:1rem;padding:1rem;padding-block:0;width:100%}.auth-module_disconnect-button__bsu-3:hover{background-color:#cc4e02;cursor:pointer}.auth-module_disconnect-button__bsu-3:disabled{background-color:#ccc;cursor:not-allowed}.auth-module_linking-button__g1GlL{background-color:#ff6f00;border:none;border-radius:.75rem;box-shadow:inset 0 2px 0 hsla(0,0%,100%,.15),inset 0 -2px 4px rgba(0,0,0,.05),0 1px 1px rgba(46,54,80,.075);color:#fff;font-size:1rem;height:2.5rem;margin-bottom:.75rem;margin-top:1rem;padding:1rem;padding-block:0;width:100%}.auth-module_linking-button__g1GlL:hover{background-color:#cc4e02;cursor:pointer}.auth-module_linking-button__g1GlL:disabled{background-color:#ccc;cursor:not-allowed}.auth-module_socials-wrapper__PshV3{display:flex;flex-direction:column;gap:1rem;margin-block:.5rem;width:100%}.auth-module_socials-container__iDzfJ{display:flex;flex-direction:column;gap:.5rem;width:100%}.auth-module_socials-container__iDzfJ .auth-module_connector-container__4wn11{align-items:center;display:flex;gap:.25rem;justify-content:flex-start;position:relative}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA{align-items:center;background-color:#fefefe;border:1px solid #ddd;border-radius:.75rem;color:#333;display:flex;font-size:.875rem;gap:.25rem;height:2.5rem;padding:.75rem;position:relative;width:100%}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA:hover{background-color:#ddd;cursor:pointer}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA:disabled{background-color:#fefefe;cursor:default}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA svg{color:#333;height:1.5rem;margin-right:.5rem;width:1.5rem}.auth-module_socials-container__iDzfJ .auth-module_connector-connected__JvDQb{align-items:center;background-color:#eee;border:1px solid #ddd;border-radius:.25rem;color:#333;display:flex;flex:1;font-size:.875rem;gap:.25rem;padding:.5rem .75rem;position:relative;width:100%}.auth-module_socials-container__iDzfJ .auth-module_connector-connected__JvDQb svg{color:#333;height:1.5rem;margin-right:.5rem;width:1.5rem}.auth-module_socials-container__iDzfJ h3{color:#333;margin:0}.auth-module_connector-button__j79HA .auth-module_connector-checkmark__ZS6zU{height:1rem!important;position:absolute;right:-.5rem;top:-.5rem;width:1rem!important}.auth-module_unlink-connector-button__6Fwkp{align-items:center;background-color:#999;border:none;border-radius:.5rem;box-shadow:inset 0 2px 0 hsla(0,0%,100%,.15),inset 0 -2px 4px rgba(0,0,0,.05),0 1px 1px rgba(46,54,80,.075);color:#fff;display:flex;font-size:.75rem;gap:.25rem;padding:.25rem .675rem .25rem .5rem;position:absolute;right:.375rem;text-align:center;transition:background-color .15s}.auth-module_unlink-connector-button__6Fwkp svg{stroke:#fff!important;height:.875rem!important;margin-right:0!important;width:.875rem!important}.auth-module_unlink-connector-button__6Fwkp:hover{background-color:#888;cursor:pointer}.auth-module_unlink-connector-button__6Fwkp:disabled{background-color:#ccc;cursor:not-allowed}@keyframes auth-module_loader__gH3ZC{0%{transform:translateX(0)}50%{transform:translateX(100%)}to{transform:translateX(0)}}.auth-module_loader__gH3ZC{background-color:#ddd;border-radius:.125rem;height:.4rem;margin-bottom:.5rem;margin-top:.5rem;position:relative;width:4rem}.auth-module_loader__gH3ZC:before{animation:auth-module_loader__gH3ZC 1.5s ease-in-out infinite;background-color:#ff6f00;border-radius:.125rem;content:\"\";display:block;height:.4rem;left:0;position:absolute;width:2rem}.auth-module_no-socials__wEx0t{color:#777;font-size:.875rem;margin-top:.5rem;text-align:center}.auth-module_divider__z65Me{align-items:center;display:flex;gap:.5rem;margin-bottom:.5rem;margin-top:.5rem}.auth-module_divider__z65Me:after,.auth-module_divider__z65Me:before{border-bottom:1px solid #ddd;content:\"\";flex:1}input.auth-module_tiktok-input__FeqdG{border:1px solid gray;border-radius:.75rem;color:#000;font-family:Satoshi,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1rem;font-weight:600;height:2.75rem;line-height:1.333rem;margin-top:1rem;padding-inline:1rem;width:100%}input.auth-module_tiktok-input__FeqdG.auth-module_invalid__qqgK6{border-color:#dc3545;outline-color:#dc3545}.auth-module_otp-input-container__B2NH6{display:flex;gap:.5rem;justify-content:center;margin-top:1rem}.auth-module_otp-input__vjImt{border:1px solid #ccc;border-radius:.5rem;font-size:1.5rem;height:2.5rem;outline:none;text-align:center;transition:border-color .2s;width:2rem}.auth-module_otp-input__vjImt:focus{border-color:#ff6f00}.auth-module_tabs__RcUmV{display:flex;justify-content:flex-start;margin-bottom:calc(-.5rem - 1px);max-width:100%;overflow-x:auto}.auth-module_tabs__RcUmV::-webkit-scrollbar{display:none}.auth-module_tabs__RcUmV::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:.25rem}.auth-module_tab-button__HT6wc{background-color:#fefefe;border-right:2px solid #ddd;cursor:pointer;font-size:.875rem;padding:.5rem 1rem;text-align:left;transition:background-color .2s}.auth-module_tab-button__HT6wc:hover{background-color:#eee}.auth-module_active-tab__l6P44{border-right-color:#ff6f00}.auth-module_tab-content__noHF0{height:20rem;margin-top:.25rem;min-height:20rem;width:100%}.auth-module_vertical-tabs-container__6sAOL{box-sizing:border-box;display:flex;flex-direction:row;gap:.5rem;width:100%}.auth-module_vertical-tabs__-ba-W{display:flex;flex-direction:column;gap:.25rem;height:100%;margin-left:-1rem;min-width:-moz-fit-content!important;min-width:fit-content!important;overflow-y:auto}.auth-module_vertical-tab-content__wTqKF{background-color:#f9f9f9;border:1px solid #ddd;border-radius:.25rem;flex:1 1 0%;height:22rem;max-width:100%;min-height:22rem;overflow:hidden;padding:1rem}.auth-module_ip-tab-container__ck0F8{justify-content:space-between}.auth-module_ip-tab-container__ck0F8,.auth-module_ip-tab-content__VI4zC{align-items:center;display:flex;flex-direction:column;gap:1rem;height:100%;width:100%}.auth-module_ip-tab-content__VI4zC{justify-content:center}.auth-module_ip-tab-content-text__y2BRh{color:#777;font-size:.875rem;margin-top:.5rem;text-align:center}.auth-module_contract-button-container__7HH9n{align-items:center;display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.auth-module_contract-input__4BYcs{border:1px solid #ccc;border-radius:.5rem;font-size:1rem;max-width:300px;outline:none;padding:.5rem;transition:border-color .2s;width:100%}.auth-module_contract-input__4BYcs:focus{border-color:#ff6f00}.auth-module_contract-button__Cq6zI{background-color:#ff6f00;border:none;border-radius:.5rem;color:#fff;cursor:pointer;font-size:1rem;padding:.75rem 1.5rem;transition:background-color .2s}.auth-module_contract-button__Cq6zI:hover{background-color:#cc4e02}.auth-module_contract-button__Cq6zI:disabled{background-color:#ccc;cursor:not-allowed}\n/*# sourceMappingURL=data:application/json;base64,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Q0FRRSx3QkFBeUIsQ0FIekIscUJBQXNCLENBQ3RCLG9CQUFzQixDQUx0QixXQUFZLENBR1osWUFBYSxDQUtiLGNBQWUsQ0FOZixnQkFBaUIsQ0FEakIsZUFBZ0IsQ0FLaEIsWUFHRixDQUVBLHFDQUtFLDZCQUdGLENBRUEsd0VBSkUsa0JBQW1CLENBTG5CLFlBQWEsQ0FDYixxQkFBc0IsQ0FDdEIsUUFBUyxDQUlULFdBQVksQ0FIWixVQWNGLENBUkEsbUNBS0Usc0JBR0YsQ0FFQSx3Q0FDRSxVQUFXLENBQ1gsaUJBQW1CLENBRW5CLGdCQUFrQixDQURsQixpQkFFRixDQUVBLDhDQUdFLGtCQUFtQixDQUZuQixZQUFhLENBQ2IscUJBQXNCLENBRXRCLFFBQVMsQ0FDVCxlQUNGLENBRUEsbUNBS0UscUJBQXNCLENBQ3RCLG1CQUFxQixDQUZyQixjQUFlLENBRmYsZUFBZ0IsQ0FLaEIsWUFBYSxDQUpiLGFBQWUsQ0FLZiwyQkFBNkIsQ0FQN0IsVUFRRixDQUVBLHlDQUNFLG9CQUNGLENBRUEsb0NBQ0Usd0JBQXlCLENBRXpCLFdBQVksQ0FDWixtQkFBcUIsQ0FGckIsVUFBWSxDQUtaLGNBQWUsQ0FEZixjQUFlLENBRGYscUJBQXVCLENBR3ZCLCtCQUNGLENBRUEsMENBQ0Usd0JBQ0YsQ0FFQSw2Q0FDRSxxQkFBc0IsQ0FDdEIsa0JBQ0YiLCJmaWxlIjoiYXV0aC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiQGltcG9ydCB1cmwoXCJodHRwczovL2FwaS5mb250c2hhcmUuY29tL3YyL2Nzcz9mW109c2F0b3NoaUAxJmRpc3BsYXk9c3dhcFwiKTtcclxuXHJcbi5tb2RhbCB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDg1O1xyXG4gIGxlZnQ6IDA7XHJcbiAgdG9wOiAwO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBvdmVyZmxvdzogYXV0bztcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCwgMCwgMCk7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xyXG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpO1xyXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xyXG59XHJcblxyXG4ubW9kYWwgLm91dGVyLWNvbnRhaW5lciB7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICBmb250LWZhbWlseTogXCJTYXRvc2hpXCIsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LFxyXG4gICAgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBDYW50YXJlbGwsIFwiT3BlbiBTYW5zXCIsIFwiSGVsdmV0aWNhIE5ldWVcIixcclxuICAgIHNhbnMtc2VyaWY7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHRvcDogNTAlO1xyXG4gIGxlZnQ6IDUwJTtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuXHJcbiAgLyogZGlhbG9nIG9uIG1vYmlsZSAqL1xyXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ0MHB4KSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XHJcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIHRvcDogYXV0bztcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDApO1xyXG4gIH1cclxufVxyXG5cclxuLm91dGVyLWNvbnRhaW5lciAuY29udGFpbmVyIHtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgIzg4ODtcclxuICBib3JkZXItcmFkaXVzOiAxLjVyZW07XHJcbiAgd2lkdGg6IDQwMHB4OyAvKiB0ZW1wb3JhcnkgKi9cclxuICBwYWRkaW5nOiAxLjVyZW07XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHJcbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDQwcHgpIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMDtcclxuICAgIHBhZGRpbmc6IDFyZW07XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgbWF4LWhlaWdodDogMTAwdmg7XHJcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gIH1cclxufVxyXG5cclxuLmNvbnRhaW5lci5saW5raW5nLWNvbnRhaW5lciB7XHJcbiAgbWF4LXdpZHRoOiAzMDBweDtcclxufVxyXG5cclxuLm9yaWdpbi10YWIge1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjVyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbn1cclxuLm9yaWdpbi1zZWN0aW9uIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuNXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLm9yaWdpbi1zZWN0aW9uIC5vcmlnaW4tY29udGFpbmVyIHtcclxuICBtaW4td2lkdGg6IDFyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWluLWhlaWdodDogM3JlbTtcclxuICBmb250LXNpemU6IDAuODc1cmVtO1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcclxufVxyXG5cclxuLm9yaWdpbi13cmFwcGVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuNXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLm9yaWdpbi1jb250YWluZXIgLm9yaWdpbi1sYWJlbCB7XHJcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgY29sb3I6ICM3Nzc3Nzc7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XHJcbn1cclxuXHJcbi5ob3Jpem9udGFsLWRpdmlkZXIge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcclxufVxyXG5cclxuLm9yaWdpbi1zZWN0aW9uIC5kaXZpZGVyIHtcclxuICB3aWR0aDogMXB4O1xyXG4gIGhlaWdodDogMXJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xyXG59XHJcblxyXG4ub3JpZ2luLWRhc2hib2FyZC1idXR0b24ge1xyXG4gIC8qIGJhY2tncm91bmQtY29sb3I6ICNmZjZmMDA7ICovXHJcbiAgY29sb3I6ICNmZjZmMDA7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIC8qIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07ICovXHJcbiAgcGFkZGluZzogMC4yNXJlbTtcclxuICBmb250LXNpemU6IDAuODc1cmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIC8qIGJveC1zaGFkb3c6IGhzbGEoMCwgMCUsIDEwMCUsIDAuMTUpIDAgMnB4IDAgaW5zZXQsXHJcbiAgICByZ2JhKDAsIDAsIDAsIDAuMDUpIDAgLTJweCA0cHggaW5zZXQsIHJnYmEoNDYsIDU0LCA4MCwgMC4wNzUpIDAgMXB4IDFweDsgKi9cclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuNXJlbTtcclxufVxyXG5cclxuLm9yaWdpbi1kYXNoYm9hcmQtYnV0dG9uOmhvdmVyIHtcclxuICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjY2M0ZTAyOyAqL1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBjb2xvcjogI2NjNGUwMjtcclxufVxyXG5cclxuLm9yaWdpbi1kYXNoYm9hcmQtYnV0dG9uOmRpc2FibGVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xyXG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbn1cclxuXHJcbi5jb250YWluZXIgaDIge1xyXG4gIG1hcmdpbi10b3A6IDA7XHJcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxuICBmb250LXNpemU6IDEuMjVyZW07XHJcbn1cclxuXHJcbi5jb250YWluZXIgLmhlYWRlciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gIGNvbG9yOiAjMzMzO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xyXG4gIC8qIG1hcmdpbi10b3A6IC0wLjZyZW07ICovXHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgZ2FwOiAwLjVyZW07XHJcblxyXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ0MHB4KSB7XHJcbiAgICBtYXJnaW4tdG9wOiAwO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG4gIH1cclxufVxyXG5cclxuLmxpbmtpbmctY29udGFpbmVyIC5oZWFkZXIge1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG59XHJcblxyXG4uY29udGFpbmVyIC5hdXRoLWhlYWRlciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbi1ib3R0b206IDFyZW07XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5jb250YWluZXIgLmhlYWRlciAuc21hbGwtbW9kYWwtaWNvbiB7XHJcbiAgd2lkdGg6IDJyZW07XHJcbiAgaGVpZ2h0OiAycmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcclxuICBtYXJnaW4tdG9wOiAwLjVyZW07XHJcbn1cclxuXHJcbi5jb250YWluZXIgLmhlYWRlciAud2FsbGV0LWFkZHJlc3Mge1xyXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcclxuICBjb2xvcjogIzc3NztcclxuICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gIG1hcmdpbi10b3A6IDAuMnJlbTtcclxufVxyXG5cclxuLmNvbnRhaW5lciAuY2xvc2UtYnV0dG9uIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgdG9wOiAxcmVtO1xyXG4gIHJpZ2h0OiAxcmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICNkZGQ7XHJcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcclxuICBmb250LXNpemU6IDEuNXJlbTtcclxuICBjb2xvcjogI2FhYTtcclxuICB3aWR0aDogMS4yNXJlbTtcclxuICBoZWlnaHQ6IDEuMjVyZW07XHJcbiAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXM7XHJcbn1cclxuXHJcbi5jbG9zZS1idXR0b24gPiAuY2xvc2UtaWNvbiB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIHdpZHRoOiAxcmVtO1xyXG4gIGhlaWdodDogMXJlbTtcclxuICBwYWRkaW5nOiAwLjE1cmVtO1xyXG59XHJcblxyXG4uY29udGFpbmVyIC5jbG9zZS1idXR0b246aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XHJcbiAgY29sb3I6ICM4ODg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uY29udGFpbmVyIC5saW5raW5nLXRleHQge1xyXG4gIGNvbG9yOiAjNzc3O1xyXG4gIGZvbnQtc2l6ZTogMXJlbTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgLyogbWFyZ2luLXRvcDogMDsgKi9cclxuICAvKiBtYXJnaW4tYm90dG9tOiAycmVtOyAqL1xyXG59XHJcblxyXG4ucHJvdmlkZXItbGlzdCB7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZ2FwOiAwLjVyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcclxuICBtYXgtaGVpZ2h0OiAxNy45cmVtO1xyXG4gIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xyXG4gIHBhZGRpbmctbGVmdDogMC41cmVtO1xyXG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjtcclxuICBzY3JvbGxiYXItY29sb3I6ICNjY2MgI2YxZjFmMTtcclxufVxyXG5cclxuLnByb3ZpZGVyLWxpc3QuYmlnIHtcclxuICBtYXgtaGVpZ2h0OiAxNnJlbTtcclxufVxyXG5cclxuLnByb3ZpZGVyLWxpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICB3aWR0aDogMC41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XHJcbn1cclxuLnByb3ZpZGVyLWxpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XHJcbn1cclxuLnByb3ZpZGVyLWxpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XHJcbn1cclxuXHJcbi5zcGlubmVyOjphZnRlciB7XHJcbiAgY29udGVudDogXCJcIjtcclxuICBkaXNwbGF5OiBibG9jaztcclxuICB3aWR0aDogMXJlbTtcclxuICBoZWlnaHQ6IDFyZW07XHJcbiAgYm9yZGVyOiAwLjI1cmVtIHNvbGlkICNmM2YzZjM7XHJcbiAgYm9yZGVyLXRvcDogMC4yNXJlbSBzb2xpZCAjZmY2ZjAwO1xyXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICBhbmltYXRpb246IHNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xyXG59XHJcbi5zcGlubmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xyXG4gIG1hcmdpbi1yaWdodDogMC4yNXJlbTtcclxuICBhbGlnbi1zZWxmOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc3BpbiB7XHJcbiAgMCUge1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XHJcbiAgfVxyXG4gIDEwMCUge1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcclxuICB9XHJcbn1cclxuXHJcbi5tb2RhbC1pY29uIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgd2lkdGg6IDRyZW07XHJcbiAgaGVpZ2h0OiA0cmVtO1xyXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcclxuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xyXG4gIHBhZGRpbmc6IDAuMzVyZW07XHJcbn1cclxuLm1vZGFsLWljb24gc3ZnIHtcclxuICB3aWR0aDogMy42cmVtO1xyXG4gIGhlaWdodDogMy42cmVtO1xyXG59XHJcblxyXG4uY29udGFpbmVyIGEuZm9vdGVyLXRleHQge1xyXG4gIC8qIG1hcmdpbi10b3A6IDFyZW07ICovXHJcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xyXG4gIGNvbG9yOiAjYmJiYmJiO1xyXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxufVxyXG5cclxuLmNvbnRhaW5lciBhLmZvb3Rlci10ZXh0OmhvdmVyIHtcclxuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcclxufVxyXG5cclxuLmRpc2Nvbm5lY3QtYnV0dG9uIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2ZjAwO1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcclxuICBwYWRkaW5nOiAxcmVtO1xyXG4gIHBhZGRpbmctYmxvY2s6IDA7XHJcbiAgZm9udC1zaXplOiAxcmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XHJcbiAgbWFyZ2luLXRvcDogMXJlbTtcclxuICBoZWlnaHQ6IDIuNXJlbTtcclxuICBib3gtc2hhZG93OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjE1KSAwIDJweCAwIGluc2V0LFxyXG4gICAgcmdiYSgwLCAwLCAwLCAwLjA1KSAwIC0ycHggNHB4IGluc2V0LCByZ2JhKDQ2LCA1NCwgODAsIDAuMDc1KSAwIDFweCAxcHg7XHJcbn1cclxuXHJcbi5kaXNjb25uZWN0LWJ1dHRvbjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjNGUwMjtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5kaXNjb25uZWN0LWJ1dHRvbjpkaXNhYmxlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcclxuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG59XHJcblxyXG4ubGlua2luZy1idXR0b24ge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjZmMDA7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xyXG4gIHBhZGRpbmc6IDFyZW07XHJcbiAgcGFkZGluZy1ibG9jazogMDtcclxuICBmb250LXNpemU6IDFyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcclxuICBtYXJnaW4tdG9wOiAxcmVtO1xyXG4gIGhlaWdodDogMi41cmVtO1xyXG4gIGJveC1zaGFkb3c6IGhzbGEoMCwgMCUsIDEwMCUsIDAuMTUpIDAgMnB4IDAgaW5zZXQsXHJcbiAgICByZ2JhKDAsIDAsIDAsIDAuMDUpIDAgLTJweCA0cHggaW5zZXQsIHJnYmEoNDYsIDU0LCA4MCwgMC4wNzUpIDAgMXB4IDFweDtcclxufVxyXG5cclxuLmxpbmtpbmctYnV0dG9uOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2M0ZTAyO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmxpbmtpbmctYnV0dG9uOmRpc2FibGVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xyXG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbn1cclxuXHJcbi5zb2NpYWxzLXdyYXBwZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBnYXA6IDFyZW07XHJcbiAgbWFyZ2luLWJsb2NrOiAwLjVyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGdhcDogMC41cmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uc29jaWFscy1jb250YWluZXIgLmNvbm5lY3Rvci1jb250YWluZXIge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC4yNXJlbTtcclxufVxyXG5cclxuLnNvY2lhbHMtY29udGFpbmVyIC5jb25uZWN0b3ItYnV0dG9uIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC4yNXJlbTtcclxuICBwYWRkaW5nOiAwLjc1cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xyXG4gIGNvbG9yOiAjMzMzO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAyLjVyZW07XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciAuY29ubmVjdG9yLWJ1dHRvbjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciAuY29ubmVjdG9yLWJ1dHRvbjpkaXNhYmxlZCB7XHJcbiAgY3Vyc29yOiBkZWZhdWx0O1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciAuY29ubmVjdG9yLWJ1dHRvbiBzdmcge1xyXG4gIHdpZHRoOiAxLjVyZW07XHJcbiAgaGVpZ2h0OiAxLjVyZW07XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciAuY29ubmVjdG9yLWNvbm5lY3RlZCB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuMjVyZW07XHJcbiAgcGFkZGluZzogMC43NXJlbTtcclxuICBwYWRkaW5nLXRvcDogMC41cmVtO1xyXG4gIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcclxuICB3aWR0aDogMTAwJTtcclxuICBmbGV4OiAxO1xyXG59XHJcblxyXG4uc29jaWFscy1jb250YWluZXIgLmNvbm5lY3Rvci1jb25uZWN0ZWQgc3ZnIHtcclxuICB3aWR0aDogMS41cmVtO1xyXG4gIGhlaWdodDogMS41cmVtO1xyXG4gIGNvbG9yOiAjMzMzO1xyXG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xyXG59XHJcblxyXG4uc29jaWFscy1jb250YWluZXIgaDMge1xyXG4gIGNvbG9yOiAjMzMzO1xyXG4gIG1hcmdpbjogMDtcclxufVxyXG5cclxuLmNvbm5lY3Rvci1idXR0b24gLmNvbm5lY3Rvci1jaGVja21hcmsge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB0b3A6IC0wLjVyZW07XHJcbiAgcmlnaHQ6IC0wLjVyZW07XHJcbiAgd2lkdGg6IDFyZW0gIWltcG9ydGFudDtcclxuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcclxufVxyXG5cclxuLnVubGluay1jb25uZWN0b3ItYnV0dG9uIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgcmlnaHQ6IDAuMzc1cmVtO1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBmb250LXNpemU6IDAuNzVyZW07XHJcbiAgcGFkZGluZzogMC4yNXJlbSAwLjVyZW07XHJcbiAgcGFkZGluZy1yaWdodDogMC42NzVyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5O1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjI1cmVtO1xyXG4gIGJveC1zaGFkb3c6IGhzbGEoMCwgMCUsIDEwMCUsIDAuMTUpIDAgMnB4IDAgaW5zZXQsXHJcbiAgICByZ2JhKDAsIDAsIDAsIDAuMDUpIDAgLTJweCA0cHggaW5zZXQsIHJnYmEoNDYsIDU0LCA4MCwgMC4wNzUpIDAgMXB4IDFweDtcclxuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzO1xyXG59XHJcblxyXG4udW5saW5rLWNvbm5lY3Rvci1idXR0b24gc3ZnIHtcclxuICBzdHJva2U6IHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgd2lkdGg6IDAuODc1cmVtICFpbXBvcnRhbnQ7XHJcbiAgaGVpZ2h0OiAwLjg3NXJlbSAhaW1wb3J0YW50O1xyXG4gIG1hcmdpbi1yaWdodDogMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udW5saW5rLWNvbm5lY3Rvci1idXR0b246aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4udW5saW5rLWNvbm5lY3Rvci1idXR0b246ZGlzYWJsZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XHJcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxufVxyXG5cclxuQGtleWZyYW1lcyBsb2FkZXIge1xyXG4gIDAlIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwJSk7XHJcbiAgfVxyXG4gIDUwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XHJcbiAgfVxyXG4gIDEwMCUge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDAlKTtcclxuICB9XHJcbn1cclxuXHJcbi5sb2FkZXIge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB3aWR0aDogNHJlbTtcclxuICBoZWlnaHQ6IDAuNHJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xyXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcclxuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogMC4xMjVyZW07XHJcbn1cclxuXHJcbi5sb2FkZXI6OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcIjtcclxuICBkaXNwbGF5OiBibG9jaztcclxuICB3aWR0aDogMnJlbTtcclxuICBoZWlnaHQ6IDAuNHJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2ZjAwO1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwO1xyXG4gIGFuaW1hdGlvbjogbG9hZGVyIDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4xMjVyZW07XHJcbn1cclxuXHJcbi5uby1zb2NpYWxzIHtcclxuICBjb2xvcjogIzc3NztcclxuICBmb250LXNpemU6IDAuODc1cmVtO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBtYXJnaW4tdG9wOiAwLjVyZW07XHJcbn1cclxuXHJcbi5kaXZpZGVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjVyZW07XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcclxufVxyXG5cclxuLmRpdmlkZXI6OmJlZm9yZSxcclxuLmRpdmlkZXI6OmFmdGVyIHtcclxuICBjb250ZW50OiBcIlwiO1xyXG4gIGZsZXg6IDE7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XHJcbn1cclxuXHJcbmlucHV0LnRpa3Rvay1pbnB1dCB7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgZ3JheTtcclxuICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xyXG4gIGNvbG9yOiBibGFjaztcclxuICBmb250LWZhbWlseTogU2F0b3NoaSwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLFxyXG4gICAgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCBPcGVuIFNhbnMsIEhlbHZldGljYSBOZXVlLCBzYW5zLXNlcmlmO1xyXG4gIGZvbnQtc2l6ZTogMXJlbTtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG4gIGhlaWdodDogMi43NXJlbTtcclxuICBsaW5lLWhlaWdodDogMS4zMzNyZW07XHJcbiAgcGFkZGluZy1pbmxpbmU6IDFyZW07XHJcbiAgbWFyZ2luLXRvcDogMXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuaW5wdXQudGlrdG9rLWlucHV0LmludmFsaWQge1xyXG4gIGJvcmRlci1jb2xvcjogI2RjMzU0NTtcclxuICBvdXRsaW5lLWNvbG9yOiAjZGMzNTQ1O1xyXG59XHJcblxyXG4ub3RwLWlucHV0LWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBnYXA6IDAuNXJlbTtcclxuICBtYXJnaW4tdG9wOiAxcmVtO1xyXG59XHJcblxyXG4ub3RwLWlucHV0IHtcclxuICB3aWR0aDogMnJlbTtcclxuICBoZWlnaHQ6IDIuNXJlbTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgZm9udC1zaXplOiAxLjVyZW07XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICBib3JkZXItcmFkaXVzOiAwLjVyZW07XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycztcclxufVxyXG5cclxuLm90cC1pbnB1dDpmb2N1cyB7XHJcbiAgYm9yZGVyLWNvbG9yOiAjZmY2ZjAwO1xyXG59XHJcblxyXG4udGFicyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgbWFyZ2luLWJvdHRvbTogY2FsYygtMC41cmVtIC0gMXB4KTtcclxuICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgb3ZlcmZsb3cteDogYXV0bztcclxufVxyXG4udGFiczo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuLnRhYnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XHJcbn1cclxuXHJcbi50YWItYnV0dG9uIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xyXG4gIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNkZGQ7XHJcbiAgcGFkZGluZzogMC41cmVtIDFyZW07XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzO1xyXG4gIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi50YWItYnV0dG9uOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xyXG59XHJcblxyXG4uYWN0aXZlLXRhYiB7XHJcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZmY2ZjAwO1xyXG59XHJcblxyXG4udGFiLWNvbnRlbnQge1xyXG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWluLWhlaWdodDogMjByZW07XHJcbiAgaGVpZ2h0OiAyMHJlbTtcclxufVxyXG5cclxuLnZlcnRpY2FsLXRhYnMtY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgZ2FwOiAwLjVyZW07XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLnZlcnRpY2FsLXRhYnMge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBnYXA6IDAuMjVyZW07XHJcbiAgbWluLXdpZHRoOiBmaXQtY29udGVudCAhaW1wb3J0YW50O1xyXG4gIG1hcmdpbi1sZWZ0OiAtMXJlbTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgb3ZlcmZsb3cteTogYXV0bztcclxufVxyXG5cclxuLnZlcnRpY2FsLXRhYi1jb250ZW50IHtcclxuICBmbGV4OiAxIDEgMCU7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICBtaW4taGVpZ2h0OiAyMnJlbTtcclxuICBoZWlnaHQ6IDIycmVtO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxuICBwYWRkaW5nOiAxcmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XHJcbiAgbWF4LXdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uaXAtdGFiLWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGdhcDogMXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbn1cclxuXHJcbi5pcC10YWItY29udGVudCB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGdhcDogMXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMTAwJTtcclxufVxyXG5cclxuLmlwLXRhYi1jb250ZW50LXRleHQge1xyXG4gIGNvbG9yOiAjNzc3O1xyXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcclxufVxyXG5cclxuLmNvbnRyYWN0LWJ1dHRvbi1jb250YWluZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMXJlbTtcclxuICBtYXJnaW4tdG9wOiAxcmVtO1xyXG59XHJcblxyXG4uY29udHJhY3QtaW5wdXQge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIG1heC13aWR0aDogMzAwcHg7XHJcbiAgcGFkZGluZzogMC41cmVtO1xyXG4gIGZvbnQtc2l6ZTogMXJlbTtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcclxuICBvdXRsaW5lOiBub25lO1xyXG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzO1xyXG59XHJcblxyXG4uY29udHJhY3QtaW5wdXQ6Zm9jdXMge1xyXG4gIGJvcmRlci1jb2xvcjogI2ZmNmYwMDtcclxufVxyXG5cclxuLmNvbnRyYWN0LWJ1dHRvbiB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNmYwMDtcclxuICBjb2xvcjogd2hpdGU7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcclxuICBwYWRkaW5nOiAwLjc1cmVtIDEuNXJlbTtcclxuICBmb250LXNpemU6IDFyZW07XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcclxufVxyXG5cclxuLmNvbnRyYWN0LWJ1dHRvbjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjNGUwMjtcclxufVxyXG5cclxuLmNvbnRyYWN0LWJ1dHRvbjpkaXNhYmxlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcclxuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG59XHJcbiJdfQ== */";
|
|
1343
|
+
var css_248z$1 = "@import url(\"https://api.fontshare.com/v2/css?f[]=satoshi@1&display=swap\");.auth-module_modal__yyg5L{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#000;background-color:rgba(0,0,0,.4);height:100%;left:0;overflow:auto;position:fixed;top:0;transition:all .3s;width:100%;z-index:85}.auth-module_modal__yyg5L .auth-module_outer-container__RraOQ{align-items:center;box-sizing:border-box;display:flex;flex-direction:row;font-family:Satoshi,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);@media screen and (max-width:440px){border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:0;top:auto;transform:translate(-50%);width:100%}}.auth-module_outer-container__RraOQ .auth-module_container__7utns{align-items:center;background-color:#fefefe;border:1px solid #888;border-radius:1.5rem;box-sizing:border-box;flex-direction:column;justify-content:center;padding:1.5rem 1.5rem 1rem;position:relative;text-align:center;width:400px;@media screen and (max-width:440px){border-radius:0;height:auto;max-height:100vh;overflow-y:auto;padding-bottom:1rem;padding-bottom:.5rem;padding-left:1rem;padding-right:1rem;padding-top:1rem;width:100%}}.auth-module_container__7utns.auth-module_linking-container__mYNwD{max-width:300px}.auth-module_origin-tab__miOUK{align-items:center;display:flex;flex-direction:column;gap:.5rem;height:100%;justify-content:space-between;width:100%}.auth-module_origin-section__UBhBB{align-items:center;display:flex;flex-direction:row;gap:.5rem;justify-content:space-evenly;width:100%}.auth-module_origin-section__UBhBB .auth-module_origin-container__ZIk4c{align-items:center;color:#333;display:flex;flex-direction:column;font-size:.875rem;font-weight:400;justify-content:center;margin-bottom:.5rem;margin-top:.5rem;min-height:3rem;min-width:1rem;text-align:center;width:100%}.auth-module_origin-wrapper__JQfEI{align-items:center;display:flex;flex-direction:column;gap:.5rem;justify-content:center;width:100%}.auth-module_origin-container__ZIk4c .auth-module_origin-label__l-1q9{color:#777;font-size:.75rem;font-weight:400;margin-bottom:.25rem;text-align:center}.auth-module_horizontal-divider__YfWCy{background-color:#ddd;height:1px;margin-bottom:.5rem;margin-top:.5rem;width:100%}.auth-module_origin-section__UBhBB .auth-module_divider__z65Me{background-color:#ddd;height:1rem;width:1px}.auth-module_origin-dashboard-button__-pch4{align-items:center;border:none;color:#ff6f00;display:flex;flex-direction:row;font-size:.875rem;gap:.5rem;justify-content:center;padding:.25rem;width:100%}.auth-module_origin-dashboard-button__-pch4:hover{color:#cc4e02;cursor:pointer}.auth-module_origin-dashboard-button__-pch4:disabled{background-color:#ccc;cursor:not-allowed}.auth-module_container__7utns h2{font-size:1.25rem;margin-bottom:1rem;margin-top:0}.auth-module_container__7utns .auth-module_header__pX9nM{align-items:center;color:#333;display:flex;flex-direction:row;font-weight:700;gap:.5rem;justify-content:flex-start;margin-bottom:1rem;text-align:left;width:100%;@media screen and (max-width:440px){margin-bottom:.5rem;margin-top:0}}.auth-module_linking-container__mYNwD .auth-module_header__pX9nM{justify-content:center}.auth-module_container__7utns .auth-module_auth-header__LsM1f{align-items:center;color:#333;display:flex;flex-direction:column;font-weight:700;justify-content:center;margin-bottom:1rem;text-align:center;width:100%}.auth-module_container__7utns .auth-module_header__pX9nM .auth-module_small-modal-icon__YayD1{height:2rem;margin-bottom:.5rem;margin-top:.5rem;width:2rem}.auth-module_container__7utns .auth-module_header__pX9nM .auth-module_wallet-address__AVVA5{color:#777;font-size:.75rem;font-weight:400;margin-top:.2rem}.auth-module_container__7utns .auth-module_close-button__uZrho{background-color:#fff;border:2px solid #ddd;border-radius:100%;color:#aaa;font-size:1.5rem;height:1.25rem;position:absolute;right:1rem;top:1rem;transition:color .15s;width:1.25rem}.auth-module_close-button__uZrho>.auth-module_close-icon__SSCni{display:block;height:1rem;padding:.15rem;position:relative;width:1rem}.auth-module_container__7utns .auth-module_close-button__uZrho:hover{background-color:#ddd;color:#888;cursor:pointer}.auth-module_container__7utns .auth-module_linking-text__uz3ud{color:#777;font-size:1rem;text-align:center}.auth-module_provider-list__6vISy{box-sizing:border-box;display:flex;flex-direction:column;gap:.5rem;margin-bottom:.75rem;max-height:17.9rem;overflow-y:auto;padding-left:.5rem;padding-right:.5rem;scrollbar-color:#ccc #f1f1f1;scrollbar-width:thin;width:100%}.auth-module_provider-list__6vISy.auth-module_big__jQxvN{max-height:16rem}.auth-module_provider-list__6vISy::-webkit-scrollbar{border-radius:.25rem;width:.5rem}.auth-module_provider-list__6vISy::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:.25rem}.auth-module_provider-list__6vISy::-webkit-scrollbar-track{background-color:#f1f1f1;border-radius:.25rem}.auth-module_spinner__hfzlH:after{animation:auth-module_spin__tm9l6 1s linear infinite;border:.25rem solid #f3f3f3;border-radius:50%;border-top-color:#ff6f00;content:\"\";display:block;height:1rem;width:1rem}.auth-module_spinner__hfzlH{align-self:center;display:flex;justify-content:center;margin-left:auto;margin-right:.25rem}@keyframes auth-module_spin__tm9l6{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.auth-module_modal-icon__CV7ah{align-items:center;display:flex;height:4rem;justify-content:center;margin-bottom:.25rem;margin-top:.5rem;padding:.35rem;width:4rem}.auth-module_modal-icon__CV7ah svg{height:3.6rem;width:3.6rem}.auth-module_container__7utns a.auth-module_footer-text__CQnh6{color:#bbb;font-size:.75rem;text-decoration:none}.auth-module_container__7utns a.auth-module_footer-text__CQnh6:hover{text-decoration:underline}.auth-module_disconnect-button__bsu-3{background-color:#ff6f00;border:none;border-radius:.75rem;box-shadow:inset 0 2px 0 hsla(0,0%,100%,.15),inset 0 -2px 4px rgba(0,0,0,.05),0 1px 1px rgba(46,54,80,.075);color:#fff;font-size:1rem;height:2.5rem;margin-bottom:.75rem;margin-top:1rem;padding:1rem;padding-block:0;width:100%}.auth-module_disconnect-button__bsu-3:hover{background-color:#cc4e02;cursor:pointer}.auth-module_disconnect-button__bsu-3:disabled{background-color:#ccc;cursor:not-allowed}.auth-module_linking-button__g1GlL{background-color:#ff6f00;border:none;border-radius:.75rem;box-shadow:inset 0 2px 0 hsla(0,0%,100%,.15),inset 0 -2px 4px rgba(0,0,0,.05),0 1px 1px rgba(46,54,80,.075);color:#fff;font-size:1rem;height:2.5rem;margin-bottom:.75rem;margin-top:1rem;padding:1rem;padding-block:0;width:100%}.auth-module_linking-button__g1GlL:hover{background-color:#cc4e02;cursor:pointer}.auth-module_linking-button__g1GlL:disabled{background-color:#ccc;cursor:not-allowed}.auth-module_socials-wrapper__PshV3{display:flex;flex-direction:column;gap:1rem;margin-block:.5rem;width:100%}.auth-module_socials-container__iDzfJ{display:flex;flex-direction:column;gap:.5rem;width:100%}.auth-module_socials-container__iDzfJ .auth-module_connector-container__4wn11{align-items:center;display:flex;gap:.25rem;justify-content:flex-start;position:relative}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA{align-items:center;background-color:#fefefe;border:1px solid #ddd;border-radius:.75rem;color:#333;display:flex;font-size:.875rem;gap:.25rem;height:2.5rem;padding:.75rem;position:relative;width:100%}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA:hover{background-color:#ddd;cursor:pointer}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA:disabled{background-color:#fefefe;cursor:default}.auth-module_socials-container__iDzfJ .auth-module_connector-button__j79HA svg{color:#333;height:1.5rem;margin-right:.5rem;width:1.5rem}.auth-module_socials-container__iDzfJ .auth-module_connector-connected__JvDQb{align-items:center;background-color:#eee;border:1px solid #ddd;border-radius:.25rem;color:#333;display:flex;flex:1;font-size:.875rem;gap:.25rem;padding:.5rem .75rem;position:relative;width:100%}.auth-module_socials-container__iDzfJ .auth-module_connector-connected__JvDQb svg{color:#333;height:1.5rem;margin-right:.5rem;width:1.5rem}.auth-module_socials-container__iDzfJ h3{color:#333;margin:0}.auth-module_connector-button__j79HA .auth-module_connector-checkmark__ZS6zU{height:1rem!important;position:absolute;right:-.5rem;top:-.5rem;width:1rem!important}.auth-module_unlink-connector-button__6Fwkp{align-items:center;background-color:#999;border:none;border-radius:.5rem;box-shadow:inset 0 2px 0 hsla(0,0%,100%,.15),inset 0 -2px 4px rgba(0,0,0,.05),0 1px 1px rgba(46,54,80,.075);color:#fff;display:flex;font-size:.75rem;gap:.25rem;padding:.25rem .675rem .25rem .5rem;position:absolute;right:.375rem;text-align:center;transition:background-color .15s}.auth-module_unlink-connector-button__6Fwkp svg{stroke:#fff!important;height:.875rem!important;margin-right:0!important;width:.875rem!important}.auth-module_unlink-connector-button__6Fwkp:hover{background-color:#888;cursor:pointer}.auth-module_unlink-connector-button__6Fwkp:disabled{background-color:#ccc;cursor:not-allowed}@keyframes auth-module_loader__gH3ZC{0%{transform:translateX(0)}50%{transform:translateX(100%)}to{transform:translateX(0)}}.auth-module_loader__gH3ZC{background-color:#ddd;border-radius:.125rem;height:.4rem;margin-bottom:.5rem;margin-top:.5rem;position:relative;width:4rem}.auth-module_loader__gH3ZC:before{animation:auth-module_loader__gH3ZC 1.5s ease-in-out infinite;background-color:#ff6f00;border-radius:.125rem;content:\"\";display:block;height:.4rem;left:0;position:absolute;width:2rem}.auth-module_no-socials__wEx0t{color:#777;font-size:.875rem;margin-top:.5rem;text-align:center}.auth-module_divider__z65Me{align-items:center;display:flex;gap:.5rem;margin-bottom:.5rem;margin-top:.5rem}.auth-module_divider__z65Me:after,.auth-module_divider__z65Me:before{border-bottom:1px solid #ddd;content:\"\";flex:1}input.auth-module_tiktok-input__FeqdG{border:1px solid gray;border-radius:.75rem;color:#000;font-family:Satoshi,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1rem;font-weight:600;height:2.75rem;line-height:1.333rem;margin-top:1rem;padding-inline:1rem;width:100%}input.auth-module_tiktok-input__FeqdG.auth-module_invalid__qqgK6{border-color:#dc3545;outline-color:#dc3545}.auth-module_otp-input-container__B2NH6{display:flex;gap:.5rem;justify-content:center;margin-top:1rem}.auth-module_otp-input__vjImt{border:1px solid #ccc;border-radius:.5rem;font-size:1.5rem;height:2.5rem;outline:none;text-align:center;transition:border-color .2s;width:2rem}.auth-module_otp-input__vjImt:focus{border-color:#ff6f00}.auth-module_tabs__RcUmV{display:flex;justify-content:flex-start;margin-bottom:calc(-.5rem - 1px);max-width:100%;overflow-x:auto}.auth-module_tabs__RcUmV::-webkit-scrollbar{display:none}.auth-module_tabs__RcUmV::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:.25rem}.auth-module_tab-button__HT6wc{background-color:#fefefe;border-right:2px solid #ddd;color:#333;cursor:pointer;font-size:.875rem;padding:.5rem 1rem;text-align:left;transition:background-color .2s}.auth-module_tab-button__HT6wc:hover{background-color:#eee}.auth-module_active-tab__l6P44{border-right-color:#ff6f00}.auth-module_tab-content__noHF0{height:20rem;margin-top:.25rem;min-height:20rem;width:100%}.auth-module_vertical-tabs-container__6sAOL{box-sizing:border-box;display:flex;flex-direction:row;gap:.5rem;width:100%}.auth-module_vertical-tabs__-ba-W{display:flex;flex-direction:column;gap:.25rem;height:100%;margin-left:-1rem;min-width:-moz-fit-content!important;min-width:fit-content!important;overflow-y:auto}.auth-module_vertical-tab-content__wTqKF{background-color:#f9f9f9;border:1px solid #ddd;border-radius:.25rem;flex:1 1 0%;height:22rem;max-width:100%;min-height:22rem;overflow:hidden;padding:1rem}.auth-module_ip-tab-container__ck0F8{justify-content:space-between}.auth-module_ip-tab-container__ck0F8,.auth-module_ip-tab-content__VI4zC{align-items:center;display:flex;flex-direction:column;gap:1rem;height:100%;width:100%}.auth-module_ip-tab-content__VI4zC{justify-content:center}.auth-module_ip-tab-content-text__y2BRh{color:#777;font-size:.875rem;margin-top:.5rem;text-align:center}.auth-module_contract-button-container__7HH9n{align-items:center;display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.auth-module_contract-input__4BYcs{border:1px solid #ccc;border-radius:.5rem;color:#333;font-size:1rem;max-width:300px;outline:none;padding:.5rem;transition:border-color .2s;width:100%}.auth-module_contract-input__4BYcs:focus{border-color:#ff6f00}.auth-module_contract-button__Cq6zI{background-color:#ff6f00;border:none;border-radius:.5rem;color:#fff;cursor:pointer;font-size:1rem;padding:.75rem 1.5rem;transition:background-color .2s}.auth-module_contract-button__Cq6zI:hover{background-color:#cc4e02}.auth-module_contract-button__Cq6zI:disabled{background-color:#ccc;cursor:not-allowed}\n/*# sourceMappingURL=data:application/json;base64,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QUNGLENBRUEseUNBUUUsd0JBQXlCLENBSHpCLHFCQUFzQixDQUN0QixvQkFBc0IsQ0FMdEIsV0FBWSxDQUdaLFlBQWEsQ0FLYixjQUFlLENBTmYsZ0JBQWlCLENBRGpCLGVBQWdCLENBS2hCLFlBR0YsQ0FFQSxxQ0FLRSw2QkFHRixDQUVBLHdFQUpFLGtCQUFtQixDQUxuQixZQUFhLENBQ2IscUJBQXNCLENBQ3RCLFFBQVMsQ0FJVCxXQUFZLENBSFosVUFjRixDQVJBLG1DQUtFLHNCQUdGLENBRUEsd0NBQ0UsVUFBVyxDQUNYLGlCQUFtQixDQUVuQixnQkFBa0IsQ0FEbEIsaUJBRUYsQ0FFQSw4Q0FHRSxrQkFBbUIsQ0FGbkIsWUFBYSxDQUNiLHFCQUFzQixDQUV0QixRQUFTLENBQ1QsZUFDRixDQUVBLG1DQUtFLHFCQUFzQixDQUN0QixtQkFBcUIsQ0FHckIsVUFBVyxDQUxYLGNBQWUsQ0FGZixlQUFnQixDQUtoQixZQUFhLENBSmIsYUFBZSxDQUtmLDJCQUE2QixDQVA3QixVQVNGLENBRUEseUNBQ0Usb0JBQ0YsQ0FFQSxvQ0FDRSx3QkFBeUIsQ0FFekIsV0FBWSxDQUNaLG1CQUFxQixDQUZyQixVQUFZLENBS1osY0FBZSxDQURmLGNBQWUsQ0FEZixxQkFBdUIsQ0FHdkIsK0JBQ0YsQ0FFQSwwQ0FDRSx3QkFDRixDQUVBLDZDQUNFLHFCQUFzQixDQUN0QixrQkFDRiIsImZpbGUiOiJhdXRoLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAaW1wb3J0IHVybChcImh0dHBzOi8vYXBpLmZvbnRzaGFyZS5jb20vdjIvY3NzP2ZbXT1zYXRvc2hpQDEmZGlzcGxheT1zd2FwXCIpO1xyXG5cclxuLm1vZGFsIHtcclxuICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgei1pbmRleDogODU7XHJcbiAgbGVmdDogMDtcclxuICB0b3A6IDA7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigwLCAwLCAwKTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XHJcbiAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7XHJcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XHJcbn1cclxuXHJcbi5tb2RhbCAub3V0ZXItY29udGFpbmVyIHtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIGZvbnQtZmFtaWx5OiBcIlNhdG9zaGlcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsXHJcbiAgICBcIlNlZ29lIFVJXCIsIFJvYm90bywgT3h5Z2VuLCBVYnVudHUsIENhbnRhcmVsbCwgXCJPcGVuIFNhbnNcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLFxyXG4gICAgc2Fucy1zZXJpZjtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgdG9wOiA1MCU7XHJcbiAgbGVmdDogNTAlO1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG5cclxuICAvKiBkaWFsb2cgb24gbW9iaWxlICovXHJcbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDQwcHgpIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcclxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgdG9wOiBhdXRvO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMCk7XHJcbiAgfVxyXG59XHJcblxyXG4ub3V0ZXItY29udGFpbmVyIC5jb250YWluZXIge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjODg4O1xyXG4gIGJvcmRlci1yYWRpdXM6IDEuNXJlbTtcclxuICB3aWR0aDogNDAwcHg7IC8qIHRlbXBvcmFyeSAqL1xyXG4gIHBhZGRpbmc6IDEuNXJlbTtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIHBhZGRpbmctYm90dG9tOiAxcmVtO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG5cclxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0NDBweCkge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3JkZXItcmFkaXVzOiAwO1xyXG4gICAgcGFkZGluZzogMXJlbTtcclxuICAgIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICBtYXgtaGVpZ2h0OiAxMDB2aDtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgfVxyXG59XHJcblxyXG4uY29udGFpbmVyLmxpbmtpbmctY29udGFpbmVyIHtcclxuICBtYXgtd2lkdGg6IDMwMHB4O1xyXG59XHJcblxyXG4ub3JpZ2luLXRhYiB7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuNXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG4ub3JpZ2luLXNlY3Rpb24ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWV2ZW5seTtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC41cmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4ub3JpZ2luLXNlY3Rpb24gLm9yaWdpbi1jb250YWluZXIge1xyXG4gIG1pbi13aWR0aDogMXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtaW4taGVpZ2h0OiAzcmVtO1xyXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XHJcbiAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICBjb2xvcjogIzMzMztcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG59XHJcblxyXG4ub3JpZ2luLXdyYXBwZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC41cmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4ub3JpZ2luLWNvbnRhaW5lciAub3JpZ2luLWxhYmVsIHtcclxuICBmb250LXNpemU6IDAuNzVyZW07XHJcbiAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICBjb2xvcjogIzc3Nzc3NztcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcclxufVxyXG5cclxuLmhvcml6b250YWwtZGl2aWRlciB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxcHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcclxuICBtYXJnaW4tdG9wOiAwLjVyZW07XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG59XHJcblxyXG4ub3JpZ2luLXNlY3Rpb24gLmRpdmlkZXIge1xyXG4gIHdpZHRoOiAxcHg7XHJcbiAgaGVpZ2h0OiAxcmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XHJcbn1cclxuXHJcbi5vcmlnaW4tZGFzaGJvYXJkLWJ1dHRvbiB7XHJcbiAgLyogYmFja2dyb3VuZC1jb2xvcjogI2ZmNmYwMDsgKi9cclxuICBjb2xvcjogI2ZmNmYwMDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgLyogYm9yZGVyLXJhZGl1czogMC43NXJlbTsgKi9cclxuICBwYWRkaW5nOiAwLjI1cmVtO1xyXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgLyogYm94LXNoYWRvdzogaHNsYSgwLCAwJSwgMTAwJSwgMC4xNSkgMCAycHggMCBpbnNldCxcclxuICAgIHJnYmEoMCwgMCwgMCwgMC4wNSkgMCAtMnB4IDRweCBpbnNldCwgcmdiYSg0NiwgNTQsIDgwLCAwLjA3NSkgMCAxcHggMXB4OyAqL1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC41cmVtO1xyXG59XHJcblxyXG4ub3JpZ2luLWRhc2hib2FyZC1idXR0b246aG92ZXIge1xyXG4gIC8qIGJhY2tncm91bmQtY29sb3I6ICNjYzRlMDI7ICovXHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIGNvbG9yOiAjY2M0ZTAyO1xyXG59XHJcblxyXG4ub3JpZ2luLWRhc2hib2FyZC1idXR0b246ZGlzYWJsZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XHJcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxufVxyXG5cclxuLmNvbnRhaW5lciBoMiB7XHJcbiAgbWFyZ2luLXRvcDogMDtcclxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xyXG4gIGZvbnQtc2l6ZTogMS4yNXJlbTtcclxufVxyXG5cclxuLmNvbnRhaW5lciAuaGVhZGVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgdGV4dC1hbGlnbjogbGVmdDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIG1hcmdpbi1ib3R0b206IDFyZW07XHJcbiAgLyogbWFyZ2luLXRvcDogLTAuNnJlbTsgKi9cclxuICBmb250LXdlaWdodDogYm9sZDtcclxuICBnYXA6IDAuNXJlbTtcclxuXHJcbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDQwcHgpIHtcclxuICAgIG1hcmdpbi10b3A6IDA7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XHJcbiAgfVxyXG59XHJcblxyXG4ubGlua2luZy1jb250YWluZXIgLmhlYWRlciB7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5jb250YWluZXIgLmF1dGgtaGVhZGVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBjb2xvcjogIzMzMztcclxuICB3aWR0aDogMTAwJTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxuICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmNvbnRhaW5lciAuaGVhZGVyIC5zbWFsbC1tb2RhbC1pY29uIHtcclxuICB3aWR0aDogMnJlbTtcclxuICBoZWlnaHQ6IDJyZW07XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcclxufVxyXG5cclxuLmNvbnRhaW5lciAuaGVhZGVyIC53YWxsZXQtYWRkcmVzcyB7XHJcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xyXG4gIGNvbG9yOiAjNzc3O1xyXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgbWFyZ2luLXRvcDogMC4ycmVtO1xyXG59XHJcblxyXG4uY29udGFpbmVyIC5jbG9zZS1idXR0b24ge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB0b3A6IDFyZW07XHJcbiAgcmlnaHQ6IDFyZW07XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgYm9yZGVyOiAycHggc29saWQgI2RkZDtcclxuICBib3JkZXItcmFkaXVzOiAxMDAlO1xyXG4gIGZvbnQtc2l6ZTogMS41cmVtO1xyXG4gIGNvbG9yOiAjYWFhO1xyXG4gIHdpZHRoOiAxLjI1cmVtO1xyXG4gIGhlaWdodDogMS4yNXJlbTtcclxuICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cztcclxufVxyXG5cclxuLmNsb3NlLWJ1dHRvbiA+IC5jbG9zZS1pY29uIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgd2lkdGg6IDFyZW07XHJcbiAgaGVpZ2h0OiAxcmVtO1xyXG4gIHBhZGRpbmc6IDAuMTVyZW07XHJcbn1cclxuXHJcbi5jb250YWluZXIgLmNsb3NlLWJ1dHRvbjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcclxuICBjb2xvcjogIzg4ODtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5jb250YWluZXIgLmxpbmtpbmctdGV4dCB7XHJcbiAgY29sb3I6ICM3Nzc7XHJcbiAgZm9udC1zaXplOiAxcmVtO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAvKiBtYXJnaW4tdG9wOiAwOyAqL1xyXG4gIC8qIG1hcmdpbi1ib3R0b206IDJyZW07ICovXHJcbn1cclxuXHJcbi5wcm92aWRlci1saXN0IHtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBnYXA6IDAuNXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xyXG4gIG1heC1oZWlnaHQ6IDE3LjlyZW07XHJcbiAgb3ZlcmZsb3cteTogYXV0bztcclxuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XHJcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XHJcbiAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xyXG4gIHNjcm9sbGJhci1jb2xvcjogI2NjYyAjZjFmMWYxO1xyXG59XHJcblxyXG4ucHJvdmlkZXItbGlzdC5iaWcge1xyXG4gIG1heC1oZWlnaHQ6IDE2cmVtO1xyXG59XHJcblxyXG4ucHJvdmlkZXItbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiAwLjVyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxufVxyXG4ucHJvdmlkZXItbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxufVxyXG4ucHJvdmlkZXItbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxufVxyXG5cclxuLnNwaW5uZXI6OmFmdGVyIHtcclxuICBjb250ZW50OiBcIlwiO1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIHdpZHRoOiAxcmVtO1xyXG4gIGhlaWdodDogMXJlbTtcclxuICBib3JkZXI6IDAuMjVyZW0gc29saWQgI2YzZjNmMztcclxuICBib3JkZXItdG9wOiAwLjI1cmVtIHNvbGlkICNmZjZmMDA7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIGFuaW1hdGlvbjogc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuLnNwaW5uZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XHJcbiAgbWFyZ2luLXJpZ2h0OiAwLjI1cmVtO1xyXG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxufVxyXG5cclxuQGtleWZyYW1lcyBzcGluIHtcclxuICAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICB9XHJcbiAgMTAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xyXG4gIH1cclxufVxyXG5cclxuLm1vZGFsLWljb24ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB3aWR0aDogNHJlbTtcclxuICBoZWlnaHQ6IDRyZW07XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XHJcbiAgcGFkZGluZzogMC4zNXJlbTtcclxufVxyXG4ubW9kYWwtaWNvbiBzdmcge1xyXG4gIHdpZHRoOiAzLjZyZW07XHJcbiAgaGVpZ2h0OiAzLjZyZW07XHJcbn1cclxuXHJcbi5jb250YWluZXIgYS5mb290ZXItdGV4dCB7XHJcbiAgLyogbWFyZ2luLXRvcDogMXJlbTsgKi9cclxuICBmb250LXNpemU6IDAuNzVyZW07XHJcbiAgY29sb3I6ICNiYmJiYmI7XHJcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG59XHJcblxyXG4uY29udGFpbmVyIGEuZm9vdGVyLXRleHQ6aG92ZXIge1xyXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG59XHJcblxyXG4uZGlzY29ubmVjdC1idXR0b24ge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjZmMDA7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xyXG4gIHBhZGRpbmc6IDFyZW07XHJcbiAgcGFkZGluZy1ibG9jazogMDtcclxuICBmb250LXNpemU6IDFyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcclxuICBtYXJnaW4tdG9wOiAxcmVtO1xyXG4gIGhlaWdodDogMi41cmVtO1xyXG4gIGJveC1zaGFkb3c6IGhzbGEoMCwgMCUsIDEwMCUsIDAuMTUpIDAgMnB4IDAgaW5zZXQsXHJcbiAgICByZ2JhKDAsIDAsIDAsIDAuMDUpIDAgLTJweCA0cHggaW5zZXQsIHJnYmEoNDYsIDU0LCA4MCwgMC4wNzUpIDAgMXB4IDFweDtcclxufVxyXG5cclxuLmRpc2Nvbm5lY3QtYnV0dG9uOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2M0ZTAyO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmRpc2Nvbm5lY3QtYnV0dG9uOmRpc2FibGVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xyXG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbn1cclxuXHJcbi5saW5raW5nLWJ1dHRvbiB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNmYwMDtcclxuICBjb2xvcjogd2hpdGU7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XHJcbiAgcGFkZGluZzogMXJlbTtcclxuICBwYWRkaW5nLWJsb2NrOiAwO1xyXG4gIGZvbnQtc2l6ZTogMXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xyXG4gIG1hcmdpbi10b3A6IDFyZW07XHJcbiAgaGVpZ2h0OiAyLjVyZW07XHJcbiAgYm94LXNoYWRvdzogaHNsYSgwLCAwJSwgMTAwJSwgMC4xNSkgMCAycHggMCBpbnNldCxcclxuICAgIHJnYmEoMCwgMCwgMCwgMC4wNSkgMCAtMnB4IDRweCBpbnNldCwgcmdiYSg0NiwgNTQsIDgwLCAwLjA3NSkgMCAxcHggMXB4O1xyXG59XHJcblxyXG4ubGlua2luZy1idXR0b246aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNjYzRlMDI7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4ubGlua2luZy1idXR0b246ZGlzYWJsZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XHJcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxufVxyXG5cclxuLnNvY2lhbHMtd3JhcHBlciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGdhcDogMXJlbTtcclxuICBtYXJnaW4tYmxvY2s6IDAuNXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLnNvY2lhbHMtY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZ2FwOiAwLjVyZW07XHJcbiAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciAuY29ubmVjdG9yLWNvbnRhaW5lciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjI1cmVtO1xyXG59XHJcblxyXG4uc29jaWFscy1jb250YWluZXIgLmNvbm5lY3Rvci1idXR0b24ge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjI1cmVtO1xyXG4gIHBhZGRpbmc6IDAuNzVyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcclxuICBmb250LXNpemU6IDAuODc1cmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDIuNXJlbTtcclxufVxyXG5cclxuLnNvY2lhbHMtY29udGFpbmVyIC5jb25uZWN0b3ItYnV0dG9uOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLnNvY2lhbHMtY29udGFpbmVyIC5jb25uZWN0b3ItYnV0dG9uOmRpc2FibGVkIHtcclxuICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxufVxyXG5cclxuLnNvY2lhbHMtY29udGFpbmVyIC5jb25uZWN0b3ItYnV0dG9uIHN2ZyB7XHJcbiAgd2lkdGg6IDEuNXJlbTtcclxuICBoZWlnaHQ6IDEuNXJlbTtcclxuICBjb2xvcjogIzMzMztcclxuICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcclxufVxyXG5cclxuLnNvY2lhbHMtY29udGFpbmVyIC5jb25uZWN0b3ItY29ubmVjdGVkIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC4yNXJlbTtcclxuICBwYWRkaW5nOiAwLjc1cmVtO1xyXG4gIHBhZGRpbmctdG9wOiAwLjVyZW07XHJcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcclxuICBmb250LXNpemU6IDAuODc1cmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxuICBjb2xvcjogIzMzMztcclxuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGZsZXg6IDE7XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciAuY29ubmVjdG9yLWNvbm5lY3RlZCBzdmcge1xyXG4gIHdpZHRoOiAxLjVyZW07XHJcbiAgaGVpZ2h0OiAxLjVyZW07XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XHJcbn1cclxuXHJcbi5zb2NpYWxzLWNvbnRhaW5lciBoMyB7XHJcbiAgY29sb3I6ICMzMzM7XHJcbiAgbWFyZ2luOiAwO1xyXG59XHJcblxyXG4uY29ubmVjdG9yLWJ1dHRvbiAuY29ubmVjdG9yLWNoZWNrbWFyayB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHRvcDogLTAuNXJlbTtcclxuICByaWdodDogLTAuNXJlbTtcclxuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xyXG4gIGhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udW5saW5rLWNvbm5lY3Rvci1idXR0b24ge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICByaWdodDogMC4zNzVyZW07XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcclxuICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTtcclxuICBwYWRkaW5nLXJpZ2h0OiAwLjY3NXJlbTtcclxuICBib3JkZXItcmFkaXVzOiAwLjVyZW07XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM5OTk7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuMjVyZW07XHJcbiAgYm94LXNoYWRvdzogaHNsYSgwLCAwJSwgMTAwJSwgMC4xNSkgMCAycHggMCBpbnNldCxcclxuICAgIHJnYmEoMCwgMCwgMCwgMC4wNSkgMCAtMnB4IDRweCBpbnNldCwgcmdiYSg0NiwgNTQsIDgwLCAwLjA3NSkgMCAxcHggMXB4O1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXM7XHJcbn1cclxuXHJcbi51bmxpbmstY29ubmVjdG9yLWJ1dHRvbiBzdmcge1xyXG4gIHN0cm9rZTogd2hpdGUgIWltcG9ydGFudDtcclxuICB3aWR0aDogMC44NzVyZW0gIWltcG9ydGFudDtcclxuICBoZWlnaHQ6IDAuODc1cmVtICFpbXBvcnRhbnQ7XHJcbiAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi51bmxpbmstY29ubmVjdG9yLWJ1dHRvbjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4ODtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi51bmxpbmstY29ubmVjdG9yLWJ1dHRvbjpkaXNhYmxlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcclxuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIGxvYWRlciB7XHJcbiAgMCUge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDAlKTtcclxuICB9XHJcbiAgNTAlIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcclxuICB9XHJcbiAgMTAwJSB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCUpO1xyXG4gIH1cclxufVxyXG5cclxuLmxvYWRlciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHdpZHRoOiA0cmVtO1xyXG4gIGhlaWdodDogMC40cmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcclxuICBib3JkZXItcmFkaXVzOiAwLjEyNXJlbTtcclxufVxyXG5cclxuLmxvYWRlcjo6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlwiO1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIHdpZHRoOiAycmVtO1xyXG4gIGhlaWdodDogMC40cmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjZmMDA7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGxlZnQ6IDA7XHJcbiAgYW5pbWF0aW9uOiBsb2FkZXIgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcclxuICBib3JkZXItcmFkaXVzOiAwLjEyNXJlbTtcclxufVxyXG5cclxuLm5vLXNvY2lhbHMge1xyXG4gIGNvbG9yOiAjNzc3O1xyXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcclxufVxyXG5cclxuLmRpdmlkZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDAuNXJlbTtcclxuICBtYXJnaW4tdG9wOiAwLjVyZW07XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG59XHJcblxyXG4uZGl2aWRlcjo6YmVmb3JlLFxyXG4uZGl2aWRlcjo6YWZ0ZXIge1xyXG4gIGNvbnRlbnQ6IFwiXCI7XHJcbiAgZmxleDogMTtcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcclxufVxyXG5cclxuaW5wdXQudGlrdG9rLWlucHV0IHtcclxuICBib3JkZXI6IDFweCBzb2xpZCBncmF5O1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XHJcbiAgY29sb3I6IGJsYWNrO1xyXG4gIGZvbnQtZmFtaWx5OiBTYXRvc2hpLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksXHJcbiAgICBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBDYW50YXJlbGwsIE9wZW4gU2FucywgSGVsdmV0aWNhIE5ldWUsIHNhbnMtc2VyaWY7XHJcbiAgZm9udC1zaXplOiAxcmVtO1xyXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgaGVpZ2h0OiAyLjc1cmVtO1xyXG4gIGxpbmUtaGVpZ2h0OiAxLjMzM3JlbTtcclxuICBwYWRkaW5nLWlubGluZTogMXJlbTtcclxuICBtYXJnaW4tdG9wOiAxcmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG5pbnB1dC50aWt0b2staW5wdXQuaW52YWxpZCB7XHJcbiAgYm9yZGVyLWNvbG9yOiAjZGMzNTQ1O1xyXG4gIG91dGxpbmUtY29sb3I6ICNkYzM1NDU7XHJcbn1cclxuXHJcbi5vdHAtaW5wdXQtY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGdhcDogMC41cmVtO1xyXG4gIG1hcmdpbi10b3A6IDFyZW07XHJcbn1cclxuXHJcbi5vdHAtaW5wdXQge1xyXG4gIHdpZHRoOiAycmVtO1xyXG4gIGhlaWdodDogMi41cmVtO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBmb250LXNpemU6IDEuNXJlbTtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcclxuICBvdXRsaW5lOiBub25lO1xyXG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzO1xyXG59XHJcblxyXG4ub3RwLWlucHV0OmZvY3VzIHtcclxuICBib3JkZXItY29sb3I6ICNmZjZmMDA7XHJcbn1cclxuXHJcbi50YWJzIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxuICBtYXJnaW4tYm90dG9tOiBjYWxjKC0wLjVyZW0gLSAxcHgpO1xyXG4gIG1heC13aWR0aDogMTAwJTtcclxuICBvdmVyZmxvdy14OiBhdXRvO1xyXG59XHJcbi50YWJzOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG4udGFiczo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxufVxyXG5cclxuLnRhYi1idXR0b24ge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI2RkZDtcclxuICBwYWRkaW5nOiAwLjVyZW0gMXJlbTtcclxuICBmb250LXNpemU6IDAuODc1cmVtO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XHJcbiAgdGV4dC1hbGlnbjogbGVmdDtcclxuICBjb2xvcjogIzMzMztcclxufVxyXG5cclxuLnRhYi1idXR0b246aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XHJcbn1cclxuXHJcbi5hY3RpdmUtdGFiIHtcclxuICBib3JkZXItcmlnaHQtY29sb3I6ICNmZjZmMDA7XHJcbn1cclxuXHJcbi50YWItY29udGVudCB7XHJcbiAgbWFyZ2luLXRvcDogMC4yNXJlbTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtaW4taGVpZ2h0OiAyMHJlbTtcclxuICBoZWlnaHQ6IDIwcmVtO1xyXG59XHJcblxyXG4udmVydGljYWwtdGFicy1jb250YWluZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBnYXA6IDAuNXJlbTtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4udmVydGljYWwtdGFicyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGdhcDogMC4yNXJlbTtcclxuICBtaW4td2lkdGg6IGZpdC1jb250ZW50ICFpbXBvcnRhbnQ7XHJcbiAgbWFyZ2luLWxlZnQ6IC0xcmVtO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBvdmVyZmxvdy15OiBhdXRvO1xyXG59XHJcblxyXG4udmVydGljYWwtdGFiLWNvbnRlbnQge1xyXG4gIGZsZXg6IDEgMSAwJTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIG1pbi1oZWlnaHQ6IDIycmVtO1xyXG4gIGhlaWdodDogMjJyZW07XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcclxuICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xyXG4gIHBhZGRpbmc6IDFyZW07XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcclxuICBtYXgtd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5pcC10YWItY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZ2FwOiAxcmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMTAwJTtcclxufVxyXG5cclxuLmlwLXRhYi1jb250ZW50IHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZ2FwOiAxcmVtO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG59XHJcblxyXG4uaXAtdGFiLWNvbnRlbnQtdGV4dCB7XHJcbiAgY29sb3I6ICM3Nzc7XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG59XHJcblxyXG4uY29udHJhY3QtYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAxcmVtO1xyXG4gIG1hcmdpbi10b3A6IDFyZW07XHJcbn1cclxuXHJcbi5jb250cmFjdC1pbnB1dCB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgbWF4LXdpZHRoOiAzMDBweDtcclxuICBwYWRkaW5nOiAwLjVyZW07XHJcbiAgZm9udC1zaXplOiAxcmVtO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnM7XHJcbiAgY29sb3I6ICMzMzM7XHJcbn1cclxuXHJcbi5jb250cmFjdC1pbnB1dDpmb2N1cyB7XHJcbiAgYm9yZGVyLWNvbG9yOiAjZmY2ZjAwO1xyXG59XHJcblxyXG4uY29udHJhY3QtYnV0dG9uIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2ZjAwO1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xyXG4gIHBhZGRpbmc6IDAuNzVyZW0gMS41cmVtO1xyXG4gIGZvbnQtc2l6ZTogMXJlbTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzO1xyXG59XHJcblxyXG4uY29udHJhY3QtYnV0dG9uOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2M0ZTAyO1xyXG59XHJcblxyXG4uY29udHJhY3QtYnV0dG9uOmRpc2FibGVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xyXG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XHJcbn1cclxuIl19 */";
|
|
704
1344
|
var styles = {"modal":"auth-module_modal__yyg5L","outer-container":"auth-module_outer-container__RraOQ","container":"auth-module_container__7utns","linking-container":"auth-module_linking-container__mYNwD","origin-tab":"auth-module_origin-tab__miOUK","origin-section":"auth-module_origin-section__UBhBB","origin-container":"auth-module_origin-container__ZIk4c","origin-wrapper":"auth-module_origin-wrapper__JQfEI","origin-label":"auth-module_origin-label__l-1q9","horizontal-divider":"auth-module_horizontal-divider__YfWCy","divider":"auth-module_divider__z65Me","origin-dashboard-button":"auth-module_origin-dashboard-button__-pch4","header":"auth-module_header__pX9nM","auth-header":"auth-module_auth-header__LsM1f","small-modal-icon":"auth-module_small-modal-icon__YayD1","wallet-address":"auth-module_wallet-address__AVVA5","close-button":"auth-module_close-button__uZrho","close-icon":"auth-module_close-icon__SSCni","linking-text":"auth-module_linking-text__uz3ud","provider-list":"auth-module_provider-list__6vISy","big":"auth-module_big__jQxvN","spinner":"auth-module_spinner__hfzlH","spin":"auth-module_spin__tm9l6","modal-icon":"auth-module_modal-icon__CV7ah","footer-text":"auth-module_footer-text__CQnh6","disconnect-button":"auth-module_disconnect-button__bsu-3","linking-button":"auth-module_linking-button__g1GlL","socials-wrapper":"auth-module_socials-wrapper__PshV3","socials-container":"auth-module_socials-container__iDzfJ","connector-container":"auth-module_connector-container__4wn11","connector-button":"auth-module_connector-button__j79HA","connector-connected":"auth-module_connector-connected__JvDQb","connector-checkmark":"auth-module_connector-checkmark__ZS6zU","unlink-connector-button":"auth-module_unlink-connector-button__6Fwkp","loader":"auth-module_loader__gH3ZC","no-socials":"auth-module_no-socials__wEx0t","tiktok-input":"auth-module_tiktok-input__FeqdG","invalid":"auth-module_invalid__qqgK6","otp-input-container":"auth-module_otp-input-container__B2NH6","otp-input":"auth-module_otp-input__vjImt","tabs":"auth-module_tabs__RcUmV","tab-button":"auth-module_tab-button__HT6wc","active-tab":"auth-module_active-tab__l6P44","tab-content":"auth-module_tab-content__noHF0","vertical-tabs-container":"auth-module_vertical-tabs-container__6sAOL","vertical-tabs":"auth-module_vertical-tabs__-ba-W","vertical-tab-content":"auth-module_vertical-tab-content__wTqKF","ip-tab-container":"auth-module_ip-tab-container__ck0F8","ip-tab-content":"auth-module_ip-tab-content__VI4zC","ip-tab-content-text":"auth-module_ip-tab-content-text__y2BRh","contract-button-container":"auth-module_contract-button-container__7HH9n","contract-input":"auth-module_contract-input__4BYcs","contract-button":"auth-module_contract-button__Cq6zI"};
|
|
705
1345
|
styleInject(css_248z$1);
|
|
706
1346
|
|
|
@@ -754,11 +1394,14 @@ const CloseIcon = () => (React.createElement("svg", { className: styles["close-i
|
|
|
754
1394
|
* @returns { HTMLElement } The wrapper element.
|
|
755
1395
|
*/
|
|
756
1396
|
const createWrapperAndAppendToBody = (wrapperId) => {
|
|
1397
|
+
if (typeof document === "undefined")
|
|
1398
|
+
return null;
|
|
757
1399
|
const wrapperElement = document.createElement("div");
|
|
758
1400
|
wrapperElement.setAttribute("id", wrapperId);
|
|
759
1401
|
document.body.appendChild(wrapperElement);
|
|
760
1402
|
return wrapperElement;
|
|
761
1403
|
};
|
|
1404
|
+
const useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
|
|
762
1405
|
/**
|
|
763
1406
|
* The ReactPortal component. Renders children in a portal.
|
|
764
1407
|
* @param { { children: JSX.Element, wrapperId: string } } props The props.
|
|
@@ -766,7 +1409,9 @@ const createWrapperAndAppendToBody = (wrapperId) => {
|
|
|
766
1409
|
*/
|
|
767
1410
|
const ReactPortal = ({ children, wrapperId = "react-portal-wrapper", }) => {
|
|
768
1411
|
const [wrapperElement, setWrapperElement] = useState(null);
|
|
769
|
-
|
|
1412
|
+
useIsomorphicLayoutEffect(() => {
|
|
1413
|
+
if (typeof document === "undefined")
|
|
1414
|
+
return;
|
|
770
1415
|
let element = document.getElementById(wrapperId);
|
|
771
1416
|
let systemCreated = false;
|
|
772
1417
|
if (!element) {
|
|
@@ -868,8 +1513,9 @@ const ToastProvider = ({ children }) => {
|
|
|
868
1513
|
};
|
|
869
1514
|
return (React.createElement(ToastContext.Provider, { value: { addToast } },
|
|
870
1515
|
children,
|
|
871
|
-
React.createElement(
|
|
872
|
-
React.createElement(
|
|
1516
|
+
React.createElement(ClientOnly, null,
|
|
1517
|
+
React.createElement(ReactPortal, { wrapperId: "toast-wrapper" },
|
|
1518
|
+
React.createElement("div", { className: styles$2["toast-container"], onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }, toasts.map((toast) => (React.createElement("div", { key: toast.id, className: `${styles$2.toast} ${styles$2[`toast-${toast.type}`]} ${toast.isVisible ? styles$2["toast-enter"] : styles$2["toast-exit"]}`, onClick: () => removeToast(toast.id) }, toast.message))))))));
|
|
873
1519
|
};
|
|
874
1520
|
const useToast = () => {
|
|
875
1521
|
const context = React.useContext(ToastContext);
|
|
@@ -886,16 +1532,16 @@ const OriginContext = createContext({
|
|
|
886
1532
|
const OriginProvider = ({ children }) => {
|
|
887
1533
|
const { authenticated } = useAuthState();
|
|
888
1534
|
const { auth } = useContext(CampContext);
|
|
889
|
-
if (!auth) {
|
|
1535
|
+
if (!auth && typeof window !== "undefined") {
|
|
890
1536
|
throw new Error("Auth instance is not available");
|
|
891
1537
|
}
|
|
892
1538
|
const statsQuery = useQuery({
|
|
893
1539
|
queryKey: ["origin-stats", authenticated],
|
|
894
|
-
queryFn: () => { var _a, _b; return (_b = (_a = auth.origin) === null || _a === void 0 ? void 0 : _a.getOriginUsage()) !== null && _b !== void 0 ? _b : Promise.resolve(null); },
|
|
1540
|
+
queryFn: () => { var _a, _b; return (_b = (_a = auth === null || auth === void 0 ? void 0 : auth.origin) === null || _a === void 0 ? void 0 : _a.getOriginUsage()) !== null && _b !== void 0 ? _b : Promise.resolve(null); },
|
|
895
1541
|
});
|
|
896
1542
|
const uploadsQuery = useQuery({
|
|
897
1543
|
queryKey: ["origin-uploads", authenticated],
|
|
898
|
-
queryFn: () => { var _a, _b; return (_b = (_a = auth.origin) === null || _a === void 0 ? void 0 : _a.getOriginUploads()) !== null && _b !== void 0 ? _b : Promise.resolve(null); },
|
|
1544
|
+
queryFn: () => { var _a, _b; return (_b = (_a = auth === null || auth === void 0 ? void 0 : auth.origin) === null || _a === void 0 ? void 0 : _a.getOriginUploads()) !== null && _b !== void 0 ? _b : Promise.resolve(null); },
|
|
899
1545
|
});
|
|
900
1546
|
return (React.createElement(OriginContext.Provider, { value: {
|
|
901
1547
|
statsQuery: statsQuery,
|
|
@@ -922,31 +1568,33 @@ const CampContext = createContext({
|
|
|
922
1568
|
*/
|
|
923
1569
|
const CampProvider = ({ clientId, redirectUri, children, allowAnalytics = true, }) => {
|
|
924
1570
|
const isServer = typeof window === "undefined";
|
|
925
|
-
const ackeeInstance =
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
const [
|
|
1571
|
+
// const ackeeInstance =
|
|
1572
|
+
// allowAnalytics && !isServer
|
|
1573
|
+
// ? Ackee.create(constants.ACKEE_INSTANCE, {
|
|
1574
|
+
// detailed: false,
|
|
1575
|
+
// ignoreLocalhost: true,
|
|
1576
|
+
// ignoreOwnVisits: false,
|
|
1577
|
+
// })
|
|
1578
|
+
// : null;
|
|
1579
|
+
// const [ackee, setAckee] = useState(ackeeInstance);
|
|
1580
|
+
const [auth, setAuth] = useState(!isServer ? new Auth({
|
|
934
1581
|
clientId,
|
|
935
1582
|
redirectUri: redirectUri
|
|
936
1583
|
? redirectUri
|
|
937
1584
|
: !isServer
|
|
938
1585
|
? window.location.href
|
|
939
1586
|
: "",
|
|
940
|
-
ackeeInstance,
|
|
941
|
-
}));
|
|
942
|
-
const wagmiContext = useContext(WagmiContext);
|
|
1587
|
+
// ackeeInstance,
|
|
1588
|
+
}) : null);
|
|
1589
|
+
// const wagmiContext = useContext(WagmiContext);
|
|
1590
|
+
const wagmiContext = typeof window !== "undefined" ? useContext(WagmiContext) : undefined;
|
|
943
1591
|
return (React.createElement(CampContext.Provider, { value: {
|
|
944
1592
|
clientId,
|
|
945
1593
|
auth,
|
|
946
1594
|
setAuth,
|
|
947
1595
|
wagmiAvailable: wagmiContext !== undefined,
|
|
948
|
-
ackee,
|
|
949
|
-
setAckee,
|
|
1596
|
+
ackee: null,
|
|
1597
|
+
setAckee: () => { },
|
|
950
1598
|
} },
|
|
951
1599
|
React.createElement(SocialsProvider, null,
|
|
952
1600
|
React.createElement(OriginProvider, null,
|
|
@@ -955,6 +1603,7 @@ const CampProvider = ({ clientId, redirectUri, children, allowAnalytics = true,
|
|
|
955
1603
|
};
|
|
956
1604
|
|
|
957
1605
|
const getWalletConnectProvider = (projectId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1606
|
+
const { EthereumProvider } = yield import('@walletconnect/ethereum-provider');
|
|
958
1607
|
const provider = yield EthereumProvider.init({
|
|
959
1608
|
optionalChains: [testnet.id],
|
|
960
1609
|
chains: [testnet.id],
|
|
@@ -2143,6 +2792,7 @@ const TextTab = () => {
|
|
|
2143
2792
|
React.createElement(GoToOriginDashboard, { text: "Manage on Origin Dashboard" })));
|
|
2144
2793
|
};
|
|
2145
2794
|
|
|
2795
|
+
const isBrowser = typeof window !== "undefined";
|
|
2146
2796
|
const getAuthProperties = (auth) => {
|
|
2147
2797
|
const prototype = Object.getPrototypeOf(auth);
|
|
2148
2798
|
const properties = Object.getOwnPropertyNames(prototype);
|
|
@@ -2170,6 +2820,9 @@ const getAuthVariables = (auth) => {
|
|
|
2170
2820
|
* auth.connect();
|
|
2171
2821
|
*/
|
|
2172
2822
|
const useAuth = () => {
|
|
2823
|
+
if (!isBrowser) {
|
|
2824
|
+
return {};
|
|
2825
|
+
}
|
|
2173
2826
|
const { auth } = useContext(CampContext);
|
|
2174
2827
|
if (!auth) {
|
|
2175
2828
|
throw new Error("Auth instance is not available. Make sure to wrap your component with CampProvider.");
|
|
@@ -2181,6 +2834,9 @@ const useAuth = () => {
|
|
|
2181
2834
|
setAuthProperties(getAuthProperties(auth));
|
|
2182
2835
|
};
|
|
2183
2836
|
useEffect(() => {
|
|
2837
|
+
if (!isBrowser) {
|
|
2838
|
+
return;
|
|
2839
|
+
}
|
|
2184
2840
|
auth.on("state", updateAuth);
|
|
2185
2841
|
auth.on("provider", updateAuth);
|
|
2186
2842
|
}, [auth]);
|
|
@@ -2216,18 +2872,26 @@ const useLinkSocials = () => {
|
|
|
2216
2872
|
*/
|
|
2217
2873
|
const useProvider = () => {
|
|
2218
2874
|
var _a, _b, _c;
|
|
2875
|
+
if (!isBrowser) {
|
|
2876
|
+
return {
|
|
2877
|
+
provider: { provider: null, info: { name: "" } },
|
|
2878
|
+
setProvider: () => { },
|
|
2879
|
+
};
|
|
2880
|
+
}
|
|
2219
2881
|
const { auth } = useContext(CampContext);
|
|
2220
2882
|
if (!auth) {
|
|
2221
2883
|
throw new Error("Auth instance is not available. Make sure to wrap your component with CampProvider.");
|
|
2222
2884
|
}
|
|
2223
2885
|
const [provider, setProvider] = useState({
|
|
2224
|
-
provider: (_a = auth.viem) === null || _a === void 0 ? void 0 : _a.transport,
|
|
2225
|
-
info: { name: (_c = (_b = auth.viem) === null || _b === void 0 ? void 0 : _b.transport) === null || _c === void 0 ? void 0 : _c.name },
|
|
2886
|
+
provider: isBrowser ? (_a = auth.viem) === null || _a === void 0 ? void 0 : _a.transport : null,
|
|
2887
|
+
info: { name: isBrowser ? (_c = (_b = auth.viem) === null || _b === void 0 ? void 0 : _b.transport) === null || _c === void 0 ? void 0 : _c.name : "" },
|
|
2226
2888
|
});
|
|
2227
2889
|
useEffect(() => {
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2890
|
+
if (isBrowser) {
|
|
2891
|
+
auth.on("provider", ({ provider, info }) => {
|
|
2892
|
+
setProvider({ provider, info });
|
|
2893
|
+
});
|
|
2894
|
+
}
|
|
2231
2895
|
}, [auth]);
|
|
2232
2896
|
const authSetProvider = auth.setProvider.bind(auth);
|
|
2233
2897
|
return { provider, setProvider: authSetProvider };
|
|
@@ -2237,6 +2901,9 @@ const useProvider = () => {
|
|
|
2237
2901
|
* @returns { { authenticated: boolean, loading: boolean } } The authenticated state and loading state.
|
|
2238
2902
|
*/
|
|
2239
2903
|
const useAuthState = () => {
|
|
2904
|
+
if (!isBrowser) {
|
|
2905
|
+
return { authenticated: false, loading: false };
|
|
2906
|
+
}
|
|
2240
2907
|
const { auth } = useContext(CampContext);
|
|
2241
2908
|
if (!auth) {
|
|
2242
2909
|
throw new Error("Auth instance is not available. Make sure to wrap your component with CampProvider.");
|
|
@@ -2253,6 +2920,9 @@ const useAuthState = () => {
|
|
|
2253
2920
|
return { authenticated, loading };
|
|
2254
2921
|
};
|
|
2255
2922
|
const useViem = () => {
|
|
2923
|
+
if (!isBrowser) {
|
|
2924
|
+
return { client: null };
|
|
2925
|
+
}
|
|
2256
2926
|
const { auth } = useContext(CampContext);
|
|
2257
2927
|
const [client, setClient] = useState(null);
|
|
2258
2928
|
useEffect(() => {
|
|
@@ -2273,6 +2943,12 @@ const useViem = () => {
|
|
|
2273
2943
|
* @returns { { connect: function, disconnect: function } } The connect and disconnect functions.
|
|
2274
2944
|
*/
|
|
2275
2945
|
const useConnect = () => {
|
|
2946
|
+
if (!isBrowser) {
|
|
2947
|
+
return {
|
|
2948
|
+
connect: () => Promise.resolve({ success: false, message: "", walletAddress: "" }),
|
|
2949
|
+
disconnect: () => Promise.resolve(),
|
|
2950
|
+
};
|
|
2951
|
+
}
|
|
2276
2952
|
const { auth } = useContext(CampContext);
|
|
2277
2953
|
if (!auth) {
|
|
2278
2954
|
throw new Error("Auth instance is not available. Make sure to wrap your component with CampProvider.");
|
|
@@ -2285,7 +2961,12 @@ const useConnect = () => {
|
|
|
2285
2961
|
* Returns the array of providers.
|
|
2286
2962
|
* @returns { Array } The array of providers and the loading state.
|
|
2287
2963
|
*/
|
|
2288
|
-
const useProviders = () =>
|
|
2964
|
+
const useProviders = () => {
|
|
2965
|
+
if (!isBrowser) {
|
|
2966
|
+
return [];
|
|
2967
|
+
}
|
|
2968
|
+
return useSyncExternalStore(providerStore.subscribe, providerStore.value, providerStore.value);
|
|
2969
|
+
};
|
|
2289
2970
|
/**
|
|
2290
2971
|
* Returns the modal state and functions to open and close the modal.
|
|
2291
2972
|
* @returns { { isOpen: boolean, openModal: function, closeModal: function } } The modal state and functions to open and close the modal.
|