ngx-animating-datepicker 1.2.1 → 2.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.
Files changed (58) hide show
  1. package/README.md +8 -0
  2. package/fesm2022/ngx-animating-datepicker.mjs +1534 -0
  3. package/fesm2022/ngx-animating-datepicker.mjs.map +1 -0
  4. package/package.json +32 -17
  5. package/types/ngx-animating-datepicker.d.ts +551 -0
  6. package/bundles/ngx-animating-datepicker.umd.js +0 -2611
  7. package/bundles/ngx-animating-datepicker.umd.js.map +0 -1
  8. package/bundles/ngx-animating-datepicker.umd.min.js +0 -2
  9. package/bundles/ngx-animating-datepicker.umd.min.js.map +0 -1
  10. package/esm2015/lib/components/animatepicker/animatepicker.component.js +0 -486
  11. package/esm2015/lib/components/datepicker/datepicker.component.js +0 -715
  12. package/esm2015/lib/components/datepicker/datepicker.directive.js +0 -407
  13. package/esm2015/lib/components/datepicker/datepicker.options.js +0 -41
  14. package/esm2015/lib/components/navigation/navigation.component.js +0 -233
  15. package/esm2015/lib/components/sub-navigation/sub-navigation.component.js +0 -48
  16. package/esm2015/lib/models/datepicker-options.model.js +0 -35
  17. package/esm2015/lib/models/datepicker.model.js +0 -75
  18. package/esm2015/lib/models/directive-options.model.js +0 -19
  19. package/esm2015/lib/ngx-animating-datepicker.module.js +0 -35
  20. package/esm2015/lib/services/datepicker.service.js +0 -161
  21. package/esm2015/lib/services/utilities.service.js +0 -56
  22. package/esm2015/ngx-animating-datepicker.js +0 -13
  23. package/esm2015/public_api.js +0 -8
  24. package/esm5/lib/components/animatepicker/animatepicker.component.js +0 -584
  25. package/esm5/lib/components/datepicker/datepicker.component.js +0 -940
  26. package/esm5/lib/components/datepicker/datepicker.directive.js +0 -498
  27. package/esm5/lib/components/datepicker/datepicker.options.js +0 -41
  28. package/esm5/lib/components/navigation/navigation.component.js +0 -298
  29. package/esm5/lib/components/sub-navigation/sub-navigation.component.js +0 -48
  30. package/esm5/lib/models/datepicker-options.model.js +0 -35
  31. package/esm5/lib/models/datepicker.model.js +0 -75
  32. package/esm5/lib/models/directive-options.model.js +0 -19
  33. package/esm5/lib/ngx-animating-datepicker.module.js +0 -39
  34. package/esm5/lib/services/datepicker.service.js +0 -307
  35. package/esm5/lib/services/utilities.service.js +0 -73
  36. package/esm5/ngx-animating-datepicker.js +0 -13
  37. package/esm5/public_api.js +0 -8
  38. package/fesm2015/ngx-animating-datepicker.js +0 -1911
  39. package/fesm2015/ngx-animating-datepicker.js.map +0 -1
  40. package/fesm5/ngx-animating-datepicker.js +0 -2546
  41. package/fesm5/ngx-animating-datepicker.js.map +0 -1
  42. package/lib/components/animatepicker/animatepicker.component.d.ts +0 -114
  43. package/lib/components/datepicker/datepicker.component.d.ts +0 -191
  44. package/lib/components/datepicker/datepicker.directive.d.ts +0 -92
  45. package/lib/components/datepicker/datepicker.options.d.ts +0 -20
  46. package/lib/components/navigation/navigation.component.d.ts +0 -52
  47. package/lib/components/sub-navigation/sub-navigation.component.d.ts +0 -8
  48. package/lib/models/datepicker-options.model.d.ts +0 -14
  49. package/lib/models/datepicker.model.d.ts +0 -29
  50. package/lib/models/directive-options.model.d.ts +0 -6
  51. package/lib/ngx-animating-datepicker.module.d.ts +0 -2
  52. package/lib/services/datepicker.service.d.ts +0 -77
  53. package/lib/services/utilities.service.d.ts +0 -12
  54. package/ngx-animating-datepicker-1.2.0.tgz +0 -0
  55. package/ngx-animating-datepicker-1.2.1.tgz +0 -0
  56. package/ngx-animating-datepicker.d.ts +0 -8
  57. package/ngx-animating-datepicker.metadata.json +0 -1
  58. package/public_api.d.ts +0 -5
@@ -1,584 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { Component, ElementRef, HostBinding, Input, ViewChild, } from '@angular/core';
7
- import { DatepickerService } from '../../services/datepicker.service';
8
- import { UtilitiesService } from '../../services/utilities.service';
9
- import { DatepickerComponent } from '../datepicker/datepicker.component';
10
- var AnimatepickerComponent = /** @class */ (function (_super) {
11
- tslib_1.__extends(AnimatepickerComponent, _super);
12
- function AnimatepickerComponent(elementRef, utilities) {
13
- var _this = _super.call(this, utilities, elementRef) || this;
14
- _this.elementRef = elementRef;
15
- _this.utilities = utilities;
16
- /* ==============================================
17
- * Internal Properties
18
- * ============================================== */
19
- _this.animate = true;
20
- _this.isAnimating = false;
21
- _this.leftInnerPosition = 0;
22
- _this.currentYearMonth = null;
23
- _this.initialised = false;
24
- /* ==============================================
25
- * External Properties
26
- * ============================================== */
27
- /**
28
- * Number of months: the number of months displayed
29
- */
30
- _this._numberOfMonths = new Array(1);
31
- return _this;
32
- }
33
- Object.defineProperty(AnimatepickerComponent.prototype, "numberOfMonths", {
34
- get: /**
35
- * @return {?}
36
- */
37
- function () {
38
- return this._numberOfMonths;
39
- },
40
- set: /**
41
- * @param {?} value
42
- * @return {?}
43
- */
44
- function (value) {
45
- if (value === undefined || value === this._numberOfMonths.length) {
46
- return;
47
- }
48
- this._numberOfMonths = new Array(value);
49
- this.setDatePickerDimension();
50
- this.goToDate(this.date);
51
- },
52
- enumerable: true,
53
- configurable: true
54
- });
55
- /**
56
- * @return {?}
57
- */
58
- AnimatepickerComponent.prototype.ngOnInit = /**
59
- * @return {?}
60
- */
61
- function () {
62
- // Get the computed width from the calendar. Set the initial width
63
- /** @type {?} */
64
- var computedWidth = window
65
- .getComputedStyle(this.elementRef.nativeElement, null)
66
- .getPropertyValue('width');
67
- this.initialWidth = parseInt(computedWidth, 10);
68
- this.initialised = true;
69
- // Set the current year and month object
70
- if (!this.month && !this.year) {
71
- this.goToDate(this.options.currentDate);
72
- }
73
- };
74
- /**
75
- * @return {?}
76
- */
77
- AnimatepickerComponent.prototype.ngAfterViewInit = /**
78
- * @return {?}
79
- */
80
- function () {
81
- var _this = this;
82
- setTimeout(function () {
83
- _this.setDatePickerDimension();
84
- _this.setDatepickerHeight(true);
85
- });
86
- };
87
- /**
88
- * Set the height and the width properties
89
- */
90
- /**
91
- * Set the height and the width properties
92
- * @return {?}
93
- */
94
- AnimatepickerComponent.prototype.setDatePickerDimension = /**
95
- * Set the height and the width properties
96
- * @return {?}
97
- */
98
- function () {
99
- this.datepickerHeight =
100
- this.calendarContainer.nativeElement.offsetHeight +
101
- this.calendarTopContainer.nativeElement.offsetHeight +
102
- this.footer.nativeElement.offsetHeight;
103
- this.calendarHeight = this.calendarContainer.nativeElement.offsetHeight;
104
- this.datepickerWidth = this.initialWidth * this._numberOfMonths.length;
105
- };
106
- /**
107
- * Go to a specific month
108
- *
109
- * @param date - optional
110
- */
111
- /**
112
- * Go to a specific month
113
- *
114
- * @param {?=} date - optional
115
- * @return {?}
116
- */
117
- AnimatepickerComponent.prototype.goToDate = /**
118
- * Go to a specific month
119
- *
120
- * @param {?=} date - optional
121
- * @return {?}
122
- */
123
- function (date) {
124
- if (date) {
125
- this.currentYearMonth = this.getNextYearMonthArray(date.getFullYear(), date.getMonth());
126
- }
127
- this.calendarWidth = 50 / this._numberOfMonths.length;
128
- this.months = this.getNextMonthArray(this.currentYearMonth, true);
129
- this.resetStyle();
130
- };
131
- /**
132
- * Create an array of the next year and months
133
- *
134
- * @param year
135
- * @param month
136
- */
137
- /**
138
- * Create an array of the next year and months
139
- *
140
- * @param {?} year
141
- * @param {?} month
142
- * @return {?}
143
- */
144
- AnimatepickerComponent.prototype.getNextYearMonthArray = /**
145
- * Create an array of the next year and months
146
- *
147
- * @param {?} year
148
- * @param {?} month
149
- * @return {?}
150
- */
151
- function (year, month) {
152
- /** @type {?} */
153
- var array = [];
154
- for (var index = 0; index < this._numberOfMonths.length; index++) {
155
- array.push({ year: year, month: month });
156
- year = DatepickerService.getYearOfNextMonth(year, month);
157
- month = DatepickerService.getNextMonth(month);
158
- }
159
- return array;
160
- };
161
- /**
162
- * Create an array of the previous year and months
163
- *
164
- * @param year
165
- * @param month
166
- */
167
- /**
168
- * Create an array of the previous year and months
169
- *
170
- * @param {?} year
171
- * @param {?} month
172
- * @return {?}
173
- */
174
- AnimatepickerComponent.prototype.getPreviousYearMonthArray = /**
175
- * Create an array of the previous year and months
176
- *
177
- * @param {?} year
178
- * @param {?} month
179
- * @return {?}
180
- */
181
- function (year, month) {
182
- /** @type {?} */
183
- var array = [];
184
- for (var index = 0; index < this._numberOfMonths.length; index++) {
185
- array.unshift({ year: year, month: month });
186
- year = DatepickerService.getYearOfPreviousMonth(year, month);
187
- month = DatepickerService.getPreviousMonth(month);
188
- }
189
- return array;
190
- };
191
- /**
192
- * Set the datepicker height, used when animating
193
- *
194
- * @param directionRight - Set optional when sliding to the right
195
- */
196
- /**
197
- * Set the datepicker height, used when animating
198
- *
199
- * @param {?=} directionRight - Set optional when sliding to the right
200
- * @return {?}
201
- */
202
- AnimatepickerComponent.prototype.setDatepickerHeight = /**
203
- * Set the datepicker height, used when animating
204
- *
205
- * @param {?=} directionRight - Set optional when sliding to the right
206
- * @return {?}
207
- */
208
- function (directionRight) {
209
- /** @type {?} */
210
- var indexArray;
211
- // TODO: Seperate this logic for readability purpose
212
- if (this._numberOfMonths.length > 1) {
213
- /** @type {?} */
214
- var start = directionRight ? 0 : this._numberOfMonths.length;
215
- /** @type {?} */
216
- var end = directionRight
217
- ? this._numberOfMonths.length - 1
218
- : this._numberOfMonths.length + this._numberOfMonths.length - 1;
219
- indexArray = this.utilities.createArray(start, end);
220
- }
221
- else {
222
- indexArray = directionRight ? [0] : [1];
223
- }
224
- /** @type {?} */
225
- var that = this;
226
- setTimeout(function () {
227
- /** @type {?} */
228
- var calendarArray = that.elementRef.nativeElement.querySelectorAll('.datepicker__calendar-container');
229
- /** @type {?} */
230
- var offsetHeight = 0;
231
- indexArray.forEach(function (el) {
232
- if (calendarArray[el].offsetHeight > offsetHeight) {
233
- offsetHeight = calendarArray[el].offsetHeight;
234
- }
235
- });
236
- // TODO: Merge with setHeight function.
237
- that.datepickerHeight =
238
- offsetHeight + that.calendarTopContainer.nativeElement.offsetHeight + that.footer.nativeElement.offsetHeight;
239
- that.calendarHeight = offsetHeight;
240
- });
241
- };
242
- /**
243
- * Get next month array, gets multiple months.
244
- * Used when the options animate is set or multiple months are visable
245
- *
246
- * @return Month[]
247
- */
248
- /**
249
- * Get next month array, gets multiple months.
250
- * Used when the options animate is set or multiple months are visable
251
- *
252
- * @param {?} currentYearMonth
253
- * @param {?=} keepDate
254
- * @param {?=} nextMonthsYearMonthArray
255
- * @return {?} Month[]
256
- */
257
- AnimatepickerComponent.prototype.getNextMonthArray = /**
258
- * Get next month array, gets multiple months.
259
- * Used when the options animate is set or multiple months are visable
260
- *
261
- * @param {?} currentYearMonth
262
- * @param {?=} keepDate
263
- * @param {?=} nextMonthsYearMonthArray
264
- * @return {?} Month[]
265
- */
266
- function (currentYearMonth, keepDate, nextMonthsYearMonthArray) {
267
- var _this = this;
268
- if (keepDate === void 0) { keepDate = false; }
269
- // Get the last index, used for selecting the right year month object
270
- /** @type {?} */
271
- var lastIndex = this._numberOfMonths.length - 1;
272
- // Get next year and month in an Object
273
- /** @type {?} */
274
- var nextMonths = nextMonthsYearMonthArray ||
275
- this.getNextYearMonthArray(DatepickerService.getYearOfNextMonth(currentYearMonth[lastIndex].year, currentYearMonth[lastIndex].month), DatepickerService.getNextMonth(currentYearMonth[lastIndex].month));
276
- // Concatenates the two objects to create a total year and month object
277
- this.totalYearMonth = currentYearMonth.concat(nextMonths);
278
- // Create the calendar array using the total year and month Object
279
- /** @type {?} */
280
- var monthArray = [];
281
- this.totalYearMonth.forEach(function (e) {
282
- return monthArray.push(_this.createCalendarArray(e.year, e.month));
283
- });
284
- // Set the new current year and month object.
285
- if (!keepDate) {
286
- this.currentYearMonth = nextMonths;
287
- }
288
- return [].concat.apply([], monthArray);
289
- };
290
- /**
291
- * Gets an array of previous months.
292
- * Used for animation and when more months are displayed
293
- *
294
- * @param currentYearMonth
295
- * @param keepDate
296
- */
297
- /**
298
- * Gets an array of previous months.
299
- * Used for animation and when more months are displayed
300
- *
301
- * @param {?} currentYearMonth
302
- * @param {?=} keepDate
303
- * @return {?}
304
- */
305
- AnimatepickerComponent.prototype.getPreviousMonthArray = /**
306
- * Gets an array of previous months.
307
- * Used for animation and when more months are displayed
308
- *
309
- * @param {?} currentYearMonth
310
- * @param {?=} keepDate
311
- * @return {?}
312
- */
313
- function (currentYearMonth, keepDate) {
314
- var _this = this;
315
- if (keepDate === void 0) { keepDate = false; }
316
- // Get previous year and month in an Object
317
- /** @type {?} */
318
- var previousMonths = this.getPreviousYearMonthArray(DatepickerService.getYearOfPreviousMonth(currentYearMonth[0].year, currentYearMonth[0].month), DatepickerService.getPreviousMonth(currentYearMonth[0].month));
319
- // Concatenates the two objects to create a total year and month object
320
- this.totalYearMonth = previousMonths.concat(currentYearMonth);
321
- // Create the calendar array using the total year and month Object
322
- /** @type {?} */
323
- var monthArray = [];
324
- this.totalYearMonth.forEach(function (e) {
325
- monthArray.push(_this.createCalendarArray(e['year'], e['month']));
326
- });
327
- // Set the new current year and month object.
328
- if (!keepDate) {
329
- this.currentYearMonth = previousMonths;
330
- }
331
- return [].concat.apply([], monthArray);
332
- };
333
- /**
334
- * Update value is being triggered
335
- *
336
- * @param date
337
- */
338
- /**
339
- * Update value is being triggered
340
- *
341
- * @param {?} date
342
- * @return {?}
343
- */
344
- AnimatepickerComponent.prototype.updateValue = /**
345
- * Update value is being triggered
346
- *
347
- * @param {?} date
348
- * @return {?}
349
- */
350
- function (date) {
351
- if (this.options.range) {
352
- this.selectRange(date);
353
- }
354
- else if (!this.isSelected(date)) {
355
- if (this.options.selectMultiple) {
356
- this.selectDate(date);
357
- }
358
- else {
359
- this.toggleDate(date);
360
- }
361
- if (this.options.closeOnSelect) {
362
- this.close(true);
363
- }
364
- }
365
- else {
366
- this.deselectDate(date);
367
- if (this.options.closeOnSelect) {
368
- this.close(true);
369
- }
370
- }
371
- this.months = this.getNextMonthArray(this.currentYearMonth, true);
372
- this.resetStyle();
373
- };
374
- /**
375
- * Go to the next month
376
- */
377
- /**
378
- * Go to the next month
379
- * @return {?}
380
- */
381
- AnimatepickerComponent.prototype.goToNextMonth = /**
382
- * Go to the next month
383
- * @return {?}
384
- */
385
- function () {
386
- if (this.isAnimating) {
387
- return;
388
- }
389
- this.months = this.getNextMonthArray(this.currentYearMonth);
390
- this.resetStyle();
391
- this.setDatepickerHeight();
392
- this.slideLeft();
393
- };
394
- /**
395
- * Go to the previous month
396
- */
397
- /**
398
- * Go to the previous month
399
- * @return {?}
400
- */
401
- AnimatepickerComponent.prototype.goToPreviousMonth = /**
402
- * Go to the previous month
403
- * @return {?}
404
- */
405
- function () {
406
- if (this.isAnimating) {
407
- return;
408
- }
409
- this.months = this.getPreviousMonthArray(this.currentYearMonth);
410
- this.resetStyle(true);
411
- this.setDatepickerHeight(true);
412
- this.slideRight();
413
- };
414
- /**
415
- * Go to a specific month
416
- * TODO: WIP Check if date is in current range, or if it is later or earlier
417
- */
418
- /**
419
- * Go to a specific month
420
- * TODO: WIP Check if date is in current range, or if it is later or earlier
421
- * @param {?} date
422
- * @return {?}
423
- */
424
- AnimatepickerComponent.prototype.goToMonth = /**
425
- * Go to a specific month
426
- * TODO: WIP Check if date is in current range, or if it is later or earlier
427
- * @param {?} date
428
- * @return {?}
429
- */
430
- function (date) {
431
- /** @type {?} */
432
- var nextMonths = this.getNextYearMonthArray(date.getFullYear(), date.getMonth());
433
- this.months = this.getNextMonthArray(this.totalYearMonth, false, nextMonths);
434
- this.resetStyle();
435
- this.setDatepickerHeight();
436
- this.slideRight();
437
- };
438
- /**
439
- * Slide to the right
440
- */
441
- /**
442
- * Slide to the right
443
- * @return {?}
444
- */
445
- AnimatepickerComponent.prototype.slideRight = /**
446
- * Slide to the right
447
- * @return {?}
448
- */
449
- function () {
450
- var _this = this;
451
- this.setIsAnimating();
452
- setTimeout(function () {
453
- _this.transition =
454
- 'transform ' + _this.options.animationSpeed + 'ms ' + _this.options.easing;
455
- _this.translateX = 50;
456
- });
457
- };
458
- /**
459
- * Slide to the left (criss cross)
460
- */
461
- /**
462
- * Slide to the left (criss cross)
463
- * @return {?}
464
- */
465
- AnimatepickerComponent.prototype.slideLeft = /**
466
- * Slide to the left (criss cross)
467
- * @return {?}
468
- */
469
- function () {
470
- var _this = this;
471
- this.setIsAnimating();
472
- setTimeout(function () {
473
- _this.transition =
474
- 'transform ' + _this.options.animationSpeed + 'ms ' + _this.options.easing;
475
- _this.translateX = -50;
476
- });
477
- };
478
- /**
479
- * Set animating state
480
- */
481
- /**
482
- * Set animating state
483
- * @return {?}
484
- */
485
- AnimatepickerComponent.prototype.setIsAnimating = /**
486
- * Set animating state
487
- * @return {?}
488
- */
489
- function () {
490
- var _this = this;
491
- this.isAnimating = true;
492
- setTimeout(function () {
493
- _this.isAnimating = false;
494
- }, this.options.animationSpeed);
495
- };
496
- /**
497
- * Reset Style
498
- *
499
- * @param resetForPrevious - Optional
500
- */
501
- /**
502
- * Reset Style
503
- *
504
- * @param {?=} resetForPrevious - Optional
505
- * @return {?}
506
- */
507
- AnimatepickerComponent.prototype.resetStyle = /**
508
- * Reset Style
509
- *
510
- * @param {?=} resetForPrevious - Optional
511
- * @return {?}
512
- */
513
- function (resetForPrevious) {
514
- this.transition = 'transform 0ms ease-in';
515
- this.translateX = 0;
516
- this.leftInnerPosition = resetForPrevious ? -100 : 0;
517
- };
518
- AnimatepickerComponent.decorators = [
519
- { type: Component, args: [{
520
- selector: 'aa-animatepicker',
521
- template: "<div class=\"datepicker__wrapper\" [ngStyle]=\"datepickerPosition\">\n\t<div #calendarTopContainer>\n\t\t<div class=\"datepicker__header\" #header>\n\t\t\t<ng-content select=\"header\"></ng-content>\n\t\t</div>\n\t\t<aa-navigation\n\t\t\t\t(previousClick)=\"goToPreviousMonth()\"\n\t\t\t\t(nextClick)=\"goToNextMonth()\"\n\t\t\t\t(subNavigationClick)=\"goToDate($event)\"\n\t\t\t\t[language]=\"language\"\n\t\t\t\t[animate]=\"animate\"\n\t\t\t\t[translateX]=\"translateX\"\n\t\t\t\t[transition]=\"transition\"\n\t\t\t\t[leftPosition]=\"leftInnerPosition\"\n\t\t\t\t[hideNavigation]=\"options.hideNavigation\"\n\t\t\t\t[totalYearMonth]=\"totalYearMonth\"\n\t\t></aa-navigation>\n\n\t\t<div class=\"datepicker__weekdays-wrapper\">\n\t\t\t<div \t*ngFor=\"let month of numberOfMonths\"\n\t\t\t\t\t[ngStyle]=\"{\n\t\t\t\t'width.%': (100 / numberOfMonths.length)\n\t\t\t\t}\"\n\t\t\t\t\tclass=\"datepicker__weekdays-container\">\n\t\t\t\t<table class=\"datepicker__weekdays\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t<td class=\"datepicker__weekday\" *ngFor=\"let weekday of weekdays; index as i\">{{weekday}}</td>\n\t\t\t\t\t</thead>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"datepicker__main\" [ngStyle]=\"{\n\t\t'height.px': calendarHeight}\">\n\t\t<div class=\"datepicker__calendar-wrapper\" #calendarContainer [ngStyle]=\"{\n\t\t\t\t\t'transform': 'translateX(' + translateX + '%)',\n\t\t\t\t\t'transition': transition,\n\t\t\t\t\t'left.%': leftInnerPosition\n\t\t\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t\t*ngFor=\"let month of months;\"\n\t\t\t\t\tclass=\"datepicker__calendar-container\"\n\t\t\t\t\t[ngStyle]=\"{'width.%': calendarWidth}\"\n\t\t\t>\n\t\t\t\t<table class=\"datepicker__calendar\">\n\t\t\t\t\t<tbody>\n\t\t\t\t\t<tr *ngFor=\"let week of month.weeks; index as i\" class=\"datepicker__week\">\n\t\t\t\t\t\t<td class=\"datepicker__day\" *ngFor=\"let day of week.days; index as i\"\n\t\t\t\t\t\t\t[ngClass]=\"{\n\t\t\t\t\t\t'is-first': day.isFirst,\n\t\t\t\t\t\t'is-last': day.isLast,\n\t\t\t\t\t\t'is-hidden': day.isHidden,\n\t\t\t\t\t\t'is-disabled': day.isDisabled,\n\t\t\t\t\t\t'is-today': day.isToday,\n\t\t\t\t\t\t'is-selected': day.isSelected,\n\t\t\t\t\t\t'is-in-range': day.isInRange,\n\t\t\t\t\t\t'is-start-date': day.isStartDate,\n\t\t\t\t\t\t'is-end-date': day.isEndDate,\n\t\t\t\t\t\t'is-rest': day.isRest\n\t\t\t\t\t\t}\">\n\t\t\t\t\t\t\t<button class=\"datepicker__button\" [disabled]=\"day.isDisabled || day.isHidden\"\n\t\t\t\t\t\t\t\t\t(click)=\"updateValue(day.date)\">{{day.dayNumber}}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"datepicker__footer\" #footer>\n\t\t<ng-content select=\"footer\"></ng-content>\n\t</div>\n</div>\n\t\t",
522
- styles: [":host{font-family:Arial,Helvetica,sans-serif;border:1px solid #d9d9d8;width:300px;position:relative;display:inline-block;z-index:2;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.15);overflow:hidden;background-color:#fff;box-sizing:border-box;visibility:hidden}:host *{box-sizing:border-box}:host .datepicker__calendar-container{padding:0 10px 10px}:host .datepicker__footer{position:relative;z-index:1}:host table{width:100%;table-layout:fixed;border-spacing:0;border-collapse:collapse}:host td{padding:0}:host .datepicker__weekdays-wrapper::after,:host .datepicker__weekdays-wrapper::before{content:' ';display:table}:host .datepicker__weekdays-wrapper::after{clear:both}:host .datepicker__weekdays-container{padding:10px 10px 0;float:left}:host .datepicker__weekdays{table-layout:fixed;width:100%}:host .datepicker__weekday{color:grey;font-size:12px;height:20px;text-align:center}:host .datepicker__day{position:relative;text-align:center;height:40px;width:auto;border:1px solid #d9d9d8}:host .datepicker__day.is-rest{border:none}:host .datepicker__button{padding:0;background-color:transparent;border:none;outline:0;font-style:inherit;cursor:pointer;color:#8e8d8a;width:100%;height:100%}:host .datepicker__button:hover{border:1px solid transparent;background-color:#f2f2f2;color:#8e8d8a}:host .is-hidden{opacity:0;display:table-cell}:host .is-rest{border:none}:host .is-rest .datepicker__button{color:#c0c0be}:host .is-today .datepicker__button{background-color:#eae7dc}:host .is-in-range .datepicker__button{background-color:#e98074;color:#fff}:host .is-in-range .datepicker__button:hover{background-color:#e66c5e}:host .is-selected .datepicker__button{background-color:#e85a4f;color:#fff;font-weight:700}:host .is-selected .datepicker__button:hover{background-color:#e23022}:host .is-start-date .datepicker__button{background-color:#e85a4f;color:#fff}:host .is-end-date .datepicker__button{background-color:#e85a4f;color:#fff}:host .is-disabled .datepicker__button{color:#d9d9d8;cursor:default}:host .is-disabled .datepicker__button:hover{background-color:transparent}:host.is-directive{visibility:hidden;position:absolute}:host.is-open{visibility:visible}:host.is-animate{transition:height .2s ease-in;width:300px}:host.is-animate .datepicker__main{transition:height .2s ease-in}:host.is-animate .datepicker__calendar-wrapper{position:absolute;width:200%;left:0}:host.is-animate .datepicker__calendar{float:left;width:100%}:host.is-animate .datepicker__calendar-container{float:left}"]
523
- },] },
524
- ];
525
- AnimatepickerComponent.ctorParameters = function () { return [
526
- { type: ElementRef },
527
- { type: UtilitiesService }
528
- ]; };
529
- AnimatepickerComponent.propDecorators = {
530
- numberOfMonths: [{ type: Input }],
531
- calendarContainer: [{ type: ViewChild, args: ['calendarContainer',] }],
532
- calendarTopContainer: [{ type: ViewChild, args: ['calendarTopContainer',] }],
533
- footer: [{ type: ViewChild, args: ['footer',] }],
534
- datepickerWidth: [{ type: HostBinding, args: ['style.width.px',] }],
535
- datepickerHeight: [{ type: HostBinding, args: ['style.height.px',] }]
536
- };
537
- return AnimatepickerComponent;
538
- }(DatepickerComponent));
539
- export { AnimatepickerComponent };
540
- if (false) {
541
- /** @type {?} */
542
- AnimatepickerComponent.prototype.animate;
543
- /** @type {?} */
544
- AnimatepickerComponent.prototype.initialWidth;
545
- /** @type {?} */
546
- AnimatepickerComponent.prototype.calendarWidth;
547
- /** @type {?} */
548
- AnimatepickerComponent.prototype.isAnimating;
549
- /** @type {?} */
550
- AnimatepickerComponent.prototype.leftInnerPosition;
551
- /** @type {?} */
552
- AnimatepickerComponent.prototype.transition;
553
- /** @type {?} */
554
- AnimatepickerComponent.prototype.translateX;
555
- /** @type {?} */
556
- AnimatepickerComponent.prototype.currentYearMonth;
557
- /** @type {?} */
558
- AnimatepickerComponent.prototype.datepickerPosition;
559
- /** @type {?} */
560
- AnimatepickerComponent.prototype.initialised;
561
- /** @type {?} */
562
- AnimatepickerComponent.prototype.calendarHeight;
563
- /**
564
- * Number of months: the number of months displayed
565
- * @type {?}
566
- * @private
567
- */
568
- AnimatepickerComponent.prototype._numberOfMonths;
569
- /** @type {?} */
570
- AnimatepickerComponent.prototype.calendarContainer;
571
- /** @type {?} */
572
- AnimatepickerComponent.prototype.calendarTopContainer;
573
- /** @type {?} */
574
- AnimatepickerComponent.prototype.footer;
575
- /** @type {?} */
576
- AnimatepickerComponent.prototype.datepickerWidth;
577
- /** @type {?} */
578
- AnimatepickerComponent.prototype.datepickerHeight;
579
- /** @type {?} */
580
- AnimatepickerComponent.prototype.elementRef;
581
- /** @type {?} */
582
- AnimatepickerComponent.prototype.utilities;
583
- }
584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW5pbWF0aW5nLWRhdGVwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hbmltYXRlcGlja2VyL2FuaW1hdGVwaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFFTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekU7SUFnRjRDLGtEQUFtQjtJQWtEOUQsZ0NBQW1CLFVBQXNCLEVBQVMsU0FBMkI7UUFBN0UsWUFDQyxrQkFBTSxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQzVCO1FBRmtCLGdCQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVMsZUFBUyxHQUFULFNBQVMsQ0FBa0I7UUFqRDdFOzs0REFFb0Q7UUFFN0MsYUFBTyxHQUFHLElBQUksQ0FBQztRQUdmLGlCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLHVCQUFpQixHQUFHLENBQUMsQ0FBQztRQUd0QixzQkFBZ0IsR0FBVyxJQUFJLENBQUM7UUFFaEMsaUJBQVcsR0FBRyxLQUFLLENBQUM7UUFHM0I7OzREQUVvRDtRQUVwRDs7V0FFRztRQUNLLHFCQUFlLEdBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBNEI1QyxDQUFDO0lBM0JELHNCQUNJLGtEQUFjOzs7O1FBVWxCO1lBQ0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzdCLENBQUM7Ozs7O1FBYkQsVUFDbUIsS0FBSztZQUN2QixJQUFJLEtBQUssS0FBSyxT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bnQsXG5cdEVsZW1lbnRSZWYsXG5cdEhvc3RCaW5kaW5nLFxuXHRJbnB1dCxcblx0T25Jbml0LFxuXHRWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgWWVhck1vbnRoLCBNb250aCB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRlcGlja2VyLm1vZGVsJztcbmltcG9ydCB7IERhdGVwaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0ZXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2FhLWFuaW1hdGVwaWNrZXInLFxuXHR0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyX193cmFwcGVyXCIgW25nU3R5bGVdPVwiZGF0ZXBpY2tlclBvc2l0aW9uXCI+XG5cdDxkaXYgI2NhbGVuZGFyVG9wQ29udGFpbmVyPlxuXHRcdDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyX19oZWFkZXJcIiAjaGVhZGVyPlxuXHRcdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiaGVhZGVyXCI+PC9uZy1jb250ZW50PlxuXHRcdDwvZGl2PlxuXHRcdDxhYS1uYXZpZ2F0aW9uXG5cdFx0XHRcdChwcmV2aW91c0NsaWNrKT1cImdvVG9QcmV2aW91c01vbnRoKClcIlxuXHRcdFx0XHQobmV4dENsaWNrKT1cImdvVG9OZXh0TW9udGgoKVwiXG5cdFx0XHRcdChzdWJOYXZpZ2F0aW9uQ2xpY2spPVwiZ29Ub0RhdGUoJGV2ZW50KVwiXG5cdFx0XHRcdFtsYW5ndWFnZV09XCJsYW5ndWFnZVwiXG5cdFx0XHRcdFthbmltYXRlXT1cImFuaW1hdGVcIlxuXHRcdFx0XHRbdHJhbnNsYXRlWF09XCJ0cmFuc2xhdGVYXCJcblx0XHRcdFx0W3RyYW5zaXRpb25dPVwidHJhbnNpdGlvblwiXG5cdFx0XHRcdFtsZWZ0UG9zaXRpb25dPVwibGVmdElubmVyUG9zaXRpb25cIlxuXHRcdFx0XHRbaGlkZU5hdmlnYXRpb25dPVwib3B0aW9ucy5oaWRlTmF2aWdhdGlvblwiXG5cdFx0XHRcdFt0b3RhbFllYXJNb250aF09XCJ0b3RhbFllYXJNb250aFwiXG5cdFx0PjwvYWEtbmF2aWdhdGlvbj5cblxuXHRcdDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyX193ZWVrZGF5cy13cmFwcGVyXCI+XG5cdFx0XHQ8ZGl2IFx0Km5nRm9yPVwibGV0IG1vbnRoIG9mIG51bWJlck9mTW9udGhzXCJcblx0XHRcdFx0XHRbbmdTdHlsZV09XCJ7XG5cdFx0XHRcdCd3aWR0aC4lJzogKDEwMCAvIG51bWJlck9mTW9udGhzLmxlbmd0aClcblx0XHRcdFx0fVwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJkYXRlcGlja2VyX193ZWVrZGF5cy1jb250YWluZXJcIj5cblx0XHRcdFx0PHRhYmxlIGNsYXNzPVwiZGF0ZXBpY2tlcl9fd2Vla2RheXNcIj5cblx0XHRcdFx0XHQ8dGhlYWQ+XG5cdFx0XHRcdFx0PHRkIGNsYXNzPVwiZGF0ZXBpY2tlcl9fd2Vla2RheVwiICpuZ0Zvcj1cImxldCB3ZWVrZGF5IG9mIHdlZWtkYXlzOyBpbmRleCBhcyBpXCI+e3t3ZWVrZGF5fX08L3RkPlxuXHRcdFx0XHRcdDwvdGhlYWQ+XG5cdFx0XHRcdDwvdGFibGU+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyX19tYWluXCIgW25nU3R5bGVdPVwie1xuXHRcdCdoZWlnaHQucHgnOiBjYWxlbmRhckhlaWdodH1cIj5cblx0XHQ8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlcl9fY2FsZW5kYXItd3JhcHBlclwiICNjYWxlbmRhckNvbnRhaW5lciBbbmdTdHlsZV09XCJ7XG5cdFx0XHRcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyB0cmFuc2xhdGVYICsgJyUpJyxcblx0XHRcdFx0XHQndHJhbnNpdGlvbic6IHRyYW5zaXRpb24sXG5cdFx0XHRcdFx0J2xlZnQuJSc6IGxlZnRJbm5lclBvc2l0aW9uXG5cdFx0XHRcdFx0fVwiXG5cdFx0PlxuXHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7XCJcblx0XHRcdFx0XHRjbGFzcz1cImRhdGVwaWNrZXJfX2NhbGVuZGFyLWNvbnRhaW5lclwiXG5cdFx0XHRcdFx0W25nU3R5bGVdPVwieyd3aWR0aC4lJzogY2FsZW5kYXJXaWR0aH1cIlxuXHRcdFx0PlxuXHRcdFx0XHQ8dGFibGUgY2xhc3M9XCJkYXRlcGlja2VyX19jYWxlbmRhclwiPlxuXHRcdFx0XHRcdDx0Ym9keT5cblx0XHRcdFx0XHQ8dHIgKm5nRm9yPVwibGV0IHdlZWsgb2YgbW9udGgud2Vla3M7IGluZGV4IGFzIGlcIiBjbGFzcz1cImRhdGVwaWNrZXJfX3dlZWtcIj5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cImRhdGVwaWNrZXJfX2RheVwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vlay5kYXlzOyBpbmRleCBhcyBpXCJcblx0XHRcdFx0XHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHRcdFx0J2lzLWZpcnN0JzogZGF5LmlzRmlyc3QsXG5cdFx0XHRcdFx0XHQnaXMtbGFzdCc6IGRheS5pc0xhc3QsXG5cdFx0XHRcdFx0XHQnaXMtaGlkZGVuJzogZGF5LmlzSGlkZGVuLFxuXHRcdFx0XHRcdFx0J2lzLWRpc2FibGVkJzogZGF5LmlzRGlzYWJsZWQsXG5cdFx0XHRcdFx0XHQnaXMtdG9kYXknOiBkYXkuaXNUb2RheSxcblx0XHRcdFx0XHRcdCdpcy1zZWxlY3RlZCc6IGRheS5pc1NlbGVjdGVkLFxuXHRcdFx0XHRcdFx0J2lzLWluLXJhbmdlJzogZGF5LmlzSW5SYW5nZSxcblx0XHRcdFx0XHRcdCdpcy1zdGFydC1kYXRlJzogZGF5LmlzU3RhcnREYXRlLFxuXHRcdFx0XHRcdFx0J2lzLWVuZC1kYXRlJzogZGF5LmlzRW5kRGF0ZSxcblx0XHRcdFx0XHRcdCdpcy1yZXN0JzogZGF5LmlzUmVzdFxuXHRcdFx0XHRcdFx0fVwiPlxuXHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiZGF0ZXBpY2tlcl9fYnV0dG9uXCIgW2Rpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkIHx8IGRheS5pc0hpZGRlblwiXG5cdFx0XHRcdFx0XHRcdFx0XHQoY2xpY2spPVwidXBkYXRlVmFsdWUoZGF5LmRhdGUpXCI+e3tkYXkuZGF5TnVtYmVyfX1cblx0XHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdFx0PC90Ym9keT5cblx0XHRcdFx0PC90YWJsZT5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImRhdGVwaWNrZXJfX2Zvb3RlclwiICNmb290ZXI+XG5cdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiZm9vdGVyXCI+PC9uZy1jb250ZW50PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuXHRcdGAsXG5cdHN0eWxlczogW2A6aG9zdHtmb250LWZhbWlseTpBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtib3JkZXI6MXB4IHNvbGlkICNkOWQ5ZDg7d2lkdGg6MzAwcHg7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7ei1pbmRleDoyO2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaGFkb3c6MCAxcHggNXB4IHJnYmEoMCwwLDAsLjE1KTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1jb2xvcjojZmZmO2JveC1zaXppbmc6Ym9yZGVyLWJveDt2aXNpYmlsaXR5OmhpZGRlbn06aG9zdCAqe2JveC1zaXppbmc6Ym9yZGVyLWJveH06aG9zdCAuZGF0ZXBpY2tlcl9fY2FsZW5kYXItY29udGFpbmVye3BhZGRpbmc6MCAxMHB4IDEwcHh9Omhvc3QgLmRhdGVwaWNrZXJfX2Zvb3Rlcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9Omhvc3QgdGFibGV7d2lkdGg6MTAwJTt0YWJsZS1sYXlvdXQ6Zml4ZWQ7Ym9yZGVyLXNwYWNpbmc6MDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9Omhvc3QgdGR7cGFkZGluZzowfTpob3N0IC5kYXRlcGlja2VyX193ZWVrZGF5cy13cmFwcGVyOjphZnRlciw6aG9zdCAuZGF0ZXBpY2tlcl9fd2Vla2RheXMtd3JhcHBlcjo6YmVmb3Jle2NvbnRlbnQ6JyAnO2Rpc3BsYXk6dGFibGV9Omhvc3QgLmRhdGVwaWNrZXJfX3dlZWtkYXlzLXdyYXBwZXI6OmFmdGVye2NsZWFyOmJvdGh9Omhvc3QgLmRhdGVwaWNrZXJfX3dlZWtkYXlzLWNvbnRhaW5lcntwYWRkaW5nOjEwcHggMTBweCAwO2Zsb2F0OmxlZnR9Omhvc3QgLmRhdGVwaWNrZXJfX3dlZWtkYXlze3RhYmxlLWxheW91dDpmaXhlZDt3aWR0aDoxMDAlfTpob3N0IC5kYXRlcGlja2VyX193ZWVrZGF5e2NvbG9yOmdyZXk7Zm9udC1zaXplOjEycHg7aGVpZ2h0OjIwcHg7dGV4dC1hbGlnbjpjZW50ZXJ9Omhvc3QgLmRhdGVwaWNrZXJfX2RheXtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjtoZWlnaHQ6NDBweDt3aWR0aDphdXRvO2JvcmRlcjoxcHggc29saWQgI2Q5ZDlkOH06aG9zdCAuZGF0ZXBpY2tlcl9fZGF5LmlzLXJlc3R7Ym9yZGVyOm5vbmV9Omhvc3QgLmRhdGVwaWNrZXJfX2J1dHRvbntwYWRkaW5nOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtvdXRsaW5lOjA7Zm9udC1zdHlsZTppbmhlcml0O2N1cnNvcjpwb2ludGVyO2NvbG9yOiM4ZThkOGE7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX06aG9zdCAuZGF0ZXBpY2tlcl9fYnV0dG9uOmhvdmVye2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyO2NvbG9yOiM4ZThkOGF9Omhvc3QgLmlzLWhpZGRlbntvcGFjaXR5OjA7ZGlzcGxheTp0YWJsZS1jZWxsfTpob3N0IC5pcy1yZXN0e2JvcmRlcjpub25lfTpob3N0IC5pcy1yZXN0IC5kYXRlcGlja2VyX19idXR0b257Y29sb3I6I2MwYzBiZX06aG9zdCAuaXMtdG9kYXkgLmRhdGVwaWNrZXJfX2J1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNlYWU3ZGN9Omhvc3QgLmlzLWluLXJhbmdlIC5kYXRlcGlja2VyX19idXR0b257YmFja2dyb3VuZC1jb2xvcjojZTk4MDc0O2NvbG9yOiNmZmZ9Omhvc3QgLmlzLWluLXJhbmdlIC5kYXRlcGlja2VyX19idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTY2YzVlfTpob3N0IC5pcy1zZWxlY3RlZCAuZGF0ZXBpY2tlcl9fYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2U4NWE0Zjtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjcwMH06aG9zdCAuaXMtc2VsZWN0ZWQgLmRhdGVwaWNrZXJfX2J1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMjMwMjJ9Omhvc3QgLmlzLXN0YXJ0LWRhdGUgLmRhdGVwaWNrZXJfX2J1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNlODVhNGY7Y29sb3I6I2ZmZn06aG9zdCAuaXMtZW5kLWRhdGUgLmRhdGVwaWNrZXJfX2J1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNlODVhNGY7Y29sb3I6I2ZmZn06aG9zdCAuaXMtZGlzYWJsZWQgLmRhdGVwaWNrZXJfX2J1dHRvbntjb2xvcjojZDlkOWQ4O2N1cnNvcjpkZWZhdWx0fTpob3N0IC5pcy1kaXNhYmxlZCAuZGF0ZXBpY2tlcl9fYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Omhvc3QuaXMtZGlyZWN0aXZle3Zpc2liaWxpdHk6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlfTpob3N0LmlzLW9wZW57dmlzaWJpbGl0eTp2aXNpYmxlfTpob3N0LmlzLWFuaW1hdGV7dHJhbnNpdGlvbjpoZWlnaHQgLjJzIGVhc2UtaW47d2lkdGg6MzAwcHh9Omhvc3QuaXMtYW5pbWF0ZSAuZGF0ZXBpY2tlcl9fbWFpbnt0cmFuc2l0aW9uOmhlaWdodCAuMnMgZWFzZS1pbn06aG9zdC5pcy1hbmltYXRlIC5kYXRlcGlja2VyX19jYWxlbmRhci13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjIwMCU7bGVmdDowfTpob3N0LmlzLWFuaW1hdGUgLmRhdGVwaWNrZXJfX2NhbGVuZGFye2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJX06aG9zdC5pcy1hbmltYXRlIC5kYXRlcGlja2VyX19jYWxlbmRhci1jb250YWluZXJ7ZmxvYXQ6bGVmdH1gXVxufSlcbmV4cG9ydCBjbGFzcyBBbmltYXRlcGlja2VyQ29tcG9uZW50IGV4dGVuZHMgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICogSW50ZXJuYWwgUHJvcGVydGllc1xuXHQgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0cHVibGljIGFuaW1hdGUgPSB0cnVlO1xuXHRwdWJsaWMgaW5pdGlhbFdpZHRoOiBudW1iZXI7XG5cdHB1YmxpYyBjYWxlbmRhcldpZHRoOiBudW1iZXI7XG5cdHB1YmxpYyBpc0FuaW1hdGluZyA9IGZhbHNlO1xuXHRwdWJsaWMgbGVmdElubmVyUG9zaXRpb24gPSAwO1xuXHRwdWJsaWMgdHJhbnNpdGlvbjogc3RyaW5nO1xuXHRwdWJsaWMgdHJhbnNsYXRlWDogbnVtYmVyO1xuXHRwdWJsaWMgY3VycmVudFllYXJNb250aDogb2JqZWN0ID0gbnVsbDtcblx0cHVibGljIGRhdGVwaWNrZXJQb3NpdGlvbjogb2JqZWN0O1xuXHRwdWJsaWMgaW5pdGlhbGlzZWQgPSBmYWxzZTtcblx0cHVibGljIGNhbGVuZGFySGVpZ2h0OiBudW1iZXJcblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCAqIEV4dGVybmFsIFByb3BlcnRpZXNcblx0ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdC8qKlxuXHQgKiBOdW1iZXIgb2YgbW9udGhzOiB0aGUgbnVtYmVyIG9mIG1vbnRocyBkaXNwbGF5ZWRcblx0ICovXG5cdHByaXZhdGUgX251bWJlck9mTW9udGhzOiBhbnkgPSBuZXcgQXJyYXkoMSk7XG5cdEBJbnB1dCgpXG5cdHNldCBudW1iZXJPZk1vbnRocyh2YWx1ZSkge1xuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSB0aGlzLl9udW1iZXJPZk1vbnRocy5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5fbnVtYmVyT2ZNb250aHMgPSBuZXcgQXJyYXkodmFsdWUpO1xuXHRcdHRoaXMuc2V0RGF0ZVBpY2tlckRpbWVuc2lvbigpO1xuXG5cdFx0dGhpcy5nb1RvRGF0ZSh0aGlzLmRhdGUpO1xuXHR9XG5cblx0Z2V0IG51bWJlck9mTW9udGhzKCk6IE51bWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5fbnVtYmVyT2ZNb250aHM7XG5cdH1cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCAqIEJpbmRpbmdzIGFuZCBDaGlsZHJlblxuXHQgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0QFZpZXdDaGlsZCgnY2FsZW5kYXJDb250YWluZXInKSBwdWJsaWMgY2FsZW5kYXJDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ2NhbGVuZGFyVG9wQ29udGFpbmVyJykgcHVibGljIGNhbGVuZGFyVG9wQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXHRAVmlld0NoaWxkKCdmb290ZXInKSBwdWJsaWMgZm9vdGVyOiBFbGVtZW50UmVmO1xuXHRASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoLnB4JykgcHVibGljIGRhdGVwaWNrZXJXaWR0aDogbnVtYmVyO1xuXHRASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodC5weCcpIHB1YmxpYyBkYXRlcGlja2VySGVpZ2h0OiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IocHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHB1YmxpYyB1dGlsaXRpZXM6IFV0aWxpdGllc1NlcnZpY2UpIHtcblx0XHRzdXBlcih1dGlsaXRpZXMsIGVsZW1lbnRSZWYpO1xuXHR9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0Ly8gR2V0IHRoZSBjb21wdXRlZCB3aWR0aCBmcm9tIHRoZSBjYWxlbmRhci4gU2V0IHRoZSBpbml0aWFsIHdpZHRoXG5cdFx0Y29uc3QgY29tcHV0ZWRXaWR0aCA9IHdpbmRvd1xuXHRcdFx0LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIG51bGwpXG5cdFx0XHQuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKTtcblx0XHR0aGlzLmluaXRpYWxXaWR0aCA9IHBhcnNlSW50KGNvbXB1dGVkV2lkdGgsIDEwKTtcblx0XHR0aGlzLmluaXRpYWxpc2VkID0gdHJ1ZTtcblxuXHRcdC8vIFNldCB0aGUgY3VycmVudCB5ZWFyIGFuZCBtb250aCBvYmplY3Rcblx0XHRpZiAoIXRoaXMubW9udGggJiYgIXRoaXMueWVhcikge1xuXHRcdFx0dGhpcy5nb1RvRGF0ZSh0aGlzLm9wdGlvbnMuY3VycmVudERhdGUpO1xuXHRcdH1cblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuc2V0RGF0ZVBpY2tlckRpbWVuc2lvbigpO1xuXHRcdFx0dGhpcy5zZXREYXRlcGlja2VySGVpZ2h0KHRydWUpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaGVpZ2h0IGFuZCB0aGUgd2lkdGggcHJvcGVydGllc1xuXHQgKi9cblx0c2V0RGF0ZVBpY2tlckRpbWVuc2lvbigpOiB2b2lkIHtcblx0XHR0aGlzLmRhdGVwaWNrZXJIZWlnaHQgPVxuXHRcdFx0dGhpcy5jYWxlbmRhckNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArXG5cdFx0XHR0aGlzLmNhbGVuZGFyVG9wQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgXG5cdFx0XHR0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcblx0XHR0aGlzLmNhbGVuZGFySGVpZ2h0ID0gdGhpcy5jYWxlbmRhckNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcblx0XHR0aGlzLmRhdGVwaWNrZXJXaWR0aCA9IHRoaXMuaW5pdGlhbFdpZHRoICogdGhpcy5fbnVtYmVyT2ZNb250aHMubGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdvIHRvIGEgc3BlY2lmaWMgbW9udGhcblx0ICpcblx0ICogQHBhcmFtIGRhdGUgLSBvcHRpb25hbFxuXHQgKi9cblx0Z29Ub0RhdGUoZGF0ZT86IERhdGUpOiB2b2lkIHtcblx0XHRpZiAoZGF0ZSkge1xuXHRcdFx0dGhpcy5jdXJyZW50WWVhck1vbnRoID0gdGhpcy5nZXROZXh0WWVhck1vbnRoQXJyYXkoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkpO1xuXHRcdH1cblx0XHR0aGlzLmNhbGVuZGFyV2lkdGggPSA1MCAvIHRoaXMuX251bWJlck9mTW9udGhzLmxlbmd0aDtcblx0XHR0aGlzLm1vbnRocyA9IHRoaXMuZ2V0TmV4dE1vbnRoQXJyYXkodGhpcy5jdXJyZW50WWVhck1vbnRoLCB0cnVlKTtcblx0XHR0aGlzLnJlc2V0U3R5bGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gYXJyYXkgb2YgdGhlIG5leHQgeWVhciBhbmQgbW9udGhzXG5cdCAqXG5cdCAqIEBwYXJhbSB5ZWFyXG5cdCAqIEBwYXJhbSBtb250aFxuXHQgKi9cblx0Z2V0TmV4dFllYXJNb250aEFycmF5KHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IFllYXJNb250aFtdIHtcblx0XHRjb25zdCBhcnJheSA9IFtdO1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9udW1iZXJPZk1vbnRocy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGFycmF5LnB1c2goeyB5ZWFyOiB5ZWFyLCBtb250aDogbW9udGggfSk7XG5cdFx0XHR5ZWFyID0gRGF0ZXBpY2tlclNlcnZpY2UuZ2V0WWVhck9mTmV4dE1vbnRoKHllYXIsIG1vbnRoKTtcblx0XHRcdG1vbnRoID0gRGF0ZXBpY2tlclNlcnZpY2UuZ2V0TmV4dE1vbnRoKG1vbnRoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFycmF5O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhbiBhcnJheSBvZiB0aGUgcHJldmlvdXMgeWVhciBhbmQgbW9udGhzXG5cdCAqXG5cdCAqIEBwYXJhbSB5ZWFyXG5cdCAqIEBwYXJhbSBtb250aFxuXHQgKi9cblx0Z2V0UHJldmlvdXNZZWFyTW9udGhBcnJheSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiBZZWFyTW9udGhbXSB7XG5cdFx0Y29uc3QgYXJyYXkgPSBbXTtcblx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fbnVtYmVyT2ZNb250aHMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRhcnJheS51bnNoaWZ0KHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoIH0pO1xuXHRcdFx0eWVhciA9IERhdGVwaWNrZXJTZXJ2aWNlLmdldFllYXJPZlByZXZpb3VzTW9udGgoeWVhciwgbW9udGgpO1xuXHRcdFx0bW9udGggPSBEYXRlcGlja2VyU2VydmljZS5nZXRQcmV2aW91c01vbnRoKG1vbnRoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFycmF5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgZGF0ZXBpY2tlciBoZWlnaHQsIHVzZWQgd2hlbiBhbmltYXRpbmdcblx0ICpcblx0ICogQHBhcmFtIGRpcmVjdGlvblJpZ2h0IC0gU2V0IG9wdGlvbmFsIHdoZW4gc2xpZGluZyB0byB0aGUgcmlnaHRcblx0ICovXG5cdHNldERhdGVwaWNrZXJIZWlnaHQoZGlyZWN0aW9uUmlnaHQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0bGV0IGluZGV4QXJyYXk6IG51bWJlcltdO1xuXG5cdFx0Ly8gVE9ETzogU2VwZXJhdGUgdGhpcyBsb2dpYyBmb3IgcmVhZGFiaWxpdHkgcHVycG9zZVxuXHRcdGlmICh0aGlzLl9udW1iZXJPZk1vbnRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRjb25zdCBzdGFydCA9IGRpcmVjdGlvblJpZ2h0ID8gMCA6IHRoaXMuX251bWJlck9mTW9udGhzLmxlbmd0aDtcblx0XHRcdGNvbnN0IGVuZCA9IGRpcmVjdGlvblJpZ2h0XG5cdFx0XHRcdD8gdGhpcy5fbnVtYmVyT2ZNb250aHMubGVuZ3RoIC0gMVxuXHRcdFx0XHQ6IHRoaXMuX251bWJlck9mTW9udGhzLmxlbmd0aCArIHRoaXMuX251bWJlck9mTW9udGhzLmxlbmd0aCAtIDE7XG5cdFx0XHRpbmRleEFycmF5ID0gdGhpcy51dGlsaXRpZXMuY3JlYXRlQXJyYXkoc3RhcnQsIGVuZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluZGV4QXJyYXkgPSBkaXJlY3Rpb25SaWdodCA/IFswXSA6IFsxXTtcblx0XHR9XG5cblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IGNhbGVuZGFyQXJyYXkgPSB0aGF0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdFx0XHQnLmRhdGVwaWNrZXJfX2NhbGVuZGFyLWNvbnRhaW5lcidcblx0XHRcdCk7XG5cdFx0XHRsZXQgb2Zmc2V0SGVpZ2h0ID0gMDtcblx0XHRcdGluZGV4QXJyYXkuZm9yRWFjaChlbCA9PiB7XG5cdFx0XHRcdGlmIChjYWxlbmRhckFycmF5W2VsXS5vZmZzZXRIZWlnaHQgPiBvZmZzZXRIZWlnaHQpIHtcblx0XHRcdFx0XHRvZmZzZXRIZWlnaHQgPSBjYWxlbmRhckFycmF5W2VsXS5vZmZzZXRIZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0XG5cdFx0XHQvLyBUT0RPOiBNZXJnZSB3aXRoIHNldEhlaWdodCBmdW5jdGlvbi5cblx0XHRcdHRoYXQuZGF0ZXBpY2tlckhlaWdodCA9XG5cdFx0XHRcdG9mZnNldEhlaWdodCArIHRoYXQuY2FsZW5kYXJUb3BDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyB0aGF0LmZvb3Rlci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcblx0XHRcdHRoYXQuY2FsZW5kYXJIZWlnaHQgPSBvZmZzZXRIZWlnaHQ7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IG5leHQgbW9udGggYXJyYXksIGdldHMgbXVsdGlwbGUgbW9udGhzLlxuXHQgKiBVc2VkIHdoZW4gdGhlIG9wdGlvbnMgYW5pbWF0ZSBpcyBzZXQgb3IgbXVsdGlwbGUgbW9udGhzIGFyZSB2aXNhYmxlXG5cdCAqXG5cdCAqIEByZXR1cm4gTW9udGhbXVxuXHQgKi9cblx0Z2V0TmV4dE1vbnRoQXJyYXkoY3VycmVudFllYXJNb250aCwga2VlcERhdGUgPSBmYWxzZSwgbmV4dE1vbnRoc1llYXJNb250aEFycmF5Pyk6IE1vbnRoW10ge1xuXHRcdC8vIEdldCB0aGUgbGFzdCBpbmRleCwgdXNlZCBmb3Igc2VsZWN0aW5nIHRoZSByaWdodCB5ZWFyIG1vbnRoIG9iamVjdFxuXHRcdGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuX251bWJlck9mTW9udGhzLmxlbmd0aCAtIDE7XG5cblx0XHQvLyBHZXQgbmV4dCB5ZWFyIGFuZCBtb250aCBpbiBhbiBPYmplY3Rcblx0XHRjb25zdCBuZXh0TW9udGhzID1cblx0XHRcdG5leHRNb250aHNZZWFyTW9udGhBcnJheSB8fFxuXHRcdFx0dGhpcy5nZXROZXh0WWVhck1vbnRoQXJyYXkoXG5cdFx0XHRcdERhdGVwaWNrZXJTZXJ2aWNlLmdldFllYXJPZk5leHRNb250aChcblx0XHRcdFx0XHRjdXJyZW50WWVhck1vbnRoW2xhc3RJbmRleF0ueWVhcixcblx0XHRcdFx0XHRjdXJyZW50WWVhck1vbnRoW2xhc3RJbmRleF0ubW9udGhcblx0XHRcdFx0KSxcblx0XHRcdFx0RGF0ZXBpY2tlclNlcnZpY2UuZ2V0TmV4dE1vbnRoKGN1cnJlbnRZZWFyTW9udGhbbGFzdEluZGV4XS5tb250aClcblx0XHRcdCk7XG5cblx0XHQvLyBDb25jYXRlbmF0ZXMgdGhlIHR3byBvYmplY3RzIHRvIGNyZWF0ZSBhIHRvdGFsIHllYXIgYW5kIG1vbnRoIG9iamVjdFxuXHRcdHRoaXMudG90YWxZZWFyTW9udGggPSBjdXJyZW50WWVhck1vbnRoLmNvbmNhdChuZXh0TW9udGhzKTtcblxuXHRcdC8vIENyZWF0ZSB0aGUgY2FsZW5kYXIgYXJyYXkgdXNpbmcgdGhlIHRvdGFsIHllYXIgYW5kIG1vbnRoIE9iamVjdFxuXHRcdGNvbnN0IG1vbnRoQXJyYXkgPSBbXTtcblx0XHR0aGlzLnRvdGFsWWVhck1vbnRoLmZvckVhY2goZSA9PlxuXHRcdFx0bW9udGhBcnJheS5wdXNoKHRoaXMuY3JlYXRlQ2FsZW5kYXJBcnJheShlLnllYXIsIGUubW9udGgpKVxuXHRcdCk7XG5cblx0XHQvLyBTZXQgdGhlIG5ldyBjdXJyZW50IHllYXIgYW5kIG1vbnRoIG9iamVjdC5cblx0XHRpZiAoIWtlZXBEYXRlKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRZZWFyTW9udGggPSBuZXh0TW9udGhzO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIG1vbnRoQXJyYXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYW4gYXJyYXkgb2YgcHJldmlvdXMgbW9udGhzLlxuXHQgKiBVc2VkIGZvciBhbmltYXRpb24gYW5kIHdoZW4gbW9yZSBtb250aHMgYXJlIGRpc3BsYXllZFxuXHQgKlxuXHQgKiBAcGFyYW0gY3VycmVudFllYXJNb250aFxuXHQgKiBAcGFyYW0ga2VlcERhdGVcblx0ICovXG5cdGdldFByZXZpb3VzTW9udGhBcnJheShjdXJyZW50WWVhck1vbnRoLCBrZWVwRGF0ZSA9IGZhbHNlKTogTW9udGhbXSB7XG5cdFx0Ly8gR2V0IHByZXZpb3VzIHllYXIgYW5kIG1vbnRoIGluIGFuIE9iamVjdFxuXHRcdGNvbnN0IHByZXZpb3VzTW9udGhzID0gdGhpcy5nZXRQcmV2aW91c1llYXJNb250aEFycmF5KFxuXHRcdFx0RGF0ZXBpY2tlclNlcnZpY2UuZ2V0WWVhck9mUHJldmlvdXNNb250aChcblx0XHRcdFx0Y3VycmVudFllYXJNb250aFswXS55ZWFyLFxuXHRcdFx0XHRjdXJyZW50WWVhck1vbnRoWzBdLm1vbnRoXG5cdFx0XHQpLFxuXHRcdFx0RGF0ZXBpY2tlclNlcnZpY2UuZ2V0UHJldmlvdXNNb250aChjdXJyZW50WWVhck1vbnRoWzBdLm1vbnRoKVxuXHRcdCk7XG5cblx0XHQvLyBDb25jYXRlbmF0ZXMgdGhlIHR3byBvYmplY3RzIHRvIGNyZWF0ZSBhIHRvdGFsIHllYXIgYW5kIG1vbnRoIG9iamVjdFxuXHRcdHRoaXMudG90YWxZZWFyTW9udGggPSBwcmV2aW91c01vbnRocy5jb25jYXQoY3VycmVudFllYXJNb250aCk7XG5cblx0XHQvLyBDcmVhdGUgdGhlIGNhbGVuZGFyIGFycmF5IHVzaW5nIHRoZSB0b3RhbCB5ZWFyIGFuZCBtb250aCBPYmplY3Rcblx0XHRjb25zdCBtb250aEFycmF5ID0gW107XG5cdFx0dGhpcy50b3RhbFllYXJNb250aC5mb3JFYWNoKGUgPT4ge1xuXHRcdFx0bW9udGhBcnJheS5wdXNoKHRoaXMuY3JlYXRlQ2FsZW5kYXJBcnJheShlWyd5ZWFyJ10sIGVbJ21vbnRoJ10pKTtcblx0XHR9KTtcblxuXHRcdC8vIFNldCB0aGUgbmV3IGN1cnJlbnQgeWVhciBhbmQgbW9udGggb2JqZWN0LlxuXHRcdGlmICgha2VlcERhdGUpIHtcblx0XHRcdHRoaXMuY3VycmVudFllYXJNb250aCA9IHByZXZpb3VzTW9udGhzO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIG1vbnRoQXJyYXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB2YWx1ZSBpcyBiZWluZyB0cmlnZ2VyZWRcblx0ICpcblx0ICogQHBhcmFtIGRhdGVcblx0ICovXG5cdHVwZGF0ZVZhbHVlKGRhdGU6IERhdGUpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLnJhbmdlKSB7XG5cdFx0XHR0aGlzLnNlbGVjdFJhbmdlKGRhdGUpO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuaXNTZWxlY3RlZChkYXRlKSkge1xuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5zZWxlY3RNdWx0aXBsZSkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdERhdGUoZGF0ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnRvZ2dsZURhdGUoZGF0ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPblNlbGVjdCkge1xuXHRcdFx0XHR0aGlzLmNsb3NlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRlc2VsZWN0RGF0ZShkYXRlKTtcblxuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uU2VsZWN0KSB7XG5cdFx0XHRcdHRoaXMuY2xvc2UodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMubW9udGhzID0gdGhpcy5nZXROZXh0TW9udGhBcnJheSh0aGlzLmN1cnJlbnRZZWFyTW9udGgsIHRydWUpO1xuXHRcdHRoaXMucmVzZXRTdHlsZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdvIHRvIHRoZSBuZXh0IG1vbnRoXG5cdCAqL1xuXHRnb1RvTmV4dE1vbnRoKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5tb250aHMgPSB0aGlzLmdldE5leHRNb250aEFycmF5KHRoaXMuY3VycmVudFllYXJNb250aCk7XG5cdFx0dGhpcy5yZXNldFN0eWxlKCk7XG5cdFx0dGhpcy5zZXREYXRlcGlja2VySGVpZ2h0KCk7XG5cdFx0dGhpcy5zbGlkZUxlZnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHbyB0byB0aGUgcHJldmlvdXMgbW9udGhcblx0ICovXG5cdGdvVG9QcmV2aW91c01vbnRoKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5tb250aHMgPSB0aGlzLmdldFByZXZpb3VzTW9udGhBcnJheSh0aGlzLmN1cnJlbnRZZWFyTW9udGgpO1xuXHRcdHRoaXMucmVzZXRTdHlsZSh0cnVlKTtcblx0XHR0aGlzLnNldERhdGVwaWNrZXJIZWlnaHQodHJ1ZSk7XG5cdFx0dGhpcy5zbGlkZVJpZ2h0KCk7XG5cdH1cblxuXHQvKipcblx0ICogR28gdG8gYSBzcGVjaWZpYyBtb250aFxuXHQgKiBUT0RPOiBXSVAgQ2hlY2sgaWYgZGF0ZSBpcyBpbiBjdXJyZW50IHJhbmdlLCBvciBpZiBpdCBpcyBsYXRlciBvciBlYXJsaWVyXG5cdCAqL1xuXHRnb1RvTW9udGgoZGF0ZTogRGF0ZSk6IHZvaWQge1xuXHRcdGNvbnN0IG5leHRNb250aHMgPSB0aGlzLmdldE5leHRZZWFyTW9udGhBcnJheShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSk7XG5cdFx0dGhpcy5tb250aHMgPSB0aGlzLmdldE5leHRNb250aEFycmF5KHRoaXMudG90YWxZZWFyTW9udGgsIGZhbHNlLCBuZXh0TW9udGhzKTtcblx0XHR0aGlzLnJlc2V0U3R5bGUoKTtcblx0XHR0aGlzLnNldERhdGVwaWNrZXJIZWlnaHQoKTtcblx0XHR0aGlzLnNsaWRlUmlnaHQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTbGlkZSB0byB0aGUgcmlnaHRcblx0ICovXG5cdHNsaWRlUmlnaHQoKTogdm9pZCB7XG5cdFx0dGhpcy5zZXRJc0FuaW1hdGluZygpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy50cmFuc2l0aW9uID1cblx0XHRcdFx0J3RyYW5zZm9ybSAnICsgdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkICsgJ21zICcgKyB0aGlzLm9wdGlvbnMuZWFzaW5nO1xuXHRcdFx0dGhpcy50cmFuc2xhdGVYID0gNTA7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2xpZGUgdG8gdGhlIGxlZnQgKGNyaXNzIGNyb3NzKVxuXHQgKi9cblx0c2xpZGVMZWZ0KCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0SXNBbmltYXRpbmcoKTtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMudHJhbnNpdGlvbiA9XG5cdFx0XHRcdCd0cmFuc2Zvcm0gJyArIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCArICdtcyAnICsgdGhpcy5vcHRpb25zLmVhc2luZztcblx0XHRcdHRoaXMudHJhbnNsYXRlWCA9IC01MDtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgYW5pbWF0aW5nIHN0YXRlXG5cdCAqL1xuXHRzZXRJc0FuaW1hdGluZygpOiB2b2lkIHtcblx0XHR0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0XHR9LCB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0IFN0eWxlXG5cdCAqXG5cdCAqIEBwYXJhbSByZXNldEZvclByZXZpb3VzIC0gT3B0aW9uYWxcblx0ICovXG5cdHJlc2V0U3R5bGUocmVzZXRGb3JQcmV2aW91cz86IGJvb2xlYW4pIHtcblx0XHR0aGlzLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIDBtcyBlYXNlLWluJztcblx0XHR0aGlzLnRyYW5zbGF0ZVggPSAwO1xuXHRcdHRoaXMubGVmdElubmVyUG9zaXRpb24gPSByZXNldEZvclByZXZpb3VzID8gLTEwMCA6IDA7XG5cdH1cbn1cbiJdfQ==