@gipisistemas/ng-core 1.1.2 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. package/assets/styles/colors.scss +5 -1
  2. package/bundles/gipisistemas-ng-core.umd.js +8416 -7886
  3. package/bundles/gipisistemas-ng-core.umd.js.map +1 -1
  4. package/bundles/gipisistemas-ng-core.umd.min.js +10 -9
  5. package/bundles/gipisistemas-ng-core.umd.min.js.map +1 -1
  6. package/core/gipi-components/models/sort.model.d.ts +3 -3
  7. package/core/utils/array.util.d.ts +2 -2
  8. package/core/utils/object.util.d.ts +3 -5
  9. package/esm2015/core/gipi-components/models/sort.model.js +1 -1
  10. package/esm2015/core/gipi-components/services/abstract-crud.service.js +18 -24
  11. package/esm2015/core/utils/array.util.js +4 -2
  12. package/esm2015/core/utils/object.util.js +5 -9
  13. package/esm2015/gipi-components.js +10 -1
  14. package/esm2015/shared/components/input/input.component.js +46 -23
  15. package/esm2015/shared/components/table/table.component.js +1 -1
  16. package/esm2015/shared/gipi-components/abstract-form/abstract-form.component.js +1 -1
  17. package/esm2015/shared/gipi-components/button/button.component.js +2 -2
  18. package/esm2015/shared/gipi-components/card/card.component.js +113 -0
  19. package/esm2015/shared/gipi-components/datepicker/datepicker/datepicker.component.js +8 -3
  20. package/esm2015/shared/gipi-components/empty-state/empty-state.component.js +30 -0
  21. package/esm2015/shared/gipi-components/input-select/input-select.component.js +7 -4
  22. package/esm2015/shared/gipi-components/layout-grid/col.directive.js +4 -4
  23. package/esm2015/shared/gipi-components/month-year-picker/month-year-picker.component.js +2 -2
  24. package/esm2015/shared/gipi-components/notification/notification.component.js +8 -3
  25. package/esm2015/shared/gipi-components/sidebar/sidenav/sidenav.component.js +35 -3
  26. package/esm2015/shared/gipi-components/slide-toggle/slide-toggle.component.js +113 -0
  27. package/esm2015/shared/gipi-components/tabs/shared/dynamic-tab.directive.js +18 -0
  28. package/esm2015/shared/gipi-components/tabs/shared/tab.model.js +8 -0
  29. package/esm2015/shared/gipi-components/tabs/tab/tab.component.js +66 -0
  30. package/esm2015/shared/gipi-components/tabs/tab-group/tab-group.component.js +123 -0
  31. package/esm2015/shared/gipi-components/textarea/textarea.component.js +298 -0
  32. package/esm2015/shared/shared.module.js +20 -16
  33. package/esm2015/shared.js +1 -5
  34. package/esm5/core/gipi-components/models/sort.model.js +1 -1
  35. package/esm5/core/gipi-components/services/abstract-crud.service.js +18 -24
  36. package/esm5/core/utils/array.util.js +4 -3
  37. package/esm5/core/utils/object.util.js +5 -9
  38. package/esm5/gipi-components.js +10 -1
  39. package/esm5/shared/components/input/input.component.js +46 -23
  40. package/esm5/shared/components/table/table.component.js +1 -1
  41. package/esm5/shared/gipi-components/abstract-form/abstract-form.component.js +1 -1
  42. package/esm5/shared/gipi-components/button/button.component.js +2 -2
  43. package/esm5/shared/gipi-components/card/card.component.js +135 -0
  44. package/esm5/shared/gipi-components/datepicker/datepicker/datepicker.component.js +8 -3
  45. package/esm5/shared/gipi-components/empty-state/empty-state.component.js +33 -0
  46. package/esm5/shared/gipi-components/input-select/input-select.component.js +11 -4
  47. package/esm5/shared/gipi-components/layout-grid/col.directive.js +4 -4
  48. package/esm5/shared/gipi-components/month-year-picker/month-year-picker.component.js +2 -2
  49. package/esm5/shared/gipi-components/notification/notification.component.js +8 -3
  50. package/esm5/shared/gipi-components/sidebar/sidenav/sidenav.component.js +35 -3
  51. package/esm5/shared/gipi-components/slide-toggle/slide-toggle.component.js +127 -0
  52. package/esm5/shared/gipi-components/tabs/shared/dynamic-tab.directive.js +19 -0
  53. package/esm5/shared/gipi-components/tabs/shared/tab.model.js +10 -0
  54. package/esm5/shared/gipi-components/tabs/tab/tab.component.js +67 -0
  55. package/esm5/shared/gipi-components/tabs/tab-group/tab-group.component.js +131 -0
  56. package/esm5/shared/gipi-components/textarea/textarea.component.js +352 -0
  57. package/esm5/shared/shared.module.js +20 -16
  58. package/esm5/shared.js +1 -5
  59. package/fesm2015/gipisistemas-ng-core.js +1746 -1305
  60. package/fesm2015/gipisistemas-ng-core.js.map +1 -1
  61. package/fesm5/gipisistemas-ng-core.js +8406 -7881
  62. package/fesm5/gipisistemas-ng-core.js.map +1 -1
  63. package/gipi-components.d.ts +8 -0
  64. package/gipisistemas-ng-core.metadata.json +1 -1
  65. package/package.json +1 -2
  66. package/shared/components/input/input.component.d.ts +13 -11
  67. package/shared/components/table/table.component.d.ts +3 -3
  68. package/shared/gipi-components/card/card.component.d.ts +23 -0
  69. package/shared/gipi-components/empty-state/empty-state.component.d.ts +5 -0
  70. package/shared/gipi-components/input-select/input-select.component.d.ts +1 -0
  71. package/shared/gipi-components/notification/notification.component.d.ts +1 -0
  72. package/shared/gipi-components/sidebar/sidenav/sidenav.component.d.ts +7 -0
  73. package/shared/gipi-components/slide-toggle/slide-toggle.component.d.ts +27 -0
  74. package/shared/{directives → gipi-components/tabs/shared}/dynamic-tab.directive.d.ts +1 -1
  75. package/shared/gipi-components/tabs/shared/tab.model.d.ts +12 -0
  76. package/shared/{components → gipi-components/tabs}/tab/tab.component.d.ts +4 -2
  77. package/shared/gipi-components/tabs/tab-group/tab-group.component.d.ts +22 -0
  78. package/shared/gipi-components/textarea/textarea.component.d.ts +68 -0
  79. package/shared.d.ts +0 -4
  80. package/esm2015/shared/components/select-button/select-button.component.js +0 -181
  81. package/esm2015/shared/components/tab/tab.component.js +0 -57
  82. package/esm2015/shared/components/tab-group/tab-group.component.js +0 -117
  83. package/esm2015/shared/directives/dynamic-tab.directive.js +0 -18
  84. package/esm5/shared/components/select-button/select-button.component.js +0 -195
  85. package/esm5/shared/components/tab/tab.component.js +0 -58
  86. package/esm5/shared/components/tab-group/tab-group.component.js +0 -125
  87. package/esm5/shared/directives/dynamic-tab.directive.js +0 -19
  88. package/shared/components/select-button/select-button.component.d.ts +0 -35
  89. package/shared/components/tab-group/tab-group.component.d.ts +0 -22
@@ -0,0 +1,352 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { coerceBooleanProperty, coerceCssPixelValue } from '@angular/cdk/coercion';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, Input, OnInit } from '@angular/core';
4
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ var nextUniqueId = 0;
6
+ var GIPITextareaComponent = /** @class */ (function () {
7
+ function GIPITextareaComponent(elementRef, _changeDetectorRef) {
8
+ this.elementRef = elementRef;
9
+ this._changeDetectorRef = _changeDetectorRef;
10
+ this._name = "gipi-textarea-" + nextUniqueId++;
11
+ this.id = this._name;
12
+ this.name = this._name;
13
+ this.label = '';
14
+ this.placeholder = '';
15
+ this.cols = 20;
16
+ this.rows = 4;
17
+ this.help = '';
18
+ this.maxlength = 254;
19
+ this.minlength = 0;
20
+ this._resize = 'horizontal';
21
+ this._minHeight = '60px';
22
+ this._height = '60px';
23
+ this._maxHeight = 'auto';
24
+ this._autocomplete = 'off';
25
+ this._autofocus = false;
26
+ this._readOnly = false;
27
+ this._required = false;
28
+ this._disabled = false;
29
+ this._lowerCase = false;
30
+ this._upperCase = false;
31
+ this._spaceDrop = false;
32
+ this.onChange = function () { };
33
+ this.onTouched = function () { };
34
+ }
35
+ GIPITextareaComponent_1 = GIPITextareaComponent;
36
+ Object.defineProperty(GIPITextareaComponent.prototype, "resize", {
37
+ get: function () {
38
+ return this._resize;
39
+ },
40
+ set: function (value) {
41
+ if (value !== this.resize) {
42
+ this._resize = value.toLowerCase();
43
+ this._changeDetectorRef.detectChanges();
44
+ }
45
+ },
46
+ enumerable: false,
47
+ configurable: true
48
+ });
49
+ Object.defineProperty(GIPITextareaComponent.prototype, "minHeight", {
50
+ get: function () {
51
+ return this._minHeight;
52
+ },
53
+ set: function (value) {
54
+ if (value.trim().toUpperCase() === 'AUTO') {
55
+ this._minHeight = 'auto';
56
+ }
57
+ else {
58
+ this._minHeight = coerceCssPixelValue(value);
59
+ }
60
+ },
61
+ enumerable: false,
62
+ configurable: true
63
+ });
64
+ Object.defineProperty(GIPITextareaComponent.prototype, "height", {
65
+ get: function () {
66
+ return this._height;
67
+ },
68
+ set: function (value) {
69
+ if (value.trim().toUpperCase() === 'AUTO') {
70
+ this._height = 'auto';
71
+ }
72
+ else {
73
+ this._height = coerceCssPixelValue(value);
74
+ }
75
+ },
76
+ enumerable: false,
77
+ configurable: true
78
+ });
79
+ Object.defineProperty(GIPITextareaComponent.prototype, "maxHeight", {
80
+ get: function () {
81
+ return this._maxHeight;
82
+ },
83
+ set: function (value) {
84
+ if (value.trim().toUpperCase() === 'AUTO') {
85
+ this._maxHeight = 'auto';
86
+ }
87
+ else {
88
+ this._maxHeight = coerceCssPixelValue(value);
89
+ }
90
+ },
91
+ enumerable: false,
92
+ configurable: true
93
+ });
94
+ Object.defineProperty(GIPITextareaComponent.prototype, "autocomplete", {
95
+ get: function () {
96
+ return this._autocomplete;
97
+ },
98
+ set: function (value) {
99
+ this._autocomplete = value;
100
+ },
101
+ enumerable: false,
102
+ configurable: true
103
+ });
104
+ Object.defineProperty(GIPITextareaComponent.prototype, "autofocus", {
105
+ get: function () {
106
+ return this._autofocus;
107
+ },
108
+ set: function (value) {
109
+ this._autofocus = coerceBooleanProperty(value);
110
+ },
111
+ enumerable: false,
112
+ configurable: true
113
+ });
114
+ Object.defineProperty(GIPITextareaComponent.prototype, "readOnly", {
115
+ get: function () {
116
+ return this._readOnly;
117
+ },
118
+ set: function (value) {
119
+ this._readOnly = coerceBooleanProperty(value);
120
+ },
121
+ enumerable: false,
122
+ configurable: true
123
+ });
124
+ Object.defineProperty(GIPITextareaComponent.prototype, "required", {
125
+ get: function () {
126
+ return this._required;
127
+ },
128
+ set: function (value) {
129
+ this._required = coerceBooleanProperty(value);
130
+ },
131
+ enumerable: false,
132
+ configurable: true
133
+ });
134
+ Object.defineProperty(GIPITextareaComponent.prototype, "disabled", {
135
+ get: function () {
136
+ return this._disabled;
137
+ },
138
+ set: function (value) {
139
+ this._disabled = coerceBooleanProperty(value);
140
+ },
141
+ enumerable: false,
142
+ configurable: true
143
+ });
144
+ Object.defineProperty(GIPITextareaComponent.prototype, "lowerCase", {
145
+ get: function () {
146
+ return this._lowerCase;
147
+ },
148
+ set: function (value) {
149
+ this._lowerCase = coerceBooleanProperty(value);
150
+ },
151
+ enumerable: false,
152
+ configurable: true
153
+ });
154
+ Object.defineProperty(GIPITextareaComponent.prototype, "upperCase", {
155
+ get: function () {
156
+ return this._upperCase;
157
+ },
158
+ set: function (value) {
159
+ this._upperCase = coerceBooleanProperty(value);
160
+ },
161
+ enumerable: false,
162
+ configurable: true
163
+ });
164
+ Object.defineProperty(GIPITextareaComponent.prototype, "spaceDrop", {
165
+ get: function () {
166
+ return this._spaceDrop;
167
+ },
168
+ set: function (value) {
169
+ this._spaceDrop = coerceBooleanProperty(value);
170
+ },
171
+ enumerable: false,
172
+ configurable: true
173
+ });
174
+ Object.defineProperty(GIPITextareaComponent.prototype, "value", {
175
+ get: function () {
176
+ return this._value;
177
+ },
178
+ set: function (value) {
179
+ var valueAux = value;
180
+ valueAux = this._checkSpaceDrop(valueAux);
181
+ valueAux = this._checkLowercase(valueAux);
182
+ valueAux = this._checkUppercase(valueAux);
183
+ this._value = valueAux;
184
+ this.onChange(this._value);
185
+ this.onTouched(this._value);
186
+ },
187
+ enumerable: false,
188
+ configurable: true
189
+ });
190
+ GIPITextareaComponent.prototype.ngOnInit = function () { };
191
+ GIPITextareaComponent.prototype.writeValue = function (value) {
192
+ this._value = value;
193
+ };
194
+ GIPITextareaComponent.prototype.registerOnChange = function (fn) {
195
+ this.onChange = fn;
196
+ };
197
+ GIPITextareaComponent.prototype.registerOnTouched = function (fn) {
198
+ this.onTouched = fn;
199
+ };
200
+ GIPITextareaComponent.prototype.setDisabledState = function (isDisabled) {
201
+ this.disabled = isDisabled;
202
+ this._changeDetectorRef.markForCheck();
203
+ };
204
+ GIPITextareaComponent.prototype._checkSpaceDrop = function (value) {
205
+ if (this.spaceDrop && value) {
206
+ return value.replace(/\s/g, '');
207
+ }
208
+ return value;
209
+ };
210
+ GIPITextareaComponent.prototype._checkUppercase = function (value) {
211
+ if (this.upperCase && value) {
212
+ return value.toUpperCase();
213
+ }
214
+ return value;
215
+ };
216
+ GIPITextareaComponent.prototype._checkLowercase = function (value) {
217
+ if (this.lowerCase && value) {
218
+ return value.toLowerCase();
219
+ }
220
+ return value;
221
+ };
222
+ var GIPITextareaComponent_1;
223
+ GIPITextareaComponent.ctorParameters = function () { return [
224
+ { type: ElementRef },
225
+ { type: ChangeDetectorRef }
226
+ ]; };
227
+ __decorate([
228
+ Input(),
229
+ __metadata("design:type", String)
230
+ ], GIPITextareaComponent.prototype, "id", void 0);
231
+ __decorate([
232
+ Input(),
233
+ __metadata("design:type", String)
234
+ ], GIPITextareaComponent.prototype, "name", void 0);
235
+ __decorate([
236
+ Input(),
237
+ __metadata("design:type", String)
238
+ ], GIPITextareaComponent.prototype, "label", void 0);
239
+ __decorate([
240
+ Input(),
241
+ __metadata("design:type", String)
242
+ ], GIPITextareaComponent.prototype, "placeholder", void 0);
243
+ __decorate([
244
+ Input(),
245
+ __metadata("design:type", Number)
246
+ ], GIPITextareaComponent.prototype, "cols", void 0);
247
+ __decorate([
248
+ Input(),
249
+ __metadata("design:type", Number)
250
+ ], GIPITextareaComponent.prototype, "rows", void 0);
251
+ __decorate([
252
+ Input(),
253
+ __metadata("design:type", String)
254
+ ], GIPITextareaComponent.prototype, "help", void 0);
255
+ __decorate([
256
+ Input(),
257
+ __metadata("design:type", Number)
258
+ ], GIPITextareaComponent.prototype, "maxlength", void 0);
259
+ __decorate([
260
+ Input(),
261
+ __metadata("design:type", Number)
262
+ ], GIPITextareaComponent.prototype, "minlength", void 0);
263
+ __decorate([
264
+ Input(),
265
+ __metadata("design:type", String),
266
+ __metadata("design:paramtypes", [String])
267
+ ], GIPITextareaComponent.prototype, "resize", null);
268
+ __decorate([
269
+ Input(),
270
+ __metadata("design:type", String),
271
+ __metadata("design:paramtypes", [String])
272
+ ], GIPITextareaComponent.prototype, "minHeight", null);
273
+ __decorate([
274
+ Input(),
275
+ __metadata("design:type", String),
276
+ __metadata("design:paramtypes", [String])
277
+ ], GIPITextareaComponent.prototype, "height", null);
278
+ __decorate([
279
+ Input(),
280
+ __metadata("design:type", String),
281
+ __metadata("design:paramtypes", [String])
282
+ ], GIPITextareaComponent.prototype, "maxHeight", null);
283
+ __decorate([
284
+ Input(),
285
+ __metadata("design:type", String),
286
+ __metadata("design:paramtypes", [String])
287
+ ], GIPITextareaComponent.prototype, "autocomplete", null);
288
+ __decorate([
289
+ Input(),
290
+ __metadata("design:type", Boolean),
291
+ __metadata("design:paramtypes", [Boolean])
292
+ ], GIPITextareaComponent.prototype, "autofocus", null);
293
+ __decorate([
294
+ Input(),
295
+ __metadata("design:type", Boolean),
296
+ __metadata("design:paramtypes", [Boolean])
297
+ ], GIPITextareaComponent.prototype, "readOnly", null);
298
+ __decorate([
299
+ Input(),
300
+ __metadata("design:type", Boolean),
301
+ __metadata("design:paramtypes", [Boolean])
302
+ ], GIPITextareaComponent.prototype, "required", null);
303
+ __decorate([
304
+ Input(),
305
+ __metadata("design:type", Boolean),
306
+ __metadata("design:paramtypes", [Boolean])
307
+ ], GIPITextareaComponent.prototype, "disabled", null);
308
+ __decorate([
309
+ Input(),
310
+ __metadata("design:type", Boolean),
311
+ __metadata("design:paramtypes", [Boolean])
312
+ ], GIPITextareaComponent.prototype, "lowerCase", null);
313
+ __decorate([
314
+ Input(),
315
+ __metadata("design:type", Boolean),
316
+ __metadata("design:paramtypes", [Boolean])
317
+ ], GIPITextareaComponent.prototype, "upperCase", null);
318
+ __decorate([
319
+ Input(),
320
+ __metadata("design:type", Boolean),
321
+ __metadata("design:paramtypes", [Boolean])
322
+ ], GIPITextareaComponent.prototype, "spaceDrop", null);
323
+ __decorate([
324
+ Input(),
325
+ __metadata("design:type", Object),
326
+ __metadata("design:paramtypes", [Object])
327
+ ], GIPITextareaComponent.prototype, "value", null);
328
+ GIPITextareaComponent = GIPITextareaComponent_1 = __decorate([
329
+ Component({
330
+ selector: 'gipi-textarea',
331
+ exportAs: 'gipiTextarea',
332
+ template: "<label class=\"textarea-label\"\n *ngIf=\"label\"\n [attr.for]=\"id\">\n {{ label }}\n <span *ngIf=\"required\"> * </span>\n</label>\n\n<textarea class=\"textarea-element\"\n [attr.id]=\"id\"\n [attr.name]=\"name\"\n [placeholder]=\"placeholder\"\n [cols]=\"cols\"\n [rows]=\"rows\"\n [class.resize-none]=\"resize === 'none'\"\n [class.resize-both]=\"resize === 'both'\"\n [class.resize-horizontal]=\"resize === 'horizontal'\"\n [class.resize-vertical]=\"resize === 'vertical'\"\n [style.min-height.px]=\"minHeight\"\n [style.height.px]=\"height\"\n [style.max-height.px]=\"maxHeight\"\n [minlength]=\"minlength\"\n [maxlength]=\"maxlength\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"readOnly\"\n [attr.autocomplete]=\"autocomplete\"\n [autofocus]=\"autofocus\"\n [(ngModel)]=\"value\"\n [value]=\"value\">\n </textarea>\n\n<small *ngIf=\"help\"\n class=\"textarea-help\">\n {{ help }}\n</small>",
333
+ providers: [
334
+ {
335
+ provide: NG_VALUE_ACCESSOR,
336
+ useExisting: forwardRef(function () { return GIPITextareaComponent_1; }),
337
+ multi: true
338
+ }
339
+ ],
340
+ host: {
341
+ 'class': 'gipi-textarea',
342
+ },
343
+ changeDetection: ChangeDetectionStrategy.OnPush,
344
+ styles: [":host{display:flex;flex-direction:column;gap:.8rem;font-size:1.4rem;color:#696969}:host .textarea-label{display:flex;align-items:center;gap:.4rem;color:#131313;line-height:1.6rem}:host .textarea-label>span{font-size:1.6rem;line-height:1.6rem;color:#d14014}:host .textarea-element{display:flex;font-family:inherit;font-size:inherit;color:inherit;padding:.75rem .8rem;background:#fff;border:1px solid rgba(0,0,0,.12);transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:6px;caret-color:#696969;max-height:12rem;min-height:6rem;resize:vertical;outline:0;overflow:auto}:host .textarea-element:not(:disabled):hover{border-color:#6d6f73}:host .textarea-element:not(:disabled).ng-dirty.ng-invalid:enabled:hover,:host .textarea-element:not(:disabled):invalid:enabled:hover{border-color:#e07f62}:host .textarea-element:not(:disabled):enabled:focus{outline:0;outline-offset:0;box-shadow:0 0 0 .2rem #e0e1e2;border-color:#6d6f73}:host .textarea-element:not(:disabled).ng-dirty.ng-invalid:enabled,:host .textarea-element:not(:disabled):invalid:enabled{border-color:#d14014}:host .textarea-element:not(:disabled).ng-dirty.ng-invalid:enabled:focus,:host .textarea-element:not(:disabled):invalid:enabled:focus{outline:0;outline-offset:0;box-shadow:0 0 0 .2rem #f1c4b6;border-color:#d14014}:host .textarea-element:disabled{color:#bbbdc1!important;border-color:#e0e1e2!important;background-color:#f5f5f6!important;cursor:not-allowed}:host .textarea-element.resize-none{resize:none}:host .textarea-element.resize-both{resize:both}:host .textarea-element.resize-horizontal{resize:horizontal}:host .textarea-element.resize-vertical{resize:vertical}:host .textarea-help{flex:1;font-size:1rem;font-weight:500;margin-top:-.4rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}::-webkit-input-placeholder{color:#bbbdc1}:-moz-placeholder{color:#bbbdc1}::-moz-placeholder{color:#bbbdc1}:-ms-input-placeholder{color:#bbbdc1}"]
345
+ }),
346
+ __metadata("design:paramtypes", [ElementRef,
347
+ ChangeDetectorRef])
348
+ ], GIPITextareaComponent);
349
+ return GIPITextareaComponent;
350
+ }());
351
+ export { GIPITextareaComponent };
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdpcGlzaXN0ZW1hcy9uZy1jb3JlLyIsInNvdXJjZXMiOlsic2hhcmVkL2dpcGktY29tcG9uZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFxQnJCO0lBeUpJLCtCQUNXLFVBQW1DLEVBQ2xDLGtCQUFxQztRQUR0QyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBekp6QyxVQUFLLEdBQVcsbUJBQWlCLFlBQVksRUFBSSxDQUFDO1FBRWpELE9BQUUsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRXhCLFNBQUksR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTFCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFbkIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFekIsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVsQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBRWpCLFNBQUksR0FBVyxFQUFFLENBQUM7UUFFbEIsY0FBUyxHQUFXLEdBQUcsQ0FBQztRQUV4QixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRXZCLFlBQU8sR0FBbUIsWUFBWSxDQUFDO1FBV3ZDLGVBQVUsR0FBVyxNQUFNLENBQUM7UUFZNUIsWUFBTyxHQUFXLE1BQU0sQ0FBQztRQVl6QixlQUFVLEdB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QztZQUV4QyxTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsdUJBQXFCLEVBQXJCLENBQXFCLENBQUM7b0JBQ3BELEtBQUssRUFBRSxJQUFJO2lCQUNkO2FBQ0o7WUFDRCxJQUFJLEVBQUU7Z0JBQ0YsT0FBTyxFQUFFLGVBQWU7YUFDM0I7WUFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7U0FDbEQsQ0FBQzt5Q0EySnlCLFVBQVU7WUFDRCxpQkFBaUI7T0EzSnhDLHFCQUFxQixDQXNNakM7SUFBRCw0QkFBQztDQUFBLEFBdE1ELElBc01DO1NBdE1ZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlQ3NzUGl4ZWxWYWx1ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxudHlwZSBUZXh0YXJlYVJlc2l6ZSA9ICdib3RoJyB8ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgfCAnbm9uZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2lwaS10ZXh0YXJlYScsXG4gICAgZXhwb3J0QXM6ICdnaXBpVGV4dGFyZWEnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGV4dGFyZWEuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBHSVBJVGV4dGFyZWFDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnY2xhc3MnOiAnZ2lwaS10ZXh0YXJlYScsXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBHSVBJVGV4dGFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyA9IGBnaXBpLXRleHRhcmVhLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICAgIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSB0aGlzLl9uYW1lO1xuXG4gICAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gdGhpcy5fbmFtZTtcblxuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAgIEBJbnB1dCgpIGNvbHM6IG51bWJlciA9IDIwO1xuXG4gICAgQElucHV0KCkgcm93czogbnVtYmVyID0gNDtcblxuICAgIEBJbnB1dCgpIGhlbHA6IHN0cmluZyA9ICcnO1xuXG4gICAgQElucHV0KCkgbWF4bGVuZ3RoOiBudW1iZXIgPSAyNTQ7XG5cbiAgICBASW5wdXQoKSBtaW5sZW5ndGg6IG51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIF9yZXNpemU6IFRleHRhcmVhUmVzaXplID0gJ2hvcml6b250YWwnO1xuICAgIEBJbnB1dCgpIGdldCByZXNpemUoKTogVGV4dGFyZWFSZXNpemUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzaXplO1xuICAgIH1cbiAgICBzZXQgcmVzaXplKHZhbHVlOiBUZXh0YXJlYVJlc2l6ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucmVzaXplKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUgPSAodmFsdWUudG9Mb3dlckNhc2UoKSBhcyBUZXh0YXJlYVJlc2l6ZSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9taW5IZWlnaHQ6IHN0cmluZyA9ICc2MHB4JztcbiAgICBASW5wdXQoKSBnZXQgbWluSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5IZWlnaHQ7XG4gICAgfVxuICAgIHNldCBtaW5IZWlnaHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT09ICdBVVRPJykge1xuICAgICAgICAgICAgdGhpcy5fbWluSGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWluSGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyA9ICc2MHB4JztcbiAgICBASW5wdXQoKSBnZXQgaGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuICAgIHNldCBoZWlnaHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT09ICdBVVRPJykge1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9tYXhIZWlnaHQ6IHN0cmluZyA9ICdhdXRvJztcbiAgICBASW5wdXQoKSBnZXQgbWF4SGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhIZWlnaHQ7XG4gICAgfVxuICAgIHNldCBtYXhIZWlnaHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT09ICdBVVRPJykge1xuICAgICAgICAgICAgdGhpcy5fbWF4SGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWF4SGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hdXRvY29tcGxldGU6ICdvbicgfCAnb2ZmJyA9ICdvZmYnO1xuICAgIEBJbnB1dCgpIGdldCBhdXRvY29tcGxldGUoKTogJ29uJyB8ICdvZmYnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZTtcbiAgICB9XG4gICAgc2V0IGF1dG9jb21wbGV0ZSh2YWx1ZTogJ29uJyB8ICdvZmYnKSB7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2F1dG9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGdldCBhdXRvZm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvZm9jdXM7XG4gICAgfVxuICAgIHNldCBhdXRvZm9jdXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fYXV0b2ZvY3VzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRPbmx5O1xuICAgIH1cbiAgICBzZXQgcmVhZE9ubHkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcmVhZE9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gICAgfVxuICAgIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9sb3dlckNhc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBnZXQgbG93ZXJDYXNlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG93ZXJDYXNlO1xuICAgIH1cbiAgICBzZXQgbG93ZXJDYXNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBwZXJDYXNlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgZ2V0IHVwcGVyQ2FzZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwcGVyQ2FzZTtcbiAgICB9XG4gICAgc2V0IHVwcGVyQ2FzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl91cHBlckNhc2UgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NwYWNlRHJvcDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGdldCBzcGFjZURyb3AoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGFjZURyb3A7XG4gICAgfVxuICAgIHNldCBzcGFjZURyb3AodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc3BhY2VEcm9wID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWx1ZSE6IGFueTtcbiAgICBASW5wdXQoKVxuICAgIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGxldCB2YWx1ZUF1eDogYW55ID0gdmFsdWU7XG4gICAgICAgIHZhbHVlQXV4ID0gdGhpcy5fY2hlY2tTcGFjZURyb3AodmFsdWVBdXgpO1xuICAgICAgICB2YWx1ZUF1eCA9IHRoaXMuX2NoZWNrTG93ZXJjYXNlKHZhbHVlQXV4KTtcbiAgICAgICAgdmFsdWVBdXggPSB0aGlzLl9jaGVja1VwcGVyY2FzZSh2YWx1ZUF1eCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVBdXg7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7IH07XG5cbiAgICBvblRvdWNoZWQ6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHsgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrU3BhY2VEcm9wKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5zcGFjZURyb3AgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja1VwcGVyY2FzZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMudXBwZXJDYXNlICYmIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tMb3dlcmNhc2UodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLmxvd2VyQ2FzZSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxufVxuIl19