@datagrok-libraries/utils 4.0.4 → 4.0.7

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/package.json CHANGED
@@ -4,11 +4,11 @@
4
4
  "access": "public"
5
5
  },
6
6
  "fullName": "Utils",
7
- "version": "4.0.4",
7
+ "version": "4.0.7",
8
8
  "description": "Common utilities",
9
9
  "dependencies": {
10
10
  "cash-dom": "^8.1.1",
11
- "datagrok-api": "^1.8.1",
11
+ "datagrok-api": "^1.13.16",
12
12
  "fast-sha256": "^1.3.0",
13
13
  "rxjs": "^6.5.5",
14
14
  "wu": "latest"
@@ -32,4 +32,4 @@
32
32
  "lint-fix": "eslint \"./src/**/*.ts\" --fix",
33
33
  "build-all": "npm --prefix ./../../js-api run build && npm run build"
34
34
  }
35
- }
35
+ }
@@ -0,0 +1,29 @@
1
+ export interface CheckerError {
2
+ path?: string[];
3
+ msg: string;
4
+ }
5
+ export type NestedChecker = (path: string[], actual: any, expected: any) => void;
6
+ export type ExpectPredicate = (actual: any, expected: any) => boolean;
7
+ export type ExpectChecker = (actual: any, expected: any, state: Readonly<ExpectRunnerState>, checkNested: NestedChecker) => CheckerError[] | void;
8
+ export interface CheckerItem {
9
+ name: string;
10
+ predicate: ExpectPredicate;
11
+ checker: ExpectChecker;
12
+ }
13
+ export declare const defaulCheckersSeq: CheckerItem[];
14
+ export declare class ExpectError extends Error {
15
+ }
16
+ export interface ExpectDeepEqualOptions {
17
+ floatTolerance?: number;
18
+ maxErrorsReport?: number;
19
+ maxDepth?: number;
20
+ prefix?: string;
21
+ checkersSeq?: CheckerItem[];
22
+ }
23
+ export declare function expectDeepEqual(actual: any, expected: any, options?: ExpectDeepEqualOptions): void;
24
+ export interface ExpectRunnerState {
25
+ options: Required<ExpectDeepEqualOptions>;
26
+ errors: CheckerError[];
27
+ currentPath: string[];
28
+ }
29
+ //# sourceMappingURL=expect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["expect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAA;AAChF,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC;AACtE,MAAM,MAAM,aAAa,GACvB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,aAAa,KAAK,YAAY,EAAE,GAAG,IAAI,CAAC;AAExH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;CACxB;AAID,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAS1C,CAAC;AAIF,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAGzC,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;CAC7B;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAGlG;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IAC1C,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
package/src/expect.js ADDED
@@ -0,0 +1,182 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ // default checkers sequence, order matters!
3
+ export const defaulCheckersSeq = [
4
+ { name: 'Null', predicate: nullPredicate, checker: nullChecker },
5
+ { name: 'Boolean', predicate: boolPredicate, checker: eqChecker },
6
+ { name: 'String', predicate: stringPredicate, checker: eqChecker },
7
+ { name: 'Integer', predicate: integerPredicate, checker: eqChecker },
8
+ { name: 'Float', predicate: floatPredicate, checker: floatChecker },
9
+ { name: 'Array', predicate: arrayPredicate, checker: arrayChecker },
10
+ { name: 'DataFrame', predicate: dataframePredicate, checker: dataframeChecker },
11
+ { name: 'Object', predicate: objectPredicate, checker: objectChecker },
12
+ ];
13
+ // custom error class, just in case
14
+ export class ExpectError extends Error {
15
+ }
16
+ // public API
17
+ export function expectDeepEqual(actual, expected, options) {
18
+ const runner = new ExpectRunner(options);
19
+ runner.run(actual, expected);
20
+ }
21
+ function nullPredicate(actual, expected) {
22
+ return actual == null && expected == null;
23
+ }
24
+ function nullChecker() {
25
+ return;
26
+ }
27
+ function integerPredicate(actual, expected) {
28
+ return (Number.isInteger(actual) && Number.isInteger(expected));
29
+ }
30
+ function stringPredicate(actual, expected) {
31
+ return (typeof actual === 'string' && typeof expected === 'string');
32
+ }
33
+ function boolPredicate(actual, expected) {
34
+ return (typeof actual === 'boolean' && typeof expected === 'boolean');
35
+ }
36
+ function eqChecker(actual, expected) {
37
+ const areEqual = actual === expected;
38
+ if (!areEqual) {
39
+ const msg = `Expected ${expected}, got ${actual}`;
40
+ return [{ msg }];
41
+ }
42
+ }
43
+ function floatPredicate(actual, expected) {
44
+ return (typeof actual === 'number' && typeof expected === 'number');
45
+ }
46
+ function floatChecker(actual, expected, state) {
47
+ if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||
48
+ (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||
49
+ (isNaN(actual) && isNaN(expected)))
50
+ return;
51
+ const areEqual = Math.abs(actual - expected) < state.options.floatTolerance;
52
+ if (!areEqual) {
53
+ const msg = `Expected ${expected}, got ${actual} (tolerance = ${state.options.floatTolerance})`;
54
+ return [{ msg }];
55
+ }
56
+ }
57
+ function arrayPredicate(actual, expected) {
58
+ return (actual instanceof Array && expected instanceof Array);
59
+ }
60
+ function arrayChecker(actual, expected, _state, checkDeep) {
61
+ const errors = [];
62
+ if (actual.length !== expected.length) {
63
+ const err = { msg: `Arrays are of different length: actual array length is ${actual.length} ` +
64
+ `and expected array length is ${expected.length}` };
65
+ errors.push(err);
66
+ }
67
+ for (let i = 0; i < actual.length; i++)
68
+ checkDeep([String(i)], actual[i], expected[i]);
69
+ return errors;
70
+ }
71
+ function dataframePredicate(actual, expected) {
72
+ return (actual instanceof DG.DataFrame && expected instanceof DG.DataFrame);
73
+ }
74
+ function dataframeChecker(actual, expected, _state, checkDeep) {
75
+ const errors = [];
76
+ if (actual.rowCount !== expected.rowCount) {
77
+ const err = { msg: `Dataframes has different row count: actual row count is ${actual.rowCount} ` +
78
+ `and expected row count is ${expected.rowCount}` };
79
+ errors.push(err);
80
+ }
81
+ for (const column of expected.columns) {
82
+ const actualColumn = actual.columns.byName(column.name);
83
+ if (!actualColumn) {
84
+ const err = { msg: `Column ${column.name} not found` };
85
+ errors.push(err);
86
+ continue;
87
+ }
88
+ if (actualColumn.type !== column.type) {
89
+ const err = { msg: `Column ${column.name} type expected ${column.type} got ${actualColumn.type}` };
90
+ errors.push(err);
91
+ continue;
92
+ }
93
+ for (let i = 0; i < expected.rowCount; i++) {
94
+ const actualValue = actualColumn.get(i);
95
+ const expectedValue = column.get(i);
96
+ checkDeep([column.name], actualValue, expectedValue);
97
+ }
98
+ }
99
+ return errors;
100
+ }
101
+ function objectPredicate(actual, expected) {
102
+ return (typeof actual === 'object' && typeof expected === 'object');
103
+ }
104
+ function objectChecker(actual, expected, _state, checkDeep) {
105
+ const errors = [];
106
+ for (const [expectedKey, expectedValue] of Object.entries(expected)) {
107
+ const actualValue = actual[expectedKey];
108
+ checkDeep([expectedKey], actualValue, expectedValue);
109
+ }
110
+ return errors;
111
+ }
112
+ const defaultOptions = {
113
+ floatTolerance: 0.001,
114
+ maxErrorsReport: 5,
115
+ maxDepth: 128,
116
+ checkersSeq: defaulCheckersSeq,
117
+ prefix: '',
118
+ };
119
+ class ExpectRunner {
120
+ constructor(ops = {}) {
121
+ this.options = Object.assign(Object.assign({}, defaultOptions), ops);
122
+ this.state = {
123
+ errors: [],
124
+ currentPath: [],
125
+ options: this.options,
126
+ };
127
+ }
128
+ run(actual, expected) {
129
+ this.matchChecker(actual, expected);
130
+ this.checkErrorsLimit(0);
131
+ }
132
+ checkDeep(path, actual, expected) {
133
+ const pathLength = path.length;
134
+ this.state.currentPath.push(...path);
135
+ if (this.state.currentPath.length > this.options.maxDepth)
136
+ throw new ExpectError(`Max depth ${this.options.maxDepth} is exceeded, potentially a circular structure`);
137
+ this.matchChecker(actual, expected);
138
+ this.state.currentPath.splice(-pathLength);
139
+ }
140
+ matchChecker(actual, expected) {
141
+ let found = false;
142
+ for (const { predicate, checker } of this.options.checkersSeq) {
143
+ if (predicate(actual, expected)) {
144
+ found = true;
145
+ const errors = checker(actual, expected, this.state, this.checkDeep.bind(this));
146
+ if (errors)
147
+ errors.map((e) => this.addError(e));
148
+ break;
149
+ }
150
+ }
151
+ if (!found) {
152
+ const err = { msg: `Type mismatch or no checker defined: expected ${expected}, got ${actual}` };
153
+ this.addError(err);
154
+ }
155
+ }
156
+ addError(err) {
157
+ var _a, _b;
158
+ const fullPath = [...((_a = this.state.currentPath) !== null && _a !== void 0 ? _a : []), ...((_b = err.path) !== null && _b !== void 0 ? _b : [])];
159
+ const ferr = {
160
+ path: fullPath,
161
+ msg: err.msg,
162
+ };
163
+ this.state.errors.push(ferr);
164
+ this.checkErrorsLimit();
165
+ }
166
+ checkErrorsLimit(limit = this.options.maxErrorsReport) {
167
+ if (this.state.errors.length > limit) {
168
+ const report = this.makeReport();
169
+ throw new ExpectError(report);
170
+ }
171
+ }
172
+ makeReport() {
173
+ const msg = this.state.errors.map((e) => {
174
+ var _a;
175
+ const prefix = ((_a = e.path) !== null && _a !== void 0 ? _a : []).map((a) => `['${String(a)}']`).join('.');
176
+ const msg = prefix ? `${prefix}: ${e.msg}` : e.msg;
177
+ return this.options.prefix ? `${this.options.prefix}: ${msg}` : msg;
178
+ }).slice(0, this.options.maxErrorsReport).join('\n');
179
+ return msg;
180
+ }
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXhwZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFvQnRDLDRDQUE0QztBQUM1QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBa0I7SUFDOUMsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBQztJQUM5RCxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFDO0lBQy9ELEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUM7SUFDaEUsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFDO0lBQ2xFLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUM7SUFDakUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQztJQUNqRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQztJQUM3RSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFDO0NBQ3JFLENBQUM7QUFHRixtQ0FBbUM7QUFDbkMsTUFBTSxPQUFPLFdBQVksU0FBUSxLQUFLO0NBQUc7QUFXekMsYUFBYTtBQUNiLE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBVyxFQUFFLFFBQWEsRUFBRSxPQUFnQztJQUMxRixNQUFNLE1BQU0sR0FBRyxJQUFJ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LENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8vIGN1c3RvbSBjaGVja2VycyBpbnRlcmZhY2VzIEFQSSBmb3IgYWRkaW5nIGN1c3RvbSBjaGVja3NcbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlckVycm9yIHtcbiAgcGF0aD86IHN0cmluZ1tdLFxuICBtc2c6IHN0cmluZyxcbn1cblxuZXhwb3J0IHR5cGUgTmVzdGVkQ2hlY2tlciA9IChwYXRoOiBzdHJpbmdbXSwgYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpID0+IHZvaWRcbmV4cG9ydCB0eXBlIEV4cGVjdFByZWRpY2F0ZSA9IChhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSkgPT4gYm9vbGVhbjtcbmV4cG9ydCB0eXBlIEV4cGVjdENoZWNrZXIgPVxuICAoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnksIHN0YXRlOiBSZWFkb25seTxFeHBlY3RSdW5uZXJTdGF0ZT4sIGNoZWNrTmVzdGVkOiBOZXN0ZWRDaGVja2VyKSA9PiBDaGVja2VyRXJyb3JbXSB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlckl0ZW0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHByZWRpY2F0ZTogRXhwZWN0UHJlZGljYXRlO1xuICBjaGVja2VyOiBFeHBlY3RDaGVja2VyO1xufVxuXG5cbi8vIGRlZmF1bHQgY2hlY2tlcnMgc2VxdWVuY2UsIG9yZGVyIG1hdHRlcnMhXG5leHBvcnQgY29uc3QgZGVmYXVsQ2hlY2tlcnNTZXE6IENoZWNrZXJJdGVtW10gPSBbXG4gIHtuYW1lOiAnTnVsbCcsIHByZWRpY2F0ZTogbnVsbFByZWRpY2F0ZSwgY2hlY2tlcjogbnVsbENoZWNrZXJ9LFxuICB7bmFtZTogJ0Jvb2xlYW4nLCBwcmVkaWNhdGU6IGJvb2xQcmVkaWNhdGUsIGNoZWNrZXI6IGVxQ2hlY2tlcn0sXG4gIHtuYW1lOiAnU3RyaW5nJywgcHJlZGljYXRlOiBzdHJpbmdQcmVkaWNhdGUsIGNoZWNrZXI6IGVxQ2hlY2tlcn0sXG4gIHtuYW1lOiAnSW50ZWdlcicsIHByZWRpY2F0ZTogaW50ZWdlclByZWRpY2F0ZSwgY2hlY2tlcjogZXFDaGVja2VyfSxcbiAge25hbWU6ICdGbG9hdCcsIHByZWRpY2F0ZTogZmxvYXRQcmVkaWNhdGUsIGNoZWNrZXI6IGZsb2F0Q2hlY2tlcn0sXG4gIHtuYW1lOiAnQXJyYXknLCBwcmVkaWNhdGU6IGFycmF5UHJlZGljYXRlLCBjaGVja2VyOiBhcnJheUNoZWNrZXJ9LFxuICB7bmFtZTogJ0RhdGFGcmFtZScsIHByZWRpY2F0ZTogZGF0YWZyYW1lUHJlZGljYXRlLCBjaGVja2VyOiBkYXRhZnJhbWVDaGVja2VyfSxcbiAge25hbWU6ICdPYmplY3QnLCBwcmVkaWNhdGU6IG9iamVjdFByZWRpY2F0ZSwgY2hlY2tlcjogb2JqZWN0Q2hlY2tlcn0sXG5dO1xuXG5cbi8vIGN1c3RvbSBlcnJvciBjbGFzcywganVzdCBpbiBjYXNlXG5leHBvcnQgY2xhc3MgRXhwZWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vLyBleHBlY3REZWVwRXF1YWwgb3B0aW9uc1xuZXhwb3J0IGludGVyZmFjZSBFeHBlY3REZWVwRXF1YWxPcHRpb25zIHtcbiAgZmxvYXRUb2xlcmFuY2U/OiBudW1iZXIsXG4gIG1heEVycm9yc1JlcG9ydD86IG51bWJlcixcbiAgbWF4RGVwdGg/OiBudW1iZXIsXG4gIHByZWZpeD86IHN0cmluZyxcbiAgY2hlY2tlcnNTZXE/OiBDaGVja2VySXRlbVtdLFxufVxuXG4vLyBwdWJsaWMgQVBJXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RGVlcEVxdWFsKGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55LCBvcHRpb25zPzogRXhwZWN0RGVlcEVxdWFsT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBydW5uZXIgPSBuZXcgRXhwZWN0UnVubmVyKG9wdGlvbnMpO1xuICBydW5uZXIucnVuKGFjdHVhbCwgZXhwZWN0ZWQpO1xufVxuXG4vLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdFJ1bm5lclN0YXRlIHtcbiAgb3B0aW9uczogUmVxdWlyZWQ8RXhwZWN0RGVlcEVxdWFsT3B0aW9ucz47XG4gIGVycm9yczogQ2hlY2tlckVycm9yW107XG4gIGN1cnJlbnRQYXRoOiBzdHJpbmdbXTtcbn1cblxuXG5mdW5jdGlvbiBudWxsUHJlZGljYXRlKGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KSB7XG4gIHJldHVybiBhY3R1YWwgPT0gbnVsbCAmJiBleHBlY3RlZCA9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBudWxsQ2hlY2tlcigpIHtcbiAgcmV0dXJuO1xufVxuXG5cbmZ1bmN0aW9uIGludGVnZXJQcmVkaWNhdGUoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpIHtcbiAgcmV0dXJuIChOdW1iZXIuaXNJbnRlZ2VyKGFjdHVhbCkgJiYgTnVtYmVyLmlzSW50ZWdlcihleHBlY3RlZCkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdQcmVkaWNhdGUoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpIHtcbiAgcmV0dXJuICh0eXBlb2YgYWN0dWFsID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gYm9vbFByZWRpY2F0ZShhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSkge1xuICByZXR1cm4gKHR5cGVvZiBhY3R1YWwgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgZXhwZWN0ZWQgPT09ICdib29sZWFuJyk7XG59XG5cbmZ1bmN0aW9uIGVxQ2hlY2tlcihhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSkge1xuICBjb25zdCBhcmVFcXVhbCA9IGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gIGlmICghYXJlRXF1YWwpIHtcbiAgICBjb25zdCBtc2cgPSBgRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH1gO1xuICAgIHJldHVybiBbe21zZ31dO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmxvYXRQcmVkaWNhdGUoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpIHtcbiAgcmV0dXJuICh0eXBlb2YgYWN0dWFsID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgZXhwZWN0ZWQgPT09ICdudW1iZXInKTtcbn1cblxuZnVuY3Rpb24gZmxvYXRDaGVja2VyKGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55LCBzdGF0ZTogUmVhZG9ubHk8RXhwZWN0UnVubmVyU3RhdGU+KTogQ2hlY2tlckVycm9yW10gfCB1bmRlZmluZWQge1xuICBpZiAoKGFjdHVhbCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgKGFjdHVhbCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgKGlzTmFOKGFjdHVhbCkgJiYgaXNOYU4oZXhwZWN0ZWQpKSlcbiAgICByZXR1cm47XG4gIGNvbnN0IGFyZUVxdWFsID0gTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgc3RhdGUub3B0aW9ucy5mbG9hdFRvbGVyYW5jZTtcbiAgaWYgKCFhcmVFcXVhbCkge1xuICAgIGNvbnN0IG1zZyA9IGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHtzdGF0ZS5vcHRpb25zLmZsb2F0VG9sZXJhbmNlfSlgO1xuICAgIHJldHVybiBbe21zZ31dO1xuICB9XG59XG5cblxuZnVuY3Rpb24gYXJyYXlQcmVkaWNhdGUoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpIHtcbiAgcmV0dXJuIChhY3R1YWwgaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZCBpbnN0YW5jZW9mIEFycmF5KTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDaGVja2VyKGFjdHVhbDogYW55W10sIGV4cGVjdGVkOiBhbnlbXSxcbiAgX3N0YXRlOiBSZWFkb25seTxFeHBlY3RSdW5uZXJTdGF0ZT4sIGNoZWNrRGVlcDogTmVzdGVkQ2hlY2tlcik6IENoZWNrZXJFcnJvcltdIHtcbiAgY29uc3QgZXJyb3JzOiBDaGVja2VyRXJyb3JbXSA9IFtdO1xuICBpZiAoYWN0dWFsLmxlbmd0aCAhPT0gZXhwZWN0ZWQubGVuZ3RoKSB7XG4gICAgY29uc3QgZXJyID0ge21zZzogYEFycmF5cyBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aDogYWN0dWFsIGFycmF5IGxlbmd0aCBpcyAke2FjdHVhbC5sZW5ndGh9IGAgK1xuICAgICAgYGFuZCBleHBlY3RlZCBhcnJheSBsZW5ndGggaXMgJHtleHBlY3RlZC5sZW5ndGh9YH07XG4gICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKylcbiAgICBjaGVja0RlZXAoW1N0cmluZyhpKV0sIGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cblxuZnVuY3Rpb24gZGF0YWZyYW1lUHJlZGljYXRlKGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KSB7XG4gIHJldHVybiAoYWN0dWFsIGluc3RhbmNlb2YgREcuRGF0YUZyYW1lICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgREcuRGF0YUZyYW1lKTtcbn1cblxuZnVuY3Rpb24gZGF0YWZyYW1lQ2hlY2tlcihhY3R1YWw6IERHLkRhdGFGcmFtZSwgZXhwZWN0ZWQ6IERHLkRhdGFGcmFtZSxcbiAgX3N0YXRlOiBSZWFkb25seTxFeHBlY3RSdW5uZXJTdGF0ZT4sIGNoZWNrRGVlcDogTmVzdGVkQ2hlY2tlcik6IENoZWNrZXJFcnJvcltdIHtcbiAgY29uc3QgZXJyb3JzOiBDaGVja2VyRXJyb3JbXSA9IFtdO1xuICBpZiAoYWN0dWFsLnJvd0NvdW50ICE9PSBleHBlY3RlZC5yb3dDb3VudCkge1xuICAgIGNvbnN0IGVyciA9IHttc2c6IGBEYXRhZnJhbWVzIGhhcyBkaWZmZXJlbnQgcm93IGNvdW50OiBhY3R1YWwgcm93IGNvdW50IGlzICR7YWN0dWFsLnJvd0NvdW50fSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgcm93IGNvdW50IGlzICR7ZXhwZWN0ZWQucm93Q291bnR9YH07XG4gICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgfVxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBleHBlY3RlZC5jb2x1bW5zKSB7XG4gICAgY29uc3QgYWN0dWFsQ29sdW1uID0gYWN0dWFsLmNvbHVtbnMuYnlOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoIWFjdHVhbENvbHVtbikge1xuICAgICAgY29uc3QgZXJyID0ge21zZzogYENvbHVtbiAke2NvbHVtbi5uYW1lfSBub3QgZm91bmRgfTtcbiAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFjdHVhbENvbHVtbi50eXBlICE9PSBjb2x1bW4udHlwZSkge1xuICAgICAgY29uc3QgZXJyID0ge21zZzogYENvbHVtbiAke2NvbHVtbi5uYW1lfSB0eXBlIGV4cGVjdGVkICR7Y29sdW1uLnR5cGV9IGdvdCAke2FjdHVhbENvbHVtbi50eXBlfWB9O1xuICAgICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLnJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsQ29sdW1uLmdldChpKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBjb2x1bW4uZ2V0KGkpO1xuICAgICAgY2hlY2tEZWVwKFtjb2x1bW4ubmFtZV0sIGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuXG5mdW5jdGlvbiBvYmplY3RQcmVkaWNhdGUoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpIHtcbiAgcmV0dXJuICh0eXBlb2YgYWN0dWFsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgZXhwZWN0ZWQgPT09ICdvYmplY3QnKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0Q2hlY2tlcihhY3R1YWw6IFJlY29yZDxhbnksIGFueT4sIGV4cGVjdGVkOiBSZWNvcmQ8YW55LCBhbnk+LFxuICBfc3RhdGU6IFJlYWRvbmx5PEV4cGVjdFJ1bm5lclN0YXRlPiwgY2hlY2tEZWVwOiBOZXN0ZWRDaGVja2VyKTogQ2hlY2tlckVycm9yW10ge1xuICBjb25zdCBlcnJvcnM6IENoZWNrZXJFcnJvcltdID0gW107XG4gIGZvciAoY29uc3QgW2V4cGVjdGVkS2V5LCBleHBlY3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgY2hlY2tEZWVwKFtleHBlY3RlZEtleV0sIGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogUmVxdWlyZWQ8RXhwZWN0RGVlcEVxdWFsT3B0aW9ucz4gPSB7XG4gIGZsb2F0VG9sZXJhbmNlOiAwLjAwMSxcbiAgbWF4RXJyb3JzUmVwb3J0OiA1LFxuICBtYXhEZXB0aDogMTI4LFxuICBjaGVja2Vyc1NlcTogZGVmYXVsQ2hlY2tlcnNTZXEsXG4gIHByZWZpeDogJycsXG59O1xuXG5cbmNsYXNzIEV4cGVjdFJ1bm5lciB7XG4gIHByaXZhdGUgb3B0aW9uczogUmVxdWlyZWQ8RXhwZWN0RGVlcEVxdWFsT3B0aW9ucz47XG4gIHByaXZhdGUgc3RhdGU6IEV4cGVjdFJ1bm5lclN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKG9wczogRXhwZWN0RGVlcEVxdWFsT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gey4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHN9O1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvcnM6IFtdLFxuICAgICAgY3VycmVudFBhdGg6IFtdLFxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcnVuKGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tYXRjaENoZWNrZXIoYWN0dWFsLCBleHBlY3RlZCk7XG4gICAgdGhpcy5jaGVja0Vycm9yc0xpbWl0KDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0RlZXAocGF0aDogc3RyaW5nW10sIGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KSB7XG4gICAgY29uc3QgcGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIHRoaXMuc3RhdGUuY3VycmVudFBhdGgucHVzaCguLi5wYXRoKTtcbiAgICBpZiAodGhpcy5zdGF0ZS5jdXJyZW50UGF0aC5sZW5ndGggPiB0aGlzLm9wdGlvbnMubWF4RGVwdGgpXG4gICAgICB0aHJvdyBuZXcgRXhwZWN0RXJyb3IoYE1heCBkZXB0aCAke3RoaXMub3B0aW9ucy5tYXhEZXB0aH0gaXMgZXhjZWVkZWQsIHBvdGVudGlhbGx5IGEgY2lyY3VsYXIgc3RydWN0dXJlYCk7XG5cbiAgICB0aGlzLm1hdGNoQ2hlY2tlcihhY3R1YWwsIGV4cGVjdGVkKTtcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRQYXRoLnNwbGljZSgtcGF0aExlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoQ2hlY2tlcihhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSkge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qge3ByZWRpY2F0ZSwgY2hlY2tlcn0gb2YgdGhpcy5vcHRpb25zLmNoZWNrZXJzU2VxKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gY2hlY2tlcihhY3R1YWwsIGV4cGVjdGVkLCB0aGlzLnN0YXRlLCB0aGlzLmNoZWNrRGVlcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgaWYgKGVycm9ycylcbiAgICAgICAgICBlcnJvcnMubWFwKChlKSA9PiB0aGlzLmFkZEVycm9yKGUpKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgY29uc3QgZXJyID0ge21zZzogYFR5cGUgbWlzbWF0Y2ggb3Igbm8gY2hlY2tlciBkZWZpbmVkOiBleHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfWB9O1xuICAgICAgdGhpcy5hZGRFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRXJyb3IoZXJyOiBDaGVja2VyRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IFsuLi4odGhpcy5zdGF0ZS5jdXJyZW50UGF0aCA/PyBbXSksIC4uLihlcnIucGF0aCA/PyBbXSldO1xuICAgIGNvbnN0IGZlcnI6IENoZWNrZXJFcnJvciA9IHtcbiAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgICAgbXNnOiBlcnIubXNnLFxuICAgIH07XG4gICAgdGhpcy5zdGF0ZS5lcnJvcnMucHVzaChmZXJyKTtcbiAgICB0aGlzLmNoZWNrRXJyb3JzTGltaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFcnJvcnNMaW1pdChsaW1pdCA9IHRoaXMub3B0aW9ucy5tYXhFcnJvcnNSZXBvcnQpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcnMubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMubWFrZVJlcG9ydCgpO1xuICAgICAgdGhyb3cgbmV3IEV4cGVjdEVycm9yKHJlcG9ydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUmVwb3J0KCkge1xuICAgIGNvbnN0IG1zZyA9IHRoaXMuc3RhdGUuZXJyb3JzLm1hcCgoZSkgPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gKGUucGF0aCA/PyBbXSkubWFwKChhKSA9PiBgWycke1N0cmluZyhhKX0nXWApLmpvaW4oJy4nKTtcbiAgICAgIGNvbnN0IG1zZyA9IHByZWZpeCA/IGAke3ByZWZpeH06ICR7ZS5tc2d9YCA6IGUubXNnO1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmaXggPyBgJHt0aGlzLm9wdGlvbnMucHJlZml4fTogJHttc2d9YCA6IG1zZztcbiAgICB9KS5zbGljZSgwLCB0aGlzLm9wdGlvbnMubWF4RXJyb3JzUmVwb3J0KS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gbXNnO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export declare function serialize(obj: any, space?: number): string;
2
+ export declare function deserialize(obj: string): any;
3
+ export declare function applyTransformations(obj: any): any;
4
+ export declare function transform(_key: string, value: any): any;
5
+ //# sourceMappingURL=json-serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-serialization.d.ts","sourceRoot":"","sources":["json-serialization.ts"],"names":[],"mappings":"AAOA,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,SAAI,UAc5C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,OAKtC;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,OAE5C;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAQjD"}
@@ -0,0 +1,32 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ // Support for json serialization/deserialization of objects that
3
+ // include DataFrames. Not efficient, intended for writing tests.
4
+ const customTypeKey = '_DG_CUSTOM_SERIALIZED_TOKEN_';
5
+ export function serialize(obj, space = 2) {
6
+ return JSON.stringify(obj, (_key, value) => {
7
+ if (value instanceof DG.DataFrame) {
8
+ return {
9
+ [customTypeKey]: 'DataFrame',
10
+ value: Array.from(value.toByteArray())
11
+ };
12
+ }
13
+ return value;
14
+ }, space);
15
+ }
16
+ export function deserialize(obj) {
17
+ return JSON.parse(obj, transform);
18
+ }
19
+ export function applyTransformations(obj) {
20
+ return deserialize(JSON.stringify(obj));
21
+ }
22
+ // just apply df transform if the data
23
+ export function transform(_key, value) {
24
+ if (value && value[customTypeKey] && value.value) {
25
+ switch (value[customTypeKey]) {
26
+ case 'DataFrame':
27
+ return DG.DataFrame.fromByteArray(new Uint8Array(value.value));
28
+ }
29
+ }
30
+ return value;
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zZXJpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsianNvbi1zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsaUVBQWlFO0FBQ2pFLGlFQUFpRTtBQUVqRSxNQUFNLGFBQWEsR0FBRyw4QkFBOEIsQ0FBQztBQUVyRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFDSCxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNkLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQyxTQUFTLEVBQUU7WUFDakMsT0FBTztnQkFDTCxDQUFDLGFBQWEsQ0FBQyxFQUFFLFdBQVc7Z0JBQzVCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN2QyxDQUFDO1NBQ0g7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsRUFDRCxLQUFLLENBQ04sQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQVc7SUFDckMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLEdBQUcsRUFDSCxTQUFTLENBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBUTtJQUMzQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELHNDQUFzQztBQUN0QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVksRUFBRSxLQUFVO0lBQ2hELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQ2hELFFBQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQzlCLEtBQUssV0FBVztnQkFDZCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG4vLyBTdXBwb3J0IGZvciBqc29uIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIG9mIG9iamVjdHMgdGhhdFxuLy8gaW5jbHVkZSBEYXRhRnJhbWVzLiBOb3QgZWZmaWNpZW50LCBpbnRlbmRlZCBmb3Igd3JpdGluZyB0ZXN0cy5cblxuY29uc3QgY3VzdG9tVHlwZUtleSA9ICdfREdfQ1VTVE9NX1NFUklBTElaRURfVE9LRU5fJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShvYmo6IGFueSwgc3BhY2UgPSAyKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICBvYmosXG4gICAgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBERy5EYXRhRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbY3VzdG9tVHlwZUtleV06ICdEYXRhRnJhbWUnLFxuICAgICAgICAgIHZhbHVlOiBBcnJheS5mcm9tKHZhbHVlLnRvQnl0ZUFycmF5KCkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBzcGFjZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUob2JqOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgb2JqLFxuICAgIHRyYW5zZm9ybVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm1hdGlvbnMob2JqOiBhbnkpIHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KG9iaikpO1xufVxuXG4vLyBqdXN0IGFwcGx5IGRmIHRyYW5zZm9ybSBpZiB0aGUgZGF0YVxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShfa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgaWYgKHZhbHVlICYmIHZhbHVlW2N1c3RvbVR5cGVLZXldICYmIHZhbHVlLnZhbHVlKSB7XG4gICAgc3dpdGNoICh2YWx1ZVtjdXN0b21UeXBlS2V5XSkge1xuICAgIGNhc2UgJ0RhdGFGcmFtZSc6XG4gICAgICByZXR1cm4gREcuRGF0YUZyYW1lLmZyb21CeXRlQXJyYXkobmV3IFVpbnQ4QXJyYXkodmFsdWUudmFsdWUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuIl19
package/src/test.d.ts CHANGED
@@ -61,5 +61,17 @@ export declare function runTests(options?: {
61
61
  export declare function delay(ms: number): Promise<void>;
62
62
  export declare function awaitCheck(checkHandler: () => boolean, error?: string, wait?: number, interval?: number): Promise<void>;
63
63
  export declare function isDialogPresent(dialogTitle: string): boolean;
64
- export declare function testViewer(v: string, df: DG.DataFrame, detectSemanticTypes?: boolean): Promise<void>;
64
+ /**
65
+ * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a
66
+ * @param {string} v Viewer name
67
+ * @param {DG.DataFrame} df Dataframe to use. Should have at least 3 rows
68
+ * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not
69
+ * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test
70
+ * @param {object} options List of options (optional)
71
+ * @return {Promise<void>} The test is considered successful if it completes without errors
72
+ */
73
+ export declare function testViewer(v: string, df: DG.DataFrame, options?: {
74
+ detectSemanticTypes?: boolean;
75
+ readOnly?: boolean;
76
+ }): Promise<void>;
65
77
  //# sourceMappingURL=test.d.ts.map
package/src/test.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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"}
package/src/test.js CHANGED
@@ -358,36 +358,56 @@ export function isDialogPresent(dialogTitle) {
358
358
  }
359
359
  return false;
360
360
  }
361
- export function testViewer(v, df, detectSemanticTypes = false) {
361
+ /**
362
+ * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a
363
+ * @param {string} v Viewer name
364
+ * @param {DG.DataFrame} df Dataframe to use. Should have at least 3 rows
365
+ * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not
366
+ * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test
367
+ * @param {object} options List of options (optional)
368
+ * @return {Promise<void>} The test is considered successful if it completes without errors
369
+ */
370
+ export function testViewer(v, df, options) {
371
+ var _a;
362
372
  return __awaiter(this, void 0, void 0, function* () {
363
- if (detectSemanticTypes)
373
+ if (options === null || options === void 0 ? void 0 : options.detectSemanticTypes)
364
374
  yield grok.data.detectSemanticTypes(df);
365
375
  const tv = grok.shell.addTableView(df);
366
376
  const viewerName = `[name=viewer-${v.replace(/\s+/g, '-')} i]`;
367
- const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,
377
+ let selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,
368
378
  ${viewerName} input,${viewerName} h1,${viewerName} a`;
369
379
  const res = [];
370
380
  try {
371
381
  let viewer = tv.addViewer(v);
372
382
  yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);
383
+ const tag = (_a = document.querySelector(selector)) === null || _a === void 0 ? void 0 : _a.tagName;
373
384
  res.push(Array.from(tv.viewers).length);
374
- Array.from(df.row(0).cells).forEach((c) => c.value = null);
375
- df.rows.select((row) => row.idx > 1 && row.idx < 7);
376
- for (let i = 7; i < 12; i++)
377
- df.filter.set(i, false);
378
- df.currentRowIdx = 1;
379
- const props = viewer.getOptions(true).look;
385
+ if (!(options === null || options === void 0 ? void 0 : options.readOnly)) {
386
+ Array.from(df.row(0).cells).forEach((c) => c.value = null);
387
+ const num = df.rowCount < 20 ? Math.floor(df.rowCount / 2) : 10;
388
+ df.rows.select((row) => row.idx >= 0 && row.idx < num);
389
+ yield delay(50);
390
+ for (let i = num; i < num * 2; i++)
391
+ df.filter.set(i, false);
392
+ yield delay(50);
393
+ df.currentRowIdx = 1;
394
+ // df.columns.names().forEach((c) => df.columns.remove(c));
395
+ }
396
+ const optns = viewer.getOptions(true).look;
397
+ const props = viewer.getProperties();
380
398
  const newProps = {};
381
- Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);
399
+ Object.keys(optns).filter((k) => typeof optns[k] === 'boolean').forEach((k) => newProps[k] = !optns[k]);
400
+ props.filter((p) => p.choices !== null)
401
+ .forEach((p) => newProps[p.name] = p.choices.find((c) => c !== optns[p.name]));
382
402
  viewer.setOptions(newProps);
383
- yield delay(250);
403
+ yield delay(300);
384
404
  const layout = tv.saveLayout();
385
405
  const oldProps = viewer.getOptions().look;
386
406
  tv.resetLayout();
387
407
  res.push(Array.from(tv.viewers).length);
388
408
  tv.loadLayout(layout);
409
+ selector = `${viewerName} ${tag}`;
389
410
  yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);
390
- yield delay(250);
391
411
  res.push(Array.from(tv.viewers).length);
392
412
  viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');
393
413
  expectArray(res, [2, 1, 2]);
@@ -396,7 +416,8 @@ export function testViewer(v, df, detectSemanticTypes = false) {
396
416
  finally {
397
417
  tv.close();
398
418
  grok.shell.closeTable(df);
419
+ DG.Balloon.closeAll();
399
420
  }
400
421
  });
401
422
  }
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3RDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSGUsY0FBTyxVQUd0QixDQUFBO0FBQ0gsQ0FBQyxFQUxnQixNQUFNLEtBQU4sTUFBTSxRQUt0QjtBQVFELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksY0FBd0IsRUFBRSxNQUFnQjtRQUh0RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2IsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FB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ImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5pbXBvcnQge0RhdGFGcmFtZX0gZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuZXhwb3J0IGNvbnN0IHRlc3RzOiB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICB0ZXN0cz86IFRlc3RbXSwgYmVmb3JlPzogKCkgPT4gUHJvbWlzZTx2b2lkPiwgYWZ0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGJlZm9yZVN0YXR1cz86IHN0cmluZywgYWZ0ZXJTdGF0dXM/OiBzdHJpbmdcbiAgfVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3Qgd2FzUmVnaXN0ZXJlZDoge1trZXk6IHN0cmluZ106IGJvb2xlYW59ID0ge307XG5leHBvcnQgbGV0IGN1cnJlbnRDYXRlZ29yeTogc3RyaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIGFzc3VyZSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkgPSB0cnVlLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXJyb3IpXG4gICAgZXJyb3IgPSBgJHtlcnJvcn0sIGA7XG4gIGVsc2UgZXJyb3IgPSAnJztcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfUV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKChhY3R1YWwgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB8fFxuICAgICAgKGFjdHVhbCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTmFOICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTmFOKSB8fCAoaXNOYU4oYWN0dWFsKSAmJiBpc05hTihleHBlY3RlZCkpKVxuICAgIHJldHVybjtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGV4cGVjdChhcmVFcXVhbCwgdHJ1ZSwgYCR7ZXJyb3IgPz8gJyd9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0VGFibGUoYWN0dWFsOiBEYXRhRnJhbWUsIGV4cGVjdGVkOiBEYXRhRnJhbWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGV4cGVjdGVkUm93Q291bnQgPSBleHBlY3RlZC5yb3dDb3VudDtcbiAgY29uc3QgYWN0dWFsUm93Q291bnQgPSBhY3R1YWwucm93Q291bnQ7XG4gIGV4cGVjdChhY3R1YWxSb3dDb3VudCwgZXhwZWN0ZWRSb3dDb3VudCwgYCR7ZXJyb3IgPz8gJyd9LCByb3cgY291bnRgKTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBleHBlY3RlZC5jb2x1bW5zKSB7XG4gICAgY29uc3QgYWN0dWFsQ29sdW1uID0gYWN0dWFsLmNvbHVtbnMuYnlOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uLnR5cGUgIT0gY29sdW1uLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSB0eXBlIGV4cGVjdGVkICR7Y29sdW1uLnR5cGV9IGdvdCAke2FjdHVhbENvbHVtbi50eXBlfWApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWRSb3dDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbi5nZXQoaSk7XG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbENvbHVtbi5nZXQoaSk7XG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5GTE9BVClcbiAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIHZhbHVlLCAwLjAwMDEsIGVycm9yKTtcbiAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09IERHLlRZUEUuREFURV9USU1FKVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUuaXNTYW1lKHZhbHVlKSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgZWxzZVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUsIHZhbHVlLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RPYmplY3QoYWN0dWFsOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBleHBlY3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFhY3R1YWwuaGFzT3duUHJvcGVydHkoZXhwZWN0ZWRLZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwcm9wZXJ0eSBcIiR7ZXhwZWN0ZWRLZXl9XCIgbm90IGZvdW5kYCk7XG5cbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlICE9IGV4cGVjdGVkVmFsdWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICgke2V4cGVjdGVkVmFsdWV9KSBmb3Iga2V5ICcke2V4cGVjdGVkS2V5fScsIGdvdCAoJHthY3R1YWxWYWx1ZX0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5KGFjdHVhbDogQXJyYXlMaWtlPGFueT4sIGV4cGVjdGVkOiBBcnJheUxpa2U8YW55Pikge1xuICBjb25zdCBhY3R1YWxMZW5ndGggPSBhY3R1YWwubGVuZ3RoO1xuICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcblxuICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCBsZW5ndGg6IGFjdHVhbCBhcnJheSBsZW5ndGggaXMgJHthY3R1YWxMZW5ndGh9IGAgK1xuICAgICAgYGFuZCBleHBlY3RlZCBhcnJheSBsZW5ndGggaXMgJHtleHBlY3RlZExlbmd0aH1gKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0czogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHMoKTtcbn1cblxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlKGJlZm9yZTogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmJlZm9yZSA9IGJlZm9yZTtcbn1cblxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcihhZnRlcjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmFmdGVyID0gYWZ0ZXI7XG59XG5cbmZ1bmN0aW9uIGFkZE5hbWVzcGFjZShzOiBzdHJpbmcsIGY6IERHLkZ1bmMpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKG5ldyBSZWdFeHAoZi5uYW1lLCAnZ2knKSwgZi5ucU5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdEF1dG9UZXN0cyhwYWNrYWdlSWQ6IHN0cmluZywgbW9kdWxlPzogYW55KSB7XG4gIGlmICh3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0pIHJldHVybjtcbiAgY29uc3QgbW9kdWxlVGVzdHMgPSBtb2R1bGUgPyBtb2R1bGUudGVzdHMgOiB0ZXN0cztcbiAgaWYgKG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBtb2R1bGVBdXRvVGVzdHMgPSBbXTtcbiAgY29uc3QgcGFja0Z1bmN0aW9ucyA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuZmlsdGVyKGBwYWNrYWdlLmlkID0gXCIke3BhY2thZ2VJZH1cImApLmxpc3QoKTtcbiAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cCgvc2tpcDpcXHMqKFteLFxcc10rKXx3YWl0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBpZiAoISh0ZXN0cyAmJiBBcnJheS5pc0FycmF5KHRlc3RzKSAmJiB0ZXN0cy5sZW5ndGgpKSBjb250aW51ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgY29uc3QgbWFwOiB7c2tpcD86IHN0cmluZywgd2FpdD86IG51bWJlcn0gPSB7fTtcbiAgICAgIEFycmF5LmZyb20ocmVzKS5mb3JFYWNoKChhcnIpID0+IHtcbiAgICAgICAgaWYgKGFyclswXS5zdGFydHNXaXRoKCdza2lwJykpIG1hcFsnc2tpcCddID0gYXJyWzFdO1xuICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnd2FpdCcpKSBtYXBbJ3dhaXQnXSA9IHBhcnNlSW50KGFyclsyXSk7XG4gICAgICB9KTtcbiAgICAgIG1vZHVsZUF1dG9UZXN0cy5wdXNoKG5ldyBUZXN0KGF1dG9UZXN0c0NhdE5hbWUsIHRlc3RzLmxlbmd0aCA9PT0gMSA/IGYubmFtZSA6IGAke2YubmFtZX0gJHtpICsgMX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuZXZhbChhZGROYW1lc3BhY2UodGVzdHNbaV0sIGYpKTtcbiAgICAgICAgICBpZiAobWFwLndhaXQpIGF3YWl0IGRlbGF5KG1hcC53YWl0KTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnYm9vbGVhbicgJiYgIXJlcykgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX0sIGV4cGVjdGVkIHRydWUsIGdvdCAke3Jlc31gO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtza2lwUmVhc29uOiBtYXAuc2tpcH0pKTtcbiAgICB9XG4gIH1cbiAgd2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdID0gdHJ1ZTtcbiAgaWYgKCFtb2R1bGVBdXRvVGVzdHMubGVuZ3RoKSByZXR1cm47XG4gIG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdID0ge3Rlc3RzOiBtb2R1bGVBdXRvVGVzdHN9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucz86IHtjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dH0pIHtcbiAgY29uc3QgcGFja2FnZV8gPSBncm9rLmZ1bmN0aW9ucy5nZXRDdXJyZW50Q2FsbCgpPy5mdW5jPy5wYWNrYWdlO1xuICBhd2FpdCBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfLmlkKTtcbiAgY29uc3QgcmVzdWx0czogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHN0cmluZywgbXM6IG51bWJlciwgc2tpcHBlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgUHJvbWlzZS5hbGwocmVzKSkuZmlsdGVyKChkKSA9PiBkLnJlc3VsdCAhPSAnc2tpcHBlZCcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAodmFsdWUuYWZ0ZXIpXG4gICAgICAgIGF3YWl0IHZhbHVlLmFmdGVyKCk7XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICB2YWx1ZS5hZnRlclN0YXR1cyA9IHgudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmFmdGVyU3RhdHVzKVxuICAgICAgZGF0YS5wdXNoKHtjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYWZ0ZXJTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICBpZiAodmFsdWUuYmVmb3JlU3RhdHVzKVxuICAgICAgZGF0YS5wdXNoKHtjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYmVmb3JlU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfSk7XG4gICAgcmVzdWx0cy5wdXNoKC4uLmRhdGEpO1xuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LmNhdGNoVW5oYW5kbGVkKSB7XG4gICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgaWYgKGdyb2suc2hlbGwubGFzdEVycm9yLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGNhdGVnb3J5OiAnVW5oYW5kbGVkIGV4Y2VwdGlvbnMnLFxuICAgICAgICBuYW1lOiAnZXhjZXB0aW9ucycsXG4gICAgICAgIHJlc3VsdDogZ3Jvay5zaGVsbC5sYXN0RXJyb3IsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAob3B0aW9ucy50ZXN0Q29udGV4dC5yZXBvcnQpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBuZXcgREcuTG9nZ2VyKCk7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN1Y2Nlc3MpLmxlbmd0aDtcbiAgICBjb25zdCBza2lwcGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc2tpcHBlZCkubGVuZ3RoO1xuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiAhci5zdWNjZXNzKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICdQYWNrYWdlIEBwYWNrYWdlIHRlc3RlZDogQHN1Y2Nlc3NmdWwgc3VjY2Vzc2Z1bCwgQHNraXBwZWQgc2tpcHBlZCwgQGZhaWxlZCBmYWlsZWQgdGVzdHMnO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHN1Y2Nlc3NmdWw6IHN1Y2Nlc3NmdWwsXG4gICAgICBza2lwcGVkOiBza2lwcGVkLFxuICAgICAgZmFpbGVkOiBmYWlsZWQubGVuZ3RoLFxuICAgICAgcGFja2FnZTogcGFja2FnZV9cbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiBmYWlsZWQpIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7W2Ake3IuY2F0ZWdvcnl9IHwgJHtyLm5hbWV9YF06IHIucmVzdWx0fSk7XG4gICAgbG9nZ2VyLmxvZyhkZXNjcmlwdGlvbiwgcGFyYW1zLCAncGFja2FnZS10ZXN0ZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY1Rlc3QodDogVGVzdCwgcHJlZGljYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgbGV0IHI6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuIH07XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKCF0Lm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWRpY2F0ZS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNraXAgPSB0Lm9wdGlvbnM/LnNraXBSZWFzb24gfHwgZmlsdGVyO1xuICBjb25zdCBza2lwUmVhc29uID0gZmlsdGVyID8gJ3NraXBwZWQnIDogdC5vcHRpb25zPy5za2lwUmVhc29uO1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHt0LmNhdGVnb3J5fSAke3QubmFtZX1gKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICB0cnkge1xuICAgIGlmIChza2lwKVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHNraXBSZWFzb24hLCBtczogMCwgc2tpcHBlZDogdHJ1ZX07XG4gICAgZWxzZVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IGF3YWl0IHQudGVzdCgpID8/ICdPSycsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgIHIgPSB7c3VjY2VzczogZmFsc2UsIHJlc3VsdDogeC50b1N0cmluZygpLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9XG4gIGNvbnN0IHN0b3AgPSBuZXcgRGF0ZSgpO1xuICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gIC8vIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG4gIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICByLm5hbWUgPSB0Lm5hbWU7XG4gIHJldHVybiByO1xufVxuXG4vKiBXYWl0cyBbbXNdIG1pbGxpc2Vjb25kcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpIHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF3YWl0Q2hlY2soY2hlY2tIYW5kbGVyOiAoKSA9PiBib29sZWFuLFxuICBlcnJvcjogc3RyaW5nID0gJ1RpbWVvdXQgZXhjZWVkZWQnLCB3YWl0OiBudW1iZXIgPSA1MDAsIGludGVydmFsOiBudW1iZXIgPSA1MCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICB9LCB3YWl0KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWxJZDogVGltZW91dCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmIChjaGVja0hhbmRsZXIoKSkge1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgaW50ZXJ2YWwpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpYWxvZ3MgPSBERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGRpYWxvZ3NbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3RDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSGUsY0FBTyxVQUd0QixDQUFBO0FBQ0gsQ0FBQyxFQUxnQixNQUFNLEtBQU4sTUFBTSxRQUt0QjtBQVFELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksY0FBd0IsRUFBRSxNQUFnQjtRQUh0RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2IsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FB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QUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEIsUUFBUSxHQUFHLEdBQUcsVUFBVSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUM5RCxnQ0FBZ0MsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFFLENBQUM7WUFDaEUsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzVFO2dCQUFTO1lBQ1IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2Qjs7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5pbXBvcnQge0RhdGFGcmFtZX0gZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuZXhwb3J0IGNvbnN0IHRlc3RzOiB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICB0ZXN0cz86IFRlc3RbXSwgYmVmb3JlPzogKCkgPT4gUHJvbWlzZTx2b2lkPiwgYWZ0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGJlZm9yZVN0YXR1cz86IHN0cmluZywgYWZ0ZXJTdGF0dXM/OiBzdHJpbmdcbiAgfVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3Qgd2FzUmVnaXN0ZXJlZDoge1trZXk6IHN0cmluZ106IGJvb2xlYW59ID0ge307XG5leHBvcnQgbGV0IGN1cnJlbnRDYXRlZ29yeTogc3RyaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIGFzc3VyZSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkgPSB0cnVlLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXJyb3IpXG4gICAgZXJyb3IgPSBgJHtlcnJvcn0sIGA7XG4gIGVsc2UgZXJyb3IgPSAnJztcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfUV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKChhY3R1YWwgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB8fFxuICAgICAgKGFjdHVhbCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTmFOICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTmFOKSB8fCAoaXNOYU4oYWN0dWFsKSAmJiBpc05hTihleHBlY3RlZCkpKVxuICAgIHJldHVybjtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGV4cGVjdChhcmVFcXVhbCwgdHJ1ZSwgYCR7ZXJyb3IgPz8gJyd9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0VGFibGUoYWN0dWFsOiBEYXRhRnJhbWUsIGV4cGVjdGVkOiBEYXRhRnJhbWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGV4cGVjdGVkUm93Q291bnQgPSBleHBlY3RlZC5yb3dDb3VudDtcbiAgY29uc3QgYWN0dWFsUm93Q291bnQgPSBhY3R1YWwucm93Q291bnQ7XG4gIGV4cGVjdChhY3R1YWxSb3dDb3VudCwgZXhwZWN0ZWRSb3dDb3VudCwgYCR7ZXJyb3IgPz8gJyd9LCByb3cgY291bnRgKTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBleHBlY3RlZC5jb2x1bW5zKSB7XG4gICAgY29uc3QgYWN0dWFsQ29sdW1uID0gYWN0dWFsLmNvbHVtbnMuYnlOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uLnR5cGUgIT0gY29sdW1uLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSB0eXBlIGV4cGVjdGVkICR7Y29sdW1uLnR5cGV9IGdvdCAke2FjdHVhbENvbHVtbi50eXBlfWApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWRSb3dDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbi5nZXQoaSk7XG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbENvbHVtbi5nZXQoaSk7XG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5GTE9BVClcbiAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIHZhbHVlLCAwLjAwMDEsIGVycm9yKTtcbiAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09IERHLlRZUEUuREFURV9USU1FKVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUuaXNTYW1lKHZhbHVlKSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgZWxzZVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUsIHZhbHVlLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RPYmplY3QoYWN0dWFsOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBleHBlY3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFhY3R1YWwuaGFzT3duUHJvcGVydHkoZXhwZWN0ZWRLZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwcm9wZXJ0eSBcIiR7ZXhwZWN0ZWRLZXl9XCIgbm90IGZvdW5kYCk7XG5cbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlICE9IGV4cGVjdGVkVmFsdWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICgke2V4cGVjdGVkVmFsdWV9KSBmb3Iga2V5ICcke2V4cGVjdGVkS2V5fScsIGdvdCAoJHthY3R1YWxWYWx1ZX0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5KGFjdHVhbDogQXJyYXlMaWtlPGFueT4sIGV4cGVjdGVkOiBBcnJheUxpa2U8YW55Pikge1xuICBjb25zdCBhY3R1YWxMZW5ndGggPSBhY3R1YWwubGVuZ3RoO1xuICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcblxuICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCBsZW5ndGg6IGFjdHVhbCBhcnJheSBsZW5ndGggaXMgJHthY3R1YWxMZW5ndGh9IGAgK1xuICAgICAgYGFuZCBleHBlY3RlZCBhcnJheSBsZW5ndGggaXMgJHtleHBlY3RlZExlbmd0aH1gKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0czogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHMoKTtcbn1cblxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlKGJlZm9yZTogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmJlZm9yZSA9IGJlZm9yZTtcbn1cblxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcihhZnRlcjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmFmdGVyID0gYWZ0ZXI7XG59XG5cbmZ1bmN0aW9uIGFkZE5hbWVzcGFjZShzOiBzdHJpbmcsIGY6IERHLkZ1bmMpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKG5ldyBSZWdFeHAoZi5uYW1lLCAnZ2knKSwgZi5ucU5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdEF1dG9UZXN0cyhwYWNrYWdlSWQ6IHN0cmluZywgbW9kdWxlPzogYW55KSB7XG4gIGlmICh3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0pIHJldHVybjtcbiAgY29uc3QgbW9kdWxlVGVzdHMgPSBtb2R1bGUgPyBtb2R1bGUudGVzdHMgOiB0ZXN0cztcbiAgaWYgKG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBtb2R1bGVBdXRvVGVzdHMgPSBbXTtcbiAgY29uc3QgcGFja0Z1bmN0aW9ucyA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuZmlsdGVyKGBwYWNrYWdlLmlkID0gXCIke3BhY2thZ2VJZH1cImApLmxpc3QoKTtcbiAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cCgvc2tpcDpcXHMqKFteLFxcc10rKXx3YWl0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBpZiAoISh0ZXN0cyAmJiBBcnJheS5pc0FycmF5KHRlc3RzKSAmJiB0ZXN0cy5sZW5ndGgpKSBjb250aW51ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgY29uc3QgbWFwOiB7c2tpcD86IHN0cmluZywgd2FpdD86IG51bWJlcn0gPSB7fTtcbiAgICAgIEFycmF5LmZyb20ocmVzKS5mb3JFYWNoKChhcnIpID0+IHtcbiAgICAgICAgaWYgKGFyclswXS5zdGFydHNXaXRoKCdza2lwJykpIG1hcFsnc2tpcCddID0gYXJyWzFdO1xuICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnd2FpdCcpKSBtYXBbJ3dhaXQnXSA9IHBhcnNlSW50KGFyclsyXSk7XG4gICAgICB9KTtcbiAgICAgIG1vZHVsZUF1dG9UZXN0cy5wdXNoKG5ldyBUZXN0KGF1dG9UZXN0c0NhdE5hbWUsIHRlc3RzLmxlbmd0aCA9PT0gMSA/IGYubmFtZSA6IGAke2YubmFtZX0gJHtpICsgMX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuZXZhbChhZGROYW1lc3BhY2UodGVzdHNbaV0sIGYpKTtcbiAgICAgICAgICBpZiAobWFwLndhaXQpIGF3YWl0IGRlbGF5KG1hcC53YWl0KTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnYm9vbGVhbicgJiYgIXJlcykgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX0sIGV4cGVjdGVkIHRydWUsIGdvdCAke3Jlc31gO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtza2lwUmVhc29uOiBtYXAuc2tpcH0pKTtcbiAgICB9XG4gIH1cbiAgd2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdID0gdHJ1ZTtcbiAgaWYgKCFtb2R1bGVBdXRvVGVzdHMubGVuZ3RoKSByZXR1cm47XG4gIG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdID0ge3Rlc3RzOiBtb2R1bGVBdXRvVGVzdHN9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucz86IHtjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dH0pIHtcbiAgY29uc3QgcGFja2FnZV8gPSBncm9rLmZ1bmN0aW9ucy5nZXRDdXJyZW50Q2FsbCgpPy5mdW5jPy5wYWNrYWdlO1xuICBhd2FpdCBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfLmlkKTtcbiAgY29uc3QgcmVzdWx0czogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHN0cmluZywgbXM6IG51bWJlciwgc2tpcHBlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgUHJvbWlzZS5hbGwocmVzKSkuZmlsdGVyKChkKSA9PiBkLnJlc3VsdCAhPSAnc2tpcHBlZCcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAodmFsdWUuYWZ0ZXIpXG4gICAgICAgIGF3YWl0IHZhbHVlLmFmdGVyKCk7XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICB2YWx1ZS5hZnRlclN0YXR1cyA9IHgudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmFmdGVyU3RhdHVzKVxuICAgICAgZGF0YS5wdXNoKHtjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYWZ0ZXJTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICBpZiAodmFsdWUuYmVmb3JlU3RhdHVzKVxuICAgICAgZGF0YS5wdXNoKHtjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYmVmb3JlU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfSk7XG4gICAgcmVzdWx0cy5wdXNoKC4uLmRhdGEpO1xuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LmNhdGNoVW5oYW5kbGVkKSB7XG4gICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgaWYgKGdyb2suc2hlbGwubGFzdEVycm9yLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGNhdGVnb3J5OiAnVW5oYW5kbGVkIGV4Y2VwdGlvbnMnLFxuICAgICAgICBuYW1lOiAnZXhjZXB0aW9ucycsXG4gICAgICAgIHJlc3VsdDogZ3Jvay5zaGVsbC5sYXN0RXJyb3IsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAob3B0aW9ucy50ZXN0Q29udGV4dC5yZXBvcnQpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBuZXcgREcuTG9nZ2VyKCk7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN1Y2Nlc3MpLmxlbmd0aDtcbiAgICBjb25zdCBza2lwcGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc2tpcHBlZCkubGVuZ3RoO1xuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiAhci5zdWNjZXNzKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICdQYWNrYWdlIEBwYWNrYWdlIHRlc3RlZDogQHN1Y2Nlc3NmdWwgc3VjY2Vzc2Z1bCwgQHNraXBwZWQgc2tpcHBlZCwgQGZhaWxlZCBmYWlsZWQgdGVzdHMnO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHN1Y2Nlc3NmdWw6IHN1Y2Nlc3NmdWwsXG4gICAgICBza2lwcGVkOiBza2lwcGVkLFxuICAgICAgZmFpbGVkOiBmYWlsZWQubGVuZ3RoLFxuICAgICAgcGFja2FnZTogcGFja2FnZV9cbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiBmYWlsZWQpIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7W2Ake3IuY2F0ZWdvcnl9IHwgJHtyLm5hbWV9YF06IHIucmVzdWx0fSk7XG4gICAgbG9nZ2VyLmxvZyhkZXNjcmlwdGlvbiwgcGFyYW1zLCAncGFja2FnZS10ZXN0ZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY1Rlc3QodDogVGVzdCwgcHJlZGljYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgbGV0IHI6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuIH07XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKCF0Lm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWRpY2F0ZS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNraXAgPSB0Lm9wdGlvbnM/LnNraXBSZWFzb24gfHwgZmlsdGVyO1xuICBjb25zdCBza2lwUmVhc29uID0gZmlsdGVyID8gJ3NraXBwZWQnIDogdC5vcHRpb25zPy5za2lwUmVhc29uO1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHt0LmNhdGVnb3J5fSAke3QubmFtZX1gKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICB0cnkge1xuICAgIGlmIChza2lwKVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHNraXBSZWFzb24hLCBtczogMCwgc2tpcHBlZDogdHJ1ZX07XG4gICAgZWxzZVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IGF3YWl0IHQudGVzdCgpID8/ICdPSycsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgIHIgPSB7c3VjY2VzczogZmFsc2UsIHJlc3VsdDogeC50b1N0cmluZygpLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9XG4gIGNvbnN0IHN0b3AgPSBuZXcgRGF0ZSgpO1xuICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gIC8vIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG4gIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICByLm5hbWUgPSB0Lm5hbWU7XG4gIHJldHVybiByO1xufVxuXG4vKiBXYWl0cyBbbXNdIG1pbGxpc2Vjb25kcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpIHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF3YWl0Q2hlY2soY2hlY2tIYW5kbGVyOiAoKSA9PiBib29sZWFuLFxuICBlcnJvcjogc3RyaW5nID0gJ1RpbWVvdXQgZXhjZWVkZWQnLCB3YWl0OiBudW1iZXIgPSA1MDAsIGludGVydmFsOiBudW1iZXIgPSA1MCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICB9LCB3YWl0KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWxJZDogVGltZW91dCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmIChjaGVja0hhbmRsZXIoKSkge1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgaW50ZXJ2YWwpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpYWxvZ3MgPSBERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGRpYWxvZ3NbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVW5pdmVyc2FsIHRlc3QgZm9yIHZpZXdlcnMuIEl0IHNlYXJjaCB2aWV3ZXJzIGluIERPTSBieSB0YWdzOiBjYW52YXMsIHN2ZywgaW1nLCBpbnB1dCwgaDEsIGFcbiAqIEBwYXJhbSAge3N0cmluZ30gdiBWaWV3ZXIgbmFtZVxuICogQHBhcmFtICB7REcuRGF0YUZyYW1lfSBkZiBEYXRhZnJhbWUgdG8gdXNlLiBTaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHJvd3NcbiAqIEBwYXJhbSAge2Jvb2xlYW59IG9wdGlvbnMuZGV0ZWN0U2VtYW50aWNUeXBlcyBTcGVjaWZ5IHdoZXRoZXIgdG8gZGV0ZWN0IHNlbWFudGljIHR5cGVzIG9yIG5vdFxuICogQHBhcmFtICB7Ym9vbGVhbn0gb3B0aW9ucy5yZWFkT25seSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGRhdGFmcmFtZSB3aWxsIG5vdCBiZSBtb2RpZmllZCBkdXJpbmcgdGhlIHRlc3RcbiAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyBMaXN0IG9mIG9wdGlvbnMgKG9wdGlvbmFsKVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gVGhlIHRlc3QgaXMgY29uc2lkZXJlZCBzdWNjZXNzZnVsIGlmIGl0IGNvbXBsZXRlcyB3aXRob3V0IGVycm9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFZpZXdlcih2OiBzdHJpbmcsIGRmOiBERy5EYXRhRnJhbWUsXG4gIG9wdGlvbnM/OiB7ZGV0ZWN0U2VtYW50aWNUeXBlcz86IGJvb2xlYW4sIHJlYWRPbmx5PzogYm9vbGVhbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG9wdGlvbnM/LmRldGVjdFNlbWFudGljVHlwZXMpIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbiAgY29uc3QgdHYgPSBncm9rLnNoZWxsLmFkZFRhYmxlVmlldyhkZik7XG4gIGNvbnN0IHZpZXdlck5hbWUgPSBgW25hbWU9dmlld2VyLSR7di5yZXBsYWNlKC9cXHMrL2csICctJyl9IGldYDtcbiAgbGV0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LnRhZ05hbWU7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIGlmICghb3B0aW9ucz8ucmVhZE9ubHkpIHtcbiAgICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgICBjb25zdCBudW0gPSBkZi5yb3dDb3VudCA8IDIwID8gTWF0aC5mbG9vcihkZi5yb3dDb3VudCAvIDIpIDogMTA7XG4gICAgICBkZi5yb3dzLnNlbGVjdCgocm93KSA9PiByb3cuaWR4ID49IDAgJiYgcm93LmlkeCA8IG51bSk7XG4gICAgICBhd2FpdCBkZWxheSg1MCk7XG4gICAgICBmb3IgKGxldCBpID0gbnVtOyBpIDwgbnVtICogMjsgaSsrKSBkZi5maWx0ZXIuc2V0KGksIGZhbHNlKTtcbiAgICAgIGF3YWl0IGRlbGF5KDUwKTtcbiAgICAgIGRmLmN1cnJlbnRSb3dJZHggPSAxO1xuICAgICAgLy8gZGYuY29sdW1ucy5uYW1lcygpLmZvckVhY2goKGMpID0+IGRmLmNvbHVtbnMucmVtb3ZlKGMpKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0bnMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IHByb3BzID0gdmlld2VyLmdldFByb3BlcnRpZXMoKTtcbiAgICBjb25zdCBuZXdQcm9wczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbj4gPSB7fTtcbiAgICBPYmplY3Qua2V5cyhvcHRucykuZmlsdGVyKChrKSA9PiB0eXBlb2Ygb3B0bnNba10gPT09ICdib29sZWFuJykuZm9yRWFjaCgoaykgPT4gbmV3UHJvcHNba10gPSAhb3B0bnNba10pO1xuICAgIHByb3BzLmZpbHRlcigocCkgPT4gcC5jaG9pY2VzICE9PSBudWxsKVxuICAgICAgLmZvckVhY2goKHApID0+IG5ld1Byb3BzW3AubmFtZV0gPSBwLmNob2ljZXMuZmluZCgoYykgPT4gYyAhPT0gb3B0bnNbcC5uYW1lXSkhKTtcbiAgICB2aWV3ZXIuc2V0T3B0aW9ucyhuZXdQcm9wcyk7XG4gICAgYXdhaXQgZGVsYXkoMzAwKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2s7XG4gICAgdHYucmVzZXRMYXlvdXQoKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdHYubG9hZExheW91dChsYXlvdXQpO1xuICAgIHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gJHt0YWd9YDtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIHJlcy5wdXNoKEFycmF5LmZyb20odHYudmlld2VycykubGVuZ3RoKTtcbiAgICB2aWV3ZXIgPSBBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmZpbmQoKHYpID0+IHYudHlwZSAhPT0gJ0dyaWQnKSE7XG4gICAgZXhwZWN0QXJyYXkocmVzLCBbMiwgMSwgMl0pO1xuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeSh2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2spLCBKU09OLnN0cmluZ2lmeShvbGRQcm9wcykpO1xuICB9IGZpbmFsbHkge1xuICAgIHR2LmNsb3NlKCk7XG4gICAgZ3Jvay5zaGVsbC5jbG9zZVRhYmxlKGRmKTtcbiAgICBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gIH1cbn1cbiJdfQ==