@gravitee/ui-components 3.24.5-renovate-github-markdown-css-5-x-6cd8067 → 3.25.1
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/assets/css/github-markdown-css/github-markdown.css +545 -500
- package/assets/i18n/en.json +3 -0
- package/assets/i18n/fr.json +3 -0
- package/assets/icons/design.svg +1 -1
- package/package.json +2 -9
- package/src/atoms/gv-autocomplete.js +132 -156
- package/src/atoms/gv-button.js +73 -248
- package/src/atoms/gv-checkbox.js +45 -103
- package/src/atoms/gv-date-picker-calendar.js +312 -393
- package/src/atoms/gv-date-picker-cell.js +57 -81
- package/src/atoms/gv-date-picker.js +180 -319
- package/src/atoms/gv-file-upload.js +85 -195
- package/src/atoms/gv-icon.js +13 -34
- package/src/atoms/gv-image.js +31 -66
- package/src/atoms/gv-input-message.js +12 -37
- package/src/atoms/gv-input.js +117 -148
- package/src/atoms/gv-link.js +47 -125
- package/src/atoms/gv-message.js +18 -69
- package/src/atoms/gv-metric.js +19 -68
- package/src/atoms/gv-relative-time.js +67 -38
- package/src/atoms/gv-select-native.js +96 -215
- package/src/atoms/gv-select.js +110 -230
- package/src/atoms/gv-spinner.js +5 -26
- package/src/atoms/gv-state.js +25 -66
- package/src/atoms/gv-switch.js +40 -160
- package/src/atoms/gv-tag.js +26 -78
- package/src/atoms/gv-text.js +22 -83
- package/src/charts/gv-chart-bar.js +22 -18
- package/src/charts/gv-chart-gauge.js +28 -31
- package/src/charts/gv-chart-histogram.js +18 -10
- package/src/charts/gv-chart-line.js +70 -59
- package/src/charts/gv-chart-map.js +44 -42
- package/src/charts/gv-chart-pie.js +18 -14
- package/src/index.js +1 -0
- package/src/lib/cron-expression.js +40 -35
- package/src/lib/date.js +10 -1
- package/src/lib/events.js +3 -1
- package/src/lib/http-client-schema-form.js +13 -12
- package/src/lib/http.js +57 -56
- package/src/lib/i18n.js +30 -22
- package/src/lib/item.js +13 -12
- package/src/lib/properties.js +77 -42
- package/src/lib/schema-form.js +4 -5
- package/src/lib/studio.js +13 -60
- package/src/lib/style.js +8 -8
- package/src/lib/text-format.js +14 -7
- package/src/lib/theme.js +8 -5
- package/src/lib/utils.js +17 -18
- package/src/mixins/chart-element.js +31 -54
- package/src/mixins/input-element.js +60 -47
- package/src/mixins/item-resource.js +34 -32
- package/src/mixins/keyboard-element.js +6 -5
- package/src/mixins/update-after-browser.js +4 -1
- package/src/mixins/with-resize-observer.js +23 -13
- package/src/mixins/with-skeleton-attribute.js +54 -48
- package/src/molecules/gv-card-full.js +26 -147
- package/src/molecules/gv-card-list.js +13 -42
- package/src/molecules/gv-card.js +17 -91
- package/src/molecules/gv-category-list.js +6 -17
- package/src/molecules/gv-category.js +23 -103
- package/src/molecules/gv-code.js +81 -143
- package/src/molecules/gv-confirm.js +41 -71
- package/src/molecules/gv-cron-editor.js +143 -389
- package/src/molecules/gv-dropdown-menu.js +14 -46
- package/src/molecules/gv-expandable.js +31 -59
- package/src/molecules/gv-expression-language.js +176 -138
- package/src/molecules/gv-identity-picture.js +42 -65
- package/src/molecules/gv-list.js +42 -134
- package/src/molecules/gv-metrics.js +37 -49
- package/src/molecules/gv-modal.js +28 -95
- package/src/molecules/gv-nav.js +49 -75
- package/src/molecules/gv-option.js +57 -130
- package/src/molecules/gv-plans.js +86 -209
- package/src/molecules/gv-popover.js +57 -177
- package/src/molecules/gv-promote.js +28 -146
- package/src/molecules/gv-rating-list.js +69 -195
- package/src/molecules/gv-rating.js +52 -105
- package/src/molecules/gv-row-expandable.js +5 -11
- package/src/molecules/gv-row.js +21 -147
- package/src/molecules/gv-stats.js +23 -48
- package/src/molecules/gv-stepper.js +43 -187
- package/src/molecules/gv-table.js +199 -309
- package/src/molecules/gv-tree.js +33 -156
- package/src/organisms/gv-documentation.js +45 -128
- package/src/organisms/gv-header.js +37 -195
- package/src/organisms/gv-http-client.js +32 -168
- package/src/organisms/gv-menu.js +37 -158
- package/src/organisms/gv-newsletter-subscription.js +48 -189
- package/src/organisms/gv-pagination.js +49 -77
- package/src/organisms/gv-properties.js +271 -492
- package/src/organisms/gv-resizable-views.js +41 -259
- package/src/organisms/gv-resources.js +168 -275
- package/src/organisms/gv-schema-form-array.js +49 -159
- package/src/organisms/gv-schema-form-control-object.js +59 -73
- package/src/organisms/gv-schema-form-control.js +107 -134
- package/src/organisms/gv-schema-form.js +219 -280
- package/src/organisms/gv-tabs.js +66 -98
- package/src/organisms/gv-user-menu.js +36 -201
- package/src/organisms/gv-vertical-menu.js +20 -61
- package/src/policy-studio/gv-flow-step.js +106 -245
- package/src/policy-studio/gv-flow.js +125 -304
- package/src/policy-studio/gv-policy-studio-menu.js +157 -471
- package/src/policy-studio/gv-policy-studio.js +714 -760
- package/src/styles/empty.js +3 -20
- package/src/styles/input.js +3 -247
- package/src/styles/link.js +3 -16
- package/src/styles/shapes.js +1 -0
- package/src/styles/skeleton.js +3 -37
- package/src/styles/zoom.js +3 -24
- package/src/theme/gv-theme.js +21 -60
- package/CHANGELOG.md +0 -1260
- package/LICENSE.txt +0 -202
- package/README.md +0 -195
- package/src/.eslintrc.js +0 -19
- package/src/theme/definition.json +0 -1762
|
@@ -14,31 +14,12 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import './gv-date-picker-cell';
|
|
17
|
-
import {
|
|
18
|
-
addDays,
|
|
19
|
-
addMonths,
|
|
20
|
-
addYears,
|
|
21
|
-
endOfMonth,
|
|
22
|
-
format,
|
|
23
|
-
getDay,
|
|
24
|
-
getMonth,
|
|
25
|
-
getYear,
|
|
26
|
-
isAfter,
|
|
27
|
-
isBefore,
|
|
28
|
-
parse,
|
|
29
|
-
setHours,
|
|
30
|
-
setMinutes,
|
|
31
|
-
startOfDay,
|
|
32
|
-
subMonths,
|
|
33
|
-
subYears,
|
|
34
|
-
} from 'date-fns';
|
|
17
|
+
import { addDays, addMonths, addYears, endOfMonth, format, getDay, getMonth, getYear, isAfter, isBefore, parse, setHours, setMinutes, startOfDay, subMonths, subYears } from 'date-fns';
|
|
35
18
|
import { classMap } from 'lit/directives/class-map';
|
|
36
19
|
import { dispatchCustomEvent } from '../lib/events';
|
|
37
20
|
import { i18n } from '../lib/i18n';
|
|
38
21
|
import { LitElement, css, html } from 'lit';
|
|
39
|
-
|
|
40
22
|
import { until } from 'lit/directives/until';
|
|
41
|
-
|
|
42
23
|
/**
|
|
43
24
|
* Date Picker Calendar
|
|
44
25
|
*
|
|
@@ -61,191 +42,108 @@ import { until } from 'lit/directives/until';
|
|
|
61
42
|
* @cssprop {Color} [--gv-date-picker-selected--bgc=var(--gv-theme-color, #5a7684)] - Selected background color
|
|
62
43
|
* @cssprop {Color} [--gv-date-picker-selected--c=var(--gv-theme-font-color-light, #ffffff)] - Selected color
|
|
63
44
|
*/
|
|
45
|
+
|
|
64
46
|
export class GvDatePickerCalendar extends LitElement {
|
|
65
47
|
static get properties() {
|
|
66
48
|
return {
|
|
67
|
-
dateFrom: {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
49
|
+
dateFrom: {
|
|
50
|
+
type: Number
|
|
51
|
+
},
|
|
52
|
+
dateTo: {
|
|
53
|
+
type: Number
|
|
54
|
+
},
|
|
55
|
+
disabledDates: {
|
|
56
|
+
type: Array
|
|
57
|
+
},
|
|
58
|
+
hoveredDate: {
|
|
59
|
+
type: Number
|
|
60
|
+
},
|
|
61
|
+
locale: {
|
|
62
|
+
type: Object
|
|
63
|
+
},
|
|
64
|
+
max: {
|
|
65
|
+
type: Number
|
|
66
|
+
},
|
|
67
|
+
min: {
|
|
68
|
+
type: Number
|
|
69
|
+
},
|
|
70
|
+
month: {
|
|
71
|
+
type: String
|
|
72
|
+
},
|
|
73
|
+
monthMode: {
|
|
74
|
+
type: Boolean
|
|
75
|
+
},
|
|
76
|
+
next: {
|
|
77
|
+
type: Boolean
|
|
78
|
+
},
|
|
79
|
+
prev: {
|
|
80
|
+
type: Boolean
|
|
81
|
+
},
|
|
82
|
+
range: {
|
|
83
|
+
type: Boolean
|
|
84
|
+
},
|
|
85
|
+
time: {
|
|
86
|
+
type: Boolean
|
|
87
|
+
},
|
|
88
|
+
small: {
|
|
89
|
+
type: Boolean,
|
|
90
|
+
reflect: true
|
|
91
|
+
},
|
|
92
|
+
strict: {
|
|
93
|
+
type: Boolean
|
|
94
|
+
},
|
|
95
|
+
year: {
|
|
96
|
+
type: String
|
|
97
|
+
},
|
|
98
|
+
yearMode: {
|
|
99
|
+
type: Boolean
|
|
100
|
+
},
|
|
101
|
+
_dayNamesOfWeek: {
|
|
102
|
+
type: Array,
|
|
103
|
+
attribute: false
|
|
104
|
+
},
|
|
105
|
+
_dimensions: {
|
|
106
|
+
type: Array,
|
|
107
|
+
attribute: false
|
|
108
|
+
},
|
|
109
|
+
_hasGoToday: {
|
|
110
|
+
type: Boolean,
|
|
111
|
+
attribute: false
|
|
112
|
+
},
|
|
113
|
+
_hour: {
|
|
114
|
+
type: Number,
|
|
115
|
+
attribute: false
|
|
116
|
+
},
|
|
117
|
+
_minute: {
|
|
118
|
+
type: Number,
|
|
119
|
+
attribute: false
|
|
120
|
+
},
|
|
121
|
+
_second: {
|
|
122
|
+
type: Number,
|
|
123
|
+
attribute: false
|
|
124
|
+
},
|
|
125
|
+
_monthsList: {
|
|
126
|
+
type: Array,
|
|
127
|
+
attribute: false
|
|
128
|
+
},
|
|
129
|
+
_locale: {
|
|
130
|
+
type: Object,
|
|
131
|
+
attribute: false
|
|
132
|
+
},
|
|
133
|
+
_from: {
|
|
134
|
+
type: Number,
|
|
135
|
+
attribute: false
|
|
136
|
+
},
|
|
137
|
+
_to: {
|
|
138
|
+
type: Number,
|
|
139
|
+
attribute: false
|
|
140
|
+
}
|
|
95
141
|
};
|
|
96
142
|
}
|
|
97
143
|
|
|
98
144
|
static get styles() {
|
|
99
|
-
return [
|
|
100
|
-
|
|
101
|
-
css`
|
|
102
|
-
:host {
|
|
103
|
-
display: block;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
:host > div {
|
|
107
|
-
overflow: hidden;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.nav,
|
|
111
|
-
.foot,
|
|
112
|
-
.nav-times {
|
|
113
|
-
display: flex;
|
|
114
|
-
padding: 0.5rem;
|
|
115
|
-
height: 30px;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.nav .current,
|
|
119
|
-
.foot {
|
|
120
|
-
flex: 1;
|
|
121
|
-
display: flex;
|
|
122
|
-
justify-content: center;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.monthName,
|
|
126
|
-
.day {
|
|
127
|
-
text-transform: capitalize;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
.foot-time {
|
|
131
|
-
justify-content: flex-end;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
.calendar-grid {
|
|
135
|
-
display: grid;
|
|
136
|
-
grid-template-columns: repeat(7, 1fr);
|
|
137
|
-
padding: 0.5rem 0.5rem 0 0.5rem;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
.calendar-grid-large {
|
|
141
|
-
grid-template-columns: repeat(3, 1fr);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
.header,
|
|
145
|
-
.content {
|
|
146
|
-
display: grid;
|
|
147
|
-
grid-template-columns: repeat(2, auto);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
gv-date-picker-cell {
|
|
151
|
-
height: 32px;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
.calendar-grid-large gv-date-picker-cell {
|
|
155
|
-
height: 48px;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
.calendar-grid,
|
|
159
|
-
.foot,
|
|
160
|
-
.time {
|
|
161
|
-
border-top: 1px solid var(--gv-theme-neutral-color-dark);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
.nav-times {
|
|
165
|
-
justify-content: center;
|
|
166
|
-
align-items: center;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.nav-times,
|
|
170
|
-
.time {
|
|
171
|
-
border-left: 1px solid var(--gv-theme-neutral-color-dark);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.day {
|
|
175
|
-
height: 32px;
|
|
176
|
-
width: 33px;
|
|
177
|
-
margin: 0;
|
|
178
|
-
padding: 0;
|
|
179
|
-
display: flex;
|
|
180
|
-
justify-content: center;
|
|
181
|
-
align-items: center;
|
|
182
|
-
font-size: 12px;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
:host([small]) .day {
|
|
186
|
-
height: 25px;
|
|
187
|
-
width: 26px;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
.box-col,
|
|
191
|
-
.times {
|
|
192
|
-
display: flex;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.box-col {
|
|
196
|
-
flex-direction: column;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
.box-col:first-of-type {
|
|
200
|
-
width: 260px;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
:host([small]) .box-col:first-of-type {
|
|
204
|
-
width: 195px;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
.box {
|
|
208
|
-
display: flex;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.times {
|
|
212
|
-
max-height: 235px;
|
|
213
|
-
flex-direction: row;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
.time {
|
|
217
|
-
scroll-behavior: smooth;
|
|
218
|
-
overflow-x: auto;
|
|
219
|
-
min-width: 50px;
|
|
220
|
-
width: 100%;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.time > div {
|
|
224
|
-
height: 32px;
|
|
225
|
-
display: flex;
|
|
226
|
-
justify-content: center;
|
|
227
|
-
align-items: center;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
:host([small]) .time > div {
|
|
231
|
-
height: 25px;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
.time > div:hover {
|
|
235
|
-
background: var(--gv-date-picker-hover--bgc, var(--gv-theme-color-light, #86c3d0));
|
|
236
|
-
color: var(--gv-date-picker-hover--c, var(--gv-theme-font-color-dark, #262626));
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
.time > div.selected {
|
|
240
|
-
background: var(--gv-date-picker-selected--bgc, var(--gv-theme-color, #5a7684));
|
|
241
|
-
color: var(--gv-date-picker-selected--c, var(--gv-theme-font-color-light, #ffffff));
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.time > div.disabled {
|
|
245
|
-
opacity: 0.4;
|
|
246
|
-
}
|
|
247
|
-
`,
|
|
248
|
-
];
|
|
145
|
+
return [// language=CSS
|
|
146
|
+
css`:host{display:block}:host>div{overflow:hidden}.foot,.nav,.nav-times{display:flex;padding:.5rem;height:30px}.foot,.nav .current{flex:1;display:flex;justify-content:center}.day,.monthName{text-transform:capitalize}.foot-time{justify-content:flex-end}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);padding:.5rem .5rem 0 .5rem}.calendar-grid-large{grid-template-columns:repeat(3,1fr)}.content,.header{display:grid;grid-template-columns:repeat(2,auto)}gv-date-picker-cell{height:32px}.calendar-grid-large gv-date-picker-cell{height:48px}.calendar-grid,.foot,.time{border-top:1px solid var(--gv-theme-neutral-color-dark)}.nav-times{justify-content:center;align-items:center}.nav-times,.time{border-left:1px solid var(--gv-theme-neutral-color-dark)}.day{height:32px;width:33px;margin:0;padding:0;display:flex;justify-content:center;align-items:center;font-size:12px}:host([small]) .day{height:25px;width:26px}.box-col,.times{display:flex}.box-col{flex-direction:column}.box-col:first-of-type{width:260px}:host([small]) .box-col:first-of-type{width:195px}.box{display:flex}.times{max-height:235px;flex-direction:row}.time{scroll-behavior:smooth;overflow-x:auto;min-width:50px;width:100%}.time>div{height:32px;display:flex;justify-content:center;align-items:center}:host([small]) .time>div{height:25px}.time>div:hover{background:var(--gv-date-picker-hover--bgc,var(--gv-theme-color-light,#86c3d0));color:var(--gv-date-picker-hover--c,var(--gv-theme-font-color-dark,#262626))}.time>div.selected{background:var(--gv-date-picker-selected--bgc,var(--gv-theme-color,#5a7684));color:var(--gv-date-picker-selected--c,var(--gv-theme-font-color-light,#fff))}.time>div.disabled{opacity:.4}`];
|
|
249
147
|
}
|
|
250
148
|
|
|
251
149
|
constructor() {
|
|
@@ -255,7 +153,6 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
255
153
|
this.range = false;
|
|
256
154
|
this.currentDate = parseInt(format(startOfDay(Date.now()), 't'), 10);
|
|
257
155
|
this._hasGoToday = true;
|
|
258
|
-
|
|
259
156
|
this._hours = this.computeArrayOfTime(24);
|
|
260
157
|
this._minutes = this.computeArrayOfTime(60);
|
|
261
158
|
this._seconds = this.computeArrayOfTime(60);
|
|
@@ -263,10 +160,12 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
263
160
|
|
|
264
161
|
set dateFrom(value) {
|
|
265
162
|
this._from = value;
|
|
163
|
+
|
|
266
164
|
if (this.time && this._from) {
|
|
267
165
|
const date = new Date(this._from * 1000);
|
|
268
166
|
this._hour = format(date, 'HH');
|
|
269
167
|
this._minute = format(date, 'mm');
|
|
168
|
+
|
|
270
169
|
if (this.isStrictTime()) {
|
|
271
170
|
this._second = format(date, 'ss');
|
|
272
171
|
}
|
|
@@ -280,78 +179,35 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
280
179
|
computeArrayOfTime(size) {
|
|
281
180
|
return new Array(size).fill('').map((a, i) => {
|
|
282
181
|
let time = i.toString();
|
|
182
|
+
|
|
283
183
|
if (time.length === 1) {
|
|
284
184
|
time = `0${time}`;
|
|
285
185
|
}
|
|
186
|
+
|
|
286
187
|
return time;
|
|
287
188
|
});
|
|
288
189
|
}
|
|
289
190
|
|
|
290
191
|
_renderPreviousNav() {
|
|
291
192
|
if (this.prev || this.monthMode || this.yearMode) {
|
|
292
|
-
return html`
|
|
293
|
-
<gv-button link icon="navigation:angle-double-left" @click="${this._onPrevYear}" ?small="${this.small}"></gv-button>
|
|
294
|
-
${this.monthMode || this.yearMode
|
|
295
|
-
? ''
|
|
296
|
-
: html`<gv-button link icon="navigation:angle-left" ?small="${this.small}" @click="${this._onPrevMonth}"></gv-button>`}
|
|
297
|
-
`;
|
|
193
|
+
return html` <gv-button link icon="navigation:angle-double-left" @click="${this._onPrevYear}" ?small="${this.small}"></gv-button> ${this.monthMode || this.yearMode ? '' : html`<gv-button link icon="navigation:angle-left" ?small="${this.small}" @click="${this._onPrevMonth}"></gv-button>`} `;
|
|
298
194
|
}
|
|
195
|
+
|
|
299
196
|
return '';
|
|
300
197
|
}
|
|
301
198
|
|
|
302
199
|
_renderCurrentNav() {
|
|
303
|
-
return html`
|
|
304
|
-
<div class="current">
|
|
305
|
-
${this.yearMode
|
|
306
|
-
? ''
|
|
307
|
-
: html`<gv-button link @click="${this._onSelectMonth}" ?small="${this.small}"
|
|
308
|
-
><span class="monthName">${until(this.computeName(this.month, this.year))}</span></gv-button
|
|
309
|
-
>`}
|
|
310
|
-
<gv-button ?small="${this.small}" link @click="${this._onSelectYear}">${this.computeCurrentYearName()}</gv-button>
|
|
311
|
-
</div>
|
|
312
|
-
`;
|
|
200
|
+
return html` <div class="current"> ${this.yearMode ? '' : html`<gv-button link @click="${this._onSelectMonth}" ?small="${this.small}"><span class="monthName">${until(this.computeName(this.month, this.year))}</span></gv-button>`} <gv-button ?small="${this.small}" link @click="${this._onSelectYear}">${this.computeCurrentYearName()}</gv-button> </div> `;
|
|
313
201
|
}
|
|
314
202
|
|
|
315
203
|
_renderNextNav() {
|
|
316
204
|
if (this.next || this.monthMode || this.yearMode) {
|
|
317
|
-
return html`
|
|
318
|
-
${this.monthMode || this.yearMode
|
|
319
|
-
? ''
|
|
320
|
-
: html`<gv-button link icon="navigation:angle-right" ?small="${this.small}" @click="${this._onNextMonth}"></gv-button>`}
|
|
321
|
-
<gv-button ?small="${this.small}" link icon="navigation:angle-double-right" @click="${this._onNextYear}"></gv-button>
|
|
322
|
-
`;
|
|
205
|
+
return html` ${this.monthMode || this.yearMode ? '' : html`<gv-button link icon="navigation:angle-right" ?small="${this.small}" @click="${this._onNextMonth}"></gv-button>`} <gv-button ?small="${this.small}" link icon="navigation:angle-double-right" @click="${this._onNextYear}"></gv-button> `;
|
|
323
206
|
}
|
|
324
207
|
}
|
|
325
208
|
|
|
326
209
|
_renderDays() {
|
|
327
|
-
return html` ${this._dayNamesOfWeek && this._dayNamesOfWeek.map(
|
|
328
|
-
${this._dimensions &&
|
|
329
|
-
this._dimensions.map(
|
|
330
|
-
(dimension) =>
|
|
331
|
-
html`${dimension &&
|
|
332
|
-
dimension.map(
|
|
333
|
-
(data) => html` <div>
|
|
334
|
-
${data
|
|
335
|
-
? html`
|
|
336
|
-
<gv-date-picker-cell
|
|
337
|
-
.disabledDates="${this.disabledDates}"
|
|
338
|
-
.min="${this.monthMode || this.yearMode ? null : this.min}"
|
|
339
|
-
.max="${this.monthMode || this.yearMode ? null : this.max}"
|
|
340
|
-
.month="${this.month}"
|
|
341
|
-
.hoveredDate="${this.hoveredDate}"
|
|
342
|
-
.dateTo="${this._to}"
|
|
343
|
-
.dateFrom="${this._from}"
|
|
344
|
-
.data="${data}"
|
|
345
|
-
.time="${this.time}"
|
|
346
|
-
?isCurrent="${this.isCurrentDate(data)}"
|
|
347
|
-
@gv-date-picker-cell:hover="${this._onHover}"
|
|
348
|
-
@gv-date-picker-cell:select="${this._onSelect}"
|
|
349
|
-
></gv-date-picker-cell>
|
|
350
|
-
`
|
|
351
|
-
: null}
|
|
352
|
-
</div>`,
|
|
353
|
-
)}`,
|
|
354
|
-
)}`;
|
|
210
|
+
return html` ${this._dayNamesOfWeek && this._dayNamesOfWeek.map(dayNameOfWeek => html`<div class="day">${dayNameOfWeek}</div>`)} ${this._dimensions && this._dimensions.map(dimension => html`${dimension && dimension.map(data => html` <div> ${data ? html` <gv-date-picker-cell .disabledDates="${this.disabledDates}" .min="${this.monthMode || this.yearMode ? null : this.min}" .max="${this.monthMode || this.yearMode ? null : this.max}" .month="${this.month}" .hoveredDate="${this.hoveredDate}" .dateTo="${this._to}" .dateFrom="${this._from}" .data="${data}" .time="${this.time}" ?isCurrent="${this.isCurrentDate(data)}" @gv-date-picker-cell:hover="${this._onHover}" @gv-date-picker-cell:select="${this._onSelect}"></gv-date-picker-cell> ` : null} </div>`)}`)}`;
|
|
355
211
|
}
|
|
356
212
|
|
|
357
213
|
isStrictTime() {
|
|
@@ -361,99 +217,31 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
361
217
|
render() {
|
|
362
218
|
const classes = {
|
|
363
219
|
'calendar-grid': true,
|
|
364
|
-
'calendar-grid-large': this.monthMode || this.yearMode
|
|
220
|
+
'calendar-grid-large': this.monthMode || this.yearMode
|
|
365
221
|
};
|
|
366
|
-
return html`
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
${this._hours &&
|
|
380
|
-
this._hours.map(
|
|
381
|
-
(val) =>
|
|
382
|
-
html`<div
|
|
383
|
-
@click="${this._onSelectHour.bind(this, val)}"
|
|
384
|
-
class="${classMap({
|
|
385
|
-
hour: true,
|
|
386
|
-
selected: this._hour === val,
|
|
387
|
-
disabled: this.isHoursDisabled(val),
|
|
388
|
-
})}"
|
|
389
|
-
>
|
|
390
|
-
${val}
|
|
391
|
-
</div>`,
|
|
392
|
-
)}
|
|
393
|
-
</div>
|
|
394
|
-
<div class="time">
|
|
395
|
-
${this._minutes &&
|
|
396
|
-
this._minutes.map(
|
|
397
|
-
(val) =>
|
|
398
|
-
html`<div
|
|
399
|
-
@click="${this._onSelectMinute.bind(this, val)}"
|
|
400
|
-
class="${classMap({
|
|
401
|
-
minute: true,
|
|
402
|
-
selected: this._minute === val,
|
|
403
|
-
disabled: this.isMinutesDisabled(val),
|
|
404
|
-
})}"
|
|
405
|
-
>
|
|
406
|
-
${val}
|
|
407
|
-
</div>`,
|
|
408
|
-
)}
|
|
409
|
-
</div>
|
|
410
|
-
|
|
411
|
-
${this.isStrictTime()
|
|
412
|
-
? html`<div class="time">
|
|
413
|
-
${this._seconds &&
|
|
414
|
-
this._seconds.map(
|
|
415
|
-
(val) =>
|
|
416
|
-
html`<div
|
|
417
|
-
@click="${this._onSelectSecond.bind(this, val)}"
|
|
418
|
-
class="${classMap({
|
|
419
|
-
second: true,
|
|
420
|
-
selected: this._second === val,
|
|
421
|
-
disabled: this.isSecondsDisabled(val),
|
|
422
|
-
})}"
|
|
423
|
-
>
|
|
424
|
-
${val}
|
|
425
|
-
</div>`,
|
|
426
|
-
)}
|
|
427
|
-
</div>`
|
|
428
|
-
: ''}
|
|
429
|
-
</div>
|
|
430
|
-
</div>`
|
|
431
|
-
: ''}
|
|
432
|
-
</div>
|
|
433
|
-
${this.hasGoToday()
|
|
434
|
-
? html` <div class="foot">
|
|
435
|
-
<gv-button link @click=${this.goToday}>${i18n('gv-date-picker.today')}</gv-button>
|
|
436
|
-
</div>`
|
|
437
|
-
: ''}
|
|
438
|
-
${this.time && !this.monthMode && !this.yearMode
|
|
439
|
-
? html` <div class="foot foot-time">
|
|
440
|
-
<gv-button primary outlined small @click=${this._onNow}
|
|
441
|
-
>${this.isStrictTime() ? i18n('gv-date-picker.currentTime') : i18n('gv-date-picker.now')}</gv-button
|
|
442
|
-
>
|
|
443
|
-
<gv-button primary small @click=${this._onDateTimeSelected} .disabled="${this.disableValidation === true}"
|
|
444
|
-
>${i18n('gv-date-picker.ok')}</gv-button
|
|
445
|
-
>
|
|
446
|
-
</div>`
|
|
447
|
-
: ''}
|
|
448
|
-
`;
|
|
222
|
+
return html` <div class="box"> ${this.isStrictTime() ? '' : html`<div class="box-col"> <div class="nav">${this._renderPreviousNav()} ${this._renderCurrentNav()} ${this._renderNextNav()}</div> <div class="${classMap(classes)}">${this._renderDays()}</div> </div>`} ${this.time && !this.monthMode && !this.yearMode ? html`<div class="box-col"> ${this.isStrictTime() ? '' : html`<div class="nav-times">${this.getTime()}</div>`} <div class="times"> <div class="time"> ${this._hours && this._hours.map(val => html`<div @click="${this._onSelectHour.bind(this, val)}" class="${classMap({
|
|
223
|
+
hour: true,
|
|
224
|
+
selected: this._hour === val,
|
|
225
|
+
disabled: this.isHoursDisabled(val)
|
|
226
|
+
})}"> ${val} </div>`)} </div> <div class="time"> ${this._minutes && this._minutes.map(val => html`<div @click="${this._onSelectMinute.bind(this, val)}" class="${classMap({
|
|
227
|
+
minute: true,
|
|
228
|
+
selected: this._minute === val,
|
|
229
|
+
disabled: this.isMinutesDisabled(val)
|
|
230
|
+
})}"> ${val} </div>`)} </div> ${this.isStrictTime() ? html`<div class="time"> ${this._seconds && this._seconds.map(val => html`<div @click="${this._onSelectSecond.bind(this, val)}" class="${classMap({
|
|
231
|
+
second: true,
|
|
232
|
+
selected: this._second === val,
|
|
233
|
+
disabled: this.isSecondsDisabled(val)
|
|
234
|
+
})}"> ${val} </div>`)} </div>` : ''} </div> </div>` : ''} </div> ${this.hasGoToday() ? html` <div class="foot"> <gv-button link @click="${this.goToday}">${i18n('gv-date-picker.today')}</gv-button> </div>` : ''} ${this.time && !this.monthMode && !this.yearMode ? html` <div class="foot foot-time"> <gv-button primary outlined small @click="${this._onNow}">${this.isStrictTime() ? i18n('gv-date-picker.currentTime') : i18n('gv-date-picker.now')}</gv-button> <gv-button primary small @click="${this._onDateTimeSelected}" .disabled="${this.disableValidation === true}">${i18n('gv-date-picker.ok')}</gv-button> </div>` : ''} `;
|
|
449
235
|
}
|
|
450
236
|
|
|
451
237
|
isMinutesDisabled(value) {
|
|
452
238
|
if (this._from && this._hour != null) {
|
|
453
239
|
const selectedDate = new Date(this._from * 1000);
|
|
454
240
|
selectedDate.setHours(parseInt(this._hour, 10), parseInt(value, 10), 0, 0);
|
|
241
|
+
|
|
455
242
|
if (this.min) {
|
|
456
243
|
const minDate = new Date(this.min * 1000);
|
|
244
|
+
|
|
457
245
|
if (isBefore(selectedDate, minDate)) {
|
|
458
246
|
return true;
|
|
459
247
|
}
|
|
@@ -461,11 +249,13 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
461
249
|
|
|
462
250
|
if (this.max) {
|
|
463
251
|
const maxDate = new Date(this.max * 1000);
|
|
252
|
+
|
|
464
253
|
if (isAfter(selectedDate, maxDate)) {
|
|
465
254
|
return true;
|
|
466
255
|
}
|
|
467
256
|
}
|
|
468
257
|
}
|
|
258
|
+
|
|
469
259
|
return false;
|
|
470
260
|
}
|
|
471
261
|
|
|
@@ -473,8 +263,10 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
473
263
|
if (this._from && this._hour != null) {
|
|
474
264
|
const selectedDate = new Date(this._from * 1000);
|
|
475
265
|
selectedDate.setHours(parseInt(this._hour, 10), parseInt(value, 10), 0, 0);
|
|
266
|
+
|
|
476
267
|
if (this.min) {
|
|
477
268
|
const minDate = new Date(this.min * 1000);
|
|
269
|
+
|
|
478
270
|
if (isBefore(selectedDate, minDate)) {
|
|
479
271
|
return true;
|
|
480
272
|
}
|
|
@@ -482,11 +274,13 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
482
274
|
|
|
483
275
|
if (this.max) {
|
|
484
276
|
const maxDate = new Date(this.max * 1000);
|
|
277
|
+
|
|
485
278
|
if (isAfter(selectedDate, maxDate)) {
|
|
486
279
|
return true;
|
|
487
280
|
}
|
|
488
281
|
}
|
|
489
282
|
}
|
|
283
|
+
|
|
490
284
|
return false;
|
|
491
285
|
}
|
|
492
286
|
|
|
@@ -494,9 +288,11 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
494
288
|
if (this._from) {
|
|
495
289
|
const selectedDate = new Date(this._from * 1000);
|
|
496
290
|
selectedDate.setHours(parseInt(value, 10));
|
|
291
|
+
|
|
497
292
|
if (this.min) {
|
|
498
293
|
const minDate = new Date(this.min * 1000);
|
|
499
294
|
minDate.setMinutes(0, 0, 0);
|
|
295
|
+
|
|
500
296
|
if (selectedDate.getTime() < minDate.getTime()) {
|
|
501
297
|
return true;
|
|
502
298
|
}
|
|
@@ -504,11 +300,13 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
504
300
|
|
|
505
301
|
if (this.max) {
|
|
506
302
|
const maxDate = new Date(this.max * 1000);
|
|
303
|
+
|
|
507
304
|
if (selectedDate.getTime() > maxDate.getTime()) {
|
|
508
305
|
return true;
|
|
509
306
|
}
|
|
510
307
|
}
|
|
511
308
|
}
|
|
309
|
+
|
|
512
310
|
return false;
|
|
513
311
|
}
|
|
514
312
|
|
|
@@ -516,15 +314,16 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
516
314
|
setTimeout(() => {
|
|
517
315
|
if (!this._hour || this.isHoursDisabled(this._hour)) {
|
|
518
316
|
const hour = this.shadowRoot.querySelector('.hour:not(.disabled)');
|
|
317
|
+
|
|
519
318
|
if (hour) {
|
|
520
319
|
this._hour = hour.textContent;
|
|
521
320
|
}
|
|
522
321
|
}
|
|
523
322
|
}, 0);
|
|
524
|
-
|
|
525
323
|
setTimeout(() => {
|
|
526
324
|
if (!this._minute || this.isMinutesDisabled(this._minute)) {
|
|
527
325
|
const minute = this.shadowRoot.querySelector('.minute:not(.disabled)');
|
|
326
|
+
|
|
528
327
|
if (minute) {
|
|
529
328
|
this._minute = minute.textContent;
|
|
530
329
|
}
|
|
@@ -535,6 +334,7 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
535
334
|
setTimeout(() => {
|
|
536
335
|
if (!this._second || this.isSecondsDisabled(this._second)) {
|
|
537
336
|
const second = this.shadowRoot.querySelector('.second:not(.disabled)');
|
|
337
|
+
|
|
538
338
|
if (second) {
|
|
539
339
|
this._second = second.textContent;
|
|
540
340
|
}
|
|
@@ -547,6 +347,7 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
547
347
|
if (this._hour && this._minute) {
|
|
548
348
|
return `${this._hour}:${this._minute}`;
|
|
549
349
|
}
|
|
350
|
+
|
|
550
351
|
return '';
|
|
551
352
|
}
|
|
552
353
|
|
|
@@ -556,25 +357,25 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
556
357
|
} else if (this.monthMode) {
|
|
557
358
|
return getMonth(data.date * 1000) === getMonth(this.currentDate * 1000);
|
|
558
359
|
}
|
|
360
|
+
|
|
559
361
|
return data.date === this.currentDate;
|
|
560
362
|
}
|
|
561
363
|
|
|
562
364
|
updated(properties) {
|
|
563
365
|
if (properties.has('year')) {
|
|
564
|
-
this.dispatchEvent(new CustomEvent('year-changed', {
|
|
366
|
+
this.dispatchEvent(new CustomEvent('year-changed', {
|
|
367
|
+
detail: {
|
|
368
|
+
value: this.year
|
|
369
|
+
}
|
|
370
|
+
}));
|
|
565
371
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
properties.has('year') ||
|
|
569
|
-
properties.has('month') ||
|
|
570
|
-
properties.has('monthMode') ||
|
|
571
|
-
properties.has('yearMode')
|
|
572
|
-
) {
|
|
372
|
+
|
|
373
|
+
if (properties.has('locale') || properties.has('year') || properties.has('month') || properties.has('monthMode') || properties.has('yearMode')) {
|
|
573
374
|
this.yearAndMonthChanged(this.year, this.month);
|
|
574
375
|
}
|
|
575
376
|
|
|
576
377
|
if (properties.has('_hour') || properties.has('_minute')) {
|
|
577
|
-
this.shadowRoot.querySelectorAll('.selected').forEach(
|
|
378
|
+
this.shadowRoot.querySelectorAll('.selected').forEach(time => {
|
|
578
379
|
time.parentNode.scrollTop = time.offsetTop - time.parentNode.offsetTop;
|
|
579
380
|
});
|
|
580
381
|
}
|
|
@@ -582,9 +383,13 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
582
383
|
|
|
583
384
|
_updateDays() {
|
|
584
385
|
const dayNames = [];
|
|
386
|
+
|
|
585
387
|
for (let i = 0; i < 7; i += 1) {
|
|
586
|
-
dayNames.push(this.locale.localize.day(i, {
|
|
388
|
+
dayNames.push(this.locale.localize.day(i, {
|
|
389
|
+
width: 'short'
|
|
390
|
+
}));
|
|
587
391
|
}
|
|
392
|
+
|
|
588
393
|
const firstDayOfWeek = this.locale.options.weekStartsOn;
|
|
589
394
|
const tmp = dayNames.slice().splice(0, firstDayOfWeek);
|
|
590
395
|
this._dayNamesOfWeek = dayNames.slice().splice(firstDayOfWeek, dayNames.length).concat(tmp);
|
|
@@ -595,48 +400,59 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
595
400
|
if (this.yearMode) {
|
|
596
401
|
this._dayNamesOfWeek = [];
|
|
597
402
|
const cols = [null];
|
|
598
|
-
const {
|
|
403
|
+
const {
|
|
404
|
+
start,
|
|
405
|
+
end
|
|
406
|
+
} = this.getYearInterval(year);
|
|
407
|
+
|
|
599
408
|
for (let c = start; c < end; c++) {
|
|
600
409
|
const startDateString = `01/${month}/${c}`;
|
|
601
|
-
const startDateFn = parse(startDateString, 'dd/MM/yyyy', new Date(), {
|
|
410
|
+
const startDateFn = parse(startDateString, 'dd/MM/yyyy', new Date(), {
|
|
411
|
+
awareOfUnicodeTokens: true
|
|
412
|
+
});
|
|
602
413
|
cols.push({
|
|
603
414
|
hover: false,
|
|
604
415
|
date: parseInt(format(startDateFn, 't'), 10),
|
|
605
|
-
title: this.computeName(month, c, 'yyyy')
|
|
416
|
+
title: this.computeName(month, c, 'yyyy')
|
|
606
417
|
});
|
|
607
418
|
}
|
|
419
|
+
|
|
608
420
|
cols.push(null);
|
|
609
421
|
this._dimensions = [cols];
|
|
610
422
|
} else if (this.monthMode) {
|
|
611
423
|
this._dayNamesOfWeek = [];
|
|
612
|
-
this._dimensions = [
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
}
|
|
622
|
-
];
|
|
424
|
+
this._dimensions = [this._monthsList.map(month => {
|
|
425
|
+
const startDateString = `01/${month}/${year}`;
|
|
426
|
+
const startDateFn = parse(startDateString, 'dd/MM/yyyy', new Date(), {
|
|
427
|
+
awareOfUnicodeTokens: true
|
|
428
|
+
});
|
|
429
|
+
return {
|
|
430
|
+
hover: false,
|
|
431
|
+
date: parseInt(format(startDateFn, 't'), 10),
|
|
432
|
+
title: this.computeName(month, this.year, 'MMM')
|
|
433
|
+
};
|
|
434
|
+
})];
|
|
623
435
|
} else {
|
|
624
436
|
this._updateDays();
|
|
437
|
+
|
|
625
438
|
let monthMinus = month;
|
|
626
439
|
monthMinus = monthMinus.substring(monthMinus.length - 2);
|
|
627
440
|
let startDateString = `01/${monthMinus}/${year}`;
|
|
628
|
-
let startDateFn = parse(startDateString, 'dd/MM/yyyy', new Date(), {
|
|
441
|
+
let startDateFn = parse(startDateString, 'dd/MM/yyyy', new Date(), {
|
|
442
|
+
awareOfUnicodeTokens: true
|
|
443
|
+
});
|
|
629
444
|
const endDateFn = endOfMonth(startDateFn);
|
|
630
|
-
const endDateString = format(endDateFn, 'dd/MM/yyyy', {
|
|
631
|
-
|
|
445
|
+
const endDateString = format(endDateFn, 'dd/MM/yyyy', {
|
|
446
|
+
awareOfUnicodeTokens: true
|
|
447
|
+
});
|
|
632
448
|
const firstDayOfWeek = this.locale.options.weekStartsOn;
|
|
633
449
|
const rows = [];
|
|
634
450
|
let columns = [];
|
|
635
|
-
|
|
636
451
|
const lastDayOfWeek = 6;
|
|
637
452
|
|
|
638
453
|
while (startDateString !== endDateString) {
|
|
639
454
|
let dayNumberFn = getDay(startDateFn) - firstDayOfWeek;
|
|
455
|
+
|
|
640
456
|
if (dayNumberFn < 0) {
|
|
641
457
|
dayNumberFn = 6;
|
|
642
458
|
}
|
|
@@ -644,7 +460,9 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
644
460
|
const columnFn = {
|
|
645
461
|
hover: false,
|
|
646
462
|
date: parseInt(format(startDateFn, 't'), 10),
|
|
647
|
-
title: parseInt(format(startDateFn, 'd', {
|
|
463
|
+
title: parseInt(format(startDateFn, 'd', {
|
|
464
|
+
awareOfUnicodeTokens: true
|
|
465
|
+
}), 10)
|
|
648
466
|
};
|
|
649
467
|
columns.push(columnFn);
|
|
650
468
|
|
|
@@ -652,27 +470,35 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
652
470
|
for (let i = columns.length; i < lastDayOfWeek + 1; i += 1) {
|
|
653
471
|
columns.unshift(0);
|
|
654
472
|
}
|
|
473
|
+
|
|
655
474
|
rows.push(columns.slice());
|
|
656
475
|
columns = [];
|
|
657
476
|
}
|
|
658
477
|
|
|
659
478
|
startDateFn = addDays(startDateFn, 1);
|
|
660
|
-
startDateString = format(startDateFn, 'dd/MM/yyyy', {
|
|
479
|
+
startDateString = format(startDateFn, 'dd/MM/yyyy', {
|
|
480
|
+
awareOfUnicodeTokens: true
|
|
481
|
+
});
|
|
661
482
|
|
|
662
483
|
if (startDateString === endDateString) {
|
|
663
484
|
const endColumnFn = {
|
|
664
485
|
hover: false,
|
|
665
486
|
date: parseInt(format(startDateFn, 't'), 10),
|
|
666
|
-
title: parseInt(format(startDateFn, 'd', {
|
|
487
|
+
title: parseInt(format(startDateFn, 'd', {
|
|
488
|
+
awareOfUnicodeTokens: true
|
|
489
|
+
}), 10)
|
|
667
490
|
};
|
|
668
491
|
columns.push(endColumnFn);
|
|
492
|
+
|
|
669
493
|
for (let i = columns.length; i <= lastDayOfWeek; i += 1) {
|
|
670
494
|
columns.push(0);
|
|
671
495
|
}
|
|
496
|
+
|
|
672
497
|
rows.push(columns.slice());
|
|
673
498
|
columns = [];
|
|
674
499
|
}
|
|
675
500
|
}
|
|
501
|
+
|
|
676
502
|
this._dimensions = rows;
|
|
677
503
|
}
|
|
678
504
|
}
|
|
@@ -680,40 +506,55 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
680
506
|
|
|
681
507
|
getYearInterval(year = this.year) {
|
|
682
508
|
let start = parseInt(year, 10);
|
|
509
|
+
|
|
683
510
|
while (start % 10 !== 0) {
|
|
684
511
|
start--;
|
|
685
512
|
}
|
|
686
|
-
|
|
513
|
+
|
|
514
|
+
return {
|
|
515
|
+
start,
|
|
516
|
+
end: start + 10
|
|
517
|
+
};
|
|
687
518
|
}
|
|
688
519
|
|
|
689
520
|
computeName(month, year, _format = 'MMMM') {
|
|
690
521
|
if (month && year) {
|
|
691
522
|
const dateFn = parse(`${month}/${year}`, 'MM/yyyy', new Date());
|
|
692
|
-
return format(dateFn, _format, {
|
|
523
|
+
return format(dateFn, _format, {
|
|
524
|
+
locale: this.locale
|
|
525
|
+
});
|
|
693
526
|
}
|
|
527
|
+
|
|
694
528
|
return '';
|
|
695
529
|
}
|
|
696
530
|
|
|
697
531
|
computeCurrentYearName() {
|
|
698
532
|
if (this.yearMode) {
|
|
699
|
-
const {
|
|
533
|
+
const {
|
|
534
|
+
start,
|
|
535
|
+
end
|
|
536
|
+
} = this.getYearInterval();
|
|
700
537
|
return `${start}-${end - 1}`;
|
|
701
538
|
}
|
|
539
|
+
|
|
702
540
|
return this.year;
|
|
703
541
|
}
|
|
704
542
|
|
|
705
543
|
_onSelectHour(value) {
|
|
706
544
|
this._hour = value;
|
|
545
|
+
|
|
707
546
|
this._updateTime();
|
|
708
547
|
}
|
|
709
548
|
|
|
710
549
|
_onSelectMinute(value) {
|
|
711
550
|
this._minute = value;
|
|
551
|
+
|
|
712
552
|
this._updateTime();
|
|
713
553
|
}
|
|
714
554
|
|
|
715
555
|
_onSelectSecond(value) {
|
|
716
556
|
this._second = value;
|
|
557
|
+
|
|
717
558
|
this._updateTime();
|
|
718
559
|
}
|
|
719
560
|
|
|
@@ -724,10 +565,15 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
724
565
|
this._dateFrom = this._from;
|
|
725
566
|
this._from = null;
|
|
726
567
|
}
|
|
568
|
+
|
|
727
569
|
this.yearMode = false;
|
|
728
570
|
this.monthMode = !this.monthMode;
|
|
729
571
|
this.yearAndMonthChanged(this.year, this.month);
|
|
730
|
-
dispatchCustomEvent(this, 'month-mode', {
|
|
572
|
+
dispatchCustomEvent(this, 'month-mode', {
|
|
573
|
+
mode: this.monthMode,
|
|
574
|
+
month: this.month,
|
|
575
|
+
year: this.year
|
|
576
|
+
});
|
|
731
577
|
}
|
|
732
578
|
|
|
733
579
|
_onSelectYear() {
|
|
@@ -737,16 +583,22 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
737
583
|
this._dateFrom = this._from;
|
|
738
584
|
this._from = null;
|
|
739
585
|
}
|
|
586
|
+
|
|
740
587
|
this.monthMode = false;
|
|
741
588
|
this.yearMode = !this.yearMode;
|
|
742
589
|
this.yearAndMonthChanged(this.year, this.month);
|
|
743
|
-
dispatchCustomEvent(this, 'year-mode', {
|
|
590
|
+
dispatchCustomEvent(this, 'year-mode', {
|
|
591
|
+
mode: this.yearMode,
|
|
592
|
+
month: this.month,
|
|
593
|
+
year: this.year
|
|
594
|
+
});
|
|
744
595
|
}
|
|
745
596
|
|
|
746
597
|
get datetimeSelected() {
|
|
747
598
|
if (this.isStrictTime() && this._from == null) {
|
|
748
599
|
this._from = new Date().valueOf() / 1000;
|
|
749
600
|
}
|
|
601
|
+
|
|
750
602
|
let selectedDate = new Date(this._from * 1000);
|
|
751
603
|
selectedDate = setHours(selectedDate, parseInt(this._hour ? this._hour : 0, 10));
|
|
752
604
|
selectedDate = setMinutes(selectedDate, parseInt(this._minute ? this._minute : 0, 10));
|
|
@@ -755,93 +607,144 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
755
607
|
|
|
756
608
|
_onDateTimeSelected() {
|
|
757
609
|
this.value = this.datetimeSelected;
|
|
758
|
-
this.dispatchEvent(new CustomEvent('date-from-changed', {
|
|
610
|
+
this.dispatchEvent(new CustomEvent('date-from-changed', {
|
|
611
|
+
detail: {
|
|
612
|
+
value: this.value
|
|
613
|
+
}
|
|
614
|
+
}));
|
|
759
615
|
}
|
|
760
616
|
|
|
761
617
|
_onNow() {
|
|
762
618
|
const now = new Date();
|
|
619
|
+
|
|
763
620
|
if (!this.isStrictTime()) {
|
|
764
621
|
now.setSeconds(0, 0);
|
|
765
622
|
}
|
|
623
|
+
|
|
766
624
|
this._from = now.getTime() / 1000;
|
|
767
625
|
this.month = format(now, 'MM');
|
|
768
626
|
this.year = format(now, 'yyyy');
|
|
769
627
|
this._hour = format(now, 'HH');
|
|
770
628
|
this._minute = format(now, 'mm');
|
|
629
|
+
|
|
771
630
|
if (this.isStrictTime()) {
|
|
772
631
|
this._second = format(now, 'mm');
|
|
773
632
|
}
|
|
774
|
-
|
|
633
|
+
|
|
634
|
+
this.dispatchEvent(new CustomEvent('date-from-changed', {
|
|
635
|
+
detail: {
|
|
636
|
+
value: this._from
|
|
637
|
+
}
|
|
638
|
+
}));
|
|
775
639
|
}
|
|
776
640
|
|
|
777
641
|
get disableValidation() {
|
|
778
642
|
const date = this.datetimeSelected;
|
|
643
|
+
|
|
779
644
|
if (date) {
|
|
780
645
|
if (this.min && date < this.min) {
|
|
781
646
|
return true;
|
|
782
647
|
}
|
|
648
|
+
|
|
783
649
|
if (this.max && date > this.max) {
|
|
784
650
|
return true;
|
|
785
651
|
}
|
|
786
652
|
}
|
|
653
|
+
|
|
787
654
|
return false;
|
|
788
655
|
}
|
|
789
656
|
|
|
790
|
-
_onSelect({
|
|
791
|
-
|
|
657
|
+
_onSelect({
|
|
658
|
+
detail
|
|
659
|
+
}) {
|
|
660
|
+
const {
|
|
661
|
+
date
|
|
662
|
+
} = detail;
|
|
663
|
+
|
|
792
664
|
if (this.yearMode) {
|
|
793
665
|
this.yearMode = false;
|
|
794
666
|
this.monthMode = true;
|
|
795
667
|
this._from = this._dateFrom;
|
|
796
668
|
const selectedDate = new Date(date * 1000);
|
|
797
669
|
this.year = format(selectedDate, 'yyyy');
|
|
798
|
-
dispatchCustomEvent(this, 'year-changed', {
|
|
670
|
+
dispatchCustomEvent(this, 'year-changed', {
|
|
671
|
+
year: this.year
|
|
672
|
+
});
|
|
799
673
|
} else if (this.monthMode) {
|
|
800
674
|
this.monthMode = false;
|
|
801
675
|
this._from = this._dateFrom;
|
|
802
676
|
const selectedDate = new Date(date * 1000);
|
|
803
677
|
this.month = format(selectedDate, 'MM');
|
|
804
678
|
this.year = format(selectedDate, 'yyyy');
|
|
805
|
-
dispatchCustomEvent(this, 'month-changed', {
|
|
679
|
+
dispatchCustomEvent(this, 'month-changed', {
|
|
680
|
+
month: this.month,
|
|
681
|
+
year: this.year
|
|
682
|
+
});
|
|
806
683
|
} else if (this.time) {
|
|
807
684
|
this._from = date;
|
|
685
|
+
|
|
808
686
|
this._updateTime();
|
|
809
687
|
} else if (this.range) {
|
|
810
688
|
if (this._from && this._to) {
|
|
811
689
|
this._from = date;
|
|
812
690
|
this._to = null;
|
|
813
691
|
this.hoveredDate = undefined;
|
|
814
|
-
this.dispatchEvent(new CustomEvent('hovered-date-changed', {
|
|
815
|
-
|
|
692
|
+
this.dispatchEvent(new CustomEvent('hovered-date-changed', {
|
|
693
|
+
detail: {
|
|
694
|
+
value: this.hoveredDate
|
|
695
|
+
}
|
|
696
|
+
}));
|
|
697
|
+
} else if (!this._from || this._from && date < this._from) {
|
|
816
698
|
this._from = date;
|
|
817
|
-
} else if (!this._to ||
|
|
699
|
+
} else if (!this._to || this._to && date > this._to) {
|
|
818
700
|
this._to = date;
|
|
819
701
|
}
|
|
820
|
-
|
|
821
|
-
this.dispatchEvent(new CustomEvent('date-
|
|
702
|
+
|
|
703
|
+
this.dispatchEvent(new CustomEvent('date-from-changed', {
|
|
704
|
+
detail: {
|
|
705
|
+
value: this._from
|
|
706
|
+
}
|
|
707
|
+
}));
|
|
708
|
+
this.dispatchEvent(new CustomEvent('date-to-changed', {
|
|
709
|
+
detail: {
|
|
710
|
+
value: this._to
|
|
711
|
+
}
|
|
712
|
+
}));
|
|
822
713
|
} else {
|
|
823
714
|
this._from = date;
|
|
824
|
-
this.dispatchEvent(new CustomEvent('date-from-changed', {
|
|
715
|
+
this.dispatchEvent(new CustomEvent('date-from-changed', {
|
|
716
|
+
detail: {
|
|
717
|
+
value: this._from
|
|
718
|
+
}
|
|
719
|
+
}));
|
|
825
720
|
}
|
|
826
721
|
}
|
|
827
722
|
|
|
828
723
|
_onHover(event) {
|
|
829
724
|
if (this.range) {
|
|
830
725
|
this.hoveredDate = event.detail.date;
|
|
831
|
-
this.dispatchEvent(new CustomEvent('hovered-date-changed', {
|
|
726
|
+
this.dispatchEvent(new CustomEvent('hovered-date-changed', {
|
|
727
|
+
detail: {
|
|
728
|
+
value: this.hoveredDate
|
|
729
|
+
}
|
|
730
|
+
}));
|
|
832
731
|
}
|
|
833
732
|
}
|
|
834
733
|
|
|
835
734
|
_onNextMonth() {
|
|
836
735
|
const month = parse(this.month, 'MM', new Date());
|
|
837
736
|
const monthPlusDate = addMonths(month, 1);
|
|
838
|
-
const monthPlusString = format(monthPlusDate, 'MM', {
|
|
839
|
-
|
|
737
|
+
const monthPlusString = format(monthPlusDate, 'MM', {
|
|
738
|
+
locale: this.locale
|
|
739
|
+
});
|
|
840
740
|
this.month = monthPlusString;
|
|
741
|
+
|
|
841
742
|
if (this.month === '01') {
|
|
842
743
|
const year = parse(this.year, 'yyyy', new Date());
|
|
843
744
|
const yearPlusDate = addYears(year, 1);
|
|
844
|
-
const yearPlusString = format(yearPlusDate, 'yyyy', {
|
|
745
|
+
const yearPlusString = format(yearPlusDate, 'yyyy', {
|
|
746
|
+
locale: this.locale
|
|
747
|
+
});
|
|
845
748
|
this.year = yearPlusString;
|
|
846
749
|
}
|
|
847
750
|
}
|
|
@@ -849,13 +752,17 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
849
752
|
_onPrevMonth() {
|
|
850
753
|
const month = parse(this.month, 'MM', new Date());
|
|
851
754
|
const monthMinusDate = subMonths(month, 1);
|
|
852
|
-
const monthMinusString = format(monthMinusDate, 'MM', {
|
|
853
|
-
|
|
755
|
+
const monthMinusString = format(monthMinusDate, 'MM', {
|
|
756
|
+
locale: this.locale
|
|
757
|
+
});
|
|
854
758
|
this.month = monthMinusString;
|
|
759
|
+
|
|
855
760
|
if (this.month === '12') {
|
|
856
761
|
const year = parse(this.year, 'yyyy', new Date());
|
|
857
762
|
const yearMinusDate = subYears(year, 1);
|
|
858
|
-
const yearMinusString = format(yearMinusDate, 'yyyy', {
|
|
763
|
+
const yearMinusString = format(yearMinusDate, 'yyyy', {
|
|
764
|
+
locale: this.locale
|
|
765
|
+
});
|
|
859
766
|
this.year = yearMinusString;
|
|
860
767
|
}
|
|
861
768
|
}
|
|
@@ -864,9 +771,12 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
864
771
|
if (this.yearMode) {
|
|
865
772
|
this.year = parseInt(this.year, 10) + 10;
|
|
866
773
|
}
|
|
774
|
+
|
|
867
775
|
const year = parse(this.year, 'yyyy', new Date());
|
|
868
776
|
const yearPlusDate = addYears(year, 1);
|
|
869
|
-
const yearPlusString = format(yearPlusDate, 'yyyy', {
|
|
777
|
+
const yearPlusString = format(yearPlusDate, 'yyyy', {
|
|
778
|
+
locale: this.locale
|
|
779
|
+
});
|
|
870
780
|
this.year = yearPlusString;
|
|
871
781
|
}
|
|
872
782
|
|
|
@@ -874,21 +784,30 @@ export class GvDatePickerCalendar extends LitElement {
|
|
|
874
784
|
if (this.yearMode) {
|
|
875
785
|
this.year = parseInt(this.year, 10) - 10;
|
|
876
786
|
}
|
|
787
|
+
|
|
877
788
|
const year = parse(this.year, 'yyyy', new Date());
|
|
878
789
|
const yearMinusDate = subYears(year, 1);
|
|
879
|
-
const yearMinusString = format(yearMinusDate, 'yyyy', {
|
|
790
|
+
const yearMinusString = format(yearMinusDate, 'yyyy', {
|
|
791
|
+
locale: this.locale
|
|
792
|
+
});
|
|
880
793
|
this.year = yearMinusString;
|
|
881
794
|
}
|
|
882
795
|
|
|
883
796
|
goToday() {
|
|
884
797
|
this.month = `0${getMonth(new Date()) + 1}`.slice(-2);
|
|
885
798
|
this.year = getYear(new Date());
|
|
886
|
-
|
|
799
|
+
|
|
800
|
+
this._onSelect({
|
|
801
|
+
detail: {
|
|
802
|
+
date: new Date().getTime() / 1000
|
|
803
|
+
}
|
|
804
|
+
});
|
|
887
805
|
}
|
|
888
806
|
|
|
889
807
|
hasGoToday() {
|
|
890
808
|
return !this.range && !this.time && !this.monthMode && !this.yearMode && this._hasGoToday;
|
|
891
809
|
}
|
|
892
|
-
}
|
|
893
810
|
|
|
811
|
+
}
|
|
894
812
|
window.customElements.define('gv-date-picker-calendar', GvDatePickerCalendar);
|
|
813
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL2F0b21zL2d2LWRhdGUtcGlja2VyLWNhbGVuZGFyLmpzIl0sIm5hbWVzIjpbImFkZERheXMiLCJhZGRNb250aHMiLCJhZGRZZWFycyIsImVuZE9mTW9udGgiLCJmb3JtYXQiLCJnZXREYXkiLCJnZXRNb250aCIsImdldFllYXIiLCJpc0FmdGVyIiwiaXNCZWZvcmUiLCJwYXJzZSIsInNldEhvdXJzIiwic2V0TWludXRlcyIsInN0YXJ0T2ZEYXkiLCJzdWJNb250aHMiLCJzdWJZZWFycyIsImNsYXNzTWFwIiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsImkxOG4iLCJMaXRFbGVtZW50IiwiY3NzIiwiaHRtbCIsInVudGlsIiwiR3ZEYXRlUGlja2VyQ2FsZW5kYXIiLCJwcm9wZXJ0aWVzIiwiZGF0ZUZyb20iLCJ0eXBlIiwiTnVtYmVyIiwiZGF0ZVRvIiwiZGlzYWJsZWREYXRlcyIsIkFycmF5IiwiaG92ZXJlZERhdGUiLCJsb2NhbGUiLCJPYmplY3QiLCJtYXgiLCJtaW4iLCJtb250aCIsIlN0cmluZyIsIm1vbnRoTW9kZSIsIkJvb2xlYW4iLCJuZXh0IiwicHJldiIsInJhbmdlIiwidGltZSIsInNtYWxsIiwicmVmbGVjdCIsInN0cmljdCIsInllYXIiLCJ5ZWFyTW9kZSIsIl9kYXlOYW1lc09mV2VlayIsImF0dHJpYnV0ZSIsIl9kaW1lbnNpb25zIiwiX2hhc0dvVG9kYXkiLCJfaG91ciIsIl9taW51dGUiLCJfc2Vjb25kIiwiX21vbnRoc0xpc3QiLCJfbG9jYWxlIiwiX2Zyb20iLCJfdG8iLCJzdHlsZXMiLCJjb25zdHJ1Y3RvciIsImN1cnJlbnREYXRlIiwicGFyc2VJbnQiLCJEYXRlIiwibm93IiwiX2hvdXJzIiwiY29tcHV0ZUFycmF5T2ZUaW1lIiwiX21pbnV0ZXMiLCJfc2Vjb25kcyIsInZhbHVlIiwiZGF0ZSIsImlzU3RyaWN0VGltZSIsInNpemUiLCJmaWxsIiwibWFwIiwiYSIsImkiLCJ0b1N0cmluZyIsImxlbmd0aCIsIl9yZW5kZXJQcmV2aW91c05hdiIsIl9vblByZXZZZWFyIiwiX29uUHJldk1vbnRoIiwiX3JlbmRlckN1cnJlbnROYXYiLCJfb25TZWxlY3RNb250aCIsImNvbXB1dGVOYW1lIiwiX29uU2VsZWN0WWVhciIsImNvbXB1dGVDdXJyZW50WWVhck5hbWUiLCJfcmVuZGVyTmV4dE5hdiIsIl9vbk5leHRNb250aCIsIl9vbk5leHRZZWFyIiwiX3JlbmRlckRheXMiLCJkYXlOYW1lT2ZXZWVrIiwiZGltZW5zaW9uIiwiZGF0YSIsImlzQ3VycmVudERhdGUiLCJfb25Ib3ZlciIsIl9vblNlbGVjdCIsInJlbmRlciIsImNsYXNzZXMiLCJnZXRUaW1lIiwidmFsIiwiX29uU2VsZWN0SG91ciIsImJpbmQiLCJob3VyIiwic2VsZWN0ZWQiLCJkaXNhYmxlZCIsImlzSG91cnNEaXNhYmxlZCIsIl9vblNlbGVjdE1pbnV0ZSIsIm1pbnV0ZSIsImlzTWludXRlc0Rpc2FibGVkIiwiX29uU2VsZWN0U2Vjb25kIiwic2Vjb25kIiwiaXNTZWNvbmRzRGlzYWJsZWQiLCJoYXNHb1RvZGF5IiwiZ29Ub2RheSIsIl9vbk5vdyIsIl9vbkRhdGVUaW1lU2VsZWN0ZWQiLCJkaXNhYmxlVmFsaWRhdGlvbiIsInNlbGVjdGVkRGF0ZSIsIm1pbkRhdGUiLCJtYXhEYXRlIiwiX3VwZGF0ZVRpbWUiLCJzZXRUaW1lb3V0Iiwic2hhZG93Um9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJ0ZXh0Q29udGVudCIsInVwZGF0ZWQiLCJoYXMiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJ5ZWFyQW5kTW9udGhDaGFuZ2VkIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJwYXJlbnROb2RlIiwic2Nyb2xsVG9wIiwib2Zmc2V0VG9wIiwiX3VwZGF0ZURheXMiLCJkYXlOYW1lcyIsInB1c2giLCJsb2NhbGl6ZSIsImRheSIsIndpZHRoIiwiZmlyc3REYXlPZldlZWsiLCJvcHRpb25zIiwid2Vla1N0YXJ0c09uIiwidG1wIiwic2xpY2UiLCJzcGxpY2UiLCJjb25jYXQiLCJjb2xzIiwic3RhcnQiLCJlbmQiLCJnZXRZZWFySW50ZXJ2YWwiLCJjIiwic3RhcnREYXRlU3RyaW5nIiwic3RhcnREYXRlRm4iLCJhd2FyZU9mVW5pY29kZVRva2VucyIsImhvdmVyIiwidGl0bGUiLCJtb250aE1pbnVzIiwic3Vic3RyaW5nIiwiZW5kRGF0ZUZuIiwiZW5kRGF0ZVN0cmluZyIsInJvd3MiLCJjb2x1bW5zIiwibGFzdERheU9mV2VlayIsImRheU51bWJlckZuIiwiY29sdW1uRm4iLCJ1bnNoaWZ0IiwiZW5kQ29sdW1uRm4iLCJfZm9ybWF0IiwiZGF0ZUZuIiwiX2RhdGVGcm9tIiwibW9kZSIsImRhdGV0aW1lU2VsZWN0ZWQiLCJ2YWx1ZU9mIiwic2V0U2Vjb25kcyIsInVuZGVmaW5lZCIsImV2ZW50IiwibW9udGhQbHVzRGF0ZSIsIm1vbnRoUGx1c1N0cmluZyIsInllYXJQbHVzRGF0ZSIsInllYXJQbHVzU3RyaW5nIiwibW9udGhNaW51c0RhdGUiLCJtb250aE1pbnVzU3RyaW5nIiwieWVhck1pbnVzRGF0ZSIsInllYXJNaW51c1N0cmluZyIsIndpbmRvdyIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLHVCQUFQO0FBQ0EsU0FDRUEsT0FERixFQUVFQyxTQUZGLEVBR0VDLFFBSEYsRUFJRUMsVUFKRixFQUtFQyxNQUxGLEVBTUVDLE1BTkYsRUFPRUMsUUFQRixFQVFFQyxPQVJGLEVBU0VDLE9BVEYsRUFVRUMsUUFWRixFQVdFQyxLQVhGLEVBWUVDLFFBWkYsRUFhRUMsVUFiRixFQWNFQyxVQWRGLEVBZUVDLFNBZkYsRUFnQkVDLFFBaEJGLFFBaUJPLFVBakJQO0FBa0JBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpC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QSxVQUFVLEdBQUc7QUFDWCxXQUFPLENBQUMsS0FBS3hFLEtBQU4sSUFBZSxDQUFDLEtBQUtDLElBQXJCLElBQTZCLENBQUMsS0FBS0wsU0FBbkMsSUFBZ0QsQ0FBQyxLQUFLVSxRQUF0RCxJQUFrRSxLQUFLSSxXQUE5RTtBQUNEOztBQTN6QmtEO0FBOHpCckR5SSxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLHlCQUE3QixFQUF3RHhLLG9CQUF4RCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgJy4vZ3YtZGF0ZS1waWNrZXItY2VsbCc7XG5pbXBvcnQge1xuICBhZGREYXlzLFxuICBhZGRNb250aHMsXG4gIGFkZFllYXJzLFxuICBlbmRPZk1vbnRoLFxuICBmb3JtYXQsXG4gIGdldERheSxcbiAgZ2V0TW9udGgsXG4gIGdldFllYXIsXG4gIGlzQWZ0ZXIsXG4gIGlzQmVmb3JlLFxuICBwYXJzZSxcbiAgc2V0SG91cnMsXG4gIHNldE1pbnV0ZXMsXG4gIHN0YXJ0T2ZEYXksXG4gIHN1Yk1vbnRocyxcbiAgc3ViWWVhcnMsXG59IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9saWIvaTE4bic7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgeyB1bnRpbCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3VudGlsJztcblxuLyoqXG4gKiBEYXRlIFBpY2tlciBDYWxlbmRhclxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBmaXJlcyBndi1kYXRlLXBpY2tlci1jZWxsOnNlbGVjdCAtIEN1c3RvbSBldmVudCB3aGVuIHVzZXIgc2VsZWN0IGNlbGxcbiAqIEBmaXJlcyBndi1kYXRlLXBpY2tlci1jZWxsOmhvdmVyIC0gQ3VzdG9tIGV2ZW50IHdoZW4gdXNlciBob3ZlciBjZWxsXG4gKlxuICogQGF0dHIge051bWJlcn0gZGF0ZUZyb20gLSB1bml4IGRhdGUgZm9ybVxuICogQGF0dHIge051bWJlcn0gZGF0ZVRvIC0gdW5peCBkYXRlIHRvXG4gKiBAYXR0ciB7QXJyYXl9IGRpc2FibGVkRGF0ZXMgLSBhcnJheSBvZiBkaXNhYmxlZCBkYXRlXG4gKiBAYXR0ciB7TnVtYmVyfSBob3ZlcmVkRGF0ZSAtIHVuaXggaG92ZXJlZCBkYXRlXG4gKiBAYXR0ciB7TnVtYmVyfSBtaW4gLSB1bml4IG1pbiBkYXRlXG4gKiBAYXR0ciB7TnVtYmVyfSBtYXggLSB1bml4IG1heCBkYXRlXG4gKiBAYXR0ciB7T2JqZWN0fSBsb2NhbGUgLSBkYXRlLWZucyBsb2NhbGUgb2JqZWN0XG4gKlxuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1kYXRlLXBpY2tlci1ob3Zlci0tYmdjPXZhcigtLWd2LXRoZW1lLWNvbG9yLWxpZ2h0LCAjODZjM2QwKV0gLSBIb3ZlciBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LWRhdGUtcGlja2VyLWhvdmVyLS1jPXZhcigtLWd2LXRoZW1lLWZvbnQtY29sb3ItZGFyaywgIzI2MjYyNildIC0gSG92ZXIgY29sb3JcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtZGF0ZS1waWNrZXItc2VsZWN0ZWQtLWJnYz12YXIoLS1ndi10aGVtZS1jb2xvciwgIzVhNzY4NCldIC0gU2VsZWN0ZWQgYmFja2dyb3VuZCBjb2xvclxuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1kYXRlLXBpY2tlci1zZWxlY3RlZC0tYz12YXIoLS1ndi10aGVtZS1mb250LWNvbG9yLWxpZ2h0LCAjZmZmZmZmKV0gLSBTZWxlY3RlZCBjb2xvclxuICovXG5leHBvcnQgY2xhc3MgR3ZEYXRlUGlja2VyQ2FsZW5kYXIgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRlRnJvbTogeyB0eXBlOiBOdW1iZXIgfSxcbiAgICAgIGRhdGVUbzogeyB0eXBlOiBOdW1iZXIgfSxcbiAgICAgIGRpc2FibGVkRGF0ZXM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAgIGhvdmVyZWREYXRlOiB7IHR5cGU6IE51bWJlciB9LFxuICAgICAgbG9jYWxlOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgbWF4OiB7IHR5cGU6IE51bWJlciB9LFxuICAgICAgbWluOiB7IHR5cGU6IE51bWJlciB9LFxuICAgICAgbW9udGg6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBtb250aE1vZGU6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgbmV4dDogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgICBwcmV2OiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIHJhbmdlOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIHRpbWU6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgc21hbGw6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgc3RyaWN0OiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIHllYXI6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICB5ZWFyTW9kZTogeyB0eXBlOiBCb29sZWFuIH0sXG5cbiAgICAgIF9kYXlOYW1lc09mV2VlazogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2RpbWVuc2lvbnM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9oYXNHb1RvZGF5OiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9ob3VyOiB7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX21pbnV0ZTogeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9zZWNvbmQ6IHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfbW9udGhzTGlzdDogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2xvY2FsZTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9mcm9tOiB7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX3RvOiB7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIDpob3N0ID4gZGl2IHtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgLm5hdixcbiAgICAgICAgLmZvb3QsXG4gICAgICAgIC5uYXYtdGltZXMge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgcGFkZGluZzogMC41cmVtO1xuICAgICAgICAgIGhlaWdodDogMzBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5uYXYgLmN1cnJlbnQsXG4gICAgICAgIC5mb290IHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAubW9udGhOYW1lLFxuICAgICAgICAuZGF5IHtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb290LXRpbWUge1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICAgIH1cblxuICAgICAgICAuY2FsZW5kYXItZ3JpZCB7XG4gICAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg3LCAxZnIpO1xuICAgICAgICAgIHBhZGRpbmc6IDAuNXJlbSAwLjVyZW0gMCAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuY2FsZW5kYXItZ3JpZC1sYXJnZSB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIsXG4gICAgICAgIC5jb250ZW50IHtcbiAgICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIGF1dG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtZGF0ZS1waWNrZXItY2VsbCB7XG4gICAgICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmNhbGVuZGFyLWdyaWQtbGFyZ2UgZ3YtZGF0ZS1waWNrZXItY2VsbCB7XG4gICAgICAgICAgaGVpZ2h0OiA0OHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmNhbGVuZGFyLWdyaWQsXG4gICAgICAgIC5mb290LFxuICAgICAgICAudGltZSB7XG4gICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItZGFyayk7XG4gICAgICAgIH1cblxuICAgICAgICAubmF2LXRpbWVzIHtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLm5hdi10aW1lcyxcbiAgICAgICAgLnRpbWUge1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1kYXJrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kYXkge1xuICAgICAgICAgIGhlaWdodDogMzJweDtcbiAgICAgICAgICB3aWR0aDogMzNweDtcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgOmhvc3QoW3NtYWxsXSkgLmRheSB7XG4gICAgICAgICAgaGVpZ2h0OiAyNXB4O1xuICAgICAgICAgIHdpZHRoOiAyNnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveC1jb2wsXG4gICAgICAgIC50aW1lcyB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ib3gtY29sIHtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveC1jb2w6Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgICAgd2lkdGg6IDI2MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgOmhvc3QoW3NtYWxsXSkgLmJveC1jb2w6Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgICAgd2lkdGg6IDE5NXB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aW1lcyB7XG4gICAgICAgICAgbWF4LWhlaWdodDogMjM1cHg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIC50aW1lIHtcbiAgICAgICAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDtcbiAgICAgICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgICAgIG1pbi13aWR0aDogNTBweDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aW1lID4gZGl2IHtcbiAgICAgICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgOmhvc3QoW3NtYWxsXSkgLnRpbWUgPiBkaXYge1xuICAgICAgICAgIGhlaWdodDogMjVweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aW1lID4gZGl2OmhvdmVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ndi1kYXRlLXBpY2tlci1ob3Zlci0tYmdjLCB2YXIoLS1ndi10aGVtZS1jb2xvci1saWdodCwgIzg2YzNkMCkpO1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ndi1kYXRlLXBpY2tlci1ob3Zlci0tYywgdmFyKC0tZ3YtdGhlbWUtZm9udC1jb2xvci1kYXJrLCAjMjYyNjI2KSk7XG4gICAgICAgIH1cblxuICAgICAgICAudGltZSA+IGRpdi5zZWxlY3RlZCB7XG4gICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZ3YtZGF0ZS1waWNrZXItc2VsZWN0ZWQtLWJnYywgdmFyKC0tZ3YtdGhlbWUtY29sb3IsICM1YTc2ODQpKTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0tZ3YtZGF0ZS1waWNrZXItc2VsZWN0ZWQtLWMsIHZhcigtLWd2LXRoZW1lLWZvbnQtY29sb3ItbGlnaHQsICNmZmZmZmYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aW1lID4gZGl2LmRpc2FibGVkIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZGF5TmFtZXNPZldlZWsgPSBbXTtcbiAgICB0aGlzLl9tb250aHNMaXN0ID0gWycwMScsICcwMicsICcwMycsICcwNCcsICcwNScsICcwNicsICcwNycsICcwOCcsICcwOScsICcxMCcsICcxMScsICcxMiddO1xuICAgIHRoaXMucmFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnREYXRlID0gcGFyc2VJbnQoZm9ybWF0KHN0YXJ0T2ZEYXkoRGF0ZS5ub3coKSksICd0JyksIDEwKTtcbiAgICB0aGlzLl9oYXNHb1RvZGF5ID0gdHJ1ZTtcblxuICAgIHRoaXMuX2hvdXJzID0gdGhpcy5jb21wdXRlQXJyYXlPZlRpbWUoMjQpO1xuICAgIHRoaXMuX21pbnV0ZXMgPSB0aGlzLmNvbXB1dGVBcnJheU9mVGltZSg2MCk7XG4gICAgdGhpcy5fc2Vjb25kcyA9IHRoaXMuY29tcHV0ZUFycmF5T2ZUaW1lKDYwKTtcbiAgfVxuXG4gIHNldCBkYXRlRnJvbSh2YWx1ZSkge1xuICAgIHRoaXMuX2Zyb20gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy50aW1lICYmIHRoaXMuX2Zyb20pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLl9mcm9tICogMTAwMCk7XG4gICAgICB0aGlzLl9ob3VyID0gZm9ybWF0KGRhdGUsICdISCcpO1xuICAgICAgdGhpcy5fbWludXRlID0gZm9ybWF0KGRhdGUsICdtbScpO1xuICAgICAgaWYgKHRoaXMuaXNTdHJpY3RUaW1lKCkpIHtcbiAgICAgICAgdGhpcy5fc2Vjb25kID0gZm9ybWF0KGRhdGUsICdzcycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldCBkYXRlVG8odmFsdWUpIHtcbiAgICB0aGlzLl90byA9IHZhbHVlO1xuICB9XG5cbiAgY29tcHV0ZUFycmF5T2ZUaW1lKHNpemUpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5KHNpemUpLmZpbGwoJycpLm1hcCgoYSwgaSkgPT4ge1xuICAgICAgbGV0IHRpbWUgPSBpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAodGltZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdGltZSA9IGAwJHt0aW1lfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGltZTtcbiAgICB9KTtcbiAgfVxuXG4gIF9yZW5kZXJQcmV2aW91c05hdigpIHtcbiAgICBpZiAodGhpcy5wcmV2IHx8IHRoaXMubW9udGhNb2RlIHx8IHRoaXMueWVhck1vZGUpIHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8Z3YtYnV0dG9uIGxpbmsgaWNvbj1cIm5hdmlnYXRpb246YW5nbGUtZG91YmxlLWxlZnRcIiBAY2xpY2s9XCIke3RoaXMuX29uUHJldlllYXJ9XCIgP3NtYWxsPVwiJHt0aGlzLnNtYWxsfVwiPjwvZ3YtYnV0dG9uPlxuICAgICAgICAke3RoaXMubW9udGhNb2RlIHx8IHRoaXMueWVhck1vZGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiBodG1sYDxndi1idXR0b24gbGluayBpY29uPVwibmF2aWdhdGlvbjphbmdsZS1sZWZ0XCIgP3NtYWxsPVwiJHt0aGlzLnNtYWxsfVwiIEBjbGljaz1cIiR7dGhpcy5fb25QcmV2TW9udGh9XCI+PC9ndi1idXR0b24+YH1cbiAgICAgIGA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIF9yZW5kZXJDdXJyZW50TmF2KCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cImN1cnJlbnRcIj5cbiAgICAgICAgJHt0aGlzLnllYXJNb2RlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogaHRtbGA8Z3YtYnV0dG9uIGxpbmsgQGNsaWNrPVwiJHt0aGlzLl9vblNlbGVjdE1vbnRofVwiID9zbWFsbD1cIiR7dGhpcy5zbWFsbH1cIlxuICAgICAgICAgICAgICA+PHNwYW4gY2xhc3M9XCJtb250aE5hbWVcIj4ke3VudGlsKHRoaXMuY29tcHV0ZU5hbWUodGhpcy5tb250aCwgdGhpcy55ZWFyKSl9PC9zcGFuPjwvZ3YtYnV0dG9uXG4gICAgICAgICAgICA+YH1cbiAgICAgICAgPGd2LWJ1dHRvbiA/c21hbGw9XCIke3RoaXMuc21hbGx9XCIgbGluayBAY2xpY2s9XCIke3RoaXMuX29uU2VsZWN0WWVhcn1cIj4ke3RoaXMuY29tcHV0ZUN1cnJlbnRZZWFyTmFtZSgpfTwvZ3YtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIF9yZW5kZXJOZXh0TmF2KCkge1xuICAgIGlmICh0aGlzLm5leHQgfHwgdGhpcy5tb250aE1vZGUgfHwgdGhpcy55ZWFyTW9kZSkge1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICR7dGhpcy5tb250aE1vZGUgfHwgdGhpcy55ZWFyTW9kZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6IGh0bWxgPGd2LWJ1dHRvbiBsaW5rIGljb249XCJuYXZpZ2F0aW9uOmFuZ2xlLXJpZ2h0XCIgP3NtYWxsPVwiJHt0aGlzLnNtYWxsfVwiIEBjbGljaz1cIiR7dGhpcy5fb25OZXh0TW9udGh9XCI+PC9ndi1idXR0b24+YH1cbiAgICAgICAgPGd2LWJ1dHRvbiA/c21hbGw9XCIke3RoaXMuc21hbGx9XCIgbGluayBpY29uPVwibmF2aWdhdGlvbjphbmdsZS1kb3VibGUtcmlnaHRcIiBAY2xpY2s9XCIke3RoaXMuX29uTmV4dFllYXJ9XCI+PC9ndi1idXR0b24+XG4gICAgICBgO1xuICAgIH1cbiAgfVxuXG4gIF9yZW5kZXJEYXlzKCkge1xuICAgIHJldHVybiBodG1sYCAke3RoaXMuX2RheU5hbWVzT2ZXZWVrICYmIHRoaXMuX2RheU5hbWVzT2ZXZWVrLm1hcCgoZGF5TmFtZU9mV2VlaykgPT4gaHRtbGA8ZGl2IGNsYXNzPVwiZGF5XCI+JHtkYXlOYW1lT2ZXZWVrfTwvZGl2PmApfVxuICAgICR7dGhpcy5fZGltZW5zaW9ucyAmJlxuICAgIHRoaXMuX2RpbWVuc2lvbnMubWFwKFxuICAgICAgKGRpbWVuc2lvbikgPT5cbiAgICAgICAgaHRtbGAke2RpbWVuc2lvbiAmJlxuICAgICAgICBkaW1lbnNpb24ubWFwKFxuICAgICAgICAgIChkYXRhKSA9PiBodG1sYCA8ZGl2PlxuICAgICAgICAgICAgJHtkYXRhXG4gICAgICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgICAgIDxndi1kYXRlLXBpY2tlci1jZWxsXG4gICAgICAgICAgICAgICAgICAgIC5kaXNhYmxlZERhdGVzPVwiJHt0aGlzLmRpc2FibGVkRGF0ZXN9XCJcbiAgICAgICAgICAgICAgICAgICAgLm1pbj1cIiR7dGhpcy5tb250aE1vZGUgfHwgdGhpcy55ZWFyTW9kZSA/IG51bGwgOiB0aGlzLm1pbn1cIlxuICAgICAgICAgICAgICAgICAgICAubWF4PVwiJHt0aGlzLm1vbnRoTW9kZSB8fCB0aGlzLnllYXJNb2RlID8gbnVsbCA6IHRoaXMubWF4fVwiXG4gICAgICAgICAgICAgICAgICAgIC5tb250aD1cIiR7dGhpcy5tb250aH1cIlxuICAgICAgICAgICAgICAgICAgICAuaG92ZXJlZERhdGU9XCIke3RoaXMuaG92ZXJlZERhdGV9XCJcbiAgICAgICAgICAgICAgICAgICAgLmRhdGVUbz1cIiR7dGhpcy5fdG99XCJcbiAgICAgICAgICAgICAgICAgICAgLmRhdGVGcm9tPVwiJHt0aGlzLl9mcm9tfVwiXG4gICAgICAgICAgICAgICAgICAgIC5kYXRhPVwiJHtkYXRhfVwiXG4gICAgICAgICAgICAgICAgICAgIC50aW1lPVwiJHt0aGlzLnRpbWV9XCJcbiAgICAgICAgICAgICAgICAgICAgP2lzQ3VycmVudD1cIiR7dGhpcy5pc0N1cnJlbnREYXRlKGRhdGEpfVwiXG4gICAgICAgICAgICAgICAgICAgIEBndi1kYXRlLXBpY2tlci1jZWxsOmhvdmVyPVwiJHt0aGlzLl9vbkhvdmVyfVwiXG4gICAgICAgICAgICAgICAgICAgIEBndi1kYXRlLXBpY2tlci1jZWxsOnNlbGVjdD1cIiR7dGhpcy5fb25TZWxlY3R9XCJcbiAgICAgICAgICAgICAgICAgID48L2d2LWRhdGUtcGlja2VyLWNlbGw+XG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICA6IG51bGx9XG4gICAgICAgICAgPC9kaXY+YCxcbiAgICAgICAgKX1gLFxuICAgICl9YDtcbiAgfVxuXG4gIGlzU3RyaWN0VGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50aW1lID09PSB0cnVlICYmIHRoaXMuc3RyaWN0ID09PSB0cnVlO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAnY2FsZW5kYXItZ3JpZCc6IHRydWUsXG4gICAgICAnY2FsZW5kYXItZ3JpZC1sYXJnZSc6IHRoaXMubW9udGhNb2RlIHx8IHRoaXMueWVhck1vZGUsXG4gICAgfTtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgJHt0aGlzLmlzU3RyaWN0VGltZSgpXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogaHRtbGA8ZGl2IGNsYXNzPVwiYm94LWNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2XCI+JHt0aGlzLl9yZW5kZXJQcmV2aW91c05hdigpfSAke3RoaXMuX3JlbmRlckN1cnJlbnROYXYoKX0gJHt0aGlzLl9yZW5kZXJOZXh0TmF2KCl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKGNsYXNzZXMpfVwiPiR7dGhpcy5fcmVuZGVyRGF5cygpfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YH1cbiAgICAgICAgJHt0aGlzLnRpbWUgJiYgIXRoaXMubW9udGhNb2RlICYmICF0aGlzLnllYXJNb2RlXG4gICAgICAgICAgPyBodG1sYDxkaXYgY2xhc3M9XCJib3gtY29sXCI+XG4gICAgICAgICAgICAgICR7dGhpcy5pc1N0cmljdFRpbWUoKSA/ICcnIDogaHRtbGA8ZGl2IGNsYXNzPVwibmF2LXRpbWVzXCI+JHt0aGlzLmdldFRpbWUoKX08L2Rpdj5gfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZVwiPlxuICAgICAgICAgICAgICAgICAgJHt0aGlzLl9ob3VycyAmJlxuICAgICAgICAgICAgICAgICAgdGhpcy5faG91cnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAodmFsKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGh0bWxgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiJHt0aGlzLl9vblNlbGVjdEhvdXIuYmluZCh0aGlzLCB2YWwpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5faG91ciA9PT0gdmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0hvdXJzRGlzYWJsZWQodmFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt2YWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCxcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVcIj5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5fbWludXRlcyAmJlxuICAgICAgICAgICAgICAgICAgdGhpcy5fbWludXRlcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICh2YWwpID0+XG4gICAgICAgICAgICAgICAgICAgICAgaHRtbGA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XCIke3RoaXMuX29uU2VsZWN0TWludXRlLmJpbmQodGhpcywgdmFsKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5fbWludXRlID09PSB2YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzTWludXRlc0Rpc2FibGVkKHZhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KX1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dmFsfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmAsXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgJHt0aGlzLmlzU3RyaWN0VGltZSgpXG4gICAgICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBjbGFzcz1cInRpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3NlY29uZHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWNvbmRzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWwpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz1cIiR7dGhpcy5fb25TZWxlY3RTZWNvbmQuYmluZCh0aGlzLCB2YWwpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLl9zZWNvbmQgPT09IHZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzU2Vjb25kc0Rpc2FibGVkKHZhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dmFsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgICAgICAgICAgIDogJyd9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogJyd9XG4gICAgICA8L2Rpdj5cbiAgICAgICR7dGhpcy5oYXNHb1RvZGF5KClcbiAgICAgICAgPyBodG1sYCA8ZGl2IGNsYXNzPVwiZm9vdFwiPlxuICAgICAgICAgICAgPGd2LWJ1dHRvbiBsaW5rIEBjbGljaz0ke3RoaXMuZ29Ub2RheX0+JHtpMThuKCdndi1kYXRlLXBpY2tlci50b2RheScpfTwvZ3YtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgOiAnJ31cbiAgICAgICR7dGhpcy50aW1lICYmICF0aGlzLm1vbnRoTW9kZSAmJiAhdGhpcy55ZWFyTW9kZVxuICAgICAgICA/IGh0bWxgIDxkaXYgY2xhc3M9XCJmb290IGZvb3QtdGltZVwiPlxuICAgICAgICAgICAgPGd2LWJ1dHRvbiBwcmltYXJ5IG91dGxpbmVkIHNtYWxsIEBjbGljaz0ke3RoaXMuX29uTm93fVxuICAgICAgICAgICAgICA+JHt0aGlzLmlzU3RyaWN0VGltZSgpID8gaTE4bignZ3YtZGF0ZS1waWNrZXIuY3VycmVudFRpbWUnKSA6IGkxOG4oJ2d2LWRhdGUtcGlja2VyLm5vdycpfTwvZ3YtYnV0dG9uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8Z3YtYnV0dG9uIHByaW1hcnkgc21hbGwgQGNsaWNrPSR7dGhpcy5fb25EYXRlVGltZVNlbGVjdGVkfSAuZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZVZhbGlkYXRpb24gPT09IHRydWV9XCJcbiAgICAgICAgICAgICAgPiR7aTE4bignZ3YtZGF0ZS1waWNrZXIub2snKX08L2d2LWJ1dHRvblxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgaXNNaW51dGVzRGlzYWJsZWQodmFsdWUpIHtcbiAgICBpZiAodGhpcy5fZnJvbSAmJiB0aGlzLl9ob3VyICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuX2Zyb20gKiAxMDAwKTtcbiAgICAgIHNlbGVjdGVkRGF0ZS5zZXRIb3VycyhwYXJzZUludCh0aGlzLl9ob3VyLCAxMCksIHBhcnNlSW50KHZhbHVlLCAxMCksIDAsIDApO1xuICAgICAgaWYgKHRoaXMubWluKSB7XG4gICAgICAgIGNvbnN0IG1pbkRhdGUgPSBuZXcgRGF0ZSh0aGlzLm1pbiAqIDEwMDApO1xuICAgICAgICBpZiAoaXNCZWZvcmUoc2VsZWN0ZWREYXRlLCBtaW5EYXRlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBtYXhEYXRlID0gbmV3IERhdGUodGhpcy5tYXggKiAxMDAwKTtcbiAgICAgICAgaWYgKGlzQWZ0ZXIoc2VsZWN0ZWREYXRlLCBtYXhEYXRlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzU2Vjb25kc0Rpc2FibGVkKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX2Zyb20gJiYgdGhpcy5faG91ciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLl9mcm9tICogMTAwMCk7XG4gICAgICBzZWxlY3RlZERhdGUuc2V0SG91cnMocGFyc2VJbnQodGhpcy5faG91ciwgMTApLCBwYXJzZUludCh2YWx1ZSwgMTApLCAwLCAwKTtcbiAgICAgIGlmICh0aGlzLm1pbikge1xuICAgICAgICBjb25zdCBtaW5EYXRlID0gbmV3IERhdGUodGhpcy5taW4gKiAxMDAwKTtcbiAgICAgICAgaWYgKGlzQmVmb3JlKHNlbGVjdGVkRGF0ZSwgbWluRGF0ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXgpIHtcbiAgICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKHRoaXMubWF4ICogMTAwMCk7XG4gICAgICAgIGlmIChpc0FmdGVyKHNlbGVjdGVkRGF0ZSwgbWF4RGF0ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0hvdXJzRGlzYWJsZWQodmFsdWUpIHtcbiAgICBpZiAodGhpcy5fZnJvbSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodGhpcy5fZnJvbSAqIDEwMDApO1xuICAgICAgc2VsZWN0ZWREYXRlLnNldEhvdXJzKHBhcnNlSW50KHZhbHVlLCAxMCkpO1xuICAgICAgaWYgKHRoaXMubWluKSB7XG4gICAgICAgIGNvbnN0IG1pbkRhdGUgPSBuZXcgRGF0ZSh0aGlzLm1pbiAqIDEwMDApO1xuICAgICAgICBtaW5EYXRlLnNldE1pbnV0ZXMoMCwgMCwgMCk7XG4gICAgICAgIGlmIChzZWxlY3RlZERhdGUuZ2V0VGltZSgpIDwgbWluRGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXgpIHtcbiAgICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKHRoaXMubWF4ICogMTAwMCk7XG4gICAgICAgIGlmIChzZWxlY3RlZERhdGUuZ2V0VGltZSgpID4gbWF4RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfdXBkYXRlVGltZSgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5faG91ciB8fCB0aGlzLmlzSG91cnNEaXNhYmxlZCh0aGlzLl9ob3VyKSkge1xuICAgICAgICBjb25zdCBob3VyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5ob3VyOm5vdCguZGlzYWJsZWQpJyk7XG4gICAgICAgIGlmIChob3VyKSB7XG4gICAgICAgICAgdGhpcy5faG91ciA9IGhvdXIudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9taW51dGUgfHwgdGhpcy5pc01pbnV0ZXNEaXNhYmxlZCh0aGlzLl9taW51dGUpKSB7XG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcubWludXRlOm5vdCguZGlzYWJsZWQpJyk7XG4gICAgICAgIGlmIChtaW51dGUpIHtcbiAgICAgICAgICB0aGlzLl9taW51dGUgPSBtaW51dGUudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIGlmICh0aGlzLmlzU3RyaWN0VGltZSgpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZWNvbmQgfHwgdGhpcy5pc1NlY29uZHNEaXNhYmxlZCh0aGlzLl9zZWNvbmQpKSB7XG4gICAgICAgICAgY29uc3Qgc2Vjb25kID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5zZWNvbmQ6bm90KC5kaXNhYmxlZCknKTtcbiAgICAgICAgICBpZiAoc2Vjb25kKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWNvbmQgPSBzZWNvbmQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBnZXRUaW1lKCkge1xuICAgIGlmICh0aGlzLl9ob3VyICYmIHRoaXMuX21pbnV0ZSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuX2hvdXJ9OiR7dGhpcy5fbWludXRlfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlzQ3VycmVudERhdGUoZGF0YSkge1xuICAgIGlmICh0aGlzLnllYXJNb2RlKSB7XG4gICAgICByZXR1cm4gZ2V0WWVhcihkYXRhLmRhdGUgKiAxMDAwKSA9PT0gZ2V0WWVhcih0aGlzLmN1cnJlbnREYXRlICogMTAwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vbnRoTW9kZSkge1xuICAgICAgcmV0dXJuIGdldE1vbnRoKGRhdGEuZGF0ZSAqIDEwMDApID09PSBnZXRNb250aCh0aGlzLmN1cnJlbnREYXRlICogMTAwMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmRhdGUgPT09IHRoaXMuY3VycmVudERhdGU7XG4gIH1cblxuICB1cGRhdGVkKHByb3BlcnRpZXMpIHtcbiAgICBpZiAocHJvcGVydGllcy5oYXMoJ3llYXInKSkge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgneWVhci1jaGFuZ2VkJywgeyBkZXRhaWw6IHsgdmFsdWU6IHRoaXMueWVhciB9IH0pKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcHJvcGVydGllcy5oYXMoJ2xvY2FsZScpIHx8XG4gICAgICBwcm9wZXJ0aWVzLmhhcygneWVhcicpIHx8XG4gICAgICBwcm9wZXJ0aWVzLmhhcygnbW9udGgnKSB8fFxuICAgICAgcHJvcGVydGllcy5oYXMoJ21vbnRoTW9kZScpIHx8XG4gICAgICBwcm9wZXJ0aWVzLmhhcygneWVhck1vZGUnKVxuICAgICkge1xuICAgICAgdGhpcy55ZWFyQW5kTW9udGhDaGFuZ2VkKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnRpZXMuaGFzKCdfaG91cicpIHx8IHByb3BlcnRpZXMuaGFzKCdfbWludXRlJykpIHtcbiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKS5mb3JFYWNoKCh0aW1lKSA9PiB7XG4gICAgICAgIHRpbWUucGFyZW50Tm9kZS5zY3JvbGxUb3AgPSB0aW1lLm9mZnNldFRvcCAtIHRpbWUucGFyZW50Tm9kZS5vZmZzZXRUb3A7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlRGF5cygpIHtcbiAgICBjb25zdCBkYXlOYW1lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSArPSAxKSB7XG4gICAgICBkYXlOYW1lcy5wdXNoKHRoaXMubG9jYWxlLmxvY2FsaXplLmRheShpLCB7IHdpZHRoOiAnc2hvcnQnIH0pKTtcbiAgICB9XG4gICAgY29uc3QgZmlyc3REYXlPZldlZWsgPSB0aGlzLmxvY2FsZS5vcHRpb25zLndlZWtTdGFydHNPbjtcbiAgICBjb25zdCB0bXAgPSBkYXlOYW1lcy5zbGljZSgpLnNwbGljZSgwLCBmaXJzdERheU9mV2Vlayk7XG4gICAgdGhpcy5fZGF5TmFtZXNPZldlZWsgPSBkYXlOYW1lcy5zbGljZSgpLnNwbGljZShmaXJzdERheU9mV2VlaywgZGF5TmFtZXMubGVuZ3RoKS5jb25jYXQodG1wKTtcbiAgfVxuXG4gIHllYXJBbmRNb250aENoYW5nZWQoeWVhciwgbW9udGgpIHtcbiAgICBpZiAoeWVhciAmJiBtb250aCAmJiB0aGlzLmxvY2FsZSkge1xuICAgICAgaWYgKHRoaXMueWVhck1vZGUpIHtcbiAgICAgICAgdGhpcy5fZGF5TmFtZXNPZldlZWsgPSBbXTtcbiAgICAgICAgY29uc3QgY29scyA9IFtudWxsXTtcbiAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLmdldFllYXJJbnRlcnZhbCh5ZWFyKTtcbiAgICAgICAgZm9yIChsZXQgYyA9IHN0YXJ0OyBjIDwgZW5kOyBjKyspIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGVTdHJpbmcgPSBgMDEvJHttb250aH0vJHtjfWA7XG4gICAgICAgICAgY29uc3Qgc3RhcnREYXRlRm4gPSBwYXJzZShzdGFydERhdGVTdHJpbmcsICdkZC9NTS95eXl5JywgbmV3IERhdGUoKSwgeyBhd2FyZU9mVW5pY29kZVRva2VuczogdHJ1ZSB9KTtcbiAgICAgICAgICBjb2xzLnB1c2goe1xuICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgZGF0ZTogcGFyc2VJbnQoZm9ybWF0KHN0YXJ0RGF0ZUZuLCAndCcpLCAxMCksXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5jb21wdXRlTmFtZShtb250aCwgYywgJ3l5eXknKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb2xzLnB1c2gobnVsbCk7XG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMgPSBbY29sc107XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubW9udGhNb2RlKSB7XG4gICAgICAgIHRoaXMuX2RheU5hbWVzT2ZXZWVrID0gW107XG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMgPSBbXG4gICAgICAgICAgdGhpcy5fbW9udGhzTGlzdC5tYXAoKG1vbnRoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGVTdHJpbmcgPSBgMDEvJHttb250aH0vJHt5ZWFyfWA7XG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGVGbiA9IHBhcnNlKHN0YXJ0RGF0ZVN0cmluZywgJ2RkL01NL3l5eXknLCBuZXcgRGF0ZSgpLCB7IGF3YXJlT2ZVbmljb2RlVG9rZW5zOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICBkYXRlOiBwYXJzZUludChmb3JtYXQoc3RhcnREYXRlRm4sICd0JyksIDEwKSxcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuY29tcHV0ZU5hbWUobW9udGgsIHRoaXMueWVhciwgJ01NTScpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURheXMoKTtcbiAgICAgICAgbGV0IG1vbnRoTWludXMgPSBtb250aDtcbiAgICAgICAgbW9udGhNaW51cyA9IG1vbnRoTWludXMuc3Vic3RyaW5nKG1vbnRoTWludXMubGVuZ3RoIC0gMik7XG4gICAgICAgIGxldCBzdGFydERhdGVTdHJpbmcgPSBgMDEvJHttb250aE1pbnVzfS8ke3llYXJ9YDtcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZUZuID0gcGFyc2Uoc3RhcnREYXRlU3RyaW5nLCAnZGQvTU0veXl5eScsIG5ldyBEYXRlKCksIHsgYXdhcmVPZlVuaWNvZGVUb2tlbnM6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGVuZERhdGVGbiA9IGVuZE9mTW9udGgoc3RhcnREYXRlRm4pO1xuICAgICAgICBjb25zdCBlbmREYXRlU3RyaW5nID0gZm9ybWF0KGVuZERhdGVGbiwgJ2RkL01NL3l5eXknLCB7IGF3YXJlT2ZVbmljb2RlVG9rZW5zOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZXZWVrID0gdGhpcy5sb2NhbGUub3B0aW9ucy53ZWVrU3RhcnRzT247XG4gICAgICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICAgICAgbGV0IGNvbHVtbnMgPSBbXTtcblxuICAgICAgICBjb25zdCBsYXN0RGF5T2ZXZWVrID0gNjtcblxuICAgICAgICB3aGlsZSAoc3RhcnREYXRlU3RyaW5nICE9PSBlbmREYXRlU3RyaW5nKSB7XG4gICAgICAgICAgbGV0IGRheU51bWJlckZuID0gZ2V0RGF5KHN0YXJ0RGF0ZUZuKSAtIGZpcnN0RGF5T2ZXZWVrO1xuICAgICAgICAgIGlmIChkYXlOdW1iZXJGbiA8IDApIHtcbiAgICAgICAgICAgIGRheU51bWJlckZuID0gNjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5GbiA9IHtcbiAgICAgICAgICAgIGhvdmVyOiBmYWxzZSxcbiAgICAgICAgICAgIGRhdGU6IHBhcnNlSW50KGZvcm1hdChzdGFydERhdGVGbiwgJ3QnKSwgMTApLFxuICAgICAgICAgICAgdGl0bGU6IHBhcnNlSW50KGZvcm1hdChzdGFydERhdGVGbiwgJ2QnLCB7IGF3YXJlT2ZVbmljb2RlVG9rZW5zOiB0cnVlIH0pLCAxMCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uRm4pO1xuXG4gICAgICAgICAgaWYgKGRheU51bWJlckZuID09PSBsYXN0RGF5T2ZXZWVrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY29sdW1ucy5sZW5ndGg7IGkgPCBsYXN0RGF5T2ZXZWVrICsgMTsgaSArPSAxKSB7XG4gICAgICAgICAgICAgIGNvbHVtbnMudW5zaGlmdCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd3MucHVzaChjb2x1bW5zLnNsaWNlKCkpO1xuICAgICAgICAgICAgY29sdW1ucyA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXJ0RGF0ZUZuID0gYWRkRGF5cyhzdGFydERhdGVGbiwgMSk7XG4gICAgICAgICAgc3RhcnREYXRlU3RyaW5nID0gZm9ybWF0KHN0YXJ0RGF0ZUZuLCAnZGQvTU0veXl5eScsIHsgYXdhcmVPZlVuaWNvZGVUb2tlbnM6IHRydWUgfSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnREYXRlU3RyaW5nID09PSBlbmREYXRlU3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRDb2x1bW5GbiA9IHtcbiAgICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICBkYXRlOiBwYXJzZUludChmb3JtYXQoc3RhcnREYXRlRm4sICd0JyksIDEwKSxcbiAgICAgICAgICAgICAgdGl0bGU6IHBhcnNlSW50KGZvcm1hdChzdGFydERhdGVGbiwgJ2QnLCB7IGF3YXJlT2ZVbmljb2RlVG9rZW5zOiB0cnVlIH0pLCAxMCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKGVuZENvbHVtbkZuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjb2x1bW5zLmxlbmd0aDsgaSA8PSBsYXN0RGF5T2ZXZWVrOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93cy5wdXNoKGNvbHVtbnMuc2xpY2UoKSk7XG4gICAgICAgICAgICBjb2x1bW5zID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMgPSByb3dzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFllYXJJbnRlcnZhbCh5ZWFyID0gdGhpcy55ZWFyKSB7XG4gICAgbGV0IHN0YXJ0ID0gcGFyc2VJbnQoeWVhciwgMTApO1xuICAgIHdoaWxlIChzdGFydCAlIDEwICE9PSAwKSB7XG4gICAgICBzdGFydC0tO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kOiBzdGFydCArIDEwIH07XG4gIH1cblxuICBjb21wdXRlTmFtZShtb250aCwgeWVhciwgX2Zvcm1hdCA9ICdNTU1NJykge1xuICAgIGlmIChtb250aCAmJiB5ZWFyKSB7XG4gICAgICBjb25zdCBkYXRlRm4gPSBwYXJzZShgJHttb250aH0vJHt5ZWFyfWAsICdNTS95eXl5JywgbmV3IERhdGUoKSk7XG4gICAgICByZXR1cm4gZm9ybWF0KGRhdGVGbiwgX2Zvcm1hdCwgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb21wdXRlQ3VycmVudFllYXJOYW1lKCkge1xuICAgIGlmICh0aGlzLnllYXJNb2RlKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMuZ2V0WWVhckludGVydmFsKCk7XG4gICAgICByZXR1cm4gYCR7c3RhcnR9LSR7ZW5kIC0gMX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy55ZWFyO1xuICB9XG5cbiAgX29uU2VsZWN0SG91cih2YWx1ZSkge1xuICAgIHRoaXMuX2hvdXIgPSB2YWx1ZTtcbiAgICB0aGlzLl91cGRhdGVUaW1lKCk7XG4gIH1cblxuICBfb25TZWxlY3RNaW51dGUodmFsdWUpIHtcbiAgICB0aGlzLl9taW51dGUgPSB2YWx1ZTtcbiAgICB0aGlzLl91cGRhdGVUaW1lKCk7XG4gIH1cblxuICBfb25TZWxlY3RTZWNvbmQodmFsdWUpIHtcbiAgICB0aGlzLl9zZWNvbmQgPSB2YWx1ZTtcbiAgICB0aGlzLl91cGRhdGVUaW1lKCk7XG4gIH1cblxuICBfb25TZWxlY3RNb250aCgpIHtcbiAgICBpZiAodGhpcy5tb250aE1vZGUpIHtcbiAgICAgIHRoaXMuX2Zyb20gPSB0aGlzLl9kYXRlRnJvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0ZUZyb20gPSB0aGlzLl9mcm9tO1xuICAgICAgdGhpcy5fZnJvbSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMueWVhck1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLm1vbnRoTW9kZSA9ICF0aGlzLm1vbnRoTW9kZTtcbiAgICB0aGlzLnllYXJBbmRNb250aENoYW5nZWQodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdtb250aC1tb2RlJywgeyBtb2RlOiB0aGlzLm1vbnRoTW9kZSwgbW9udGg6IHRoaXMubW9udGgsIHllYXI6IHRoaXMueWVhciB9KTtcbiAgfVxuXG4gIF9vblNlbGVjdFllYXIoKSB7XG4gICAgaWYgKHRoaXMueWVhck1vZGUpIHtcbiAgICAgIHRoaXMuX2Zyb20gPSB0aGlzLl9kYXRlRnJvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0ZUZyb20gPSB0aGlzLl9mcm9tO1xuICAgICAgdGhpcy5fZnJvbSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMubW9udGhNb2RlID0gZmFsc2U7XG4gICAgdGhpcy55ZWFyTW9kZSA9ICF0aGlzLnllYXJNb2RlO1xuICAgIHRoaXMueWVhckFuZE1vbnRoQ2hhbmdlZCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3llYXItbW9kZScsIHsgbW9kZTogdGhpcy55ZWFyTW9kZSwgbW9udGg6IHRoaXMubW9udGgsIHllYXI6IHRoaXMueWVhciB9KTtcbiAgfVxuXG4gIGdldCBkYXRldGltZVNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLmlzU3RyaWN0VGltZSgpICYmIHRoaXMuX2Zyb20gPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZnJvbSA9IG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMDtcbiAgICB9XG4gICAgbGV0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuX2Zyb20gKiAxMDAwKTtcbiAgICBzZWxlY3RlZERhdGUgPSBzZXRIb3VycyhzZWxlY3RlZERhdGUsIHBhcnNlSW50KHRoaXMuX2hvdXIgPyB0aGlzLl9ob3VyIDogMCwgMTApKTtcbiAgICBzZWxlY3RlZERhdGUgPSBzZXRNaW51dGVzKHNlbGVjdGVkRGF0ZSwgcGFyc2VJbnQodGhpcy5fbWludXRlID8gdGhpcy5fbWludXRlIDogMCwgMTApKTtcbiAgICByZXR1cm4gc2VsZWN0ZWREYXRlLmdldFRpbWUoKSAvIDEwMDA7XG4gIH1cblxuICBfb25EYXRlVGltZVNlbGVjdGVkKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmRhdGV0aW1lU2VsZWN0ZWQ7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZGF0ZS1mcm9tLWNoYW5nZWQnLCB7IGRldGFpbDogeyB2YWx1ZTogdGhpcy52YWx1ZSB9IH0pKTtcbiAgfVxuXG4gIF9vbk5vdygpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGlmICghdGhpcy5pc1N0cmljdFRpbWUoKSkge1xuICAgICAgbm93LnNldFNlY29uZHMoMCwgMCk7XG4gICAgfVxuICAgIHRoaXMuX2Zyb20gPSBub3cuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICB0aGlzLm1vbnRoID0gZm9ybWF0KG5vdywgJ01NJyk7XG4gICAgdGhpcy55ZWFyID0gZm9ybWF0KG5vdywgJ3l5eXknKTtcbiAgICB0aGlzLl9ob3VyID0gZm9ybWF0KG5vdywgJ0hIJyk7XG4gICAgdGhpcy5fbWludXRlID0gZm9ybWF0KG5vdywgJ21tJyk7XG4gICAgaWYgKHRoaXMuaXNTdHJpY3RUaW1lKCkpIHtcbiAgICAgIHRoaXMuX3NlY29uZCA9IGZvcm1hdChub3csICdtbScpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkYXRlLWZyb20tY2hhbmdlZCcsIHsgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLl9mcm9tIH0gfSkpO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVWYWxpZGF0aW9uKCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGV0aW1lU2VsZWN0ZWQ7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIGlmICh0aGlzLm1pbiAmJiBkYXRlIDwgdGhpcy5taW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXggJiYgZGF0ZSA+IHRoaXMubWF4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfb25TZWxlY3QoeyBkZXRhaWwgfSkge1xuICAgIGNvbnN0IHsgZGF0ZSB9ID0gZGV0YWlsO1xuICAgIGlmICh0aGlzLnllYXJNb2RlKSB7XG4gICAgICB0aGlzLnllYXJNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLm1vbnRoTW9kZSA9IHRydWU7XG4gICAgICB0aGlzLl9mcm9tID0gdGhpcy5fZGF0ZUZyb207XG4gICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlICogMTAwMCk7XG4gICAgICB0aGlzLnllYXIgPSBmb3JtYXQoc2VsZWN0ZWREYXRlLCAneXl5eScpO1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAneWVhci1jaGFuZ2VkJywgeyB5ZWFyOiB0aGlzLnllYXIgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vbnRoTW9kZSkge1xuICAgICAgdGhpcy5tb250aE1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Zyb20gPSB0aGlzLl9kYXRlRnJvbTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUgKiAxMDAwKTtcbiAgICAgIHRoaXMubW9udGggPSBmb3JtYXQoc2VsZWN0ZWREYXRlLCAnTU0nKTtcbiAgICAgIHRoaXMueWVhciA9IGZvcm1hdChzZWxlY3RlZERhdGUsICd5eXl5Jyk7XG4gICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdtb250aC1jaGFuZ2VkJywgeyBtb250aDogdGhpcy5tb250aCwgeWVhcjogdGhpcy55ZWFyIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy50aW1lKSB7XG4gICAgICB0aGlzLl9mcm9tID0gZGF0ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucmFuZ2UpIHtcbiAgICAgIGlmICh0aGlzLl9mcm9tICYmIHRoaXMuX3RvKSB7XG4gICAgICAgIHRoaXMuX2Zyb20gPSBkYXRlO1xuICAgICAgICB0aGlzLl90byA9IG51bGw7XG4gICAgICAgIHRoaXMuaG92ZXJlZERhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hvdmVyZWQtZGF0ZS1jaGFuZ2VkJywgeyBkZXRhaWw6IHsgdmFsdWU6IHRoaXMuaG92ZXJlZERhdGUgfSB9KSk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9mcm9tIHx8ICh0aGlzLl9mcm9tICYmIGRhdGUgPCB0aGlzLl9mcm9tKSkge1xuICAgICAgICB0aGlzLl9mcm9tID0gZGF0ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3RvIHx8ICh0aGlzLl90byAmJiBkYXRlID4gdGhpcy5fdG8pKSB7XG4gICAgICAgIHRoaXMuX3RvID0gZGF0ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RhdGUtZnJvbS1jaGFuZ2VkJywgeyBkZXRhaWw6IHsgdmFsdWU6IHRoaXMuX2Zyb20gfSB9KSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkYXRlLXRvLWNoYW5nZWQnLCB7IGRldGFpbDogeyB2YWx1ZTogdGhpcy5fdG8gfSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Zyb20gPSBkYXRlO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZGF0ZS1mcm9tLWNoYW5nZWQnLCB7IGRldGFpbDogeyB2YWx1ZTogdGhpcy5fZnJvbSB9IH0pKTtcbiAgICB9XG4gIH1cblxuICBfb25Ib3ZlcihldmVudCkge1xuICAgIGlmICh0aGlzLnJhbmdlKSB7XG4gICAgICB0aGlzLmhvdmVyZWREYXRlID0gZXZlbnQuZGV0YWlsLmRhdGU7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdob3ZlcmVkLWRhdGUtY2hhbmdlZCcsIHsgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmhvdmVyZWREYXRlIH0gfSkpO1xuICAgIH1cbiAgfVxuXG4gIF9vbk5leHRNb250aCgpIHtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlKHRoaXMubW9udGgsICdNTScsIG5ldyBEYXRlKCkpO1xuICAgIGNvbnN0IG1vbnRoUGx1c0RhdGUgPSBhZGRNb250aHMobW9udGgsIDEpO1xuICAgIGNvbnN0IG1vbnRoUGx1c1N0cmluZyA9IGZvcm1hdChtb250aFBsdXNEYXRlLCAnTU0nLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSk7XG5cbiAgICB0aGlzLm1vbnRoID0gbW9udGhQbHVzU3RyaW5nO1xuICAgIGlmICh0aGlzLm1vbnRoID09PSAnMDEnKSB7XG4gICAgICBjb25zdCB5ZWFyID0gcGFyc2UodGhpcy55ZWFyLCAneXl5eScsIG5ldyBEYXRlKCkpO1xuICAgICAgY29uc3QgeWVhclBsdXNEYXRlID0gYWRkWWVhcnMoeWVhciwgMSk7XG4gICAgICBjb25zdCB5ZWFyUGx1c1N0cmluZyA9IGZvcm1hdCh5ZWFyUGx1c0RhdGUsICd5eXl5JywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pO1xuICAgICAgdGhpcy55ZWFyID0geWVhclBsdXNTdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgX29uUHJldk1vbnRoKCkge1xuICAgIGNvbnN0IG1vbnRoID0gcGFyc2UodGhpcy5tb250aCwgJ01NJywgbmV3IERhdGUoKSk7XG4gICAgY29uc3QgbW9udGhNaW51c0RhdGUgPSBzdWJNb250aHMobW9udGgsIDEpO1xuICAgIGNvbnN0IG1vbnRoTWludXNTdHJpbmcgPSBmb3JtYXQobW9udGhNaW51c0RhdGUsICdNTScsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KTtcblxuICAgIHRoaXMubW9udGggPSBtb250aE1pbnVzU3RyaW5nO1xuICAgIGlmICh0aGlzLm1vbnRoID09PSAnMTInKSB7XG4gICAgICBjb25zdCB5ZWFyID0gcGFyc2UodGhpcy55ZWFyLCAneXl5eScsIG5ldyBEYXRlKCkpO1xuICAgICAgY29uc3QgeWVhck1pbnVzRGF0ZSA9IHN1YlllYXJzKHllYXIsIDEpO1xuICAgICAgY29uc3QgeWVhck1pbnVzU3RyaW5nID0gZm9ybWF0KHllYXJNaW51c0RhdGUsICd5eXl5JywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pO1xuICAgICAgdGhpcy55ZWFyID0geWVhck1pbnVzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIF9vbk5leHRZZWFyKCkge1xuICAgIGlmICh0aGlzLnllYXJNb2RlKSB7XG4gICAgICB0aGlzLnllYXIgPSBwYXJzZUludCh0aGlzLnllYXIsIDEwKSArIDEwO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gcGFyc2UodGhpcy55ZWFyLCAneXl5eScsIG5ldyBEYXRlKCkpO1xuICAgIGNvbnN0IHllYXJQbHVzRGF0ZSA9IGFkZFllYXJzKHllYXIsIDEpO1xuICAgIGNvbnN0IHllYXJQbHVzU3RyaW5nID0gZm9ybWF0KHllYXJQbHVzRGF0ZSwgJ3l5eXknLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSk7XG4gICAgdGhpcy55ZWFyID0geWVhclBsdXNTdHJpbmc7XG4gIH1cblxuICBfb25QcmV2WWVhcigpIHtcbiAgICBpZiAodGhpcy55ZWFyTW9kZSkge1xuICAgICAgdGhpcy55ZWFyID0gcGFyc2VJbnQodGhpcy55ZWFyLCAxMCkgLSAxMDtcbiAgICB9XG4gICAgY29uc3QgeWVhciA9IHBhcnNlKHRoaXMueWVhciwgJ3l5eXknLCBuZXcgRGF0ZSgpKTtcbiAgICBjb25zdCB5ZWFyTWludXNEYXRlID0gc3ViWWVhcnMoeWVhciwgMSk7XG4gICAgY29uc3QgeWVhck1pbnVzU3RyaW5nID0gZm9ybWF0KHllYXJNaW51c0RhdGUsICd5eXl5JywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pO1xuICAgIHRoaXMueWVhciA9IHllYXJNaW51c1N0cmluZztcbiAgfVxuXG4gIGdvVG9kYXkoKSB7XG4gICAgdGhpcy5tb250aCA9IGAwJHtnZXRNb250aChuZXcgRGF0ZSgpKSArIDF9YC5zbGljZSgtMik7XG4gICAgdGhpcy55ZWFyID0gZ2V0WWVhcihuZXcgRGF0ZSgpKTtcbiAgICB0aGlzLl9vblNlbGVjdCh7IGRldGFpbDogeyBkYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDAgfSB9KTtcbiAgfVxuXG4gIGhhc0dvVG9kYXkoKSB7XG4gICAgcmV0dXJuICF0aGlzLnJhbmdlICYmICF0aGlzLnRpbWUgJiYgIXRoaXMubW9udGhNb2RlICYmICF0aGlzLnllYXJNb2RlICYmIHRoaXMuX2hhc0dvVG9kYXk7XG4gIH1cbn1cblxud2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZ3YtZGF0ZS1waWNrZXItY2FsZW5kYXInLCBHdkRhdGVQaWNrZXJDYWxlbmRhcik7XG4iXX0=
|