@up_si_vale/sivale-componentes-angular 1.0.0 → 1.0.2

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/esm2022/lib/atoms/button/button.component.mjs +55 -0
  2. package/esm2022/lib/atoms/checkbox/checkbox.component.mjs +174 -0
  3. package/esm2022/lib/atoms/date-picker/date-picker.component.mjs +835 -0
  4. package/esm2022/lib/atoms/input/input.component.mjs +218 -0
  5. package/esm2022/lib/atoms/loader/loader.component.mjs +81 -0
  6. package/esm2022/lib/atoms/radio/radio.component.mjs +142 -0
  7. package/esm2022/lib/atoms/textarea/textarea.component.mjs +126 -0
  8. package/esm2022/lib/directives/asset-source.directive.mjs +68 -0
  9. package/esm2022/lib/directives/icon-source.directive.mjs +65 -0
  10. package/esm2022/lib/directives/no-leading-space.directive.mjs +24 -0
  11. package/esm2022/lib/directives/only-letters.directive.mjs +25 -0
  12. package/esm2022/lib/directives/only-number.directive.mjs +21 -0
  13. package/esm2022/lib/directives/rfc.directive.mjs +67 -0
  14. package/esm2022/lib/directives/tooltip.directive.mjs +199 -0
  15. package/esm2022/lib/models/snackbar.models.mjs +2 -0
  16. package/esm2022/lib/molecules/alert/alert.component.mjs +79 -0
  17. package/esm2022/lib/molecules/copy-input/copy-input.component.mjs +46 -0
  18. package/esm2022/lib/molecules/multiselect/multiselect.component.mjs +466 -0
  19. package/esm2022/lib/molecules/option/option.component.mjs +55 -0
  20. package/esm2022/lib/molecules/phone-input/phone-input.component.mjs +64 -0
  21. package/esm2022/lib/molecules/select/select.component.mjs +498 -0
  22. package/esm2022/lib/molecules/snackbar/snackbar.component.mjs +581 -0
  23. package/esm2022/lib/organisms/sidebar/sidebar-icon.component.mjs +91 -0
  24. package/esm2022/lib/organisms/sidebar/sidebar.component.mjs +115 -0
  25. package/esm2022/lib/services/snackbar.service.mjs +96 -0
  26. package/esm2022/lib/tokens/asset-base-url.token.mjs +10 -0
  27. package/esm2022/public-api.mjs +37 -0
  28. package/esm2022/up_si_vale-sivale-componentes-angular.mjs +5 -0
  29. package/fesm2022/up_si_vale-sivale-componentes-angular.mjs +4116 -0
  30. package/fesm2022/up_si_vale-sivale-componentes-angular.mjs.map +1 -0
  31. package/index.d.ts +5 -0
  32. package/lib/atoms/button/button.component.d.ts +20 -0
  33. package/lib/atoms/checkbox/checkbox.component.d.ts +31 -0
  34. package/lib/atoms/date-picker/date-picker.component.d.ts +134 -0
  35. package/lib/atoms/input/input.component.d.ts +35 -0
  36. package/lib/atoms/loader/loader.component.d.ts +10 -0
  37. package/lib/atoms/radio/radio.component.d.ts +25 -0
  38. package/lib/atoms/textarea/textarea.component.d.ts +27 -0
  39. package/lib/directives/asset-source.directive.d.ts +19 -0
  40. package/lib/directives/icon-source.directive.d.ts +18 -0
  41. package/lib/directives/no-leading-space.directive.d.ts +6 -0
  42. package/lib/directives/only-letters.directive.d.ts +7 -0
  43. package/lib/directives/only-number.directive.d.ts +6 -0
  44. package/lib/directives/rfc.directive.d.ts +12 -0
  45. package/lib/directives/tooltip.directive.d.ts +27 -0
  46. package/{src/lib/models/snackbar.models.ts → lib/models/snackbar.models.d.ts} +8 -10
  47. package/lib/molecules/alert/alert.component.d.ts +29 -0
  48. package/lib/molecules/copy-input/copy-input.component.d.ts +14 -0
  49. package/lib/molecules/multiselect/multiselect.component.d.ts +74 -0
  50. package/lib/molecules/option/option.component.d.ts +19 -0
  51. package/lib/molecules/phone-input/phone-input.component.d.ts +12 -0
  52. package/lib/molecules/select/select.component.d.ts +88 -0
  53. package/lib/molecules/snackbar/snackbar.component.d.ts +17 -0
  54. package/lib/organisms/sidebar/sidebar-icon.component.d.ts +8 -0
  55. package/lib/organisms/sidebar/sidebar.component.d.ts +47 -0
  56. package/lib/services/snackbar.service.d.ts +40 -0
  57. package/{src/lib/tokens/asset-base-url.token.ts → lib/tokens/asset-base-url.token.d.ts} +1 -5
  58. package/package.json +39 -28
  59. package/{src/public-api.ts → public-api.d.ts} +3 -15
  60. package/ng-package.json +0 -9
  61. package/src/lib/atoms/button/button.component.html +0 -21
  62. package/src/lib/atoms/button/button.component.scss +0 -242
  63. package/src/lib/atoms/button/button.component.ts +0 -43
  64. package/src/lib/atoms/checkbox/checkbox.component.scss +0 -131
  65. package/src/lib/atoms/checkbox/checkbox.component.ts +0 -130
  66. package/src/lib/atoms/date-picker/date-picker.component.html +0 -295
  67. package/src/lib/atoms/date-picker/date-picker.component.scss +0 -1002
  68. package/src/lib/atoms/date-picker/date-picker.component.ts +0 -942
  69. package/src/lib/atoms/input/input.component.ts +0 -239
  70. package/src/lib/atoms/loader/loader.component.scss +0 -144
  71. package/src/lib/atoms/loader/loader.component.ts +0 -44
  72. package/src/lib/atoms/radio/radio.component.scss +0 -115
  73. package/src/lib/atoms/radio/radio.component.ts +0 -103
  74. package/src/lib/atoms/textarea/textarea.component.ts +0 -155
  75. package/src/lib/directives/asset-source.directive.ts +0 -64
  76. package/src/lib/directives/icon-source.directive.ts +0 -74
  77. package/src/lib/directives/no-leading-space.directive.ts +0 -18
  78. package/src/lib/directives/only-letters.directive.ts +0 -21
  79. package/src/lib/directives/only-number.directive.ts +0 -15
  80. package/src/lib/directives/rfc.directive.ts +0 -60
  81. package/src/lib/directives/tooltip.directive.ts +0 -211
  82. package/src/lib/molecules/copy-input/copy-input.component.html +0 -29
  83. package/src/lib/molecules/copy-input/copy-input.component.scss +0 -101
  84. package/src/lib/molecules/copy-input/copy-input.component.ts +0 -41
  85. package/src/lib/molecules/multiselect/multiselect.component.scss +0 -298
  86. package/src/lib/molecules/multiselect/multiselect.component.ts +0 -487
  87. package/src/lib/molecules/option/option.component.ts +0 -45
  88. package/src/lib/molecules/phone-input/phone-input.component.scss +0 -78
  89. package/src/lib/molecules/phone-input/phone-input.component.ts +0 -43
  90. package/src/lib/molecules/select/select.component.ts +0 -482
  91. package/src/lib/molecules/snackbar/snackbar.component.scss +0 -201
  92. package/src/lib/molecules/snackbar/snackbar.component.ts +0 -321
  93. package/src/lib/services/snackbar.service.ts +0 -103
  94. package/tsconfig.json +0 -31
@@ -0,0 +1,64 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { InputComponent } from '../../atoms/input/input.component';
4
+ import { SelectComponent } from '../select/select.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class PhoneInputComponent {
8
+ label = 'Teléfono';
9
+ hasError = false;
10
+ errorMessage = '';
11
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PhoneInputComponent, isStandalone: true, selector: "app-phone-input", inputs: { label: "label", hasError: "hasError", errorMessage: "errorMessage" }, ngImport: i0, template: `
13
+ <div class="svu-phone-input" [class.svu-phone-input--error]="hasError">
14
+ <label *ngIf="label" class="svu-phone-input__label">
15
+ {{ label }}
16
+ </label>
17
+
18
+ <div class="svu-phone-input__field">
19
+ <div class="svu-phone-input__country">
20
+ <ng-content select="[countrySelect]"></ng-content>
21
+ </div>
22
+
23
+ <div class="svu-phone-input__number">
24
+ <ng-content select="[phoneInput]"></ng-content>
25
+ </div>
26
+ </div>
27
+
28
+ <span *ngIf="hasError && errorMessage" class="svu-phone-input__error">
29
+ {{ errorMessage }}
30
+ </span>
31
+ </div>
32
+ `, isInline: true, styles: [".svu-phone-input{display:flex;flex-direction:column;width:100%;margin-bottom:6px;padding:0 4px}.svu-phone-input__label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.svu-phone-input__field{position:relative;display:flex;align-items:stretch;min-height:44px;height:44px;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;transition:all .2s ease;background:#fff}.svu-phone-input__field:hover{border-color:#fbd399}.svu-phone-input__field:focus-within{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.svu-phone-input__country{flex:0;width:120px;display:flex;align-items:stretch;min-width:64px}.svu-phone-input__number{flex:1;min-width:0;display:flex;align-items:stretch}.svu-phone-input.svu-phone-input--error .svu-phone-input__field{border-color:#dc3545!important}.svu-phone-input.svu-phone-input--error .svu-phone-input__field:focus-within{box-shadow:0 0 0 3px #dc35451a!important}.svu-phone-input__error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}@media (max-width: 640px){.svu-phone-input__country{width:100px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PhoneInputComponent, decorators: [{
35
+ type: Component,
36
+ args: [{ selector: 'app-phone-input', standalone: true, imports: [CommonModule, InputComponent, SelectComponent], template: `
37
+ <div class="svu-phone-input" [class.svu-phone-input--error]="hasError">
38
+ <label *ngIf="label" class="svu-phone-input__label">
39
+ {{ label }}
40
+ </label>
41
+
42
+ <div class="svu-phone-input__field">
43
+ <div class="svu-phone-input__country">
44
+ <ng-content select="[countrySelect]"></ng-content>
45
+ </div>
46
+
47
+ <div class="svu-phone-input__number">
48
+ <ng-content select="[phoneInput]"></ng-content>
49
+ </div>
50
+ </div>
51
+
52
+ <span *ngIf="hasError && errorMessage" class="svu-phone-input__error">
53
+ {{ errorMessage }}
54
+ </span>
55
+ </div>
56
+ `, styles: [".svu-phone-input{display:flex;flex-direction:column;width:100%;margin-bottom:6px;padding:0 4px}.svu-phone-input__label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.svu-phone-input__field{position:relative;display:flex;align-items:stretch;min-height:44px;height:44px;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;transition:all .2s ease;background:#fff}.svu-phone-input__field:hover{border-color:#fbd399}.svu-phone-input__field:focus-within{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.svu-phone-input__country{flex:0;width:120px;display:flex;align-items:stretch;min-width:64px}.svu-phone-input__number{flex:1;min-width:0;display:flex;align-items:stretch}.svu-phone-input.svu-phone-input--error .svu-phone-input__field{border-color:#dc3545!important}.svu-phone-input.svu-phone-input--error .svu-phone-input__field:focus-within{box-shadow:0 0 0 3px #dc35451a!important}.svu-phone-input__error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}@media (max-width: 640px){.svu-phone-input__country{width:100px}}\n"] }]
57
+ }], propDecorators: { label: [{
58
+ type: Input
59
+ }], hasError: [{
60
+ type: Input
61
+ }], errorMessage: [{
62
+ type: Input
63
+ }] } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2xlY3VsZXMvcGhvbmUtaW5wdXQvcGhvbmUtaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBa0MzRSxNQUFNLE9BQU8sbUJBQW1CO0lBQ3JCLEtBQUssR0FBVyxVQUFVLENBQUM7SUFDM0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixZQUFZLEdBQVcsRUFBRSxDQUFDO3dHQUh4QixtQkFBbUI7NEZBQW5CLG1CQUFtQiwySkF2QnBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVCxvdENBckJTLFlBQVk7OzRGQXdCWCxtQkFBbUI7a0JBM0IvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLFlBQzlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVDs4QkFJUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvaW5wdXQvaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFNlbGVjdENvbXBvbmVudCwgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBob25lVmFsdWUge1xuICBjb3VudHJ5Q29kZTogc3RyaW5nO1xuICBudW1iZXI6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXBob25lLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW5wdXRDb21wb25lbnQsIFNlbGVjdENvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInN2dS1waG9uZS1pbnB1dFwiIFtjbGFzcy5zdnUtcGhvbmUtaW5wdXQtLWVycm9yXT1cImhhc0Vycm9yXCI+XG4gICAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwic3Z1LXBob25lLWlucHV0X19sYWJlbFwiPlxuICAgICAgICB7eyBsYWJlbCB9fVxuICAgICAgPC9sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzcz1cInN2dS1waG9uZS1pbnB1dF9fZmllbGRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN2dS1waG9uZS1pbnB1dF9fY291bnRyeVwiPlxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjb3VudHJ5U2VsZWN0XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN2dS1waG9uZS1pbnB1dF9fbnVtYmVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3Bob25lSW5wdXRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8c3BhbiAqbmdJZj1cImhhc0Vycm9yICYmIGVycm9yTWVzc2FnZVwiIGNsYXNzPVwic3Z1LXBob25lLWlucHV0X19lcnJvclwiPlxuICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vcGhvbmUtaW5wdXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQaG9uZUlucHV0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdUZWzDqWZvbm8nO1xuICBASW5wdXQoKSBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICcnO1xufVxuXG4iXX0=
@@ -0,0 +1,498 @@
1
+ import { Component, Input, forwardRef, ViewChild, ElementRef, HostListener, ContentChildren, ContentChild, RendererStyleFlags2 } from '@angular/core';
2
+ import { CommonModule, DOCUMENT } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';
4
+ import { Inject } from '@angular/core';
5
+ import { OptionComponent } from '../option/option.component';
6
+ // Directive markers for prefix/suffix
7
+ import { Directive } from '@angular/core';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ export class SelectPrefixDirective {
11
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectPrefixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SelectPrefixDirective, isStandalone: true, selector: "[prefix]", ngImport: i0 });
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectPrefixDirective, decorators: [{
15
+ type: Directive,
16
+ args: [{
17
+ selector: '[prefix]',
18
+ standalone: true
19
+ }]
20
+ }] });
21
+ export class SelectSuffixDirective {
22
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSuffixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
23
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SelectSuffixDirective, isStandalone: true, selector: "[suffix]", ngImport: i0 });
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSuffixDirective, decorators: [{
26
+ type: Directive,
27
+ args: [{
28
+ selector: '[suffix]',
29
+ standalone: true
30
+ }]
31
+ }] });
32
+ export class SelectComponent {
33
+ renderer;
34
+ document;
35
+ label = '';
36
+ id = '';
37
+ placeholder = '';
38
+ options = [];
39
+ hasError = false;
40
+ errorMessage = '';
41
+ disabled = false;
42
+ unstyled = false;
43
+ displayKey = 'label'; // Property to display as label
44
+ valueKey = 'value'; // Property to use as value
45
+ customClass = ''; // Custom CSS class for styling
46
+ trigger;
47
+ contentOptions;
48
+ prefixDirective;
49
+ suffixDirective;
50
+ get hasPrefix() {
51
+ return !!this.prefixDirective;
52
+ }
53
+ get hasSuffix() {
54
+ return !!this.suffixDirective;
55
+ }
56
+ value = '';
57
+ isOpen = false;
58
+ onChange = () => { };
59
+ onTouched = () => { };
60
+ _usingContentOptions = false;
61
+ dropdownElement = null;
62
+ backdropElement = null;
63
+ scrollHandler = null;
64
+ resizeHandler = null;
65
+ constructor(renderer, document) {
66
+ this.renderer = renderer;
67
+ this.document = document;
68
+ }
69
+ ngAfterContentInit() {
70
+ // Determine if using content projection or input options
71
+ this._usingContentOptions = this.contentOptions && this.contentOptions.length > 0;
72
+ // Subscribe to changes in content options
73
+ if (this.contentOptions) {
74
+ this.contentOptions.changes.subscribe(() => {
75
+ this._usingContentOptions = this.contentOptions.length > 0;
76
+ });
77
+ }
78
+ }
79
+ ngOnDestroy() {
80
+ this.destroyDropdown();
81
+ }
82
+ onEsc() {
83
+ this.closeDropdown();
84
+ this.onTouched();
85
+ }
86
+ handleBlur() {
87
+ this.onTouched();
88
+ }
89
+ /**
90
+ * Get all options (from content or input)
91
+ */
92
+ getAllOptions() {
93
+ if (this._usingContentOptions && this.contentOptions) {
94
+ return this.contentOptions.toArray();
95
+ }
96
+ return this.options || [];
97
+ }
98
+ /**
99
+ * Get display label from option
100
+ */
101
+ getOptionLabel(option) {
102
+ if (option instanceof OptionComponent) {
103
+ return option.viewValue;
104
+ }
105
+ return option?.[this.displayKey] || '';
106
+ }
107
+ /**
108
+ * Get value from option
109
+ */
110
+ getOptionValue(option) {
111
+ if (option instanceof OptionComponent) {
112
+ return option.value;
113
+ }
114
+ return option?.[this.valueKey];
115
+ }
116
+ /**
117
+ * Check if option is disabled
118
+ */
119
+ isOptionDisabled(option) {
120
+ if (option instanceof OptionComponent) {
121
+ return option.disabled;
122
+ }
123
+ return option?.disabled || false;
124
+ }
125
+ onDocumentClick(event) {
126
+ // Close dropdown if click is outside
127
+ if (this.isOpen && this.dropdownElement && !this.dropdownElement.contains(event.target)) {
128
+ const triggerElement = this.trigger?.nativeElement;
129
+ if (triggerElement && !triggerElement.contains(event.target)) {
130
+ this.closeDropdown();
131
+ }
132
+ }
133
+ }
134
+ toggleDropdown(event) {
135
+ event.stopPropagation();
136
+ if (this.disabled)
137
+ return;
138
+ if (this.isOpen) {
139
+ this.closeDropdown();
140
+ }
141
+ else {
142
+ this.openDropdown();
143
+ }
144
+ }
145
+ openDropdown() {
146
+ if (!this.trigger)
147
+ return;
148
+ // Create backdrop
149
+ this.backdropElement = this.renderer.createElement('div');
150
+ this.renderer.addClass(this.backdropElement, 'select-custom-backdrop');
151
+ this.renderer.listen(this.backdropElement, 'click', () => this.closeDropdown());
152
+ this.renderer.appendChild(this.document.body, this.backdropElement);
153
+ // Create dropdown
154
+ this.dropdownElement = this.renderer.createElement('div');
155
+ this.renderer.addClass(this.dropdownElement, 'select-custom-dropdown');
156
+ this.renderer.addClass(this.dropdownElement, 'select-overlay-pane');
157
+ // Calculate position
158
+ const position = this.calculatePosition();
159
+ // Apply positioning styles
160
+ this.renderer.setStyle(this.dropdownElement, 'position', 'fixed');
161
+ this.renderer.setStyle(this.dropdownElement, 'left', position.left);
162
+ this.renderer.setStyle(this.dropdownElement, 'width', position.width);
163
+ this.renderer.setStyle(this.dropdownElement, 'max-height', position.maxHeight);
164
+ this.renderer.setStyle(this.dropdownElement, 'z-index', '100000', RendererStyleFlags2.Important);
165
+ if (position.top) {
166
+ this.renderer.setStyle(this.dropdownElement, 'top', position.top);
167
+ }
168
+ else if (position.bottom) {
169
+ this.renderer.setStyle(this.dropdownElement, 'bottom', position.bottom);
170
+ }
171
+ // Create dropdown content wrapper
172
+ const dropdownContent = this.renderer.createElement('div');
173
+ this.renderer.addClass(dropdownContent, 'select-dropdown');
174
+ // Add options
175
+ const allOptions = this.getAllOptions();
176
+ allOptions.forEach(option => {
177
+ const optionElement = this.createOptionElement(option);
178
+ this.renderer.appendChild(dropdownContent, optionElement);
179
+ });
180
+ this.renderer.appendChild(this.dropdownElement, dropdownContent);
181
+ this.renderer.appendChild(this.document.body, this.dropdownElement);
182
+ this.isOpen = true;
183
+ // Add scroll and resize listeners to reposition dropdown
184
+ this.addRepositionListeners();
185
+ // Trigger animation
186
+ setTimeout(() => {
187
+ if (this.dropdownElement) {
188
+ this.renderer.addClass(this.dropdownElement, 'select-dropdown-open');
189
+ }
190
+ }, 10);
191
+ }
192
+ calculatePosition() {
193
+ const triggerElement = this.trigger.nativeElement;
194
+ const rect = triggerElement.getBoundingClientRect();
195
+ const spaceBelow = window.innerHeight - rect.bottom;
196
+ const spaceAbove = rect.top;
197
+ const dropdownMaxHeight = 300;
198
+ const offsetY = 4;
199
+ const shouldOpenAbove = spaceBelow < 200 && spaceAbove > spaceBelow;
200
+ const position = {
201
+ left: `${rect.left}px`,
202
+ width: `${rect.width}px`,
203
+ maxHeight: `${dropdownMaxHeight}px`
204
+ };
205
+ if (shouldOpenAbove) {
206
+ position.bottom = `${window.innerHeight - rect.top + offsetY}px`;
207
+ }
208
+ else {
209
+ position.top = `${rect.bottom + offsetY}px`;
210
+ }
211
+ return position;
212
+ }
213
+ addRepositionListeners() {
214
+ // Create handlers
215
+ const scrollHandler = () => this.updateDropdownPosition();
216
+ const resizeHandler = () => this.updateDropdownPosition();
217
+ // Add scroll listener to window with capture phase to catch all scroll events
218
+ window.addEventListener('scroll', scrollHandler, true);
219
+ this.scrollHandler = () => window.removeEventListener('scroll', scrollHandler, true);
220
+ // Add resize listener
221
+ window.addEventListener('resize', resizeHandler);
222
+ this.resizeHandler = () => window.removeEventListener('resize', resizeHandler);
223
+ }
224
+ updateDropdownPosition() {
225
+ if (!this.dropdownElement || !this.trigger)
226
+ return;
227
+ const position = this.calculatePosition();
228
+ // Update position styles
229
+ this.renderer.setStyle(this.dropdownElement, 'left', position.left);
230
+ this.renderer.setStyle(this.dropdownElement, 'width', position.width);
231
+ // Remove old top/bottom styles
232
+ this.renderer.removeStyle(this.dropdownElement, 'top');
233
+ this.renderer.removeStyle(this.dropdownElement, 'bottom');
234
+ // Apply new top/bottom position
235
+ if (position.top) {
236
+ this.renderer.setStyle(this.dropdownElement, 'top', position.top);
237
+ }
238
+ else if (position.bottom) {
239
+ this.renderer.setStyle(this.dropdownElement, 'bottom', position.bottom);
240
+ }
241
+ }
242
+ createOptionElement(option) {
243
+ const optionElement = this.renderer.createElement('div');
244
+ this.renderer.addClass(optionElement, 'select-option');
245
+ const optionValue = this.getOptionValue(option);
246
+ const optionLabel = this.getOptionLabel(option);
247
+ const optionDisabled = this.isOptionDisabled(option);
248
+ if (this.isEmptyValue(optionValue)) {
249
+ this.renderer.addClass(optionElement, 'select-option-placeholder');
250
+ }
251
+ if (this.isSelected(optionValue)) {
252
+ this.renderer.addClass(optionElement, 'selected');
253
+ }
254
+ if (optionDisabled) {
255
+ this.renderer.addClass(optionElement, 'disabled');
256
+ }
257
+ // Option text
258
+ const textSpan = this.renderer.createElement('span');
259
+ this.renderer.addClass(textSpan, 'option-text');
260
+ const text = this.renderer.createText(optionLabel);
261
+ this.renderer.appendChild(textSpan, text);
262
+ this.renderer.appendChild(optionElement, textSpan);
263
+ // Check icon for selected option
264
+ if (this.isSelected(optionValue)) {
265
+ const svg = this.createCheckIcon();
266
+ this.renderer.appendChild(optionElement, svg);
267
+ }
268
+ // Click handler
269
+ if (!optionDisabled) {
270
+ this.renderer.listen(optionElement, 'click', (event) => {
271
+ event.stopPropagation();
272
+ this.selectOption(option);
273
+ });
274
+ }
275
+ return optionElement;
276
+ }
277
+ createCheckIcon() {
278
+ const svg = this.renderer.createElement('svg', 'svg');
279
+ this.renderer.addClass(svg, 'check-icon');
280
+ this.renderer.setAttribute(svg, 'width', '14');
281
+ this.renderer.setAttribute(svg, 'height', '10');
282
+ this.renderer.setAttribute(svg, 'viewBox', '0 0 10 8');
283
+ this.renderer.setAttribute(svg, 'fill', 'none');
284
+ this.renderer.setAttribute(svg, 'xmlns', 'http://www.w3.org/2000/svg');
285
+ const path = this.renderer.createElement('path', 'svg');
286
+ this.renderer.setAttribute(path, 'd', 'M9 1L3.5 6.5L1 4');
287
+ this.renderer.setAttribute(path, 'stroke', '#F59100');
288
+ this.renderer.setAttribute(path, 'stroke-width', '1.6666');
289
+ this.renderer.setAttribute(path, 'stroke-linecap', 'round');
290
+ this.renderer.setAttribute(path, 'stroke-linejoin', 'round');
291
+ this.renderer.appendChild(svg, path);
292
+ return svg;
293
+ }
294
+ closeDropdown() {
295
+ this.destroyDropdown();
296
+ this.isOpen = false;
297
+ }
298
+ destroyDropdown() {
299
+ // Remove listeners
300
+ if (this.scrollHandler) {
301
+ this.scrollHandler();
302
+ this.scrollHandler = null;
303
+ }
304
+ if (this.resizeHandler) {
305
+ this.resizeHandler();
306
+ this.resizeHandler = null;
307
+ }
308
+ if (this.dropdownElement) {
309
+ this.renderer.removeChild(this.document.body, this.dropdownElement);
310
+ this.dropdownElement = null;
311
+ }
312
+ if (this.backdropElement) {
313
+ this.renderer.removeChild(this.document.body, this.backdropElement);
314
+ this.backdropElement = null;
315
+ }
316
+ }
317
+ selectOption(option) {
318
+ if (this.isOptionDisabled(option))
319
+ return;
320
+ this.value = this.getOptionValue(option);
321
+ this.onChange(this.value);
322
+ this.onTouched();
323
+ this.closeDropdown();
324
+ }
325
+ isSelected(value) {
326
+ return this.value === value;
327
+ }
328
+ isEmptyValue(value) {
329
+ return value === '' || value === null || value === undefined;
330
+ }
331
+ getSelectedLabel() {
332
+ const allOptions = this.getAllOptions();
333
+ const selectedOption = allOptions.find(opt => this.getOptionValue(opt) === this.value);
334
+ return selectedOption ? this.getOptionLabel(selectedOption) : '';
335
+ }
336
+ writeValue(value) {
337
+ this.value = value || '';
338
+ }
339
+ registerOnChange(fn) {
340
+ this.onChange = fn;
341
+ }
342
+ registerOnTouched(fn) {
343
+ this.onTouched = fn;
344
+ }
345
+ setDisabledState(isDisabled) {
346
+ this.disabled = isDisabled;
347
+ }
348
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectComponent, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
349
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectComponent, isStandalone: true, selector: "app-select", inputs: { label: "label", id: "id", placeholder: "placeholder", options: "options", hasError: "hasError", errorMessage: "errorMessage", disabled: "disabled", unstyled: "unstyled", displayKey: "displayKey", valueKey: "valueKey", customClass: "customClass" }, host: { listeners: { "keydown.escape": "onEsc()", "document:click": "onDocumentClick($event)" } }, providers: [
350
+ {
351
+ provide: NG_VALUE_ACCESSOR,
352
+ useExisting: forwardRef(() => SelectComponent),
353
+ multi: true
354
+ }
355
+ ], queries: [{ propertyName: "prefixDirective", first: true, predicate: SelectPrefixDirective, descendants: true }, { propertyName: "suffixDirective", first: true, predicate: SelectSuffixDirective, descendants: true }, { propertyName: "contentOptions", predicate: OptionComponent }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }], ngImport: i0, template: `
356
+ <div class="select-wrapper" [class.select-wrapper--unstyled]="unstyled" [ngClass]="customClass">
357
+ <label *ngIf="label && !unstyled" [for]="id">{{ label }}</label>
358
+ <div class="select-container" [class.select-container--unstyled]="unstyled">
359
+ <div
360
+ #trigger
361
+ class="select-header"
362
+ [attr.tabindex]="disabled ? -1 : 0"
363
+ [class.error]="hasError && !unstyled"
364
+ [class.disabled]="disabled"
365
+ [class.open]="isOpen"
366
+ [class.select-header--unstyled]="unstyled"
367
+ [class.select-header--has-prefix]="hasPrefix"
368
+ (blur)="handleBlur()"
369
+ (click)="!disabled && toggleDropdown($event)">
370
+ <span class="select-prefix" *ngIf="hasPrefix">
371
+ <ng-content select="[prefix]"></ng-content>
372
+ </span>
373
+ <span class="select-placeholder" *ngIf="!getSelectedLabel()">
374
+ {{ placeholder }}
375
+ </span>
376
+ <span class="select-selected" *ngIf="getSelectedLabel()">
377
+ {{ getSelectedLabel() }}
378
+ </span>
379
+ <span class="select-suffix" *ngIf="hasSuffix">
380
+ <ng-content select="[suffix]"></ng-content>
381
+ </span>
382
+ <svg class="select-arrow" [class.open]="isOpen" width="12" height="8" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg">
383
+ <path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
384
+ </svg>
385
+ </div>
386
+ </div>
387
+ <div *ngIf="hasError && errorMessage && !unstyled" class="field-error">
388
+ {{ errorMessage }}
389
+ </div>
390
+
391
+ <!-- Hidden container for projected options -->
392
+ <div style="display: none;">
393
+ <ng-content></ng-content>
394
+ </div>
395
+ </div>
396
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }] });
397
+ }
398
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectComponent, decorators: [{
399
+ type: Component,
400
+ args: [{
401
+ selector: 'app-select',
402
+ standalone: true,
403
+ imports: [CommonModule, ReactiveFormsModule, FormsModule, SelectPrefixDirective, SelectSuffixDirective],
404
+ template: `
405
+ <div class="select-wrapper" [class.select-wrapper--unstyled]="unstyled" [ngClass]="customClass">
406
+ <label *ngIf="label && !unstyled" [for]="id">{{ label }}</label>
407
+ <div class="select-container" [class.select-container--unstyled]="unstyled">
408
+ <div
409
+ #trigger
410
+ class="select-header"
411
+ [attr.tabindex]="disabled ? -1 : 0"
412
+ [class.error]="hasError && !unstyled"
413
+ [class.disabled]="disabled"
414
+ [class.open]="isOpen"
415
+ [class.select-header--unstyled]="unstyled"
416
+ [class.select-header--has-prefix]="hasPrefix"
417
+ (blur)="handleBlur()"
418
+ (click)="!disabled && toggleDropdown($event)">
419
+ <span class="select-prefix" *ngIf="hasPrefix">
420
+ <ng-content select="[prefix]"></ng-content>
421
+ </span>
422
+ <span class="select-placeholder" *ngIf="!getSelectedLabel()">
423
+ {{ placeholder }}
424
+ </span>
425
+ <span class="select-selected" *ngIf="getSelectedLabel()">
426
+ {{ getSelectedLabel() }}
427
+ </span>
428
+ <span class="select-suffix" *ngIf="hasSuffix">
429
+ <ng-content select="[suffix]"></ng-content>
430
+ </span>
431
+ <svg class="select-arrow" [class.open]="isOpen" width="12" height="8" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg">
432
+ <path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
433
+ </svg>
434
+ </div>
435
+ </div>
436
+ <div *ngIf="hasError && errorMessage && !unstyled" class="field-error">
437
+ {{ errorMessage }}
438
+ </div>
439
+
440
+ <!-- Hidden container for projected options -->
441
+ <div style="display: none;">
442
+ <ng-content></ng-content>
443
+ </div>
444
+ </div>
445
+ `,
446
+ providers: [
447
+ {
448
+ provide: NG_VALUE_ACCESSOR,
449
+ useExisting: forwardRef(() => SelectComponent),
450
+ multi: true
451
+ }
452
+ ]
453
+ }]
454
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: Document, decorators: [{
455
+ type: Inject,
456
+ args: [DOCUMENT]
457
+ }] }], propDecorators: { label: [{
458
+ type: Input
459
+ }], id: [{
460
+ type: Input
461
+ }], placeholder: [{
462
+ type: Input
463
+ }], options: [{
464
+ type: Input
465
+ }], hasError: [{
466
+ type: Input
467
+ }], errorMessage: [{
468
+ type: Input
469
+ }], disabled: [{
470
+ type: Input
471
+ }], unstyled: [{
472
+ type: Input
473
+ }], displayKey: [{
474
+ type: Input
475
+ }], valueKey: [{
476
+ type: Input
477
+ }], customClass: [{
478
+ type: Input
479
+ }], trigger: [{
480
+ type: ViewChild,
481
+ args: ['trigger', { read: ElementRef }]
482
+ }], contentOptions: [{
483
+ type: ContentChildren,
484
+ args: [OptionComponent]
485
+ }], prefixDirective: [{
486
+ type: ContentChild,
487
+ args: [SelectPrefixDirective]
488
+ }], suffixDirective: [{
489
+ type: ContentChild,
490
+ args: [SelectSuffixDirective]
491
+ }], onEsc: [{
492
+ type: HostListener,
493
+ args: ['keydown.escape']
494
+ }], onDocumentClick: [{
495
+ type: HostListener,
496
+ args: ['document:click', ['$event']]
497
+ }] } });
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbW9sZWN1bGVzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFFWixlQUFlLEVBQ2YsWUFBWSxFQUdaLG1CQUFtQixFQUVwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0Qsc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU0xQyxNQUFNLE9BQU8scUJBQXFCO3dHQUFyQixxQkFBcUI7NEZBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFKakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOztBQU9ELE1BQU0sT0FBTyxxQkFBcUI7d0dBQXJCLHFCQUFxQjs0RkFBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQUpqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxVQUFVO29CQUNwQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7O0FBdUVELE1BQU0sT0FBTyxlQUFlO0lBcUNoQjtJQUNrQjtJQXJDbkIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDUixX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O3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDc0MsT0FBTztzQkFBbEQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNSLGNBQWM7c0JBQS9DLGVBQWU7dUJBQUMsZUFBZTtnQkFDSyxlQUFlO3NCQUFuRCxZQUFZO3VCQUFDLHFCQUFxQjtnQkFDRSxlQUFlO3NCQUFuRCxZQUFZO3VCQUFDLHFCQUFxQjtnQkEyQ3JDLEtBQUs7c0JBREYsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBbUQ5QixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBmb3J3YXJkUmVmLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgSG9zdExpc3RlbmVyLFxuICBSZW5kZXJlcjIsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgQ29udGVudENoaWxkLFxuICBRdWVyeUxpc3QsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczIsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5cbi8vIERpcmVjdGl2ZSBtYXJrZXJzIGZvciBwcmVmaXgvc3VmZml4XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3ByZWZpeF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdFByZWZpeERpcmVjdGl2ZSB7fVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc3VmZml4XScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0U3VmZml4RGlyZWN0aXZlIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcbiAgdmFsdWU6IGFueTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRHJvcGRvd25Qb3NpdGlvbiB7XG4gIHRvcD86IHN0cmluZztcbiAgYm90dG9tPzogc3RyaW5nO1xuICBsZWZ0OiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIG1heEhlaWdodDogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2VsZWN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUsIFNlbGVjdFByZWZpeERpcmVjdGl2ZSwgU2VsZWN0U3VmZml4RGlyZWN0aXZlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIiBbY2xhc3Muc2VsZWN0LXdyYXBwZXItLXVuc3R5bGVkXT1cInVuc3R5bGVkXCIgW25nQ2xhc3NdPVwiY3VzdG9tQ2xhc3NcIj5cbiAgICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsICYmICF1bnN0eWxlZFwiIFtmb3JdPVwiaWRcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWNvbnRhaW5lclwiIFtjbGFzcy5zZWxlY3QtY29udGFpbmVyLS11bnN0eWxlZF09XCJ1bnN0eWxlZFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgI3RyaWdnZXJcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdC1oZWFkZXJcIlxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgICAgICBbY2xhc3MuZXJyb3JdPVwiaGFzRXJyb3IgJiYgIXVuc3R5bGVkXCJcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdC1oZWFkZXItLXVuc3R5bGVkXT1cInVuc3R5bGVkXCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0LWhlYWRlci0taGFzLXByZWZpeF09XCJoYXNQcmVmaXhcIlxuICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxuICAgICAgICAgIChjbGljayk9XCIhZGlzYWJsZWQgJiYgdG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXByZWZpeFwiICpuZ0lmPVwiaGFzUHJlZml4XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtcGxhY2Vob2xkZXJcIiAqbmdJZj1cIiFnZXRTZWxlY3RlZExhYmVsKClcIj5cbiAgICAgICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXNlbGVjdGVkXCIgKm5nSWY9XCJnZXRTZWxlY3RlZExhYmVsKClcIj5cbiAgICAgICAgICAgIHt7IGdldFNlbGVjdGVkTGFiZWwoKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1zdWZmaXhcIiAqbmdJZj1cImhhc1N1ZmZpeFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3N1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZWxlY3QtYXJyb3dcIiBbY2xhc3Mub3Blbl09XCJpc09wZW5cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgMTIgOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xIDEuNUw2IDYuNUwxMSAxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaGFzRXJyb3IgJiYgZXJyb3JNZXNzYWdlICYmICF1bnN0eWxlZFwiIGNsYXNzPVwiZmllbGQtZXJyb3JcIj5cbiAgICAgICAge3sgZXJyb3JNZXNzYWdlIH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIaWRkZW4gY29udGFpbmVyIGZvciBwcm9qZWN0ZWQgb3B0aW9ucyAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIGlkID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdIHwgYW55W10gPSBbXTtcbiAgQElucHV0KCkgaGFzRXJyb3IgPSBmYWxzZTtcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlID0gJyc7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHVuc3R5bGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc3BsYXlLZXk6IHN0cmluZyA9ICdsYWJlbCc7IC8vIFByb3BlcnR5IHRvIGRpc3BsYXkgYXMgbGFiZWxcbiAgQElucHV0KCkgdmFsdWVLZXk6IHN0cmluZyA9ICd2YWx1ZSc7IC8vIFByb3BlcnR5IHRvIHVzZSBhcyB2YWx1ZVxuICBASW5wdXQoKSBjdXN0b21DbGFzczogc3RyaW5nID0gJyc7IC8vIEN1c3RvbSBDU1MgY2xhc3MgZm9yIHN0eWxpbmdcbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB0cmlnZ2VyITogRWxlbWVudFJlZjtcbiAgQENvbnRlbnRDaGlsZHJlbihPcHRpb25Db21wb25lbnQpIGNvbnRlbnRPcHRpb25zITogUXVlcnlMaXN0PE9wdGlvbkNvbXBvbmVudD47XG4gIEBDb250ZW50Q2hpbGQoU2VsZWN0UHJlZml4RGlyZWN0aXZlKSBwcmVmaXhEaXJlY3RpdmUhOiBTZWxlY3RQcmVmaXhEaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoU2VsZWN0U3VmZml4RGlyZWN0aXZlKSBzdWZmaXhEaXJlY3RpdmUhOiBTZWxlY3RTdWZmaXhEaXJlY3RpdmU7XG5cbiAgZ2V0IGhhc1ByZWZpeCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnByZWZpeERpcmVjdGl2ZTtcbiAgfVxuXG4gIGdldCBoYXNTdWZmaXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdWZmaXhEaXJlY3RpdmU7XG4gIH1cblxuICB2YWx1ZTogYW55ID0gJyc7XG4gIGlzT3BlbiA9IGZhbHNlO1xuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG4gIHByaXZhdGUgX3VzaW5nQ29udGVudE9wdGlvbnMgPSBmYWxzZTtcblxuICBwcml2YXRlIGRyb3Bkb3duRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBiYWNrZHJvcEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2Nyb2xsSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzaXplSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgLy8gRGV0ZXJtaW5lIGlmIHVzaW5nIGNvbnRlbnQgcHJvamVjdGlvbiBvciBpbnB1dCBvcHRpb25zXG4gICAgdGhpcy5fdXNpbmdDb250ZW50T3B0aW9ucyA9IHRoaXMuY29udGVudE9wdGlvbnMgJiYgdGhpcy5jb250ZW50T3B0aW9ucy5sZW5ndGggPiAwO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gY29udGVudCBvcHRpb25zXG4gICAgaWYgKHRoaXMuY29udGVudE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY29udGVudE9wdGlvbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl91c2luZ0NvbnRlbnRPcHRpb25zID0gdGhpcy5jb250ZW50T3B0aW9ucy5sZW5ndGggPiAwO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95RHJvcGRvd24oKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZXNjYXBlJylcbm9uRXNjKCkge1xuICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgdGhpcy5vblRvdWNoZWQoKTtcbn1cblxuICBoYW5kbGVCbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBvcHRpb25zIChmcm9tIGNvbnRlbnQgb3IgaW5wdXQpXG4gICAqL1xuICBwcml2YXRlIGdldEFsbE9wdGlvbnMoKTogYW55W10ge1xuICAgIGlmICh0aGlzLl91c2luZ0NvbnRlbnRPcHRpb25zICYmIHRoaXMuY29udGVudE9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRPcHRpb25zLnRvQXJyYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGlzcGxheSBsYWJlbCBmcm9tIG9wdGlvblxuICAgKi9cbiAgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBPcHRpb25Db21wb25lbnQpIHtcbiAgICAgIHJldHVybiBvcHRpb24udmlld1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uPy5bdGhpcy5kaXNwbGF5S2V5XSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmFsdWUgZnJvbSBvcHRpb25cbiAgICovXG4gIGdldE9wdGlvblZhbHVlKG9wdGlvbjogYW55KTogYW55IHtcbiAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgT3B0aW9uQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gb3B0aW9uLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uPy5bdGhpcy52YWx1ZUtleV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBpc09wdGlvbkRpc2FibGVkKG9wdGlvbjogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKG9wdGlvbiBpbnN0YW5jZW9mIE9wdGlvbkNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG9wdGlvbi5kaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbj8uZGlzYWJsZWQgfHwgZmFsc2U7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIGRyb3Bkb3duIGlmIGNsaWNrIGlzIG91dHNpZGVcbiAgICBpZiAodGhpcy5pc09wZW4gJiYgdGhpcy5kcm9wZG93bkVsZW1lbnQgJiYgIXRoaXMuZHJvcGRvd25FbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgY29uc3QgdHJpZ2dlckVsZW1lbnQgPSB0aGlzLnRyaWdnZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAodHJpZ2dlckVsZW1lbnQgJiYgIXRyaWdnZXJFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVEcm9wZG93bihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5Ecm9wZG93bigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudHJpZ2dlcikgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGJhY2tkcm9wXG4gICAgdGhpcy5iYWNrZHJvcEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5iYWNrZHJvcEVsZW1lbnQsICdzZWxlY3QtY3VzdG9tLWJhY2tkcm9wJyk7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5iYWNrZHJvcEVsZW1lbnQsICdjbGljaycsICgpID0+IHRoaXMuY2xvc2VEcm9wZG93bigpKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy5iYWNrZHJvcEVsZW1lbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGRyb3Bkb3duXG4gICAgdGhpcy5kcm9wZG93bkVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kcm9wZG93bkVsZW1lbnQsICdzZWxlY3QtY3VzdG9tLWRyb3Bkb3duJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3NlbGVjdC1vdmVybGF5LXBhbmUnKTtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuXG4gICAgLy8gQXBwbHkgcG9zaXRpb25pbmcgc3R5bGVzXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ2xlZnQnLCBwb3NpdGlvbi5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnd2lkdGgnLCBwb3NpdGlvbi53aWR0aCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ21heC1oZWlnaHQnLCBwb3NpdGlvbi5tYXhIZWlnaHQpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd6LWluZGV4JywgJzEwMDAwMCcsIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50KTtcblxuICAgIGlmIChwb3NpdGlvbi50b3ApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd0b3AnLCBwb3NpdGlvbi50b3ApO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24uYm90dG9tKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnYm90dG9tJywgcG9zaXRpb24uYm90dG9tKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZHJvcGRvd24gY29udGVudCB3cmFwcGVyXG4gICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRyb3Bkb3duQ29udGVudCwgJ3NlbGVjdC1kcm9wZG93bicpO1xuXG4gICAgLy8gQWRkIG9wdGlvbnNcbiAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5nZXRBbGxPcHRpb25zKCk7XG4gICAgYWxsT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gdGhpcy5jcmVhdGVPcHRpb25FbGVtZW50KG9wdGlvbik7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRyb3Bkb3duQ29udGVudCwgb3B0aW9uRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZHJvcGRvd25FbGVtZW50LCBkcm9wZG93bkNvbnRlbnQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLmRyb3Bkb3duRWxlbWVudCk7XG5cbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG5cbiAgICAvLyBBZGQgc2Nyb2xsIGFuZCByZXNpemUgbGlzdGVuZXJzIHRvIHJlcG9zaXRpb24gZHJvcGRvd25cbiAgICB0aGlzLmFkZFJlcG9zaXRpb25MaXN0ZW5lcnMoKTtcblxuICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kcm9wZG93bkVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3NlbGVjdC1kcm9wZG93bi1vcGVuJyk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVQb3NpdGlvbigpOiBEcm9wZG93blBvc2l0aW9uIHtcbiAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3A7XG4gICAgY29uc3QgZHJvcGRvd25NYXhIZWlnaHQgPSAzMDA7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IDQ7XG5cbiAgICBjb25zdCBzaG91bGRPcGVuQWJvdmUgPSBzcGFjZUJlbG93IDwgMjAwICYmIHNwYWNlQWJvdmUgPiBzcGFjZUJlbG93O1xuXG4gICAgY29uc3QgcG9zaXRpb246IERyb3Bkb3duUG9zaXRpb24gPSB7XG4gICAgICBsZWZ0OiBgJHtyZWN0LmxlZnR9cHhgLFxuICAgICAgd2lkdGg6IGAke3JlY3Qud2lkdGh9cHhgLFxuICAgICAgbWF4SGVpZ2h0OiBgJHtkcm9wZG93bk1heEhlaWdodH1weGBcbiAgICB9O1xuXG4gICAgaWYgKHNob3VsZE9wZW5BYm92ZSkge1xuICAgICAgcG9zaXRpb24uYm90dG9tID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgKyBvZmZzZXRZfXB4YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zaXRpb24udG9wID0gYCR7cmVjdC5ib3R0b20gKyBvZmZzZXRZfXB4YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGFkZFJlcG9zaXRpb25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGhhbmRsZXJzXG4gICAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcblxuICAgIC8vIEFkZCBzY3JvbGwgbGlzdGVuZXIgdG8gd2luZG93IHdpdGggY2FwdHVyZSBwaGFzZSB0byBjYXRjaCBhbGwgc2Nyb2xsIGV2ZW50c1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyLCB0cnVlKTtcbiAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlciwgdHJ1ZSk7XG5cbiAgICAvLyBBZGQgcmVzaXplIGxpc3RlbmVyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuICAgIHRoaXMucmVzaXplSGFuZGxlciA9ICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25FbGVtZW50IHx8ICF0aGlzLnRyaWdnZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuXG4gICAgLy8gVXBkYXRlIHBvc2l0aW9uIHN0eWxlc1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICdsZWZ0JywgcG9zaXRpb24ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3dpZHRoJywgcG9zaXRpb24ud2lkdGgpO1xuXG4gICAgLy8gUmVtb3ZlIG9sZCB0b3AvYm90dG9tIHN0eWxlc1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd0b3AnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnYm90dG9tJyk7XG5cbiAgICAvLyBBcHBseSBuZXcgdG9wL2JvdHRvbSBwb3NpdGlvblxuICAgIGlmIChwb3NpdGlvbi50b3ApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd0b3AnLCBwb3NpdGlvbi50b3ApO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24uYm90dG9tKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnYm90dG9tJywgcG9zaXRpb24uYm90dG9tKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9wdGlvbkVsZW1lbnQob3B0aW9uOiBhbnkpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhvcHRpb25FbGVtZW50LCAnc2VsZWN0LW9wdGlvbicpO1xuXG4gICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbik7XG4gICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLmdldE9wdGlvbkxhYmVsKG9wdGlvbik7XG4gICAgY29uc3Qgb3B0aW9uRGlzYWJsZWQgPSB0aGlzLmlzT3B0aW9uRGlzYWJsZWQob3B0aW9uKTtcblxuICAgIGlmICh0aGlzLmlzRW1wdHlWYWx1ZShvcHRpb25WYWx1ZSkpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Mob3B0aW9uRWxlbWVudCwgJ3NlbGVjdC1vcHRpb24tcGxhY2Vob2xkZXInKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG9wdGlvblZhbHVlKSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhvcHRpb25FbGVtZW50LCAnc2VsZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Mob3B0aW9uRWxlbWVudCwgJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uIHRleHRcbiAgICBjb25zdCB0ZXh0U3BhbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGV4dFNwYW4sICdvcHRpb24tdGV4dCcpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQob3B0aW9uTGFiZWwpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGV4dFNwYW4sIHRleHQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCwgdGV4dFNwYW4pO1xuXG4gICAgLy8gQ2hlY2sgaWNvbiBmb3Igc2VsZWN0ZWQgb3B0aW9uXG4gICAgaWYgKHRoaXMuaXNTZWxlY3RlZChvcHRpb25WYWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlQ2hlY2tJY29uKCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQsIHN2Zyk7XG4gICAgfVxuXG4gICAgLy8gQ2xpY2sgaGFuZGxlclxuICAgIGlmICghb3B0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKG9wdGlvbkVsZW1lbnQsICdjbGljaycsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKG9wdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hlY2tJY29uKCk6IFNWR0VsZW1lbnQge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3ZnJywgJ3N2ZycpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Moc3ZnLCAnY2hlY2staWNvbicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN2ZywgJ3dpZHRoJywgJzE0Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc3ZnLCAnaGVpZ2h0JywgJzEwJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc3ZnLCAndmlld0JveCcsICcwIDAgMTAgOCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN2ZywgJ2ZpbGwnLCAnbm9uZScpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN2ZywgJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdwYXRoJywgJ3N2ZycpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdkJywgJ005IDFMMy41IDYuNUwxIDQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShwYXRoLCAnc3Ryb2tlJywgJyNGNTkxMDAnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShwYXRoLCAnc3Ryb2tlLXdpZHRoJywgJzEuNjY2NicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTtcblxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3ZnLCBwYXRoKTtcbiAgICByZXR1cm4gc3ZnO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lEcm9wZG93bigpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lEcm9wZG93bigpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuc2Nyb2xsSGFuZGxlcikge1xuICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyKCk7XG4gICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlcigpO1xuICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcm9wZG93bkVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLmRyb3Bkb3duRWxlbWVudCk7XG4gICAgICB0aGlzLmRyb3Bkb3duRWxlbWVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFja2Ryb3BFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy5iYWNrZHJvcEVsZW1lbnQpO1xuICAgICAgdGhpcy5iYWNrZHJvcEVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdE9wdGlvbihvcHRpb246IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3B0aW9uRGlzYWJsZWQob3B0aW9uKSkgcmV0dXJuO1xuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdmFsdWU7XG4gIH1cblxuICBpc0VtcHR5VmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFNlbGVjdGVkTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5nZXRBbGxPcHRpb25zKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBhbGxPcHRpb25zLmZpbmQob3B0ID0+IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KSA9PT0gdGhpcy52YWx1ZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gdGhpcy5nZXRPcHRpb25MYWJlbChzZWxlY3RlZE9wdGlvbikgOiAnJztcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiJdfQ==