@oathompsonjones/mini-games 1.0.6 → 1.0.9
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/TODO.md +6 -0
- package/build/base/board.d.ts +53 -45
- package/build/base/board.js +84 -72
- package/build/base/controller.d.ts +48 -37
- package/build/base/controller.js +32 -26
- package/build/bitBoard/bitBoard.d.ts +37 -34
- package/build/bitBoard/bitBoard.js +15 -12
- package/build/bitBoard/intBitBoard.d.ts +22 -22
- package/build/bitBoard/intBitBoard.js +16 -16
- package/build/bitBoard/longInt.d.ts +47 -40
- package/build/bitBoard/longInt.js +40 -37
- package/build/bitBoard/longIntBitBoard.d.ts +26 -26
- package/build/bitBoard/longIntBitBoard.js +16 -16
- package/build/console.d.ts +2 -3
- package/build/console.js +3 -4
- package/build/games/connect4/board.d.ts +12 -5
- package/build/games/connect4/board.js +12 -6
- package/build/games/connect4/controller.d.ts +18 -11
- package/build/games/connect4/controller.js +20 -12
- package/build/games/tictactoe/board.d.ts +5 -2
- package/build/games/tictactoe/board.js +5 -2
- package/build/games/tictactoe/controller.d.ts +17 -12
- package/build/games/tictactoe/controller.js +19 -13
- package/eslint.config.js +1 -1
- package/package.json +6 -7
- package/patches/eventemitter3@5.0.1.patch +0 -68
|
@@ -1,34 +1,39 @@
|
|
|
1
1
|
import type Board from "./board.js";
|
|
2
2
|
import { EventEmitter } from "eventemitter3";
|
|
3
|
+
import type LongInt from "../bitBoard/longInt.js";
|
|
3
4
|
import type { Position } from "./board.js";
|
|
4
5
|
export type PlayerType = "easyCPU" | "hardCPU" | "human" | "impossibleCPU" | "mediumCPU";
|
|
5
6
|
export type Algorithm = "alphabeta" | "minimax";
|
|
6
|
-
export type GameConstructorOptions = {
|
|
7
|
-
id
|
|
7
|
+
export type GameConstructorOptions<T> = {
|
|
8
|
+
id: T;
|
|
8
9
|
onEnd?: (winner: number | null) => Promise<void> | void;
|
|
9
10
|
onInvalidInput?: (position: Position) => Promise<void> | void;
|
|
10
|
-
renderer?: (controller: Controller) => Promise<void> | void;
|
|
11
|
+
renderer?: (controller: Controller<T>) => Promise<void> | void;
|
|
11
12
|
};
|
|
12
|
-
export type GameConstructor = {
|
|
13
|
-
new (playerOneType: PlayerType, playerTwoType: PlayerType, options
|
|
13
|
+
export type GameConstructor<T> = {
|
|
14
|
+
new (playerOneType: PlayerType, playerTwoType: PlayerType, options: GameConstructorOptions<T>): Controller<T>;
|
|
14
15
|
};
|
|
15
16
|
/**
|
|
16
17
|
* Decorator to check that the constructor type for the given class is correct.
|
|
17
|
-
* @
|
|
18
|
+
* @template T - The type of the game ID.
|
|
19
|
+
* @param constructor - The class to check.
|
|
18
20
|
*/
|
|
19
|
-
export declare function Game(constructor: GameConstructor): void;
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
export declare function Game<T>(constructor: GameConstructor<T>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Represents a game controller.
|
|
24
|
+
* @template T - The type of the game ID.
|
|
25
|
+
*/
|
|
26
|
+
export default abstract class Controller<T> extends EventEmitter<{
|
|
27
|
+
end: GameConstructorOptions<T>["onEnd"];
|
|
28
|
+
input: GameConstructorOptions<T>["onInvalidInput"];
|
|
29
|
+
invalidInput: GameConstructorOptions<T>["onInvalidInput"];
|
|
25
30
|
}> {
|
|
26
31
|
/** Contains the ID of the game. */
|
|
27
|
-
readonly gameID:
|
|
32
|
+
readonly gameID: T;
|
|
28
33
|
/** Contains the board. */
|
|
29
|
-
readonly board: Board
|
|
34
|
+
readonly board: Board<LongInt | number>;
|
|
30
35
|
/** Contains the view object. */
|
|
31
|
-
readonly render:
|
|
36
|
+
readonly render: () => Promise<void> | void;
|
|
32
37
|
/** Contains the player objects. */
|
|
33
38
|
protected readonly players: Array<{
|
|
34
39
|
id: number;
|
|
@@ -38,28 +43,32 @@ export default abstract class Controller extends EventEmitter<{
|
|
|
38
43
|
private currentPlayerId;
|
|
39
44
|
/**
|
|
40
45
|
* Creates an instance of Controller.
|
|
41
|
-
* @param playerTypes The types of player.
|
|
42
|
-
* @param
|
|
43
|
-
* @param
|
|
44
|
-
* @param
|
|
46
|
+
* @param playerTypes - The types of player for the game.
|
|
47
|
+
* @param board - The board object.
|
|
48
|
+
* @param render - The render function.
|
|
49
|
+
* @param gameID - The ID of the game instance.
|
|
50
|
+
* @param onEnd - The function to call when the game ends.
|
|
51
|
+
* @param onInvalidInput - The function to call when the input is invalid.
|
|
52
|
+
*/
|
|
53
|
+
protected constructor(playerTypes: PlayerType[], board: Board<LongInt | number>, render: Required<GameConstructorOptions<T>>["renderer"], gameID: T, onEnd?: GameConstructorOptions<T>["onEnd"], onInvalidInput?: GameConstructorOptions<T>["onInvalidInput"]);
|
|
54
|
+
/**
|
|
55
|
+
* Gets the current player object.
|
|
56
|
+
* @returns The current player object.
|
|
45
57
|
*/
|
|
46
|
-
protected constructor(playerTypes: PlayerType[], board: Board, render: Controller["render"], gameID: unknown, onEnd?: GameConstructorOptions["onEnd"], onInvalidInput?: GameConstructorOptions["onInvalidInput"]);
|
|
47
|
-
/** Gets the current player object. */
|
|
48
58
|
get currentPlayer(): {
|
|
49
59
|
id: number;
|
|
50
60
|
playerType: PlayerType;
|
|
51
61
|
};
|
|
52
62
|
/**
|
|
53
63
|
* Controls the main game flow.
|
|
54
|
-
* @param algorithm The algorithm to use.
|
|
64
|
+
* @param algorithm - The algorithm to use.
|
|
55
65
|
* @returns The winner or null in the event of a tie.
|
|
56
66
|
*/
|
|
57
67
|
play(algorithm?: Algorithm): Promise<void>;
|
|
58
68
|
/**
|
|
59
|
-
* The bog standard minimax algorithm. Left in for reference.
|
|
60
|
-
* @
|
|
61
|
-
* @param
|
|
62
|
-
* @param maximisingPlayer Whether or not the current player is the maximising player.
|
|
69
|
+
* The bog standard minimax algorithm. Left in for reference (https://en.wikipedia.org/wiki/Minimax).
|
|
70
|
+
* @param depth - The depth of the algorithm.
|
|
71
|
+
* @param maximisingPlayer - Whether or not the current player is the maximising player.
|
|
63
72
|
* @returns The optimal move.
|
|
64
73
|
*/
|
|
65
74
|
protected minimax(depth?: number, maximisingPlayer?: boolean): {
|
|
@@ -67,12 +76,11 @@ export default abstract class Controller extends EventEmitter<{
|
|
|
67
76
|
score: number;
|
|
68
77
|
};
|
|
69
78
|
/**
|
|
70
|
-
* The minimax algorithm with alpha-beta pruning.
|
|
71
|
-
* @
|
|
72
|
-
* @param
|
|
73
|
-
* @param
|
|
74
|
-
* @param
|
|
75
|
-
* @param maximisingPlayer Whether or not the current player is the maximising player.
|
|
79
|
+
* The minimax algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
|
|
80
|
+
* @param depth - The depth of the algorithm.
|
|
81
|
+
* @param alpha - The bounds for the alpha-beta variation of the algorithm.
|
|
82
|
+
* @param beta - The bounds for the alpha-beta variation of the algorithm.
|
|
83
|
+
* @param maximisingPlayer - Whether or not the current player is the maximising player.
|
|
76
84
|
* @returns The optimal move.
|
|
77
85
|
*/
|
|
78
86
|
protected alphabeta(depth?: number, alpha?: number, beta?: number, maximisingPlayer?: boolean): {
|
|
@@ -83,20 +91,23 @@ export default abstract class Controller extends EventEmitter<{
|
|
|
83
91
|
private nextTurn;
|
|
84
92
|
/**
|
|
85
93
|
* Makes a move.
|
|
86
|
-
* @param input Either the algorithm to use to calculate the move or the move itself.
|
|
94
|
+
* @param input - Either the algorithm to use to calculate the move or the move itself.
|
|
87
95
|
*/
|
|
88
96
|
private makeMove;
|
|
89
97
|
/**
|
|
90
98
|
* Determines the CPU move.
|
|
91
|
-
* @param difficulty The difficulty of the AI.
|
|
92
|
-
* @param algorithm The algorithm to use.
|
|
99
|
+
* @param difficulty - The difficulty of the AI.
|
|
100
|
+
* @param algorithm - The algorithm to use.
|
|
93
101
|
* @returns The move.
|
|
94
102
|
*/
|
|
95
103
|
abstract determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
|
|
96
104
|
/**
|
|
97
105
|
* Finds the optimal move.
|
|
98
|
-
* @param options The options.
|
|
99
|
-
* @
|
|
106
|
+
* @param options - The options to use.
|
|
107
|
+
* @param options.algorithm - The algorithm to use.
|
|
108
|
+
* @param options.maxDepth - The maximum depth to search.
|
|
109
|
+
* @param options.randomMove - A random move to make.
|
|
110
|
+
* @returns The optimal move to make.
|
|
100
111
|
*/
|
|
101
112
|
abstract findOptimalMove(options?: {
|
|
102
113
|
algorithm?: Algorithm;
|
package/build/base/controller.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { EventEmitter } from "eventemitter3";
|
|
2
2
|
/**
|
|
3
3
|
* Decorator to check that the constructor type for the given class is correct.
|
|
4
|
-
* @
|
|
4
|
+
* @template T - The type of the game ID.
|
|
5
|
+
* @param constructor - The class to check.
|
|
5
6
|
*/
|
|
6
7
|
export function Game(constructor) {
|
|
7
8
|
void constructor;
|
|
8
9
|
}
|
|
9
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Represents a game controller.
|
|
12
|
+
* @template T - The type of the game ID.
|
|
13
|
+
*/
|
|
10
14
|
export default class Controller extends EventEmitter {
|
|
11
15
|
/** Contains the ID of the game. */
|
|
12
16
|
gameID;
|
|
@@ -20,35 +24,39 @@ export default class Controller extends EventEmitter {
|
|
|
20
24
|
currentPlayerId = 0;
|
|
21
25
|
/**
|
|
22
26
|
* Creates an instance of Controller.
|
|
23
|
-
* @param playerTypes The types of player.
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
26
|
-
* @param
|
|
27
|
+
* @param playerTypes - The types of player for the game.
|
|
28
|
+
* @param board - The board object.
|
|
29
|
+
* @param render - The render function.
|
|
30
|
+
* @param gameID - The ID of the game instance.
|
|
31
|
+
* @param onEnd - The function to call when the game ends.
|
|
32
|
+
* @param onInvalidInput - The function to call when the input is invalid.
|
|
27
33
|
*/
|
|
28
|
-
// eslint-disable-next-line @typescript-eslint/max-params
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/max-params
|
|
29
35
|
constructor(playerTypes, board, render, gameID, onEnd, onInvalidInput) {
|
|
30
36
|
super();
|
|
31
|
-
this.gameID = gameID
|
|
37
|
+
this.gameID = gameID;
|
|
32
38
|
this.board = board;
|
|
33
|
-
this.board.setGameID(this.gameID);
|
|
34
39
|
this.players = playerTypes.map((playerType, id) => ({ id, playerType }));
|
|
35
|
-
this.render = render;
|
|
40
|
+
this.render = render.bind(null, this);
|
|
36
41
|
if (onEnd !== undefined)
|
|
37
42
|
this.on("end", onEnd);
|
|
38
43
|
if (onInvalidInput !== undefined)
|
|
39
44
|
this.on("invalidInput", onInvalidInput);
|
|
40
45
|
}
|
|
41
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Gets the current player object.
|
|
48
|
+
* @returns The current player object.
|
|
49
|
+
*/
|
|
42
50
|
get currentPlayer() {
|
|
43
51
|
return this.players[this.currentPlayerId];
|
|
44
52
|
}
|
|
45
53
|
/**
|
|
46
54
|
* Controls the main game flow.
|
|
47
|
-
* @param algorithm The algorithm to use.
|
|
55
|
+
* @param algorithm - The algorithm to use.
|
|
48
56
|
* @returns The winner or null in the event of a tie.
|
|
49
57
|
*/
|
|
50
58
|
async play(algorithm = "alphabeta") {
|
|
51
|
-
await this.render(
|
|
59
|
+
await this.render();
|
|
52
60
|
this.on("input", async (move) => {
|
|
53
61
|
await this.makeMove(move);
|
|
54
62
|
if (this.currentPlayer.playerType !== "human")
|
|
@@ -59,10 +67,9 @@ export default class Controller extends EventEmitter {
|
|
|
59
67
|
await this.makeMove(algorithm);
|
|
60
68
|
}
|
|
61
69
|
/**
|
|
62
|
-
* The bog standard minimax algorithm. Left in for reference.
|
|
63
|
-
* @
|
|
64
|
-
* @param
|
|
65
|
-
* @param maximisingPlayer Whether or not the current player is the maximising player.
|
|
70
|
+
* The bog standard minimax algorithm. Left in for reference (https://en.wikipedia.org/wiki/Minimax).
|
|
71
|
+
* @param depth - The depth of the algorithm.
|
|
72
|
+
* @param maximisingPlayer - Whether or not the current player is the maximising player.
|
|
66
73
|
* @returns The optimal move.
|
|
67
74
|
*/
|
|
68
75
|
minimax(depth = Infinity, maximisingPlayer = true) {
|
|
@@ -96,12 +103,11 @@ export default class Controller extends EventEmitter {
|
|
|
96
103
|
return bestMove;
|
|
97
104
|
}
|
|
98
105
|
/**
|
|
99
|
-
* The minimax algorithm with alpha-beta pruning.
|
|
100
|
-
* @
|
|
101
|
-
* @param
|
|
102
|
-
* @param
|
|
103
|
-
* @param
|
|
104
|
-
* @param maximisingPlayer Whether or not the current player is the maximising player.
|
|
106
|
+
* The minimax algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
|
|
107
|
+
* @param depth - The depth of the algorithm.
|
|
108
|
+
* @param alpha - The bounds for the alpha-beta variation of the algorithm.
|
|
109
|
+
* @param beta - The bounds for the alpha-beta variation of the algorithm.
|
|
110
|
+
* @param maximisingPlayer - Whether or not the current player is the maximising player.
|
|
105
111
|
* @returns The optimal move.
|
|
106
112
|
*/
|
|
107
113
|
alphabeta(depth = Infinity, alpha = -Infinity, beta = Infinity, maximisingPlayer = true) {
|
|
@@ -148,7 +154,7 @@ export default class Controller extends EventEmitter {
|
|
|
148
154
|
}
|
|
149
155
|
/**
|
|
150
156
|
* Makes a move.
|
|
151
|
-
* @param input Either the algorithm to use to calculate the move or the move itself.
|
|
157
|
+
* @param input - Either the algorithm to use to calculate the move or the move itself.
|
|
152
158
|
*/
|
|
153
159
|
async makeMove(input) {
|
|
154
160
|
if (typeof input === "string") {
|
|
@@ -161,7 +167,7 @@ export default class Controller extends EventEmitter {
|
|
|
161
167
|
}
|
|
162
168
|
this.board.makeMove(input, this.currentPlayer.id);
|
|
163
169
|
}
|
|
164
|
-
await this.render(
|
|
170
|
+
await this.render();
|
|
165
171
|
const { winner } = this.board;
|
|
166
172
|
if (winner !== false) {
|
|
167
173
|
this.emit("end", winner);
|
|
@@ -170,4 +176,4 @@ export default class Controller extends EventEmitter {
|
|
|
170
176
|
this.nextTurn();
|
|
171
177
|
}
|
|
172
178
|
}
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLFdBQTRCO0lBQzdDLEtBQUssV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsVUFBVyxTQUFRLFlBSS9DO0lBQ0UsbUNBQW1DO0lBQ25CLE1BQU0sQ0FBVTtJQUVoQywwQkFBMEI7SUFDVixLQUFLLENBQVE7SUFFN0IsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBK0M7SUFFckUsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEM7Ozs7OztPQU1HO0lBQ0gsd0VBQXdFO0lBQ3hFLFlBQ0ksV0FBeUIsRUFDekIsS0FBWSxFQUNaLE1BQTRCLEVBQzVCLE1BQWUsRUFDZixLQUF1QyxFQUN2QyxjQUF5RDtRQUV6RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLEdBQUcs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SSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU5QixJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBZ0JKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHlwZSA9IFwiZWFzeUNQVVwiIHwgXCJoYXJkQ1BVXCIgfCBcImh1bWFuXCIgfCBcImltcG9zc2libGVDUFVcIiB8IFwibWVkaXVtQ1BVXCI7XG5leHBvcnQgdHlwZSBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiIHwgXCJtaW5pbWF4XCI7XG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3JPcHRpb25zID0ge1xuICAgIGlkPzogdW5rbm93bjtcbiAgICBvbkVuZD86ICh3aW5uZXI6IG51bWJlciB8IG51bGwpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uSW52YWxpZElucHV0PzogKHBvc2l0aW9uOiBQb3NpdGlvbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgcmVuZGVyZXI/OiAoY29udHJvbGxlcjogQ29udHJvbGxlcikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59O1xuZXhwb3J0IHR5cGUgR2FtZUNvbnN0cnVjdG9yID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZ1bmN0aW9uLXR5cGVcbiAgICBuZXcgKHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zKTogQ29udHJvbGxlcjtcbn07XG4vKipcbiAqIERlY29yYXRvciB0byBjaGVjayB0aGF0IHRoZSBjb25zdHJ1Y3RvciB0eXBlIGZvciB0aGUgZ2l2ZW4gY2xhc3MgaXMgY29ycmVjdC5cbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciBUaGUgY2xhc3MgdG8gY2hlY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHYW1lKGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG4vKiogUmVwcmVzZW50cyBhIGdhbWUgY29udHJvbGxlci4gKi9cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIENvbnRyb2xsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8e1xuICAgIGVuZDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uRW5kXCJdO1xuICAgIGlucHV0OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25JbnZhbGlkSW5wdXRcIl07XG4gICAgaW52YWxpZElucHV0OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25JbnZhbGlkSW5wdXRcIl07XG59PiB7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgZ2FtZS4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZ2FtZUlEOiB1bmtub3duO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBib2FyZC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYm9hcmQ6IEJvYXJkO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB2aWV3IG9iamVjdC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVuZGVyOiBSZXF1aXJlZDxHYW1lQ29uc3RydWN0b3JPcHRpb25zPltcInJlbmRlcmVyXCJdO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcGxheWVyLiAqL1xuICAgIHByaXZhdGUgY3VycmVudFBsYXllcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb250cm9sbGVyLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUeXBlcyBUaGUgdHlwZXMgb2YgcGxheWVyLlxuICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gZ2FtZUlEIFRoZSBJRCBvZiB0aGUgZ2FtZS5cbiAgICAgKiBAcGFyYW0gYm9hcmQgVGhlIGJvYXJkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWF4LXBhcmFtcywgcmVxdWlyZS1qc2RvY1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyVHlwZXM6IFBsYXllclR5cGVbXSxcbiAgICAgICAgYm9hcmQ6IEJvYXJkLFxuICAgICAgICByZW5kZXI6IENvbnRyb2xsZXJbXCJyZW5kZXJcIl0sXG4gICAgICAgIGdhbWVJRDogdW5rbm93bixcbiAgICAgICAgb25FbmQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25FbmRcIl0sXG4gICAgICAgIG9uSW52YWxpZElucHV0PzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmdhbWVJRCA9IGdhbWVJRCA/PyBEYXRlLm5vdygpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdGhpcy5ib2FyZCA9IGJvYXJkO1xuICAgICAgICB0aGlzLmJvYXJkLnNldEdhbWVJRCh0aGlzLmdhbWVJRCk7XG4gICAgICAgIHRoaXMucGxheWVycyA9IHBsYXllclR5cGVzLm1hcCgocGxheWVyVHlwZSwgaWQpID0+ICh7IGlkLCBwbGF5ZXJUeXBlIH0pKTtcbiAgICAgICAgdGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cbiAgICAgICAgaWYgKG9uRW5kICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiZW5kXCIsIG9uRW5kKTtcblxuICAgICAgICBpZiAob25JbnZhbGlkSW5wdXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJpbnZhbGlkSW5wdXRcIiwgb25JbnZhbGlkSW5wdXQpO1xuICAgIH1cblxuICAgIC8qKiBHZXRzIHRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuICovXG4gICAgcHVibGljIGdldCBjdXJyZW50UGxheWVyKCk6IHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcnNbdGhpcy5jdXJyZW50UGxheWVySWRdITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgbWFpbiBnYW1lIGZsb3cuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KGFsZ29yaXRobTogQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5vbihcImlucHV0XCIsIGFzeW5jIChtb3ZlOiBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShtb3ZlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShhbGdvcml0aG0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiAmJiB0aGlzLmJvYXJkLndpbm5lciA9PT0gZmFsc2UpXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShhbGdvcml0aG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBib2cgc3RhbmRhcmQgbWluaW1heCBhbGdvcml0aG0uIExlZnQgaW4gZm9yIHJlZmVyZW5jZS5cbiAgICAgKiBAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4XG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtYXhpbWlzaW5nUGxheWVyIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWluaW1heChkZXB0aDogbnVtYmVyID0gSW5maW5pdHksIG1heGltaXNpbmdQbGF5ZXI6IGJvb2xlYW4gPSB0cnVlKTogeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfSB7XG4gICAgICAgIGNvbnN0IHBsYXllcklkcyA9IFsodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIDIsIHRoaXMuY3VycmVudFBsYXllcklkXSBhcyBjb25zdDtcblxuICAgICAgICBpZiAoZGVwdGggPT09IDAgfHwgdGhpcy5ib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogdGhpcy5ib2FyZC5oZXVyaXN0aWMgKiAodGhpcy5jdXJyZW50UGxheWVySWQgPT09IDAgPyAxIDogLTEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiZXN0TW92ZTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5taW5pbWF4PiA9IHtcbiAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgIHNjb3JlOiBtYXhpbWlzaW5nUGxheWVyID8gLUluZmluaXR5IDogSW5maW5pdHksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vdmUgb2YgZW1wdHlDZWxscykge1xuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZHNbTnVtYmVyKG1heGltaXNpbmdQbGF5ZXIpXSEpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSAoOSAtIGVtcHR5Q2VsbHMubGVuZ3RoKSAqIHRoaXMubWluaW1heChkZXB0aCAtIDEsICFtYXhpbWlzaW5nUGxheWVyKS5zY29yZTtcblxuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcblxuICAgICAgICAgICAgaWYgKG1heGltaXNpbmdQbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1heChzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1pbihzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IGFsZ29yaXRobSB3aXRoIGFscGhhLWJldGEgcHJ1bmluZy5cbiAgICAgKiBAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4XG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwbGF5ZXIgaXMgdGhlIG1heGltaXNpbmcgcGxheWVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFscGhhYmV0YShcbiAgICAgICAgZGVwdGg6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBhbHBoYTogbnVtYmVyID0gLUluZmluaXR5LFxuICAgICAgICBiZXRhOiBudW1iZXIgPSBJbmZpbml0eSxcbiAgICAgICAgbWF4aW1pc2luZ1BsYXllcjogYm9vbGVhbiA9IHRydWUsXG4gICAgKTogeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfSB7XG4gICAgICAgIGNvbnN0IHBsYXllcklkcyA9IFsodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIDIsIHRoaXMuY3VycmVudFBsYXllcklkXSBhcyBjb25zdDtcblxuICAgICAgICBpZiAoZGVwdGggPT09IDAgfHwgdGhpcy5ib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogdGhpcy5ib2FyZC5oZXVyaXN0aWMgKiAodGhpcy5jdXJyZW50UGxheWVySWQgPT09IDAgPyAxIDogLTEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiZXN0TW92ZTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5hbHBoYWJldGE+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5hbHBoYWJldGEoZGVwdGggLSAxLCBhbHBoYSwgYmV0YSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuXG4gICAgICAgICAgICB0aGlzLmJvYXJkLnVuZG9MYXN0TW92ZSgpO1xuXG4gICAgICAgICAgICBpZiAobWF4aW1pc2luZ1BsYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWF4KHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdE1vdmUuc2NvcmUgPiBiZXRhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGFscGhhID0gTWF0aC5tYXgoYWxwaGEsIGJlc3RTY29yZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWluKHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdE1vdmUuc2NvcmUgPCBhbHBoYSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBiZXRhID0gTWF0aC5taW4oYmV0YSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZXN0TW92ZTtcbiAgICB9XG5cbiAgICAvKiogQ2hhbmdlcyB3aGljaCBwbGF5ZXIncyB0dXJuIGl0IGlzLiAqL1xuICAgIHByaXZhdGUgbmV4dFR1cm4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFBsYXllcklkID0gKHRoaXMuY3VycmVudFBsYXllcklkICsgMSkgJSB0aGlzLnBsYXllcnMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgbW92ZS5cbiAgICAgKiBAcGFyYW0gaW5wdXQgRWl0aGVyIHRoZSBhbGdvcml0aG0gdG8gdXNlIHRvIGNhbGN1bGF0ZSB0aGUgbW92ZSBvciB0aGUgbW92ZSBpdHNlbGYuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlTW92ZShpbnB1dDogQWxnb3JpdGhtIHwgUG9zaXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZSh0aGlzLmRldGVybWluZUNQVU1vdmUodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUsIGlucHV0KSwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiIHx8ICF0aGlzLmJvYXJkLm1vdmVJc1ZhbGlkKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImludmFsaWRJbnB1dFwiLCBpbnB1dCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUoaW5wdXQsIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcih0aGlzKTtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVuZFwiLCB3aW5uZXIpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRUdXJuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgQ1BVIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgVGhlIGRpZmZpY3VsdHkgb2YgdGhlIEFJLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHJldHVybnMgVGhlIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGRldGVybWluZUNQVU1vdmUoZGlmZmljdWx0eTogT21pdDxQbGF5ZXJUeXBlLCBcImh1bWFuXCI+LCBhbGdvcml0aG0/OiBBbGdvcml0aG0pOiBQb3NpdGlvbjtcblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmluZE9wdGltYWxNb3ZlKG9wdGlvbnM/OiB7IGFsZ29yaXRobT86IEFsZ29yaXRobTsgbWF4RGVwdGg/OiBudW1iZXI7IHJhbmRvbU1vdmU/OiBQb3NpdGlvbjsgfSk6IFBvc2l0aW9uO1xufVxuIl19
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdCN0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUksV0FBK0I7SUFDbkQsS0FBSyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQWMsU0FBUSxZQUlsRDtJQUNFLG1DQUFtQztJQUNuQixNQUFNLENBQUk7SUFFMUIsMEJBQTBCO0lBQ1YsS0FBSyxDQUEwQjtJQUUvQyxnQ0FBZ0M7SUFDaEIsTUFBTSxDQUE2QjtJQUVuRCxtQ0FBbUM7SUFDaEIsT0FBTyxDQUFpRDtJQUUzRSw2Q0FBNkM7SUFDckMsZUFBZSxHQUFXLENBQUMsQ0FBQztJQUVwQzs7Ozs7Ozs7T0FRRztJQUNILHlEQUF5RDtJQUN6RCxZQUNJLFdBQXlCLEVBQ3pCLEtBQThCLEVBQzlCLE1BQXVELEVBQ3ZELE1BQVMsRUFDVCxLQUEwQyxFQUMxQyxjQUE0RDtRQUU1RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxLQUFLLEtBQUssU0FBUztZQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFB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LE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBdUJKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5pbXBvcnQgdHlwZSBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHlwZSA9IFwiZWFzeUNQVVwiIHwgXCJoYXJkQ1BVXCIgfCBcImh1bWFuXCIgfCBcImltcG9zc2libGVDUFVcIiB8IFwibWVkaXVtQ1BVXCI7XG5leHBvcnQgdHlwZSBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiIHwgXCJtaW5pbWF4XCI7XG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+ID0ge1xuICAgIGlkOiBUO1xuICAgIG9uRW5kPzogKHdpbm5lcjogbnVtYmVyIHwgbnVsbCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgb25JbnZhbGlkSW5wdXQ/OiAocG9zaXRpb246IFBvc2l0aW9uKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICByZW5kZXJlcj86IChjb250cm9sbGVyOiBDb250cm9sbGVyPFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn07XG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3I8VD4gPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZnVuY3Rpb24tdHlwZVxuICAgIG5ldyhwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zOiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+KTogQ29udHJvbGxlcjxUPjtcbn07XG4vKipcbiAqIERlY29yYXRvciB0byBjaGVjayB0aGF0IHRoZSBjb25zdHJ1Y3RvciB0eXBlIGZvciB0aGUgZ2l2ZW4gY2xhc3MgaXMgY29ycmVjdC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGdhbWUgSUQuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MgdG8gY2hlY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHYW1lPFQ+KGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3I8VD4pOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGNvbnRyb2xsZXIuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBnYW1lIElELlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyPFQ+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPHtcbiAgICBlbmQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkVuZFwiXTtcbiAgICBpbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdO1xuICAgIGludmFsaWRJbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdO1xufT4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGdhbWUuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGdhbWVJRDogVDtcblxuICAgIC8qKiBDb250YWlucyB0aGUgYm9hcmQuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGJvYXJkOiBCb2FyZDxMb25nSW50IHwgbnVtYmVyPjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgdmlldyBvYmplY3QuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHJlbmRlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIHBsYXllciBvYmplY3RzLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwbGF5ZXJzOiBBcnJheTx7IGlkOiBudW1iZXI7IHBsYXllclR5cGU6IFBsYXllclR5cGU7IH0+O1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgY3VycmVudCBwbGF5ZXIuICovXG4gICAgcHJpdmF0ZSBjdXJyZW50UGxheWVySWQ6IG51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbnRyb2xsZXIuXG4gICAgICogQHBhcmFtIHBsYXllclR5cGVzIC0gVGhlIHR5cGVzIG9mIHBsYXllciBmb3IgdGhlIGdhbWUuXG4gICAgICogQHBhcmFtIGJvYXJkIC0gVGhlIGJvYXJkIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmVuZGVyIC0gVGhlIHJlbmRlciBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gZ2FtZUlEIC0gVGhlIElEIG9mIHRoZSBnYW1lIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBvbkVuZCAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGdhbWUgZW5kcy5cbiAgICAgKiBAcGFyYW0gb25JbnZhbGlkSW5wdXQgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBpbnB1dCBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWF4LXBhcmFtc1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyVHlwZXM6IFBsYXllclR5cGVbXSxcbiAgICAgICAgYm9hcmQ6IEJvYXJkPExvbmdJbnQgfCBudW1iZXI+LFxuICAgICAgICByZW5kZXI6IFJlcXVpcmVkPEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD4+W1wicmVuZGVyZXJcIl0sXG4gICAgICAgIGdhbWVJRDogVCxcbiAgICAgICAgb25FbmQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25FbmRcIl0sXG4gICAgICAgIG9uSW52YWxpZElucHV0PzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmdhbWVJRCA9IGdhbWVJRDtcbiAgICAgICAgdGhpcy5ib2FyZCA9IGJvYXJkO1xuICAgICAgICB0aGlzLnBsYXllcnMgPSBwbGF5ZXJUeXBlcy5tYXAoKHBsYXllclR5cGUsIGlkKSA9PiAoeyBpZCwgcGxheWVyVHlwZSB9KSk7XG4gICAgICAgIHRoaXMucmVuZGVyID0gcmVuZGVyLmJpbmQobnVsbCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKG9uRW5kICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiZW5kXCIsIG9uRW5kKTtcblxuICAgICAgICBpZiAob25JbnZhbGlkSW5wdXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJpbnZhbGlkSW5wdXRcIiwgb25JbnZhbGlkSW5wdXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcGxheWVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwbGF5ZXIgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFBsYXllcigpOiB7IGlkOiBudW1iZXI7IHBsYXllclR5cGU6IFBsYXllclR5cGU7IH0ge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXJzW3RoaXMuY3VycmVudFBsYXllcklkXSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIG1haW4gZ2FtZSBmbG93LlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KGFsZ29yaXRobTogQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLm9uKFwiaW5wdXRcIiwgYXN5bmMgKG1vdmU6IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKG1vdmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIilcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvZyBzdGFuZGFyZCBtaW5pbWF4IGFsZ29yaXRobS4gTGVmdCBpbiBmb3IgcmVmZXJlbmNlIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4KS5cbiAgICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgZGVwdGggb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciAtIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWluaW1heChkZXB0aDogbnVtYmVyID0gSW5maW5pdHksIG1heGltaXNpbmdQbGF5ZXI6IGJvb2xlYW4gPSB0cnVlKTogeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfSB7XG4gICAgICAgIGNvbnN0IHBsYXllcklkcyA9IFsodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIDIsIHRoaXMuY3VycmVudFBsYXllcklkXSBhcyBjb25zdDtcblxuICAgICAgICBpZiAoZGVwdGggPT09IDAgfHwgdGhpcy5ib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogdGhpcy5ib2FyZC5oZXVyaXN0aWMgKiAodGhpcy5jdXJyZW50UGxheWVySWQgPT09IDAgPyAxIDogLTEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiZXN0TW92ZTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5taW5pbWF4PiA9IHtcbiAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgIHNjb3JlOiBtYXhpbWlzaW5nUGxheWVyID8gLUluZmluaXR5IDogSW5maW5pdHksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vdmUgb2YgZW1wdHlDZWxscykge1xuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZHNbTnVtYmVyKG1heGltaXNpbmdQbGF5ZXIpXSEpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSAoOSAtIGVtcHR5Q2VsbHMubGVuZ3RoKSAqIHRoaXMubWluaW1heChkZXB0aCAtIDEsICFtYXhpbWlzaW5nUGxheWVyKS5zY29yZTtcblxuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcblxuICAgICAgICAgICAgaWYgKG1heGltaXNpbmdQbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1heChzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1pbihzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IGFsZ29yaXRobSB3aXRoIGFscGhhLWJldGEgcHJ1bmluZyAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWluaW1heCkuXG4gICAgICogQHBhcmFtIGRlcHRoIC0gVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGFscGhhIC0gVGhlIGJvdW5kcyBmb3IgdGhlIGFscGhhLWJldGEgdmFyaWF0aW9uIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGEgLSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciAtIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWxwaGFiZXRhKFxuICAgICAgICBkZXB0aDogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIGFscGhhOiBudW1iZXIgPSAtSW5maW5pdHksXG4gICAgICAgIGJldGE6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmFscGhhYmV0YT4gPSB7XG4gICAgICAgICAgICBtb3ZlOiB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICBzY29yZTogbWF4aW1pc2luZ1BsYXllciA/IC1JbmZpbml0eSA6IEluZmluaXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb3ZlIG9mIGVtcHR5Q2VsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUobW92ZSwgcGxheWVySWRzW051bWJlcihtYXhpbWlzaW5nUGxheWVyKV0hKTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gKDkgLSBlbXB0eUNlbGxzLmxlbmd0aCkgKiB0aGlzLmFscGhhYmV0YShkZXB0aCAtIDEsIGFscGhhLCBiZXRhLCAhbWF4aW1pc2luZ1BsYXllcikuc2NvcmU7XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQudW5kb0xhc3RNb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA+IGJldGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA8IGFscGhhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCAtIEVpdGhlciB0aGUgYWxnb3JpdGhtIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIG1vdmUgb3IgdGhlIG1vdmUgaXRzZWxmLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFrZU1vdmUoaW5wdXQ6IEFsZ29yaXRobSB8IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUodGhpcy5kZXRlcm1pbmVDUFVNb3ZlKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlLCBpbnB1dCksIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiB8fCAhdGhpcy5ib2FyZC5tb3ZlSXNWYWxpZChpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJpbnZhbGlkSW5wdXRcIiwgaW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKGlucHV0LCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVuZFwiLCB3aW5uZXIpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRUdXJuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgQ1BVIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQUkuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtPzogQWxnb3JpdGhtKTogUG9zaXRpb247XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnJhbmRvbU1vdmUgLSBBIHJhbmRvbSBtb3ZlIHRvIG1ha2UuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZSB0byBtYWtlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHtcbiAgICAgICAgYWxnb3JpdGhtPzogQWxnb3JpdGhtO1xuICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgICAgcmFuZG9tTW92ZT86IFBvc2l0aW9uO1xuICAgIH0pOiBQb3NpdGlvbjtcbn1cbiJdfQ==
|
|
@@ -1,50 +1,53 @@
|
|
|
1
1
|
import type LongInt from "./longInt.js";
|
|
2
|
-
import
|
|
2
|
+
import { StringType } from "./longInt.js";
|
|
3
3
|
/**
|
|
4
|
-
* Represents a BitBoard.
|
|
5
|
-
* @
|
|
4
|
+
* Represents a BitBoard (https://en.wikipedia.org/wiki/Bitboard).
|
|
5
|
+
* @template T - The type of the numeric data.
|
|
6
6
|
*/
|
|
7
|
-
export default abstract class BitBoard<T extends LongInt | number
|
|
7
|
+
export default abstract class BitBoard<T extends LongInt | number> {
|
|
8
8
|
/** The numeric data. */
|
|
9
9
|
protected _data: T;
|
|
10
10
|
/**
|
|
11
11
|
* Creates an instance of BitBoard.
|
|
12
|
-
* @param data The data to assign to the BitBoard.
|
|
12
|
+
* @param data - The data to assign to the BitBoard.
|
|
13
13
|
*/
|
|
14
14
|
protected constructor(data: T);
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Gets the numeric data.
|
|
17
|
+
* @returns The numeric data.
|
|
18
|
+
*/
|
|
16
19
|
get data(): T;
|
|
17
20
|
/**
|
|
18
21
|
* Returns a string representation of the BitBoard.
|
|
19
|
-
* @param type The base of the string to print.
|
|
22
|
+
* @param type - The base of the string to print.
|
|
20
23
|
* @returns The string representation.
|
|
21
24
|
*/
|
|
22
25
|
toString(type?: StringType): string;
|
|
23
26
|
/**
|
|
24
27
|
* Assigns a given bit a given value.
|
|
25
|
-
* @param bit The x coordinate.
|
|
26
|
-
* @param value The value to assign to the bit.
|
|
28
|
+
* @param bit - The x coordinate.
|
|
29
|
+
* @param value - The value to assign to the bit.
|
|
27
30
|
*/
|
|
28
31
|
assignBit(bit: number, value: 0 | 1): void;
|
|
29
32
|
/**
|
|
30
|
-
* Gets a given bit
|
|
31
|
-
* @param bit The index of the bit to get, 0 = LSB.
|
|
32
|
-
* @returns The bit.
|
|
33
|
+
* Gets a given bit.
|
|
34
|
+
* @param bit - The index of the bit to get, 0 = LSB.
|
|
35
|
+
* @returns The bit value.
|
|
33
36
|
*/
|
|
34
37
|
abstract getBit(bit: number): 0 | 1;
|
|
35
38
|
/**
|
|
36
|
-
* Sets a given bit (changes the value to 1)
|
|
37
|
-
* @param bit The index of the bit to get, 0 = LSB.
|
|
39
|
+
* Sets a given bit (changes the value to 1).
|
|
40
|
+
* @param bit - The index of the bit to get, 0 = LSB.
|
|
38
41
|
*/
|
|
39
42
|
abstract setBit(bit: number): void;
|
|
40
43
|
/**
|
|
41
|
-
* Clears a given bit (changes the value to 0)
|
|
42
|
-
* @param bit The index of the bit to get, 0 = LSB.
|
|
44
|
+
* Clears a given bit (changes the value to 0).
|
|
45
|
+
* @param bit - The index of the bit to get, 0 = LSB.
|
|
43
46
|
*/
|
|
44
47
|
abstract clearBit(bit: number): void;
|
|
45
48
|
/**
|
|
46
|
-
* Toggles a given bit (changes the value from 0 to 1 or 1 to 0)
|
|
47
|
-
* @param bit The index of the bit to get, 0 = LSB.
|
|
49
|
+
* Toggles a given bit (changes the value from 0 to 1 or 1 to 0).
|
|
50
|
+
* @param bit - The index of the bit to get, 0 = LSB.
|
|
48
51
|
*/
|
|
49
52
|
abstract toggleBit(bit: number): void;
|
|
50
53
|
/** Clears the whole BitBoard (sets all values to 0). */
|
|
@@ -53,55 +56,55 @@ export default abstract class BitBoard<T extends LongInt | number = LongInt | nu
|
|
|
53
56
|
abstract setAll(): void;
|
|
54
57
|
/**
|
|
55
58
|
* Gets a range of bits.
|
|
56
|
-
* @param LSB The least significant bit.
|
|
57
|
-
* @param numberOfBits The number of bits to get.
|
|
59
|
+
* @param LSB - The least significant bit.
|
|
60
|
+
* @param numberOfBits - The number of bits to get.
|
|
58
61
|
* @returns The range of bits.
|
|
59
62
|
*/
|
|
60
63
|
abstract getBits(LSB: number, numberOfBits: number): T;
|
|
61
64
|
/**
|
|
62
65
|
* Carries out a bitwise and (&) operation.
|
|
63
|
-
* @param right The right value.
|
|
66
|
+
* @param right - The right value.
|
|
64
67
|
* @returns The result.
|
|
65
68
|
*/
|
|
66
|
-
abstract and(right: BitBoard<T> | T | number):
|
|
69
|
+
abstract and(right: BitBoard<T> | T | number): BitBoard<T>;
|
|
67
70
|
/**
|
|
68
71
|
* Carries out a bitwise or (|) operation.
|
|
69
|
-
* @param right The right value.
|
|
72
|
+
* @param right - The right value.
|
|
70
73
|
* @returns The result.
|
|
71
74
|
*/
|
|
72
|
-
abstract or(right: BitBoard<T> | T | number):
|
|
75
|
+
abstract or(right: BitBoard<T> | T | number): BitBoard<T>;
|
|
73
76
|
/**
|
|
74
77
|
* Carries out a bitwise xor (^) operation.
|
|
75
|
-
* @param right The right value.
|
|
78
|
+
* @param right - The right value.
|
|
76
79
|
* @returns The result.
|
|
77
80
|
*/
|
|
78
|
-
abstract xor(right: BitBoard<T> | T | number):
|
|
81
|
+
abstract xor(right: BitBoard<T> | T | number): BitBoard<T>;
|
|
79
82
|
/**
|
|
80
83
|
* Carries out a bitwise not (~) operation.
|
|
81
84
|
* @returns The result.
|
|
82
85
|
*/
|
|
83
|
-
abstract not():
|
|
86
|
+
abstract not(): BitBoard<T>;
|
|
84
87
|
/**
|
|
85
88
|
* Carries out a bitwise left shift (<<) operation.
|
|
86
|
-
* @param shiftAmount How much to shift it by.
|
|
89
|
+
* @param shiftAmount - How much to shift it by.
|
|
87
90
|
* @returns The result.
|
|
88
91
|
*/
|
|
89
|
-
abstract leftShift(shiftAmount: number):
|
|
92
|
+
abstract leftShift(shiftAmount: number): BitBoard<T>;
|
|
90
93
|
/**
|
|
91
94
|
* Carries out a bitwise logical right shift (>>>) operation.
|
|
92
|
-
* @param shiftAmount How much to shift it by.
|
|
95
|
+
* @param shiftAmount - How much to shift it by.
|
|
93
96
|
* @returns The result.
|
|
94
97
|
*/
|
|
95
|
-
abstract rightShift(shiftAmount: number):
|
|
98
|
+
abstract rightShift(shiftAmount: number): BitBoard<T>;
|
|
96
99
|
/**
|
|
97
100
|
* Carries out a bitwise arithmetic right shift (>>) operation.
|
|
98
|
-
* @param shiftAmount How much to shift it by.
|
|
101
|
+
* @param shiftAmount - How much to shift it by.
|
|
99
102
|
* @returns The result.
|
|
100
103
|
*/
|
|
101
|
-
abstract arithmeticRightShift(shiftAmount: number):
|
|
104
|
+
abstract arithmeticRightShift(shiftAmount: number): BitBoard<T>;
|
|
102
105
|
/**
|
|
103
106
|
* Checks if two BitBoards have equal data values.
|
|
104
|
-
* @param value The value to compare against.
|
|
107
|
+
* @param value - The value to compare against.
|
|
105
108
|
* @returns Whether or not the two BitBoard have the same data value.
|
|
106
109
|
*/
|
|
107
110
|
abstract equals(value: BitBoard<T> | T | number): boolean;
|
|
@@ -1,36 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Represents a BitBoard.
|
|
3
|
-
* @
|
|
2
|
+
* Represents a BitBoard (https://en.wikipedia.org/wiki/Bitboard).
|
|
3
|
+
* @template T - The type of the numeric data.
|
|
4
4
|
*/
|
|
5
5
|
export default class BitBoard {
|
|
6
6
|
/** The numeric data. */
|
|
7
7
|
_data;
|
|
8
8
|
/**
|
|
9
9
|
* Creates an instance of BitBoard.
|
|
10
|
-
* @param data The data to assign to the BitBoard.
|
|
10
|
+
* @param data - The data to assign to the BitBoard.
|
|
11
11
|
*/
|
|
12
12
|
constructor(data) {
|
|
13
13
|
this._data = data;
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Gets the numeric data.
|
|
17
|
+
* @returns The numeric data.
|
|
18
|
+
*/
|
|
16
19
|
get data() {
|
|
17
20
|
return this._data;
|
|
18
21
|
}
|
|
19
22
|
/**
|
|
20
23
|
* Returns a string representation of the BitBoard.
|
|
21
|
-
* @param type The base of the string to print.
|
|
24
|
+
* @param type - The base of the string to print.
|
|
22
25
|
* @returns The string representation.
|
|
23
26
|
*/
|
|
24
|
-
toString(type = 16) {
|
|
27
|
+
toString(type = 16 /* StringType.HEXADECIMAL */) {
|
|
25
28
|
let padLength = 0;
|
|
26
29
|
switch (type) {
|
|
27
|
-
case 2
|
|
30
|
+
case 2 /* StringType.BINARY */:
|
|
28
31
|
padLength = 32;
|
|
29
32
|
break;
|
|
30
|
-
case 10
|
|
33
|
+
case 10 /* StringType.DECIMAL */:
|
|
31
34
|
padLength = 10;
|
|
32
35
|
break;
|
|
33
|
-
case 16
|
|
36
|
+
case 16 /* StringType.HEXADECIMAL */:
|
|
34
37
|
padLength = 8;
|
|
35
38
|
break;
|
|
36
39
|
}
|
|
@@ -38,8 +41,8 @@ export default class BitBoard {
|
|
|
38
41
|
}
|
|
39
42
|
/**
|
|
40
43
|
* Assigns a given bit a given value.
|
|
41
|
-
* @param bit The x coordinate.
|
|
42
|
-
* @param value The value to assign to the bit.
|
|
44
|
+
* @param bit - The x coordinate.
|
|
45
|
+
* @param value - The value to assign to the bit.
|
|
43
46
|
*/
|
|
44
47
|
assignBit(bit, value) {
|
|
45
48
|
if (value === 0)
|
|
@@ -48,4 +51,4 @@ export default class BitBoard {
|
|
|
48
51
|
this.setBit(bit);
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Qm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Qm9hcmQvYml0Qm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsUUFBUTtJQUNsQyx3QkFBd0I7SUFDZCxLQUFLLENBQUk7SUFFbkI7OztPQUdHO0lBQ0gsWUFBc0IsSUFBTztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksUUFBUSxDQUFDLHNDQUF5QztRQUNyRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFFbEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNYO2dCQUNJLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsTUFBTTtZQUNWO2dCQUNJLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsTUFBTTtZQUNWO2dCQUNJLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2QsTUFBTTtRQUNkLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsR0FBVyxFQUFFLEtBQVk7UUFDdEMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7O1lBRW5CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztDQStGSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIExvbmdJbnQgZnJvbSBcIi4vbG9uZ0ludC5qc1wiO1xuaW1wb3J0IHsgU3RyaW5nVHlwZSB9IGZyb20gXCIuL2xvbmdJbnQuanNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgQml0Qm9hcmQgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpdGJvYXJkKS5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIG51bWVyaWMgZGF0YS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQml0Qm9hcmQ8VCBleHRlbmRzIExvbmdJbnQgfCBudW1iZXI+IHtcbiAgICAvKiogVGhlIG51bWVyaWMgZGF0YS4gKi9cbiAgICBwcm90ZWN0ZWQgX2RhdGE6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJpdEJvYXJkLlxuICAgICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gYXNzaWduIHRvIHRoZSBCaXRCb2FyZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZGF0YTogVCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1lcmljIGRhdGEuXG4gICAgICogQHJldHVybnMgVGhlIG51bWVyaWMgZGF0YS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJpdEJvYXJkLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIGJhc2Ugb2YgdGhlIHN0cmluZyB0byBwcmludC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZyh0eXBlOiBTdHJpbmdUeXBlID0gU3RyaW5nVHlwZS5IRVhBREVDSU1BTCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBwYWRMZW5ndGggPSAwO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTdHJpbmdUeXBlLkJJTkFSWTpcbiAgICAgICAgICAgICAgICBwYWRMZW5ndGggPSAzMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RyaW5nVHlwZS5ERUNJTUFMOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDEwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdHJpbmdUeXBlLkhFWEFERUNJTUFMOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS50b1N0cmluZyh0eXBlKS5wYWRTdGFydChwYWRMZW5ndGgsIFwiMFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIGEgZ2l2ZW4gYml0IGEgZ2l2ZW4gdmFsdWUuXG4gICAgICogQHBhcmFtIGJpdCAtIFRoZSB4IGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgYml0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NpZ25CaXQoYml0OiBudW1iZXIsIHZhbHVlOiAwIHwgMSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICB0aGlzLmNsZWFyQml0KGJpdCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2V0Qml0KGJpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGdpdmVuIGJpdC5cbiAgICAgKiBAcGFyYW0gYml0IC0gVGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gZ2V0LCAwID0gTFNCLlxuICAgICAqIEByZXR1cm5zIFRoZSBiaXQgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEJpdChiaXQ6IG51bWJlcik6IDAgfCAxO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGdpdmVuIGJpdCAoY2hhbmdlcyB0aGUgdmFsdWUgdG8gMSkuXG4gICAgICogQHBhcmFtIGJpdCAtIFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0Qml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhIGdpdmVuIGJpdCAoY2hhbmdlcyB0aGUgdmFsdWUgdG8gMCkuXG4gICAgICogQHBhcmFtIGJpdCAtIFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgY2xlYXJCaXQoYml0OiBudW1iZXIpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyBhIGdpdmVuIGJpdCAoY2hhbmdlcyB0aGUgdmFsdWUgZnJvbSAwIHRvIDEgb3IgMSB0byAwKS5cbiAgICAgKiBAcGFyYW0gYml0IC0gVGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gZ2V0LCAwID0gTFNCLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB0b2dnbGVCaXQoYml0OiBudW1iZXIpOiB2b2lkO1xuXG4gICAgLyoqIENsZWFycyB0aGUgd2hvbGUgQml0Qm9hcmQgKHNldHMgYWxsIHZhbHVlcyB0byAwKS4gKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgY2xlYXJBbGwoKTogdm9pZDtcblxuICAgIC8qKiBTZXQgdGhlIHdob2xlIEJpdEJvYXJkIChzZXRzIGFsbCB2YWx1ZXMgdG8gMSkuICovXG4gICAgcHVibGljIGFic3RyYWN0IHNldEFsbCgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmdlIG9mIGJpdHMuXG4gICAgICogQHBhcmFtIExTQiAtIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuXG4gICAgICogQHBhcmFtIG51bWJlck9mQml0cyAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIHJhbmdlIG9mIGJpdHMuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEJpdHMoTFNCOiBudW1iZXIsIG51bWJlck9mQml0czogbnVtYmVyKTogVDtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhbmQgKCYpIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gcmlnaHQgLSBUaGUgcmlnaHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgYW5kKHJpZ2h0OiBCaXRCb2FyZDxUPiB8IFQgfCBudW1iZXIpOiBCaXRCb2FyZDxUPjtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBvciAofCkgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSByaWdodCAtIFRoZSByaWdodCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBvcihyaWdodDogQml0Qm9hcmQ8VD4gfCBUIHwgbnVtYmVyKTogQml0Qm9hcmQ8VD47XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHJpZ2h0IC0gVGhlIHJpZ2h0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IHhvcihyaWdodDogQml0Qm9hcmQ8VD4gfCBUIHwgbnVtYmVyKTogQml0Qm9hcmQ8VD47XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgbm90KCk6IEJpdEJvYXJkPFQ+O1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGxlZnQgc2hpZnQgKDw8KSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IC0gSG93IG11Y2ggdG8gc2hpZnQgaXQgYnkuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgbGVmdFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiBCaXRCb2FyZDxUPjtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBsb2dpY2FsIHJpZ2h0IHNoaWZ0ICg+Pj4pIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgLSBIb3cgbXVjaCB0byBzaGlmdCBpdCBieS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCByaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiBCaXRCb2FyZDxUPjtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0ICg+Pikgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCAtIEhvdyBtdWNoIHRvIHNoaWZ0IGl0IGJ5LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiBCaXRCb2FyZDxUPjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0d28gQml0Qm9hcmRzIGhhdmUgZXF1YWwgZGF0YSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgdHdvIEJpdEJvYXJkIGhhdmUgdGhlIHNhbWUgZGF0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZXF1YWxzKHZhbHVlOiBCaXRCb2FyZDxUPiB8IFQgfCBudW1iZXIpOiBib29sZWFuO1xufVxuIl19
|