@seniorsistemas/angular-components 16.13.1 → 17.0.0
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/bundles/seniorsistemas-angular-components.umd.js +1733 -26
- package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
- package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
- package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
- package/components/gantt/components/gantt/arrow.d.ts +16 -0
- package/components/gantt/components/gantt/bar.d.ts +43 -0
- package/components/gantt/components/gantt/gantt-options.d.ts +2 -0
- package/components/gantt/components/gantt/gantt.d.ts +66 -0
- package/components/gantt/components/gantt/popup.d.ts +11 -0
- package/components/gantt/components/gantt/utils/date-utils.d.ts +13 -0
- package/components/gantt/components/gantt/utils/svg-utils.d.ts +11 -0
- package/components/gantt/components/side-table/side-table.component.d.ts +7 -0
- package/components/gantt/gantt.component.d.ts +21 -0
- package/components/gantt/gantt.module.d.ts +2 -0
- package/components/gantt/index.d.ts +3 -0
- package/components/gantt/models/index.d.ts +3 -0
- package/components/gantt/models/options.d.ts +21 -0
- package/components/gantt/models/task.d.ts +21 -0
- package/components/gantt/models/view-mode.d.ts +9 -0
- package/esm2015/components/gantt/components/gantt/arrow.js +82 -0
- package/esm2015/components/gantt/components/gantt/bar.js +236 -0
- package/esm2015/components/gantt/components/gantt/gantt-options.js +16 -0
- package/esm2015/components/gantt/components/gantt/gantt.js +767 -0
- package/esm2015/components/gantt/components/gantt/popup.js +68 -0
- package/esm2015/components/gantt/components/gantt/utils/date-utils.js +126 -0
- package/esm2015/components/gantt/components/gantt/utils/svg-utils.js +119 -0
- package/esm2015/components/gantt/components/side-table/side-table.component.js +26 -0
- package/esm2015/components/gantt/gantt.component.js +112 -0
- package/esm2015/components/gantt/gantt.module.js +19 -0
- package/esm2015/components/gantt/index.js +4 -0
- package/esm2015/components/gantt/models/index.js +2 -0
- package/esm2015/components/gantt/models/options.js +1 -0
- package/esm2015/components/gantt/models/task.js +1 -0
- package/esm2015/components/gantt/models/view-mode.js +11 -0
- package/esm2015/components/sidebar/sidebar.component.js +3 -3
- package/esm2015/public-api.js +2 -1
- package/esm2015/seniorsistemas-angular-components.js +25 -24
- package/esm5/components/gantt/components/gantt/arrow.js +81 -0
- package/esm5/components/gantt/components/gantt/bar.js +271 -0
- package/esm5/components/gantt/components/gantt/gantt-options.js +16 -0
- package/esm5/components/gantt/components/gantt/gantt.js +883 -0
- package/esm5/components/gantt/components/gantt/popup.js +59 -0
- package/esm5/components/gantt/components/gantt/utils/date-utils.js +134 -0
- package/esm5/components/gantt/components/gantt/utils/svg-utils.js +121 -0
- package/esm5/components/gantt/components/side-table/side-table.component.js +27 -0
- package/esm5/components/gantt/gantt.component.js +114 -0
- package/esm5/components/gantt/gantt.module.js +22 -0
- package/esm5/components/gantt/index.js +4 -0
- package/esm5/components/gantt/models/index.js +2 -0
- package/esm5/components/gantt/models/options.js +1 -0
- package/esm5/components/gantt/models/task.js +1 -0
- package/esm5/components/gantt/models/view-mode.js +11 -0
- package/esm5/components/sidebar/sidebar.component.js +3 -3
- package/esm5/public-api.js +2 -1
- package/esm5/seniorsistemas-angular-components.js +25 -24
- package/fesm2015/seniorsistemas-angular-components.js +1558 -4
- package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
- package/fesm5/seniorsistemas-angular-components.js +1708 -4
- package/fesm5/seniorsistemas-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/seniorsistemas-angular-components.d.ts +24 -23
- package/seniorsistemas-angular-components.metadata.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Gantt } from "./gantt";
|
|
2
|
+
import { Bar } from "./bar";
|
|
3
|
+
export declare class Arrow {
|
|
4
|
+
private _gantt;
|
|
5
|
+
private _fromTask;
|
|
6
|
+
private _toTask;
|
|
7
|
+
private _path;
|
|
8
|
+
private _element;
|
|
9
|
+
constructor(gantt: Gantt, fromTask: Bar, toTask: Bar);
|
|
10
|
+
get fromTask(): Bar;
|
|
11
|
+
get toTask(): Bar;
|
|
12
|
+
get element(): any;
|
|
13
|
+
update(): void;
|
|
14
|
+
private calculatePath;
|
|
15
|
+
private draw;
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EnrichedTask } from "../../models/task";
|
|
2
|
+
import { Arrow } from "./arrow";
|
|
3
|
+
export declare class Bar {
|
|
4
|
+
private _actionCompleted;
|
|
5
|
+
private _gantt;
|
|
6
|
+
private _invalid;
|
|
7
|
+
private _height;
|
|
8
|
+
private _x;
|
|
9
|
+
private _y;
|
|
10
|
+
private _cornerRadius;
|
|
11
|
+
private _duration;
|
|
12
|
+
private _width;
|
|
13
|
+
private _barGroup;
|
|
14
|
+
private _arrows;
|
|
15
|
+
private _group;
|
|
16
|
+
private _task;
|
|
17
|
+
private _element;
|
|
18
|
+
get arrows(): Arrow[];
|
|
19
|
+
set arrows(arrows: Arrow[]);
|
|
20
|
+
get task(): EnrichedTask;
|
|
21
|
+
get element(): any;
|
|
22
|
+
get group(): any;
|
|
23
|
+
constructor(gantt: any, task: any);
|
|
24
|
+
updateBarPosition({ x, width }: any): void;
|
|
25
|
+
dateChanged(): void;
|
|
26
|
+
setActionCompleted(): void;
|
|
27
|
+
private _setDefaults;
|
|
28
|
+
private _prepare;
|
|
29
|
+
private _prepareValues;
|
|
30
|
+
private _prepareHelpers;
|
|
31
|
+
private _draw;
|
|
32
|
+
private _drawBar;
|
|
33
|
+
private _drawLabel;
|
|
34
|
+
private _bind;
|
|
35
|
+
private _setupClickEvent;
|
|
36
|
+
private _showPopup;
|
|
37
|
+
private _computeStartEndDate;
|
|
38
|
+
private _computeX;
|
|
39
|
+
private _computeY;
|
|
40
|
+
private _updateAttr;
|
|
41
|
+
private _updateLabelPosition;
|
|
42
|
+
private _updateArrowPosition;
|
|
43
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Bar } from "./bar";
|
|
2
|
+
import { Arrow } from "./arrow";
|
|
3
|
+
import { Options } from "../../models/options";
|
|
4
|
+
import { ViewMode } from "../../models/view-mode";
|
|
5
|
+
import { Task, EnrichedTask } from "../../models";
|
|
6
|
+
export declare class Gantt {
|
|
7
|
+
options: Options;
|
|
8
|
+
tasks: EnrichedTask[];
|
|
9
|
+
dependency_map: any;
|
|
10
|
+
private _minDate;
|
|
11
|
+
private _maxDate;
|
|
12
|
+
private _realMinDate;
|
|
13
|
+
private _realMaxDate;
|
|
14
|
+
dates: any;
|
|
15
|
+
layers: any;
|
|
16
|
+
bars: Bar[];
|
|
17
|
+
arrows: Arrow[];
|
|
18
|
+
bar_being_dragged: any;
|
|
19
|
+
$svg: any;
|
|
20
|
+
$container: HTMLDivElement;
|
|
21
|
+
popup_wrapper: HTMLDivElement;
|
|
22
|
+
popup: any;
|
|
23
|
+
get minDate(): Date;
|
|
24
|
+
get maxDate(): Date;
|
|
25
|
+
constructor(wrapper: any, tasks: Task[], options?: Options);
|
|
26
|
+
private setup_wrapper;
|
|
27
|
+
private setup_options;
|
|
28
|
+
setup_tasks(tasks: any): void;
|
|
29
|
+
private setup_dependencies;
|
|
30
|
+
refresh(tasks: Task[]): void;
|
|
31
|
+
change_view_mode(mode?: ViewMode): void;
|
|
32
|
+
private update_view_scale;
|
|
33
|
+
private setup_dates;
|
|
34
|
+
private setup_gantt_dates;
|
|
35
|
+
private setup_date_values;
|
|
36
|
+
private bind_events;
|
|
37
|
+
private render;
|
|
38
|
+
private setup_layers;
|
|
39
|
+
private make_grid;
|
|
40
|
+
private make_grid_background;
|
|
41
|
+
private make_grid_rows;
|
|
42
|
+
private make_grid_header;
|
|
43
|
+
private make_grid_ticks;
|
|
44
|
+
make_grid_highlights(): void;
|
|
45
|
+
private make_dates;
|
|
46
|
+
private get_dates_to_draw;
|
|
47
|
+
private get_date_info;
|
|
48
|
+
private make_bars;
|
|
49
|
+
private make_arrows;
|
|
50
|
+
private map_arrows_on_bars;
|
|
51
|
+
private set_width;
|
|
52
|
+
private set_scroll_position;
|
|
53
|
+
private bind_grid_click;
|
|
54
|
+
private bind_bar_events;
|
|
55
|
+
private get_all_dependent_tasks;
|
|
56
|
+
private get_snap_position;
|
|
57
|
+
unselect_all(): void;
|
|
58
|
+
view_is(modes: ViewMode | ViewMode[]): boolean;
|
|
59
|
+
private get_task;
|
|
60
|
+
get_bar(id: any): Bar;
|
|
61
|
+
show_popup(options: any): void;
|
|
62
|
+
private hide_popup;
|
|
63
|
+
trigger_event(event: string, args: any): void;
|
|
64
|
+
private get_oldest_starting_date;
|
|
65
|
+
private clear;
|
|
66
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare abstract class DateUtils {
|
|
2
|
+
static parse(date: Date | string): Date;
|
|
3
|
+
static toString(date: Date, with_time?: boolean): string;
|
|
4
|
+
static format(date: any, formatString?: string, lang?: string): string;
|
|
5
|
+
static diff(fistDate: Date, secondDate: Date, scale: string): number;
|
|
6
|
+
static today(): Date;
|
|
7
|
+
static now(): Date;
|
|
8
|
+
static add(date: Date, quantity: any, scale: any): Date;
|
|
9
|
+
static startOf(date: Date, scale: string): Date;
|
|
10
|
+
static clone(date: Date): Date;
|
|
11
|
+
static getDateValues(date: Date): number[];
|
|
12
|
+
static getDaysInMonth(date: Date): number;
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const $: {
|
|
2
|
+
(expr: any, con: any): any;
|
|
3
|
+
on(element: any, event: any, selector: any, callback: any): void;
|
|
4
|
+
off(element: any, event: any, handler: any): void;
|
|
5
|
+
bind(element: any, event: any, callback: any): void;
|
|
6
|
+
delegate(element: any, event: any, selector: any, callback: any): void;
|
|
7
|
+
closest(selector: any, element: any): any;
|
|
8
|
+
attr(element: any, attr: any, value: any): any;
|
|
9
|
+
};
|
|
10
|
+
export declare const createSVG: (tag: any, attrs: any) => any;
|
|
11
|
+
export declare const animateSVG: (svgElement: any, attr: any, from: any, to: any) => void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AfterViewInit, OnChanges, OnInit, EventEmitter, SimpleChanges } from "@angular/core";
|
|
2
|
+
import { TaskGroup, Task } from "./models/task";
|
|
3
|
+
import { ViewMode } from "./models/view-mode";
|
|
4
|
+
export declare class GanttComponent implements AfterViewInit, OnChanges, OnInit {
|
|
5
|
+
columnTitle: string;
|
|
6
|
+
multipleTaskPerLine: boolean;
|
|
7
|
+
showSideTable: boolean;
|
|
8
|
+
viewMode: ViewMode;
|
|
9
|
+
tasks: TaskGroup[];
|
|
10
|
+
marginBeforeStart?: number;
|
|
11
|
+
marginAfterEnd?: number;
|
|
12
|
+
taskClicked: EventEmitter<Task>;
|
|
13
|
+
taskDateChanged: EventEmitter<any>;
|
|
14
|
+
viewChanged: EventEmitter<ViewMode>;
|
|
15
|
+
private _gantt;
|
|
16
|
+
ngOnInit(): void;
|
|
17
|
+
ngAfterViewInit(): void;
|
|
18
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
19
|
+
private _filterTask;
|
|
20
|
+
private _validateViewMode;
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ViewMode } from "./view-mode";
|
|
2
|
+
import { EnrichedTask } from "./task";
|
|
3
|
+
export interface Options {
|
|
4
|
+
headerHeight?: number;
|
|
5
|
+
columnWidth?: number;
|
|
6
|
+
step?: number;
|
|
7
|
+
barHeight?: number;
|
|
8
|
+
barCornerRadius?: number;
|
|
9
|
+
arrowCurve?: number;
|
|
10
|
+
padding?: number;
|
|
11
|
+
viewMode?: ViewMode;
|
|
12
|
+
dateFormat?: string;
|
|
13
|
+
customPopupHtml?: string | ((task: EnrichedTask) => string);
|
|
14
|
+
language?: string;
|
|
15
|
+
popupTrigger?: any;
|
|
16
|
+
marginBeforeStart?: number;
|
|
17
|
+
marginAfterEnd?: number;
|
|
18
|
+
onClick?: ((task: EnrichedTask) => void);
|
|
19
|
+
onDateChange?: ((task: EnrichedTask, start: Date, end: Date) => void);
|
|
20
|
+
onViewChange?: ((mode: ViewMode) => void);
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface Task {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
start: Date;
|
|
5
|
+
end: Date;
|
|
6
|
+
showTaskName?: boolean;
|
|
7
|
+
dependencies?: string[];
|
|
8
|
+
color?: string;
|
|
9
|
+
custom_class?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EnrichedTask extends Task {
|
|
12
|
+
_index: number;
|
|
13
|
+
_row_id: number;
|
|
14
|
+
invalid?: boolean | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface TaskGroup {
|
|
17
|
+
id: string;
|
|
18
|
+
title: string;
|
|
19
|
+
subtitle: string;
|
|
20
|
+
tasks: Task[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createSVG } from './utils/svg-utils';
|
|
2
|
+
export class Arrow {
|
|
3
|
+
constructor(gantt, fromTask, toTask) {
|
|
4
|
+
this._gantt = gantt;
|
|
5
|
+
this._fromTask = fromTask;
|
|
6
|
+
this._toTask = toTask;
|
|
7
|
+
this.calculatePath();
|
|
8
|
+
this.draw();
|
|
9
|
+
}
|
|
10
|
+
get fromTask() {
|
|
11
|
+
return this._fromTask;
|
|
12
|
+
}
|
|
13
|
+
get toTask() {
|
|
14
|
+
return this._toTask;
|
|
15
|
+
}
|
|
16
|
+
get element() {
|
|
17
|
+
return this._element;
|
|
18
|
+
}
|
|
19
|
+
update() {
|
|
20
|
+
this.calculatePath();
|
|
21
|
+
this._element.setAttribute("d", this._path);
|
|
22
|
+
}
|
|
23
|
+
calculatePath() {
|
|
24
|
+
let startX = this.fromTask.element.getX() + this.fromTask.element.getWidth() / 2;
|
|
25
|
+
const condition = () => this.toTask.element.getX() < startX + this._gantt.options.padding &&
|
|
26
|
+
startX > this.fromTask.element.getX() + this._gantt.options.padding;
|
|
27
|
+
while (condition()) {
|
|
28
|
+
startX -= 10;
|
|
29
|
+
}
|
|
30
|
+
const startY = this._gantt.options.headerHeight +
|
|
31
|
+
this._gantt.options.barHeight +
|
|
32
|
+
(this._gantt.options.padding + this._gantt.options.barHeight) *
|
|
33
|
+
this.fromTask.task._index +
|
|
34
|
+
this._gantt.options.padding;
|
|
35
|
+
const endX = this.toTask.element.getX() - this._gantt.options.padding / 2;
|
|
36
|
+
const endY = this._gantt.options.headerHeight +
|
|
37
|
+
this._gantt.options.barHeight / 2 +
|
|
38
|
+
(this._gantt.options.padding + this._gantt.options.barHeight) *
|
|
39
|
+
this.toTask.task._index +
|
|
40
|
+
this._gantt.options.padding;
|
|
41
|
+
const fromIsBelowTo = this.fromTask.task._index > this.toTask.task._index;
|
|
42
|
+
const curve = this._gantt.options.arrowCurve;
|
|
43
|
+
const clockwise = fromIsBelowTo ? 1 : 0;
|
|
44
|
+
const curveY = fromIsBelowTo ? -curve : curve;
|
|
45
|
+
const offset = fromIsBelowTo
|
|
46
|
+
? endY + this._gantt.options.arrowCurve
|
|
47
|
+
: endY - this._gantt.options.arrowCurve;
|
|
48
|
+
this._path = `
|
|
49
|
+
M ${startX} ${startY}
|
|
50
|
+
V ${offset}
|
|
51
|
+
a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curveY}
|
|
52
|
+
L ${endX} ${endY}
|
|
53
|
+
m -5 -5
|
|
54
|
+
l 5 5
|
|
55
|
+
l -5 5`;
|
|
56
|
+
if (this.toTask.element.getX() < this.fromTask.element.getX() + this._gantt.options.padding) {
|
|
57
|
+
const down1 = this._gantt.options.padding / 2 - curve;
|
|
58
|
+
const down2 = this.toTask.element.getY() + this.toTask.element.getHeight() / 2 - curveY;
|
|
59
|
+
const left = this.toTask.element.getX() - this._gantt.options.padding;
|
|
60
|
+
this._path = `
|
|
61
|
+
M ${startX} ${startY}
|
|
62
|
+
v ${down1}
|
|
63
|
+
a ${curve} ${curve} 0 0 1 -${curve} ${curve}
|
|
64
|
+
H ${left}
|
|
65
|
+
a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curveY}
|
|
66
|
+
V ${down2}
|
|
67
|
+
a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curveY}
|
|
68
|
+
L ${endX} ${endY}
|
|
69
|
+
m -5 -5
|
|
70
|
+
l 5 5
|
|
71
|
+
l -5 5`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
draw() {
|
|
75
|
+
this._element = createSVG("path", {
|
|
76
|
+
d: this._path,
|
|
77
|
+
"data-from": this.fromTask.task.id,
|
|
78
|
+
"data-to": this.toTask.task.id,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3cuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2Fycm93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5QyxNQUFNLE9BQU8sS0FBSztJQU9kLFlBQVksS0FBWSxFQUFFLFFBQWEsRUFBRSxNQUFXO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sYUFBYTtRQUNqQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFakYsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLENB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QUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN4RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFFdEUsSUFBSSxDQUFDLEtBQUssR0FBRztvQkFDTCxNQUFNLElBQUksTUFBTTtvQkFDaEIsS0FBSztvQkFDTCxLQUFLLElBQUksS0FBSyxXQUFXLEtBQUssSUFBSSxLQUFLO29CQUN2QyxJQUFJO29CQUNKLEtBQUssSUFBSSxLQUFLLFFBQVEsU0FBUyxLQUFLLEtBQUssSUFBSSxNQUFNO29CQUNuRCxLQUFLO29CQUNMLEtBQUssSUFBSSxLQUFLLFFBQVEsU0FBUyxJQUFJLEtBQUssSUFBSSxNQUFNO29CQUNsRCxJQUFJLElBQUksSUFBSTs7O3VCQUdULENBQUM7U0FDZjtJQUNMLENBQUM7SUFFTyxJQUFJO1FBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzlCLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSztZQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNWRyB9IGZyb20gJy4vdXRpbHMvc3ZnLXV0aWxzJztcbmltcG9ydCB7IEdhbnR0IH0gZnJvbSBcIi4vZ2FudHRcIjtcbmltcG9ydCB7IEJhciB9IGZyb20gXCIuL2JhclwiO1xuXG5leHBvcnQgY2xhc3MgQXJyb3cge1xuICAgIHByaXZhdGUgX2dhbnR0OiBHYW50dDtcbiAgICBwcml2YXRlIF9mcm9tVGFzazogQmFyO1xuICAgIHByaXZhdGUgX3RvVGFzazogQmFyO1xuICAgIHByaXZhdGUgX3BhdGg6IGFueTtcbiAgICBwcml2YXRlIF9lbGVtZW50OiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihnYW50dDogR2FudHQsIGZyb21UYXNrOiBCYXIsIHRvVGFzazogQmFyKSB7XG4gICAgICAgIHRoaXMuX2dhbnR0ID0gZ2FudHQ7XG4gICAgICAgIHRoaXMuX2Zyb21UYXNrID0gZnJvbVRhc2s7XG4gICAgICAgIHRoaXMuX3RvVGFzayA9IHRvVGFzaztcblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhdGgoKTtcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmcm9tVGFzaygpOiBCYXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJvbVRhc2s7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b1Rhc2soKTogQmFyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvVGFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUGF0aCgpO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRcIiwgdGhpcy5fcGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVQYXRoKCkge1xuICAgICAgICBsZXQgc3RhcnRYID0gdGhpcy5mcm9tVGFzay5lbGVtZW50LmdldFgoKSArIHRoaXMuZnJvbVRhc2suZWxlbWVudC5nZXRXaWR0aCgpIC8gMjtcblxuICAgICAgICBjb25zdCBjb25kaXRpb24gPSAoKSA9PlxuICAgICAgICAgICAgdGhpcy50b1Rhc2suZWxlbWVudC5nZXRYKCkgPCBzdGFydFggKyB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgJiZcbiAgICAgICAgICAgIHN0YXJ0WCA+IHRoaXMuZnJvbVRhc2suZWxlbWVudC5nZXRYKCkgKyB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmc7XG5cbiAgICAgICAgd2hpbGUgKGNvbmRpdGlvbigpKSB7XG4gICAgICAgICAgICBzdGFydFggLT0gMTA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydFkgPSB0aGlzLl9nYW50dC5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLmJhckhlaWdodCArXG4gICAgICAgICAgICAodGhpcy5fZ2FudHQub3B0aW9ucy5wYWRkaW5nICsgdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJIZWlnaHQpICpcbiAgICAgICAgICAgIHRoaXMuZnJvbVRhc2sudGFzay5faW5kZXggK1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICBjb25zdCBlbmRYID0gdGhpcy50b1Rhc2suZWxlbWVudC5nZXRYKCkgLSB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgLyAyO1xuICAgICAgICBjb25zdCBlbmRZID0gdGhpcy5fZ2FudHQub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJIZWlnaHQgLyAyICtcbiAgICAgICAgICAgICh0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgKyB0aGlzLl9nYW50dC5vcHRpb25zLmJhckhlaWdodCkgKlxuICAgICAgICAgICAgdGhpcy50b1Rhc2sudGFzay5faW5kZXggK1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICBjb25zdCBmcm9tSXNCZWxvd1RvID0gdGhpcy5mcm9tVGFzay50YXNrLl9pbmRleCA+IHRoaXMudG9UYXNrLnRhc2suX2luZGV4O1xuICAgICAgICBjb25zdCBjdXJ2ZSA9IHRoaXMuX2dhbnR0Lm9wdGlvbnMuYXJyb3dDdXJ2ZTtcbiAgICAgICAgY29uc3QgY2xvY2t3aXNlID0gZnJvbUlzQmVsb3dUbyA/IDEgOiAwO1xuICAgICAgICBjb25zdCBjdXJ2ZVkgPSBmcm9tSXNCZWxvd1RvID8gLWN1cnZlIDogY3VydmU7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGZyb21Jc0JlbG93VG9cbiAgICAgICAgICAgID8gZW5kWSArIHRoaXMuX2dhbnR0Lm9wdGlvbnMuYXJyb3dDdXJ2ZVxuICAgICAgICAgICAgOiBlbmRZIC0gdGhpcy5fZ2FudHQub3B0aW9ucy5hcnJvd0N1cnZlO1xuXG4gICAgICAgIHRoaXMuX3BhdGggPSBgXG4gICAgICAgICAgICBNICR7c3RhcnRYfSAke3N0YXJ0WX1cbiAgICAgICAgICAgIFYgJHtvZmZzZXR9XG4gICAgICAgICAgICBhICR7Y3VydmV9ICR7Y3VydmV9IDAgMCAke2Nsb2Nrd2lzZX0gJHtjdXJ2ZX0gJHtjdXJ2ZVl9XG4gICAgICAgICAgICBMICR7ZW5kWH0gJHtlbmRZfVxuICAgICAgICAgICAgbSAtNSAtNVxuICAgICAgICAgICAgbCA1IDVcbiAgICAgICAgICAgIGwgLTUgNWA7XG5cbiAgICAgICAgaWYgKHRoaXMudG9UYXNrLmVsZW1lbnQuZ2V0WCgpIDwgdGhpcy5mcm9tVGFzay5lbGVtZW50LmdldFgoKSArIHRoaXMuX2dhbnR0Lm9wdGlvbnMucGFkZGluZykge1xuICAgICAgICAgICAgY29uc3QgZG93bjEgPSB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgLyAyIC0gY3VydmU7XG4gICAgICAgICAgICBjb25zdCBkb3duMiA9IHRoaXMudG9UYXNrLmVsZW1lbnQuZ2V0WSgpICsgdGhpcy50b1Rhc2suZWxlbWVudC5nZXRIZWlnaHQoKSAvIDIgLSBjdXJ2ZVk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy50b1Rhc2suZWxlbWVudC5nZXRYKCkgLSB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmc7XG5cbiAgICAgICAgICAgIHRoaXMuX3BhdGggPSBgXG4gICAgICAgICAgICAgICAgTSAke3N0YXJ0WH0gJHtzdGFydFl9XG4gICAgICAgICAgICAgICAgdiAke2Rvd24xfVxuICAgICAgICAgICAgICAgIGEgJHtjdXJ2ZX0gJHtjdXJ2ZX0gMCAwIDEgLSR7Y3VydmV9ICR7Y3VydmV9XG4gICAgICAgICAgICAgICAgSCAke2xlZnR9XG4gICAgICAgICAgICAgICAgYSAke2N1cnZlfSAke2N1cnZlfSAwIDAgJHtjbG9ja3dpc2V9IC0ke2N1cnZlfSAke2N1cnZlWX1cbiAgICAgICAgICAgICAgICBWICR7ZG93bjJ9XG4gICAgICAgICAgICAgICAgYSAke2N1cnZlfSAke2N1cnZlfSAwIDAgJHtjbG9ja3dpc2V9ICR7Y3VydmV9ICR7Y3VydmVZfVxuICAgICAgICAgICAgICAgIEwgJHtlbmRYfSAke2VuZFl9XG4gICAgICAgICAgICAgICAgbSAtNSAtNVxuICAgICAgICAgICAgICAgIGwgNSA1XG4gICAgICAgICAgICAgICAgbCAtNSA1YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZHJhdygpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgZDogdGhpcy5fcGF0aCxcbiAgICAgICAgICAgIFwiZGF0YS1mcm9tXCI6IHRoaXMuZnJvbVRhc2sudGFzay5pZCxcbiAgICAgICAgICAgIFwiZGF0YS10b1wiOiB0aGlzLnRvVGFzay50YXNrLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { DateUtils } from './utils/date-utils';
|
|
2
|
+
import { $, createSVG, animateSVG } from './utils/svg-utils';
|
|
3
|
+
import { ViewMode } from "../../models/view-mode";
|
|
4
|
+
export class Bar {
|
|
5
|
+
constructor(gantt, task) {
|
|
6
|
+
this._setDefaults(gantt, task);
|
|
7
|
+
this._prepare();
|
|
8
|
+
this._draw();
|
|
9
|
+
this._bind();
|
|
10
|
+
}
|
|
11
|
+
get arrows() {
|
|
12
|
+
return this._arrows;
|
|
13
|
+
}
|
|
14
|
+
set arrows(arrows) {
|
|
15
|
+
this._arrows = arrows;
|
|
16
|
+
}
|
|
17
|
+
get task() {
|
|
18
|
+
return this._task;
|
|
19
|
+
}
|
|
20
|
+
get element() {
|
|
21
|
+
return this._element;
|
|
22
|
+
}
|
|
23
|
+
get group() {
|
|
24
|
+
return this._group;
|
|
25
|
+
}
|
|
26
|
+
updateBarPosition({ x, width }) {
|
|
27
|
+
const bar = this.element;
|
|
28
|
+
if (x) {
|
|
29
|
+
// get all x values of parent task
|
|
30
|
+
const xs = this.task.dependencies.map((dep) => {
|
|
31
|
+
return this._gantt.get_bar(dep).element.getX();
|
|
32
|
+
});
|
|
33
|
+
// child task must not go before parent
|
|
34
|
+
const valid_x = xs.reduce((prev, curr) => {
|
|
35
|
+
return x >= curr;
|
|
36
|
+
}, x);
|
|
37
|
+
if (!valid_x) {
|
|
38
|
+
width = null;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this._updateAttr(bar, "x", x);
|
|
42
|
+
}
|
|
43
|
+
if (width && width >= this._gantt.options.columnWidth) {
|
|
44
|
+
this._updateAttr(bar, "width", width);
|
|
45
|
+
}
|
|
46
|
+
this._updateLabelPosition();
|
|
47
|
+
this._updateArrowPosition();
|
|
48
|
+
}
|
|
49
|
+
dateChanged() {
|
|
50
|
+
let changed = false;
|
|
51
|
+
const { newStartDate, newEndDate } = this._computeStartEndDate();
|
|
52
|
+
if (this.task.start !== newStartDate) {
|
|
53
|
+
changed = true;
|
|
54
|
+
this.task.start = newStartDate;
|
|
55
|
+
}
|
|
56
|
+
if (this.task.end !== newEndDate) {
|
|
57
|
+
changed = true;
|
|
58
|
+
this.task.end = newEndDate;
|
|
59
|
+
}
|
|
60
|
+
if (changed) {
|
|
61
|
+
this._gantt.trigger_event("onDateChange", [
|
|
62
|
+
this.task,
|
|
63
|
+
newStartDate,
|
|
64
|
+
DateUtils.add(newEndDate, -1, "second"),
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
;
|
|
68
|
+
}
|
|
69
|
+
setActionCompleted() {
|
|
70
|
+
this._actionCompleted = true;
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
this._actionCompleted = false;
|
|
73
|
+
}, 1000);
|
|
74
|
+
}
|
|
75
|
+
_setDefaults(gantt, task) {
|
|
76
|
+
this._actionCompleted = false;
|
|
77
|
+
this._gantt = gantt;
|
|
78
|
+
this._task = task;
|
|
79
|
+
}
|
|
80
|
+
_prepare() {
|
|
81
|
+
this._prepareValues();
|
|
82
|
+
this._prepareHelpers();
|
|
83
|
+
}
|
|
84
|
+
_prepareValues() {
|
|
85
|
+
this._invalid = this.task.invalid;
|
|
86
|
+
this._height = this._gantt.options.barHeight;
|
|
87
|
+
this._x = this._computeX();
|
|
88
|
+
this._y = this._computeY();
|
|
89
|
+
this._cornerRadius = this._gantt.options.barCornerRadius;
|
|
90
|
+
this._duration = DateUtils.diff(this.task.end, this.task.start, "minute") / this._gantt.options.step / 60.0;
|
|
91
|
+
this._width = this._gantt.options.columnWidth * this._duration;
|
|
92
|
+
this._group = createSVG("g", {
|
|
93
|
+
class: "bar-wrapper " + (this.task.custom_class || ""),
|
|
94
|
+
"data-id": this.task.id,
|
|
95
|
+
});
|
|
96
|
+
this._barGroup = createSVG("g", {
|
|
97
|
+
class: "bar-group",
|
|
98
|
+
append_to: this.group,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
_prepareHelpers() {
|
|
102
|
+
SVGElement.prototype.getX = function () {
|
|
103
|
+
return +this.getAttribute("x");
|
|
104
|
+
};
|
|
105
|
+
SVGElement.prototype.getY = function () {
|
|
106
|
+
return +this.getAttribute("y");
|
|
107
|
+
};
|
|
108
|
+
SVGElement.prototype.getWidth = function () {
|
|
109
|
+
return +this.getAttribute("width");
|
|
110
|
+
};
|
|
111
|
+
SVGElement.prototype.getHeight = function () {
|
|
112
|
+
return +this.getAttribute("height");
|
|
113
|
+
};
|
|
114
|
+
SVGElement.prototype.getEndX = function () {
|
|
115
|
+
return this.getX() + this.getWidth();
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
_draw() {
|
|
119
|
+
this._drawBar();
|
|
120
|
+
this._drawLabel();
|
|
121
|
+
}
|
|
122
|
+
_drawBar() {
|
|
123
|
+
this._element = createSVG("rect", {
|
|
124
|
+
x: this._x,
|
|
125
|
+
y: this._y,
|
|
126
|
+
width: this._width,
|
|
127
|
+
height: this._height,
|
|
128
|
+
rx: this._cornerRadius,
|
|
129
|
+
ry: this._cornerRadius,
|
|
130
|
+
class: "bar",
|
|
131
|
+
append_to: this._barGroup,
|
|
132
|
+
fill: this.task.color,
|
|
133
|
+
});
|
|
134
|
+
animateSVG(this.element, "width", 0, this._width);
|
|
135
|
+
if (this._invalid) {
|
|
136
|
+
this.element.classList.add("bar-invalid");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
_drawLabel() {
|
|
140
|
+
createSVG("text", {
|
|
141
|
+
x: this._x + this._width / 2,
|
|
142
|
+
y: this._y + this._height / 2,
|
|
143
|
+
innerHTML: this.task.showTaskName ? this.task.name : "",
|
|
144
|
+
class: "bar-label",
|
|
145
|
+
append_to: this._barGroup,
|
|
146
|
+
});
|
|
147
|
+
// labels get BBox in the next tick
|
|
148
|
+
requestAnimationFrame(() => this._updateLabelPosition());
|
|
149
|
+
}
|
|
150
|
+
_bind() {
|
|
151
|
+
if (!this._invalid) {
|
|
152
|
+
this._setupClickEvent();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
_setupClickEvent() {
|
|
156
|
+
$.on(this.group, "focus " + this._gantt.options.popupTrigger, (e) => {
|
|
157
|
+
// just finished a move action, wait for a few seconds
|
|
158
|
+
if (!this._actionCompleted) {
|
|
159
|
+
this._showPopup();
|
|
160
|
+
this._gantt.unselect_all();
|
|
161
|
+
this.group.classList.add("active");
|
|
162
|
+
}
|
|
163
|
+
}, null);
|
|
164
|
+
$.on(this.group, "dblclick", (e) => {
|
|
165
|
+
// just finished a move action, wait for a few seconds
|
|
166
|
+
if (!this._actionCompleted) {
|
|
167
|
+
this._gantt.trigger_event("onClick", [this.task]);
|
|
168
|
+
}
|
|
169
|
+
}, null);
|
|
170
|
+
}
|
|
171
|
+
_showPopup() {
|
|
172
|
+
if (this._gantt.bar_being_dragged) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const formatString = this._gantt.view_is(ViewMode.Hour)
|
|
176
|
+
? "HH:ss"
|
|
177
|
+
: "MMM D";
|
|
178
|
+
const start_date = DateUtils.format(this.task.start, formatString, this._gantt.options.language);
|
|
179
|
+
const end_date = DateUtils.format(DateUtils.add(this.task.end, -1, "second"), formatString, this._gantt.options.language);
|
|
180
|
+
const subtitle = start_date + " - " + end_date;
|
|
181
|
+
this._gantt.show_popup({
|
|
182
|
+
target_element: this.element,
|
|
183
|
+
title: this.task.name,
|
|
184
|
+
subtitle: subtitle,
|
|
185
|
+
task: this.task,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
_computeStartEndDate() {
|
|
189
|
+
const bar = this.element;
|
|
190
|
+
const xInUnits = bar.getX() / this._gantt.options.columnWidth;
|
|
191
|
+
const newStartDate = DateUtils.add(this._gantt.minDate, xInUnits * this._gantt.options.step, "hour");
|
|
192
|
+
const width_in_units = bar.getWidth() / this._gantt.options.columnWidth;
|
|
193
|
+
const newEndDate = DateUtils.add(newStartDate, width_in_units * this._gantt.options.step, "hour");
|
|
194
|
+
return { newStartDate, newEndDate };
|
|
195
|
+
}
|
|
196
|
+
_computeX() {
|
|
197
|
+
const { step, columnWidth } = this._gantt.options;
|
|
198
|
+
const diff = DateUtils.diff(this.task.start, this._gantt.minDate, "hour");
|
|
199
|
+
let x = (diff / step) * columnWidth;
|
|
200
|
+
if (this._gantt.view_is(ViewMode.Month)) {
|
|
201
|
+
const diff = DateUtils.diff(this.task.start, this._gantt.minDate, "day");
|
|
202
|
+
x = (diff * columnWidth) / 30;
|
|
203
|
+
}
|
|
204
|
+
return x;
|
|
205
|
+
}
|
|
206
|
+
_computeY() {
|
|
207
|
+
return (this._gantt.options.headerHeight +
|
|
208
|
+
this._gantt.options.padding +
|
|
209
|
+
this.task._index * (this._height + this._gantt.options.padding));
|
|
210
|
+
}
|
|
211
|
+
_updateAttr(element, attr, value) {
|
|
212
|
+
value = +value;
|
|
213
|
+
if (!isNaN(value)) {
|
|
214
|
+
element.setAttribute(attr, value);
|
|
215
|
+
}
|
|
216
|
+
return element;
|
|
217
|
+
}
|
|
218
|
+
_updateLabelPosition() {
|
|
219
|
+
const bar = this.element, label = this.group.querySelector(".bar-label");
|
|
220
|
+
if (label.getBBox().width > bar.getWidth()) {
|
|
221
|
+
label.classList.add("big");
|
|
222
|
+
label.setAttribute("x", bar.getX() + bar.getWidth() + 5);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
label.classList.remove("big");
|
|
226
|
+
label.setAttribute("x", bar.getX() + bar.getWidth() / 2);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
_updateArrowPosition() {
|
|
230
|
+
this._arrows = this._arrows || [];
|
|
231
|
+
for (let arrow of this._arrows) {
|
|
232
|
+
arrow.update();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvZ2FudHQvY29tcG9uZW50cy9nYW50dC9iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1sRCxNQUFNLE9BQU8sR0FBRztJQXFDWixZQUFZLEtBQVUsRUFBRSxJQUFTO1FBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQXpCRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLE1BQWU7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQVNNLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBTztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3pCLElB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QUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUQ7YUFBTTtZQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzVCLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNsQjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gJy4vdXRpbHMvZGF0ZS11dGlscyc7XG5pbXBvcnQgeyAkLCBjcmVhdGVTVkcsIGFuaW1hdGVTVkcgfSBmcm9tICcuL3V0aWxzL3N2Zy11dGlscyc7XG5pbXBvcnQgeyBWaWV3TW9kZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvdmlldy1tb2RlXCI7XG5cbmltcG9ydCB7IEdhbnR0IH0gZnJvbSBcIi4vZ2FudHRcIjtcbmltcG9ydCB7IEVucmljaGVkVGFzayB9IGZyb20gXCIuLi8uLi9tb2RlbHMvdGFza1wiO1xuaW1wb3J0IHsgQXJyb3cgfSBmcm9tIFwiLi9hcnJvd1wiO1xuXG5leHBvcnQgY2xhc3MgQmFyIHtcbiAgICBwcml2YXRlIF9hY3Rpb25Db21wbGV0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZ2FudHQ6IEdhbnR0O1xuICAgIHByaXZhdGUgX2ludmFsaWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3k6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jb3JuZXJSYWRpdXM6IG51bWJlcjtcbiAgICBwcml2YXRlIF9kdXJhdGlvbjogbnVtYmVyO1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfYmFyR3JvdXA6IGFueTtcblxuICAgIHByaXZhdGUgX2Fycm93czogQXJyb3dbXTtcbiAgICBwcml2YXRlIF9ncm91cDogYW55O1xuICAgIHByaXZhdGUgX3Rhc2s6IEVucmljaGVkVGFzaztcbiAgICBwcml2YXRlIF9lbGVtZW50OiBhbnk7XG5cbiAgICBwdWJsaWMgZ2V0IGFycm93cygpOiBBcnJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fycm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFycm93cyhhcnJvd3M6IEFycm93W10pIHtcbiAgICAgICAgdGhpcy5fYXJyb3dzID0gYXJyb3dzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFzaygpOiBFbnJpY2hlZFRhc2sge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihnYW50dDogYW55LCB0YXNrOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdHMoZ2FudHQsIHRhc2spO1xuICAgICAgICB0aGlzLl9wcmVwYXJlKCk7XG4gICAgICAgIHRoaXMuX2RyYXcoKTtcbiAgICAgICAgdGhpcy5fYmluZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVCYXJQb3NpdGlvbih7IHgsIHdpZHRoIH06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBiYXIgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAvLyBnZXQgYWxsIHggdmFsdWVzIG9mIHBhcmVudCB0YXNrXG4gICAgICAgICAgICBjb25zdCB4cyA9IHRoaXMudGFzay5kZXBlbmRlbmNpZXMubWFwKChkZXA6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nYW50dC5nZXRfYmFyKGRlcCkuZWxlbWVudC5nZXRYKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNoaWxkIHRhc2sgbXVzdCBub3QgZ28gYmVmb3JlIHBhcmVudFxuICAgICAgICAgICAgY29uc3QgdmFsaWRfeCA9IHhzLnJlZHVjZSgocHJldjogYW55LCBjdXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geCA+PSBjdXJyO1xuICAgICAgICAgICAgfSwgeCk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkX3gpIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXR0cihiYXIsIFwieFwiLCB4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkdGggJiYgd2lkdGggPj0gdGhpcy5fZ2FudHQub3B0aW9ucy5jb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXR0cihiYXIsIFwid2lkdGhcIiwgd2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxhYmVsUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQXJyb3dQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkYXRlQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgeyBuZXdTdGFydERhdGUsIG5ld0VuZERhdGUgfSA9IHRoaXMuX2NvbXB1dGVTdGFydEVuZERhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy50YXNrLnN0YXJ0ICE9PSBuZXdTdGFydERhdGUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50YXNrLnN0YXJ0ID0gbmV3U3RhcnREYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudGFzay5lbmQgIT09IG5ld0VuZERhdGUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50YXNrLmVuZCA9IG5ld0VuZERhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQudHJpZ2dlcl9ldmVudChcIm9uRGF0ZUNoYW5nZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrLFxuICAgICAgICAgICAgICAgIG5ld1N0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICBEYXRlVXRpbHMuYWRkKG5ld0VuZERhdGUsIC0xLCBcInNlY29uZFwiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBY3Rpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2FjdGlvbkNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldERlZmF1bHRzKGdhbnR0OiBhbnksIHRhc2s6IGFueSkge1xuICAgICAgICB0aGlzLl9hY3Rpb25Db21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZ2FudHQgPSBnYW50dDtcbiAgICAgICAgdGhpcy5fdGFzayA9IHRhc2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZSgpIHtcbiAgICAgICAgdGhpcy5fcHJlcGFyZVZhbHVlcygpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlSGVscGVycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVWYWx1ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ludmFsaWQgPSB0aGlzLnRhc2suaW52YWxpZDtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJIZWlnaHQ7XG4gICAgICAgIHRoaXMuX3ggPSB0aGlzLl9jb21wdXRlWCgpO1xuICAgICAgICB0aGlzLl95ID0gdGhpcy5fY29tcHV0ZVkoKTtcbiAgICAgICAgdGhpcy5fY29ybmVyUmFkaXVzID0gdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJDb3JuZXJSYWRpdXM7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gRGF0ZVV0aWxzLmRpZmYodGhpcy50YXNrLmVuZCwgdGhpcy50YXNrLnN0YXJ0LCBcIm1pbnV0ZVwiKSAvIHRoaXMuX2dhbnR0Lm9wdGlvbnMuc3RlcCAvIDYwLjA7XG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5fZ2FudHQub3B0aW9ucy5jb2x1bW5XaWR0aCAqIHRoaXMuX2R1cmF0aW9uO1xuICAgICAgICB0aGlzLl9ncm91cCA9IGNyZWF0ZVNWRyhcImdcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFwiYmFyLXdyYXBwZXIgXCIgKyAodGhpcy50YXNrLmN1c3RvbV9jbGFzcyB8fCBcIlwiKSxcbiAgICAgICAgICAgIFwiZGF0YS1pZFwiOiB0aGlzLnRhc2suaWQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9iYXJHcm91cCA9IGNyZWF0ZVNWRyhcImdcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFwiYmFyLWdyb3VwXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuZ3JvdXAsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVIZWxwZXJzKCk6IHZvaWQge1xuICAgICAgICAoU1ZHRWxlbWVudC5wcm90b3R5cGUgYXMgYW55KS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzLmdldEF0dHJpYnV0ZShcInhcIik7XG4gICAgICAgIH07XG4gICAgICAgIChTVkdFbGVtZW50LnByb3RvdHlwZSBhcyBhbnkpLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuZ2V0QXR0cmlidXRlKFwieVwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgKFNWR0VsZW1lbnQucHJvdG90eXBlIGFzIGFueSkuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuZ2V0QXR0cmlidXRlKFwid2lkdGhcIik7XG4gICAgICAgIH07XG4gICAgICAgIChTVkdFbGVtZW50LnByb3RvdHlwZSBhcyBhbnkpLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiArdGhpcy5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIik7XG4gICAgICAgIH07XG4gICAgICAgIChTVkdFbGVtZW50LnByb3RvdHlwZSBhcyBhbnkpLmdldEVuZFggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLmdldFdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZHJhd0JhcigpO1xuICAgICAgICB0aGlzLl9kcmF3TGFiZWwoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kcmF3QmFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICB4OiB0aGlzLl94LFxuICAgICAgICAgICAgeTogdGhpcy5feSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5faGVpZ2h0LFxuICAgICAgICAgICAgcng6IHRoaXMuX2Nvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIHJ5OiB0aGlzLl9jb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjbGFzczogXCJiYXJcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5fYmFyR3JvdXAsXG4gICAgICAgICAgICBmaWxsOiB0aGlzLnRhc2suY29sb3IsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFuaW1hdGVTVkcodGhpcy5lbGVtZW50LCBcIndpZHRoXCIsIDAsIHRoaXMuX3dpZHRoKTtcblxuICAgICAgICBpZiAodGhpcy5faW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJiYXItaW52YWxpZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2RyYXdMYWJlbCgpOiB2b2lkIHtcbiAgICAgICAgY3JlYXRlU1ZHKFwidGV4dFwiLCB7XG4gICAgICAgICAgICB4OiB0aGlzLl94ICsgdGhpcy5fd2lkdGggLyAyLFxuICAgICAgICAgICAgeTogdGhpcy5feSArIHRoaXMuX2hlaWdodCAvIDIsXG4gICAgICAgICAgICBpbm5lckhUTUw6IHRoaXMudGFzay5zaG93VGFza05hbWUgPyB0aGlzLnRhc2submFtZSA6IFwiXCIsXG4gICAgICAgICAgICBjbGFzczogXCJiYXItbGFiZWxcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5fYmFyR3JvdXAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBsYWJlbHMgZ2V0IEJCb3ggaW4gdGhlIG5leHQgdGlja1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fdXBkYXRlTGFiZWxQb3NpdGlvbigpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9iaW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2ludmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwQ2xpY2tFdmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0dXBDbGlja0V2ZW50KCk6IHZvaWQge1xuICAgICAgICAkLm9uKHRoaXMuZ3JvdXAsIFwiZm9jdXMgXCIgKyB0aGlzLl9nYW50dC5vcHRpb25zLnBvcHVwVHJpZ2dlciwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8ganVzdCBmaW5pc2hlZCBhIG1vdmUgYWN0aW9uLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FjdGlvbkNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dQb3B1cCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dhbnR0LnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbnVsbCk7XG5cbiAgICAgICAgJC5vbih0aGlzLmdyb3VwLCBcImRibGNsaWNrXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIGp1c3QgZmluaXNoZWQgYSBtb3ZlIGFjdGlvbiwgd2FpdCBmb3IgYSBmZXcgc2Vjb25kc1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FjdGlvbkNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dhbnR0LnRyaWdnZXJfZXZlbnQoXCJvbkNsaWNrXCIsIFt0aGlzLnRhc2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd1BvcHVwKCkge1xuICAgICAgICBpZiAodGhpcy5fZ2FudHQuYmFyX2JlaW5nX2RyYWdnZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdFN0cmluZyA9IHRoaXMuX2dhbnR0LnZpZXdfaXMoVmlld01vZGUuSG91cilcbiAgICAgICAgICAgID8gXCJISDpzc1wiXG4gICAgICAgICAgICA6IFwiTU1NIERcIjtcblxuICAgICAgICBjb25zdCBzdGFydF9kYXRlID0gRGF0ZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgIHRoaXMudGFzay5zdGFydCxcbiAgICAgICAgICAgIGZvcm1hdFN0cmluZyxcbiAgICAgICAgICAgIHRoaXMuX2dhbnR0Lm9wdGlvbnMubGFuZ3VhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZW5kX2RhdGUgPSBEYXRlVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgRGF0ZVV0aWxzLmFkZCh0aGlzLnRhc2suZW5kLCAtMSwgXCJzZWNvbmRcIiksXG4gICAgICAgICAgICBmb3JtYXRTdHJpbmcsXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLmxhbmd1YWdlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN1YnRpdGxlID0gc3RhcnRfZGF0ZSArIFwiIC0gXCIgKyBlbmRfZGF0ZTtcblxuICAgICAgICB0aGlzLl9nYW50dC5zaG93X3BvcHVwKHtcbiAgICAgICAgICAgIHRhcmdldF9lbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50YXNrLm5hbWUsXG4gICAgICAgICAgICBzdWJ0aXRsZTogc3VidGl0bGUsXG4gICAgICAgICAgICB0YXNrOiB0aGlzLnRhc2ssXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbXB1dGVTdGFydEVuZERhdGUoKTogeyBuZXdTdGFydERhdGU6IERhdGUsIG5ld0VuZERhdGU6IERhdGUgfSB7XG4gICAgICAgIGNvbnN0IGJhciA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgY29uc3QgeEluVW5pdHMgPSBiYXIuZ2V0WCgpIC8gdGhpcy5fZ2FudHQub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgbmV3U3RhcnREYXRlID0gRGF0ZVV0aWxzLmFkZChcbiAgICAgICAgICAgIHRoaXMuX2dhbnR0Lm1pbkRhdGUsXG4gICAgICAgICAgICB4SW5Vbml0cyAqIHRoaXMuX2dhbnR0Lm9wdGlvbnMuc3RlcCxcbiAgICAgICAgICAgIFwiaG91clwiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoX2luX3VuaXRzID0gYmFyLmdldFdpZHRoKCkgLyB0aGlzLl9nYW50dC5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBuZXdFbmREYXRlID0gRGF0ZVV0aWxzLmFkZChcbiAgICAgICAgICAgIG5ld1N0YXJ0RGF0ZSxcbiAgICAgICAgICAgIHdpZHRoX2luX3VuaXRzICogdGhpcy5fZ2FudHQub3B0aW9ucy5zdGVwLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyBuZXdTdGFydERhdGUsIG5ld0VuZERhdGUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wdXRlWCgpIHtcbiAgICAgICAgY29uc3QgeyBzdGVwLCBjb2x1bW5XaWR0aCB9ID0gdGhpcy5fZ2FudHQub3B0aW9ucztcbiAgICAgICAgY29uc3QgZGlmZiA9IERhdGVVdGlscy5kaWZmKHRoaXMudGFzay5zdGFydCwgdGhpcy5fZ2FudHQubWluRGF0ZSwgXCJob3VyXCIpO1xuICAgICAgICBsZXQgeCA9IChkaWZmIC8gc3RlcCkgKiBjb2x1bW5XaWR0aDtcblxuICAgICAgICBpZiAodGhpcy5fZ2FudHQudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBEYXRlVXRpbHMuZGlmZih0aGlzLnRhc2suc3RhcnQsIHRoaXMuX2dhbnR0Lm1pbkRhdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgeCA9IChkaWZmICogY29sdW1uV2lkdGgpIC8gMzA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29tcHV0ZVkoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgK1xuICAgICAgICAgICAgdGhpcy50YXNrLl9pbmRleCAqICh0aGlzLl9oZWlnaHQgKyB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXR0cihlbGVtZW50OiBhbnksIGF0dHI6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91cGRhdGVMYWJlbFBvc2l0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBiYXIgPSB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICBsYWJlbCA9IHRoaXMuZ3JvdXAucXVlcnlTZWxlY3RvcihcIi5iYXItbGFiZWxcIik7XG5cbiAgICAgICAgaWYgKGxhYmVsLmdldEJCb3goKS53aWR0aCA+IGJhci5nZXRXaWR0aCgpKSB7XG4gICAgICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwiYmlnXCIpO1xuICAgICAgICAgICAgbGFiZWwuc2V0QXR0cmlidXRlKFwieFwiLCBiYXIuZ2V0WCgpICsgYmFyLmdldFdpZHRoKCkgKyA1KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJiaWdcIik7XG4gICAgICAgICAgICBsYWJlbC5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGJhci5nZXRYKCkgKyBiYXIuZ2V0V2lkdGgoKSAvIDIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXJyb3dQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXJyb3dzID0gdGhpcy5fYXJyb3dzIHx8IFtdO1xuICAgICAgICBmb3IgKGxldCBhcnJvdyBvZiB0aGlzLl9hcnJvd3MpIHtcbiAgICAgICAgICAgIGFycm93LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|