valtech-components 4.0.506 → 4.0.508

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.
@@ -1,12 +1,14 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
2
  import { Auth } from '@angular/fire/auth';
3
- import { Firestore, collection, doc, getDoc, limit, onSnapshot, orderBy, query, serverTimestamp, setDoc, where, } from '@angular/fire/firestore';
3
+ import { Firestore, collection, doc, getDoc, limit, onSnapshot, orderBy, query, serverTimestamp, setDoc, writeBatch, } from '@angular/fire/firestore';
4
4
  import { Observable, of } from 'rxjs';
5
5
  import { FirebaseService } from '../../../services/firebase/firebase.service';
6
+ import { chooseActiveChessimalsChallengeRun, normalizeChessimalsChallengeRun } from './chessimals-challenge-state';
6
7
  import * as i0 from "@angular/core";
7
8
  const EMPTY_POWERS = { eagle: 0, bull: 0, kangaroo: 0, lion: 0 };
8
9
  const EMPTY_MODE_RECORD = { played: 0, wins: 0, losses: 0 };
9
10
  const LOCAL_ACTIVE_RUN_KEY = 'chessimals.challenge.activeRun';
11
+ const ACTIVE_RUN_QUERY_LIMIT = 12;
10
12
  export class ChessimalsChallengeProgressService {
11
13
  constructor() {
12
14
  this.firebaseAuth = inject(Auth);
@@ -31,38 +33,40 @@ export class ChessimalsChallengeProgressService {
31
33
  return of([]);
32
34
  const runsQuery = query(collection(this.firestore, this.runsPath(uid)), orderBy('updatedAt', 'desc'), limit(limitCount));
33
35
  return new Observable((subscriber) => {
34
- const unsubscribe = onSnapshot(runsQuery, (snapshot) => subscriber.next(snapshot.docs.map((item) => item.data())), (error) => subscriber.error(error));
36
+ const unsubscribe = onSnapshot(runsQuery, (snapshot) => subscriber.next(snapshot.docs.map((item) => this.normalizeRun(item.data()))), (error) => subscriber.error(error));
35
37
  return unsubscribe;
36
38
  });
37
39
  }
38
40
  watchActiveRun() {
39
41
  const uid = this.currentUid;
40
42
  if (!uid)
41
- return of(this.readLocalActiveRun());
42
- const activeQuery = query(collection(this.firestore, this.runsPath(uid)), where('status', '==', 'active'), limit(1));
43
+ return of(undefined);
44
+ const activeQuery = query(collection(this.firestore, this.runsPath(uid)), orderBy('updatedAt', 'desc'), limit(ACTIVE_RUN_QUERY_LIMIT));
43
45
  return new Observable((subscriber) => {
44
- subscriber.next(this.readLocalActiveRun());
46
+ subscriber.next(this.readLocalActiveRun(uid));
45
47
  const unsubscribe = onSnapshot(activeQuery, (snapshot) => {
46
- const run = snapshot.docs[0]?.data();
47
- this.writeLocalActiveRun(run);
48
+ const run = chooseActiveChessimalsChallengeRun(snapshot.docs.map((item) => item.data()), uid);
49
+ this.writeLocalActiveRun(uid, run);
48
50
  subscriber.next(run);
49
- }, () => subscriber.next(this.readLocalActiveRun()));
51
+ }, () => subscriber.next(this.readLocalActiveRun(uid)));
50
52
  return unsubscribe;
51
53
  });
52
54
  }
53
55
  async saveRun(run) {
54
- this.writeLocalActiveRun(run.status === 'active' ? run : undefined);
55
56
  const uid = await this.ensureUser();
56
- await setDoc(this.runRef(uid, run.id), this.withoutUndefined({
57
- ...run,
57
+ const normalizedRun = this.normalizeRun(run, uid);
58
+ this.writeLocalActiveRun(uid, normalizedRun.status === 'active' ? normalizedRun : undefined);
59
+ await setDoc(this.runRef(uid, normalizedRun.id), this.withoutUndefined({
60
+ ...normalizedRun,
58
61
  userId: uid,
59
62
  updatedAt: new Date().toISOString(),
60
63
  updatedAtServer: serverTimestamp(),
61
64
  }), { merge: true });
62
65
  }
63
66
  async recordChallengeStarted(run) {
64
- this.writeLocalActiveRun(run);
65
67
  const uid = await this.ensureUser();
68
+ const normalizedRun = this.normalizeRun(run, uid);
69
+ this.writeLocalActiveRun(uid, normalizedRun);
66
70
  const current = await this.readStats(uid);
67
71
  await setDoc(this.statsRef(uid), {
68
72
  ...current,
@@ -71,16 +75,17 @@ export class ChessimalsChallengeProgressService {
71
75
  updatedAt: new Date().toISOString(),
72
76
  updatedAtServer: serverTimestamp(),
73
77
  }, { merge: true });
74
- await this.saveRun(run);
78
+ await this.saveRun(normalizedRun);
75
79
  }
76
80
  async applyRoundResult(args) {
77
81
  const uid = await this.ensureUser();
78
82
  const current = await this.readStats(uid);
83
+ const normalizedRun = this.normalizeRun(args.run, uid);
79
84
  const next = {
80
85
  userId: uid,
81
86
  challengesPlayed: current.challengesPlayed,
82
87
  challengesCompleted: current.challengesCompleted + (args.completed ? 1 : 0),
83
- bestWinStreak: Math.max(current.bestWinStreak, args.run.bestStreakInRun),
88
+ bestWinStreak: Math.max(current.bestWinStreak, normalizedRun.bestStreakInRun),
84
89
  bestRoundReached: Math.max(current.bestRoundReached, args.roundReached),
85
90
  totalWins: current.totalWins + (args.won ? 1 : 0),
86
91
  totalLosses: current.totalLosses + (args.won ? 0 : 1),
@@ -103,8 +108,15 @@ export class ChessimalsChallengeProgressService {
103
108
  },
104
109
  updatedAt: new Date().toISOString(),
105
110
  };
106
- await setDoc(this.statsRef(uid), { ...next, updatedAtServer: serverTimestamp() }, { merge: true });
107
- await this.saveRun(args.run);
111
+ const batch = writeBatch(this.firestore);
112
+ batch.set(this.statsRef(uid), { ...next, updatedAtServer: serverTimestamp() }, { merge: true });
113
+ batch.set(this.runRef(uid, normalizedRun.id), this.withoutUndefined({
114
+ ...normalizedRun,
115
+ userId: uid,
116
+ updatedAtServer: serverTimestamp(),
117
+ }), { merge: true });
118
+ await batch.commit();
119
+ this.writeLocalActiveRun(uid, normalizedRun.status === 'active' ? normalizedRun : undefined);
108
120
  }
109
121
  async recordModeResult(mode, won) {
110
122
  const uid = await this.ensureUser();
@@ -157,6 +169,9 @@ export class ChessimalsChallengeProgressService {
157
169
  modeStats: this.normalizeModeStats(value),
158
170
  };
159
171
  }
172
+ normalizeRun(value, uid = value.userId) {
173
+ return normalizeChessimalsChallengeRun(value, uid);
174
+ }
160
175
  addModeResult(current, won) {
161
176
  return {
162
177
  played: current.played + 1,
@@ -208,30 +223,34 @@ export class ChessimalsChallengeProgressService {
208
223
  runsPath(uid) {
209
224
  return `users/${uid}/miniGames/chessimals/challengeRuns`;
210
225
  }
211
- readLocalActiveRun() {
226
+ readLocalActiveRun(uid) {
212
227
  try {
213
- const raw = localStorage.getItem(LOCAL_ACTIVE_RUN_KEY);
228
+ const raw = localStorage.getItem(this.localActiveRunKey(uid));
214
229
  if (!raw)
215
230
  return undefined;
216
- const run = JSON.parse(raw);
217
- return run.status === 'active' ? run : undefined;
231
+ const run = this.normalizeRun(JSON.parse(raw), uid);
232
+ return run.status === 'active' && run.userId === uid ? run : undefined;
218
233
  }
219
234
  catch {
220
235
  return undefined;
221
236
  }
222
237
  }
223
- writeLocalActiveRun(run) {
238
+ writeLocalActiveRun(uid, run) {
224
239
  try {
225
240
  if (run?.status === 'active') {
226
- localStorage.setItem(LOCAL_ACTIVE_RUN_KEY, JSON.stringify(run));
241
+ localStorage.setItem(this.localActiveRunKey(uid), JSON.stringify(this.normalizeRun(run, uid)));
227
242
  return;
228
243
  }
229
- localStorage.removeItem(LOCAL_ACTIVE_RUN_KEY);
244
+ localStorage.removeItem(this.localActiveRunKey(uid));
230
245
  }
231
246
  catch {
232
247
  // Local persistence is only a refresh fallback.
233
248
  }
234
249
  }
250
+ localActiveRunKey(uid) {
251
+ const host = typeof location === 'undefined' ? 'local' : location.host || 'local';
252
+ return `${LOCAL_ACTIVE_RUN_KEY}.${host}.${uid}`;
253
+ }
235
254
  withoutUndefined(value) {
236
255
  return Object.entries(value).reduce((acc, [key, entry]) => {
237
256
  if (entry !== undefined)
@@ -246,4 +265,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
246
265
  type: Injectable,
247
266
  args: [{ providedIn: 'root' }]
248
267
  }] });
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlc3NpbWFscy1jaGFsbGVuZ2UtcHJvZ3Jlc3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWluaS1nYW1lcy9jaGVzc2ltYWxzLWNoYWxsZW5nZS1wcm9ncmVzcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLEtBQUssRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLEtBQUssR0FDTixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7QUFROUUsTUFBTSxZQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDNUQsTUFBTSxvQkFBb0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQUc5RCxNQUFNLE9BQU8sa0NBQWtDO0lBRC9DO1FBRW1CLGlCQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7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QyxjQURyQixNQUFNOzs0RkFDbkIsa0NBQWtDO2tCQUQ5QyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvYXV0aCc7XG5pbXBvcnQge1xuICBGaXJlc3RvcmUsXG4gIGNvbGxlY3Rpb24sXG4gIGRvYyxcbiAgZ2V0RG9jLFxuICBsaW1pdCxcbiAgb25TbmFwc2hvdCxcbiAgb3JkZXJCeSxcbiAgcXVlcnksXG4gIHNlcnZlclRpbWVzdGFtcCxcbiAgc2V0RG9jLFxuICB3aGVyZSxcbn0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9maXJlc3RvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmlyZWJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZSc7XG5pbXBvcnQge1xuICBDaGVzc2ltYWxzQ2hhbGxlbmdlUm91bmRTdGF0cyxcbiAgQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1bixcbiAgQ2hlc3NpbWFsc0NoYWxsZW5nZVN0YXRzLFxuICBDaGVzc2ltYWxzU3RhdHNNb2RlLFxufSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgRU1QVFlfUE9XRVJTID0geyBlYWdsZTogMCwgYnVsbDogMCwga2FuZ2Fyb286IDAsIGxpb246IDAgfTtcbmNvbnN0IEVNUFRZX01PREVfUkVDT1JEID0geyBwbGF5ZWQ6IDAsIHdpbnM6IDAsIGxvc3NlczogMCB9O1xuY29uc3QgTE9DQUxfQUNUSVZFX1JVTl9LRVkgPSAnY2hlc3NpbWFscy5jaGFsbGVuZ2UuYWN0aXZlUnVuJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDaGVzc2ltYWxzQ2hhbGxlbmdlUHJvZ3Jlc3NTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaXJlYmFzZUF1dGggPSBpbmplY3QoQXV0aCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZXN0b3JlID0gaW5qZWN0KEZpcmVzdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZWJhc2UgPSBpbmplY3QoRmlyZWJhc2VTZXJ2aWNlKTtcblxuICBnZXQgY3VycmVudFVpZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpcmViYXNlQXV0aC5jdXJyZW50VXNlcj8udWlkO1xuICB9XG5cbiAgd2F0Y2hTdGF0cygpOiBPYnNlcnZhYmxlPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHVpZCA9IHRoaXMuY3VycmVudFVpZDtcbiAgICBpZiAoIXVpZCkgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IG9uU25hcHNob3QoXG4gICAgICAgIHRoaXMuc3RhdHNSZWYodWlkKSxcbiAgICAgICAgKHNuYXBzaG90KSA9PiBzdWJzY3JpYmVyLm5leHQoXG4gICAgICAgICAgc25hcHNob3QuZXhpc3RzKCkgPyB0aGlzLm5vcm1hbGl6ZVN0YXRzKHNuYXBzaG90LmRhdGEoKSBhcyBQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4pIDogdW5kZWZpbmVkLFxuICAgICAgICApLFxuICAgICAgICAoZXJyb3IpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgICB9KTtcbiAgfVxuXG4gIHdhdGNoUmVjZW50UnVucyhsaW1pdENvdW50ID0gNCk6IE9ic2VydmFibGU8Q2hlc3NpbWFsc0NoYWxsZW5nZVJ1bltdPiB7XG4gICAgY29uc3QgdWlkID0gdGhpcy5jdXJyZW50VWlkO1xuICAgIGlmICghdWlkKSByZXR1cm4gb2YoW10pO1xuICAgIGNvbnN0IHJ1bnNRdWVyeSA9IHF1ZXJ5KFxuICAgICAgY29sbGVjdGlvbih0aGlzLmZpcmVzdG9yZSwgdGhpcy5ydW5zUGF0aCh1aWQpKSxcbiAgICAgIG9yZGVyQnkoJ3VwZGF0ZWRBdCcsICdkZXNjJyksXG4gICAgICBsaW1pdChsaW1pdENvdW50KSxcbiAgICApO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBvblNuYXBzaG90KFxuICAgICAgICBydW5zUXVlcnksXG4gICAgICAgIChzbmFwc2hvdCkgPT4gc3Vic2NyaWJlci5uZXh0KHNuYXBzaG90LmRvY3MubWFwKChpdGVtKSA9PiBpdGVtLmRhdGEoKSBhcyBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuKSksXG4gICAgICAgIChlcnJvcikgPT4gc3Vic2NyaWJlci5lcnJvcihlcnJvciksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0pO1xuICB9XG5cbiAgd2F0Y2hBY3RpdmVSdW4oKTogT2JzZXJ2YWJsZTxDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgdWlkID0gdGhpcy5jdXJyZW50VWlkO1xuICAgIGlmICghdWlkKSByZXR1cm4gb2YodGhpcy5yZWFkTG9jYWxBY3RpdmVSdW4oKSk7XG4gICAgY29uc3QgYWN0aXZlUXVlcnkgPSBxdWVyeShcbiAgICAgIGNvbGxlY3Rpb24odGhpcy5maXJlc3RvcmUsIHRoaXMucnVuc1BhdGgodWlkKSksXG4gICAgICB3aGVyZSgnc3RhdHVzJywgJz09JywgJ2FjdGl2ZScpLFxuICAgICAgbGltaXQoMSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIHN1YnNjcmliZXIubmV4dCh0aGlzLnJlYWRMb2NhbEFjdGl2ZVJ1bigpKTtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb25TbmFwc2hvdChcbiAgICAgICAgYWN0aXZlUXVlcnksXG4gICAgICAgIChzbmFwc2hvdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJ1biA9IHNuYXBzaG90LmRvY3NbMF0/LmRhdGEoKSBhcyBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMud3JpdGVMb2NhbEFjdGl2ZVJ1bihydW4pO1xuICAgICAgICAgIHN1YnNjcmliZXIubmV4dChydW4pO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiBzdWJzY3JpYmVyLm5leHQodGhpcy5yZWFkTG9jYWxBY3RpdmVSdW4oKSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVJ1bihydW46IENoZXNzaW1hbHNDaGFsbGVuZ2VSdW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLndyaXRlTG9jYWxBY3RpdmVSdW4ocnVuLnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyBydW4gOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGF3YWl0IHNldERvYyh0aGlzLnJ1blJlZih1aWQsIHJ1bi5pZCksIHRoaXMud2l0aG91dFVuZGVmaW5lZCh7XG4gICAgICAuLi5ydW4sXG4gICAgICB1c2VySWQ6IHVpZCxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdXBkYXRlZEF0U2VydmVyOiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICB9KSwgeyBtZXJnZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlY29yZENoYWxsZW5nZVN0YXJ0ZWQocnVuOiBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy53cml0ZUxvY2FsQWN0aXZlUnVuKHJ1bik7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMucmVhZFN0YXRzKHVpZCk7XG4gICAgYXdhaXQgc2V0RG9jKHRoaXMuc3RhdHNSZWYodWlkKSwge1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHVzZXJJZDogdWlkLFxuICAgICAgY2hhbGxlbmdlc1BsYXllZDogY3VycmVudC5jaGFsbGVuZ2VzUGxheWVkICsgMSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdXBkYXRlZEF0U2VydmVyOiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICB9LCB7IG1lcmdlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVJ1bihydW4pO1xuICB9XG5cbiAgYXN5bmMgYXBwbHlSb3VuZFJlc3VsdChhcmdzOiB7XG4gICAgcnVuOiBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuO1xuICAgIHJvdW5kUmVhY2hlZDogbnVtYmVyO1xuICAgIHdvbjogYm9vbGVhbjtcbiAgICBjb21wbGV0ZWQ6IGJvb2xlYW47XG4gICAgcm91bmRTdGF0czogQ2hlc3NpbWFsc0NoYWxsZW5nZVJvdW5kU3RhdHM7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1aWQgPSBhd2FpdCB0aGlzLmVuc3VyZVVzZXIoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5yZWFkU3RhdHModWlkKTtcbiAgICBjb25zdCBuZXh0OiBDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHMgPSB7XG4gICAgICB1c2VySWQ6IHVpZCxcbiAgICAgIGNoYWxsZW5nZXNQbGF5ZWQ6IGN1cnJlbnQuY2hhbGxlbmdlc1BsYXllZCxcbiAgICAgIGNoYWxsZW5nZXNDb21wbGV0ZWQ6IGN1cnJlbnQuY2hhbGxlbmdlc0NvbXBsZXRlZCArIChhcmdzLmNvbXBsZXRlZCA/IDEgOiAwKSxcbiAgICAgIGJlc3RXaW5TdHJlYWs6IE1hdGgubWF4KGN1cnJlbnQuYmVzdFdpblN0cmVhaywgYXJncy5ydW4uYmVzdFN0cmVha0luUnVuKSxcbiAgICAgIGJlc3RSb3VuZFJlYWNoZWQ6IE1hdGgubWF4KGN1cnJlbnQuYmVzdFJvdW5kUmVhY2hlZCwgYXJncy5yb3VuZFJlYWNoZWQpLFxuICAgICAgdG90YWxXaW5zOiBjdXJyZW50LnRvdGFsV2lucyArIChhcmdzLndvbiA/IDEgOiAwKSxcbiAgICAgIHRvdGFsTG9zc2VzOiBjdXJyZW50LnRvdGFsTG9zc2VzICsgKGFyZ3Mud29uID8gMCA6IDEpLFxuICAgICAgYm90c0RlZmVhdGVkOiBjdXJyZW50LmJvdHNEZWZlYXRlZCArIChhcmdzLndvbiA/IDEgOiAwKSxcbiAgICAgIHBvd2Vyc1VzZWQ6IHtcbiAgICAgICAgZWFnbGU6IGN1cnJlbnQucG93ZXJzVXNlZC5lYWdsZSArIGFyZ3Mucm91bmRTdGF0cy5wb3dlcnNVc2VkLmVhZ2xlLFxuICAgICAgICBidWxsOiBjdXJyZW50LnBvd2Vyc1VzZWQuYnVsbCArIGFyZ3Mucm91bmRTdGF0cy5wb3dlcnNVc2VkLmJ1bGwsXG4gICAgICAgIGthbmdhcm9vOiBjdXJyZW50LnBvd2Vyc1VzZWQua2FuZ2Fyb28gKyBhcmdzLnJvdW5kU3RhdHMucG93ZXJzVXNlZC5rYW5nYXJvbyxcbiAgICAgICAgbGlvbjogY3VycmVudC5wb3dlcnNVc2VkLmxpb24gKyBhcmdzLnJvdW5kU3RhdHMucG93ZXJzVXNlZC5saW9uLFxuICAgICAgfSxcbiAgICAgIHBvd2VyQ2FwdHVyZXM6IGN1cnJlbnQucG93ZXJDYXB0dXJlcyArIGFyZ3Mucm91bmRTdGF0cy5wb3dlckNhcHR1cmVzLFxuICAgICAgcHJvbW90aW9uczogY3VycmVudC5wcm9tb3Rpb25zICsgYXJncy5yb3VuZFN0YXRzLnByb21vdGlvbnMsXG4gICAgICB0b3RhbFNjb3JlOiBjdXJyZW50LnRvdGFsU2NvcmUgKyBhcmdzLnJvdW5kU3RhdHMuc2NvcmUsXG4gICAgICBiZXN0Um91bmRTY29yZTogTWF0aC5tYXgoY3VycmVudC5iZXN0Um91bmRTY29yZSwgYXJncy5yb3VuZFN0YXRzLnNjb3JlKSxcbiAgICAgIGJlc3RNb3ZlU2NvcmU6IE1hdGgubWF4KGN1cnJlbnQuYmVzdE1vdmVTY29yZSwgYXJncy5yb3VuZFN0YXRzLmJlc3RNb3ZlU2NvcmUpLFxuICAgICAgYmVzdENvbWJvOiBNYXRoLm1heChjdXJyZW50LmJlc3RDb21ibywgYXJncy5yb3VuZFN0YXRzLmJlc3RDb21ibyksXG4gICAgICBtb2RlU3RhdHM6IHtcbiAgICAgICAgLi4uY3VycmVudC5tb2RlU3RhdHMsXG4gICAgICAgIGNoYWxsZW5nZTogdGhpcy5hZGRNb2RlUmVzdWx0KGN1cnJlbnQubW9kZVN0YXRzLmNoYWxsZW5nZSwgYXJncy53b24pLFxuICAgICAgfSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgYXdhaXQgc2V0RG9jKHRoaXMuc3RhdHNSZWYodWlkKSwgeyAuLi5uZXh0LCB1cGRhdGVkQXRTZXJ2ZXI6IHNlcnZlclRpbWVzdGFtcCgpIH0sIHsgbWVyZ2U6IHRydWUgfSk7XG4gICAgYXdhaXQgdGhpcy5zYXZlUnVuKGFyZ3MucnVuKTtcbiAgfVxuXG4gIGFzeW5jIHJlY29yZE1vZGVSZXN1bHQobW9kZTogRXhjbHVkZTxDaGVzc2ltYWxzU3RhdHNNb2RlLCAnY2hhbGxlbmdlJz4sIHdvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnJlYWRTdGF0cyh1aWQpO1xuICAgIGF3YWl0IHNldERvYyh0aGlzLnN0YXRzUmVmKHVpZCksIHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB1c2VySWQ6IHVpZCxcbiAgICAgIG1vZGVTdGF0czoge1xuICAgICAgICAuLi5jdXJyZW50Lm1vZGVTdGF0cyxcbiAgICAgICAgW21vZGVdOiB0aGlzLmFkZE1vZGVSZXN1bHQoY3VycmVudC5tb2RlU3RhdHNbbW9kZV0sIHdvbiksXG4gICAgICB9LFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB1cGRhdGVkQXRTZXJ2ZXI6IHNlcnZlclRpbWVzdGFtcCgpLFxuICAgIH0sIHsgbWVyZ2U6IHRydWUgfSk7XG4gIH1cblxuICBlbXB0eVN0YXRzKCk6IENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYWxsZW5nZXNQbGF5ZWQ6IDAsXG4gICAgICBjaGFsbGVuZ2VzQ29tcGxldGVkOiAwLFxuICAgICAgYmVzdFdpblN0cmVhazogMCxcbiAgICAgIGJlc3RSb3VuZFJlYWNoZWQ6IDAsXG4gICAgICB0b3RhbFdpbnM6IDAsXG4gICAgICB0b3RhbExvc3NlczogMCxcbiAgICAgIGJvdHNEZWZlYXRlZDogMCxcbiAgICAgIHBvd2Vyc1VzZWQ6IHsgLi4uRU1QVFlfUE9XRVJTIH0sXG4gICAgICBwb3dlckNhcHR1cmVzOiAwLFxuICAgICAgcHJvbW90aW9uczogMCxcbiAgICAgIHRvdGFsU2NvcmU6IDAsXG4gICAgICBiZXN0Um91bmRTY29yZTogMCxcbiAgICAgIGJlc3RNb3ZlU2NvcmU6IDAsXG4gICAgICBiZXN0Q29tYm86IDAsXG4gICAgICBtb2RlU3RhdHM6IHRoaXMuZW1wdHlNb2RlU3RhdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RhdHModWlkOiBzdHJpbmcpOiBQcm9taXNlPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4ge1xuICAgIC8vIEZpcmVzdG9yZSdzIHdlYiBTREsgZG9lcyBub3QgbmVlZCBhIHRyYW5zYWN0aW9uIGZvciB0aGVzZSBjYXN1YWwgZ2FtZSBzdGF0cy5cbiAgICAvLyBMYXN0LXdyaXRlLXdpbnMgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBmaXJzdCB2ZXJzaW9uIGJlY2F1c2Ugb25lIHJ1biBpcyBhY3RpdmUgcGVyIGJyb3dzZXIuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXREb2ModGhpcy5zdGF0c1JlZih1aWQpKTtcbiAgICByZXR1cm4gc25hcHNob3QuZXhpc3RzKCkgPyB0aGlzLm5vcm1hbGl6ZVN0YXRzKHNuYXBzaG90LmRhdGEoKSBhcyBQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4pIDogdGhpcy5lbXB0eVN0YXRzKCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVN0YXRzKHZhbHVlOiBQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4pOiBDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHMge1xuICAgIGNvbnN0IGVtcHR5ID0gdGhpcy5lbXB0eVN0YXRzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmVtcHR5LFxuICAgICAgLi4udmFsdWUsXG4gICAgICBwb3dlcnNVc2VkOiB7XG4gICAgICAgIC4uLkVNUFRZX1BPV0VSUyxcbiAgICAgICAgLi4uKHZhbHVlLnBvd2Vyc1VzZWQgPz8ge30pLFxuICAgICAgfSxcbiAgICAgIG1vZGVTdGF0czogdGhpcy5ub3JtYWxpemVNb2RlU3RhdHModmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFkZE1vZGVSZXN1bHQoY3VycmVudDogeyBwbGF5ZWQ6IG51bWJlcjsgd2luczogbnVtYmVyOyBsb3NzZXM6IG51bWJlciB9LCB3b246IGJvb2xlYW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGxheWVkOiBjdXJyZW50LnBsYXllZCArIDEsXG4gICAgICB3aW5zOiBjdXJyZW50LndpbnMgKyAod29uID8gMSA6IDApLFxuICAgICAgbG9zc2VzOiBjdXJyZW50Lmxvc3NlcyArICh3b24gPyAwIDogMSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1wdHlNb2RlU3RhdHMoKTogQ2hlc3NpbWFsc0NoYWxsZW5nZVN0YXRzWydtb2RlU3RhdHMnXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYWxsZW5nZTogeyAuLi5FTVBUWV9NT0RFX1JFQ09SRCB9LFxuICAgICAgYm90OiB7IC4uLkVNUFRZX01PREVfUkVDT1JEIH0sXG4gICAgICBvbmxpbmU6IHsgLi4uRU1QVFlfTU9ERV9SRUNPUkQgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVNb2RlU3RhdHModmFsdWU6IFBhcnRpYWw8Q2hlc3NpbWFsc0NoYWxsZW5nZVN0YXRzPik6IENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0c1snbW9kZVN0YXRzJ10ge1xuICAgIGNvbnN0IGVtcHR5ID0gdGhpcy5lbXB0eU1vZGVTdGF0cygpO1xuICAgIHJldHVybiB7XG4gICAgICBjaGFsbGVuZ2U6IHtcbiAgICAgICAgLi4uZW1wdHkuY2hhbGxlbmdlLFxuICAgICAgICBwbGF5ZWQ6IHZhbHVlLm1vZGVTdGF0cz8uY2hhbGxlbmdlPy5wbGF5ZWQgPz8gKCh2YWx1ZS50b3RhbFdpbnMgPz8gMCkgKyAodmFsdWUudG90YWxMb3NzZXMgPz8gMCkpLFxuICAgICAgICB3aW5zOiB2YWx1ZS5tb2RlU3RhdHM/LmNoYWxsZW5nZT8ud2lucyA/PyAodmFsdWUudG90YWxXaW5zID8/IDApLFxuICAgICAgICBsb3NzZXM6IHZhbHVlLm1vZGVTdGF0cz8uY2hhbGxlbmdlPy5sb3NzZXMgPz8gKHZhbHVlLnRvdGFsTG9zc2VzID8/IDApLFxuICAgICAgfSxcbiAgICAgIGJvdDoge1xuICAgICAgICAuLi5lbXB0eS5ib3QsXG4gICAgICAgIC4uLih2YWx1ZS5tb2RlU3RhdHM/LmJvdCA/PyB7fSksXG4gICAgICB9LFxuICAgICAgb25saW5lOiB7XG4gICAgICAgIC4uLmVtcHR5Lm9ubGluZSxcbiAgICAgICAgLi4uKHZhbHVlLm1vZGVTdGF0cz8ub25saW5lID8/IHt9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVXNlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuZmlyZWJhc2Uud2hlbkZpcmViYXNlQXV0aFJlYWR5KCk7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmlyZWJhc2VBdXRoLmN1cnJlbnRVc2VyO1xuICAgIGlmICh1c2VyPy51aWQpIHtcbiAgICAgIGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICAgICAgcmV0dXJuIHVzZXIudWlkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfQ0hBTExFTkdFX0xPR0lOX1JFUVVJUkVEJyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRzUmVmKHVpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvYyh0aGlzLmZpcmVzdG9yZSwgYHVzZXJzLyR7dWlkfS9taW5pR2FtZXMvY2hlc3NpbWFscy9jaGFsbGVuZ2Uvc3RhdHNgKTtcbiAgfVxuXG4gIHByaXZhdGUgcnVuUmVmKHVpZDogc3RyaW5nLCBydW5JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvYyh0aGlzLmZpcmVzdG9yZSwgYCR7dGhpcy5ydW5zUGF0aCh1aWQpfS8ke3J1bklkfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBydW5zUGF0aCh1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB1c2Vycy8ke3VpZH0vbWluaUdhbWVzL2NoZXNzaW1hbHMvY2hhbGxlbmdlUnVuc2A7XG4gIH1cblxuICBwcml2YXRlIHJlYWRMb2NhbEFjdGl2ZVJ1bigpOiBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTE9DQUxfQUNUSVZFX1JVTl9LRVkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBydW4gPSBKU09OLnBhcnNlKHJhdykgYXMgQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1bjtcbiAgICAgIHJldHVybiBydW4uc3RhdHVzID09PSAnYWN0aXZlJyA/IHJ1biA6IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZUxvY2FsQWN0aXZlUnVuKHJ1bjogQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1biB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAocnVuPy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX0FDVElWRV9SVU5fS0VZLCBKU09OLnN0cmluZ2lmeShydW4pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfQUNUSVZFX1JVTl9LRVkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTG9jYWwgcGVyc2lzdGVuY2UgaXMgb25seSBhIHJlZnJlc2ggZmFsbGJhY2suXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3aXRob3V0VW5kZWZpbmVkPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odmFsdWU6IFQpOiBUIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUpLnJlZHVjZSgoYWNjLCBba2V5LCBlbnRyeV0pID0+IHtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSBhY2Nba2V5IGFzIGtleW9mIFRdID0gZW50cnkgYXMgVFtrZXlvZiBUXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgVCk7XG4gIH1cbn1cbiJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlc3NpbWFscy1jaGFsbGVuZ2UtcHJvZ3Jlc3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWluaS1nYW1lcy9jaGVzc2ltYWxzLWNoYWxsZW5nZS1wcm9ncmVzcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLEtBQUssRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFRbkgsTUFBTSxZQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDNUQsTUFBTSxvQkFBb0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQUM5RCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUdsQyxNQUFNLE9BQU8sa0NBQWtD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QUMsSUFBSSxJQUFJLE9BQU8sQ0FBQztRQUNsRixPQUFPLEdBQUcsb0JBQW9CLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTyxnQkFBZ0IsQ0FBb0MsS0FBUTtRQUNsRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxHQUFHLENBQUMsR0FBYyxDQUFDLEdBQUcsS0FBbUIsQ0FBQztZQUNuRSxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFPLENBQUMsQ0FBQztJQUNkLENBQUM7K0dBdlNVLGtDQUFrQzttSEFBbEMsa0NBQWtDLGNBRHJCLE1BQU07OzRGQUNuQixrQ0FBa0M7a0JBRDlDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJztcbmltcG9ydCB7XG4gIEZpcmVzdG9yZSxcbiAgY29sbGVjdGlvbixcbiAgZG9jLFxuICBnZXREb2MsXG4gIGxpbWl0LFxuICBvblNuYXBzaG90LFxuICBvcmRlckJ5LFxuICBxdWVyeSxcbiAgc2VydmVyVGltZXN0YW1wLFxuICBzZXREb2MsXG4gIHdyaXRlQmF0Y2gsXG59IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvZmlyZXN0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmViYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hvb3NlQWN0aXZlQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1biwgbm9ybWFsaXplQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1biB9IGZyb20gJy4vY2hlc3NpbWFscy1jaGFsbGVuZ2Utc3RhdGUnO1xuaW1wb3J0IHtcbiAgQ2hlc3NpbWFsc0NoYWxsZW5nZVJvdW5kU3RhdHMsXG4gIENoZXNzaW1hbHNDaGFsbGVuZ2VSdW4sXG4gIENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cyxcbiAgQ2hlc3NpbWFsc1N0YXRzTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEVNUFRZX1BPV0VSUyA9IHsgZWFnbGU6IDAsIGJ1bGw6IDAsIGthbmdhcm9vOiAwLCBsaW9uOiAwIH07XG5jb25zdCBFTVBUWV9NT0RFX1JFQ09SRCA9IHsgcGxheWVkOiAwLCB3aW5zOiAwLCBsb3NzZXM6IDAgfTtcbmNvbnN0IExPQ0FMX0FDVElWRV9SVU5fS0VZID0gJ2NoZXNzaW1hbHMuY2hhbGxlbmdlLmFjdGl2ZVJ1bic7XG5jb25zdCBBQ1RJVkVfUlVOX1FVRVJZX0xJTUlUID0gMTI7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2hlc3NpbWFsc0NoYWxsZW5nZVByb2dyZXNzU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZWJhc2VBdXRoID0gaW5qZWN0KEF1dGgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpcmVzdG9yZSA9IGluamVjdChGaXJlc3RvcmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpcmViYXNlID0gaW5qZWN0KEZpcmViYXNlU2VydmljZSk7XG5cbiAgZ2V0IGN1cnJlbnRVaWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maXJlYmFzZUF1dGguY3VycmVudFVzZXI/LnVpZDtcbiAgfVxuXG4gIHdhdGNoU3RhdHMoKTogT2JzZXJ2YWJsZTxDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHMgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB1aWQgPSB0aGlzLmN1cnJlbnRVaWQ7XG4gICAgaWYgKCF1aWQpIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBvblNuYXBzaG90KFxuICAgICAgICB0aGlzLnN0YXRzUmVmKHVpZCksXG4gICAgICAgIChzbmFwc2hvdCkgPT4gc3Vic2NyaWJlci5uZXh0KFxuICAgICAgICAgIHNuYXBzaG90LmV4aXN0cygpID8gdGhpcy5ub3JtYWxpemVTdGF0cyhzbmFwc2hvdC5kYXRhKCkgYXMgUGFydGlhbDxDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHM+KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgKSxcbiAgICAgICAgKGVycm9yKSA9PiBzdWJzY3JpYmVyLmVycm9yKGVycm9yKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgfSk7XG4gIH1cblxuICB3YXRjaFJlY2VudFJ1bnMobGltaXRDb3VudCA9IDQpOiBPYnNlcnZhYmxlPENoZXNzaW1hbHNDaGFsbGVuZ2VSdW5bXT4ge1xuICAgIGNvbnN0IHVpZCA9IHRoaXMuY3VycmVudFVpZDtcbiAgICBpZiAoIXVpZCkgcmV0dXJuIG9mKFtdKTtcbiAgICBjb25zdCBydW5zUXVlcnkgPSBxdWVyeShcbiAgICAgIGNvbGxlY3Rpb24odGhpcy5maXJlc3RvcmUsIHRoaXMucnVuc1BhdGgodWlkKSksXG4gICAgICBvcmRlckJ5KCd1cGRhdGVkQXQnLCAnZGVzYycpLFxuICAgICAgbGltaXQobGltaXRDb3VudCksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb25TbmFwc2hvdChcbiAgICAgICAgcnVuc1F1ZXJ5LFxuICAgICAgICAoc25hcHNob3QpID0+IHN1YnNjcmliZXIubmV4dChcbiAgICAgICAgICBzbmFwc2hvdC5kb2NzLm1hcCgoaXRlbSkgPT4gdGhpcy5ub3JtYWxpemVSdW4oaXRlbS5kYXRhKCkgYXMgUGFydGlhbDxDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuPikpLFxuICAgICAgICApLFxuICAgICAgICAoZXJyb3IpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgICB9KTtcbiAgfVxuXG4gIHdhdGNoQWN0aXZlUnVuKCk6IE9ic2VydmFibGU8Q2hlc3NpbWFsc0NoYWxsZW5nZVJ1biB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHVpZCA9IHRoaXMuY3VycmVudFVpZDtcbiAgICBpZiAoIXVpZCkgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgYWN0aXZlUXVlcnkgPSBxdWVyeShcbiAgICAgIGNvbGxlY3Rpb24odGhpcy5maXJlc3RvcmUsIHRoaXMucnVuc1BhdGgodWlkKSksXG4gICAgICBvcmRlckJ5KCd1cGRhdGVkQXQnLCAnZGVzYycpLFxuICAgICAgbGltaXQoQUNUSVZFX1JVTl9RVUVSWV9MSU1JVCksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIHN1YnNjcmliZXIubmV4dCh0aGlzLnJlYWRMb2NhbEFjdGl2ZVJ1bih1aWQpKTtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb25TbmFwc2hvdChcbiAgICAgICAgYWN0aXZlUXVlcnksXG4gICAgICAgIChzbmFwc2hvdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJ1biA9IGNob29zZUFjdGl2ZUNoZXNzaW1hbHNDaGFsbGVuZ2VSdW4oXG4gICAgICAgICAgICBzbmFwc2hvdC5kb2NzLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRhKCkgYXMgUGFydGlhbDxDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuPiksXG4gICAgICAgICAgICB1aWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLndyaXRlTG9jYWxBY3RpdmVSdW4odWlkLCBydW4pO1xuICAgICAgICAgIHN1YnNjcmliZXIubmV4dChydW4pO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiBzdWJzY3JpYmVyLm5leHQodGhpcy5yZWFkTG9jYWxBY3RpdmVSdW4odWlkKSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVJ1bihydW46IENoZXNzaW1hbHNDaGFsbGVuZ2VSdW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1aWQgPSBhd2FpdCB0aGlzLmVuc3VyZVVzZXIoKTtcbiAgICBjb25zdCBub3JtYWxpemVkUnVuID0gdGhpcy5ub3JtYWxpemVSdW4ocnVuLCB1aWQpO1xuICAgIHRoaXMud3JpdGVMb2NhbEFjdGl2ZVJ1bih1aWQsIG5vcm1hbGl6ZWRSdW4uc3RhdHVzID09PSAnYWN0aXZlJyA/IG5vcm1hbGl6ZWRSdW4gOiB1bmRlZmluZWQpO1xuICAgIGF3YWl0IHNldERvYyh0aGlzLnJ1blJlZih1aWQsIG5vcm1hbGl6ZWRSdW4uaWQpLCB0aGlzLndpdGhvdXRVbmRlZmluZWQoe1xuICAgICAgLi4ubm9ybWFsaXplZFJ1bixcbiAgICAgIHVzZXJJZDogdWlkLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB1cGRhdGVkQXRTZXJ2ZXI6IHNlcnZlclRpbWVzdGFtcCgpLFxuICAgIH0pLCB7IG1lcmdlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVjb3JkQ2hhbGxlbmdlU3RhcnRlZChydW46IENoZXNzaW1hbHNDaGFsbGVuZ2VSdW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1aWQgPSBhd2FpdCB0aGlzLmVuc3VyZVVzZXIoKTtcbiAgICBjb25zdCBub3JtYWxpemVkUnVuID0gdGhpcy5ub3JtYWxpemVSdW4ocnVuLCB1aWQpO1xuICAgIHRoaXMud3JpdGVMb2NhbEFjdGl2ZVJ1bih1aWQsIG5vcm1hbGl6ZWRSdW4pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnJlYWRTdGF0cyh1aWQpO1xuICAgIGF3YWl0IHNldERvYyh0aGlzLnN0YXRzUmVmKHVpZCksIHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB1c2VySWQ6IHVpZCxcbiAgICAgIGNoYWxsZW5nZXNQbGF5ZWQ6IGN1cnJlbnQuY2hhbGxlbmdlc1BsYXllZCArIDEsXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHVwZGF0ZWRBdFNlcnZlcjogc2VydmVyVGltZXN0YW1wKCksXG4gICAgfSwgeyBtZXJnZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB0aGlzLnNhdmVSdW4obm9ybWFsaXplZFJ1bik7XG4gIH1cblxuICBhc3luYyBhcHBseVJvdW5kUmVzdWx0KGFyZ3M6IHtcbiAgICBydW46IENoZXNzaW1hbHNDaGFsbGVuZ2VSdW47XG4gICAgcm91bmRSZWFjaGVkOiBudW1iZXI7XG4gICAgd29uOiBib29sZWFuO1xuICAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAgICByb3VuZFN0YXRzOiBDaGVzc2ltYWxzQ2hhbGxlbmdlUm91bmRTdGF0cztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnJlYWRTdGF0cyh1aWQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSdW4gPSB0aGlzLm5vcm1hbGl6ZVJ1bihhcmdzLnJ1biwgdWlkKTtcbiAgICBjb25zdCBuZXh0OiBDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHMgPSB7XG4gICAgICB1c2VySWQ6IHVpZCxcbiAgICAgIGNoYWxsZW5nZXNQbGF5ZWQ6IGN1cnJlbnQuY2hhbGxlbmdlc1BsYXllZCxcbiAgICAgIGNoYWxsZW5nZXNDb21wbGV0ZWQ6IGN1cnJlbnQuY2hhbGxlbmdlc0NvbXBsZXRlZCArIChhcmdzLmNvbXBsZXRlZCA/IDEgOiAwKSxcbiAgICAgIGJlc3RXaW5TdHJlYWs6IE1hdGgubWF4KGN1cnJlbnQuYmVzdFdpblN0cmVhaywgbm9ybWFsaXplZFJ1bi5iZXN0U3RyZWFrSW5SdW4pLFxuICAgICAgYmVzdFJvdW5kUmVhY2hlZDogTWF0aC5tYXgoY3VycmVudC5iZXN0Um91bmRSZWFjaGVkLCBhcmdzLnJvdW5kUmVhY2hlZCksXG4gICAgICB0b3RhbFdpbnM6IGN1cnJlbnQudG90YWxXaW5zICsgKGFyZ3Mud29uID8gMSA6IDApLFxuICAgICAgdG90YWxMb3NzZXM6IGN1cnJlbnQudG90YWxMb3NzZXMgKyAoYXJncy53b24gPyAwIDogMSksXG4gICAgICBib3RzRGVmZWF0ZWQ6IGN1cnJlbnQuYm90c0RlZmVhdGVkICsgKGFyZ3Mud29uID8gMSA6IDApLFxuICAgICAgcG93ZXJzVXNlZDoge1xuICAgICAgICBlYWdsZTogY3VycmVudC5wb3dlcnNVc2VkLmVhZ2xlICsgYXJncy5yb3VuZFN0YXRzLnBvd2Vyc1VzZWQuZWFnbGUsXG4gICAgICAgIGJ1bGw6IGN1cnJlbnQucG93ZXJzVXNlZC5idWxsICsgYXJncy5yb3VuZFN0YXRzLnBvd2Vyc1VzZWQuYnVsbCxcbiAgICAgICAga2FuZ2Fyb286IGN1cnJlbnQucG93ZXJzVXNlZC5rYW5nYXJvbyArIGFyZ3Mucm91bmRTdGF0cy5wb3dlcnNVc2VkLmthbmdhcm9vLFxuICAgICAgICBsaW9uOiBjdXJyZW50LnBvd2Vyc1VzZWQubGlvbiArIGFyZ3Mucm91bmRTdGF0cy5wb3dlcnNVc2VkLmxpb24sXG4gICAgICB9LFxuICAgICAgcG93ZXJDYXB0dXJlczogY3VycmVudC5wb3dlckNhcHR1cmVzICsgYXJncy5yb3VuZFN0YXRzLnBvd2VyQ2FwdHVyZXMsXG4gICAgICBwcm9tb3Rpb25zOiBjdXJyZW50LnByb21vdGlvbnMgKyBhcmdzLnJvdW5kU3RhdHMucHJvbW90aW9ucyxcbiAgICAgIHRvdGFsU2NvcmU6IGN1cnJlbnQudG90YWxTY29yZSArIGFyZ3Mucm91bmRTdGF0cy5zY29yZSxcbiAgICAgIGJlc3RSb3VuZFNjb3JlOiBNYXRoLm1heChjdXJyZW50LmJlc3RSb3VuZFNjb3JlLCBhcmdzLnJvdW5kU3RhdHMuc2NvcmUpLFxuICAgICAgYmVzdE1vdmVTY29yZTogTWF0aC5tYXgoY3VycmVudC5iZXN0TW92ZVNjb3JlLCBhcmdzLnJvdW5kU3RhdHMuYmVzdE1vdmVTY29yZSksXG4gICAgICBiZXN0Q29tYm86IE1hdGgubWF4KGN1cnJlbnQuYmVzdENvbWJvLCBhcmdzLnJvdW5kU3RhdHMuYmVzdENvbWJvKSxcbiAgICAgIG1vZGVTdGF0czoge1xuICAgICAgICAuLi5jdXJyZW50Lm1vZGVTdGF0cyxcbiAgICAgICAgY2hhbGxlbmdlOiB0aGlzLmFkZE1vZGVSZXN1bHQoY3VycmVudC5tb2RlU3RhdHMuY2hhbGxlbmdlLCBhcmdzLndvbiksXG4gICAgICB9LFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBjb25zdCBiYXRjaCA9IHdyaXRlQmF0Y2godGhpcy5maXJlc3RvcmUpO1xuICAgIGJhdGNoLnNldCh0aGlzLnN0YXRzUmVmKHVpZCksIHsgLi4ubmV4dCwgdXBkYXRlZEF0U2VydmVyOiBzZXJ2ZXJUaW1lc3RhbXAoKSB9LCB7IG1lcmdlOiB0cnVlIH0pO1xuICAgIGJhdGNoLnNldCh0aGlzLnJ1blJlZih1aWQsIG5vcm1hbGl6ZWRSdW4uaWQpLCB0aGlzLndpdGhvdXRVbmRlZmluZWQoe1xuICAgICAgLi4ubm9ybWFsaXplZFJ1bixcbiAgICAgIHVzZXJJZDogdWlkLFxuICAgICAgdXBkYXRlZEF0U2VydmVyOiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICB9KSwgeyBtZXJnZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB0aGlzLndyaXRlTG9jYWxBY3RpdmVSdW4odWlkLCBub3JtYWxpemVkUnVuLnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyBub3JtYWxpemVkUnVuIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIGFzeW5jIHJlY29yZE1vZGVSZXN1bHQobW9kZTogRXhjbHVkZTxDaGVzc2ltYWxzU3RhdHNNb2RlLCAnY2hhbGxlbmdlJz4sIHdvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnJlYWRTdGF0cyh1aWQpO1xuICAgIGF3YWl0IHNldERvYyh0aGlzLnN0YXRzUmVmKHVpZCksIHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB1c2VySWQ6IHVpZCxcbiAgICAgIG1vZGVTdGF0czoge1xuICAgICAgICAuLi5jdXJyZW50Lm1vZGVTdGF0cyxcbiAgICAgICAgW21vZGVdOiB0aGlzLmFkZE1vZGVSZXN1bHQoY3VycmVudC5tb2RlU3RhdHNbbW9kZV0sIHdvbiksXG4gICAgICB9LFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB1cGRhdGVkQXRTZXJ2ZXI6IHNlcnZlclRpbWVzdGFtcCgpLFxuICAgIH0sIHsgbWVyZ2U6IHRydWUgfSk7XG4gIH1cblxuICBlbXB0eVN0YXRzKCk6IENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYWxsZW5nZXNQbGF5ZWQ6IDAsXG4gICAgICBjaGFsbGVuZ2VzQ29tcGxldGVkOiAwLFxuICAgICAgYmVzdFdpblN0cmVhazogMCxcbiAgICAgIGJlc3RSb3VuZFJlYWNoZWQ6IDAsXG4gICAgICB0b3RhbFdpbnM6IDAsXG4gICAgICB0b3RhbExvc3NlczogMCxcbiAgICAgIGJvdHNEZWZlYXRlZDogMCxcbiAgICAgIHBvd2Vyc1VzZWQ6IHsgLi4uRU1QVFlfUE9XRVJTIH0sXG4gICAgICBwb3dlckNhcHR1cmVzOiAwLFxuICAgICAgcHJvbW90aW9uczogMCxcbiAgICAgIHRvdGFsU2NvcmU6IDAsXG4gICAgICBiZXN0Um91bmRTY29yZTogMCxcbiAgICAgIGJlc3RNb3ZlU2NvcmU6IDAsXG4gICAgICBiZXN0Q29tYm86IDAsXG4gICAgICBtb2RlU3RhdHM6IHRoaXMuZW1wdHlNb2RlU3RhdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RhdHModWlkOiBzdHJpbmcpOiBQcm9taXNlPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4ge1xuICAgIC8vIEZpcmVzdG9yZSdzIHdlYiBTREsgZG9lcyBub3QgbmVlZCBhIHRyYW5zYWN0aW9uIGZvciB0aGVzZSBjYXN1YWwgZ2FtZSBzdGF0cy5cbiAgICAvLyBMYXN0LXdyaXRlLXdpbnMgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBmaXJzdCB2ZXJzaW9uIGJlY2F1c2Ugb25lIHJ1biBpcyBhY3RpdmUgcGVyIGJyb3dzZXIuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXREb2ModGhpcy5zdGF0c1JlZih1aWQpKTtcbiAgICByZXR1cm4gc25hcHNob3QuZXhpc3RzKCkgPyB0aGlzLm5vcm1hbGl6ZVN0YXRzKHNuYXBzaG90LmRhdGEoKSBhcyBQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4pIDogdGhpcy5lbXB0eVN0YXRzKCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVN0YXRzKHZhbHVlOiBQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4pOiBDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHMge1xuICAgIGNvbnN0IGVtcHR5ID0gdGhpcy5lbXB0eVN0YXRzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmVtcHR5LFxuICAgICAgLi4udmFsdWUsXG4gICAgICBwb3dlcnNVc2VkOiB7XG4gICAgICAgIC4uLkVNUFRZX1BPV0VSUyxcbiAgICAgICAgLi4uKHZhbHVlLnBvd2Vyc1VzZWQgPz8ge30pLFxuICAgICAgfSxcbiAgICAgIG1vZGVTdGF0czogdGhpcy5ub3JtYWxpemVNb2RlU3RhdHModmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBub3JtYWxpemVSdW4odmFsdWU6IFBhcnRpYWw8Q2hlc3NpbWFsc0NoYWxsZW5nZVJ1bj4sIHVpZCA9IHZhbHVlLnVzZXJJZCk6IENoZXNzaW1hbHNDaGFsbGVuZ2VSdW4ge1xuICAgIHJldHVybiBub3JtYWxpemVDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuKHZhbHVlLCB1aWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNb2RlUmVzdWx0KGN1cnJlbnQ6IHsgcGxheWVkOiBudW1iZXI7IHdpbnM6IG51bWJlcjsgbG9zc2VzOiBudW1iZXIgfSwgd29uOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYXllZDogY3VycmVudC5wbGF5ZWQgKyAxLFxuICAgICAgd2luczogY3VycmVudC53aW5zICsgKHdvbiA/IDEgOiAwKSxcbiAgICAgIGxvc3NlczogY3VycmVudC5sb3NzZXMgKyAod29uID8gMCA6IDEpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtcHR5TW9kZVN0YXRzKCk6IENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0c1snbW9kZVN0YXRzJ10ge1xuICAgIHJldHVybiB7XG4gICAgICBjaGFsbGVuZ2U6IHsgLi4uRU1QVFlfTU9ERV9SRUNPUkQgfSxcbiAgICAgIGJvdDogeyAuLi5FTVBUWV9NT0RFX1JFQ09SRCB9LFxuICAgICAgb25saW5lOiB7IC4uLkVNUFRZX01PREVfUkVDT1JEIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTW9kZVN0YXRzKHZhbHVlOiBQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VTdGF0cz4pOiBDaGVzc2ltYWxzQ2hhbGxlbmdlU3RhdHNbJ21vZGVTdGF0cyddIHtcbiAgICBjb25zdCBlbXB0eSA9IHRoaXMuZW1wdHlNb2RlU3RhdHMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2hhbGxlbmdlOiB7XG4gICAgICAgIC4uLmVtcHR5LmNoYWxsZW5nZSxcbiAgICAgICAgcGxheWVkOiB2YWx1ZS5tb2RlU3RhdHM/LmNoYWxsZW5nZT8ucGxheWVkID8/ICgodmFsdWUudG90YWxXaW5zID8/IDApICsgKHZhbHVlLnRvdGFsTG9zc2VzID8/IDApKSxcbiAgICAgICAgd2luczogdmFsdWUubW9kZVN0YXRzPy5jaGFsbGVuZ2U/LndpbnMgPz8gKHZhbHVlLnRvdGFsV2lucyA/PyAwKSxcbiAgICAgICAgbG9zc2VzOiB2YWx1ZS5tb2RlU3RhdHM/LmNoYWxsZW5nZT8ubG9zc2VzID8/ICh2YWx1ZS50b3RhbExvc3NlcyA/PyAwKSxcbiAgICAgIH0sXG4gICAgICBib3Q6IHtcbiAgICAgICAgLi4uZW1wdHkuYm90LFxuICAgICAgICAuLi4odmFsdWUubW9kZVN0YXRzPy5ib3QgPz8ge30pLFxuICAgICAgfSxcbiAgICAgIG9ubGluZToge1xuICAgICAgICAuLi5lbXB0eS5vbmxpbmUsXG4gICAgICAgIC4uLih2YWx1ZS5tb2RlU3RhdHM/Lm9ubGluZSA/PyB7fSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVVzZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmZpcmViYXNlLndoZW5GaXJlYmFzZUF1dGhSZWFkeSgpO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpcmViYXNlQXV0aC5jdXJyZW50VXNlcjtcbiAgICBpZiAodXNlcj8udWlkKSB7XG4gICAgICBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcbiAgICAgIHJldHVybiB1c2VyLnVpZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX0NIQUxMRU5HRV9MT0dJTl9SRVFVSVJFRCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0c1JlZih1aWQ6IHN0cmluZykge1xuICAgIHJldHVybiBkb2ModGhpcy5maXJlc3RvcmUsIGB1c2Vycy8ke3VpZH0vbWluaUdhbWVzL2NoZXNzaW1hbHMvY2hhbGxlbmdlL3N0YXRzYCk7XG4gIH1cblxuICBwcml2YXRlIHJ1blJlZih1aWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBkb2ModGhpcy5maXJlc3RvcmUsIGAke3RoaXMucnVuc1BhdGgodWlkKX0vJHtydW5JZH1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcnVuc1BhdGgodWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdXNlcnMvJHt1aWR9L21pbmlHYW1lcy9jaGVzc2ltYWxzL2NoYWxsZW5nZVJ1bnNgO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkTG9jYWxBY3RpdmVSdW4odWlkOiBzdHJpbmcpOiBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbEFjdGl2ZVJ1bktleSh1aWQpKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcnVuID0gdGhpcy5ub3JtYWxpemVSdW4oSlNPTi5wYXJzZShyYXcpIGFzIFBhcnRpYWw8Q2hlc3NpbWFsc0NoYWxsZW5nZVJ1bj4sIHVpZCk7XG4gICAgICByZXR1cm4gcnVuLnN0YXR1cyA9PT0gJ2FjdGl2ZScgJiYgcnVuLnVzZXJJZCA9PT0gdWlkID8gcnVuIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdyaXRlTG9jYWxBY3RpdmVSdW4odWlkOiBzdHJpbmcsIHJ1bjogQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1biB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAocnVuPy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxBY3RpdmVSdW5LZXkodWlkKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5ub3JtYWxpemVSdW4ocnVuLCB1aWQpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxBY3RpdmVSdW5LZXkodWlkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMb2NhbCBwZXJzaXN0ZW5jZSBpcyBvbmx5IGEgcmVmcmVzaCBmYWxsYmFjay5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvY2FsQWN0aXZlUnVuS2V5KHVpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBob3N0ID0gdHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJyA/ICdsb2NhbCcgOiBsb2NhdGlvbi5ob3N0IHx8ICdsb2NhbCc7XG4gICAgcmV0dXJuIGAke0xPQ0FMX0FDVElWRV9SVU5fS0VZfS4ke2hvc3R9LiR7dWlkfWA7XG4gIH1cblxuICBwcml2YXRlIHdpdGhvdXRVbmRlZmluZWQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih2YWx1ZTogVCk6IFQge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSkucmVkdWNlKChhY2MsIFtrZXksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIGFjY1trZXkgYXMga2V5b2YgVF0gPSBlbnRyeSBhcyBUW2tleW9mIFRdO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBUKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,44 @@
1
+ const CHESSIMALS_CHALLENGE_TOTAL_ROUNDS = 8;
2
+ export function normalizeChessimalsChallengeRun(value, uid = value.userId) {
3
+ const currentRound = clampChallengeRound(value.roundIndex ?? value.currentRound ?? 1);
4
+ const wins = Math.max(0, value.wins ?? value.roundsWon ?? 0);
5
+ const roundsWon = Math.max(0, value.roundsWon ?? wins);
6
+ const highestRoundReached = clampChallengeRound(value.highestRoundReached ?? Math.max(currentRound, roundsWon ? roundsWon : 1));
7
+ const now = new Date().toISOString();
8
+ return {
9
+ id: value.id ?? `challenge-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`,
10
+ ...(uid ? { userId: uid } : {}),
11
+ schemaVersion: 2,
12
+ status: value.status ?? 'active',
13
+ livesStart: 3,
14
+ livesRemaining: Math.min(3, Math.max(0, value.livesRemaining ?? 3)),
15
+ roundIndex: currentRound,
16
+ currentRound,
17
+ roundsWon,
18
+ highestRoundReached,
19
+ ...(value.activeRoundId ? { activeRoundId: value.activeRoundId } : {}),
20
+ wins,
21
+ losses: Math.max(0, value.losses ?? 0),
22
+ bestStreakInRun: Math.max(0, value.bestStreakInRun ?? 0),
23
+ currentStreak: Math.max(0, value.currentStreak ?? 0),
24
+ botLadder: value.botLadder ?? [],
25
+ roundResults: value.roundResults ?? [],
26
+ startedAt: value.startedAt ?? now,
27
+ lastEventAt: value.lastEventAt ?? value.updatedAt ?? now,
28
+ updatedAt: value.updatedAt ?? now,
29
+ ...(value.finishedAt ? { finishedAt: value.finishedAt } : {}),
30
+ };
31
+ }
32
+ export function chooseActiveChessimalsChallengeRun(values, uid) {
33
+ return values
34
+ .map((value) => normalizeChessimalsChallengeRun(value, uid ?? value.userId))
35
+ .filter((run) => run.status === 'active')
36
+ .sort((a, b) => challengeRunTimestamp(b) - challengeRunTimestamp(a))[0];
37
+ }
38
+ function challengeRunTimestamp(run) {
39
+ return Date.parse(run.updatedAt || run.lastEventAt || run.startedAt) || 0;
40
+ }
41
+ function clampChallengeRound(value) {
42
+ return Math.min(CHESSIMALS_CHALLENGE_TOTAL_ROUNDS, Math.max(1, Math.round(Number.isFinite(value) ? value : 1)));
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlc3NpbWFscy1jaGFsbGVuZ2Utc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21pbmktZ2FtZXMvY2hlc3NpbWFscy1jaGFsbGVuZ2Utc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLENBQUM7QUFFNUMsTUFBTSxVQUFVLCtCQUErQixDQUM3QyxLQUFzQyxFQUN0QyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU07SUFFbEIsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQzdDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQy9FLENBQUM7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRXJDLE9BQU87UUFDTCxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxhQUFhLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxD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QUMsQ0FDNUQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENIRVNTSU1BTFNfQ0hBTExFTkdFX1RPVEFMX1JPVU5EUyA9IDg7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuKFxuICB2YWx1ZTogUGFydGlhbDxDaGVzc2ltYWxzQ2hhbGxlbmdlUnVuPixcbiAgdWlkID0gdmFsdWUudXNlcklkLFxuKTogQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1biB7XG4gIGNvbnN0IGN1cnJlbnRSb3VuZCA9IGNsYW1wQ2hhbGxlbmdlUm91bmQodmFsdWUucm91bmRJbmRleCA/PyB2YWx1ZS5jdXJyZW50Um91bmQgPz8gMSk7XG4gIGNvbnN0IHdpbnMgPSBNYXRoLm1heCgwLCB2YWx1ZS53aW5zID8/IHZhbHVlLnJvdW5kc1dvbiA/PyAwKTtcbiAgY29uc3Qgcm91bmRzV29uID0gTWF0aC5tYXgoMCwgdmFsdWUucm91bmRzV29uID8/IHdpbnMpO1xuICBjb25zdCBoaWdoZXN0Um91bmRSZWFjaGVkID0gY2xhbXBDaGFsbGVuZ2VSb3VuZChcbiAgICB2YWx1ZS5oaWdoZXN0Um91bmRSZWFjaGVkID8/IE1hdGgubWF4KGN1cnJlbnRSb3VuZCwgcm91bmRzV29uID8gcm91bmRzV29uIDogMSksXG4gICk7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICByZXR1cm4ge1xuICAgIGlkOiB2YWx1ZS5pZCA/PyBgY2hhbGxlbmdlLSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YCxcbiAgICAuLi4odWlkID8geyB1c2VySWQ6IHVpZCB9IDoge30pLFxuICAgIHNjaGVtYVZlcnNpb246IDIsXG4gICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMgPz8gJ2FjdGl2ZScsXG4gICAgbGl2ZXNTdGFydDogMyxcbiAgICBsaXZlc1JlbWFpbmluZzogTWF0aC5taW4oMywgTWF0aC5tYXgoMCwgdmFsdWUubGl2ZXNSZW1haW5pbmcgPz8gMykpLFxuICAgIHJvdW5kSW5kZXg6IGN1cnJlbnRSb3VuZCxcbiAgICBjdXJyZW50Um91bmQsXG4gICAgcm91bmRzV29uLFxuICAgIGhpZ2hlc3RSb3VuZFJlYWNoZWQsXG4gICAgLi4uKHZhbHVlLmFjdGl2ZVJvdW5kSWQgPyB7IGFjdGl2ZVJvdW5kSWQ6IHZhbHVlLmFjdGl2ZVJvdW5kSWQgfSA6IHt9KSxcbiAgICB3aW5zLFxuICAgIGxvc3NlczogTWF0aC5tYXgoMCwgdmFsdWUubG9zc2VzID8/IDApLFxuICAgIGJlc3RTdHJlYWtJblJ1bjogTWF0aC5tYXgoMCwgdmFsdWUuYmVzdFN0cmVha0luUnVuID8/IDApLFxuICAgIGN1cnJlbnRTdHJlYWs6IE1hdGgubWF4KDAsIHZhbHVlLmN1cnJlbnRTdHJlYWsgPz8gMCksXG4gICAgYm90TGFkZGVyOiB2YWx1ZS5ib3RMYWRkZXIgPz8gW10sXG4gICAgcm91bmRSZXN1bHRzOiB2YWx1ZS5yb3VuZFJlc3VsdHMgPz8gW10sXG4gICAgc3RhcnRlZEF0OiB2YWx1ZS5zdGFydGVkQXQgPz8gbm93LFxuICAgIGxhc3RFdmVudEF0OiB2YWx1ZS5sYXN0RXZlbnRBdCA/PyB2YWx1ZS51cGRhdGVkQXQgPz8gbm93LFxuICAgIHVwZGF0ZWRBdDogdmFsdWUudXBkYXRlZEF0ID8/IG5vdyxcbiAgICAuLi4odmFsdWUuZmluaXNoZWRBdCA/IHsgZmluaXNoZWRBdDogdmFsdWUuZmluaXNoZWRBdCB9IDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hvb3NlQWN0aXZlQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1bihcbiAgdmFsdWVzOiBBcnJheTxQYXJ0aWFsPENoZXNzaW1hbHNDaGFsbGVuZ2VSdW4+PixcbiAgdWlkPzogc3RyaW5nLFxuKTogQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1biB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZXNcbiAgICAubWFwKCh2YWx1ZSkgPT4gbm9ybWFsaXplQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1bih2YWx1ZSwgdWlkID8/IHZhbHVlLnVzZXJJZCkpXG4gICAgLmZpbHRlcigocnVuKSA9PiBydW4uc3RhdHVzID09PSAnYWN0aXZlJylcbiAgICAuc29ydCgoYSwgYikgPT4gY2hhbGxlbmdlUnVuVGltZXN0YW1wKGIpIC0gY2hhbGxlbmdlUnVuVGltZXN0YW1wKGEpKVswXTtcbn1cblxuZnVuY3Rpb24gY2hhbGxlbmdlUnVuVGltZXN0YW1wKHJ1bjogQ2hlc3NpbWFsc0NoYWxsZW5nZVJ1bik6IG51bWJlciB7XG4gIHJldHVybiBEYXRlLnBhcnNlKHJ1bi51cGRhdGVkQXQgfHwgcnVuLmxhc3RFdmVudEF0IHx8IHJ1bi5zdGFydGVkQXQpIHx8IDA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wQ2hhbGxlbmdlUm91bmQodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1pbihcbiAgICBDSEVTU0lNQUxTX0NIQUxMRU5HRV9UT1RBTF9ST1VORFMsXG4gICAgTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiAxKSksXG4gICk7XG59XG4iXX0=