@datagrok-libraries/utils 4.0.11 → 4.0.12
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 +2 -2
- package/src/transform.d.ts +27 -0
- package/src/transform.d.ts.map +1 -0
- package/src/transform.js +75 -0
package/package.json
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"fullName": "Utils",
|
|
7
|
-
"version": "4.0.
|
|
7
|
+
"version": "4.0.12",
|
|
8
8
|
"description": "Common utilities",
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"cash-dom": "^8.1.1",
|
|
11
|
-
"datagrok-api": "^1.
|
|
11
|
+
"datagrok-api": "^1.15.2",
|
|
12
12
|
"fast-sha256": "^1.3.0",
|
|
13
13
|
"rxjs": "^6.5.5",
|
|
14
14
|
"wu": "latest"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
/** Represents 1D transformation between screen and world coordinates */
|
|
3
|
+
interface ITransform {
|
|
4
|
+
screenToWorld(screen: number, length: number, min: number, max: number, inverse?: boolean): number;
|
|
5
|
+
worldToScreen(world: number, length: number, min: number, max: number, inverse?: boolean): number;
|
|
6
|
+
}
|
|
7
|
+
/** Provides convenient methods for mapping between screen and world coordinates */
|
|
8
|
+
export declare class Viewport {
|
|
9
|
+
world: DG.Rect;
|
|
10
|
+
screen: DG.Rect;
|
|
11
|
+
logX: boolean;
|
|
12
|
+
logY: boolean;
|
|
13
|
+
inverseX: boolean;
|
|
14
|
+
inverseY: boolean;
|
|
15
|
+
get xt(): ITransform;
|
|
16
|
+
get yt(): ITransform;
|
|
17
|
+
constructor(world: DG.Rect, screen: DG.Rect, logX?: boolean, logY?: boolean);
|
|
18
|
+
xToScreen(world: number): number;
|
|
19
|
+
yToScreen(world: number): number;
|
|
20
|
+
xToWorld(screen: number): number;
|
|
21
|
+
yToWorld(screen: number): number;
|
|
22
|
+
toScreen(world: DG.Point): DG.Point;
|
|
23
|
+
toWorld(screen: DG.Point): DG.Point;
|
|
24
|
+
drawCoordinateGrid(g: CanvasRenderingContext2D, xAxis: DG.Rect | undefined, yAxis: DG.Rect | undefined): void;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGtC,wEAAwE;AACxE,UAAU,UAAU;IAClB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACnG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnG;AA+CD,mFAAmF;AACnF,qBAAa,QAAQ;IACnB,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC;IACf,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,OAAO,CAAS;IACtB,IAAI,EAAE,OAAO,CAAS;IACtB,QAAQ,EAAE,OAAO,CAAS;IAC1B,QAAQ,EAAE,OAAO,CAAQ;IAEzB,IAAI,EAAE,IAAI,UAAU,CAAuD;IAC3E,IAAI,EAAE,IAAI,UAAU,CAAuD;gBAE/D,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,UAAQ,EAAE,IAAI,UAAQ;IAOvE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKhC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKhC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKhC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKhC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;IACnC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;IAEnC,kBAAkB,CAAC,CAAC,EAAE,wBAAwB,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI;CAU9G"}
|
package/src/transform.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
/** Linear transformation */
|
|
3
|
+
class _LinearTransform {
|
|
4
|
+
screenToWorld(screen, length, min, max, inverse) {
|
|
5
|
+
const d = inverse ? 1 - screen / length : screen / length;
|
|
6
|
+
return min + d * (max - min);
|
|
7
|
+
}
|
|
8
|
+
worldToScreen(world, length, min, max, inverse) {
|
|
9
|
+
return inverse ?
|
|
10
|
+
((1 - ((world - min)) / (max - min)) * length) :
|
|
11
|
+
((world - min) / (max - min) * length);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Log transformation */
|
|
15
|
+
class _LogTransform {
|
|
16
|
+
screenToWorld(screen, length, min, max, inverse) {
|
|
17
|
+
min = (min < 0.00000001 ? 0.00000001 : min);
|
|
18
|
+
const maxLog = Math.log(max);
|
|
19
|
+
const minLog = Math.log(min);
|
|
20
|
+
return Math.exp(minLog + (maxLog - minLog) * (inverse ? length - screen : screen) / length);
|
|
21
|
+
}
|
|
22
|
+
worldToScreen(world, length, min, max, inverse) {
|
|
23
|
+
if (world <= 0)
|
|
24
|
+
return NaN;
|
|
25
|
+
//eliminates problems with rounding
|
|
26
|
+
if (world === min)
|
|
27
|
+
return inverse ? length : 0.0;
|
|
28
|
+
if (world === max)
|
|
29
|
+
return inverse ? 0.0 : length;
|
|
30
|
+
min = (min < 0.00000001 ? 0.00000001 : min);
|
|
31
|
+
world = (world < 0.00000001 ? 0.00000001 : world);
|
|
32
|
+
const res = (length * Math.log(world / min) / Math.log(max / min));
|
|
33
|
+
return inverse ? length - res : res;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const linearTransform = new _LinearTransform();
|
|
37
|
+
const logTransform = new _LogTransform();
|
|
38
|
+
/** Provides convenient methods for mapping between screen and world coordinates */
|
|
39
|
+
export class Viewport {
|
|
40
|
+
get xt() { return this.logX ? logTransform : linearTransform; }
|
|
41
|
+
get yt() { return this.logY ? logTransform : linearTransform; }
|
|
42
|
+
constructor(world, screen, logX = false, logY = false) {
|
|
43
|
+
this.logX = false;
|
|
44
|
+
this.logY = false;
|
|
45
|
+
this.inverseX = false;
|
|
46
|
+
this.inverseY = true;
|
|
47
|
+
this.world = world;
|
|
48
|
+
this.screen = screen;
|
|
49
|
+
this.logX = logX;
|
|
50
|
+
this.logY = logY;
|
|
51
|
+
}
|
|
52
|
+
xToScreen(world) {
|
|
53
|
+
return this.screen.left + this.xt.worldToScreen(world, this.screen.width, this.world.minX, this.world.maxX, this.inverseX);
|
|
54
|
+
}
|
|
55
|
+
yToScreen(world) {
|
|
56
|
+
return this.screen.top + this.yt.worldToScreen(world, this.screen.height, this.world.minY, this.world.maxY, this.inverseY);
|
|
57
|
+
}
|
|
58
|
+
xToWorld(screen) {
|
|
59
|
+
return this.xt.screenToWorld(screen - this.screen.left, this.screen.width, this.world.minX, this.world.maxX, this.inverseX);
|
|
60
|
+
}
|
|
61
|
+
yToWorld(screen) {
|
|
62
|
+
return this.yt.screenToWorld(screen - this.screen.top, this.screen.height, this.world.minY, this.world.maxY, this.inverseY);
|
|
63
|
+
}
|
|
64
|
+
toScreen(world) { return new DG.Point(this.xToScreen(world.x), this.yToScreen(world.y)); }
|
|
65
|
+
toWorld(screen) { return new DG.Point(this.xToWorld(screen.x), this.yToWorld(screen.y)); }
|
|
66
|
+
drawCoordinateGrid(g, xAxis, yAxis) {
|
|
67
|
+
if (xAxis) {
|
|
68
|
+
DG.Paint.horzAxis(g, this.world.minX, this.world.maxX, xAxis.x, xAxis.y, xAxis.width, xAxis.height, this.logX, this.inverseX);
|
|
69
|
+
}
|
|
70
|
+
if (yAxis) {
|
|
71
|
+
DG.Paint.vertAxis(g, this.world.minY, this.world.maxY, yAxis.x, yAxis.y, yAxis.width, yAxis.height, this.logY, this.inverseY);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFVdEMsNEJBQTRCO0FBQzVCLE1BQU0sZ0JBQWdCO0lBQ3BCLGFBQWEsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsT0FBaUI7UUFDdkYsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQSxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6RCxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsT0FBaUI7UUFDdEYsT0FBTyxPQUFPLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQUdELHlCQUF5QjtBQUN6QixNQUFNLGFBQWE7SUFDakIsYUFBYSxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxPQUFpQjtRQUN2RixHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVDLE1BQU0s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QUM7SUFDckQsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFjO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUN2RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFjO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUN2RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFlLElBQWMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUcsT0FBTyxDQUFDLE1BQWdCLElBQWMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUcsa0JBQWtCLENBQUMsQ0FBMkIsRUFBRSxLQUEwQixFQUFFLEtBQTBCO1FBQ3BHLElBQUksS0FBSyxFQUFFO1lBQ1QsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxLQUFLLEVBQUU7WUFDVCxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5cbi8qKiBSZXByZXNlbnRzIDFEIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gc2NyZWVuIGFuZCB3b3JsZCBjb29yZGluYXRlcyAqL1xuaW50ZXJmYWNlIElUcmFuc2Zvcm0ge1xuICBzY3JlZW5Ub1dvcmxkKHNjcmVlbjogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyLCBpbnZlcnNlPzogYm9vbGVhbik6IG51bWJlcjtcbiAgd29ybGRUb1NjcmVlbih3b3JsZDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyLCBpbnZlcnNlPzogYm9vbGVhbik6IG51bWJlcjtcbn1cblxuXG4vKiogTGluZWFyIHRyYW5zZm9ybWF0aW9uICovXG5jbGFzcyBfTGluZWFyVHJhbnNmb3JtIGltcGxlbWVudHMgSVRyYW5zZm9ybSB7XG4gIHNjcmVlblRvV29ybGQoc2NyZWVuOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGludmVyc2U/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBjb25zdCBkID0gaW52ZXJzZSA/IDEgLSBzY3JlZW4gLyBsZW5ndGg6IHNjcmVlbiAvIGxlbmd0aDtcbiAgICByZXR1cm4gbWluICsgZCAqIChtYXggLSBtaW4pO1xuICB9XG5cbiAgd29ybGRUb1NjcmVlbih3b3JsZDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyLCBpbnZlcnNlPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGludmVyc2UgP1xuICAgICAgKCgxIC0gKCh3b3JsZCAtIG1pbikpIC8gKG1heCAtIG1pbikpICogbGVuZ3RoKSA6XG4gICAgICAoKHdvcmxkIC0gbWluKSAvIChtYXggLSBtaW4pICogbGVuZ3RoKTtcbiAgfVxufVxuXG5cbi8qKiBMb2cgdHJhbnNmb3JtYXRpb24gKi9cbmNsYXNzIF9Mb2dUcmFuc2Zvcm0gaW1wbGVtZW50cyBJVHJhbnNmb3JtIHtcbiAgc2NyZWVuVG9Xb3JsZChzY3JlZW46IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgaW52ZXJzZT86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIG1pbiA9IChtaW4gPCAwLjAwMDAwMDAxID8gMC4wMDAwMDAwMSA6IG1pbik7XG5cbiAgICBjb25zdCBtYXhMb2cgPSBNYXRoLmxvZyhtYXgpO1xuICAgIGNvbnN0IG1pbkxvZyA9IE1hdGgubG9nKG1pbik7XG4gICAgcmV0dXJuIE1hdGguZXhwKG1pbkxvZyArIChtYXhMb2cgLSBtaW5Mb2cpICogKGludmVyc2UgPyBsZW5ndGggLSBzY3JlZW4gOiBzY3JlZW4pIC8gbGVuZ3RoKTtcbiAgfVxuXG4gIHdvcmxkVG9TY3JlZW4od29ybGQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgaW52ZXJzZT86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGlmICh3b3JsZCA8PSAwKSByZXR1cm4gTmFOO1xuXG4gICAgLy9lbGltaW5hdGVzIHByb2JsZW1zIHdpdGggcm91bmRpbmdcbiAgICBpZiAod29ybGQgPT09IG1pbikgcmV0dXJuIGludmVyc2UgPyBsZW5ndGggOiAwLjA7XG4gICAgaWYgKHdvcmxkID09PSBtYXgpIHJldHVybiBpbnZlcnNlID8gMC4wIDogbGVuZ3RoO1xuXG4gICAgbWluID0gKG1pbiA8IDAuMDAwMDAwMDEgPyAwLjAwMDAwMDAxIDogbWluKTtcbiAgICB3b3JsZCA9ICh3b3JsZCA8IDAuMDAwMDAwMDEgPyAwLjAwMDAwMDAxIDogd29ybGQpO1xuXG4gICAgY29uc3QgcmVzID0gKGxlbmd0aCAqIE1hdGgubG9nKHdvcmxkIC8gbWluKSAvIE1hdGgubG9nKG1heCAvIG1pbikpO1xuICAgIHJldHVybiBpbnZlcnNlID8gbGVuZ3RoIC0gcmVzIDogcmVzO1xuICB9XG59XG5cbmNvbnN0IGxpbmVhclRyYW5zZm9ybSA9IG5ldyBfTGluZWFyVHJhbnNmb3JtKCk7XG5jb25zdCBsb2dUcmFuc2Zvcm0gPSBuZXcgX0xvZ1RyYW5zZm9ybSgpO1xuXG5cbi8qKiBQcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIG1hcHBpbmcgYmV0d2VlbiBzY3JlZW4gYW5kIHdvcmxkIGNvb3JkaW5hdGVzICovXG5leHBvcnQgY2xhc3MgVmlld3BvcnQge1xuICB3b3JsZDogREcuUmVjdDtcbiAgc2NyZWVuOiBERy5SZWN0O1xuICBsb2dYOiBib29sZWFuID0gZmFsc2U7XG4gIGxvZ1k6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW52ZXJzZVg6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW52ZXJzZVk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGdldCB4dCgpOiBJVHJhbnNmb3JtIHsgcmV0dXJuIHRoaXMubG9nWCA/IGxvZ1RyYW5zZm9ybSA6IGxpbmVhclRyYW5zZm9ybTsgfVxuICBnZXQgeXQoKTogSVRyYW5zZm9ybSB7IHJldHVybiB0aGlzLmxvZ1kgPyBsb2dUcmFuc2Zvcm0gOiBsaW5lYXJUcmFuc2Zvcm07IH1cblxuICBjb25zdHJ1Y3Rvcih3b3JsZDogREcuUmVjdCwgc2NyZWVuOiBERy5SZWN0LCBsb2dYID0gZmFsc2UsIGxvZ1kgPSBmYWxzZSkge1xuICAgIHRoaXMud29ybGQgPSB3b3JsZDtcbiAgICB0aGlzLnNjcmVlbiA9IHNjcmVlbjtcbiAgICB0aGlzLmxvZ1ggPSBsb2dYO1xuICAgIHRoaXMubG9nWSA9IGxvZ1k7XG4gIH1cblxuICB4VG9TY3JlZW4od29ybGQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuLmxlZnQgKyB0aGlzLnh0LndvcmxkVG9TY3JlZW4od29ybGQsIHRoaXMuc2NyZWVuLndpZHRoLFxuICAgICAgdGhpcy53b3JsZC5taW5YLCB0aGlzLndvcmxkLm1heFgsIHRoaXMuaW52ZXJzZVgpO1xuICB9XG5cbiAgeVRvU2NyZWVuKHdvcmxkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNjcmVlbi50b3AgKyB0aGlzLnl0LndvcmxkVG9TY3JlZW4od29ybGQsIHRoaXMuc2NyZWVuLmhlaWdodCxcbiAgICAgIHRoaXMud29ybGQubWluWSwgdGhpcy53b3JsZC5tYXhZLCB0aGlzLmludmVyc2VZKTtcbiAgfVxuXG4gIHhUb1dvcmxkKHNjcmVlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy54dC5zY3JlZW5Ub1dvcmxkKHNjcmVlbiAtIHRoaXMuc2NyZWVuLmxlZnQsIHRoaXMuc2NyZWVuLndpZHRoLFxuICAgICAgdGhpcy53b3JsZC5taW5YLCB0aGlzLndvcmxkLm1heFgsIHRoaXMuaW52ZXJzZVgpO1xuICB9XG5cbiAgeVRvV29ybGQoc2NyZWVuOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnl0LnNjcmVlblRvV29ybGQoc2NyZWVuIC0gdGhpcy5zY3JlZW4udG9wLCB0aGlzLnNjcmVlbi5oZWlnaHQsXG4gICAgICB0aGlzLndvcmxkLm1pblksIHRoaXMud29ybGQubWF4WSwgdGhpcy5pbnZlcnNlWSk7XG4gIH1cblxuICB0b1NjcmVlbih3b3JsZDogREcuUG9pbnQpOiBERy5Qb2ludCB7IHJldHVybiBuZXcgREcuUG9pbnQodGhpcy54VG9TY3JlZW4od29ybGQueCksIHRoaXMueVRvU2NyZWVuKHdvcmxkLnkpKTsgfVxuICB0b1dvcmxkKHNjcmVlbjogREcuUG9pbnQpOiBERy5Qb2ludCB7IHJldHVybiBuZXcgREcuUG9pbnQodGhpcy54VG9Xb3JsZChzY3JlZW4ueCksIHRoaXMueVRvV29ybGQoc2NyZWVuLnkpKTsgfVxuXG4gIGRyYXdDb29yZGluYXRlR3JpZChnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHhBeGlzOiBERy5SZWN0IHwgdW5kZWZpbmVkLCB5QXhpczogREcuUmVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh4QXhpcykge1xuICAgICAgREcuUGFpbnQuaG9yekF4aXMoZywgdGhpcy53b3JsZC5taW5YLCB0aGlzLndvcmxkLm1heFgsIHhBeGlzLngsIHhBeGlzLnksXG4gICAgICAgIHhBeGlzLndpZHRoLCB4QXhpcy5oZWlnaHQsIHRoaXMubG9nWCwgdGhpcy5pbnZlcnNlWCk7XG4gICAgfVxuICAgIGlmICh5QXhpcykge1xuICAgICAgREcuUGFpbnQudmVydEF4aXMoZywgdGhpcy53b3JsZC5taW5ZLCB0aGlzLndvcmxkLm1heFksIHlBeGlzLngsIHlBeGlzLnksXG4gICAgICAgIHlBeGlzLndpZHRoLCB5QXhpcy5oZWlnaHQsIHRoaXMubG9nWSwgdGhpcy5pbnZlcnNlWSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|