keeperboard 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,935 +1 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- Cache: () => Cache,
24
- KeeperBoardClient: () => KeeperBoardClient,
25
- KeeperBoardError: () => KeeperBoardError,
26
- KeeperBoardSession: () => KeeperBoardSession,
27
- PlayerIdentity: () => PlayerIdentity,
28
- RetryQueue: () => RetryQueue,
29
- generatePlayerName: () => generatePlayerName,
30
- validateName: () => validateName
31
- });
32
- module.exports = __toCommonJS(index_exports);
33
-
34
- // src/types.ts
35
- var KeeperBoardError = class extends Error {
36
- constructor(message, code, statusCode) {
37
- super(message);
38
- this.code = code;
39
- this.statusCode = statusCode;
40
- this.name = "KeeperBoardError";
41
- }
42
- };
43
-
44
- // src/KeeperBoardClient.ts
45
- var _KeeperBoardClient = class _KeeperBoardClient {
46
- constructor(config) {
47
- const url = config.apiUrl ?? _KeeperBoardClient.DEFAULT_API_URL;
48
- this.apiUrl = url.replace(/\/$/, "");
49
- this.apiKey = config.apiKey;
50
- this.defaultLeaderboard = config.defaultLeaderboard;
51
- }
52
- // ============================================
53
- // SCORE SUBMISSION
54
- // ============================================
55
- /**
56
- * Submit a score. Only updates if the new score is higher than the existing one.
57
- *
58
- * @example
59
- * const result = await client.submitScore({
60
- * playerGuid: 'abc-123',
61
- * playerName: 'ACE',
62
- * score: 1500,
63
- * });
64
- * console.log(result.rank, result.isNewHighScore);
65
- */
66
- async submitScore(options) {
67
- const leaderboard = options.leaderboard ?? this.defaultLeaderboard;
68
- const params = new URLSearchParams();
69
- if (leaderboard) params.set("leaderboard", leaderboard);
70
- const url = `${this.apiUrl}/api/v1/scores${params.toString() ? "?" + params.toString() : ""}`;
71
- const body = {
72
- player_guid: options.playerGuid,
73
- player_name: options.playerName,
74
- score: options.score,
75
- ...options.metadata && { metadata: options.metadata }
76
- };
77
- const raw = await this.request(url, {
78
- method: "POST",
79
- body: JSON.stringify(body)
80
- });
81
- return this.mapScoreResponse(raw);
82
- }
83
- // ============================================
84
- // LEADERBOARD
85
- // ============================================
86
- /**
87
- * Get a leaderboard. Supports pagination and version-based lookups for
88
- * time-based boards.
89
- *
90
- * @example
91
- * // Top 10 on default board
92
- * const lb = await client.getLeaderboard();
93
- *
94
- * // Top 25 on a specific board
95
- * const lb = await client.getLeaderboard({ leaderboard: 'Weekly', limit: 25 });
96
- *
97
- * // Historical version
98
- * const lb = await client.getLeaderboard({ leaderboard: 'Weekly', version: 3 });
99
- */
100
- async getLeaderboard(options) {
101
- const leaderboard = options?.leaderboard ?? this.defaultLeaderboard;
102
- const limit = options?.limit ?? 10;
103
- const offset = options?.offset ?? 0;
104
- const params = new URLSearchParams();
105
- params.set("limit", String(Math.min(limit, 100)));
106
- params.set("offset", String(offset));
107
- if (leaderboard) params.set("leaderboard", leaderboard);
108
- if (options?.version !== void 0) params.set("version", String(options.version));
109
- const url = `${this.apiUrl}/api/v1/leaderboard?${params.toString()}`;
110
- const raw = await this.request(url, { method: "GET" });
111
- return this.mapLeaderboardResponse(raw);
112
- }
113
- // ============================================
114
- // PLAYER
115
- // ============================================
116
- /**
117
- * Get a player's rank and score. Returns `null` if the player has no score.
118
- *
119
- * @example
120
- * const player = await client.getPlayerRank({ playerGuid: 'abc-123' });
121
- * if (player) console.log(`Rank #${player.rank}`);
122
- */
123
- async getPlayerRank(options) {
124
- const leaderboard = options.leaderboard ?? this.defaultLeaderboard;
125
- const params = new URLSearchParams();
126
- if (leaderboard) params.set("leaderboard", leaderboard);
127
- const url = `${this.apiUrl}/api/v1/player/${encodeURIComponent(options.playerGuid)}${params.toString() ? "?" + params.toString() : ""}`;
128
- try {
129
- const raw = await this.request(url, { method: "GET" });
130
- return this.mapPlayerResponse(raw);
131
- } catch (error) {
132
- if (error instanceof KeeperBoardError && error.code === "NOT_FOUND") {
133
- return null;
134
- }
135
- throw error;
136
- }
137
- }
138
- /**
139
- * Update a player's display name.
140
- *
141
- * @example
142
- * const player = await client.updatePlayerName({
143
- * playerGuid: 'abc-123',
144
- * newName: 'MAVERICK',
145
- * });
146
- */
147
- async updatePlayerName(options) {
148
- const leaderboard = options.leaderboard ?? this.defaultLeaderboard;
149
- const params = new URLSearchParams();
150
- if (leaderboard) params.set("leaderboard", leaderboard);
151
- const url = `${this.apiUrl}/api/v1/player/${encodeURIComponent(options.playerGuid)}${params.toString() ? "?" + params.toString() : ""}`;
152
- const raw = await this.request(url, {
153
- method: "PUT",
154
- body: JSON.stringify({ player_name: options.newName })
155
- });
156
- return this.mapPlayerResponse(raw);
157
- }
158
- // ============================================
159
- // CLAIM (for migrated scores)
160
- // ============================================
161
- /**
162
- * Claim a migrated score by matching player name.
163
- * Used when scores were imported without player GUIDs.
164
- */
165
- async claimScore(options) {
166
- const leaderboard = options.leaderboard ?? this.defaultLeaderboard;
167
- const params = new URLSearchParams();
168
- if (leaderboard) params.set("leaderboard", leaderboard);
169
- const url = `${this.apiUrl}/api/v1/claim${params.toString() ? "?" + params.toString() : ""}`;
170
- const raw = await this.request(url, {
171
- method: "POST",
172
- body: JSON.stringify({
173
- player_guid: options.playerGuid,
174
- player_name: options.playerName
175
- })
176
- });
177
- return this.mapClaimResponse(raw);
178
- }
179
- // ============================================
180
- // HEALTH CHECK
181
- // ============================================
182
- /**
183
- * Check if the API is healthy. Does not require an API key.
184
- */
185
- async healthCheck() {
186
- const url = `${this.apiUrl}/api/v1/health`;
187
- const response = await fetch(url, {
188
- method: "GET",
189
- headers: { Accept: "application/json" }
190
- });
191
- const json = await response.json();
192
- if (!json.success) {
193
- throw new KeeperBoardError(json.error, json.code, response.status);
194
- }
195
- return json.data;
196
- }
197
- // ============================================
198
- // RESPONSE MAPPERS (snake_case → camelCase)
199
- // ============================================
200
- mapScoreResponse(raw) {
201
- return {
202
- id: raw.id,
203
- playerGuid: raw.player_guid,
204
- playerName: raw.player_name,
205
- score: raw.score,
206
- rank: raw.rank,
207
- isNewHighScore: raw.is_new_high_score
208
- };
209
- }
210
- mapLeaderboardResponse(raw) {
211
- return {
212
- entries: raw.entries.map((e) => ({
213
- rank: e.rank,
214
- playerGuid: e.player_guid,
215
- playerName: e.player_name,
216
- score: e.score
217
- })),
218
- totalCount: raw.total_count,
219
- resetSchedule: raw.reset_schedule,
220
- version: raw.version,
221
- oldestVersion: raw.oldest_version,
222
- nextReset: raw.next_reset
223
- };
224
- }
225
- mapPlayerResponse(raw) {
226
- return {
227
- id: raw.id,
228
- playerGuid: raw.player_guid,
229
- playerName: raw.player_name,
230
- score: raw.score,
231
- rank: raw.rank
232
- };
233
- }
234
- mapClaimResponse(raw) {
235
- return {
236
- claimed: raw.claimed,
237
- score: raw.score,
238
- rank: raw.rank,
239
- playerName: raw.player_name
240
- };
241
- }
242
- // ============================================
243
- // INTERNAL
244
- // ============================================
245
- async request(url, options) {
246
- const headers = {
247
- "Content-Type": "application/json",
248
- Accept: "application/json",
249
- "X-API-Key": this.apiKey
250
- };
251
- const response = await fetch(url, {
252
- ...options,
253
- headers: { ...headers, ...options.headers || {} }
254
- });
255
- const json = await response.json();
256
- if (!json.success) {
257
- throw new KeeperBoardError(json.error, json.code, response.status);
258
- }
259
- return json.data;
260
- }
261
- };
262
- _KeeperBoardClient.DEFAULT_API_URL = "https://keeperboard.vercel.app";
263
- var KeeperBoardClient = _KeeperBoardClient;
264
-
265
- // src/nameGenerator.ts
266
- var MAX_BASE_LENGTH = 10;
267
- var ADJECTIVES = [
268
- "Arcane",
269
- "Astro",
270
- "Blazing",
271
- "Bouncy",
272
- "Brassy",
273
- "Brisk",
274
- "Bubbly",
275
- "Chaotic",
276
- "Cheeky",
277
- "Chill",
278
- "Chunky",
279
- "Cloaked",
280
- "Cosmic",
281
- "Crimson",
282
- "Crispy",
283
- "Dashing",
284
- "Dizzy",
285
- "Dynamic",
286
- "Electric",
287
- "Epic",
288
- "Feisty",
289
- "Fiery",
290
- "Flashy",
291
- "Frosty",
292
- "Funky",
293
- "Furious",
294
- "Galactic",
295
- "Glitchy",
296
- "Golden",
297
- "Goofy",
298
- "Gritty",
299
- "Groovy",
300
- "Hyper",
301
- "Icy",
302
- "Inky",
303
- "Jazzy",
304
- "Jolly",
305
- "Jumpy",
306
- "Laser",
307
- "Legendary",
308
- "Loud",
309
- "Lucky",
310
- "Lunar",
311
- "Madcap",
312
- "Magic",
313
- "Majestic",
314
- "Meteor",
315
- "Mighty",
316
- "Minty",
317
- "Mystic",
318
- "Neon",
319
- "Nimble",
320
- "Nova",
321
- "Nuclear",
322
- "Omega",
323
- "Orbital",
324
- "Peppy",
325
- "Phantom",
326
- "Pixel",
327
- "Plasma",
328
- "Polished",
329
- "Primal",
330
- "Quantum",
331
- "Quick",
332
- "Radiant",
333
- "Rampaging",
334
- "Razor",
335
- "Rebel",
336
- "Retro",
337
- "Rogue",
338
- "Rowdy",
339
- "Savage",
340
- "Shadow",
341
- "Shiny",
342
- "Silly",
343
- "Sketchy",
344
- "Skybound",
345
- "Slick",
346
- "Snappy",
347
- "Solar",
348
- "Sonic",
349
- "Sparky",
350
- "Speedy",
351
- "Spiky",
352
- "Starry",
353
- "Stealthy",
354
- "Stormy",
355
- "Supreme",
356
- "Swift",
357
- "Thunder",
358
- "Turbo",
359
- "Twilight",
360
- "Ultra",
361
- "Vibrant",
362
- "Warped",
363
- "Wicked",
364
- "Wild",
365
- "Wizard",
366
- "Zappy",
367
- "Zesty"
368
- ];
369
- var NOUNS = [
370
- "Aardvark",
371
- "Asteroid",
372
- "Badger",
373
- "Bandit",
374
- "Banshee",
375
- "Beacon",
376
- "Beetle",
377
- "Blaster",
378
- "Blob",
379
- "Boomer",
380
- "Bot",
381
- "Brawler",
382
- "Buccaneer",
383
- "Buffalo",
384
- "Cannon",
385
- "Captain",
386
- "Caribou",
387
- "Charger",
388
- "Cheetah",
389
- "Chimera",
390
- "Cobra",
391
- "Comet",
392
- "Cosmonaut",
393
- "Cougar",
394
- "Coyote",
395
- "Cyborg",
396
- "Dagger",
397
- "Defender",
398
- "Dino",
399
- "Dragon",
400
- "Drifter",
401
- "Drone",
402
- "Duck",
403
- "Eagle",
404
- "Eel",
405
- "Falcon",
406
- "Ferret",
407
- "Fireball",
408
- "Fox",
409
- "Fury",
410
- "Gazelle",
411
- "Ghost",
412
- "Gizmo",
413
- "Gladiator",
414
- "Goblin",
415
- "Griffin",
416
- "Hammer",
417
- "Hawk",
418
- "Hero",
419
- "Hydra",
420
- "Iguana",
421
- "Jaguar",
422
- "Jester",
423
- "Jetpack",
424
- "Jinx",
425
- "Kangaroo",
426
- "Katana",
427
- "Kraken",
428
- "Lancer",
429
- "Laser",
430
- "Legend",
431
- "Lemur",
432
- "Leopard",
433
- "Lion",
434
- "Luchador",
435
- "Lynx",
436
- "Maverick",
437
- "Meteor",
438
- "Monkey",
439
- "Monsoon",
440
- "Moose",
441
- "Ninja",
442
- "Nova",
443
- "Octopus",
444
- "Oracle",
445
- "Otter",
446
- "Panther",
447
- "Phoenix",
448
- "Pirate",
449
- "Pixel",
450
- "Puma",
451
- "Quasar",
452
- "Racer",
453
- "Raptor",
454
- "Raven",
455
- "Reactor",
456
- "Rocket",
457
- "Ronin",
458
- "Saber",
459
- "Scorpion",
460
- "Shark",
461
- "Spartan",
462
- "Sphinx",
463
- "Sprinter",
464
- "Stallion",
465
- "Tiger",
466
- "Titan",
467
- "Viking",
468
- "Viper",
469
- "Wizard"
470
- ];
471
- function generatePlayerName() {
472
- const adjective = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)];
473
- const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)];
474
- const number = Math.floor(Math.random() * 99) + 1;
475
- const base = (adjective + noun).slice(0, MAX_BASE_LENGTH);
476
- return `${base}${number}`;
477
- }
478
-
479
- // src/PlayerIdentity.ts
480
- var DEFAULT_KEY_PREFIX = "keeperboard_";
481
- var PlayerIdentity = class {
482
- constructor(config = {}) {
483
- this.keyPrefix = config.keyPrefix ?? DEFAULT_KEY_PREFIX;
484
- this.guidKey = `${this.keyPrefix}player_guid`;
485
- this.nameKey = `${this.keyPrefix}player_name`;
486
- this.nameAutoKey = `${this.keyPrefix}player_name_auto`;
487
- }
488
- /**
489
- * Get the stored player GUID, or null if none exists.
490
- */
491
- getPlayerGuid() {
492
- if (typeof window === "undefined" || !window.localStorage) {
493
- return null;
494
- }
495
- return localStorage.getItem(this.guidKey);
496
- }
497
- /**
498
- * Set the player GUID in localStorage.
499
- */
500
- setPlayerGuid(guid) {
501
- if (typeof window === "undefined" || !window.localStorage) {
502
- return;
503
- }
504
- localStorage.setItem(this.guidKey, guid);
505
- }
506
- /**
507
- * Get the stored player GUID, creating one if it doesn't exist.
508
- * Uses crypto.randomUUID() for generating new GUIDs.
509
- */
510
- getOrCreatePlayerGuid() {
511
- let guid = this.getPlayerGuid();
512
- if (!guid) {
513
- guid = this.generateUUID();
514
- this.setPlayerGuid(guid);
515
- }
516
- return guid;
517
- }
518
- /**
519
- * Get the stored player name, or null if none exists.
520
- */
521
- getPlayerName() {
522
- if (typeof window === "undefined" || !window.localStorage) {
523
- return null;
524
- }
525
- return localStorage.getItem(this.nameKey);
526
- }
527
- /**
528
- * Set the player name in localStorage.
529
- */
530
- setPlayerName(name) {
531
- if (typeof window === "undefined" || !window.localStorage) {
532
- return;
533
- }
534
- localStorage.setItem(this.nameKey, name);
535
- localStorage.removeItem(this.nameAutoKey);
536
- }
537
- /**
538
- * Get the stored player name, creating an auto-generated one if it doesn't exist.
539
- * Uses AdjectiveNounNumber pattern (e.g., ArcaneBlob99).
540
- */
541
- getOrCreatePlayerName() {
542
- let name = this.getPlayerName();
543
- if (!name) {
544
- name = generatePlayerName();
545
- if (typeof window !== "undefined" && window.localStorage) {
546
- localStorage.setItem(this.nameKey, name);
547
- localStorage.setItem(this.nameAutoKey, "true");
548
- }
549
- }
550
- return name;
551
- }
552
- /**
553
- * Check if the current player name was auto-generated (vs explicitly set by user).
554
- */
555
- isAutoGeneratedName() {
556
- if (typeof window === "undefined" || !window.localStorage) {
557
- return false;
558
- }
559
- return localStorage.getItem(this.nameAutoKey) === "true";
560
- }
561
- /**
562
- * Clear all stored player identity data.
563
- */
564
- clear() {
565
- if (typeof window === "undefined" || !window.localStorage) {
566
- return;
567
- }
568
- localStorage.removeItem(this.guidKey);
569
- localStorage.removeItem(this.nameKey);
570
- localStorage.removeItem(this.nameAutoKey);
571
- }
572
- /**
573
- * Check if player identity is stored.
574
- */
575
- hasIdentity() {
576
- return this.getPlayerGuid() !== null;
577
- }
578
- /**
579
- * Generate a UUID v4.
580
- * Uses crypto.randomUUID() if available, otherwise falls back to a manual implementation.
581
- */
582
- generateUUID() {
583
- if (typeof crypto !== "undefined" && crypto.randomUUID) {
584
- return crypto.randomUUID();
585
- }
586
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
587
- const r = Math.random() * 16 | 0;
588
- const v = c === "x" ? r : r & 3 | 8;
589
- return v.toString(16);
590
- });
591
- }
592
- };
593
-
594
- // src/Cache.ts
595
- var Cache = class {
596
- constructor(ttlMs) {
597
- this.fetchedAt = 0;
598
- this.inflight = null;
599
- this.pendingRefresh = null;
600
- this.ttlMs = ttlMs;
601
- }
602
- /**
603
- * Get cached value if fresh, otherwise fetch via the provided function.
604
- * Deduplicates concurrent calls — only one fetch runs at a time.
605
- */
606
- async getOrFetch(fetchFn) {
607
- if (this.isFresh()) {
608
- return this.data;
609
- }
610
- if (this.inflight) {
611
- return this.inflight;
612
- }
613
- this.inflight = fetchFn().then((result) => {
614
- this.data = result;
615
- this.fetchedAt = Date.now();
616
- this.inflight = null;
617
- return result;
618
- }).catch((err) => {
619
- this.inflight = null;
620
- throw err;
621
- });
622
- return this.inflight;
623
- }
624
- /**
625
- * Trigger a background refresh without awaiting the result.
626
- * Returns immediately. If a fetch is already in flight, schedules
627
- * the refresh to run after the current one completes.
628
- */
629
- refreshInBackground(fetchFn) {
630
- if (this.inflight) {
631
- this.pendingRefresh = fetchFn;
632
- return;
633
- }
634
- this.startBackgroundFetch(fetchFn);
635
- }
636
- startBackgroundFetch(fetchFn) {
637
- this.inflight = fetchFn().then((result) => {
638
- this.data = result;
639
- this.fetchedAt = Date.now();
640
- this.inflight = null;
641
- if (this.pendingRefresh) {
642
- const pending = this.pendingRefresh;
643
- this.pendingRefresh = null;
644
- this.startBackgroundFetch(pending);
645
- }
646
- return result;
647
- }).catch((err) => {
648
- this.inflight = null;
649
- this.pendingRefresh = null;
650
- throw err;
651
- });
652
- this.inflight.catch(() => {
653
- });
654
- }
655
- /** Invalidate the cache, forcing the next getOrFetch to re-fetch. */
656
- invalidate() {
657
- this.fetchedAt = 0;
658
- }
659
- /** Get the cached value without fetching. Returns undefined if empty or stale. */
660
- get() {
661
- return this.isFresh() ? this.data : void 0;
662
- }
663
- /** Get the cached value even if stale. Returns undefined only if never fetched. */
664
- getStale() {
665
- return this.data;
666
- }
667
- /** Check if the cache has fresh (non-expired) data. */
668
- isFresh() {
669
- return this.data !== void 0 && Date.now() - this.fetchedAt < this.ttlMs;
670
- }
671
- };
672
-
673
- // src/RetryQueue.ts
674
- var DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1e3;
675
- var RetryQueue = class {
676
- constructor(storageKey, maxAgeMs = DEFAULT_MAX_AGE_MS) {
677
- this.storageKey = storageKey;
678
- this.maxAgeMs = maxAgeMs;
679
- }
680
- /** Save a failed score for later retry. */
681
- save(score, metadata) {
682
- try {
683
- const pending = { score, metadata, timestamp: Date.now() };
684
- localStorage.setItem(this.storageKey, JSON.stringify(pending));
685
- } catch {
686
- }
687
- }
688
- /**
689
- * Get the pending score, or null if none exists or it has expired.
690
- * Automatically clears expired entries.
691
- */
692
- get() {
693
- try {
694
- const raw = localStorage.getItem(this.storageKey);
695
- if (!raw) return null;
696
- const pending = JSON.parse(raw);
697
- if (Date.now() - pending.timestamp > this.maxAgeMs) {
698
- this.clear();
699
- return null;
700
- }
701
- return { score: pending.score, metadata: pending.metadata };
702
- } catch {
703
- return null;
704
- }
705
- }
706
- /** Check if there's a pending score. */
707
- hasPending() {
708
- return this.get() !== null;
709
- }
710
- /** Clear the pending score. */
711
- clear() {
712
- try {
713
- localStorage.removeItem(this.storageKey);
714
- } catch {
715
- }
716
- }
717
- };
718
-
719
- // src/validation.ts
720
- var DEFAULTS = {
721
- minLength: 2,
722
- maxLength: 12,
723
- allowedPattern: /[^A-Za-z0-9_]/g
724
- };
725
- function validateName(input, options) {
726
- const opts = { ...DEFAULTS, ...options };
727
- let name = input.trim();
728
- const pattern = options?.allowedPattern ?? /[^A-Za-z0-9_]/g;
729
- name = name.replace(pattern, "");
730
- name = name.substring(0, opts.maxLength);
731
- if (name.length < opts.minLength) {
732
- return null;
733
- }
734
- return name;
735
- }
736
-
737
- // src/KeeperBoardSession.ts
738
- var KeeperBoardSession = class {
739
- constructor(config) {
740
- this.cachedLimit = 0;
741
- // Track the limit used for cached data
742
- this.isSubmitting = false;
743
- this.client = new KeeperBoardClient({
744
- apiKey: config.apiKey,
745
- defaultLeaderboard: config.leaderboard,
746
- apiUrl: config.apiUrl
747
- });
748
- this.identity = new PlayerIdentity(config.identity);
749
- this.leaderboard = config.leaderboard;
750
- this.cache = config.cache ? new Cache(config.cache.ttlMs) : null;
751
- this.retryQueue = config.retry ? new RetryQueue(
752
- `keeperboard_retry_${config.leaderboard}`,
753
- config.retry.maxAgeMs
754
- ) : null;
755
- }
756
- // ============================================
757
- // IDENTITY
758
- // ============================================
759
- /** Get or create a persistent player GUID. */
760
- getPlayerGuid() {
761
- return this.identity.getOrCreatePlayerGuid();
762
- }
763
- /** Get the stored player name, auto-generating one if none exists. */
764
- getPlayerName() {
765
- return this.identity.getOrCreatePlayerName();
766
- }
767
- /** Store a player name locally. Does NOT update the server — call updatePlayerName() for that. */
768
- setPlayerName(name) {
769
- this.identity.setPlayerName(name);
770
- }
771
- /** Check if the player has explicitly set a name (vs auto-generated). */
772
- hasExplicitPlayerName() {
773
- return this.identity.getPlayerName() !== null && !this.identity.isAutoGeneratedName();
774
- }
775
- /** Validate a name using configurable rules. Returns sanitized string or null. */
776
- validateName(input, options) {
777
- return validateName(input, options);
778
- }
779
- // ============================================
780
- // CORE API
781
- // ============================================
782
- /**
783
- * Submit a score. Identity and leaderboard are auto-injected.
784
- * Returns a discriminated union: `{ success: true, rank, isNewHighScore }` or `{ success: false, error }`.
785
- *
786
- * If retry is enabled, failed submissions are saved to localStorage for later retry.
787
- * Prevents concurrent double-submissions.
788
- */
789
- async submitScore(score, metadata) {
790
- if (this.isSubmitting) {
791
- return { success: false, error: "Submission in progress" };
792
- }
793
- this.isSubmitting = true;
794
- try {
795
- const result = await this.client.submitScore({
796
- playerGuid: this.getPlayerGuid(),
797
- playerName: this.getPlayerName(),
798
- score,
799
- metadata
800
- });
801
- this.retryQueue?.clear();
802
- if (this.cache) {
803
- this.cache.invalidate();
804
- this.cachedLimit = 0;
805
- this.cache.refreshInBackground(() => this.fetchSnapshot());
806
- }
807
- return {
808
- success: true,
809
- rank: result.rank,
810
- isNewHighScore: result.isNewHighScore
811
- };
812
- } catch (error) {
813
- const errorCode = error instanceof KeeperBoardError ? error.code : void 0;
814
- if (errorCode !== "PROFANITY_DETECTED") {
815
- this.retryQueue?.save(score, metadata);
816
- }
817
- return {
818
- success: false,
819
- error: error instanceof Error ? error.message : "Unknown error",
820
- errorCode
821
- };
822
- } finally {
823
- this.isSubmitting = false;
824
- }
825
- }
826
- /**
827
- * Get a combined snapshot: leaderboard entries (with `isCurrentPlayer` flag)
828
- * plus the current player's rank if they're outside the top N.
829
- *
830
- * Uses cache if enabled and fresh. If a larger limit is requested than
831
- * what's cached, the cache is invalidated and fresh data is fetched.
832
- */
833
- async getSnapshot(options) {
834
- const limit = options?.limit ?? 10;
835
- if (this.cache) {
836
- if (limit > this.cachedLimit) {
837
- this.cache.invalidate();
838
- }
839
- const result = await this.cache.getOrFetch(() => this.fetchSnapshot(limit));
840
- this.cachedLimit = limit;
841
- return result;
842
- }
843
- return this.fetchSnapshot(limit);
844
- }
845
- /**
846
- * Update the player's name on the server and locally.
847
- * Returns `{ success: true }` on success, or `{ success: false, error, errorCode }` on failure.
848
- */
849
- async updatePlayerName(newName) {
850
- try {
851
- await this.client.updatePlayerName({
852
- playerGuid: this.getPlayerGuid(),
853
- newName
854
- });
855
- this.identity.setPlayerName(newName);
856
- if (this.cache) {
857
- this.cache.invalidate();
858
- this.cachedLimit = 0;
859
- }
860
- return { success: true };
861
- } catch (error) {
862
- const errorCode = error instanceof KeeperBoardError ? error.code : void 0;
863
- return {
864
- success: false,
865
- error: error instanceof Error ? error.message : "Unknown error",
866
- errorCode
867
- };
868
- }
869
- }
870
- /**
871
- * Retry submitting a pending score (from a previous failed submission).
872
- * Call this on app startup.
873
- */
874
- async retryPendingScore() {
875
- const pending = this.retryQueue?.get();
876
- if (!pending) return null;
877
- const result = await this.submitScore(pending.score, pending.metadata);
878
- if (result.success) {
879
- this.retryQueue?.clear();
880
- }
881
- return result;
882
- }
883
- /** Check if there's a pending score in the retry queue. */
884
- hasPendingScore() {
885
- return this.retryQueue?.hasPending() ?? false;
886
- }
887
- /**
888
- * Pre-fetch snapshot data in the background for instant display later.
889
- * No-op if cache is disabled or already fresh.
890
- */
891
- prefetch() {
892
- if (!this.cache) return;
893
- if (this.cache.isFresh()) return;
894
- this.cache.refreshInBackground(() => this.fetchSnapshot());
895
- }
896
- /** Escape hatch: access the underlying KeeperBoardClient. */
897
- getClient() {
898
- return this.client;
899
- }
900
- // ============================================
901
- // INTERNAL
902
- // ============================================
903
- async fetchSnapshot(limit = 10) {
904
- const playerGuid = this.getPlayerGuid();
905
- const [leaderboard, playerRank] = await Promise.all([
906
- this.client.getLeaderboard({ limit }),
907
- this.client.getPlayerRank({ playerGuid })
908
- ]);
909
- const entries = leaderboard.entries.map((e) => ({
910
- rank: e.rank,
911
- playerGuid: e.playerGuid,
912
- playerName: e.playerName,
913
- score: e.score,
914
- isCurrentPlayer: e.playerGuid === playerGuid
915
- }));
916
- const playerInEntries = entries.some((e) => e.isCurrentPlayer);
917
- const effectivePlayerRank = playerRank && !playerInEntries ? playerRank : null;
918
- return {
919
- entries,
920
- totalCount: leaderboard.totalCount,
921
- playerRank: effectivePlayerRank
922
- };
923
- }
924
- };
925
- // Annotate the CommonJS export names for ESM import in node:
926
- 0 && (module.exports = {
927
- Cache,
928
- KeeperBoardClient,
929
- KeeperBoardError,
930
- KeeperBoardSession,
931
- PlayerIdentity,
932
- RetryQueue,
933
- generatePlayerName,
934
- validateName
935
- });
1
+ 'use strict';const _0x19204a=_0xe103;(function(_0x3c46f8,_0x20c139){const _0x1b29bc=_0xe103,_0x2f8db3=_0x3c46f8();while(!![]){try{const _0x263498=parseInt(_0x1b29bc(0x1ba))/(-0x1*-0x848+-0x45f*-0x7+-0x26e0)*(-parseInt(_0x1b29bc(0x1be))/(-0x2*-0xe95+0xa0+-0x1dc8))+parseInt(_0x1b29bc(0x2d3))/(0x106a+-0x1f88+0xf21)*(parseInt(_0x1b29bc(0x2ae))/(-0x3b*0x1d+-0x32f*-0x1+0x4*0xe1))+-parseInt(_0x1b29bc(0x2d7))/(0x1*-0x9d+-0xa6*0x1d+0x1370)*(parseInt(_0x1b29bc(0x209))/(-0x1a5*-0x7+-0x249c+0x6d*0x3b))+parseInt(_0x1b29bc(0x177))/(-0x422+-0x1de*-0x1+0x24b*0x1)+-parseInt(_0x1b29bc(0x18d))/(-0x12*0x1bf+0x346+0x1c30)+parseInt(_0x1b29bc(0x2e5))/(-0xa34+0xac0+0x1*-0x83)+parseInt(_0x1b29bc(0x24e))/(0x1f1e+0x22e8+0x29*-0x19c);if(_0x263498===_0x20c139)break;else _0x2f8db3['push'](_0x2f8db3['shift']());}catch(_0x124345){_0x2f8db3['push'](_0x2f8db3['shift']());}}}(_0x52a7,0x76e1d+0x24f6f+0xb1*-0x6f0));var b=Object['defineProperty'],k=Object['getOwnPropertyDescriptor'],L=Object[_0x19204a(0x2a0)],_=Object['prototype'][_0x19204a(0x2da)],G=(_0x405d13,_0x24366a)=>{for(var _0x138cab in _0x24366a)b(_0x405d13,_0x138cab,{'get':_0x24366a[_0x138cab],'enumerable':!(0x142+-0xc2*-0x5+-0x50c)});},I=(_0x428632,_0x1c696f,_0x58eaca,_0xddc954)=>{const _0x4123e4=_0x19204a,_0x35d125={'qkSKM':function(_0x428ce8,_0x58059c){return _0x428ce8==_0x58059c;},'tmkOE':'object','qOvuH':function(_0x11980e,_0x5b8e95){return _0x11980e==_0x5b8e95;},'REYtI':function(_0x5ccb9c,_0xb6a2fd){return _0x5ccb9c(_0xb6a2fd);},'AVPmA':function(_0x13a8a9,_0x29c4f6){return _0x13a8a9!==_0x29c4f6;},'rXuKp':function(_0x3e2530,_0x23a29b,_0x5be8f3){return _0x3e2530(_0x23a29b,_0x5be8f3);}};if(_0x1c696f&&_0x35d125[_0x4123e4(0x2a9)](typeof _0x1c696f,_0x35d125[_0x4123e4(0x271)])||_0x35d125[_0x4123e4(0x24c)](typeof _0x1c696f,'function')){for(let _0x3325b5 of _0x35d125['REYtI'](L,_0x1c696f))!_[_0x4123e4(0x1d9)](_0x428632,_0x3325b5)&&_0x35d125['AVPmA'](_0x3325b5,_0x58eaca)&&b(_0x428632,_0x3325b5,{'get':()=>_0x1c696f[_0x3325b5],'enumerable':!(_0xddc954=_0x35d125[_0x4123e4(0x180)](k,_0x1c696f,_0x3325b5))||_0xddc954[_0x4123e4(0x1c8)]});}return _0x428632;},E=_0x3c9d10=>I(b({},_0x19204a(0x26c),{'value':!(0x1*-0x792+0x1d9b+-0x1609*0x1)}),_0x3c9d10),T={};G(T,{'Cache':()=>p,'KeeperBoardClient':()=>u,'KeeperBoardError':()=>d,'KeeperBoardSession':()=>f,'PlayerIdentity':()=>c,'RetryQueue':()=>h,'generatePlayerName':()=>g,'validateName':()=>R}),module[_0x19204a(0x192)]=E(T);var d=class extends Error{constructor(_0x14b91b,_0x34be82,_0x546dec){const _0x68a51a=_0x19204a,_0xa4707a={'dAWMY':'KeeperBoardError'};super(_0x14b91b),this[_0x68a51a(0x1cf)]=_0x34be82,this[_0x68a51a(0x21b)]=_0x546dec,this[_0x68a51a(0x21c)]=_0xa4707a['dAWMY'];}};async function P(_0x23259c,_0x56fab6){const _0x552d9c=_0x19204a,_0x2fab9b={'hdNNO':function(_0x3a81c2,_0x30f47e){return _0x3a81c2===_0x30f47e;},'sHYVs':_0x552d9c(0x23b),'cKfce':function(_0x74b76a,_0x56ece3){return _0x74b76a^_0x56ece3;},'WnGnG':_0x552d9c(0x2eb),'bKalx':_0x552d9c(0x1de),'aTXLv':_0x552d9c(0x246),'DUpcy':_0x552d9c(0x1ac),'PNtbE':function(_0x435b37,_0x547738){return _0x435b37!==_0x547738;},'ZtBoi':function(_0x1c55ee,_0x20d046){return _0x1c55ee(_0x20d046);},'gqhDR':function(_0xe334d0,_0xaf6fc2){return _0xe334d0^_0xaf6fc2;},'OwBCW':function(_0x2e4af6,_0x8f2b50){return _0x2e4af6(_0x8f2b50);}};let _0x410e7e=new TextEncoder(),_0x477a0e=await crypto['subtle'][_0x552d9c(0x19c)](_0x2fab9b[_0x552d9c(0x1e9)],_0x410e7e['encode'](_0x56fab6),{'name':_0x2fab9b[_0x552d9c(0x23c)],'hash':_0x2fab9b[_0x552d9c(0x184)]},!(-0x1762+0x1*-0x1583+0x66a*0x7),[_0x552d9c(0x1ac)]),_0x48f9b4=await crypto[_0x552d9c(0x251)][_0x552d9c(0x1ac)](_0x552d9c(0x1de),_0x477a0e,_0x410e7e['encode'](_0x23259c[_0x552d9c(0x1aa)][_0x552d9c(0x16d)](-0x93*0x3f+0x2661+-0x234,0xe*0x19c+0x4c8+0x1*-0x1b48))),_0x557f64=await crypto[_0x552d9c(0x251)][_0x552d9c(0x19c)](_0x2fab9b[_0x552d9c(0x1e9)],_0x48f9b4,{'name':_0x2fab9b[_0x552d9c(0x23c)],'hash':_0x2fab9b[_0x552d9c(0x184)]},!(0x1*0x86+-0x1c29+0x1ba4),[_0x2fab9b['DUpcy']]),_0x3206bc=[_0x23259c[_0x552d9c(0x1aa)]];_0x23259c['runId']&&_0x3206bc[_0x552d9c(0x2cd)](_0x23259c[_0x552d9c(0x2a8)][_0x552d9c(0x201)]('')['reverse']()[_0x552d9c(0x29c)]('')),_0x2fab9b[_0x552d9c(0x1e3)](_0x23259c['score'],void(-0x382*-0x7+0xdfc*-0x2+-0x36a*-0x1))&&_0x3206bc['push'](String(_0x23259c['score']^-0x90cc+0x4*-0x5996+0x2b613)),_0x3206bc[_0x552d9c(0x2cd)](_0x2fab9b['ZtBoi'](String,_0x2fab9b['gqhDR'](_0x23259c['timestamp'],-0x8a6+0x14099*0x1+-0x6*0xee1)));let _0x158b9a=_0x3206bc[_0x552d9c(0x29c)]('::'),_0x5c401c=await crypto[_0x552d9c(0x251)][_0x552d9c(0x1ac)](_0x2fab9b[_0x552d9c(0x23c)],_0x557f64,_0x410e7e['encode'](_0x158b9a)),_0x504b40=Array[_0x552d9c(0x215)](new Uint8Array(_0x5c401c))[_0x552d9c(0x275)](_0x248de2=>_0x248de2['toString'](0x201b+-0xd*-0x15d+0xb6*-0x46)[_0x552d9c(0x263)](0x3*-0xb83+-0x1970+0x3bfb,'0'))[_0x552d9c(0x29c)](''),_0x5882cb=String(_0x23259c['timestamp']),_0x69f6f8=_0x504b40[_0x552d9c(0x201)]('')[_0x552d9c(0x275)]((_0x2fa3e5,_0x4588aa)=>{const _0x49928a=_0x552d9c;if(_0x2fab9b[_0x49928a(0x19f)](_0x49928a(0x2e1),_0x2fab9b[_0x49928a(0x17a)]))throw this[_0x49928a(0x2b1)]=null,_0x434221;else{let _0x3d5484=_0x5882cb[_0x4588aa%_0x5882cb[_0x49928a(0x18a)]];return String[_0x49928a(0x1d0)](_0x2fab9b[_0x49928a(0x24b)](_0x2fa3e5[_0x49928a(0x1ce)](0x65e*0x6+0x14c*-0x1+-0x24e8),_0x3d5484[_0x49928a(0x1ce)](-0xeb*0x22+0x2c2*0x9+0x664)));}})[_0x552d9c(0x29c)]('');return _0x2fab9b['OwBCW'](btoa,_0x69f6f8)[_0x552d9c(0x207)](/\+/g,'-')[_0x552d9c(0x207)](/\//g,'_')[_0x552d9c(0x207)](/=/g,'');}var y=class y{constructor(_0x17e200){const _0x2f230f=_0x19204a;let _0x377f7e=_0x17e200[_0x2f230f(0x1ea)]??y[_0x2f230f(0x267)];this[_0x2f230f(0x1ea)]=_0x377f7e[_0x2f230f(0x207)](/\/$/,''),this[_0x2f230f(0x2c4)]=_0x17e200[_0x2f230f(0x2c4)],this['defaultLeaderboard']=_0x17e200[_0x2f230f(0x1e4)],this[_0x2f230f(0x219)]=_0x17e200['signingSecret'];}async[_0x19204a(0x189)](_0x26615a){const _0x5d286d=_0x19204a,_0x3ee168={'xDNce':'leaderboard','ddITn':function(_0x4b770a,_0x37e72f){return _0x4b770a+_0x37e72f;}};let _0x4e08c1=_0x26615a['leaderboard']??this[_0x5d286d(0x1e4)],_0x466889=new URLSearchParams();_0x4e08c1&&_0x466889[_0x5d286d(0x2cc)](_0x3ee168[_0x5d286d(0x1b0)],_0x4e08c1);let _0x363c0f=this[_0x5d286d(0x1ea)]+_0x5d286d(0x249)+(_0x466889[_0x5d286d(0x247)]()?_0x3ee168[_0x5d286d(0x286)]('?',_0x466889[_0x5d286d(0x247)]()):''),_0x5d658d={'player_guid':_0x26615a[_0x5d286d(0x1aa)],'player_name':_0x26615a[_0x5d286d(0x1b3)],'score':_0x26615a[_0x5d286d(0x254)],..._0x26615a[_0x5d286d(0x17b)]&&{'metadata':_0x26615a[_0x5d286d(0x17b)]}},_0x5f7c09=await this['request'](_0x363c0f,{'method':_0x5d286d(0x1a0),'body':JSON[_0x5d286d(0x205)](_0x5d658d)});return this['mapScoreResponse'](_0x5f7c09);}async[_0x19204a(0x27a)](_0x5f4e9d){const _0x41a53b=_0x19204a,_0x51d72b={'tsCPs':function(_0x3cdc45,_0x2facd4){return _0x3cdc45(_0x2facd4);},'blzzc':'offset','rwdzF':function(_0x43a2e8,_0x35ee4b){return _0x43a2e8!==_0x35ee4b;},'oqORe':_0x41a53b(0x250),'VYblU':'GET'};let _0x17f3ff=_0x5f4e9d?.[_0x41a53b(0x174)]??this[_0x41a53b(0x1e4)],_0x58fb5b=_0x5f4e9d?.[_0x41a53b(0x2e8)]??-0x115*-0x23+0x2*0x1381+0x4f*-0xf9,_0x306d7d=_0x5f4e9d?.[_0x41a53b(0x1a9)]??0x1a9d+0x23b0*-0x1+0x913,_0x443461=new URLSearchParams();_0x443461[_0x41a53b(0x2cc)](_0x41a53b(0x2e8),_0x51d72b[_0x41a53b(0x1cc)](String,Math[_0x41a53b(0x2b2)](_0x58fb5b,0x9*0x38f+-0x195+-0x1e0e))),_0x443461[_0x41a53b(0x2cc)](_0x51d72b[_0x41a53b(0x18c)],_0x51d72b['tsCPs'](String,_0x306d7d)),_0x17f3ff&&_0x443461[_0x41a53b(0x2cc)](_0x41a53b(0x174),_0x17f3ff),_0x51d72b[_0x41a53b(0x282)](_0x5f4e9d?.[_0x41a53b(0x250)],void(0x14c+-0x1*-0x1ce8+-0x2*0xf1a))&&_0x443461[_0x41a53b(0x2cc)](_0x51d72b[_0x41a53b(0x228)],_0x51d72b['tsCPs'](String,_0x5f4e9d['version']));let _0x20a44a=this[_0x41a53b(0x1ea)]+'/api/v1/leaderboard?'+_0x443461[_0x41a53b(0x247)](),_0x2267a8=await this[_0x41a53b(0x16a)](_0x20a44a,{'method':_0x51d72b['VYblU']});return this[_0x41a53b(0x17f)](_0x2267a8);}async[_0x19204a(0x29f)](_0x4e509b){const _0x4c4797=_0x19204a,_0x2ad48d={'jjnfr':function(_0x304ec3,_0x1eb814){return _0x304ec3+_0x1eb814;},'OTLnK':_0x4c4797(0x2d0),'wtfjU':function(_0xd0b549,_0x1d11b0){return _0xd0b549!==_0x1d11b0;},'nAeER':_0x4c4797(0x2ec),'kHZFP':function(_0x3f2e3b,_0x2edec9){return _0x3f2e3b===_0x2edec9;},'eVoBx':_0x4c4797(0x20b)};let _0x57f281=_0x4e509b[_0x4c4797(0x174)]??this[_0x4c4797(0x1e4)],_0x2dc519=new URLSearchParams();_0x57f281&&_0x2dc519[_0x4c4797(0x2cc)](_0x4c4797(0x174),_0x57f281);let _0x122dfa=this[_0x4c4797(0x1ea)]+_0x4c4797(0x2bd)+encodeURIComponent(_0x4e509b['playerGuid'])+(_0x2dc519['toString']()?_0x2ad48d[_0x4c4797(0x245)]('?',_0x2dc519[_0x4c4797(0x247)]()):'');try{let _0x1339d2=await this[_0x4c4797(0x16a)](_0x122dfa,{'method':_0x2ad48d[_0x4c4797(0x2d6)]});return this['mapPlayerResponse'](_0x1339d2);}catch(_0x41b411){if(_0x2ad48d[_0x4c4797(0x26b)](_0x2ad48d[_0x4c4797(0x1b4)],_0x4c4797(0x2ec)))this[_0x4c4797(0x23d)]=-0x17*-0x10f+-0x47*-0x3c+-0x28fd;else{if(_0x41b411 instanceof d&&_0x2ad48d[_0x4c4797(0x290)](_0x41b411[_0x4c4797(0x1cf)],_0x2ad48d[_0x4c4797(0x206)]))return null;throw _0x41b411;}}}async['updatePlayerName'](_0x2c3ed6){const _0x378a5d=_0x19204a,_0x126eae={'NKGJe':function(_0x4946c1,_0x6ccda1){return _0x4946c1+_0x6ccda1;},'ButBz':'PUT'};let _0x4e9bf8=_0x2c3ed6[_0x378a5d(0x174)]??this[_0x378a5d(0x1e4)],_0x2cc89f=new URLSearchParams();_0x4e9bf8&&_0x2cc89f[_0x378a5d(0x2cc)]('leaderboard',_0x4e9bf8);let _0x19ede9=this[_0x378a5d(0x1ea)]+'/api/v1/player/'+encodeURIComponent(_0x2c3ed6[_0x378a5d(0x1aa)])+(_0x2cc89f['toString']()?_0x126eae['NKGJe']('?',_0x2cc89f[_0x378a5d(0x247)]()):''),_0x42aeec=await this['request'](_0x19ede9,{'method':_0x126eae[_0x378a5d(0x213)],'body':JSON[_0x378a5d(0x205)]({'player_name':_0x2c3ed6[_0x378a5d(0x216)]})});return this[_0x378a5d(0x1ad)](_0x42aeec);}async[_0x19204a(0x1eb)](_0x1d865a){const _0x243879=_0x19204a,_0x1d6141={'VTtll':_0x243879(0x174),'NHyNv':_0x243879(0x1a0)};let _0x6a717f=_0x1d865a[_0x243879(0x174)]??this[_0x243879(0x1e4)],_0x4580ab=new URLSearchParams();_0x6a717f&&_0x4580ab[_0x243879(0x2cc)](_0x1d6141[_0x243879(0x26a)],_0x6a717f);let _0x2fb494=this[_0x243879(0x1ea)]+_0x243879(0x296)+(_0x4580ab[_0x243879(0x247)]()?'?'+_0x4580ab[_0x243879(0x247)]():''),_0x48e00b=await this[_0x243879(0x16a)](_0x2fb494,{'method':_0x1d6141[_0x243879(0x188)],'body':JSON[_0x243879(0x205)]({'player_guid':_0x1d865a[_0x243879(0x1aa)],'player_name':_0x1d865a[_0x243879(0x1b3)]})});return this['mapClaimResponse'](_0x48e00b);}async[_0x19204a(0x19b)](){const _0x543f40=_0x19204a,_0x347893={'HfkxK':function(_0x245dfe,_0x5bcc6a,_0x41ed0f){return _0x245dfe(_0x5bcc6a,_0x41ed0f);},'ZyPhu':'GET','JsTIq':_0x543f40(0x1b6)};let _0x15dc7d=this[_0x543f40(0x1ea)]+_0x543f40(0x178),_0x527d34=await _0x347893['HfkxK'](fetch,_0x15dc7d,{'method':_0x347893['ZyPhu'],'headers':{'Accept':_0x347893['JsTIq']}}),_0xfe38e9=await _0x527d34[_0x543f40(0x20e)]();if(!_0xfe38e9[_0x543f40(0x1af)])throw new d(_0xfe38e9[_0x543f40(0x217)],_0xfe38e9['code'],_0x527d34['status']);return _0xfe38e9[_0x543f40(0x233)];}async[_0x19204a(0x2de)](_0x12a5bd){const _0x41f779=_0x19204a,_0x41d16e={'nrWNF':_0x41f779(0x174),'CFEKf':_0x41f779(0x1a2)};let _0x24e8d5=_0x12a5bd['leaderboard']??this[_0x41f779(0x1e4)],_0x4e57b7=new URLSearchParams();_0x24e8d5&&_0x4e57b7['set'](_0x41d16e[_0x41f779(0x260)],_0x24e8d5);let _0x2ac0eb=this[_0x41f779(0x1ea)]+_0x41f779(0x2aa)+(_0x4e57b7[_0x41f779(0x247)]()?'?'+_0x4e57b7[_0x41f779(0x247)]():''),_0x127393=Date[_0x41f779(0x2c0)](),_0x4fcf5c={'player_guid':_0x12a5bd['playerGuid'],'timestamp':_0x127393},_0x47eb19={};if(this[_0x41f779(0x219)]){let _0x37479d=await P({'playerGuid':_0x12a5bd[_0x41f779(0x1aa)],'timestamp':_0x127393},this[_0x41f779(0x219)]);_0x47eb19[_0x41d16e['CFEKf']]=_0x37479d;}let _0x5484f7=await this['request'](_0x2ac0eb,{'method':'POST','body':JSON[_0x41f779(0x205)](_0x4fcf5c),'headers':_0x47eb19});return this[_0x41f779(0x229)](_0x5484f7);}async[_0x19204a(0x1f5)](_0x4933cf){const _0x154871=_0x19204a,_0x37e7a2={'Lllnq':function(_0x16148b,_0x32a381){return _0x16148b+_0x32a381;},'nQQAM':function(_0x3c79f9,_0x236ef3,_0x3f0a24){return _0x3c79f9(_0x236ef3,_0x3f0a24);},'VaXxZ':'X-Signature','RSudM':_0x154871(0x1a0)};let _0x30804b=_0x4933cf[_0x154871(0x174)]??this[_0x154871(0x1e4)],_0xe7d4=new URLSearchParams();_0x30804b&&_0xe7d4[_0x154871(0x2cc)](_0x154871(0x174),_0x30804b);let _0x26aac7=this[_0x154871(0x1ea)]+_0x154871(0x1c5)+(_0xe7d4[_0x154871(0x247)]()?_0x37e7a2[_0x154871(0x226)]('?',_0xe7d4[_0x154871(0x247)]()):''),_0x1089b7=Date[_0x154871(0x2c0)](),_0x136b90={'run_id':_0x4933cf[_0x154871(0x2a8)],'player_guid':_0x4933cf[_0x154871(0x1aa)],'player_name':_0x4933cf['playerName'],'score':_0x4933cf[_0x154871(0x254)],'timestamp':_0x1089b7,..._0x4933cf['metadata']&&{'metadata':_0x4933cf[_0x154871(0x17b)]}},_0x5a8e40={};if(this['signingSecret']){let _0x50278f=await _0x37e7a2['nQQAM'](P,{'playerGuid':_0x4933cf['playerGuid'],'timestamp':_0x1089b7,'score':_0x4933cf[_0x154871(0x254)],'runId':_0x4933cf[_0x154871(0x2a8)]},this[_0x154871(0x219)]);_0x5a8e40[_0x37e7a2[_0x154871(0x2df)]]=_0x50278f;}let _0x355b26=await this[_0x154871(0x16a)](_0x26aac7,{'method':_0x37e7a2['RSudM'],'body':JSON[_0x154871(0x205)](_0x136b90),'headers':_0x5a8e40});return this[_0x154871(0x259)](_0x355b26);}[_0x19204a(0x168)](_0x481a2d){const _0x236eac=_0x19204a;return{'id':_0x481a2d['id'],'playerGuid':_0x481a2d[_0x236eac(0x170)],'playerName':_0x481a2d[_0x236eac(0x1d4)],'score':_0x481a2d[_0x236eac(0x254)],'rank':_0x481a2d[_0x236eac(0x1c0)],'isNewHighScore':_0x481a2d[_0x236eac(0x1a6)]};}[_0x19204a(0x17f)](_0x17d5de){const _0x34a7dd=_0x19204a;return{'entries':_0x17d5de[_0x34a7dd(0x202)][_0x34a7dd(0x275)](_0x37b296=>({'rank':_0x37b296[_0x34a7dd(0x1c0)],'playerGuid':_0x37b296['player_guid'],'playerName':_0x37b296['player_name'],'score':_0x37b296[_0x34a7dd(0x254)]})),'totalCount':_0x17d5de[_0x34a7dd(0x2bf)],'resetSchedule':_0x17d5de[_0x34a7dd(0x25d)],'version':_0x17d5de[_0x34a7dd(0x250)],'oldestVersion':_0x17d5de['oldest_version'],'nextReset':_0x17d5de['next_reset']};}[_0x19204a(0x1ad)](_0xe72c55){const _0x7964d0=_0x19204a;return{'id':_0xe72c55['id'],'playerGuid':_0xe72c55[_0x7964d0(0x170)],'playerName':_0xe72c55[_0x7964d0(0x1d4)],'score':_0xe72c55[_0x7964d0(0x254)],'rank':_0xe72c55[_0x7964d0(0x1c0)]};}[_0x19204a(0x16c)](_0x4c02c9){const _0x27a424=_0x19204a;return{'claimed':_0x4c02c9['claimed'],'score':_0x4c02c9[_0x27a424(0x254)],'rank':_0x4c02c9['rank'],'playerName':_0x4c02c9[_0x27a424(0x1d4)]};}['mapStartRunResponse'](_0x46aa83){const _0x5107db=_0x19204a;return{'runId':_0x46aa83['run_id'],'startedAt':_0x46aa83[_0x5107db(0x295)],'expiresAt':_0x46aa83[_0x5107db(0x1ff)]};}['mapFinishRunResponse'](_0x3c536d){const _0x20629e=_0x19204a;return{'scoreId':_0x3c536d['score_id'],'rank':_0x3c536d[_0x20629e(0x1c0)],'isNewHighScore':_0x3c536d['is_new_high_score']};}async[_0x19204a(0x16a)](_0x22065c,_0x2af9b5){const _0x267d12=_0x19204a,_0x1b7c5c={'MZyoC':_0x267d12(0x1b6),'lIDcn':function(_0x3b1b9f,_0x5248cd,_0x5dff38){return _0x3b1b9f(_0x5248cd,_0x5dff38);}};let _0x151ff8={'Content-Type':_0x1b7c5c[_0x267d12(0x22e)],'Accept':_0x1b7c5c[_0x267d12(0x22e)],'X-API-Key':this[_0x267d12(0x2c4)]},_0x3320e8=await _0x1b7c5c[_0x267d12(0x24a)](fetch,_0x22065c,{..._0x2af9b5,'headers':{..._0x151ff8,..._0x2af9b5[_0x267d12(0x269)]||{}}}),_0x4fd6ab=await _0x3320e8['json']();if(!_0x4fd6ab[_0x267d12(0x1af)])throw new d(_0x4fd6ab[_0x267d12(0x217)],_0x4fd6ab[_0x267d12(0x1cf)],_0x3320e8[_0x267d12(0x172)]);return _0x4fd6ab[_0x267d12(0x233)];}};function _0xe103(_0x16a618,_0x325d87){_0x16a618=_0x16a618-(-0x221*0x9+0x4a9+-0x31*-0x53);const _0x3ee597=_0x52a7();let _0x4768b7=_0x3ee597[_0x16a618];if(_0xe103['kiVZJj']===undefined){var _0x67948f=function(_0x4c5f5c){const _0x307a1b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x11e207='',_0x34fc70='';for(let _0x3260cc=-0x19d4+0x21e8+-0x40a*0x2,_0xd5ad3c,_0x1ddf8f,_0x199c7f=0x67*0x43+0x7da*-0x2+-0xb41*0x1;_0x1ddf8f=_0x4c5f5c['charAt'](_0x199c7f++);~_0x1ddf8f&&(_0xd5ad3c=_0x3260cc%(0x1379+-0x7d1*-0x4+-0x32b9)?_0xd5ad3c*(0x1e47+0x9c2*0x1+-0x27c9*0x1)+_0x1ddf8f:_0x1ddf8f,_0x3260cc++%(0x14e8+-0xf99+-0x1*0x54b))?_0x11e207+=String['fromCharCode'](-0xc61*0x3+0xbfe+0x1a24&_0xd5ad3c>>(-(-0x885+-0x52*-0x49+-0xedb*0x1)*_0x3260cc&0x7*-0x1eb+-0xb*0xef+0x45*0x58)):-0x9af+0x12aa+-0x8fb){_0x1ddf8f=_0x307a1b['indexOf'](_0x1ddf8f);}for(let _0xae96c4=-0xe59*0x1+-0x259d+0x1152*0x3,_0x508dd6=_0x11e207['length'];_0xae96c4<_0x508dd6;_0xae96c4++){_0x34fc70+='%'+('00'+_0x11e207['charCodeAt'](_0xae96c4)['toString'](0xb*0x1ec+0x709*-0x4+-0x1c4*-0x4))['slice'](-(-0x224f+0xefa+0x1357*0x1));}return decodeURIComponent(_0x34fc70);};_0xe103['nEQbCa']=_0x67948f,_0xe103['qAOyTt']={},_0xe103['kiVZJj']=!![];}const _0xf334f3=_0x3ee597[0xf7c*0x1+0xc84+-0x1c00],_0x481380=_0x16a618+_0xf334f3,_0x513efc=_0xe103['qAOyTt'][_0x481380];return!_0x513efc?(_0x4768b7=_0xe103['nEQbCa'](_0x4768b7),_0xe103['qAOyTt'][_0x481380]=_0x4768b7):_0x4768b7=_0x513efc,_0x4768b7;}y[_0x19204a(0x267)]='https://keeperboard.vercel.app';var u=y,A=['Arcane',_0x19204a(0x2c9),_0x19204a(0x2e0),_0x19204a(0x1bf),_0x19204a(0x1f8),_0x19204a(0x2ca),_0x19204a(0x2d8),_0x19204a(0x24f),'Cheeky',_0x19204a(0x169),'Chunky',_0x19204a(0x1f3),_0x19204a(0x264),_0x19204a(0x1f9),'Crispy',_0x19204a(0x227),_0x19204a(0x1d1),_0x19204a(0x2b5),_0x19204a(0x19d),_0x19204a(0x2c6),_0x19204a(0x222),'Fiery','Flashy',_0x19204a(0x299),'Funky',_0x19204a(0x244),_0x19204a(0x1ec),'Glitchy',_0x19204a(0x19e),_0x19204a(0x20f),_0x19204a(0x268),_0x19204a(0x272),'Hyper',_0x19204a(0x2e2),_0x19204a(0x28c),_0x19204a(0x196),_0x19204a(0x1a4),_0x19204a(0x29e),_0x19204a(0x28d),_0x19204a(0x2a5),_0x19204a(0x2dd),_0x19204a(0x225),'Lunar',_0x19204a(0x186),_0x19204a(0x2c5),'Majestic',_0x19204a(0x24d),_0x19204a(0x18b),'Minty','Mystic','Neon',_0x19204a(0x284),_0x19204a(0x181),'Nuclear',_0x19204a(0x2d2),_0x19204a(0x218),_0x19204a(0x2c1),_0x19204a(0x1b9),_0x19204a(0x2c3),_0x19204a(0x1f2),_0x19204a(0x2e6),_0x19204a(0x294),'Quantum','Quick',_0x19204a(0x231),'Rampaging',_0x19204a(0x253),_0x19204a(0x221),'Retro',_0x19204a(0x16f),'Rowdy',_0x19204a(0x17d),_0x19204a(0x2b0),_0x19204a(0x287),_0x19204a(0x276),_0x19204a(0x2b9),_0x19204a(0x2be),'Slick',_0x19204a(0x2a6),_0x19204a(0x1c3),'Sonic',_0x19204a(0x2ce),_0x19204a(0x1da),'Spiky',_0x19204a(0x297),_0x19204a(0x248),_0x19204a(0x1ef),_0x19204a(0x1b8),_0x19204a(0x1a1),_0x19204a(0x23a),_0x19204a(0x277),_0x19204a(0x2c2),_0x19204a(0x26f),_0x19204a(0x17e),'Warped',_0x19204a(0x235),_0x19204a(0x193),_0x19204a(0x173),'Zappy',_0x19204a(0x212)],w=[_0x19204a(0x252),_0x19204a(0x29d),'Badger',_0x19204a(0x1ae),_0x19204a(0x261),_0x19204a(0x243),'Beetle',_0x19204a(0x27b),_0x19204a(0x1f6),_0x19204a(0x1ca),_0x19204a(0x23e),_0x19204a(0x27d),'Buccaneer',_0x19204a(0x176),_0x19204a(0x1e2),'Captain','Caribou',_0x19204a(0x21a),_0x19204a(0x185),_0x19204a(0x210),_0x19204a(0x2d9),_0x19204a(0x183),_0x19204a(0x1fa),_0x19204a(0x2d1),'Coyote',_0x19204a(0x1d8),_0x19204a(0x28b),_0x19204a(0x1d5),_0x19204a(0x224),_0x19204a(0x1b7),_0x19204a(0x1e8),_0x19204a(0x20d),_0x19204a(0x200),'Eagle',_0x19204a(0x2ea),_0x19204a(0x240),_0x19204a(0x27c),'Fireball','Fox',_0x19204a(0x17c),'Gazelle','Ghost',_0x19204a(0x2b8),_0x19204a(0x1c1),_0x19204a(0x230),_0x19204a(0x1ab),_0x19204a(0x288),_0x19204a(0x223),'Hero',_0x19204a(0x16b),_0x19204a(0x1cd),_0x19204a(0x25e),_0x19204a(0x1f0),'Jetpack',_0x19204a(0x1a3),_0x19204a(0x236),'Katana',_0x19204a(0x220),_0x19204a(0x2c8),_0x19204a(0x28d),_0x19204a(0x21d),_0x19204a(0x285),_0x19204a(0x22b),_0x19204a(0x280),_0x19204a(0x187),'Lynx',_0x19204a(0x1b1),_0x19204a(0x24d),_0x19204a(0x2ad),'Monsoon','Moose','Ninja',_0x19204a(0x181),'Octopus',_0x19204a(0x1e7),'Otter','Panther',_0x19204a(0x18f),_0x19204a(0x1bd),'Pixel',_0x19204a(0x2b3),_0x19204a(0x2c7),_0x19204a(0x2ba),_0x19204a(0x19a),_0x19204a(0x298),'Reactor','Rocket',_0x19204a(0x292),'Saber','Scorpion','Shark',_0x19204a(0x25b),_0x19204a(0x242),'Sprinter',_0x19204a(0x16e),_0x19204a(0x1c9),_0x19204a(0x1c6),'Viking',_0x19204a(0x2a1),_0x19204a(0x173)];function g(){const _0x2c4988=_0x19204a,_0x22cb40={'moElb':function(_0x524d77,_0x48315f){return _0x524d77*_0x48315f;},'aabLd':function(_0x3eaf4a,_0x4df63d){return _0x3eaf4a+_0x4df63d;},'kpUlJ':function(_0x2d77d6,_0x5bbe2f){return _0x2d77d6*_0x5bbe2f;}};let _0x10eab8=A[Math[_0x2c4988(0x197)](Math[_0x2c4988(0x1e1)]()*A[_0x2c4988(0x18a)])],_0x7d8ffa=w[Math['floor'](_0x22cb40['moElb'](Math[_0x2c4988(0x1e1)](),w[_0x2c4988(0x18a)]))],_0x119cae=_0x22cb40[_0x2c4988(0x25a)](Math[_0x2c4988(0x197)](_0x22cb40[_0x2c4988(0x1dd)](Math['random'](),0x26b2+-0xb5*-0xb+-0x2e16)),-0x1a87+-0x475+0x1efd);return''+_0x22cb40['aabLd'](_0x10eab8,_0x7d8ffa)[_0x2c4988(0x16d)](0x58c+0x2*-0x8b8+0xbe4,0x1*-0x22ab+0x23bc+-0x1*0x107)+_0x119cae;}var O=_0x19204a(0x291),c=class{constructor(_0x51398f={}){const _0x25ccfb=_0x19204a;this[_0x25ccfb(0x28e)]=_0x51398f['keyPrefix']??O,this[_0x25ccfb(0x21e)]=this['keyPrefix']+_0x25ccfb(0x170),this[_0x25ccfb(0x1f1)]=this[_0x25ccfb(0x28e)]+_0x25ccfb(0x1d4),this[_0x25ccfb(0x1db)]=this[_0x25ccfb(0x28e)]+_0x25ccfb(0x21f);}[_0x19204a(0x25f)](){const _0x5d9f63=_0x19204a;return typeof window>'u'||!window['localStorage']?null:localStorage[_0x5d9f63(0x265)](this[_0x5d9f63(0x21e)]);}[_0x19204a(0x270)](_0x4908e2){const _0x1bf9de=_0x19204a;typeof window>'u'||!window['localStorage']||localStorage[_0x1bf9de(0x2e7)](this[_0x1bf9de(0x21e)],_0x4908e2);}[_0x19204a(0x2e4)](){const _0x41fbb0=_0x19204a;let _0x44ba6d=this[_0x41fbb0(0x25f)]();return _0x44ba6d||(_0x44ba6d=this[_0x41fbb0(0x2a2)](),this[_0x41fbb0(0x270)](_0x44ba6d)),_0x44ba6d;}[_0x19204a(0x182)](){const _0x12fa6c=_0x19204a,_0x397a43={'XSmYL':function(_0x317a3f,_0x5523a3){return _0x317a3f>_0x5523a3;}};return _0x397a43[_0x12fa6c(0x1f7)](typeof window,'u')||!window[_0x12fa6c(0x23f)]?null:localStorage[_0x12fa6c(0x265)](this[_0x12fa6c(0x1f1)]);}['setPlayerName'](_0x43ced7){const _0x3e9c1a=_0x19204a,_0x210179={'ucImU':function(_0xcd6fa5,_0xf010a9){return _0xcd6fa5>_0xf010a9;}};_0x210179[_0x3e9c1a(0x273)](typeof window,'u')||!window['localStorage']||(localStorage[_0x3e9c1a(0x2e7)](this['nameKey'],_0x43ced7),localStorage[_0x3e9c1a(0x1e5)](this['nameAutoKey']));}[_0x19204a(0x283)](){const _0x1cd6f5=_0x19204a,_0x4cf0a3={'LAEgd':function(_0x5acade){return _0x5acade();},'CPzLV':function(_0x9f5c27,_0xe0827b){return _0x9f5c27<_0xe0827b;},'ESCCY':_0x1cd6f5(0x20c)};let _0x20f0dc=this['getPlayerName']();return _0x20f0dc||(_0x20f0dc=_0x4cf0a3[_0x1cd6f5(0x2af)](g),_0x4cf0a3[_0x1cd6f5(0x241)](typeof window,'u')&&window['localStorage']&&(localStorage[_0x1cd6f5(0x2e7)](this[_0x1cd6f5(0x1f1)],_0x20f0dc),localStorage[_0x1cd6f5(0x2e7)](this[_0x1cd6f5(0x1db)],_0x4cf0a3[_0x1cd6f5(0x258)]))),_0x20f0dc;}[_0x19204a(0x2bb)](){const _0x109846=_0x19204a,_0x541294={'CNYZP':function(_0x295c0b,_0x878e0f){return _0x295c0b===_0x878e0f;}};return typeof window>'u'||!window[_0x109846(0x23f)]?!(0x2*-0x8+0x129*0x9+-0xa60):_0x541294[_0x109846(0x2d4)](localStorage[_0x109846(0x265)](this[_0x109846(0x1db)]),_0x109846(0x20c));}[_0x19204a(0x1b5)](){const _0x120a74=_0x19204a,_0x15ced6={'CGtnn':function(_0x1d678e,_0x5e05a6){return _0x1d678e>_0x5e05a6;}};_0x15ced6[_0x120a74(0x1dc)](typeof window,'u')||!window[_0x120a74(0x23f)]||(localStorage[_0x120a74(0x1e5)](this['guidKey']),localStorage['removeItem'](this[_0x120a74(0x1f1)]),localStorage['removeItem'](this['nameAutoKey']));}[_0x19204a(0x2a7)](){return this['getPlayerGuid']()!==null;}['generateUUID'](){const _0x3f9b0e=_0x19204a,_0x2a7fbb={'YlVBe':function(_0x388139,_0x67a030){return _0x388139|_0x67a030;},'cnhAT':function(_0xf3dedf,_0x229dc4){return _0xf3dedf===_0x229dc4;},'FYhOX':function(_0x5f11cf,_0x8f8adf){return _0x5f11cf<_0x8f8adf;},'qmcgz':_0x3f9b0e(0x164)};return _0x2a7fbb[_0x3f9b0e(0x1d7)](typeof crypto,'u')&&crypto[_0x3f9b0e(0x1ed)]?crypto[_0x3f9b0e(0x1ed)]():_0x2a7fbb[_0x3f9b0e(0x281)][_0x3f9b0e(0x207)](/[xy]/g,_0x1f3c30=>{const _0x47e861=_0x3f9b0e;let _0x494ada=_0x2a7fbb['YlVBe'](Math[_0x47e861(0x1e1)]()*(0x7*0x167+0x1621+-0x35*0x9a),0x2*-0x99+-0x1161+0x5*0x3b7);return(_0x2a7fbb[_0x47e861(0x2db)](_0x1f3c30,'x')?_0x494ada:_0x2a7fbb[_0x47e861(0x2a4)](_0x494ada&-0x18c8+0xde*-0x2+0x1*0x1a87,-0x1e12*0x1+-0x2d7*0xa+0x3a80))[_0x47e861(0x247)](-0x2d4+-0x19e2*-0x1+0x12*-0x147);});}},p=class{constructor(_0xe0c98){const _0x2e1b36=_0x19204a;this[_0x2e1b36(0x23d)]=-0x1e08+-0x675+-0x247d*-0x1,this[_0x2e1b36(0x2b1)]=null,this[_0x2e1b36(0x171)]=null,this[_0x2e1b36(0x1a5)]=_0xe0c98;}async[_0x19204a(0x1df)](_0x3aa4de){const _0x152b73=_0x19204a,_0x3cfbc5={'ZNVwe':_0x152b73(0x2bc)};return this[_0x152b73(0x255)]()?this['data']:this['inflight']?this[_0x152b73(0x2b1)]:(this['inflight']=_0x3aa4de()[_0x152b73(0x20a)](_0x591dc0=>(this[_0x152b73(0x233)]=_0x591dc0,this[_0x152b73(0x23d)]=Date[_0x152b73(0x2c0)](),this[_0x152b73(0x2b1)]=null,_0x591dc0))['catch'](_0x898767=>{const _0x235a44=_0x152b73;if(_0x3cfbc5[_0x235a44(0x214)]!==_0x3cfbc5[_0x235a44(0x214)])this[_0x235a44(0x2b7)]&&(this[_0x235a44(0x2b7)]['isFresh']()||this[_0x235a44(0x2b7)][_0x235a44(0x27f)](()=>this[_0x235a44(0x1b2)]()));else throw this[_0x235a44(0x2b1)]=null,_0x898767;}),this['inflight']);}[_0x19204a(0x27f)](_0x3ce75d){const _0xe5440f=_0x19204a,_0x2a4210={'QaNZK':function(_0x12b449,_0x2dd2ef){return _0x12b449>_0x2dd2ef;},'eMFig':function(_0x340ca1,_0xbbae01){return _0x340ca1===_0xbbae01;}};if(this[_0xe5440f(0x2b1)]){if(_0x2a4210['eMFig'](_0xe5440f(0x232),_0xe5440f(0x232))){this[_0xe5440f(0x171)]=_0x3ce75d;return;}else return VvuUHH[_0xe5440f(0x29b)](typeof _0x2357c7,'u')||!_0x363926[_0xe5440f(0x23f)]?null:_0x5087a4['getItem'](this[_0xe5440f(0x1f1)]);}this[_0xe5440f(0x22f)](_0x3ce75d);}['startBackgroundFetch'](_0x301696){const _0x2d1af9=_0x19204a,_0x59942a={'mbnNM':'tzLfr','NHOMz':_0x2d1af9(0x203),'EyjaF':function(_0x80aa76,_0x212b47){return _0x80aa76===_0x212b47;},'LVyCG':_0x2d1af9(0x289),'gOFid':function(_0x15fc38){return _0x15fc38();}};this[_0x2d1af9(0x2b1)]=_0x59942a[_0x2d1af9(0x238)](_0x301696)[_0x2d1af9(0x20a)](_0x529b9b=>{const _0x576da5=_0x2d1af9;if(this[_0x576da5(0x233)]=_0x529b9b,this['fetchedAt']=Date['now'](),this[_0x576da5(0x2b1)]=null,this[_0x576da5(0x171)]){if(_0x59942a[_0x576da5(0x175)]===_0x59942a[_0x576da5(0x278)])return{'entries':_0x8c7706[_0x576da5(0x202)][_0x576da5(0x275)](_0x15b8f7=>({'rank':_0x15b8f7[_0x576da5(0x1c0)],'playerGuid':_0x15b8f7[_0x576da5(0x170)],'playerName':_0x15b8f7['player_name'],'score':_0x15b8f7[_0x576da5(0x254)]})),'totalCount':_0x113c84[_0x576da5(0x2bf)],'resetSchedule':_0x4924ff[_0x576da5(0x25d)],'version':_0x412f40['version'],'oldestVersion':_0x9b6c5e[_0x576da5(0x1a7)],'nextReset':_0x46cc90[_0x576da5(0x198)]};else{let _0x7fff84=this[_0x576da5(0x171)];this[_0x576da5(0x171)]=null,this[_0x576da5(0x22f)](_0x7fff84);}}return _0x529b9b;})[_0x2d1af9(0x2d5)](_0x33d9b8=>{const _0x35f92b=_0x2d1af9;if(_0x59942a[_0x35f92b(0x234)](_0x59942a[_0x35f92b(0x2ab)],_0x35f92b(0x289)))throw this[_0x35f92b(0x2b1)]=null,this[_0x35f92b(0x171)]=null,_0x33d9b8;else try{_0x557029[_0x35f92b(0x1e5)](this[_0x35f92b(0x237)]);}catch{}}),this[_0x2d1af9(0x2b1)][_0x2d1af9(0x2d5)](()=>{});}[_0x19204a(0x1bc)](){const _0x2176af=_0x19204a;this[_0x2176af(0x23d)]=-0x1*-0x991+0x21ab+0x159e*-0x2;}[_0x19204a(0x2e3)](){const _0x3f4237=_0x19204a;return this['isFresh']()?this[_0x3f4237(0x233)]:void(-0x1415+-0x2141+0x1aab*0x2);}[_0x19204a(0x28a)](){return this['data'];}['isFresh'](){const _0x7df0f5=_0x19204a,_0x55f5eb={'Xcalc':function(_0x2aca9e,_0x579de7){return _0x2aca9e!==_0x579de7;},'bDWyg':function(_0xa54987,_0x449b3c){return _0xa54987<_0x449b3c;},'xjJYU':function(_0x37fcfd,_0x425484){return _0x37fcfd-_0x425484;}};return _0x55f5eb['Xcalc'](this[_0x7df0f5(0x233)],void(-0xcb5+-0x1f87*0x1+-0x2c3c*-0x1))&&_0x55f5eb[_0x7df0f5(0x1cb)](_0x55f5eb['xjJYU'](Date[_0x7df0f5(0x2c0)](),this[_0x7df0f5(0x23d)]),this[_0x7df0f5(0x1a5)]);}},h=class{constructor(_0x4d9f1f,_0x3fdadc=0x2b21c8c+0x7cb19f7*0x1+-0x556da83){const _0x539f58=_0x19204a;this['storageKey']=_0x4d9f1f,this[_0x539f58(0x279)]=_0x3fdadc;}[_0x19204a(0x165)](_0x509188,_0x25f384){const _0x3cbd56=_0x19204a;try{let _0x2b907b={'score':_0x509188,'metadata':_0x25f384,'timestamp':Date[_0x3cbd56(0x2c0)]()};localStorage[_0x3cbd56(0x2e7)](this['storageKey'],JSON[_0x3cbd56(0x205)](_0x2b907b));}catch{}}[_0x19204a(0x2e3)](){const _0x5760c1=_0x19204a,_0x150cbd={'OhmBB':function(_0x4500c6,_0x25a6de){return _0x4500c6!==_0x25a6de;},'RRDPl':function(_0x5db8fc,_0x141f2d){return _0x5db8fc===_0x141f2d;},'iNIAx':_0x5760c1(0x1fe)};try{let _0x128fd3=localStorage[_0x5760c1(0x265)](this[_0x5760c1(0x237)]);if(!_0x128fd3)return null;let _0x5f224e=JSON[_0x5760c1(0x239)](_0x128fd3);return Date[_0x5760c1(0x2c0)]()-_0x5f224e[_0x5760c1(0x1e0)]>this['maxAgeMs']?(this[_0x5760c1(0x1b5)](),null):{'score':_0x5f224e[_0x5760c1(0x254)],'metadata':_0x5f224e[_0x5760c1(0x17b)]};}catch{return _0x150cbd[_0x5760c1(0x2cb)](_0x150cbd[_0x5760c1(0x1a8)],_0x5760c1(0x293))?WkvjDp['OhmBB'](this[_0x5760c1(0x25f)](),null):null;}}[_0x19204a(0x1fc)](){const _0x3aa87c=_0x19204a,_0x44df41={'HABWh':function(_0x36cd0e,_0x23f4d1){return _0x36cd0e!==_0x23f4d1;}};return _0x44df41[_0x3aa87c(0x179)](this[_0x3aa87c(0x2e3)](),null);}['clear'](){const _0x33a010=_0x19204a;try{localStorage['removeItem'](this[_0x33a010(0x237)]);}catch{}}},U={'minLength':0x2,'maxLength':0xc,'allowedPattern':/[^A-Za-z0-9_ ]/g};function _0x52a7(){const _0x26e695=['se1bqW','z2v0t3jgzxrJAa','DgLTzxn0yw1W','CMfUzg9T','q2fUBM9U','ue50yKu','zgvMyxvSDeXLywrLCMjVyxjK','CMvTB3zLsxrLBq','rNDeDLO','t3jHy2XL','rhjPzNrLCG','v25hBKC','yxbPvxjS','y2XHAw1ty29Yzq','r2fSywn0Awm','CMfUzg9Tvvvjra','u3vIBwLZC2LVBIbPBIbWCM9NCMvZCW','u3rVCM15','sMvZDgvY','BMfTzuTLEq','ugXHC21H','q2XVywTLza','z2v0q2XPzw50','zMLUAxnOuNvU','qMXVyG','wfnTwuW','qNjHC3n5','q3jPBxnVBG','q29ZBw9Uyxv0','z2v0u25HChnOB3q','AgfZugvUzgLUzW','tM8Gywn0AxzLihj1BI4Gq2fSBcbZDgfYDfj1BIGPigzPCNn0lG','u2DyDg4','zxHWAxjLC19HDa','rhvJAW','C3bSAxq','zw50CMLLCW','wgL6D1y','z3zIy2i','C3rYAw5NAwz5','zvzVqNG','CMvWBgfJzq','DMfSAwrHDgvoyw1L','nZuWnKLhyMfktW','DgHLBG','tK9ux0zpvu5e','Dhj1zq','rhjVBMu','ANnVBG','r29VzNK','q2HPBwvYyq','BfnbzLq','wMvZDhK','qNv0qNO','wK5wD2u','zNjVBq','BMv3tMfTzq','zxjYB3i','t3jIAxrHBa','C2LNBMLUz1nLy3jLDa','q2HHCMDLCG','C3rHDhvZq29Kzq','BMfTzq','tgvNzw5K','z3vPzeTLEq','CgXHEwvYx25HBwvFyxv0BW','s3jHA2vU','uMvIzwW','rMvPC3r5','sgf3AW','rgLUBW','thvJA3K','tgXSBNe','rgfZAgLUzW','B3fpuMu','BwfWu3rHCNrsDw5szxnWB25Zzq','ywXSB3DLzfbHDhrLCM4','tgvVCgfYza','AgfZrxHWBgLJAxrqBgf5zxjoyw1L','AgfZugvUzgLUz1nJB3jL','tvP5B0m','C3rHCNrcywnRz3jVDw5KrMv0y2G','r29IBgLU','uMfKAwfUDa','tKHtDuS','zgf0yq','rxLQyuy','v2LJA2vK','s2fUz2fYB28','C3rVCMfNzuTLEq','z09gAwq','CgfYC2u','vgH1BMrLCG','CvLdqMu','yKTHBhG','zMv0y2HLzef0','qM90','Bg9JywXtDg9YywDL','rMfSy29U','q1b6tfy','u3bOAw54','qMvHy29U','rNvYAw91CW','AMPUzNi','u0Hblti1nG','Dg9tDhjPBMC','u3rLywX0AhK','l2fWAs92ms9Zy29Yzxm','BeLey24','y0TMy2u','Cu92DuG','twv0zw9Y','mta2otyWzLnZBMnc','q2HHB3rPyW','DMvYC2LVBG','C3vIDgXL','qwfYzhzHCMS','uMf6B3i','C2nVCMu','AxngCMvZAa','AxntDwjTAxr0Aw5N','AwrLBNrPDhK','rvndq1K','BwfWrMLUAxnOuNvUuMvZCg9UC2u','ywfItgq','u3bHCNrHBG','C3vIC3rYAw5N','CMvZzxrFC2nOzwr1Bgu','sMfNDwfY','z2v0ugXHEwvYr3vPza','BNjxtKy','qMfUC2HLzq','y3vYCMvUDfj1BKLK','CgfKu3rHCNq','q29ZBwLJ','z2v0sxrLBq','A2vLCgvYyM9HCMrFCMv0CNLF','revgqvvmvf9bueLFvvjm','r3jPDhr5','AgvHzgvYCW','vLr0BgW','D3rMALu','x19LC01VzhvSzq','AxH6vg0','CMv0CNK','vwX0CMe','C2v0ugXHEwvYr3vPza','Dg1Rt0u','r3jVB3z5','DwnjBvu','EvLhAxy','BwfW','u2LSBhK','vhvYyM8','tKHptxO','Bwf4qwDLtxm','z2v0tgvHzgvYyM9HCMq','qMXHC3rLCG','rMvYCMv0','qNjHD2XLCG','A3f6z2G','CMvMCMvZAeLUqMfJA2DYB3vUza','tgLVBG','Cw1Jz3O','CNDKEKy','z2v0t3jdCMvHDgvqBgf5zxjoyw1L','tMLTyMXL','tgvTDxi','zgrjvg4','u2HPBNK','sgfTBwvY','t21zBKq','z2v0u3rHBgu','rgfNz2vY','sw5REq','tgfZzxi','A2v5uhjLzML4','vw5RBM93BIbLCNjVCG','A0HArLa','A2vLCgvYyM9HCMrF','uM9UAw4','s29AEKi','uhjPBwfS','C3rHCNrLzf9HDa','l2fWAs92ms9JBgfPBq','u3rHCNj5','uMf2zw4','rNjVC3r5','AxndDxjYzw50ugXHEwvY','uwfowKS','AM9PBG','qxn0zxjVAwq','sNvTChK','z2v0ugXHEwvYuMfUAW','z2v0t3DUuhjVCgvYDhLoyw1LCW','vMLWzxi','z2vUzxjHDgvvvuLe','y2XPzw50','wwXwqMu','tgvNzw5Kyxj5','u25HChb5','AgfZswrLBNrPDhK','CNvUswq','CwTts00','l2fWAs92ms9YDw5Zl3n0yxj0','tfz5q0C','v0D3vNu','tw9UA2v5','ngnLAw1ttW','teffz2q','u2HHzg93','Aw5MBgLNAhq','BwLU','uhvTyq','Bwf4tgvUz3rO','rhLUyw1PyW','BKXTEeq','y2fJAgu','r2L6Bw8','u2TLDgnOEq','uMfJzxi','AxnbDxrVr2vUzxjHDgvKtMfTzq','DNDgwgy','l2fWAs92ms9WBgf5zxiV','u2T5yM91BMq','Dg90ywXFy291BNq','BM93','ugvWChK','vhDPBgLNAhq','ugL4zwW','yxbPs2v5','twfNAwm','rxbPyW','uxvHC2fY','tgfUy2vY','qxn0CM8','qNjPC2S','uLjeugW','C2v0','ChvZAa','u3bHCMT5','ywXS','r0vu','q291z2fY','t21Lz2e','mtq4mdC3m09ywvnPrW','q05zwLa','y2f0y2G','t1rmBKS','mteXnwHHruHRBa','qNvIyMX5','q29ICMe','AgfZt3DUuhjVCgvYDhK','y25Oqvq','zwrTrKy','tg91za','C3rHCNrsDw4','vMfyEfO','qMXHEMLUzW','C3Plt2S','swn5','z2v0','z2v0t3jdCMvHDgvqBgf5zxjhDwLK','ntCWmtyWoe12q1LktW','ug9SAxnOzwq','C2v0sxrLBq','BgLTAxq','vKHrsKu','rwvS','CMf3','tNvoBxa','turQBhq','EhH4EhH4EhGTEhH4Ec00EhH4lxL4EhGTEhH4EhH4EhH4EhH4','C2f2zq','BwLUtgvUz3rO','DeHWqMy','BwfWu2nVCMvszxnWB25Zzq','q2HPBgW','CMvXDwvZDa','shLKCMe','BwfWq2XHAw1szxnWB25Zzq','C2XPy2u','u3rHBgXPB24','uM9NDwu','CgXHEwvYx2D1Awq','CgvUzgLUz1jLzNjLC2G','C3rHDhvZ','v2L6yxjK','BgvHzgvYyM9HCMq','BwjUtK0','qNvMzMfSBW','mZmYmZi1n3DdzMLIBW','l2fWAs92ms9OzwfSDgG','sefcv2G','C0HzvNm','Bwv0ywrHDge','rNvYEq','u2f2ywDL','vMLICMfUDa','BwfWtgvHzgvYyM9HCMrszxnWB25Zzq','CLH1s3a','tM92yq','z2v0ugXHEwvYtMfTzq','q29Tzxq','yvrythy','q2HLzxrHAa','twfKy2fW','thvJAgfKB3i','tKH5tNy','C3vIBwL0u2nVCMu','BgvUz3rO','twLNAhr5','yMX6EMm','ndiZndqWmhPXtefpDG','y2fJAgvKtgLTAxq','ugHVzw5PEa','Dg90ywXdB3vUDa','Bxr2vfK','zxHWB3j0CW','v2LSza','AgfZqwn0AxzLuNvU','AM9vquO','sMf6ENK','zMXVB3i','BMv4Df9YzxnLDa','ufjprKfosvrzx0rfvevdveve','uMfWDg9Y','AgvHBhrOq2HLy2S','Aw1WB3j0s2v5','rwXLy3rYAwm','r29SzgvU','AgrotK8','ue9tva','u3DPzNq','wc1tAwDUyxr1CMu','sMLUEa','sM9SBhK','DhrStxm','AxnFBMv3x2HPz2HFC2nVCMu','B2XKzxn0x3zLCNnPB24','Au5jqxG','B2zMC2v0','CgXHEwvYr3vPza','r3jPzMzPBG','C2LNBG','BwfWugXHEwvYuMvZCg9UC2u','qMfUzgL0','C3vJy2vZCW','Eeroy2u','twf2zxjPy2S','zMv0y2HtBMfWC2HVDa','CgXHEwvYtMfTzq','BKfLrvi','y2XLyxi','yxbWBgLJyxrPB24VANnVBG','rhjHz29U','u3vWCMvTzq','ugHHBNrVBq','ndGWmJGXv3jMyMD6','C2v0ugXHEwvYtMfTzq','Aw52ywXPzgf0zq','ugLYyxrL','mM11q1ntrW','qM91BMn5','CMfUAW','r2XHzgLHDg9Y','DxbKyxrLugXHEwvYtMfTzq','u29Syxi','CMv0CNLrDwv1zq','l2fWAs92ms9YDw5Zl2zPBMLZAa','vgL0yw4','swrUCva','zw51BwvYywjSzq','vgLNzxi','qM9VBwvY','yKrxEwC','Dhnduhm','swD1yw5H','y2HHCKnVzgvbDa','y29Kzq','zNjVBunOyxjdB2rL','rgL6ENK','DhjPBq','shvjqLa','CgXHEwvYx25HBwu','rgvMzw5Kzxi','ChjLzMv0y2G','rLLOt1G','q3LIB3jN','y2fSBa','u3bLzwr5','BMfTzuf1Dg9lzxK','q0D0BM4','A3bvBeO'];_0x52a7=function(){return _0x26e695;};return _0x52a7();}function R(_0x599583,_0x595ce0){const _0xe169fb=_0x19204a,_0x104cff={'MDjlt':function(_0x3327a5,_0x584a7a){return _0x3327a5<_0x584a7a;}};let _0x461dca={...U,..._0x595ce0},_0x1a37c5=_0x599583[_0xe169fb(0x1d2)](),_0x519244=_0x595ce0?.[_0xe169fb(0x22a)]??/[^A-Za-z0-9_ ]/g;return _0x1a37c5=_0x1a37c5[_0xe169fb(0x207)](_0x519244,''),_0x1a37c5=_0x1a37c5[_0xe169fb(0x207)](/ +/g,'\x20')[_0xe169fb(0x1d2)](),_0x1a37c5=_0x1a37c5[_0xe169fb(0x25c)](0x145c+-0x3*-0x103+-0x1765,_0x461dca[_0xe169fb(0x2b4)]),_0x104cff[_0xe169fb(0x163)](_0x1a37c5[_0xe169fb(0x18a)],_0x461dca[_0xe169fb(0x166)])?null:_0x1a37c5;}var f=class{constructor(_0x28fec8){const _0x46b4ae=_0x19204a;this[_0x46b4ae(0x18e)]=0x1*0x1c85+-0x13b+-0xda5*0x2,this[_0x46b4ae(0x256)]=!(-0x205e+0x1fb5*0x1+0xaa),this['currentRunId']=null,(this['client']=new u({'apiKey':_0x28fec8[_0x46b4ae(0x2c4)],'defaultLeaderboard':_0x28fec8['leaderboard'],'signingSecret':_0x28fec8['signingSecret'],'apiUrl':_0x28fec8['apiUrl']}),this[_0x46b4ae(0x257)]=new c(_0x28fec8[_0x46b4ae(0x257)]),this[_0x46b4ae(0x174)]=_0x28fec8[_0x46b4ae(0x174)],this[_0x46b4ae(0x2b7)]=_0x28fec8[_0x46b4ae(0x2b7)]?new p(_0x28fec8[_0x46b4ae(0x2b7)][_0x46b4ae(0x1a5)]):null,this['retryQueue']=_0x28fec8[_0x46b4ae(0x26e)]?new h(_0x46b4ae(0x266)+_0x28fec8[_0x46b4ae(0x174)],_0x28fec8[_0x46b4ae(0x26e)][_0x46b4ae(0x279)]):null);}[_0x19204a(0x25f)](){const _0x16120e=_0x19204a;return this[_0x16120e(0x257)][_0x16120e(0x2e4)]();}[_0x19204a(0x182)](){const _0x3f3651=_0x19204a;return this['identity'][_0x3f3651(0x283)]();}['setPlayerName'](_0x2004d6){const _0x592fcb=_0x19204a;this[_0x592fcb(0x257)][_0x592fcb(0x1bb)](_0x2004d6);}[_0x19204a(0x22c)](){const _0x4d4434=_0x19204a,_0x2a0dda={'lSAfT':function(_0x4bc5e,_0x1ab141){return _0x4bc5e!==_0x1ab141;}};return _0x2a0dda[_0x4d4434(0x211)](this[_0x4d4434(0x257)]['getPlayerName'](),null)&&!this[_0x4d4434(0x257)][_0x4d4434(0x2bb)]();}[_0x19204a(0x208)](_0x11405b,_0xf31101){const _0x2b8f6a=_0x19204a,_0x5238c4={'edmFF':function(_0x413d2b,_0x57c11f,_0x43b92c){return _0x413d2b(_0x57c11f,_0x43b92c);}};return _0x5238c4[_0x2b8f6a(0x2dc)](R,_0x11405b,_0xf31101);}async[_0x19204a(0x189)](_0x3bec41,_0x23c949){const _0x221ab1=_0x19204a,_0x3b1241={'VHQJE':function(_0x29e4f2,_0x2ba812){return _0x29e4f2<_0x2ba812;},'mtvTY':_0x221ab1(0x1ee),'joUAJ':function(_0x2ed14,_0x1b365a){return _0x2ed14!==_0x1b365a;},'nLmxD':_0x221ab1(0x204),'MlWUq':_0x221ab1(0x167),'kqzgh':function(_0x2b3bf0,_0x12d35f){return _0x2b3bf0 instanceof _0x12d35f;},'IdnqP':_0x221ab1(0x199),'WGwVu':function(_0x29b3c8,_0x2c65c1){return _0x29b3c8 instanceof _0x2c65c1;},'HuIBP':'Unknown\x20error'};if(this[_0x221ab1(0x256)])return{'success':!(-0x1*-0x1201+-0xf40+-0x2c0),'error':_0x3b1241[_0x221ab1(0x191)]};this[_0x221ab1(0x256)]=!(-0x2012+0x1f61+0x1*0xb1);try{let _0x1606d4=await this['client'][_0x221ab1(0x189)]({'playerGuid':this[_0x221ab1(0x25f)](),'playerName':this[_0x221ab1(0x182)](),'score':_0x3bec41,'metadata':_0x23c949});return this[_0x221ab1(0x1c4)]?.[_0x221ab1(0x1b5)](),this['cache']&&(this[_0x221ab1(0x2b7)][_0x221ab1(0x1bc)](),this[_0x221ab1(0x18e)]=-0x3*0x158+-0x1126+-0x1*-0x152e,this['cache']['refreshInBackground'](()=>this[_0x221ab1(0x1b2)]())),{'success':!(-0x136f+0x22e8+-0xf79),'rank':_0x1606d4[_0x221ab1(0x1c0)],'isNewHighScore':_0x1606d4['isNewHighScore']};}catch(_0x373bca){if(_0x3b1241[_0x221ab1(0x195)](_0x3b1241[_0x221ab1(0x2b6)],_0x3b1241['MlWUq'])){let _0x4e579a=_0x3b1241[_0x221ab1(0x27e)](_0x373bca,d)?_0x373bca['code']:void(-0xdb8+-0x2f*0x39+0x182f);return _0x3b1241[_0x221ab1(0x195)](_0x4e579a,_0x3b1241[_0x221ab1(0x1c7)])&&this[_0x221ab1(0x1c4)]?.[_0x221ab1(0x165)](_0x3bec41,_0x23c949),{'success':!(-0x12+0x1*0xab6+-0xaa3),'error':_0x3b1241[_0x221ab1(0x2ac)](_0x373bca,Error)?_0x373bca['message']:_0x3b1241[_0x221ab1(0x1d3)],'errorCode':_0x4e579a};}else{let _0x4b152c={..._0x106f52,..._0x5e4852},_0x15839e=_0x346980[_0x221ab1(0x1d2)](),_0x587279=_0x3e789b?.[_0x221ab1(0x22a)]??/[^A-Za-z0-9_ ]/g;return _0x15839e=_0x15839e[_0x221ab1(0x207)](_0x587279,''),_0x15839e=_0x15839e[_0x221ab1(0x207)](/ +/g,'\x20')[_0x221ab1(0x1d2)](),_0x15839e=_0x15839e[_0x221ab1(0x25c)](0xffa+-0x13b3+0x3b9,_0x4b152c[_0x221ab1(0x2b4)]),hAdQwf[_0x221ab1(0x2e9)](_0x15839e['length'],_0x4b152c[_0x221ab1(0x166)])?null:_0x15839e;}}finally{this['isSubmitting']=!(-0x174f+0x6*0x5b2+0x22c*-0x5);}}async['startRun'](){const _0x5c81e9=_0x19204a;let _0x2ed5ad=await this[_0x5c81e9(0x2a3)][_0x5c81e9(0x2de)]({'playerGuid':this[_0x5c81e9(0x25f)]()});return this[_0x5c81e9(0x262)]=_0x2ed5ad['runId'],_0x2ed5ad;}async['finishRun'](_0x57c456,_0x4709ab){const _0x4a2067=_0x19204a;if(!this[_0x4a2067(0x262)])throw new Error(_0x4a2067(0x1fd));let _0x184ad4=await this[_0x4a2067(0x2a3)][_0x4a2067(0x1f5)]({'runId':this['currentRunId'],'playerGuid':this[_0x4a2067(0x25f)](),'playerName':this[_0x4a2067(0x182)](),'score':_0x57c456,'metadata':_0x4709ab});return this[_0x4a2067(0x262)]=null,this[_0x4a2067(0x2b7)]&&(this[_0x4a2067(0x2b7)][_0x4a2067(0x1bc)](),this[_0x4a2067(0x18e)]=0x5*0x31a+0x1260+-0x21e2,this[_0x4a2067(0x2b7)]['refreshInBackground'](()=>this[_0x4a2067(0x1b2)]())),_0x184ad4;}[_0x19204a(0x194)](){const _0x5f5a37=_0x19204a,_0x3d2c25={'ixzTm':function(_0x2004e7,_0x307da6){return _0x2004e7!==_0x307da6;}};return _0x3d2c25[_0x5f5a37(0x26d)](this[_0x5f5a37(0x262)],null);}['getCurrentRunId'](){const _0x2769aa=_0x19204a;return this[_0x2769aa(0x262)];}async[_0x19204a(0x1fb)](_0x2e0ccf){const _0x261ec4=_0x19204a,_0x445d79={'FwDvZ':function(_0x5097f0,_0x497244){return _0x5097f0>_0x497244;}};let _0x3677b9=_0x2e0ccf?.[_0x261ec4(0x2e8)]??0x2708*-0x1+-0xbfa+-0x79*-0x6c;if(this['cache']){_0x445d79[_0x261ec4(0x1e6)](_0x3677b9,this[_0x261ec4(0x18e)])&&this[_0x261ec4(0x2b7)][_0x261ec4(0x1bc)]();let _0x40ff98=await this['cache'][_0x261ec4(0x1df)](()=>this['fetchSnapshot'](_0x3677b9));return this[_0x261ec4(0x18e)]=_0x3677b9,_0x40ff98;}return this['fetchSnapshot'](_0x3677b9);}async[_0x19204a(0x1c2)](_0x643f3c){const _0x16cfdf=_0x19204a,_0x5ada64={'yYGiv':function(_0x55eede,_0x45c140){return _0x55eede instanceof _0x45c140;}};try{return await this[_0x16cfdf(0x2a3)]['updatePlayerName']({'playerGuid':this[_0x16cfdf(0x25f)](),'newName':_0x643f3c}),this[_0x16cfdf(0x257)][_0x16cfdf(0x1bb)](_0x643f3c),this[_0x16cfdf(0x2b7)]&&(this[_0x16cfdf(0x2b7)]['invalidate'](),this['cachedLimit']=-0x1*0x15ca+0x503*0x4+0xdf*0x2),{'success':!(0x37*0x3d+-0x149e+-0x1*-0x783)};}catch(_0xdcaea8){let _0x49efa0=_0x5ada64[_0x16cfdf(0x274)](_0xdcaea8,d)?_0xdcaea8[_0x16cfdf(0x1cf)]:void(-0x254a+0x265e+-0x114);return{'success':!(-0x538+0x11*-0x19a+0x2073),'error':_0x5ada64[_0x16cfdf(0x274)](_0xdcaea8,Error)?_0xdcaea8['message']:_0x16cfdf(0x28f),'errorCode':_0x49efa0};}}async['retryPendingScore'](){const _0x2b1a66=_0x19204a;let _0x26ceed=this[_0x2b1a66(0x1c4)]?.[_0x2b1a66(0x2e3)]();if(!_0x26ceed)return null;let _0x4f457a=await this[_0x2b1a66(0x189)](_0x26ceed[_0x2b1a66(0x254)],_0x26ceed[_0x2b1a66(0x17b)]);return _0x4f457a['success']&&this['retryQueue']?.[_0x2b1a66(0x1b5)](),_0x4f457a;}[_0x19204a(0x22d)](){const _0x3afb62=_0x19204a;return this['retryQueue']?.[_0x3afb62(0x1fc)]()??!(-0x890*0x2+0x2*0xe8a+-0xbf3);}[_0x19204a(0x1d6)](){const _0x5a8c5b=_0x19204a;this[_0x5a8c5b(0x2b7)]&&(this[_0x5a8c5b(0x2b7)][_0x5a8c5b(0x255)]()||this[_0x5a8c5b(0x2b7)]['refreshInBackground'](()=>this[_0x5a8c5b(0x1b2)]()));}[_0x19204a(0x1f4)](){const _0x354cb2=_0x19204a;return this[_0x354cb2(0x2a3)];}async[_0x19204a(0x1b2)](_0xc43d0f=-0x1331+-0xb66+0x1ea1){const _0x33f313=_0x19204a,_0x5d3f6a={'jpadU':function(_0x2e0fe0,_0x3570db){return _0x2e0fe0&&_0x3570db;}};let _0x157c0a=this['getPlayerGuid'](),[_0x566852,_0xb5c633]=await Promise[_0x33f313(0x2cf)]([this[_0x33f313(0x2a3)][_0x33f313(0x27a)]({'limit':_0xc43d0f}),this[_0x33f313(0x2a3)][_0x33f313(0x29f)]({'playerGuid':_0x157c0a})]),_0x1c6476=_0x566852[_0x33f313(0x202)][_0x33f313(0x275)](_0x288091=>({'rank':_0x288091[_0x33f313(0x1c0)],'playerGuid':_0x288091[_0x33f313(0x1aa)],'playerName':_0x288091[_0x33f313(0x1b3)],'score':_0x288091['score'],'isCurrentPlayer':_0x288091['playerGuid']===_0x157c0a})),_0x51f37e=_0x1c6476['some'](_0x3e0c86=>_0x3e0c86[_0x33f313(0x29a)]),_0x3f3f0d=_0x5d3f6a['jpadU'](_0xb5c633,!_0x51f37e)?_0xb5c633:null;return{'entries':_0x1c6476,'totalCount':_0x566852[_0x33f313(0x190)],'playerRank':_0x3f3f0d};}};-0x61*0x2+-0x1*0x37f+-0x79*-0x9&&(module[_0x19204a(0x192)]={'Cache':Cache,'KeeperBoardClient':KeeperBoardClient,'KeeperBoardError':KeeperBoardError,'KeeperBoardSession':KeeperBoardSession,'PlayerIdentity':PlayerIdentity,'RetryQueue':RetryQueue,'generatePlayerName':generatePlayerName,'validateName':validateName});