@oathompsonjones/mini-games 1.0.16 → 1.0.17
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/build/base/board.d.ts +9 -4
- package/build/base/board.js +22 -8
- package/build/base/controller.d.ts +16 -8
- package/build/base/controller.js +68 -38
- package/build/games/connect4/board.d.ts +1 -0
- package/build/games/connect4/board.js +14 -10
- package/build/games/connect4/controller.js +2 -2
- package/build/games/tictactoe/controller.js +2 -2
- package/package.json +1 -1
package/build/base/board.d.ts
CHANGED
|
@@ -30,7 +30,9 @@ export default abstract class Board<T extends LongInt | number> {
|
|
|
30
30
|
/** The height of the game board. */
|
|
31
31
|
protected readonly height: number;
|
|
32
32
|
/** A stack of moves. */
|
|
33
|
-
protected readonly moves:
|
|
33
|
+
protected readonly moves: Array<Position & {
|
|
34
|
+
playerId: number;
|
|
35
|
+
}>;
|
|
34
36
|
/**
|
|
35
37
|
* Cached result of the last `winner` computation.
|
|
36
38
|
* Set to `undefined` whenever the board changes so the getter recomputes.
|
|
@@ -40,6 +42,10 @@ export default abstract class Board<T extends LongInt | number> {
|
|
|
40
42
|
private readonly numberOfPlayerBoards;
|
|
41
43
|
/** Number of boards in total (most likely also 2). */
|
|
42
44
|
private readonly numberOfBoards;
|
|
45
|
+
/** The zobrist hash table. */
|
|
46
|
+
private readonly zobrist;
|
|
47
|
+
/** The hash for the current board state. */
|
|
48
|
+
private _hash;
|
|
43
49
|
/** The board states which represent a winning state. */
|
|
44
50
|
protected abstract readonly winningStates: Array<BitBoard<T>>;
|
|
45
51
|
/**
|
|
@@ -66,11 +72,10 @@ export default abstract class Board<T extends LongInt | number> {
|
|
|
66
72
|
*/
|
|
67
73
|
get winner(): 0 | 1 | false | null;
|
|
68
74
|
/**
|
|
69
|
-
*
|
|
70
|
-
* Used as a key in the alpha-beta transposition table.
|
|
75
|
+
* Gets a unique key representing the current board state.
|
|
71
76
|
* @returns The unique board state key.
|
|
72
77
|
*/
|
|
73
|
-
get
|
|
78
|
+
get hash(): number;
|
|
74
79
|
/**
|
|
75
80
|
* Calculates which cells are empty.
|
|
76
81
|
* @returns The empty cells on the board.
|
package/build/base/board.js
CHANGED
|
@@ -23,6 +23,10 @@ export default class Board {
|
|
|
23
23
|
numberOfPlayerBoards;
|
|
24
24
|
/** Number of boards in total (most likely also 2). */
|
|
25
25
|
numberOfBoards;
|
|
26
|
+
/** The zobrist hash table. */
|
|
27
|
+
zobrist = [];
|
|
28
|
+
/** The hash for the current board state. */
|
|
29
|
+
_hash = 0;
|
|
26
30
|
/**
|
|
27
31
|
* Creates an instance of Board.
|
|
28
32
|
* @param width - The width of the game board.
|
|
@@ -39,6 +43,15 @@ export default class Board {
|
|
|
39
43
|
this.bitBoard = (totalBits > 32
|
|
40
44
|
? new LongIntBitBoard(Math.ceil(totalBits / 32))
|
|
41
45
|
: new IntBitBoard());
|
|
46
|
+
for (let x = 0; x < width; x++) {
|
|
47
|
+
this.zobrist[x] = [];
|
|
48
|
+
for (let y = 0; y < height; y++) {
|
|
49
|
+
this.zobrist[x][y] = [
|
|
50
|
+
Math.floor(Math.random() * 0xFFFFFFFF),
|
|
51
|
+
Math.floor(Math.random() * 0xFFFFFFFF),
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
42
55
|
}
|
|
43
56
|
/**
|
|
44
57
|
* Calculates whether or not the board is full.
|
|
@@ -93,13 +106,11 @@ export default class Board {
|
|
|
93
106
|
return this._cachedWinner;
|
|
94
107
|
}
|
|
95
108
|
/**
|
|
96
|
-
*
|
|
97
|
-
* Used as a key in the alpha-beta transposition table.
|
|
109
|
+
* Gets a unique key representing the current board state.
|
|
98
110
|
* @returns The unique board state key.
|
|
99
111
|
*/
|
|
100
|
-
get
|
|
101
|
-
|
|
102
|
-
return data instanceof LongInt ? data.data.join(",") : String(data);
|
|
112
|
+
get hash() {
|
|
113
|
+
return this._hash;
|
|
103
114
|
}
|
|
104
115
|
/**
|
|
105
116
|
* Calculates which cells are empty.
|
|
@@ -123,8 +134,9 @@ export default class Board {
|
|
|
123
134
|
makeMove(move, playerId) {
|
|
124
135
|
this._cachedWinner = undefined;
|
|
125
136
|
const bit = this.getBitIndex(move, playerId);
|
|
126
|
-
this.moves.push(
|
|
137
|
+
this.moves.push({ ...move, playerId });
|
|
127
138
|
this.bitBoard.setBit(bit);
|
|
139
|
+
this._hash ^= this.zobrist[move.x][move.y][playerId];
|
|
128
140
|
}
|
|
129
141
|
/**
|
|
130
142
|
* Reverses the last move.
|
|
@@ -135,7 +147,9 @@ export default class Board {
|
|
|
135
147
|
const lastMove = this.moves.pop();
|
|
136
148
|
if (lastMove === undefined)
|
|
137
149
|
throw new Error("No move to undo.");
|
|
138
|
-
this.
|
|
150
|
+
const bit = this.getBitIndex(lastMove, lastMove.playerId);
|
|
151
|
+
this.bitBoard.clearBit(bit);
|
|
152
|
+
this._hash ^= this.zobrist[lastMove.x][lastMove.y][lastMove.playerId];
|
|
139
153
|
}
|
|
140
154
|
/**
|
|
141
155
|
* Checks if a move is valid.
|
|
@@ -262,4 +276,4 @@ export default class Board {
|
|
|
262
276
|
return position.x >= 0 && position.x < this.width && position.y >= 0 && position.y < this.height;
|
|
263
277
|
}
|
|
264
278
|
}
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9ib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLGVBQWUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXNCN0Q7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsS0FBSztJQUMvQiw4Q0FBOEM7SUFDM0IsUUFBUSxDQUFjO0lBRXpDLG1DQUFtQztJQUNoQixLQUFLLENBQVM7SUFFakMsb0NBQW9DO0lBQ2pCLE1BQU0sQ0FBUztJQUVsQyx3QkFBd0I7SUFDTCxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBRXhDOzs7T0FHRztJQUNLLGFBQWEsR0FBcUMsU0FBUyxDQUFDO0lBRXBFLCtFQUErRTtJQUM5RCxvQkFBb0IsQ0FBUztJQUU5QyxzREFBc0Q7SUFDckMsY0FBYyxDQUFTO0lBS3hDOzs7Ozs7T0FNRztJQUNILFlBQXNCLEtBQWEsRUFBRSxNQUFjLEVBQUUsbUJBQTJCLENBQUMsRUFBRSxrQkFBMEIsQ0FBQztRQUMxRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsZUFBZSxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWpFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxTQUFTLEdBQUcsRUFBRTtZQUMzQixDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxT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QUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFFBQVEsQ0FBQyxJQUFjO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLFFBQWtCO1FBQ3RDLE9BQU8sUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvYml0Qm9hcmQuanNcIjtcbmltcG9ydCBJbnRCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvaW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUG9zaXRpb24gPSB7XG4gICAgeTogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbn07XG5cbi8qKiBEZWZpbmVzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gZHJhdyBhIGdyaWQuICovXG5leHBvcnQgY29uc3QgZW51bSBHcmlkTGluZXMge1xuICAgIEhvcml6b250YWwgPSBcIlxcdTI1MDBcIixcbiAgICBWZXJ0aWNhbCA9IFwiXFx1MjUwMlwiLFxuICAgIFRvcExlZnQgPSBcIlxcdTI1MENcIixcbiAgICBUb3BSaWdodCA9IFwiXFx1MjUxMFwiLFxuICAgIEJvdHRvbUxlZnQgPSBcIlxcdTI1MTRcIixcbiAgICBCb3R0b21SaWdodCA9IFwiXFx1MjUxOFwiLFxuICAgIFRMZWZ0ID0gXCJcXHUyNTFDXCIsXG4gICAgVFJpZ2h0ID0gXCJcXHUyNTI0XCIsXG4gICAgVFRvcCA9IFwiXFx1MjUyQ1wiLFxuICAgIFRCb3R0b20gPSBcIlxcdTI1MzRcIixcbiAgICBDcm9zcyA9IFwiXFx1MjUzQ1wiLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGJvYXJkLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgbnVtZXJpYyBkYXRhLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBCb2FyZDxUIGV4dGVuZHMgTG9uZ0ludCB8IG51bWJlcj4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgZGF0YSBzdG9yZWQgaW4gYSBCaXRCb2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYml0Qm9hcmQ6IEJpdEJvYXJkPFQ+O1xuXG4gICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgZ2FtZSBib2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBnYW1lIGJvYXJkLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcblxuICAgIC8qKiBBIHN0YWNrIG9mIG1vdmVzLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtb3ZlczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENhY2hlZCByZXN1bHQgb2YgdGhlIGxhc3QgYHdpbm5lcmAgY29tcHV0YXRpb24uXG4gICAgICogU2V0IHRvIGB1bmRlZmluZWRgIHdoZW5ldmVyIHRoZSBib2FyZCBjaGFuZ2VzIHNvIHRoZSBnZXR0ZXIgcmVjb21wdXRlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWNoZWRXaW5uZXI6IDAgfCAxIHwgZmFsc2UgfCBudWxsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqIEhvdyBtYW55IGJvYXJkcyB0aGVyZSBhcmUgcmVwcmVzZW50aW5nIHBsYXllciBwb3NpdGlvbnMgKG1vc3QgbGlrZWx5IDIpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbnVtYmVyT2ZQbGF5ZXJCb2FyZHM6IG51bWJlcjtcblxuICAgIC8qKiBOdW1iZXIgb2YgYm9hcmRzIGluIHRvdGFsIChtb3N0IGxpa2VseSBhbHNvIDIpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbnVtYmVyT2ZCb2FyZHM6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgYm9hcmQgc3RhdGVzIHdoaWNoIHJlcHJlc2VudCBhIHdpbm5pbmcgc3RhdGUuICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHdpbm5pbmdTdGF0ZXM6IEFycmF5PEJpdEJvYXJkPFQ+PjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJCb2FyZENvdW50IC0gSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuXG4gICAgICogQHBhcmFtIGV4dHJhQm9hcmRDb3VudCAtIE51bWJlciBvZiBleHRyYSBib2FyZHMgKG1vc3QgbGlrZWx5IDApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGxheWVyQm9hcmRDb3VudDogbnVtYmVyID0gMiwgZXh0cmFCb2FyZENvdW50OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMgPSBwbGF5ZXJCb2FyZENvdW50O1xuICAgICAgICB0aGlzLm51bWJlck9mQm9hcmRzID0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcyArIGV4dHJhQm9hcmRDb3VudDtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogdGhpcy5udW1iZXJPZkJvYXJkcztcblxuICAgICAgICB0aGlzLmJpdEJvYXJkID0gKHRvdGFsQml0cyA+IDMyXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRvdGFsQml0cyAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIEJpdEJvYXJkPFQ+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgd2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGZ1bGwuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGZ1bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0Z1bGwoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0Z1bGwgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLyAzMikpXG4gICAgICAgICAgICA6IG5ldyBJbnRCaXRCb2FyZCgpKSBhcyBCaXRCb2FyZDxUPjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKylcbiAgICAgICAgICAgIGlzRnVsbCA9IGlzRnVsbC5vcih0aGlzLmdldFBsYXllckJvYXJkKGkpKTtcbiAgICAgICAgY29uc3QgZnVsbFZhbHVlID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmRcbiAgICAgICAgICAgID8gbmV3IExvbmdJbnQoW1xuICAgICAgICAgICAgICAgIC4uLkFycmF5PG51bWJlcj4oTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAvIDMyKSAtIDEpLmZpbGwofjAgPj4+IDApLFxuICAgICAgICAgICAgICAgIDIgKiogKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAtIChNYXRoLmNlaWwodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0IC8gMzIpIC0gMSkgKiAzMikgLSAxLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIDogMiAqKiAodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0KSAtIDEpIGFzIFQ7XG5cbiAgICAgICAgcmV0dXJuIGlzRnVsbC5lcXVhbHMoZnVsbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgYm9hcmQgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNFbXB0eSA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIEJpdEJvYXJkPFQ+O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZlBsYXllckJvYXJkczsgaSsrKVxuICAgICAgICAgICAgaXNFbXB0eSA9IGlzRW1wdHkub3IodGhpcy5nZXRQbGF5ZXJCb2FyZChpKSk7XG5cbiAgICAgICAgcmV0dXJuIGlzRW1wdHkuZXF1YWxzKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgd2hvIHRoZSB3aW5uZXIgaXMuXG4gICAgICogQHJldHVybnMgYGZhbHNlYCBpZiB0aGUgZ2FtZSBpcyBub3Qgb3ZlciwgdGhlIHBsYXllciBJRCBpZiB0aGVyZSBpcyBhIHdpbm5lciwgYW5kIGBudWxsYCBpZiB0aGVyZSBpcyBhIGRyYXcuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aW5uZXIoKTogMCB8IDEgfCBmYWxzZSB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkV2lubmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkV2lubmVyO1xuXG4gICAgICAgIGNvbnN0IHBsYXllck9uZUJvYXJkID0gdGhpcy5nZXRQbGF5ZXJCb2FyZCgwKTtcbiAgICAgICAgY29uc3QgcGxheWVyVHdvQm9hcmQgPSB0aGlzLmdldFBsYXllckJvYXJkKDEpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgdGhpcy53aW5uaW5nU3RhdGVzKSB7XG4gICAgICAgICAgICBpZiAocGxheWVyT25lQm9hcmQuYW5kKHN0YXRlKS5lcXVhbHMoc3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkV2lubmVyID0gMDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGxheWVyVHdvQm9hcmQuYW5kKHN0YXRlKS5lcXVhbHMoc3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkV2lubmVyID0gMTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FjaGVkV2lubmVyID0gdGhpcy5pc0Z1bGwgPyBudWxsIDogZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFdpbm5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29tcGFjdCBzdHJpbmcga2V5IHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIFVzZWQgYXMgYSBrZXkgaW4gdGhlIGFscGhhLWJldGEgdHJhbnNwb3NpdGlvbiB0YWJsZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdW5pcXVlIGJvYXJkIHN0YXRlIGtleS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc2hLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLmJpdEJvYXJkO1xuXG4gICAgICAgIHJldHVybiBkYXRhIGluc3RhbmNlb2YgTG9uZ0ludCA/IGRhdGEuZGF0YS5qb2luKFwiLFwiKSA6IFN0cmluZyhkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoaWNoIGNlbGxzIGFyZSBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW1wdHkgY2VsbHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0pID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgYSBnaXZlbiBib2FyZCBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGhldXJpc3RpYygpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgd2hvJ3MgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRXaW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGJpdCA9IHRoaXMuZ2V0Qml0SW5kZXgobW92ZSwgcGxheWVySWQpO1xuXG4gICAgICAgIHRoaXMubW92ZXMucHVzaChiaXQpO1xuICAgICAgICB0aGlzLmJpdEJvYXJkLnNldEJpdChiaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBsYXN0IG1vdmUuXG4gICAgICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlcmUgaXMgbm8gbW92ZSB0byB1bmRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmRvTGFzdE1vdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbGFzdE1vdmUgPSB0aGlzLm1vdmVzLnBvcCgpO1xuXG4gICAgICAgIGlmIChsYXN0TW92ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbW92ZSB0byB1bmRvLlwiKTtcblxuICAgICAgICB0aGlzLmJpdEJvYXJkLmNsZWFyQml0KGxhc3RNb3ZlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtb3ZlIGlzIHZhbGlkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IGl0J3MgdmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIG1vdmVJc1ZhbGlkKG1vdmU6IFBvc2l0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWRQb3NpdGlvbihtb3ZlKSAmJiB0aGlzLmNlbGxPY2N1cGllcihtb3ZlKSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hpY2ggcGxheWVyIGlzIG9jY3VweWluZyBhIGdpdmVuIGNlbGwuXG4gICAgICogQHBhcmFtIGNlbGwgLSBUaGUgY2VsbCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgY2VsbCBpcyBlbXB0eSwgdGhlIG91dHB1dCBpcyBudWxsLCBvdGhlcndpc2UgdGhlIG91dHB1dCBpcyB0aGUgcGxheWVyJ3MgSUQuXG4gICAgICovXG4gICAgcHVibGljIGNlbGxPY2N1cGllcihjZWxsOiBQb3NpdGlvbik6IG51bWJlciB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYml0Qm9hcmQuZ2V0Qml0KHRoaXMuZ2V0Qml0SW5kZXgoY2VsbCwgaSkpID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIHdyYXAgLSBXaGV0aGVyIG9yIG5vdCB0byBwcm92aWRlIGEgYm9yZGVyIGZvciB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIGxhYmVsWCAtIFdoZXRoZXIgb3Igbm90IHRvIGxhYmVsIHguXG4gICAgICogQHBhcmFtIGxhYmVsWSAtIFdoZXRoZXIgb3Igbm90IHRvIGxhYmVsIHkuXG4gICAgICogQHBhcmFtIHN5bWJvbHMgLSBUaGUgc3ltYm9scyB0byB1c2UgYXMgYm9hcmQgcGllY2VzLlxuICAgICAqIEBwYXJhbSBjb2xvdXIgLSBXaGV0aGVyIG9yIG5vdCB0byBjb2xvdXIgdGhlIHBpZWNlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIHRoZSBzeW1ib2xzIGFyZSBub3QgdGhlIHNhbWUgbGVuZ3RoLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZyhcbiAgICAgICAgd3JhcDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGxhYmVsWDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGxhYmVsWTogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHN5bWJvbHM6IHN0cmluZ1tdID0gW1wiWFwiLCBcIk9cIl0sXG4gICAgICAgIGNvbG91cjogYm9vbGVhbiA9IHRydWUsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN5bWJvbHMubGVuZ3RoICE9PSB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9vIG1hbnkgc3ltYm9scy5cIik7XG5cbiAgICAgICAgY29uc3Qgc3ltYm9sTGVuZ3RoID0gc3ltYm9sc1swXSEubGVuZ3RoO1xuXG4gICAgICAgIGlmIChzeW1ib2xzLnNvbWUoKHMpID0+IHMubGVuZ3RoICE9PSBzeW1ib2xMZW5ndGgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3ltYm9scyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aC5cIik7XG5cbiAgICAgICAgY29uc3QgbWF0Y2hDZWxsU3BhY2UgPSBuZXcgUmVnRXhwKGAueyR7c3ltYm9sTGVuZ3RoICsgMn19YCwgXCJndVwiKTtcbiAgICAgICAgY29uc3QgYWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbiAgICAgICAgY29uc3QgeExhYmVscyA9IGxhYmVsWFxuICAgICAgICAgICAgPyBgJHthbHBoYWJldC5zbGljZSgwLCB0aGlzLndpZHRoKVxuICAgICAgICAgICAgICAgIC5zcGxpdChcIlwiKVxuICAgICAgICAgICAgICAgIC5tYXAoKGxldHRlcikgPT4gYCAke2xldHRlci5wYWRTdGFydChzeW1ib2xMZW5ndGgpfSBgKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiXCIpXG4gICAgICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgICAgICAuam9pbihcIiBcIilcbiAgICAgICAgICAgICAgICAucGFkU3RhcnQoNCAqIHRoaXMud2lkdGggLSAxICsgTnVtYmVyKHdyYXApICsgTnVtYmVyKGxhYmVsWSkpXG4gICAgICAgICAgICB9XFxuYFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCB0b3BCb3JkZXIgPSB3cmFwXG4gICAgICAgICAgICA/IGAke2xhYmVsWSA/IFwiIFwiIDogXCJcIn0ke0dyaWRMaW5lcy5Ub3BMZWZ0fSR7R3JpZExpbmVzLkhvcml6b250YWxcbiAgICAgICAgICAgICAgICAucmVwZWF0KHRoaXMud2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgICAgICAuam9pbihHcmlkTGluZXMuVFRvcCl9JHtHcmlkTGluZXMuVG9wUmlnaHR9XFxuYFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCBib3R0b21Cb3JkZXIgPSB3cmFwXG4gICAgICAgICAgICA/IGAke2xhYmVsWSA/IFwiIFwiIDogXCJcIn0ke0dyaWRMaW5lcy5Cb3R0b21MZWZ0fSR7R3JpZExpbmVzLkhvcml6b250YWxcbiAgICAgICAgICAgICAgICAucmVwZWF0KHRoaXMud2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgICAgICAuam9pbihHcmlkTGluZXMuVEJvdHRvbSl9JHtHcmlkTGluZXMuQm90dG9tUmlnaHR9YFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCByb3dTZXBhcmF0b3IgPSBgJHtsYWJlbFkgPyBcIiBcIiA6IFwiXCJ9JHt3cmFwID8gR3JpZExpbmVzLlRMZWZ0IDogXCJcIn0ke0dyaWRMaW5lcy5Ib3Jpem9udGFsXG4gICAgICAgICAgICAucmVwZWF0KHRoaXMud2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAubWF0Y2gobWF0Y2hDZWxsU3BhY2UpIVxuICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLkNyb3NzKX0ke3dyYXAgPyBHcmlkTGluZXMuVFJpZ2h0IDogXCJcIn1cXG5gO1xuICAgICAgICBjb25zdCByb3dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgY29uc3QgeUxhYmVsID0gbGFiZWxZID8gYCR7eSArIDF9YCA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBsZWZ0Qm9yZGVyID0gd3JhcCA/IEdyaWRMaW5lcy5WZXJ0aWNhbCA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCByaWdodEJvcmRlciA9IHdyYXAgPyBHcmlkTGluZXMuVmVydGljYWwgOiBcIlwiO1xuICAgICAgICAgICAgbGV0IHJvdyA9IGAke3lMYWJlbH0ke2xlZnRCb3JkZXJ9YDtcblxuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0geyB4LCB5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYmFyID0geCA9PT0gdGhpcy53aWR0aCAtIDEgPyBcIlwiIDogR3JpZExpbmVzLlZlcnRpY2FsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxPY2N1cGllciA9IHRoaXMuY2VsbE9jY3VwaWVyKGNlbGwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNlbGxPY2N1cGllciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYCAke1wiIFwiLnJlcGVhdChzeW1ib2xMZW5ndGgpfSAke2Jhcn1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdyArPSBgICR7Y29sb3VyID8gYFxceDFiWyR7WzkxLCA5M11bY2VsbE9jY3VwaWVyXSF9bWAgOiBcIlwifWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3ltYm9sc1tjZWxsT2NjdXBpZXJdfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7Y29sb3VyID8gXCJcXHgxYlswbVwiIDogXCJcIn0gJHtiYXJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzLnB1c2goYCR7cm93fSR7cmlnaHRCb3JkZXJ9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7eExhYmVsc30ke3RvcEJvcmRlcn0ke3Jvd3Muam9pbihyb3dTZXBhcmF0b3IpfSR7Ym90dG9tQm9yZGVyfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpdCBpbmRleCBmcm9tIGl0cyBjb29yZGluYXRlcyBhbmQgcGxheWVyIElELlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgSUQgdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBiaXQgaW5kZXggb2YgdGhlIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEJpdEluZGV4KG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW92ZUluZGV4ID0gdGhpcy5nZXRJbmRleChtb3ZlKTtcbiAgICAgICAgY29uc3QgYml0Qm9hcmRNb3ZlSW5kZXggPSBtb3ZlSW5kZXggKyB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiBwbGF5ZXJJZDtcblxuICAgICAgICByZXR1cm4gYml0Qm9hcmRNb3ZlSW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBCaXRCb2FyZCBjb250YWluaW5nIG9ubHkgdGhlIHBsYXllcidzIGJpdHMuXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllcidzIElEIHRvIGdldCB0aGUgYm9hcmQgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIncyBiaXRzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQbGF5ZXJCb2FyZChwbGF5ZXJJZDogbnVtYmVyKTogQml0Qm9hcmQ8VD4ge1xuICAgICAgICBjb25zdCB0b3RhbEJpdHMgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZCA/IHRoaXMuYml0Qm9hcmQuZGF0YS53b3JkQ291bnQgOiAxKSAqIDMyO1xuICAgICAgICBjb25zdCBib2FyZFNpemUgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYml0Qm9hcmQubGVmdFNoaWZ0KHRvdGFsQml0cyAtIGJvYXJkU2l6ZSAqIChwbGF5ZXJJZCArIDEpKS5yaWdodFNoaWZ0KHRvdGFsQml0cyAtIGJvYXJkU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpdCBpbmRleCBmcm9tIGl0cyBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0IGluZGV4LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0SW5kZXgobW92ZTogUG9zaXRpb24pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCAqIG1vdmUueSArIG1vdmUueDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtb3ZlIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gYm9hcmQuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgdGhhdCBjZWxsIGlzIGFscmVhZHkgb2NjdXBpZWQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoYXQgY2VsbCBleGlzdHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWxpZFBvc2l0aW9uKHBvc2l0aW9uOiBQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcG9zaXRpb24ueCA+PSAwICYmIHBvc2l0aW9uLnggPCB0aGlzLndpZHRoICYmIHBvc2l0aW9uLnkgPj0gMCAmJiBwb3NpdGlvbi55IDwgdGhpcy5oZWlnaHQ7XG4gICAgfVxufVxuIl19
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9ib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLGVBQWUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXNCN0Q7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsS0FBSztJQUMvQiw4Q0FBOEM7SUFDM0IsUUFBUSxDQUFjO0lBRXpDLG1DQUFtQztJQUNoQixLQUFLLENBQVM7SUFFakMsb0NBQW9DO0lBQ2pCLE1BQU0sQ0FBUztJQUVsQyx3QkFBd0I7SUFDTCxLQUFLLEdBQTRDLEVBQUUsQ0FBQztJQUV2RTs7O09BR0c7SUFDSyxhQUFhLEdBQXFDLFNBQVMsQ0FBQztJQUVwRSwrRUFBK0U7SUFDOUQsb0JBQW9CLENBQVM7SUFFOUMsc0RBQXNEO0lBQ3JDLGNBQWMsQ0FBUztJQUV4Qyw4QkFBOEI7SUFDYixPQUFPLEdBQWlCLEVBQUUsQ0FBQztJQUU1Qyw0Q0FBNEM7SUFDcEMsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUsxQjs7Ozs7O09BTUc7SUFDSCxZQUFzQixLQUFhLEVBQUUsTUFBYyxFQUFFLG1CQUEyQixDQUFDLEVBQUUsa0JBQTBCLENBQUM7UUFDMUcsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztRQUNsRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFB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QUN0QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckcsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQml0Qm9hcmQgZnJvbSBcIi4uL2JpdEJvYXJkL2JpdEJvYXJkLmpzXCI7XG5pbXBvcnQgSW50Qml0Qm9hcmQgZnJvbSBcIi4uL2JpdEJvYXJkL2ludEJpdEJvYXJkLmpzXCI7XG5pbXBvcnQgTG9uZ0ludCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IExvbmdJbnRCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uID0ge1xuICAgIHk6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG59O1xuXG4vKiogRGVmaW5lcyB0aGUgY2hhcmFjdGVycyB1c2VkIHRvIGRyYXcgYSBncmlkLiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gR3JpZExpbmVzIHtcbiAgICBIb3Jpem9udGFsID0gXCJcXHUyNTAwXCIsXG4gICAgVmVydGljYWwgPSBcIlxcdTI1MDJcIixcbiAgICBUb3BMZWZ0ID0gXCJcXHUyNTBDXCIsXG4gICAgVG9wUmlnaHQgPSBcIlxcdTI1MTBcIixcbiAgICBCb3R0b21MZWZ0ID0gXCJcXHUyNTE0XCIsXG4gICAgQm90dG9tUmlnaHQgPSBcIlxcdTI1MThcIixcbiAgICBUTGVmdCA9IFwiXFx1MjUxQ1wiLFxuICAgIFRSaWdodCA9IFwiXFx1MjUyNFwiLFxuICAgIFRUb3AgPSBcIlxcdTI1MkNcIixcbiAgICBUQm90dG9tID0gXCJcXHUyNTM0XCIsXG4gICAgQ3Jvc3MgPSBcIlxcdTI1M0NcIixcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2FtZSBib2FyZC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIG51bWVyaWMgZGF0YS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQm9hcmQ8VCBleHRlbmRzIExvbmdJbnQgfCBudW1iZXI+IHtcbiAgICAvKiogQ29udGFpbnMgdGhlIGRhdGEgc3RvcmVkIGluIGEgQml0Qm9hcmQuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpdEJvYXJkOiBCaXRCb2FyZDxUPjtcblxuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIGdhbWUgYm9hcmQuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG5cbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgZ2FtZSBib2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKiogQSBzdGFjayBvZiBtb3Zlcy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW92ZXM6IEFycmF5PFBvc2l0aW9uICYgeyBwbGF5ZXJJZDogbnVtYmVyOyB9PiA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGVkIHJlc3VsdCBvZiB0aGUgbGFzdCBgd2lubmVyYCBjb21wdXRhdGlvbi5cbiAgICAgKiBTZXQgdG8gYHVuZGVmaW5lZGAgd2hlbmV2ZXIgdGhlIGJvYXJkIGNoYW5nZXMgc28gdGhlIGdldHRlciByZWNvbXB1dGVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhY2hlZFdpbm5lcjogMCB8IDEgfCBmYWxzZSB8IG51bGwgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvKiogSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBudW1iZXJPZlBsYXllckJvYXJkczogbnVtYmVyO1xuXG4gICAgLyoqIE51bWJlciBvZiBib2FyZHMgaW4gdG90YWwgKG1vc3QgbGlrZWx5IGFsc28gMikuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBudW1iZXJPZkJvYXJkczogbnVtYmVyO1xuXG4gICAgLyoqIFRoZSB6b2JyaXN0IGhhc2ggdGFibGUuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b2JyaXN0OiBudW1iZXJbXVtdW10gPSBbXTtcblxuICAgIC8qKiBUaGUgaGFzaCBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuICovXG4gICAgcHJpdmF0ZSBfaGFzaDogbnVtYmVyID0gMDtcblxuICAgIC8qKiBUaGUgYm9hcmQgc3RhdGVzIHdoaWNoIHJlcHJlc2VudCBhIHdpbm5pbmcgc3RhdGUuICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHdpbm5pbmdTdGF0ZXM6IEFycmF5PEJpdEJvYXJkPFQ+PjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJCb2FyZENvdW50IC0gSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuXG4gICAgICogQHBhcmFtIGV4dHJhQm9hcmRDb3VudCAtIE51bWJlciBvZiBleHRyYSBib2FyZHMgKG1vc3QgbGlrZWx5IDApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGxheWVyQm9hcmRDb3VudDogbnVtYmVyID0gMiwgZXh0cmFCb2FyZENvdW50OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMgPSBwbGF5ZXJCb2FyZENvdW50O1xuICAgICAgICB0aGlzLm51bWJlck9mQm9hcmRzID0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcyArIGV4dHJhQm9hcmRDb3VudDtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogdGhpcy5udW1iZXJPZkJvYXJkcztcblxuICAgICAgICB0aGlzLmJpdEJvYXJkID0gKHRvdGFsQml0cyA+IDMyXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRvdGFsQml0cyAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIEJpdEJvYXJkPFQ+O1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgdGhpcy56b2JyaXN0W3hdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b2JyaXN0W3hdIVt5XSA9IFtcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMHhGRkZGRkZGRiksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDB4RkZGRkZGRkYpLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBmdWxsLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBmdWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGdWxsKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNGdWxsID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmRcbiAgICAgICAgICAgID8gbmV3IExvbmdJbnRCaXRCb2FyZChNYXRoLmNlaWwodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0IC8gMzIpKVxuICAgICAgICAgICAgOiBuZXcgSW50Qml0Qm9hcmQoKSkgYXMgQml0Qm9hcmQ8VD47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzOyBpKyspXG4gICAgICAgICAgICBpc0Z1bGwgPSBpc0Z1bGwub3IodGhpcy5nZXRQbGF5ZXJCb2FyZChpKSk7XG4gICAgICAgIGNvbnN0IGZ1bGxWYWx1ZSA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50KFtcbiAgICAgICAgICAgICAgICAuLi5BcnJheTxudW1iZXI+KE1hdGguY2VpbCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLyAzMikgLSAxKS5maWxsKH4wID4+PiAwKSxcbiAgICAgICAgICAgICAgICAyICoqICh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLSAoTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAvIDMyKSAtIDEpICogMzIpIC0gMSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICA6IDIgKiogKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCkgLSAxKSBhcyBUO1xuXG4gICAgICAgIHJldHVybiBpc0Z1bGwuZXF1YWxzKGZ1bGxWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgYm9hcmQgaXMgZW1wdHkuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGlzRW1wdHkgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLyAzMikpXG4gICAgICAgICAgICA6IG5ldyBJbnRCaXRCb2FyZCgpKSBhcyBCaXRCb2FyZDxUPjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKylcbiAgICAgICAgICAgIGlzRW1wdHkgPSBpc0VtcHR5Lm9yKHRoaXMuZ2V0UGxheWVyQm9hcmQoaSkpO1xuXG4gICAgICAgIHJldHVybiBpc0VtcHR5LmVxdWFscygwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdobyB0aGUgd2lubmVyIGlzLlxuICAgICAqIEByZXR1cm5zIGBmYWxzZWAgaWYgdGhlIGdhbWUgaXMgbm90IG92ZXIsIHRoZSBwbGF5ZXIgSUQgaWYgdGhlcmUgaXMgYSB3aW5uZXIsIGFuZCBgbnVsbGAgaWYgdGhlcmUgaXMgYSBkcmF3LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lubmVyKCk6IDAgfCAxIHwgZmFsc2UgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlZFdpbm5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFdpbm5lcjtcblxuICAgICAgICBjb25zdCBwbGF5ZXJPbmVCb2FyZCA9IHRoaXMuZ2V0UGxheWVyQm9hcmQoMCk7XG4gICAgICAgIGNvbnN0IHBsYXllclR3b0JvYXJkID0gdGhpcy5nZXRQbGF5ZXJCb2FyZCgxKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRoaXMud2lubmluZ1N0YXRlcykge1xuICAgICAgICAgICAgaWYgKHBsYXllck9uZUJvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IDA7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBsYXllclR3b0JvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IDE7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IHRoaXMuaXNGdWxsID8gbnVsbCA6IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRXaW5uZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHVuaXF1ZSBrZXkgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1bmlxdWUgYm9hcmQgc3RhdGUga2V5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoaWNoIGNlbGxzIGFyZSBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW1wdHkgY2VsbHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0pID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgYSBnaXZlbiBib2FyZCBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGhldXJpc3RpYygpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgd2hvJ3MgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRXaW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGJpdCA9IHRoaXMuZ2V0Qml0SW5kZXgobW92ZSwgcGxheWVySWQpO1xuXG4gICAgICAgIHRoaXMubW92ZXMucHVzaCh7IC4uLm1vdmUsIHBsYXllcklkIH0pO1xuICAgICAgICB0aGlzLmJpdEJvYXJkLnNldEJpdChiaXQpO1xuICAgICAgICB0aGlzLl9oYXNoIF49IHRoaXMuem9icmlzdFttb3ZlLnhdIVttb3ZlLnldIVtwbGF5ZXJJZF0hO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBsYXN0IG1vdmUuXG4gICAgICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlcmUgaXMgbm8gbW92ZSB0byB1bmRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmRvTGFzdE1vdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbGFzdE1vdmUgPSB0aGlzLm1vdmVzLnBvcCgpO1xuXG4gICAgICAgIGlmIChsYXN0TW92ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbW92ZSB0byB1bmRvLlwiKTtcblxuICAgICAgICBjb25zdCBiaXQgPSB0aGlzLmdldEJpdEluZGV4KGxhc3RNb3ZlLCBsYXN0TW92ZS5wbGF5ZXJJZCk7XG5cbiAgICAgICAgdGhpcy5iaXRCb2FyZC5jbGVhckJpdChiaXQpO1xuICAgICAgICB0aGlzLl9oYXNoIF49IHRoaXMuem9icmlzdFtsYXN0TW92ZS54XSFbbGFzdE1vdmUueV0hW2xhc3RNb3ZlLnBsYXllcklkXSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbW92ZSBpcyB2YWxpZC5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgbW92ZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBpdCdzIHZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlSXNWYWxpZChtb3ZlOiBQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkUG9zaXRpb24obW92ZSkgJiYgdGhpcy5jZWxsT2NjdXBpZXIobW92ZSkgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoaWNoIHBsYXllciBpcyBvY2N1cHlpbmcgYSBnaXZlbiBjZWxsLlxuICAgICAqIEBwYXJhbSBjZWxsIC0gVGhlIGNlbGwgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgSWYgdGhlIGNlbGwgaXMgZW1wdHksIHRoZSBvdXRwdXQgaXMgbnVsbCwgb3RoZXJ3aXNlIHRoZSBvdXRwdXQgaXMgdGhlIHBsYXllcidzIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBjZWxsT2NjdXBpZXIoY2VsbDogUG9zaXRpb24pOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJpdEJvYXJkLmdldEJpdCh0aGlzLmdldEJpdEluZGV4KGNlbGwsIGkpKSA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSB3cmFwIC0gV2hldGhlciBvciBub3QgdG8gcHJvdmlkZSBhIGJvcmRlciBmb3IgdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBsYWJlbFggLSBXaGV0aGVyIG9yIG5vdCB0byBsYWJlbCB4LlxuICAgICAqIEBwYXJhbSBsYWJlbFkgLSBXaGV0aGVyIG9yIG5vdCB0byBsYWJlbCB5LlxuICAgICAqIEBwYXJhbSBzeW1ib2xzIC0gVGhlIHN5bWJvbHMgdG8gdXNlIGFzIGJvYXJkIHBpZWNlcy5cbiAgICAgKiBAcGFyYW0gY29sb3VyIC0gV2hldGhlciBvciBub3QgdG8gY29sb3VyIHRoZSBwaWVjZXMuXG4gICAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB0aGUgc3ltYm9scyBhcmUgbm90IHRoZSBzYW1lIGxlbmd0aC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcoXG4gICAgICAgIHdyYXA6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBsYWJlbFg6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBsYWJlbFk6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBzeW1ib2xzOiBzdHJpbmdbXSA9IFtcIlhcIiwgXCJPXCJdLFxuICAgICAgICBjb2xvdXI6IGJvb2xlYW4gPSB0cnVlLFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzeW1ib2xzLmxlbmd0aCAhPT0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRvbyBtYW55IHN5bWJvbHMuXCIpO1xuXG4gICAgICAgIGNvbnN0IHN5bWJvbExlbmd0aCA9IHN5bWJvbHNbMF0hLmxlbmd0aDtcblxuICAgICAgICBpZiAoc3ltYm9scy5zb21lKChzKSA9PiBzLmxlbmd0aCAhPT0gc3ltYm9sTGVuZ3RoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bWJvbHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGguXCIpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoQ2VsbFNwYWNlID0gbmV3IFJlZ0V4cChgLnske3N5bWJvbExlbmd0aCArIDJ9fWAsIFwiZ3VcIik7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgICAgIGNvbnN0IHhMYWJlbHMgPSBsYWJlbFhcbiAgICAgICAgICAgID8gYCR7YWxwaGFiZXQuc2xpY2UoMCwgdGhpcy53aWR0aClcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgICAgICAubWFwKChsZXR0ZXIpID0+IGAgJHtsZXR0ZXIucGFkU3RhcnQoc3ltYm9sTGVuZ3RoKX0gYClcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDQgKiB0aGlzLndpZHRoIC0gMSArIE51bWJlcih3cmFwKSArIE51bWJlcihsYWJlbFkpKVxuICAgICAgICAgICAgfVxcbmBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3QgdG9wQm9yZGVyID0gd3JhcFxuICAgICAgICAgICAgPyBgJHtsYWJlbFkgPyBcIiBcIiA6IFwiXCJ9JHtHcmlkTGluZXMuVG9wTGVmdH0ke0dyaWRMaW5lcy5Ib3Jpem9udGFsXG4gICAgICAgICAgICAgICAgLnJlcGVhdCh0aGlzLndpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLlRUb3ApfSR7R3JpZExpbmVzLlRvcFJpZ2h0fVxcbmBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3QgYm90dG9tQm9yZGVyID0gd3JhcFxuICAgICAgICAgICAgPyBgJHtsYWJlbFkgPyBcIiBcIiA6IFwiXCJ9JHtHcmlkTGluZXMuQm90dG9tTGVmdH0ke0dyaWRMaW5lcy5Ib3Jpem9udGFsXG4gICAgICAgICAgICAgICAgLnJlcGVhdCh0aGlzLndpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLlRCb3R0b20pfSR7R3JpZExpbmVzLkJvdHRvbVJpZ2h0fWBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3Qgcm93U2VwYXJhdG9yID0gYCR7bGFiZWxZID8gXCIgXCIgOiBcIlwifSR7d3JhcCA/IEdyaWRMaW5lcy5UTGVmdCA6IFwiXCJ9JHtHcmlkTGluZXMuSG9yaXpvbnRhbFxuICAgICAgICAgICAgLnJlcGVhdCh0aGlzLndpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgIC5qb2luKEdyaWRMaW5lcy5Dcm9zcyl9JHt3cmFwID8gR3JpZExpbmVzLlRSaWdodCA6IFwiXCJ9XFxuYDtcbiAgICAgICAgY29uc3Qgcm93czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHlMYWJlbCA9IGxhYmVsWSA/IGAke3kgKyAxfWAgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgbGVmdEJvcmRlciA9IHdyYXAgPyBHcmlkTGluZXMuVmVydGljYWwgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRCb3JkZXIgPSB3cmFwID8gR3JpZExpbmVzLlZlcnRpY2FsIDogXCJcIjtcbiAgICAgICAgICAgIGxldCByb3cgPSBgJHt5TGFiZWx9JHtsZWZ0Qm9yZGVyfWA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHsgeCwgeSB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhciA9IHggPT09IHRoaXMud2lkdGggLSAxID8gXCJcIiA6IEdyaWRMaW5lcy5WZXJ0aWNhbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsT2NjdXBpZXIgPSB0aGlzLmNlbGxPY2N1cGllcihjZWxsKTtcblxuICAgICAgICAgICAgICAgIGlmIChjZWxsT2NjdXBpZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93ICs9IGAgJHtcIiBcIi5yZXBlYXQoc3ltYm9sTGVuZ3RoKX0gJHtiYXJ9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYCAke2NvbG91ciA/IGBcXHgxYlske1s5MSwgOTNdW2NlbGxPY2N1cGllcl0hfW1gIDogXCJcIn1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3N5bWJvbHNbY2VsbE9jY3VwaWVyXX1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbG91ciA/IFwiXFx4MWJbMG1cIiA6IFwiXCJ9ICR7YmFyfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93cy5wdXNoKGAke3Jvd30ke3JpZ2h0Qm9yZGVyfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3hMYWJlbHN9JHt0b3BCb3JkZXJ9JHtyb3dzLmpvaW4ocm93U2VwYXJhdG9yKX0ke2JvdHRvbUJvcmRlcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaXQgaW5kZXggZnJvbSBpdHMgY29vcmRpbmF0ZXMgYW5kIHBsYXllciBJRC5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgLSBUaGUgcGxheWVyIElEIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0IGluZGV4IG9mIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRCaXRJbmRleChtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1vdmVJbmRleCA9IHRoaXMuZ2V0SW5kZXgobW92ZSk7XG4gICAgICAgIGNvbnN0IGJpdEJvYXJkTW92ZUluZGV4ID0gbW92ZUluZGV4ICsgdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogcGxheWVySWQ7XG5cbiAgICAgICAgcmV0dXJuIGJpdEJvYXJkTW92ZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgQml0Qm9hcmQgY29udGFpbmluZyBvbmx5IHRoZSBwbGF5ZXIncyBiaXRzLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIncyBJRCB0byBnZXQgdGhlIGJvYXJkIGZvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGxheWVyJ3MgYml0cy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGxheWVyQm9hcmQocGxheWVySWQ6IG51bWJlcik6IEJpdEJvYXJkPFQ+IHtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmQgPyB0aGlzLmJpdEJvYXJkLmRhdGEud29yZENvdW50IDogMSkgKiAzMjtcbiAgICAgICAgY29uc3QgYm9hcmRTaXplID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJpdEJvYXJkLmxlZnRTaGlmdCh0b3RhbEJpdHMgLSBib2FyZFNpemUgKiAocGxheWVySWQgKyAxKSkucmlnaHRTaGlmdCh0b3RhbEJpdHMgLSBib2FyZFNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaXQgaW5kZXggZnJvbSBpdHMgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIG1vdmUgLSBUaGUgY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybnMgVGhlIGJpdCBpbmRleC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEluZGV4KG1vdmU6IFBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKiBtb3ZlLnkgKyBtb3ZlLng7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbW92ZSBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIGJvYXJkLlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIHRoYXQgY2VsbCBpcyBhbHJlYWR5IG9jY3VwaWVkLlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGF0IGNlbGwgZXhpc3RzIG9uIHRoZSBib2FyZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVmFsaWRQb3NpdGlvbihwb3NpdGlvbjogUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uLnggPj0gMCAmJiBwb3NpdGlvbi54IDwgdGhpcy53aWR0aCAmJiBwb3NpdGlvbi55ID49IDAgJiYgcG9zaXRpb24ueSA8IHRoaXMuaGVpZ2h0O1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -37,8 +37,10 @@ export default abstract class Controller<T extends Board<LongInt | number>> exte
|
|
|
37
37
|
}>;
|
|
38
38
|
/** Contains the ID of the current player. */
|
|
39
39
|
private currentPlayerId;
|
|
40
|
-
/**
|
|
41
|
-
private readonly
|
|
40
|
+
/** Contains the transposition table for the minimax algorithm. */
|
|
41
|
+
private readonly transposition;
|
|
42
|
+
/** Contains the best moves for the minimax algorithm. */
|
|
43
|
+
private readonly bestMoves;
|
|
42
44
|
/**
|
|
43
45
|
* Creates an instance of Controller.
|
|
44
46
|
* @param playerTypes - The types of player for the game.
|
|
@@ -62,17 +64,23 @@ export default abstract class Controller<T extends Board<LongInt | number>> exte
|
|
|
62
64
|
*/
|
|
63
65
|
play(): Promise<void>;
|
|
64
66
|
/**
|
|
65
|
-
*
|
|
67
|
+
* A wrapper for the minimax algorithm to find the optimal move for the current board state.
|
|
68
|
+
* @param maxDepth - The maximum depth to search.
|
|
69
|
+
* @returns The optimal move for the current board state.
|
|
70
|
+
*/
|
|
71
|
+
protected search(maxDepth: number): {
|
|
72
|
+
move: Position;
|
|
73
|
+
score: number;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* The minimax (negamax) algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
|
|
66
77
|
* @param depth - The depth of the algorithm.
|
|
67
78
|
* @param alpha - The bounds for the alpha-beta variation of the algorithm.
|
|
68
79
|
* @param beta - The bounds for the alpha-beta variation of the algorithm.
|
|
69
|
-
* @param
|
|
80
|
+
* @param playerId - The player to calculate the move for.
|
|
70
81
|
* @returns The optimal move.
|
|
71
82
|
*/
|
|
72
|
-
|
|
73
|
-
move: Position;
|
|
74
|
-
score: number;
|
|
75
|
-
};
|
|
83
|
+
private minimax;
|
|
76
84
|
/** Changes which player's turn it is. */
|
|
77
85
|
private nextTurn;
|
|
78
86
|
/**
|
package/build/base/controller.js
CHANGED
|
@@ -20,8 +20,10 @@ export default class Controller extends EventEmitter {
|
|
|
20
20
|
players;
|
|
21
21
|
/** Contains the ID of the current player. */
|
|
22
22
|
currentPlayerId = 0;
|
|
23
|
-
/**
|
|
24
|
-
|
|
23
|
+
/** Contains the transposition table for the minimax algorithm. */
|
|
24
|
+
transposition = new Map();
|
|
25
|
+
/** Contains the best moves for the minimax algorithm. */
|
|
26
|
+
bestMoves = new Map();
|
|
25
27
|
/**
|
|
26
28
|
* Creates an instance of Controller.
|
|
27
29
|
* @param playerTypes - The types of player for the game.
|
|
@@ -63,53 +65,81 @@ export default class Controller extends EventEmitter {
|
|
|
63
65
|
await this.makeMove();
|
|
64
66
|
}
|
|
65
67
|
/**
|
|
66
|
-
*
|
|
68
|
+
* A wrapper for the minimax algorithm to find the optimal move for the current board state.
|
|
69
|
+
* @param maxDepth - The maximum depth to search.
|
|
70
|
+
* @returns The optimal move for the current board state.
|
|
71
|
+
*/
|
|
72
|
+
search(maxDepth) {
|
|
73
|
+
let best = {
|
|
74
|
+
move: { x: NaN, y: NaN },
|
|
75
|
+
score: -Infinity,
|
|
76
|
+
};
|
|
77
|
+
for (let depth = 1; depth <= maxDepth; depth++)
|
|
78
|
+
best = this.minimax(depth, -Infinity, Infinity, this.currentPlayerId);
|
|
79
|
+
return best;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The minimax (negamax) algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
|
|
67
83
|
* @param depth - The depth of the algorithm.
|
|
68
84
|
* @param alpha - The bounds for the alpha-beta variation of the algorithm.
|
|
69
85
|
* @param beta - The bounds for the alpha-beta variation of the algorithm.
|
|
70
|
-
* @param
|
|
86
|
+
* @param playerId - The player to calculate the move for.
|
|
71
87
|
* @returns The optimal move.
|
|
72
88
|
*/
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
89
|
+
// eslint-disable-next-line max-statements
|
|
90
|
+
minimax(depth, alpha, beta, playerId) {
|
|
91
|
+
const { board } = this;
|
|
92
|
+
const { hash } = board;
|
|
93
|
+
const cached = this.transposition.get(hash);
|
|
94
|
+
if (cached && cached.depth >= depth) {
|
|
95
|
+
return {
|
|
96
|
+
move: this.bestMoves.get(hash) ?? { x: NaN, y: NaN },
|
|
97
|
+
score: cached.score,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (depth === 0 || board.winner !== false) {
|
|
101
|
+
const score = board.heuristic * (this.currentPlayerId === 0 ? 1 : -1);
|
|
102
|
+
this.transposition.set(hash, { depth, score });
|
|
76
103
|
return {
|
|
77
104
|
move: { x: NaN, y: NaN },
|
|
78
|
-
score
|
|
105
|
+
score,
|
|
79
106
|
};
|
|
80
107
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
108
|
+
const moves = [...board.emptyCells];
|
|
109
|
+
// Move ordering: try previously best move first
|
|
110
|
+
const bestStored = this.bestMoves.get(hash);
|
|
111
|
+
if (bestStored) {
|
|
112
|
+
const index = moves.findIndex((m) => m.x === bestStored.x && m.y === bestStored.y);
|
|
113
|
+
if (index > 0)
|
|
114
|
+
moves.unshift(moves.splice(index, 1)[0]);
|
|
115
|
+
}
|
|
116
|
+
let bestScore = -Infinity;
|
|
117
|
+
let bestMove = null;
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
119
|
+
for (let i = 0; i < moves.length; i++) {
|
|
120
|
+
const move = moves[i];
|
|
121
|
+
board.makeMove(move, playerId);
|
|
122
|
+
const { score } = this.minimax(depth - 1, -beta, -alpha, playerId ^ 1);
|
|
123
|
+
const value = -score;
|
|
124
|
+
board.undoLastMove();
|
|
125
|
+
if (value > bestScore) {
|
|
126
|
+
bestScore = value;
|
|
127
|
+
bestMove = move;
|
|
100
128
|
}
|
|
101
|
-
|
|
102
|
-
const bestScore = Math.min(score, bestMove.score);
|
|
103
|
-
if (bestScore !== bestMove.score)
|
|
104
|
-
bestMove = { move, score };
|
|
105
|
-
if (bestMove.score < alpha)
|
|
106
|
-
break;
|
|
129
|
+
if (value > alpha)
|
|
107
130
|
// eslint-disable-next-line no-param-reassign
|
|
108
|
-
|
|
109
|
-
|
|
131
|
+
alpha = value;
|
|
132
|
+
if (alpha >= beta)
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
if (bestMove) {
|
|
136
|
+
this.transposition.set(hash, { depth, score: bestScore });
|
|
137
|
+
this.bestMoves.set(hash, bestMove);
|
|
110
138
|
}
|
|
111
|
-
|
|
112
|
-
|
|
139
|
+
return {
|
|
140
|
+
move: bestMove ?? { x: NaN, y: NaN },
|
|
141
|
+
score: bestScore,
|
|
142
|
+
};
|
|
113
143
|
}
|
|
114
144
|
/** Changes which player's turn it is. */
|
|
115
145
|
nextTurn() {
|
|
@@ -139,4 +169,4 @@ export default class Controller extends EventEmitter {
|
|
|
139
169
|
this.nextTurn();
|
|
140
170
|
}
|
|
141
171
|
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBb0MsV0FBK0I7SUFDbkYsS0FBSyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQThDLFNBQVEsWUFJbEY7SUFDRSwwQkFBMEI7SUFDVixLQUFLLENBQUk7SUFFekIsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBNkI7SUFFbkQsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEMsK0RBQStEO0lBQzlDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBOEMsQ0FBQztJQUUvRTs7Ozs7OztPQU9HO0lBRUgsWUFDSSxXQUF5QixFQUN6QixLQUFRLEVBQ1IsTUFBdUQsRUFDdkQsS0FBMEMsRUFDMUMsY0FBNEQ7UUFFNUQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFDbkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBbUIsQ0FBQyxDQUFDO1FBRXhDLElBQUksY0FBYyxLQUFLLFNB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RUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFakMsT0FBTztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFOUIsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFekIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztDQXFCSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJvYXJkIGZyb20gXCIuL2JvYXJkLmpzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRlbWl0dGVyM1wiO1xuaW1wb3J0IHR5cGUgTG9uZ0ludCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuL2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFBsYXllclR5cGUgPSBcImVhc3lDUFVcIiB8IFwiaGFyZENQVVwiIHwgXCJodW1hblwiIHwgXCJpbXBvc3NpYmxlQ1BVXCIgfCBcIm1lZGl1bUNQVVwiO1xuXG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4gPSB7XG4gICAgb25FbmQ/OiAod2lubmVyOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkludmFsaWRJbnB1dD86IChwb3NpdGlvbjogUG9zaXRpb24pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIHJlbmRlcmVyPzogKGNvbnRyb2xsZXI6IENvbnRyb2xsZXI8VD4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufTtcbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+ID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZ1bmN0aW9uLXR5cGVcbiAgICBuZXcocGxheWVyT25lVHlwZTogUGxheWVyVHlwZSwgcGxheWVyVHdvVHlwZTogUGxheWVyVHlwZSwgb3B0aW9ucz86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD4pOiBDb250cm9sbGVyPFQ+O1xufTtcbi8qKlxuICogRGVjb3JhdG9yIHRvIGNoZWNrIHRoYXQgdGhlIGNvbnN0cnVjdG9yIHR5cGUgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBjb3JyZWN0LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBib2FyZC5cbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciAtIFRoZSBjbGFzcyB0byBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdhbWU8VCBleHRlbmRzIEJvYXJkPExvbmdJbnQgfCBudW1iZXI+Pihjb25zdHJ1Y3RvcjogR2FtZUNvbnN0cnVjdG9yPFQ+KTogdm9pZCB7XG4gICAgdm9pZCBjb25zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2FtZSBjb250cm9sbGVyLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBib2FyZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbGxlcjxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPHtcbiAgICBlbmQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkVuZFwiXTtcbiAgICBpbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdO1xuICAgIGludmFsaWRJbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdO1xufT4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgYm9hcmQuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGJvYXJkOiBUO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB2aWV3IG9iamVjdC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVuZGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAgIC8qKiBDb250YWlucyB0aGUgcGxheWVyIG9iamVjdHMuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYXllcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfT47XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIElEIG9mIHRoZSBjdXJyZW50IHBsYXllci4gKi9cbiAgICBwcml2YXRlIGN1cnJlbnRQbGF5ZXJJZDogbnVtYmVyID0gMDtcblxuICAgIC8qKiBTdG9yZXMgcHJlY29tcHV0ZWQgdmFsdWVzIHRvIG9wdGltaXNlIG1pbmltYXgvYWxwaGFiZXRhLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfT4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29udHJvbGxlci5cbiAgICAgKiBAcGFyYW0gcGxheWVyVHlwZXMgLSBUaGUgdHlwZXMgb2YgcGxheWVyIGZvciB0aGUgZ2FtZS5cbiAgICAgKiBAcGFyYW0gYm9hcmQgLSBUaGUgYm9hcmQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByZW5kZXIgLSBUaGUgcmVuZGVyIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBvbkVuZCAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGdhbWUgZW5kcy5cbiAgICAgKiBAcGFyYW0gb25JbnZhbGlkSW5wdXQgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBpbnB1dCBpcyBpbnZhbGlkLlxuICAgICAqL1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBwbGF5ZXJUeXBlczogUGxheWVyVHlwZVtdLFxuICAgICAgICBib2FyZDogVCxcbiAgICAgICAgcmVuZGVyOiBSZXF1aXJlZDxHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+PltcInJlbmRlcmVyXCJdLFxuICAgICAgICBvbkVuZD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkVuZFwiXSxcbiAgICAgICAgb25JbnZhbGlkSW5wdXQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25JbnZhbGlkSW5wdXRcIl0sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYm9hcmQgPSBib2FyZDtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlci5iaW5kKG51bGwsIHRoaXMpO1xuXG4gICAgICAgIGlmIChvbkVuZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImVuZFwiLCBvbkVuZCBhcyAoKSA9PiB2b2lkKTtcblxuICAgICAgICBpZiAob25JbnZhbGlkSW5wdXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJpbnZhbGlkSW5wdXRcIiwgb25JbnZhbGlkSW5wdXQgYXMgKCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBwbGF5ZXIgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50UGxheWVyKCk6IHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcnNbdGhpcy5jdXJyZW50UGxheWVySWRdITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgbWFpbiBnYW1lIGZsb3cuXG4gICAgICogQHJldHVybnMgVGhlIHdpbm5lciBvciBudWxsIGluIHRoZSBldmVudCBvZiBhIHRpZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5vbihcImlucHV0XCIsIChhc3luYyAobW92ZTogUG9zaXRpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUobW92ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUoKTtcbiAgICAgICAgfSkgYXMgKG1vdmU6IFBvc2l0aW9uKSA9PiB2b2lkKTtcblxuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiAmJiB0aGlzLmJvYXJkLndpbm5lciA9PT0gZmFsc2UpXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IGFsZ29yaXRobSB3aXRoIGFscGhhLWJldGEgcHJ1bmluZyAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWluaW1heCkuXG4gICAgICogQHBhcmFtIGRlcHRoIC0gVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGFscGhhIC0gVGhlIGJvdW5kcyBmb3IgdGhlIGFscGhhLWJldGEgdmFyaWF0aW9uIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGEgLSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciAtIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWxwaGFiZXRhKFxuICAgICAgICBkZXB0aDogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIGFscGhhOiBudW1iZXIgPSAtSW5maW5pdHksXG4gICAgICAgIGJldGE6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdO1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKHRoaXMuYm9hcmQudG9TdHJpbmcoKSkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQodGhpcy5ib2FyZC50b1N0cmluZygpKSE7XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCB7IHNjb3JlIH0gPSB0aGlzLmFscGhhYmV0YShkZXB0aCAtIDEsIGFscGhhLCBiZXRhLCAhbWF4aW1pc2luZ1BsYXllcik7XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQudW5kb0xhc3RNb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA+IGJldGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA8IGFscGhhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQodGhpcy5ib2FyZC50b1N0cmluZygpLCBiZXN0TW92ZSk7XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBtb3ZlIHRvIG1ha2UuIElmIG9tbWl0dGVkLCB0aGUgbW92ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBDUFUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlTW92ZShpbnB1dD86IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKHRoaXMuZGV0ZXJtaW5lQ1BVTW92ZSh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSwgaW5wdXQpLCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgfHwgIXRoaXMuYm9hcmQubW92ZUlzVmFsaWQoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShpbnB1dCwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIiwgd2lubmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0VHVybigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIENQVSBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IC0gVGhlIGRpZmZpY3VsdHkgb2YgdGhlIEFJLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5tYXhEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yYW5kb21Nb3ZlIC0gQSByYW5kb20gbW92ZSB0byBtYWtlLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgdG8gbWFrZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmluZE9wdGltYWxNb3ZlKG9wdGlvbnM/OiB7XG4gICAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgICByYW5kb21Nb3ZlPzogUG9zaXRpb247XG4gICAgfSk6IFBvc2l0aW9uO1xufVxuIl19
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBb0MsV0FBK0I7SUFDbkYsS0FBSyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQThDLFNBQVEsWUFJbEY7SUFDRSwwQkFBMEI7SUFDVixLQUFLLENBQUk7SUFFekIsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBNkI7SUFFbkQsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEMsa0VBQWtFO0lBQ2pELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBNkMsQ0FBQztJQUV0Rix5REFBeUQ7SUFDeEMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBRXpEOzs7Ozs7O09BT0c7SUFFSCxZQUNJLFdBQXlCLEVBQ3pCLEtBQVEsRUFDUixNQUF1RCxFQUN2RCxLQUEwQyxFQUMxQyxjQUE0RDtRQUU1RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxLQUFLLEtBQUssU0FBUztZQUNuQixJQUFJLENBQUMsRUFBRSxDQUFD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LENBQUM7WUFDSixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUVqQyxPQUFPO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU5QixJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBcUJKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5pbXBvcnQgdHlwZSBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHlwZSA9IFwiZWFzeUNQVVwiIHwgXCJoYXJkQ1BVXCIgfCBcImh1bWFuXCIgfCBcImltcG9zc2libGVDUFVcIiB8IFwibWVkaXVtQ1BVXCI7XG5cbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VCBleHRlbmRzIEJvYXJkPExvbmdJbnQgfCBudW1iZXI+PiA9IHtcbiAgICBvbkVuZD86ICh3aW5uZXI6IG51bWJlciB8IG51bGwpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uSW52YWxpZElucHV0PzogKHBvc2l0aW9uOiBQb3NpdGlvbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgcmVuZGVyZXI/OiAoY29udHJvbGxlcjogQ29udHJvbGxlcjxUPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59O1xuZXhwb3J0IHR5cGUgR2FtZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4gPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZnVuY3Rpb24tdHlwZVxuICAgIG5ldyhwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPik6IENvbnRyb2xsZXI8VD47XG59O1xuLyoqXG4gKiBEZWNvcmF0b3IgdG8gY2hlY2sgdGhhdCB0aGUgY29uc3RydWN0b3IgdHlwZSBmb3IgdGhlIGdpdmVuIGNsYXNzIGlzIGNvcnJlY3QuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGJvYXJkLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gVGhlIGNsYXNzIHRvIGNoZWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2FtZTxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+KGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3I8VD4pOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGNvbnRyb2xsZXIuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGJvYXJkLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8e1xuICAgIGVuZDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uRW5kXCJdO1xuICAgIGlucHV0OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25JbnZhbGlkSW5wdXRcIl07XG4gICAgaW52YWxpZElucHV0OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25JbnZhbGlkSW5wdXRcIl07XG59PiB7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib2FyZC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYm9hcmQ6IFQ7XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIHZpZXcgb2JqZWN0LiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZW5kZXI6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcGxheWVyLiAqL1xuICAgIHByaXZhdGUgY3VycmVudFBsYXllcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB0cmFuc3Bvc2l0aW9uIHRhYmxlIGZvciB0aGUgbWluaW1heCBhbGdvcml0aG0uICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc3Bvc2l0aW9uID0gbmV3IE1hcDxudW1iZXIsIHsgZGVwdGg6IG51bWJlcjsgc2NvcmU6IG51bWJlcjsgfT4oKTtcblxuICAgIC8qKiBDb250YWlucyB0aGUgYmVzdCBtb3ZlcyBmb3IgdGhlIG1pbmltYXggYWxnb3JpdGhtLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmVzdE1vdmVzID0gbmV3IE1hcDxudW1iZXIsIFBvc2l0aW9uPigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb250cm9sbGVyLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUeXBlcyAtIFRoZSB0eXBlcyBvZiBwbGF5ZXIgZm9yIHRoZSBnYW1lLlxuICAgICAqIEBwYXJhbSBib2FyZCAtIFRoZSBib2FyZCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJlbmRlciAtIFRoZSByZW5kZXIgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG9uRW5kIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZ2FtZSBlbmRzLlxuICAgICAqIEBwYXJhbSBvbkludmFsaWRJbnB1dCAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGlzIGludmFsaWQuXG4gICAgICovXG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllclR5cGVzOiBQbGF5ZXJUeXBlW10sXG4gICAgICAgIGJvYXJkOiBULFxuICAgICAgICByZW5kZXI6IFJlcXVpcmVkPEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD4+W1wicmVuZGVyZXJcIl0sXG4gICAgICAgIG9uRW5kPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uRW5kXCJdLFxuICAgICAgICBvbkludmFsaWRJbnB1dD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkludmFsaWRJbnB1dFwiXSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ib2FyZCA9IGJvYXJkO1xuICAgICAgICB0aGlzLnBsYXllcnMgPSBwbGF5ZXJUeXBlcy5tYXAoKHBsYXllclR5cGUsIGlkKSA9PiAoeyBpZCwgcGxheWVyVHlwZSB9KSk7XG4gICAgICAgIHRoaXMucmVuZGVyID0gcmVuZGVyLmJpbmQobnVsbCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKG9uRW5kICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiZW5kXCIsIG9uRW5kIGFzICgpID0+IHZvaWQpO1xuXG4gICAgICAgIGlmIChvbkludmFsaWRJbnB1dCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImludmFsaWRJbnB1dFwiLCBvbkludmFsaWRJbnB1dCBhcyAoKSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcGxheWVyIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRQbGF5ZXIoKTogeyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyc1t0aGlzLmN1cnJlbnRQbGF5ZXJJZF0hO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBtYWluIGdhbWUgZmxvdy5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLm9uKFwiaW5wdXRcIiwgKGFzeW5jIChtb3ZlOiBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShtb3ZlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZSgpO1xuICAgICAgICB9KSBhcyAobW92ZTogUG9zaXRpb24pID0+IHZvaWQpO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSB3cmFwcGVyIGZvciB0aGUgbWluaW1heCBhbGdvcml0aG0gdG8gZmluZCB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gbWF4RGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2guXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlYXJjaChtYXhEZXB0aDogbnVtYmVyKTogeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfSB7XG4gICAgICAgIGxldCBiZXN0OiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IC1JbmZpbml0eSxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IDE7IGRlcHRoIDw9IG1heERlcHRoOyBkZXB0aCsrKVxuICAgICAgICAgICAgYmVzdCA9IHRoaXMubWluaW1heChkZXB0aCwgLUluZmluaXR5LCBJbmZpbml0eSwgdGhpcy5jdXJyZW50UGxheWVySWQpO1xuXG4gICAgICAgIHJldHVybiBiZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IChuZWdhbWF4KSBhbGdvcml0aG0gd2l0aCBhbHBoYS1iZXRhIHBydW5pbmcgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXgpLlxuICAgICAqIEBwYXJhbSBkZXB0aCAtIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBhbHBoYSAtIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBiZXRhIC0gVGhlIGJvdW5kcyBmb3IgdGhlIGFscGhhLWJldGEgdmFyaWF0aW9uIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllciB0byBjYWxjdWxhdGUgdGhlIG1vdmUgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgcHJpdmF0ZSBtaW5pbWF4KGRlcHRoOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGJldGE6IG51bWJlciwgcGxheWVySWQ6IG51bWJlcik6IHsgbW92ZTogUG9zaXRpb247IHNjb3JlOiBudW1iZXI7IH0ge1xuICAgICAgICBjb25zdCB7IGJvYXJkIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGhhc2ggfSA9IGJvYXJkO1xuXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwb3NpdGlvbi5nZXQoaGFzaCk7XG5cbiAgICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuZGVwdGggPj0gZGVwdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogdGhpcy5iZXN0TW92ZXMuZ2V0KGhhc2gpID8/IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogY2FjaGVkLnNjb3JlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCBib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9IGJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSk7XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3NpdGlvbi5zZXQoaGFzaCwgeyBkZXB0aCwgc2NvcmUgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vdmVzID0gWy4uLmJvYXJkLmVtcHR5Q2VsbHNdO1xuXG4gICAgICAgIC8vIE1vdmUgb3JkZXJpbmc6IHRyeSBwcmV2aW91c2x5IGJlc3QgbW92ZSBmaXJzdFxuICAgICAgICBjb25zdCBiZXN0U3RvcmVkID0gdGhpcy5iZXN0TW92ZXMuZ2V0KGhhc2gpO1xuXG4gICAgICAgIGlmIChiZXN0U3RvcmVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG1vdmVzLmZpbmRJbmRleCgobSkgPT4gbS54ID09PSBiZXN0U3RvcmVkLnggJiYgbS55ID09PSBiZXN0U3RvcmVkLnkpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIG1vdmVzLnVuc2hpZnQobW92ZXMuc3BsaWNlKGluZGV4LCAxKVswXSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RTY29yZSA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBQb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBtb3ZlID0gbW92ZXNbaV0hO1xuXG4gICAgICAgICAgICBib2FyZC5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgc2NvcmUgfSA9IHRoaXMubWluaW1heChcbiAgICAgICAgICAgICAgICBkZXB0aCAtIDEsXG4gICAgICAgICAgICAgICAgLWJldGEsXG4gICAgICAgICAgICAgICAgLWFscGhhLFxuICAgICAgICAgICAgICAgIHBsYXllcklkIF4gMSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gLXNjb3JlO1xuXG4gICAgICAgICAgICBib2FyZC51bmRvTGFzdE1vdmUoKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID4gYmVzdFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYmVzdE1vdmUgPSBtb3ZlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBhbHBoYSlcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBhbHBoYSA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoYWxwaGEgPj0gYmV0YSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZXN0TW92ZSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc3Bvc2l0aW9uLnNldChoYXNoLCB7IGRlcHRoLCBzY29yZTogYmVzdFNjb3JlIH0pO1xuICAgICAgICAgICAgdGhpcy5iZXN0TW92ZXMuc2V0KGhhc2gsIGJlc3RNb3ZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb3ZlOiBiZXN0TW92ZSA/PyB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICBzY29yZTogYmVzdFNjb3JlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBtb3ZlIHRvIG1ha2UuIElmIG9tbWl0dGVkLCB0aGUgbW92ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBDUFUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlTW92ZShpbnB1dD86IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKHRoaXMuZGV0ZXJtaW5lQ1BVTW92ZSh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSwgaW5wdXQpLCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgfHwgIXRoaXMuYm9hcmQubW92ZUlzVmFsaWQoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShpbnB1dCwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIiwgd2lubmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0VHVybigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIENQVSBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IC0gVGhlIGRpZmZpY3VsdHkgb2YgdGhlIEFJLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5tYXhEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yYW5kb21Nb3ZlIC0gQSByYW5kb20gbW92ZSB0byBtYWtlLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgdG8gbWFrZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmluZE9wdGltYWxNb3ZlKG9wdGlvbnM/OiB7XG4gICAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgICByYW5kb21Nb3ZlPzogUG9zaXRpb247XG4gICAgfSk6IFBvc2l0aW9uO1xufVxuIl19
|
|
@@ -20,6 +20,7 @@ export default class Board extends Base<LongInt> {
|
|
|
20
20
|
constructor();
|
|
21
21
|
/**
|
|
22
22
|
* Calculates the heuristic score for the current board state.
|
|
23
|
+
* Favors blocking opponent's 3s over making own 3s.
|
|
23
24
|
* @returns The heuristic score.
|
|
24
25
|
*/
|
|
25
26
|
get heuristic(): number;
|
|
@@ -49,6 +49,7 @@ export default class Board extends Base {
|
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
51
|
* Calculates the heuristic score for the current board state.
|
|
52
|
+
* Favors blocking opponent's 3s over making own 3s.
|
|
52
53
|
* @returns The heuristic score.
|
|
53
54
|
*/
|
|
54
55
|
// eslint-disable-next-line max-statements
|
|
@@ -60,6 +61,9 @@ export default class Board extends Base {
|
|
|
60
61
|
return -(10000 - this.moves.length);
|
|
61
62
|
let p0Score = 0;
|
|
62
63
|
let p1Score = 0;
|
|
64
|
+
// Scoring: defensive moves (blocking) weighted 1.5x higher than offensive moves
|
|
65
|
+
const offensiveScores = [0, 1, 10, 100];
|
|
66
|
+
const defensiveScores = [0, 1.5, 15, 150];
|
|
63
67
|
// Horizontal →
|
|
64
68
|
for (let y = 0; y < this.height; y++) {
|
|
65
69
|
for (let x = 0; x < this.width - 3; x++) {
|
|
@@ -72,9 +76,9 @@ export default class Board extends Base {
|
|
|
72
76
|
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
73
77
|
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
74
78
|
if (p0Count > 0 && p1Count === 0)
|
|
75
|
-
p0Score += [
|
|
79
|
+
p0Score += defensiveScores[p0Count];
|
|
76
80
|
else if (p1Count > 0 && p0Count === 0)
|
|
77
|
-
p1Score += [
|
|
81
|
+
p1Score += offensiveScores[p1Count];
|
|
78
82
|
}
|
|
79
83
|
}
|
|
80
84
|
// Vertical ↓
|
|
@@ -89,9 +93,9 @@ export default class Board extends Base {
|
|
|
89
93
|
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
90
94
|
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
91
95
|
if (p0Count > 0 && p1Count === 0)
|
|
92
|
-
p0Score += [
|
|
96
|
+
p0Score += defensiveScores[p0Count];
|
|
93
97
|
else if (p1Count > 0 && p0Count === 0)
|
|
94
|
-
p1Score += [
|
|
98
|
+
p1Score += offensiveScores[p1Count];
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
// Diagonal ↘
|
|
@@ -106,9 +110,9 @@ export default class Board extends Base {
|
|
|
106
110
|
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
107
111
|
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
108
112
|
if (p0Count > 0 && p1Count === 0)
|
|
109
|
-
p0Score += [
|
|
113
|
+
p0Score += defensiveScores[p0Count];
|
|
110
114
|
else if (p1Count > 0 && p0Count === 0)
|
|
111
|
-
p1Score += [
|
|
115
|
+
p1Score += offensiveScores[p1Count];
|
|
112
116
|
}
|
|
113
117
|
}
|
|
114
118
|
// Diagonal ↗
|
|
@@ -123,9 +127,9 @@ export default class Board extends Base {
|
|
|
123
127
|
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
124
128
|
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
125
129
|
if (p0Count > 0 && p1Count === 0)
|
|
126
|
-
p0Score += [
|
|
130
|
+
p0Score += defensiveScores[p0Count];
|
|
127
131
|
else if (p1Count > 0 && p0Count === 0)
|
|
128
|
-
p1Score += [
|
|
132
|
+
p1Score += offensiveScores[p1Count];
|
|
129
133
|
}
|
|
130
134
|
}
|
|
131
135
|
return p1Score - p0Score;
|
|
@@ -160,9 +164,9 @@ export default class Board extends Base {
|
|
|
160
164
|
*/
|
|
161
165
|
undoLastMove() {
|
|
162
166
|
// X-coordinate is recoverable from the bit index: bit % width = x.
|
|
163
|
-
const x = this.moves[this.moves.length - 1]
|
|
167
|
+
const { x } = (this.moves[this.moves.length - 1]);
|
|
164
168
|
super.undoLastMove();
|
|
165
169
|
this.heights[x]++;
|
|
166
170
|
}
|
|
167
171
|
}
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNjLE9BQU8sR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElB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LFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ2EsWUFBWTtRQUN4QixtRUFBbUU7UUFDbkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTFELEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50PiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IExvbmdJbnRCaXRCb2FyZFtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgdGhlIG5leHQgYXZhaWxhYmxlIHJvdyBpbmRleCBwZXIgY29sdW1uIChyb3cgNSA9IGJvdHRvbSwgcm93IDAgPSB0b3ApLlxuICAgICAqIEEgdmFsdWUgb2YgLTEgbWVhbnMgdGhlIGNvbHVtbiBpcyBmdWxsLlxuICAgICAqIE1haW50YWluZWQgaW5jcmVtZW50YWxseSBzbyBtYWtlTW92ZSBhbmQgZW1wdHlDZWxscyBhcmUgTygxKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodHM6IG51bWJlcltdID0gWzUsIDUsIDUsIDUsIDUsIDUsIDVdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBGVUxMX0JPQVJEID0gbmV3IExvbmdJbnQoWzBiMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMV8xMTExMTExLCAwYjExMTExMTFfMTExXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDExMTEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgVkVSVElDQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMTAwMF8wMDAwMTAwXzAwMDAwMTBfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBOT05fTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDEwXzAwMDAxMDBfMDAwMTAwMCwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig3LCA2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5IT1JJWk9OVEFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuVkVSVElDQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTk9OX0xFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBoZXVyaXN0aWMgc2NvcmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBoZXVyaXN0aWMgc2NvcmUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgcHVibGljIGdldCBoZXVyaXN0aWMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmICh3aW5uZXIgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gLSgxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoKTtcblxuICAgICAgICBsZXQgcDBTY29yZSA9IDA7XG4gICAgICAgIGxldCBwMVNjb3JlID0gMDtcblxuICAgICAgICAvLyBIb3Jpem9udGFsIOKGklxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAyLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJ0aWNhbCDihpNcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQgLSAzOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMiB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlhZ29uYWwg4oaYXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmhlaWdodCAtIDM7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMiwgeTogeSArIDIgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDMsIHk6IHkgKyAzIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaWFnb25hbCDihpdcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoIC0gMzsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMzsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeTogeSAtIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDIsIHk6IHkgLSAyIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5OiB5IC0gMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHAxU2NvcmUgLSBwMFNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbHVtbiBtb3ZlcyBvcmRlcmVkIGNlbnRyZS1maXJzdCBzbyB0aGF0XG4gICAgICogYWxwaGEtYmV0YSBwcnVuaW5nIGVuY291bnRlcnMgdGhlIHN0cm9uZ2VzdCBtb3ZlcyBlYXJsaWVzdC5cbiAgICAgKiBVc2VzIHRoZSBpbmNyZW1lbnRhbCBoZWlnaHRzIGFycmF5IOKAlCBPKHdpZHRoKSwgbm8gYml0Ym9hcmQgcmVhZHMuXG4gICAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB4IG9mIFszLCAyLCA0LCAxLCA1LCAwLCA2XSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0c1t4XSEgPj0gMClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5OiAwIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlIG9uIHRoZSBib2FyZC5cbiAgICAgKiBVc2VzIHRoZSBoZWlnaHRzIGFycmF5IGZvciBPKDEpIHJvdyByZXNvbHV0aW9uIGluc3RlYWQgb2Ygc2Nhbm5pbmcgdGhlIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBtb3ZlIHRvIG1ha2UuXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllciBtYWtpbmcgdGhlIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG1ha2VNb3ZlKG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIG1vdmUueSA9IHRoaXMuaGVpZ2h0c1ttb3ZlLnhdITtcbiAgICAgICAgdGhpcy5oZWlnaHRzW21vdmUueF0hLS07XG4gICAgICAgIHN1cGVyLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgbGFzdCBtb3ZlIGFuZCByZXN0b3JlcyB0aGUgY29sdW1uIGhlaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdW5kb0xhc3RNb3ZlKCk6IHZvaWQge1xuICAgICAgICAvLyBYLWNvb3JkaW5hdGUgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgYml0IGluZGV4OiBiaXQgJSB3aWR0aCA9IHguXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm1vdmVzW3RoaXMubW92ZXMubGVuZ3RoIC0gMV0hICUgdGhpcy53aWR0aDtcblxuICAgICAgICBzdXBlci51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRzW3hdISsrO1xuICAgIH1cbn1cbiJdfQ==
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNjLE9BQU8sR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElB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QUcsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUVuRCxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5pbXBvcnQgTG9uZ0ludCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IExvbmdJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBDb25uZWN0IDQgYm9hcmQuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2FyZCBleHRlbmRzIEJhc2U8TG9uZ0ludD4ge1xuICAgIHByb3RlY3RlZCB3aW5uaW5nU3RhdGVzOiBMb25nSW50Qml0Qm9hcmRbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIHRoZSBuZXh0IGF2YWlsYWJsZSByb3cgaW5kZXggcGVyIGNvbHVtbiAocm93IDUgPSBib3R0b20sIHJvdyAwID0gdG9wKS5cbiAgICAgKiBBIHZhbHVlIG9mIC0xIG1lYW5zIHRoZSBjb2x1bW4gaXMgZnVsbC5cbiAgICAgKiBNYWludGFpbmVkIGluY3JlbWVudGFsbHkgc28gbWFrZU1vdmUgYW5kIGVtcHR5Q2VsbHMgYXJlIE8oMSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHRzOiBudW1iZXJbXSA9IFs1LCA1LCA1LCA1LCA1LCA1LCA1XTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgRlVMTF9CT0FSRCA9IG5ldyBMb25nSW50KFswYjExMTFfMTExMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMSwgMGIxMTExMTExXzExMV0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBIT1JJWk9OVEFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAxMTExLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IFZFUlRJQ0FMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAxXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IExFQURJTkdfRElBR09OQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDEwMDBfMDAwMDEwMF8wMDAwMDEwXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTk9OX0xFQURJTkdfRElBR09OQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAxMF8wMDAwMTAwXzAwMDEwMDAsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIC8qKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJvYXJkLiAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoNywgNik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDY7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuSE9SSVpPTlRBTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLlZFUlRJQ0FMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTEVBRElOR19ESUFHT05BTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLk5PTl9MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGV1cmlzdGljIHNjb3JlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBGYXZvcnMgYmxvY2tpbmcgb3Bwb25lbnQncyAzcyBvdmVyIG1ha2luZyBvd24gM3MuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEwMDAwIC0gdGhpcy5tb3Zlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtKDEwMDAwIC0gdGhpcy5tb3Zlcy5sZW5ndGgpO1xuXG4gICAgICAgIGxldCBwMFNjb3JlID0gMDtcbiAgICAgICAgbGV0IHAxU2NvcmUgPSAwO1xuXG4gICAgICAgIC8vIFNjb3Jpbmc6IGRlZmVuc2l2ZSBtb3ZlcyAoYmxvY2tpbmcpIHdlaWdodGVkIDEuNXggaGlnaGVyIHRoYW4gb2ZmZW5zaXZlIG1vdmVzXG4gICAgICAgIGNvbnN0IG9mZmVuc2l2ZVNjb3JlcyA9IFswLCAxLCAxMCwgMTAwXTtcbiAgICAgICAgY29uc3QgZGVmZW5zaXZlU2NvcmVzID0gWzAsIDEuNSwgMTUsIDE1MF07XG5cbiAgICAgICAgLy8gSG9yaXpvbnRhbCDihpJcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGggLSAzOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMiwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMywgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IGRlZmVuc2l2ZVNjb3Jlc1twMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBvZmZlbnNpdmVTY29yZXNbcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVydGljYWwg4oaTXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0IC0gMzsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHgsIHkgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeTogeSArIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeTogeSArIDIgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeTogeSArIDMgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHAwQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBwMUNvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAxKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAocDBDb3VudCA+IDAgJiYgcDFDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDBTY29yZSArPSBkZWZlbnNpdmVTY29yZXNbcDBDb3VudF0hO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAxQ291bnQgPiAwICYmIHAwQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAxU2NvcmUgKz0gb2ZmZW5zaXZlU2NvcmVzW3AxQ291bnRdITtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpYWdvbmFsIOKGmFxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGggLSAzOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQgLSAzOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeTogeSArIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDIsIHk6IHkgKyAyIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5OiB5ICsgMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IGRlZmVuc2l2ZVNjb3Jlc1twMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBvZmZlbnNpdmVTY29yZXNbcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlhZ29uYWwg4oaXXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDM7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHgsIHkgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDEsIHk6IHkgLSAxIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAyLCB5OiB5IC0gMiB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMywgeTogeSAtIDMgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHAwQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBwMUNvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAxKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAocDBDb3VudCA+IDAgJiYgcDFDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDBTY29yZSArPSBkZWZlbnNpdmVTY29yZXNbcDBDb3VudF0hO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAxQ291bnQgPiAwICYmIHAwQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAxU2NvcmUgKz0gb2ZmZW5zaXZlU2NvcmVzW3AxQ291bnRdITtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwMVNjb3JlIC0gcDBTY29yZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb2x1bW4gbW92ZXMgb3JkZXJlZCBjZW50cmUtZmlyc3Qgc28gdGhhdFxuICAgICAqIGFscGhhLWJldGEgcHJ1bmluZyBlbmNvdW50ZXJzIHRoZSBzdHJvbmdlc3QgbW92ZXMgZWFybGllc3QuXG4gICAgICogVXNlcyB0aGUgaW5jcmVtZW50YWwgaGVpZ2h0cyBhcnJheSDigJQgTyh3aWR0aCksIG5vIGJpdGJvYXJkIHJlYWRzLlxuICAgICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIGVtcHR5IGNlbGxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbMywgMiwgNCwgMSwgNSwgMCwgNl0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlaWdodHNbeF0hID49IDApXG4gICAgICAgICAgICAgICAgZW1wdHlDZWxscy5wdXNoKHsgeCwgeTogMCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbXB0eUNlbGxzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgbW92ZSBvbiB0aGUgYm9hcmQuXG4gICAgICogVXNlcyB0aGUgaGVpZ2h0cyBhcnJheSBmb3IgTygxKSByb3cgcmVzb2x1dGlvbiBpbnN0ZWFkIG9mIHNjYW5uaW5nIHRoZSBjb2x1bW4uXG4gICAgICogQHBhcmFtIG1vdmUgLSBUaGUgbW92ZSB0byBtYWtlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBtb3ZlLnkgPSB0aGlzLmhlaWdodHNbbW92ZS54XSE7XG4gICAgICAgIHRoaXMuaGVpZ2h0c1ttb3ZlLnhdIS0tO1xuICAgICAgICBzdXBlci5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGxhc3QgbW92ZSBhbmQgcmVzdG9yZXMgdGhlIGNvbHVtbiBoZWlnaHQuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHVuZG9MYXN0TW92ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gWC1jb29yZGluYXRlIGlzIHJlY292ZXJhYmxlIGZyb20gdGhlIGJpdCBpbmRleDogYml0ICUgd2lkdGggPSB4LlxuICAgICAgICBjb25zdCB7IHggfSA9ICh0aGlzLm1vdmVzW3RoaXMubW92ZXMubGVuZ3RoIC0gMV0hKTtcblxuICAgICAgICBzdXBlci51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRzW3hdISsrO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -62,11 +62,11 @@ let Connect4 = class Connect4 extends Base {
|
|
|
62
62
|
findOptimalMove({ maxDepth } = { maxDepth: Infinity }) {
|
|
63
63
|
return this.board.isEmpty
|
|
64
64
|
? { x: 3, y: 5 }
|
|
65
|
-
: this.
|
|
65
|
+
: this.search(maxDepth).move;
|
|
66
66
|
}
|
|
67
67
|
};
|
|
68
68
|
Connect4 = __decorate([
|
|
69
69
|
Game
|
|
70
70
|
], Connect4);
|
|
71
71
|
export default Connect4;
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLFVBQXFDO1FBQ3pELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUU5RSxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ2pCLEtBQUssZUFBZTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsUUFBUSxLQUE0QixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDL0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDO0NBQ0osQ0FBQTtBQXpEb0IsUUFBUTtJQUQ1QixJQUFJO0dBQ2dCLFFBQVEsQ0F5RDVCO2VBekRvQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyZXIgZm9yIGNvbm5lY3QgNC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IENvbm5lY3Q0KTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKHRydWUsIHRydWUsIGZhbHNlLCBbXCLirKQgXCIsIFwi4qykIFwiXSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogUmVwcmVzZW50cyB0aGUgY29udHJvbGxlciBmb3IgY29ubmVjdCA0LiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbm5lY3Q0IGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29ubmVjdDQuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcblxuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgbWF4RGVwdGg6IDEwIH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNyB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNSB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgYWxnb3JpdGhtIGlzIGludmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRPcHRpbWFsTW92ZSh7IG1heERlcHRoIH06IHsgbWF4RGVwdGg6IG51bWJlcjsgfSA9IHsgbWF4RGVwdGg6IEluZmluaXR5IH0pOiBQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvYXJkLmlzRW1wdHlcbiAgICAgICAgICAgID8geyB4OiAzLCB5OiA1IH1cbiAgICAgICAgICAgIDogdGhpcy5zZWFyY2gobWF4RGVwdGgpLm1vdmU7XG4gICAgfVxufVxuIl19
|
|
@@ -63,11 +63,11 @@ let TicTacToe = class TicTacToe extends Base {
|
|
|
63
63
|
findOptimalMove({ randomMove } = { randomMove: { x: 2, y: 2 } }) {
|
|
64
64
|
return this.board.isEmpty
|
|
65
65
|
? randomMove
|
|
66
|
-
: this.
|
|
66
|
+
: this.search(9).move;
|
|
67
67
|
}
|
|
68
68
|
};
|
|
69
69
|
TicTacToe = __decorate([
|
|
70
70
|
Game
|
|
71
71
|
], TicTacToe);
|
|
72
72
|
export default TicTacToe;
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQztRQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFekQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsRUFBRSxVQUFVLEtBQWdDLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztDQUNKLENBQUE7QUExRG9CLFNBQVM7SUFEN0IsSUFBSTtHQUNnQixTQUFTLENBMEQ3QjtlQTFEb0IsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnMsIFBsYXllclR5cGUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbmRlcmluZyBmdW5jdGlvbiBmb3IgVGljVGFjVG9lLlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBUaGUgY29udHJvbGxlciB0byByZW5kZXIuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXIoY29udHJvbGxlcjogVGljVGFjVG9lKTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKGZhbHNlKSk7XG4gICAgY29uc3QgeyB3aW5uZXIgfSA9IGNvbnRyb2xsZXIuYm9hcmQ7XG5cbiAgICBpZiAod2lubmVyICE9PSBmYWxzZSlcbiAgICAgICAgY29uc29sZS5sb2cod2lubmVyID09PSBudWxsID8gXCJJdCdzIGEgdGllIVwiIDogYFBsYXllciAke3dpbm5lciArIDF9IHdpbnMhYCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG59XG5cbi8qKiBBIGdhbWUgb2YgVGljVGFjVG9lLiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpY1RhY1RvZSBleHRlbmRzIEJhc2U8Qm9hcmQ+IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRpY1RhY1RvZSBnYW1lLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJPbmVUeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIG9uZSAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gcGxheWVyVHdvVHlwZSAtIFRoZSB0eXBlIG9mIHBsYXllciB0d28gKGh1bWFuIG9yIENQVSkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGdhbWUuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLFxuICAgICAgICBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLFxuICAgICAgICBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxCb2FyZD4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgW3BsYXllck9uZVR5cGUsIHBsYXllclR3b1R5cGVdLFxuICAgICAgICAgICAgbmV3IEJvYXJkKCksXG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJlciA/PyBkZWZhdWx0UmVuZGVyLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25FbmQsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkludmFsaWRJbnB1dCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IC0gVGhlIGRpZmZpY3VsdHkgb2YgdGhlIENQVS5cbiAgICAgKiBAcmV0dXJucyBUaGUgQ1BVJ3MgbW92ZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGRpZmZpY3VsdHkgaXMgaW52YWxpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4pOiBQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcbiAgICAgICAgY29uc3QgcmFuZG9tTW92ZSA9IGVtcHR5Q2VsbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZW1wdHlDZWxscy5sZW5ndGgpXSE7XG4gICAgICAgIGNvbnN0IG9wdGltYWxNb3ZlID0gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyByYW5kb21Nb3ZlIH0pO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1hbE1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiaGFyZENQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC44ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC41ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcImVhc3lDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaWZmaWN1bHR5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIC0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobS5yYW5kb21Nb3ZlIC0gVGhlIG1vdmUgdG8gcmV0dXJuIGlmIHRoZSBib2FyZCBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBwbGF5ZXIuXG4gICAgICogQHRocm93cyB7RXJyb3J9IEFuIGVycm9yIGlmIHRoZSBhbGdvcml0aG0gaXMgaW52YWxpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZE9wdGltYWxNb3ZlKHsgcmFuZG9tTW92ZSB9OiB7IHJhbmRvbU1vdmU6IFBvc2l0aW9uOyB9ID0geyByYW5kb21Nb3ZlOiB7IHg6IDIsIHk6IDIgfSB9KTogUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5ib2FyZC5pc0VtcHR5XG4gICAgICAgICAgICA/IHJhbmRvbU1vdmVcbiAgICAgICAgICAgIDogdGhpcy5zZWFyY2goOSkubW92ZTtcbiAgICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oathompsonjones/mini-games",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.17",
|
|
4
4
|
"description": "A selection of MiniGames. You will soon be able to play these games on [my website](https://oathompsonjones.co.uk/arcade).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/oathompsonjones/MiniGames.git"
|