@stemy/ngx-utils 11.0.8 → 11.1.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 (94) hide show
  1. package/README.md +27 -27
  2. package/bundles/stemy-ngx-utils.umd.js +22 -7
  3. package/bundles/stemy-ngx-utils.umd.js.map +1 -1
  4. package/bundles/stemy-ngx-utils.umd.min.js +1 -1
  5. package/bundles/stemy-ngx-utils.umd.min.js.map +1 -1
  6. package/esm2015/ngx-utils/common-types.js +2 -1
  7. package/esm2015/ngx-utils/ngx-utils.module.js +6 -2
  8. package/esm2015/ngx-utils/services/config.service.js +8 -4
  9. package/esm2015/ngx-utils/services/promise.service.js +4 -1
  10. package/esm2015/ngx-utils/services/static-language.service.js +9 -7
  11. package/esm2015/ngx-utils/utils/unique.utils.js +1 -1
  12. package/esm2015/public_api.js +2 -2
  13. package/fesm2015/stemy-ngx-utils.js +22 -8
  14. package/fesm2015/stemy-ngx-utils.js.map +1 -1
  15. package/ngx-utils/common-types.d.ts +2 -0
  16. package/ngx-utils/services/config.service.d.ts +3 -1
  17. package/ngx-utils/services/promise.service.d.ts +5 -4
  18. package/ngx-utils/services/static-language.service.d.ts +3 -2
  19. package/package.json +1 -1
  20. package/public_api.d.ts +1 -1
  21. package/stemy-ngx-utils.metadata.json +1 -1
  22. package/esm5/ngx-utils/common-types.js +0 -553
  23. package/esm5/ngx-utils/components/dynamic-table/dynamic-table.component.js +0 -285
  24. package/esm5/ngx-utils/components/pagination-menu/pagination-menu.component.js +0 -198
  25. package/esm5/ngx-utils/components/unordered-list/unordered-list.component.js +0 -110
  26. package/esm5/ngx-utils/directives/async-method.directive.js +0 -105
  27. package/esm5/ngx-utils/directives/background.directive.js +0 -91
  28. package/esm5/ngx-utils/directives/dynamic-table-template.directive.js +0 -34
  29. package/esm5/ngx-utils/directives/icon.directive.js +0 -101
  30. package/esm5/ngx-utils/directives/ngx-template-outlet.directive.js +0 -182
  31. package/esm5/ngx-utils/directives/pagination-item.directive.js +0 -70
  32. package/esm5/ngx-utils/directives/pagination.directive.js +0 -148
  33. package/esm5/ngx-utils/directives/resource-if.directive.js +0 -97
  34. package/esm5/ngx-utils/directives/sticky.directive.js +0 -93
  35. package/esm5/ngx-utils/directives/unordered-list-item.directive.js +0 -143
  36. package/esm5/ngx-utils/directives/unordered-list-template.directive.js +0 -54
  37. package/esm5/ngx-utils/ngx-utils.module.js +0 -205
  38. package/esm5/ngx-utils/pipes/chunk.pipe.js +0 -41
  39. package/esm5/ngx-utils/pipes/entries.pipe.js +0 -54
  40. package/esm5/ngx-utils/pipes/extra-item-properties.pipe.js +0 -51
  41. package/esm5/ngx-utils/pipes/filter.pipe.js +0 -65
  42. package/esm5/ngx-utils/pipes/find.pipe.js +0 -51
  43. package/esm5/ngx-utils/pipes/format-number.pipe.js +0 -44
  44. package/esm5/ngx-utils/pipes/get-offset.pipe.js +0 -31
  45. package/esm5/ngx-utils/pipes/get-type.pipe.js +0 -28
  46. package/esm5/ngx-utils/pipes/group-by.pipe.js +0 -48
  47. package/esm5/ngx-utils/pipes/is-type.pipe.js +0 -30
  48. package/esm5/ngx-utils/pipes/join.pipe.js +0 -34
  49. package/esm5/ngx-utils/pipes/keys.pipe.js +0 -35
  50. package/esm5/ngx-utils/pipes/map.pipe.js +0 -52
  51. package/esm5/ngx-utils/pipes/max.pipe.js +0 -45
  52. package/esm5/ngx-utils/pipes/min.pipe.js +0 -45
  53. package/esm5/ngx-utils/pipes/reduce.pipe.js +0 -55
  54. package/esm5/ngx-utils/pipes/remap.pipe.js +0 -51
  55. package/esm5/ngx-utils/pipes/replace.pipe.js +0 -32
  56. package/esm5/ngx-utils/pipes/reverse.pipe.js +0 -38
  57. package/esm5/ngx-utils/pipes/round.pipe.js +0 -44
  58. package/esm5/ngx-utils/pipes/safe-html.pipe.js +0 -54
  59. package/esm5/ngx-utils/pipes/translate.pipe.js +0 -111
  60. package/esm5/ngx-utils/pipes/values.pipe.js +0 -35
  61. package/esm5/ngx-utils/plugins/resize-event.plugin.js +0 -122
  62. package/esm5/ngx-utils/plugins/scroll-event.plugin.js +0 -110
  63. package/esm5/ngx-utils/services/acl.service.js +0 -119
  64. package/esm5/ngx-utils/services/auth.service.js +0 -40
  65. package/esm5/ngx-utils/services/events.service.js +0 -33
  66. package/esm5/ngx-utils/services/formatter.service.js +0 -124
  67. package/esm5/ngx-utils/services/icon.service.js +0 -32
  68. package/esm5/ngx-utils/services/language.service.js +0 -199
  69. package/esm5/ngx-utils/services/promise.service.js +0 -123
  70. package/esm5/ngx-utils/services/state.service.js +0 -271
  71. package/esm5/ngx-utils/services/storage.service.js +0 -100
  72. package/esm5/ngx-utils/services/toaster.service.js +0 -100
  73. package/esm5/ngx-utils/services/universal.service.js +0 -153
  74. package/esm5/ngx-utils/utils/ajax-request-handler.js +0 -73
  75. package/esm5/ngx-utils/utils/array.utils.js +0 -182
  76. package/esm5/ngx-utils/utils/auth.guard.js +0 -205
  77. package/esm5/ngx-utils/utils/canvas.utils.js +0 -668
  78. package/esm5/ngx-utils/utils/date.utils.js +0 -91
  79. package/esm5/ngx-utils/utils/file.utils.js +0 -201
  80. package/esm5/ngx-utils/utils/loader.utils.js +0 -90
  81. package/esm5/ngx-utils/utils/math.utils.js +0 -62
  82. package/esm5/ngx-utils/utils/object.utils.js +0 -513
  83. package/esm5/ngx-utils/utils/observable.utils.js +0 -30
  84. package/esm5/ngx-utils/utils/reflect.utils.js +0 -95
  85. package/esm5/ngx-utils/utils/set.utils.js +0 -48
  86. package/esm5/ngx-utils/utils/string.utils.js +0 -94
  87. package/esm5/ngx-utils/utils/timer.utils.js +0 -100
  88. package/esm5/ngx-utils/utils/unique.utils.js +0 -54
  89. package/esm5/ngx-utils/utils/vector.js +0 -223
  90. package/esm5/public_api.js +0 -73
  91. package/esm5/stemy-ngx-utils.js +0 -11
  92. package/fesm5/stemy-ngx-utils.js +0 -6709
  93. package/fesm5/stemy-ngx-utils.js.map +0 -1
  94. package/typings.d.ts +0 -5
@@ -1,285 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
4
- */
5
- import { Component, ContentChild, ContentChildren, Input, QueryList, TemplateRef, ViewChild } from "@angular/core";
6
- import { PaginationItemContext } from "../../common-types";
7
- import { ObjectUtils } from "../../utils/object.utils";
8
- import { DynamicTableTemplateDirective } from "../../directives/dynamic-table-template.directive";
9
- import { PaginationDirective } from "../../directives/pagination.directive";
10
- var DynamicTableComponent = /** @class */ (function () {
11
- function DynamicTableComponent() {
12
- var _this = this;
13
- this.loadData = function (page, itemsPerPage) {
14
- /** @type {?} */
15
- var orderBy = _this.orders[_this.orderBy];
16
- return _this.dataLoader(page, itemsPerPage, orderBy, _this.orderDescending, _this.filter);
17
- };
18
- this.dataLoader = this.loadLocalData;
19
- this.filter = "";
20
- this.orders = {};
21
- this.templates = {};
22
- }
23
- Object.defineProperty(DynamicTableComponent.prototype, "items", {
24
- get: /**
25
- * @return {?}
26
- */
27
- function () {
28
- return !this.pagination ? [] : this.pagination.items;
29
- },
30
- enumerable: true,
31
- configurable: true
32
- });
33
- /**
34
- * @param {?} orderBy
35
- * @param {?} a
36
- * @param {?} b
37
- * @return {?}
38
- */
39
- DynamicTableComponent.compare = /**
40
- * @param {?} orderBy
41
- * @param {?} a
42
- * @param {?} b
43
- * @return {?}
44
- */
45
- function (orderBy, a, b) {
46
- a = a.item ? a.item[orderBy] : null;
47
- b = b.item ? b.item[orderBy] : null;
48
- return ObjectUtils.compare(a, b);
49
- };
50
- /**
51
- * @return {?}
52
- */
53
- DynamicTableComponent.prototype.ngAfterContentInit = /**
54
- * @return {?}
55
- */
56
- function () {
57
- this.templates = this.templateDirectives.reduce(function (result, directive) {
58
- if (ObjectUtils.isArray(directive.column)) {
59
- directive.column.forEach(function (column) {
60
- result[column] = directive;
61
- });
62
- return result;
63
- }
64
- if (!ObjectUtils.isString(directive.column) || directive.column.length == 0)
65
- return result;
66
- result[directive.column] = directive;
67
- return result;
68
- }, {});
69
- };
70
- /**
71
- * @return {?}
72
- */
73
- DynamicTableComponent.prototype.ngAfterViewInit = /**
74
- * @return {?}
75
- */
76
- function () {
77
- this.rowTemplate = this.rowTemplate || this.defaultRowTemplate;
78
- this.filterTemplate = this.filterTemplate || this.defaultFilterTemplate;
79
- };
80
- /**
81
- * @param {?} changes
82
- * @return {?}
83
- */
84
- DynamicTableComponent.prototype.ngOnChanges = /**
85
- * @param {?} changes
86
- * @return {?}
87
- */
88
- function (changes) {
89
- if (changes.columns) {
90
- /** @type {?} */
91
- var columns = changes.columns.currentValue || [];
92
- this.orders = ObjectUtils.isArray(columns) ? columns.reduce(function (result, column) {
93
- result[column] = column;
94
- return result;
95
- }, {}) : columns;
96
- this.cols = Object.keys(this.orders);
97
- this.orderBy = this.orderBy in this.orders ? this.orderBy : this.columns[0];
98
- }
99
- if (changes.orderBy && this.orders) {
100
- this.orderBy = this.orderBy in this.orders ? this.orderBy : this.columns[0];
101
- }
102
- if (!changes.data && !changes.parallelData && !changes.itemsPerPage && !changes.orderBy && !changes.orderDescending)
103
- return;
104
- this.refresh();
105
- };
106
- /**
107
- * @return {?}
108
- */
109
- DynamicTableComponent.prototype.refresh = /**
110
- * @return {?}
111
- */
112
- function () {
113
- if (!this.pagination)
114
- return;
115
- this.pagination.refresh();
116
- };
117
- /**
118
- * @param {?} filter
119
- * @return {?}
120
- */
121
- DynamicTableComponent.prototype.setFilter = /**
122
- * @param {?} filter
123
- * @return {?}
124
- */
125
- function (filter) {
126
- this.filter = filter;
127
- this.refresh();
128
- };
129
- /**
130
- * @param {?} column
131
- * @return {?}
132
- */
133
- DynamicTableComponent.prototype.setOrder = /**
134
- * @param {?} column
135
- * @return {?}
136
- */
137
- function (column) {
138
- this.orderDescending = column == this.orderBy && !this.orderDescending;
139
- this.orderBy = column;
140
- this.refresh();
141
- };
142
- /**
143
- * @param {?} page
144
- * @param {?} rowsPerPage
145
- * @param {?} orderBy
146
- * @param {?} orderDescending
147
- * @param {?} filter
148
- * @return {?}
149
- */
150
- DynamicTableComponent.prototype.loadLocalData = /**
151
- * @param {?} page
152
- * @param {?} rowsPerPage
153
- * @param {?} orderBy
154
- * @param {?} orderDescending
155
- * @param {?} filter
156
- * @return {?}
157
- */
158
- function (page, rowsPerPage, orderBy, orderDescending, filter) {
159
- if (!this.data) {
160
- return Promise.resolve({
161
- total: 0,
162
- items: []
163
- });
164
- }
165
- /** @type {?} */
166
- var compare = orderDescending
167
- ? function (a, b) { return DynamicTableComponent.compare(orderBy, b, a); }
168
- : function (a, b) { return DynamicTableComponent.compare(orderBy, a, b); };
169
- /** @type {?} */
170
- var from = (page - 1) * rowsPerPage;
171
- /** @type {?} */
172
- var dataLength = this.data.length;
173
- /** @type {?} */
174
- var length = Math.min(rowsPerPage, dataLength - from);
175
- /** @type {?} */
176
- var parallelData = this.parallelData || [];
177
- /** @type {?} */
178
- var data = this.data.map(function (item, ix) {
179
- return new PaginationItemContext(item, parallelData[ix] || {}, dataLength, ix, ix);
180
- });
181
- if (ObjectUtils.isString(filter) && filter.length > 0) {
182
- /** @type {?} */
183
- var filterRx_1 = new RegExp(filter, "gi");
184
- data = data.filter(function (c) { return c.filter(filterRx_1); });
185
- }
186
- /** @type {?} */
187
- var items = orderBy ? data.sort(compare).splice(from, length) : data.splice(from, length);
188
- items.forEach(function (context, ix) {
189
- context.index = from + ix;
190
- });
191
- return Promise.resolve({
192
- total: dataLength,
193
- items: items
194
- });
195
- };
196
- DynamicTableComponent.decorators = [
197
- { type: Component, args: [{
198
- moduleId: module.id,
199
- selector: "dynamic-table",
200
- template: "<div class=\"dynamic-table\" #pagination=\"pagination\" [pagination]=\"loadData\" [itemsPerPage]=\"itemsPerPage\" [updateTime]=\"updateTime\">\r\n <ng-template #defaultFilterTemplate let-table>\r\n <div class=\"table-search\" *ngIf=\"table.showFilter\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n [ngModel]=\"table.filter\"\r\n (ngModelChange)=\"table.setFilter($event)\"/>\r\n </div>\r\n </ng-template>\r\n <ng-container [ngxTemplateOutlet]=\"filterTemplate || defaultFilterTemplate\" [context]=\"this\"></ng-container>\r\n <pagination-menu [maxSize]=\"maxPages\" [directionLinks]=\"directionLinks\" [boundaryLinks]=\"boundaryLinks\"></pagination-menu>\r\n <div class=\"table-responsive\">\r\n\r\n <ng-template #columnTemplate let-context let-column=\"column\" let-template=\"template\">\r\n <ng-template #defaultTemplate let-column=\"column\" let-item=\"item\">\r\n <span>{{ item[column] == undefined || item[column] == null ? '-' : item[column] }}</span>\r\n </ng-template>\r\n <ng-template #pureTemplate>\r\n <ng-container [ngxTemplateOutlet]=\"template.ref\" [context]=\"context\"></ng-container>\r\n </ng-template>\r\n <td [ngClass]=\"'column-' + column\" *ngIf=\"!template || !template.pure; else pureTemplate\">\r\n <ng-container [ngxTemplateOutlet]=\"!template ? defaultTemplate : template.ref\" [context]=\"context\"></ng-container>\r\n </td>\r\n </ng-template>\r\n\r\n <ng-template #columnsTemplate let-context>\r\n <ng-container *ngFor=\"let column of cols\"\r\n [ngxTemplateOutlet]=\"columnTemplate\"\r\n [context]=\"context\"\r\n [additionalContext]=\"{\r\n template: templates[column],\r\n column: column\r\n }\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template #defaultRowTemplate let-context>\r\n <tr>\r\n <ng-container [ngxTemplateOutlet]=\"columnsTemplate\" [context]=\"context\"></ng-container>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template #defaultWrapperTemplate>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of cols\" [ngClass]=\"'column-' + column\">\r\n <a *ngIf=\"orders[column]\" (click)=\"setOrder(column)\">\r\n <span>{{ 'label.' + column | translate }}</span>\r\n <i *ngIf=\"orderBy == column\"\r\n [icon]=\"orderDescending ? 'sort-desc' : 'sort-asc'\"\r\n [ngClass]=\"orderBy == column ? (orderDescending ? 'sort-desc': 'sort-asc') : ''\"></i>\r\n </a>\r\n <span *ngIf=\"!orders[column]\">{{ 'label.' + column | translate }}</span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *paginationItem=\"let context\"\r\n [ngxTemplateOutlet]=\"rowTemplate\"\r\n [context]=\"context\"\r\n [additionalContext]=\"this\"></ng-container>\r\n </tbody>\r\n </table>\r\n </ng-template>\r\n\r\n <ng-container [ngxTemplateOutlet]=\"wrapperTemplate || defaultWrapperTemplate\"\r\n [context]=\"this\"></ng-container>\r\n </div>\r\n <pagination-menu [maxSize]=\"maxPages\" [directionLinks]=\"directionLinks\" [boundaryLinks]=\"boundaryLinks\"></pagination-menu>\r\n</div>\r\n"
201
- }] }
202
- ];
203
- /** @nocollapse */
204
- DynamicTableComponent.ctorParameters = function () { return []; };
205
- DynamicTableComponent.propDecorators = {
206
- dataLoader: [{ type: Input }],
207
- data: [{ type: Input }],
208
- parallelData: [{ type: Input }],
209
- columns: [{ type: Input }],
210
- showFilter: [{ type: Input }],
211
- itemsPerPage: [{ type: Input }],
212
- updateTime: [{ type: Input }],
213
- maxPages: [{ type: Input }],
214
- directionLinks: [{ type: Input }],
215
- boundaryLinks: [{ type: Input }],
216
- orderBy: [{ type: Input }],
217
- orderDescending: [{ type: Input }],
218
- rowTemplate: [{ type: ContentChild, args: ["rowTemplate",] }],
219
- wrapperTemplate: [{ type: ContentChild, args: ["wrapperTemplate",] }],
220
- filterTemplate: [{ type: ContentChild, args: ["filterTemplate",] }],
221
- columnsTemplate: [{ type: ViewChild, args: ["columnsTemplate",] }],
222
- defaultRowTemplate: [{ type: ViewChild, args: ["defaultRowTemplate",] }],
223
- defaultWrapperTemplate: [{ type: ViewChild, args: ["defaultWrapperTemplate",] }],
224
- defaultFilterTemplate: [{ type: ViewChild, args: ["defaultFilterTemplate",] }],
225
- pagination: [{ type: ViewChild, args: ["pagination",] }],
226
- templateDirectives: [{ type: ContentChildren, args: [DynamicTableTemplateDirective,] }]
227
- };
228
- return DynamicTableComponent;
229
- }());
230
- export { DynamicTableComponent };
231
- if (false) {
232
- /** @type {?} */
233
- DynamicTableComponent.prototype.dataLoader;
234
- /** @type {?} */
235
- DynamicTableComponent.prototype.data;
236
- /** @type {?} */
237
- DynamicTableComponent.prototype.parallelData;
238
- /** @type {?} */
239
- DynamicTableComponent.prototype.columns;
240
- /** @type {?} */
241
- DynamicTableComponent.prototype.showFilter;
242
- /** @type {?} */
243
- DynamicTableComponent.prototype.itemsPerPage;
244
- /** @type {?} */
245
- DynamicTableComponent.prototype.updateTime;
246
- /** @type {?} */
247
- DynamicTableComponent.prototype.maxPages;
248
- /** @type {?} */
249
- DynamicTableComponent.prototype.directionLinks;
250
- /** @type {?} */
251
- DynamicTableComponent.prototype.boundaryLinks;
252
- /** @type {?} */
253
- DynamicTableComponent.prototype.orderBy;
254
- /** @type {?} */
255
- DynamicTableComponent.prototype.orderDescending;
256
- /** @type {?} */
257
- DynamicTableComponent.prototype.templates;
258
- /** @type {?} */
259
- DynamicTableComponent.prototype.filter;
260
- /** @type {?} */
261
- DynamicTableComponent.prototype.orders;
262
- /** @type {?} */
263
- DynamicTableComponent.prototype.cols;
264
- /** @type {?} */
265
- DynamicTableComponent.prototype.rowTemplate;
266
- /** @type {?} */
267
- DynamicTableComponent.prototype.wrapperTemplate;
268
- /** @type {?} */
269
- DynamicTableComponent.prototype.filterTemplate;
270
- /** @type {?} */
271
- DynamicTableComponent.prototype.columnsTemplate;
272
- /** @type {?} */
273
- DynamicTableComponent.prototype.defaultRowTemplate;
274
- /** @type {?} */
275
- DynamicTableComponent.prototype.defaultWrapperTemplate;
276
- /** @type {?} */
277
- DynamicTableComponent.prototype.defaultFilterTemplate;
278
- /** @type {?} */
279
- DynamicTableComponent.prototype.pagination;
280
- /** @type {?} */
281
- DynamicTableComponent.prototype.templateDirectives;
282
- /** @type {?} */
283
- DynamicTableComponent.prototype.loadData;
284
- }
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3RlbXkvbmd4LXV0aWxzLyIsInNvdXJjZXMiOlsibmd4LXV0aWxzL2NvbXBvbmVudHMvZHluYW1pYy10YWJsZS9keW5hbWljLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLEtBQUssRUFFTCxTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUgscUJBQXFCLEVBRXhCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRTFFO0lBOERJO1FBQUEsaUJBS0M7UUFzREQsYUFBUSxHQUFHLFVBQUMsSUFBWSxFQUFFLFlBQW9COztnQkFDcEMsT0FBTyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxPQUFPLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSSxDQUFDLGVBQWUsRUFBRSxLQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxDQUFDO1FBN0RFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBMUNELHNCQUFJLHdDQUFLOzs7O1FBQVQ7WUFDSSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUN6RCxDQUFDOzs7T0FBQTs7Ozs7OztJQTZCYyw2QkFBTzs7Ozs7O0lBQXRCLFVBQXVCLE9BQWUsRUFBRSxDQUF3QixFQUFFLENBQXdCO1FBQ3RGLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDcEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7SUFTRCxrREFBa0I7OztJQUFsQjtRQUNJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQU0sRUFBRSxTQUFTO1lBQzlELElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3ZDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTtvQkFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLENBQUM7YUFDakI7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUMzRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNyQyxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDWCxDQUFDOzs7O0lBRUQsK0NBQWU7OztJQUFmO1FBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQzVFLENBQUM7Ozs7O0lBRUQsMkNBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQzlCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTs7Z0JBQ1gsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQUMsTUFBTSxFQUFFLE1BQU07Z0JBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3hCLE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0U7UUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRTtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBQzVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDOzs7O0lBRUQsdUNBQU87OztJQUFQO1FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBRUQseUNBQVM7Ozs7SUFBVCxVQUFVLE1BQWM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7O0lBRUQsd0NBQVE7Ozs7SUFBUixVQUFTLE1BQWM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7Ozs7OztJQU9PLDZDQUFhOzs7Ozs7OztJQUFyQixVQUFzQixJQUFZLEVBQUUsV0FBbUIsRUFBRSxPQUFlLEVBQUUsZUFBd0IsRUFBRSxNQUFjO1FBQzlHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1osT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNuQixLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLEVBQUUsRUFBRTthQUNaLENBQUMsQ0FBQztTQUNOOztZQUNLLE9BQU8sR0FBK0IsZUFBZTtZQUN2RCxDQUFDLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEscUJBQXFCLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQTVDLENBQTRDO1lBQ3hELENBQUMsQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBNUMsQ0FBNEM7O1lBQ3RELElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXOztZQUMvQixVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNOztZQUM3QixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQzs7WUFDakQsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRTs7WUFDeEMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBSSxFQUFFLEVBQUU7WUFDOUIsT0FBTyxJQUFJLHFCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztnQkFDN0MsVUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDekMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVEsQ0FBQyxFQUFsQixDQUFrQixDQUFDLENBQUM7U0FDL0M7O1lBQ0ssS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7UUFDM0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNuQixLQUFLLEVBQUUsVUFBVTtZQUNqQixLQUFLLEVBQUUsS0FBSztTQUNmLENBQUMsQ0FBQztJQUNQLENBQUM7O2dCQTNKSixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUNuQixRQUFRLEVBQUUsZUFBZTtvQkFDekIsNDBIQUE2QztpQkFDaEQ7Ozs7OzZCQUdJLEtBQUs7dUJBQ0wsS0FBSzsrQkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSzsrQkFDTCxLQUFLOzZCQUNMLEtBQUs7MkJBQ0wsS0FBSztpQ0FDTCxLQUFLO2dDQUNMLEtBQUs7MEJBQ0wsS0FBSztrQ0FDTCxLQUFLOzhCQVdMLFlBQVksU0FBQyxhQUFhO2tDQUcxQixZQUFZLFNBQUMsaUJBQWlCO2lDQUc5QixZQUFZLFNBQUMsZ0JBQWdCO2tDQUc3QixTQUFTLFNBQUMsaUJBQWlCO3FDQUczQixTQUFTLFNBQUMsb0JBQW9CO3lDQUc5QixTQUFTLFNBQUMsd0JBQXdCO3dDQUdsQyxTQUFTLFNBQUMsdUJBQXVCOzZCQUdqQyxTQUFTLFNBQUMsWUFBWTtxQ0FHdEIsZUFBZSxTQUFDLDZCQUE2Qjs7SUF1R2xELDRCQUFDO0NBQUEsQUE1SkQsSUE0SkM7U0F2SlkscUJBQXFCOzs7SUFFOUIsMkNBQXFDOztJQUNyQyxxQ0FBcUI7O0lBQ3JCLDZDQUE2Qjs7SUFDN0Isd0NBQTJDOztJQUMzQywyQ0FBNkI7O0lBQzdCLDZDQUE4Qjs7SUFDOUIsMkNBQTRCOztJQUM1Qix5Q0FBMEI7O0lBQzFCLCtDQUFpQzs7SUFDakMsOENBQWdDOztJQUNoQyx3Q0FBeUI7O0lBQ3pCLGdEQUFrQzs7SUFFbEMsMENBQTJCOztJQUMzQix1Q0FBZTs7SUFDZix1Q0FBc0I7O0lBQ3RCLHFDQUFlOztJQU1mLDRDQUM4Qjs7SUFFOUIsZ0RBQ2tDOztJQUVsQywrQ0FDaUM7O0lBRWpDLGdEQUNrQzs7SUFFbEMsbURBQ3FDOztJQUVyQyx1REFDeUM7O0lBRXpDLHNEQUN3Qzs7SUFFeEMsMkNBQ3dDOztJQUV4QyxtREFDcUU7O0lBbUVyRSx5Q0FHRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgSVBhZ2luYXRpb25EYXRhLFxyXG4gICAgSVRhYmxlQ29sdW1ucyxcclxuICAgIElUYWJsZVRlbXBsYXRlcyxcclxuICAgIFBhZ2luYXRpb25JdGVtQ29udGV4dCxcclxuICAgIFRhYmxlRGF0YUxvYWRlclxyXG59IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL29iamVjdC51dGlsc1wiO1xyXG5pbXBvcnQge0R5bmFtaWNUYWJsZVRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9keW5hbWljLXRhYmxlLXRlbXBsYXRlLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQge1BhZ2luYXRpb25EaXJlY3RpdmV9IGZyb20gXCIuLi8uLi9kaXJlY3RpdmVzL3BhZ2luYXRpb24uZGlyZWN0aXZlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgICBzZWxlY3RvcjogXCJkeW5hbWljLXRhYmxlXCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gICAgQElucHV0KCkgZGF0YUxvYWRlcjogVGFibGVEYXRhTG9hZGVyO1xyXG4gICAgQElucHV0KCkgZGF0YTogYW55W107XHJcbiAgICBASW5wdXQoKSBwYXJhbGxlbERhdGE6IGFueVtdO1xyXG4gICAgQElucHV0KCkgY29sdW1uczogSVRhYmxlQ29sdW1ucyB8IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KCkgc2hvd0ZpbHRlcjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgdXBkYXRlVGltZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgbWF4UGFnZXM6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgYm91bmRhcnlMaW5rczogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG9yZGVyQnk6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICB0ZW1wbGF0ZXM6IElUYWJsZVRlbXBsYXRlcztcclxuICAgIGZpbHRlcjogc3RyaW5nO1xyXG4gICAgb3JkZXJzOiBJVGFibGVDb2x1bW5zO1xyXG4gICAgY29sczogc3RyaW5nW107XHJcblxyXG4gICAgZ2V0IGl0ZW1zKCk6IGFueVtdIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMucGFnaW5hdGlvbiA/IFtdIDogdGhpcy5wYWdpbmF0aW9uLml0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoXCJyb3dUZW1wbGF0ZVwiKVxyXG4gICAgcm93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZChcIndyYXBwZXJUZW1wbGF0ZVwiKVxyXG4gICAgd3JhcHBlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoXCJmaWx0ZXJUZW1wbGF0ZVwiKVxyXG4gICAgZmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgQFZpZXdDaGlsZChcImNvbHVtbnNUZW1wbGF0ZVwiKVxyXG4gICAgY29sdW1uc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoXCJkZWZhdWx0Um93VGVtcGxhdGVcIilcclxuICAgIGRlZmF1bHRSb3dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiZGVmYXVsdFdyYXBwZXJUZW1wbGF0ZVwiKVxyXG4gICAgZGVmYXVsdFdyYXBwZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiZGVmYXVsdEZpbHRlclRlbXBsYXRlXCIpXHJcbiAgICBkZWZhdWx0RmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInBhZ2luYXRpb25cIilcclxuICAgIHByaXZhdGUgcGFnaW5hdGlvbjogUGFnaW5hdGlvbkRpcmVjdGl2ZTtcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNUYWJsZVRlbXBsYXRlRGlyZWN0aXZlKVxyXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZURpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxEeW5hbWljVGFibGVUZW1wbGF0ZURpcmVjdGl2ZT47XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29tcGFyZShvcmRlckJ5OiBzdHJpbmcsIGE6IFBhZ2luYXRpb25JdGVtQ29udGV4dCwgYjogUGFnaW5hdGlvbkl0ZW1Db250ZXh0KTogbnVtYmVyIHtcclxuICAgICAgICBhID0gYS5pdGVtID8gYS5pdGVtW29yZGVyQnldIDogbnVsbDtcclxuICAgICAgICBiID0gYi5pdGVtID8gYi5pdGVtW29yZGVyQnldIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuY29tcGFyZShhLCBiKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRhdGFMb2FkZXIgPSB0aGlzLmxvYWRMb2NhbERhdGE7XHJcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMub3JkZXJzID0ge307XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSB0aGlzLnRlbXBsYXRlRGlyZWN0aXZlcy5yZWR1Y2UoKHJlc3VsdCwgZGlyZWN0aXZlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KGRpcmVjdGl2ZS5jb2x1bW4pKSB7XHJcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmUuY29sdW1uLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbY29sdW1uXSA9IGRpcmVjdGl2ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzU3RyaW5nKGRpcmVjdGl2ZS5jb2x1bW4pIHx8IGRpcmVjdGl2ZS5jb2x1bW4ubGVuZ3RoID09IDApIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIHJlc3VsdFtkaXJlY3RpdmUuY29sdW1uXSA9IGRpcmVjdGl2ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucm93VGVtcGxhdGUgPSB0aGlzLnJvd1RlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdFJvd1RlbXBsYXRlO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyVGVtcGxhdGUgPSB0aGlzLmZpbHRlclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEZpbHRlclRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBjaGFuZ2VzLmNvbHVtbnMuY3VycmVudFZhbHVlIHx8IFtdO1xyXG4gICAgICAgICAgICB0aGlzLm9yZGVycyA9IE9iamVjdFV0aWxzLmlzQXJyYXkoY29sdW1ucykgPyBjb2x1bW5zLnJlZHVjZSgocmVzdWx0LCBjb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtjb2x1bW5dID0gY29sdW1uO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSwge30pIDogY29sdW1ucztcclxuICAgICAgICAgICAgdGhpcy5jb2xzID0gT2JqZWN0LmtleXModGhpcy5vcmRlcnMpO1xyXG4gICAgICAgICAgICB0aGlzLm9yZGVyQnkgPSB0aGlzLm9yZGVyQnkgaW4gdGhpcy5vcmRlcnMgPyB0aGlzLm9yZGVyQnkgOiB0aGlzLmNvbHVtbnNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaGFuZ2VzLm9yZGVyQnkgJiYgdGhpcy5vcmRlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5vcmRlckJ5ID0gdGhpcy5vcmRlckJ5IGluIHRoaXMub3JkZXJzID8gdGhpcy5vcmRlckJ5IDogdGhpcy5jb2x1bW5zWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNoYW5nZXMuZGF0YSAmJiAhY2hhbmdlcy5wYXJhbGxlbERhdGEgJiYgIWNoYW5nZXMuaXRlbXNQZXJQYWdlICYmICFjaGFuZ2VzLm9yZGVyQnkgJiYgIWNoYW5nZXMub3JkZXJEZXNjZW5kaW5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGFnaW5hdGlvbikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbi5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0T3JkZXIoY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9yZGVyRGVzY2VuZGluZyA9IGNvbHVtbiA9PSB0aGlzLm9yZGVyQnkgJiYgIXRoaXMub3JkZXJEZXNjZW5kaW5nO1xyXG4gICAgICAgIHRoaXMub3JkZXJCeSA9IGNvbHVtbjtcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkRGF0YSA9IChwYWdlOiBudW1iZXIsIGl0ZW1zUGVyUGFnZTogbnVtYmVyKTogUHJvbWlzZTxJUGFnaW5hdGlvbkRhdGE+ID0+IHtcclxuICAgICAgICBjb25zdCBvcmRlckJ5ID0gdGhpcy5vcmRlcnNbdGhpcy5vcmRlckJ5XTtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTG9hZGVyKHBhZ2UsIGl0ZW1zUGVyUGFnZSwgb3JkZXJCeSwgdGhpcy5vcmRlckRlc2NlbmRpbmcsIHRoaXMuZmlsdGVyKTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkTG9jYWxEYXRhKHBhZ2U6IG51bWJlciwgcm93c1BlclBhZ2U6IG51bWJlciwgb3JkZXJCeTogc3RyaW5nLCBvcmRlckRlc2NlbmRpbmc6IGJvb2xlYW4sIGZpbHRlcjogc3RyaW5nKTogUHJvbWlzZTxJUGFnaW5hdGlvbkRhdGE+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb21wYXJlOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlciA9IG9yZGVyRGVzY2VuZGluZ1xyXG4gICAgICAgICAgICA/IChhLCBiKSA9PiBEeW5hbWljVGFibGVDb21wb25lbnQuY29tcGFyZShvcmRlckJ5LCBiLCBhKVxyXG4gICAgICAgICAgICA6IChhLCBiKSA9PiBEeW5hbWljVGFibGVDb21wb25lbnQuY29tcGFyZShvcmRlckJ5LCBhLCBiKTtcclxuICAgICAgICBjb25zdCBmcm9tID0gKHBhZ2UgLSAxKSAqIHJvd3NQZXJQYWdlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKHJvd3NQZXJQYWdlLCBkYXRhTGVuZ3RoIC0gZnJvbSk7XHJcbiAgICAgICAgY29uc3QgcGFyYWxsZWxEYXRhID0gdGhpcy5wYXJhbGxlbERhdGEgfHwgW107XHJcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGEubWFwKChpdGVtLCBpeCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhZ2luYXRpb25JdGVtQ29udGV4dChpdGVtLCBwYXJhbGxlbERhdGFbaXhdIHx8IHt9LCBkYXRhTGVuZ3RoLCBpeCwgaXgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc1N0cmluZyhmaWx0ZXIpICYmIGZpbHRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclJ4ID0gbmV3IFJlZ0V4cChmaWx0ZXIsIFwiZ2lcIik7XHJcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihjID0+IGMuZmlsdGVyKGZpbHRlclJ4KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gb3JkZXJCeSA/IGRhdGEuc29ydChjb21wYXJlKS5zcGxpY2UoZnJvbSwgbGVuZ3RoKSA6IGRhdGEuc3BsaWNlKGZyb20sIGxlbmd0aCk7XHJcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoY29udGV4dCwgaXgpID0+IHtcclxuICAgICAgICAgICAgY29udGV4dC5pbmRleCA9IGZyb20gKyBpeDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICAgICAgICAgdG90YWw6IGRhdGFMZW5ndGgsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,198 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
4
- */
5
- import { Component, Inject, Input } from "@angular/core";
6
- import { ObjectUtils } from "../../utils/object.utils";
7
- import { StateService } from "../../services/state.service";
8
- import { PaginationDirective } from "../../directives/pagination.directive";
9
- import { ICON_SERVICE } from "../../common-types";
10
- var PaginationMenuComponent = /** @class */ (function () {
11
- function PaginationMenuComponent(state, pagination, icons) {
12
- this.state = state;
13
- this.pagination = pagination;
14
- this.icons = icons;
15
- this.maxSize = 5;
16
- this.directionLinks = true;
17
- this.boundaryLinks = true;
18
- this.firstLabel = "<<";
19
- this.prevLabel = "<";
20
- this.nextLabel = ">";
21
- this.lastLabel = ">>";
22
- }
23
- Object.defineProperty(PaginationMenuComponent.prototype, "hasPrev", {
24
- get: /**
25
- * @return {?}
26
- */
27
- function () {
28
- return this.pagination.page > 1;
29
- },
30
- enumerable: true,
31
- configurable: true
32
- });
33
- Object.defineProperty(PaginationMenuComponent.prototype, "hasNext", {
34
- get: /**
35
- * @return {?}
36
- */
37
- function () {
38
- return this.pagination.page < this.pagination.maxPage;
39
- },
40
- enumerable: true,
41
- configurable: true
42
- });
43
- /**
44
- * @return {?}
45
- */
46
- PaginationMenuComponent.prototype.ngOnInit = /**
47
- * @return {?}
48
- */
49
- function () {
50
- var _this = this;
51
- this.onRefresh = this.pagination.onRefresh.subscribe(function () { return _this.setPages(); });
52
- this.setIcon("firstLabel", "first-page");
53
- this.setIcon("prevLabel", "prev-page");
54
- this.setIcon("nextLabel", "next-page");
55
- this.setIcon("lastLabel", "last-page");
56
- };
57
- /**
58
- * @return {?}
59
- */
60
- PaginationMenuComponent.prototype.ngOnDestroy = /**
61
- * @return {?}
62
- */
63
- function () {
64
- if (!this.onRefresh)
65
- return;
66
- this.onRefresh.unsubscribe();
67
- };
68
- /**
69
- * @param {?} changes
70
- * @return {?}
71
- */
72
- PaginationMenuComponent.prototype.ngOnChanges = /**
73
- * @param {?} changes
74
- * @return {?}
75
- */
76
- function (changes) {
77
- this.maxSize = isNaN(this.maxSize) || this.maxSize <= 0 ? 5 : this.maxSize;
78
- this.directionLinks = ObjectUtils.isBoolean(this.directionLinks) ? this.directionLinks : true;
79
- this.boundaryLinks = ObjectUtils.isBoolean(this.boundaryLinks) ? this.boundaryLinks : true;
80
- this.setPages();
81
- };
82
- /**
83
- * @param {?} page
84
- * @return {?}
85
- */
86
- PaginationMenuComponent.prototype.paginate = /**
87
- * @param {?} page
88
- * @return {?}
89
- */
90
- function (page) {
91
- if (this.pagination.page == page || this.pagination.maxPage < page || page < 1)
92
- return;
93
- if (!this.urlParam) {
94
- this.pagination.paginate(page);
95
- return;
96
- }
97
- /** @type {?} */
98
- var params = Object.assign({}, this.state.params);
99
- params[this.urlParam] = page.toString();
100
- /** @type {?} */
101
- var path = StateService.toPath(this.state.route, params);
102
- this.state.navigateByUrl(path);
103
- };
104
- /**
105
- * @param {?} labelName
106
- * @param {?} icon
107
- * @return {?}
108
- */
109
- PaginationMenuComponent.prototype.setIcon = /**
110
- * @param {?} labelName
111
- * @param {?} icon
112
- * @return {?}
113
- */
114
- function (labelName, icon) {
115
- var _this = this;
116
- this.icons.getIcon(icon, icon, false).then(function (i) {
117
- if (i == icon)
118
- return;
119
- _this[labelName] = i;
120
- });
121
- };
122
- /**
123
- * @return {?}
124
- */
125
- PaginationMenuComponent.prototype.setPages = /**
126
- * @return {?}
127
- */
128
- function () {
129
- if (!this.pagination)
130
- return;
131
- /** @type {?} */
132
- var totalPages = this.pagination.maxPage;
133
- /** @type {?} */
134
- var startPage = Math.max(this.pagination.page - Math.floor(this.maxSize / 2), 1);
135
- /** @type {?} */
136
- var endPage = startPage + this.maxSize - 1;
137
- if (endPage > totalPages) {
138
- endPage = totalPages;
139
- startPage = Math.max(endPage - this.maxSize + 1, 1);
140
- }
141
- /** @type {?} */
142
- var pages = [];
143
- for (var num = startPage; num <= endPage; num++) {
144
- pages.push(num);
145
- }
146
- this.pages = pages;
147
- };
148
- PaginationMenuComponent.decorators = [
149
- { type: Component, args: [{
150
- moduleId: module.id,
151
- selector: "pagination-menu",
152
- template: "<div class=\"pagination-menu\" *ngIf=\"pagination.total > pagination.itemsPerPage\">\r\n <ul class=\"pagination\">\r\n <li class=\"page-item\" [ngClass]=\"{disabled: !hasPrev}\" *ngIf=\"boundaryLinks\">\r\n <a class=\"page-link\" (click)=\"paginate(1)\" [innerHTML]=\"firstLabel | safe\"></a>\r\n </li>\r\n <li class=\"page-item\" [ngClass]=\"{disabled: !hasPrev}\" *ngIf=\"directionLinks\">\r\n <a class=\"page-link\" (click)=\"paginate(pagination.page - 1)\" [innerHTML]=\"prevLabel | safe\"></a>\r\n </li>\r\n <li class=\"page-item\" [ngClass]=\"{active: pagination.page == page}\" *ngFor=\"let page of pages\">\r\n <a class=\"page-link\" [ngClass]=\"{active: pagination.page == page}\" (click)=\"paginate(page)\">{{ page }}</a>\r\n </li>\r\n <li class=\"page-item\" [ngClass]=\"{disabled: !hasNext}\" *ngIf=\"directionLinks\">\r\n <a class=\"page-link\" (click)=\"paginate(pagination.page + 1)\" [innerHTML]=\"nextLabel | safe\"></a>\r\n </li>\r\n <li class=\"page-item\" [ngClass]=\"{disabled: !hasNext}\" *ngIf=\"boundaryLinks\">\r\n <a class=\"page-link\" (click)=\"paginate(pagination.maxPage)\" [innerHTML]=\"lastLabel | safe\"></a>\r\n </li>\r\n </ul>\r\n</div>\r\n"
153
- }] }
154
- ];
155
- /** @nocollapse */
156
- PaginationMenuComponent.ctorParameters = function () { return [
157
- { type: StateService },
158
- { type: PaginationDirective },
159
- { type: undefined, decorators: [{ type: Inject, args: [ICON_SERVICE,] }] }
160
- ]; };
161
- PaginationMenuComponent.propDecorators = {
162
- maxSize: [{ type: Input }],
163
- urlParam: [{ type: Input }],
164
- directionLinks: [{ type: Input }],
165
- boundaryLinks: [{ type: Input }]
166
- };
167
- return PaginationMenuComponent;
168
- }());
169
- export { PaginationMenuComponent };
170
- if (false) {
171
- /** @type {?} */
172
- PaginationMenuComponent.prototype.maxSize;
173
- /** @type {?} */
174
- PaginationMenuComponent.prototype.urlParam;
175
- /** @type {?} */
176
- PaginationMenuComponent.prototype.directionLinks;
177
- /** @type {?} */
178
- PaginationMenuComponent.prototype.boundaryLinks;
179
- /** @type {?} */
180
- PaginationMenuComponent.prototype.pages;
181
- /** @type {?} */
182
- PaginationMenuComponent.prototype.firstLabel;
183
- /** @type {?} */
184
- PaginationMenuComponent.prototype.prevLabel;
185
- /** @type {?} */
186
- PaginationMenuComponent.prototype.nextLabel;
187
- /** @type {?} */
188
- PaginationMenuComponent.prototype.lastLabel;
189
- /** @type {?} */
190
- PaginationMenuComponent.prototype.onRefresh;
191
- /** @type {?} */
192
- PaginationMenuComponent.prototype.state;
193
- /** @type {?} */
194
- PaginationMenuComponent.prototype.pagination;
195
- /** @type {?} */
196
- PaginationMenuComponent.prototype.icons;
197
- }
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdGVteS9uZ3gtdXRpbHMvIiwic291cmNlcyI6WyJuZ3gtdXRpbHMvY29tcG9uZW50cy9wYWdpbmF0aW9uLW1lbnUvcGFnaW5hdGlvbi1tZW51LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUE4QyxNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxZQUFZLEVBQWUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RDtJQTRCSSxpQ0FBbUIsS0FBbUIsRUFBUyxVQUErQixFQUErQixLQUFtQjtRQUE3RyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFBK0IsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUM1SCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBbEJELHNCQUFJLDRDQUFPOzs7O1FBQVg7WUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNw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RkM7U0F2RlksdUJBQXVCOzs7SUFFaEMsMENBQXlCOztJQUN6QiwyQ0FBMEI7O0lBQzFCLGlEQUFpQzs7SUFDakMsZ0RBQWdDOztJQUVoQyx3Q0FBZ0I7O0lBQ2hCLDZDQUFtQjs7SUFDbkIsNENBQWtCOztJQUNsQiw0Q0FBa0I7O0lBQ2xCLDRDQUFrQjs7SUFVbEIsNENBQWdDOztJQUVwQix3Q0FBMEI7O0lBQUUsNkNBQXNDOztJQUFFLHdDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL29iamVjdC51dGlsc1wiO1xyXG5pbXBvcnQge1N0YXRlU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0YXRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtQYWdpbmF0aW9uRGlyZWN0aXZlfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9wYWdpbmF0aW9uLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQge0lDT05fU0VSVklDRSwgSUljb25TZXJ2aWNlfSBmcm9tIFwiLi4vLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgICBzZWxlY3RvcjogXCJwYWdpbmF0aW9uLW1lbnVcIixcclxuICAgIHRlbXBsYXRlVXJsOiBcIi4vcGFnaW5hdGlvbi1tZW51LmNvbXBvbmVudC5odG1sXCJcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25NZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcblxyXG4gICAgQElucHV0KCkgbWF4U2l6ZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgdXJsUGFyYW06IHN0cmluZztcclxuICAgIEBJbnB1dCgpIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgYm91bmRhcnlMaW5rczogYm9vbGVhbjtcclxuXHJcbiAgICBwYWdlczogbnVtYmVyW107XHJcbiAgICBmaXJzdExhYmVsOiBzdHJpbmc7XHJcbiAgICBwcmV2TGFiZWw6IHN0cmluZztcclxuICAgIG5leHRMYWJlbDogc3RyaW5nO1xyXG4gICAgbGFzdExhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgZ2V0IGhhc1ByZXYoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbi5wYWdlID4gMTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaGFzTmV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPCB0aGlzLnBhZ2luYXRpb24ubWF4UGFnZVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25SZWZyZXNoOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHN0YXRlOiBTdGF0ZVNlcnZpY2UsIHB1YmxpYyBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uRGlyZWN0aXZlLCBASW5qZWN0KElDT05fU0VSVklDRSkgcHVibGljIGljb25zOiBJSWNvblNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLm1heFNpemUgPSA1O1xyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uTGlua3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYm91bmRhcnlMaW5rcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5maXJzdExhYmVsID0gYDw8YDtcclxuICAgICAgICB0aGlzLnByZXZMYWJlbCA9IGA8YDtcclxuICAgICAgICB0aGlzLm5leHRMYWJlbCA9IGA+YDtcclxuICAgICAgICB0aGlzLmxhc3RMYWJlbCA9IGA+PmA7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblJlZnJlc2ggPSB0aGlzLnBhZ2luYXRpb24ub25SZWZyZXNoLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNldFBhZ2VzKCkpO1xyXG4gICAgICAgIHRoaXMuc2V0SWNvbihcImZpcnN0TGFiZWxcIiwgXCJmaXJzdC1wYWdlXCIpO1xyXG4gICAgICAgIHRoaXMuc2V0SWNvbihcInByZXZMYWJlbFwiLCBcInByZXYtcGFnZVwiKTtcclxuICAgICAgICB0aGlzLnNldEljb24oXCJuZXh0TGFiZWxcIiwgXCJuZXh0LXBhZ2VcIik7XHJcbiAgICAgICAgdGhpcy5zZXRJY29uKFwibGFzdExhYmVsXCIsIFwibGFzdC1wYWdlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5vblJlZnJlc2gpIHJldHVybjtcclxuICAgICAgICB0aGlzLm9uUmVmcmVzaC51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1heFNpemUgPSBpc05hTih0aGlzLm1heFNpemUpIHx8IHRoaXMubWF4U2l6ZSA8PSAwID8gNSA6IHRoaXMubWF4U2l6ZTtcclxuICAgICAgICB0aGlzLmRpcmVjdGlvbkxpbmtzID0gT2JqZWN0VXRpbHMuaXNCb29sZWFuKHRoaXMuZGlyZWN0aW9uTGlua3MpID8gdGhpcy5kaXJlY3Rpb25MaW5rcyA6IHRydWU7XHJcbiAgICAgICAgdGhpcy5ib3VuZGFyeUxpbmtzID0gT2JqZWN0VXRpbHMuaXNCb29sZWFuKHRoaXMuYm91bmRhcnlMaW5rcykgPyB0aGlzLmJvdW5kYXJ5TGlua3MgOiB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0UGFnZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYWdpbmF0ZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYWdpbmF0aW9uLnBhZ2UgPT0gcGFnZSB8fCB0aGlzLnBhZ2luYXRpb24ubWF4UGFnZSA8IHBhZ2UgfHwgcGFnZSA8IDEpIHJldHVybjtcclxuICAgICAgICBpZiAoIXRoaXMudXJsUGFyYW0pIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2luYXRlKHBhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUucGFyYW1zKTtcclxuICAgICAgICBwYXJhbXNbdGhpcy51cmxQYXJhbV0gPSBwYWdlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFN0YXRlU2VydmljZS50b1BhdGgodGhpcy5zdGF0ZS5yb3V0ZSwgcGFyYW1zKTtcclxuICAgICAgICB0aGlzLnN0YXRlLm5hdmlnYXRlQnlVcmwocGF0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldEljb24obGFiZWxOYW1lOiBzdHJpbmcsIGljb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaWNvbnMuZ2V0SWNvbihpY29uLCBpY29uLCBmYWxzZSkudGhlbihpID0+IHtcclxuICAgICAgICAgICAgaWYgKGkgPT0gaWNvbikgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzW2xhYmVsTmFtZV0gPSBpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRQYWdlcygpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICghdGhpcy5wYWdpbmF0aW9uKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGlvbi5tYXhQYWdlO1xyXG4gICAgICAgIGxldCBzdGFydFBhZ2UgPSBNYXRoLm1heCh0aGlzLnBhZ2luYXRpb24ucGFnZSAtIE1hdGguZmxvb3IodGhpcy5tYXhTaXplIC8gMiksIDEpO1xyXG4gICAgICAgIGxldCBlbmRQYWdlID0gc3RhcnRQYWdlICsgdGhpcy5tYXhTaXplIC0gMTtcclxuICAgICAgICBpZiAoZW5kUGFnZSA+IHRvdGFsUGFnZXMpIHtcclxuICAgICAgICAgICAgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICAgICAgICAgIHN0YXJ0UGFnZSA9IE1hdGgubWF4KGVuZFBhZ2UgLSB0aGlzLm1heFNpemUgKyAxLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGFnZXM6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbnVtID0gc3RhcnRQYWdlOyBudW0gPD0gZW5kUGFnZTsgbnVtKyspIHtcclxuICAgICAgICAgICAgcGFnZXMucHVzaChudW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBhZ2VzID0gcGFnZXM7XHJcbiAgICB9XHJcbn1cclxuIl19