@vgip/meta-ui 1.1.3

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 (101) hide show
  1. package/README.md +2 -0
  2. package/bundles/vgip-meta-ui.umd.js +6323 -0
  3. package/bundles/vgip-meta-ui.umd.js.map +1 -0
  4. package/esm2015/lib/common/fieldNormalizer/boolean.js +12 -0
  5. package/esm2015/lib/common/fieldNormalizer/datetime.js +9 -0
  6. package/esm2015/lib/common/fieldNormalizer/index.js +168 -0
  7. package/esm2015/lib/common/fieldNormalizer/number.js +9 -0
  8. package/esm2015/lib/common/fieldNormalizer/options.js +50 -0
  9. package/esm2015/lib/common/fieldNormalizer/radio.js +10 -0
  10. package/esm2015/lib/common/fieldNormalizer/reference.js +36 -0
  11. package/esm2015/lib/common/fieldNormalizer/richtext.js +15 -0
  12. package/esm2015/lib/common/fieldNormalizer/string.js +24 -0
  13. package/esm2015/lib/common/fieldNormalizer/text.js +15 -0
  14. package/esm2015/lib/common/fieldNormalizer/uniqueNameFilter.js +23 -0
  15. package/esm2015/lib/common/metaAutofocus.directive.js +35 -0
  16. package/esm2015/lib/common/metaIcons.pipe.js +28 -0
  17. package/esm2015/lib/common/metaModel.pipe.js +22 -0
  18. package/esm2015/lib/common/metaNormalizer.js +311 -0
  19. package/esm2015/lib/common/metaStripHtml.pipe.js +18 -0
  20. package/esm2015/lib/common/utils/colorThemes.js +77 -0
  21. package/esm2015/lib/common/utils/indexedDbStore/index.js +218 -0
  22. package/esm2015/lib/common/utils/relativeTimeBuilder.js +51 -0
  23. package/esm2015/lib/common/utils/templateBuilder.js +92 -0
  24. package/esm2015/lib/field.js +157 -0
  25. package/esm2015/lib/fieldAbstract.js +195 -0
  26. package/esm2015/lib/fieldBoolean/index.js +50 -0
  27. package/esm2015/lib/fieldComposite/index.js +41 -0
  28. package/esm2015/lib/fieldDatetime/index.js +334 -0
  29. package/esm2015/lib/fieldInput/index.js +421 -0
  30. package/esm2015/lib/fieldList/index.js +68 -0
  31. package/esm2015/lib/fieldRadio/index.js +85 -0
  32. package/esm2015/lib/fieldReference/index.js +797 -0
  33. package/esm2015/lib/fieldRichtext/index.js +82 -0
  34. package/esm2015/lib/fieldSelect/index.js +448 -0
  35. package/esm2015/lib/fieldText/index.js +66 -0
  36. package/esm2015/lib/fieldUnknown/index.js +16 -0
  37. package/esm2015/lib/index.js +105 -0
  38. package/esm2015/lib/layout/index.js +155 -0
  39. package/esm2015/lib/refDialog/index.js +134 -0
  40. package/esm2015/lib/resource/index.js +424 -0
  41. package/esm2015/lib/resourceCard/index.js +56 -0
  42. package/esm2015/lib/services/metaContext/index.js +34 -0
  43. package/esm2015/lib/services/metaMsg/index.js +86 -0
  44. package/esm2015/lib/services/metaReference/index.js +98 -0
  45. package/esm2015/lib/services/metaResource/index.js +141 -0
  46. package/esm2015/lib/services/metaResource/metaHttpClient.js +65 -0
  47. package/esm2015/lib/services/metaTracker/index.js +30 -0
  48. package/esm2015/lib/services/resourceDrafts/index.js +70 -0
  49. package/esm2015/public-api.js +5 -0
  50. package/esm2015/vgip-meta-ui.js +5 -0
  51. package/fesm2015/vgip-meta-ui.js +5226 -0
  52. package/fesm2015/vgip-meta-ui.js.map +1 -0
  53. package/lib/common/fieldNormalizer/boolean.d.ts +1 -0
  54. package/lib/common/fieldNormalizer/datetime.d.ts +1 -0
  55. package/lib/common/fieldNormalizer/index.d.ts +1 -0
  56. package/lib/common/fieldNormalizer/number.d.ts +1 -0
  57. package/lib/common/fieldNormalizer/options.d.ts +1 -0
  58. package/lib/common/fieldNormalizer/radio.d.ts +1 -0
  59. package/lib/common/fieldNormalizer/reference.d.ts +1 -0
  60. package/lib/common/fieldNormalizer/richtext.d.ts +1 -0
  61. package/lib/common/fieldNormalizer/string.d.ts +1 -0
  62. package/lib/common/fieldNormalizer/text.d.ts +1 -0
  63. package/lib/common/fieldNormalizer/uniqueNameFilter.d.ts +1 -0
  64. package/lib/common/metaAutofocus.directive.d.ts +7 -0
  65. package/lib/common/metaIcons.pipe.d.ts +7 -0
  66. package/lib/common/metaModel.pipe.d.ts +5 -0
  67. package/lib/common/metaNormalizer.d.ts +1 -0
  68. package/lib/common/metaStripHtml.pipe.d.ts +4 -0
  69. package/lib/common/utils/colorThemes.d.ts +8 -0
  70. package/lib/common/utils/indexedDbStore/index.d.ts +24 -0
  71. package/lib/common/utils/relativeTimeBuilder.d.ts +1 -0
  72. package/lib/common/utils/templateBuilder.d.ts +1 -0
  73. package/lib/field.d.ts +22 -0
  74. package/lib/fieldAbstract.d.ts +58 -0
  75. package/lib/fieldBoolean/index.d.ts +7 -0
  76. package/lib/fieldComposite/index.d.ts +8 -0
  77. package/lib/fieldDatetime/index.d.ts +23 -0
  78. package/lib/fieldInput/index.d.ts +28 -0
  79. package/lib/fieldList/index.d.ts +10 -0
  80. package/lib/fieldRadio/index.d.ts +12 -0
  81. package/lib/fieldReference/index.d.ts +68 -0
  82. package/lib/fieldRichtext/index.d.ts +27 -0
  83. package/lib/fieldSelect/index.d.ts +38 -0
  84. package/lib/fieldText/index.d.ts +12 -0
  85. package/lib/fieldUnknown/index.d.ts +3 -0
  86. package/lib/index.d.ts +35 -0
  87. package/lib/layout/index.d.ts +35 -0
  88. package/lib/refDialog/index.d.ts +30 -0
  89. package/lib/resource/index.d.ts +54 -0
  90. package/lib/resourceCard/index.d.ts +15 -0
  91. package/lib/services/metaContext/index.d.ts +23 -0
  92. package/lib/services/metaMsg/index.d.ts +11 -0
  93. package/lib/services/metaReference/index.d.ts +11 -0
  94. package/lib/services/metaResource/index.d.ts +28 -0
  95. package/lib/services/metaResource/metaHttpClient.d.ts +12 -0
  96. package/lib/services/metaTracker/index.d.ts +16 -0
  97. package/lib/services/resourceDrafts/index.d.ts +23 -0
  98. package/package.json +23 -0
  99. package/public-api.d.ts +1 -0
  100. package/vgip-meta-ui.d.ts +4 -0
  101. package/vgip-meta-ui.metadata.json +1 -0
@@ -0,0 +1,68 @@
1
+ /*
2
+ * @Author: Alexander.Vangelov@vonage.com
3
+ * @Date: 2019-09-19 17:35:13
4
+ * @Last Modified by: Alexander.Vangelov@vonage.com
5
+ * @Last Modified time: 2020-03-25 08:42:09
6
+ */
7
+ import { Component } from '@angular/core';
8
+ import { ControlContainer, NgForm } from '@angular/forms';
9
+ import { FieldAbstract } from '../fieldAbstract';
10
+ // import { tMetaField } from '../../../metaTypes/tMetaField'
11
+ export class FieldList extends FieldAbstract {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.items = [];
15
+ }
16
+ ngOnInit() {
17
+ const origValue = this.parent[this.meta.name];
18
+ Object.defineProperty(this.parent, this.meta.name, {
19
+ set: (value) => {
20
+ this.model = [];
21
+ if (value && value.length) {
22
+ for (const i of value) {
23
+ if (this.model.indexOf(i) === -1) {
24
+ this.model.push(i);
25
+ }
26
+ }
27
+ }
28
+ this.value = this.model;
29
+ this.meta.$optional = this.isOptional;
30
+ },
31
+ get: () => this.value,
32
+ enumerable: true,
33
+ configurable: true
34
+ });
35
+ if (origValue) {
36
+ this.parent[this.meta.name] = origValue;
37
+ }
38
+ if (!this.model && this.validations.min) {
39
+ for (let i = 0; i < this.validations.min; i++) {
40
+ this.add();
41
+ }
42
+ }
43
+ }
44
+ get list() {
45
+ return this.meta.list || this.meta.reference;
46
+ }
47
+ add() {
48
+ if (!this.model) {
49
+ this.model = [];
50
+ }
51
+ if (!this.validations.max || (this.validations.max > this.model.length)) {
52
+ this.model.push({});
53
+ this.value = this.model;
54
+ }
55
+ }
56
+ remove(itemIndex) {
57
+ this.model.splice(itemIndex, 1);
58
+ this.value = this.model;
59
+ }
60
+ }
61
+ FieldList.decorators = [
62
+ { type: Component, args: [{
63
+ template: "<div class=\"Vlt-form__element\" [ngClass]=\"{ 'Vlt-form__element--error': (f | metaModel)._parent.submitted && f.invalid }\">\n <label class=\"Vlt-label\">{{meta.label}} ({{(model || []).length}})<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n <small style='margin-bottom: 4px;' *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <ng-container *ngIf='model'>\n <div *ngFor='let item of model; let i = index;' style='display: flex; border-bottom: 1px solid var(--vgip-meta-separator-color);'>\n <vgip-meta-field style='flex: 1;' [index]='i' [meta]='list' [parent]='item' [integrationCode]='integrationCode' theme='inherit'></vgip-meta-field>\n <div style='padding-left: 12px; margin-top: 3px;'>\n <button type='button' (click)='remove(i)' class=\"Vlt-btn Vlt-btn--link\" [disabled]='model.length === (validations.min || 0)' style='border: 0;' aria-label='Remove'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-bin\"/></svg>\n </button>\n </div>\n </div>\n </ng-container>\n <button style='width: 100%;' type='button' (click)='add()' class=\"Vlt-btn Vlt-btn--small Vlt-btn--tertiary Vlt-btn--app item-add-button\" [disabled]='validations.max && model && model.length === validations.max'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>{{list.label}}\n </button>\n <small *ngIf='(f | metaModel)._parent.submitted && f.invalid' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.maxlength\">Length can not exceed {{validations.maxlength}} characters</span>\n </small>\n <small *ngIf='meta.helpText' class=\"Vlt-form__element__hint\">{{meta.helpText}}</small>\n</div>",
64
+ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
65
+ styles: [".Vlt-btn--link:not([disabled]) svg{fill:#e84545}.Vlt-btn--link:not([disabled]):hover svg{fill:#de1c1c}.item-add-button{background-color:var(--vgip-meta-input-action-hover-bg-color);color:var(--vgip-meta-input-color)}.item-add-button svg{fill:var(--vgip-meta-input-color)}.item-add-button:hover{transform:scale(1.02)}"]
66
+ },] }
67
+ ];
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRMaXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCw2REFBNkQ7QUFPN0QsTUFBTSxPQUFPLFNBQVUsU0FBUSxhQUFhO0lBTDVDOztRQU1FLFVBQUssR0FBZSxFQUFFLENBQUM7SUFrRHpCLENBQUM7SUEvQ0MsUUFBUTtRQUNOLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakQsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ3pCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFO3dCQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDcEI7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3hDLENBQUM7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDckIsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDWjtTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDL0MsQ0FBQztJQUVELEdBQUc7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVM7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7OztZQXZERixTQUFTLFNBQUM7Z0JBQ1QsODJEQUEwQjtnQkFFMUIsYUFBYSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzthQUNwRSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAQXV0aG9yOiBBbGV4YW5kZXIuVmFuZ2Vsb3ZAdm9uYWdlLmNvbSBcbiAqIEBEYXRlOiAyMDE5LTA5LTE5IDE3OjM1OjEzIFxuICogQExhc3QgTW9kaWZpZWQgYnk6IEFsZXhhbmRlci5WYW5nZWxvdkB2b25hZ2UuY29tXG4gKiBATGFzdCBNb2RpZmllZCB0aW1lOiAyMDIwLTAzLTI1IDA4OjQyOjA5XG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEZpZWxkQWJzdHJhY3QgfSBmcm9tICcuLi9maWVsZEFic3RyYWN0JztcbmltcG9ydCB7IG1pbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbi8vIGltcG9ydCB7IHRNZXRhRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tZXRhVHlwZXMvdE1ldGFGaWVsZCdcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ10sXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgRmllbGRMaXN0IGV4dGVuZHMgRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGl0ZW1zOiBBcnJheTxhbnk+ID0gW107XG4gIHZhbHVlOiBhbnk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgb3JpZ1ZhbHVlID0gdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnBhcmVudCwgdGhpcy5tZXRhLm5hbWUsIHtcbiAgICAgIHNldDogKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgaSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tb2RlbDtcbiAgICAgICAgdGhpcy5tZXRhLiRvcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbDtcbiAgICAgIH0sXG4gICAgICBnZXQ6ICgpID0+IHRoaXMudmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKG9yaWdWYWx1ZSkge1xuICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdID0gb3JpZ1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubW9kZWwgJiYgdGhpcy52YWxpZGF0aW9ucy5taW4pIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWxpZGF0aW9ucy5taW47IGkrKykge1xuICAgICAgICB0aGlzLmFkZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLm1ldGEubGlzdCB8fCB0aGlzLm1ldGEucmVmZXJlbmNlO1xuICB9XG5cbiAgYWRkKCkge1xuICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmFsaWRhdGlvbnMubWF4IHx8ICh0aGlzLnZhbGlkYXRpb25zLm1heCA+IHRoaXMubW9kZWwubGVuZ3RoKSkge1xuICAgICAgdGhpcy5tb2RlbC5wdXNoKHt9KTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1vZGVsO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZShpdGVtSW5kZXgpIHtcbiAgICB0aGlzLm1vZGVsLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLm1vZGVsO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,85 @@
1
+ /*
2
+ * @Author: Alexander.Vangelov@vonage.com
3
+ * @Date: 2019-09-19 17:35:19
4
+ * @Last Modified by: Alexander.Vangelov@vonage.com
5
+ * @Last Modified time: 2020-03-26 12:56:38
6
+ */
7
+ import { Component, Input } from '@angular/core';
8
+ import { ControlContainer, NgForm } from '@angular/forms';
9
+ import { FieldAbstract } from '../fieldAbstract';
10
+ export class FieldRadio extends FieldAbstract {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.keydown = (event) => {
14
+ switch (event.key) {
15
+ case 'Backspace': {
16
+ event.preventDefault();
17
+ event.stopPropagation();
18
+ this.clear();
19
+ break;
20
+ }
21
+ }
22
+ };
23
+ }
24
+ ngOnInit() {
25
+ this.validationAttributes = ['required'];
26
+ const origValue = this.parent[this.meta.name];
27
+ Object.defineProperty(this.parent, this.meta.name, {
28
+ set: (value) => {
29
+ if (value) {
30
+ for (const o of this.options) {
31
+ if ((value.id || value) === (o.id || o.value || o.name || o)) {
32
+ this.model = o;
33
+ this.value = this.modelToValue(o, this.meta.valueType);
34
+ break;
35
+ }
36
+ }
37
+ }
38
+ else {
39
+ delete this.model;
40
+ delete this.value;
41
+ }
42
+ this.meta.$optional = this.isOptional;
43
+ },
44
+ get: () => this.value,
45
+ enumerable: this.sendToServer,
46
+ configurable: true
47
+ });
48
+ if (origValue) {
49
+ this.parent[this.meta.name] = origValue;
50
+ }
51
+ if (this.default && !this.model) {
52
+ setTimeout(() => {
53
+ this.parent[this.meta.name] = this.meta.valueType === 'object' ? this.default : (this.default.id || this.default);
54
+ }, 0);
55
+ }
56
+ }
57
+ onOptionChange(model) {
58
+ this.model = model;
59
+ this.onModelChange(this.model);
60
+ }
61
+ onActivated(ev) {
62
+ if (!this.keyListenerActive) {
63
+ ev.srcElement.addEventListener('keydown', this.keydown);
64
+ }
65
+ }
66
+ onBlur(ev) {
67
+ if (this.keyListenerActive) {
68
+ ev.srcElement.removeEventListener('keydown', this.keydown);
69
+ }
70
+ }
71
+ get options() {
72
+ return this.meta.options || this.meta.picklist;
73
+ }
74
+ }
75
+ FieldRadio.decorators = [
76
+ { type: Component, args: [{
77
+ template: "<div class=\"Vlt-form__element\" [ngClass]=\"{ 'Vlt-form__element--error': f && f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched) }\">\n\t<label class=\"Vlt-label\">{{meta.label}}<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n\t<input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n\t<fieldset *ngFor='let option of options' class=\"Vlt-radio Vlt-radio--inline\">\n\t\t<label style='cursor: pointer;'>\n\t\t\t<span class=\"Vlt-radio__button\">\n <input class='main' (change)='onOptionChange(option)' type=\"radio\" [checked]='option === model' [value]='option' [name]='name' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <span class=\"Vlt-radio__icon\"></span>\n </span>\n\t\t\t<span style='white-space: nowrap;'>{{option.label || option}}</span>\n\t\t</label>\n\t</fieldset>\n\t<small *ngIf='f && f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched)' class=\"Vlt-form__element__error\">\n\t\t<span *ngIf=\"f.errors.required\">Required.&nbsp;</span>\n\t</small>\n\t<small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>",
78
+ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
79
+ styles: [".Vlt-form__element{padding-bottom:4px}.Vlt-form__element__error,.Vlt-form__element__hint{margin-top:4px}.Vlt-radio--inline{margin-bottom:4px}.Vlt-radio .Vlt-radio__icon{border-color:var(--vgip-meta-input-border-color)}.Vlt-radio:hover .Vlt-radio__icon,.Vlt-radio input:checked~.Vlt-radio__icon{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-radio input:checked~.Vlt-radio__icon:after{background:var(--vgip-meta-input-active-border-color)}.Vlt-radio input:active+.Vlt-radio__icon,.Vlt-radio input:focus+.Vlt-radio__icon{background:var(--vgip-meta-input-bg-color)}"]
80
+ },] }
81
+ ];
82
+ FieldRadio.propDecorators = {
83
+ meta: [{ type: Input }]
84
+ };
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRSYWRpby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFRakQsTUFBTSxPQUFPLFVBQVcsU0FBUSxhQUFhO0lBTjdDOztRQWtFVSxZQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQixRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLEtBQUssV0FBVyxDQUFDLENBQUM7b0JBQ2hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2IsTUFBTTtpQkFDUDthQUNGO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQWxFQyxRQUFRO1FBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqRCxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDYixJQUFJLEtBQUssRUFBRTtvQkFDVCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7NEJBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOzRCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDdkQsTUFBTTt5QkFDUDtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDbkI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM3QixZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7U0FDekM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQy9CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEgsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ1A7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFFO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUU7UUFDUCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixFQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNqRCxDQUFDOzs7WUFoRUYsU0FBUyxTQUFDO2dCQUNULG10Q0FBMEI7Z0JBRTFCLGFBQWEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7YUFDcEU7OzttQkFHRSxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEBBdXRob3I6IEFsZXhhbmRlci5WYW5nZWxvdkB2b25hZ2UuY29tIFxuICogQERhdGU6IDIwMTktMDktMTkgMTc6MzU6MTkgXG4gKiBATGFzdCBNb2RpZmllZCBieTogQWxleGFuZGVyLlZhbmdlbG92QHZvbmFnZS5jb21cbiAqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDMtMjYgMTI6NTY6MzhcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRmllbGRBYnN0cmFjdCB9IGZyb20gJy4uL2ZpZWxkQWJzdHJhY3QnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXcuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XVxufSlcblxuZXhwb3J0IGNsYXNzIEZpZWxkUmFkaW8gZXh0ZW5kcyBGaWVsZEFic3RyYWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbWV0YTogYW55O1xuICB2YWx1ZTogYW55O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudmFsaWRhdGlvbkF0dHJpYnV0ZXMgPSBbJ3JlcXVpcmVkJ107XG4gICAgY29uc3Qgb3JpZ1ZhbHVlID0gdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnBhcmVudCwgdGhpcy5tZXRhLm5hbWUsIHtcbiAgICAgIHNldDogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGZvciAoY29uc3QgbyBvZiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICgodmFsdWUuaWQgfHwgdmFsdWUpID09PSAoby5pZCB8fCBvLnZhbHVlIHx8IG8ubmFtZSB8fCBvKSkge1xuICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gbztcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubW9kZWxUb1ZhbHVlKG8sIHRoaXMubWV0YS52YWx1ZVR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRhLiRvcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbDtcbiAgICAgIH0sXG4gICAgICBnZXQ6ICgpID0+IHRoaXMudmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0aGlzLnNlbmRUb1NlcnZlcixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFxuICAgIGlmIChvcmlnVmFsdWUpIHtcbiAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IG9yaWdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZWZhdWx0ICYmICF0aGlzLm1vZGVsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdID0gdGhpcy5tZXRhLnZhbHVlVHlwZSA9PT0gJ29iamVjdCcgPyB0aGlzLmRlZmF1bHQgOiAodGhpcy5kZWZhdWx0LmlkIHx8IHRoaXMuZGVmYXVsdCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBvbk9wdGlvbkNoYW5nZShtb2RlbCkge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5tb2RlbCk7XG4gIH1cblxuICBvbkFjdGl2YXRlZChldikge1xuICAgIGlmICghdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSkge1xuICAgICAgZXYuc3JjRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgICB9XG4gIH1cblxuICBvbkJsdXIoZXYpIHtcbiAgICBpZiAodGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSkge1xuICAgICAgZXYuc3JjRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhLm9wdGlvbnMgfHwgdGhpcy5tZXRhLnBpY2tsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIl19
@@ -0,0 +1,797 @@
1
+ /*
2
+ * @Author: Alexander.Vangelov@vonage.com
3
+ * @Date: 2019-09-19 17:34:59
4
+ * @Last Modified by: Alexander.Vangelov@vonage.com
5
+ * @Last Modified time: 2020-05-04 09:24:01
6
+ */
7
+ import { Component, ComponentFactoryResolver } from '@angular/core';
8
+ import { ControlContainer, NgForm } from '@angular/forms';
9
+ import { Subject } from 'rxjs';
10
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
11
+ import { MetaReferenceService } from '../services/metaReference';
12
+ import { MetaResourceService } from '../services/metaResource';
13
+ import { MetaMsgService } from '../services/metaMsg';
14
+ import { MetaContextService } from '../services/metaContext';
15
+ import { MetaTrackerService } from '../services/metaTracker';
16
+ import { FieldAbstract } from '../fieldAbstract';
17
+ import { MetaRefDialog } from '../refDialog';
18
+ // import { tMetaField } from '../../../metaTypes/tMetaField'
19
+ export class FieldReference extends FieldAbstract {
20
+ constructor(componentFactoryResolver, referenceService, metaResource, metaMsgService, metaContext, metaTracker) {
21
+ super();
22
+ this.componentFactoryResolver = componentFactoryResolver;
23
+ this.referenceService = referenceService;
24
+ this.metaResource = metaResource;
25
+ this.metaMsgService = metaMsgService;
26
+ this.metaContext = metaContext;
27
+ this.metaTracker = metaTracker;
28
+ this.searchResourceType = {};
29
+ this.searchTextChanged = new Subject();
30
+ this.isCreatable = false;
31
+ this.dropdownVisible = false;
32
+ this.searchResourceTypeMeta = {
33
+ type: 'select',
34
+ name: 'resourceType',
35
+ label: 'Type',
36
+ options: [],
37
+ standalone: true
38
+ };
39
+ this.filteredSuggestions = [];
40
+ this.clickout = (event) => {
41
+ const internalControl = this.elementRef.nativeElement.contains(event.target);
42
+ if (internalControl && ['Vlt-dropdown__link', 'Vlt-dropdown__block'].indexOf(event.target.className) !== -1) {
43
+ this.focus();
44
+ }
45
+ else if (!internalControl && event.target !== this.input && event.target.className !== 'Vlt-dropdown__title') {
46
+ this.dismissDropdown();
47
+ }
48
+ else {
49
+ if (!internalControl && internalControl.tagName !== 'INPUT') {
50
+ this.focus();
51
+ }
52
+ }
53
+ };
54
+ this.keydown = (event) => {
55
+ switch (event.key) {
56
+ case 'ArrowDown': {
57
+ this.showDropdown();
58
+ if (typeof (this.activeSuggestionIndex) === 'undefined') {
59
+ this.activeSuggestionIndex = 0;
60
+ }
61
+ else {
62
+ this.activeSuggestionIndex++;
63
+ if (this.activeSuggestionIndex >= (this.searchResults || this.meta.suggestions || []).length) {
64
+ this.activeSuggestionIndex = 0;
65
+ }
66
+ }
67
+ this.ensureDropdownOptionIsVisible();
68
+ event.preventDefault();
69
+ event.stopPropagation();
70
+ break;
71
+ }
72
+ case 'ArrowUp': {
73
+ this.showDropdown();
74
+ if (typeof (this.activeSuggestionIndex) === 'undefined') {
75
+ this.activeSuggestionIndex = (this.searchResults || this.meta.suggestions || []).length - 1;
76
+ }
77
+ else {
78
+ this.activeSuggestionIndex--;
79
+ if (this.activeSuggestionIndex < 0) {
80
+ this.activeSuggestionIndex = (this.searchResults || this.meta.suggestions || []).length - 1;
81
+ }
82
+ }
83
+ this.ensureDropdownOptionIsVisible();
84
+ event.preventDefault();
85
+ event.stopPropagation();
86
+ break;
87
+ }
88
+ case 'Space':
89
+ case 'Enter': {
90
+ if (typeof (this.activeSuggestionIndex) !== 'undefined') {
91
+ event.preventDefault();
92
+ event.stopPropagation();
93
+ this.onSuggestionSelect(event, (this.searchResults || this.meta.suggestions || [])[this.activeSuggestionIndex]);
94
+ delete this.activeSuggestionIndex;
95
+ }
96
+ break;
97
+ }
98
+ case 'Escape': {
99
+ event.preventDefault();
100
+ event.stopPropagation();
101
+ this.dismissDropdown();
102
+ break;
103
+ }
104
+ case 'Backspace': {
105
+ if (!this.multiple) {
106
+ event.preventDefault();
107
+ event.stopPropagation();
108
+ this.removeSelection();
109
+ }
110
+ break;
111
+ }
112
+ }
113
+ };
114
+ }
115
+ ngOnInit() {
116
+ this.multiple = (this.meta.type === 'multireference') || this.meta.multiple;
117
+ this.searchResourceTypeMeta.label = this.meta.label;
118
+ if (!this.meta.valueType) {
119
+ // this.meta.valueType = 'object';
120
+ Object.defineProperty(this.meta, 'valueType', {
121
+ value: 'object'
122
+ });
123
+ }
124
+ if (this.meta.reference instanceof Array) {
125
+ this.isPolymorphic = true;
126
+ this.isSearchable = true;
127
+ this.searchResourceTypesScope = this.meta.reference.map(rt => rt.name).join(',');
128
+ for (const rt of this.meta.reference) {
129
+ if (rt.creatable) {
130
+ this.isCreatable = true;
131
+ if (typeof (rt.searchable) !== 'undefined' && !rt.searchable) {
132
+ this.isSearchable = false;
133
+ }
134
+ }
135
+ }
136
+ this.meta.reference.forEach((r) => {
137
+ this.searchResourceTypeMeta.options.push({ id: r.name, label: r.label || r.name });
138
+ });
139
+ }
140
+ else {
141
+ this.isSearchable = typeof (this.meta.reference.searchable) === 'undefined' || this.meta.reference.searchable;
142
+ this.searchResourceType = this.meta.reference;
143
+ this.searchResourceTypesScope = this.meta.reference.name || this.meta.reference.resourceType;
144
+ this.isCreatable = this.meta.reference.creatable;
145
+ }
146
+ this.buildPlaceholderLabel();
147
+ this.searchTextChanged.pipe(debounceTime(300), distinctUntilChanged()).subscribe((value) => {
148
+ this.searchText = value;
149
+ this.search();
150
+ });
151
+ const origValue = this.parent[this.meta.name];
152
+ // this.suggestions = this.meta.suggestions; // TODO filter by default type
153
+ // console.log('this.suggestions', this.suggestions);
154
+ Object.defineProperty(this.parent, this.meta.name, {
155
+ set: (value) => {
156
+ if (value === '') {
157
+ value = null;
158
+ }
159
+ if (this.multiple) {
160
+ if (value) {
161
+ for (const v of value) {
162
+ if (!this.model) {
163
+ this.model = [];
164
+ }
165
+ if (typeof (v) === 'string') {
166
+ this.model.push({
167
+ id: v,
168
+ label: v,
169
+ type: this.meta.reference.name
170
+ });
171
+ }
172
+ }
173
+ // this.value = value;
174
+ }
175
+ }
176
+ else {
177
+ if (typeof (value) === 'string') {
178
+ value = {
179
+ id: value,
180
+ label: value,
181
+ type: this.meta.reference.name
182
+ };
183
+ }
184
+ this.searchText = value ? ((!value.label || value.label === ' ') ? `N/A (${value.type}#${value.id})` : value.label || value) : '';
185
+ // if (this.isPolymorphic && this.model) { //TODO show or not?
186
+ // this.searchResourceType = this.meta.reference.find((rt)=> {
187
+ // return rt.name === this.model.type;
188
+ // });
189
+ // }
190
+ }
191
+ this.model = value;
192
+ this.value = value;
193
+ if (!this.multiple) {
194
+ this.buildExternalLink();
195
+ }
196
+ this.meta.$optional = this.isOptional;
197
+ },
198
+ get: () => this.value,
199
+ enumerable: this.sendToServer,
200
+ configurable: true
201
+ });
202
+ if (origValue) {
203
+ this.parent[this.meta.name] = origValue;
204
+ }
205
+ if (this.default && !this.model) {
206
+ if (this.multiple) {
207
+ this.parent[this.meta.name] = [];
208
+ if (this.default.length) {
209
+ for (const dv of this.default) {
210
+ if ((dv.id || dv.value) && dv.type) {
211
+ this.parent[this.meta.name].push({
212
+ id: dv.id || dv.value,
213
+ label: dv.label || dv.id || dv.value,
214
+ type: dv.type
215
+ });
216
+ }
217
+ }
218
+ }
219
+ if (!this.parent[this.meta.name].length) {
220
+ this.clear();
221
+ }
222
+ }
223
+ else {
224
+ if (this.default.id && this.default.label && this.default.type) {
225
+ setTimeout(() => {
226
+ this.parent[this.meta.name] = {
227
+ id: this.default.id,
228
+ label: this.default.label,
229
+ type: this.default.type
230
+ };
231
+ }, 0);
232
+ }
233
+ else {
234
+ console.warn('!!!default value is not valid format', this.meta);
235
+ }
236
+ }
237
+ }
238
+ if (typeof (this.meta.disabled) !== undefined) {
239
+ if (typeof (this.meta.disabled) === 'object') {
240
+ for (const p of Object.keys(this.meta.disabled)) {
241
+ const props = p.split('.');
242
+ if (typeof (this.parent[props[0]]) !== 'undefined') {
243
+ let val = this.parent;
244
+ for (const prop of props) {
245
+ val = val[prop];
246
+ if (!val) {
247
+ break;
248
+ }
249
+ }
250
+ if (val === this.meta.disabled[p]) {
251
+ this.logicalDisabled = true;
252
+ this.clear();
253
+ }
254
+ }
255
+ this.parentChangeSubject.subscribe((value) => {
256
+ if (value && value.hasOwnProperty(props[0])) {
257
+ let val = this.parent;
258
+ for (const prop of props) {
259
+ val = val[prop];
260
+ if (!val) {
261
+ break;
262
+ }
263
+ }
264
+ if (val === this.meta.disabled[p]) {
265
+ this.logicalDisabled = true;
266
+ this.clear();
267
+ }
268
+ else {
269
+ delete this.logicalDisabled;
270
+ }
271
+ }
272
+ });
273
+ }
274
+ }
275
+ }
276
+ if (this.meta.search) {
277
+ const searchParams = this.meta.search.params;
278
+ if (searchParams) {
279
+ for (const par of Object.keys(searchParams)) {
280
+ const props = searchParams[par].split('#');
281
+ const field = props[0];
282
+ const prop = props[1];
283
+ let parValue = this.parent[field];
284
+ if (parValue) {
285
+ if (prop) {
286
+ parValue = parValue[prop];
287
+ }
288
+ if (parValue) {
289
+ const params = {};
290
+ params[par] = parValue;
291
+ this.searchSuggestions(params);
292
+ }
293
+ }
294
+ this.parentChangeSubject.subscribe((value) => {
295
+ if (value && value.hasOwnProperty(field)) {
296
+ if (value[field]) {
297
+ if (prop) {
298
+ value[field] = value[field][prop];
299
+ }
300
+ const params = {};
301
+ params[par] = value[field];
302
+ this.searchSuggestions(params);
303
+ }
304
+ }
305
+ });
306
+ }
307
+ }
308
+ }
309
+ }
310
+ clearSearchResourceType() {
311
+ this.searchResourceType = {};
312
+ this.onSearchResourceTypeChanged();
313
+ }
314
+ onSearchResourceTypeChanged(resourceType) {
315
+ if (!resourceType || !resourceType.id) {
316
+ this.searchResourceType.resourceType = null;
317
+ this.searchResourceTypesScope = (this.meta.reference || []).map(rt => rt.name).join(',');
318
+ }
319
+ else {
320
+ this.searchResourceType.resourceType = resourceType.id;
321
+ this.searchResourceTypesScope = resourceType.id;
322
+ }
323
+ this.buildPlaceholderLabel();
324
+ this.focus();
325
+ if (!this.model && !this.searchText) { // filter suggestions by type
326
+ this.filteredSuggestions = !resourceType ? (this.meta.suggestions || []) : (this.meta.suggestions || []).filter((s) => s.type === resourceType.id);
327
+ }
328
+ else { // regular search (return scoped results)
329
+ if (!this.model) {
330
+ this.search();
331
+ }
332
+ else if (this.searchResults && resourceType) {
333
+ this.searchResults = this.searchResults.filter((s) => s.type === resourceType.id);
334
+ }
335
+ }
336
+ delete this.searchError;
337
+ }
338
+ onSearchTextChanged(value) {
339
+ this.searchTextChanged.next(value);
340
+ }
341
+ search() {
342
+ this.searching = true;
343
+ // this.activeSuggestionIndex;
344
+ if (!this.searchText || this.searchText.length < 2) {
345
+ this.searching = false;
346
+ delete this.searchResults;
347
+ return;
348
+ }
349
+ const showSearchresults = (results) => {
350
+ this.searching = false;
351
+ delete this.searchError;
352
+ if (!results || !(results instanceof Array)) {
353
+ results = [];
354
+ }
355
+ if (this.meta.acceptNew && this.meta.acceptNew.type && this.meta.acceptNew.pattern) {
356
+ const regex = new RegExp(this.meta.acceptNew.pattern);
357
+ if (regex.test(this.searchText)) {
358
+ results.unshift({ id: null, label: this.searchText, type: this.meta.acceptNew.type });
359
+ }
360
+ }
361
+ this.searchResults = results.map((r) => {
362
+ return { id: r.id, label: r.label, type: r.type || r.resourceType || this.searchResourceType.name, externalLink: r.externalLink };
363
+ });
364
+ if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
365
+ this.showDropdown();
366
+ }
367
+ if (this.searchResults.length && !this.activeSuggestionIndex) {
368
+ this.activeSuggestionIndex = 0;
369
+ }
370
+ };
371
+ if (this.meta.search) {
372
+ const searchParams = this.meta.search.params || {};
373
+ let searchUrl = `/fields/${this.meta.name}/search`;
374
+ if (this.meta.search.url) {
375
+ searchUrl = this.meta.search.url.replace(/\${\s*([\w\.]+)\s*}/g, (match, key) => {
376
+ if (searchParams.hasOwnProperty(key)) {
377
+ const val = searchParams[key];
378
+ delete searchParams[key];
379
+ return val;
380
+ }
381
+ return '';
382
+ });
383
+ }
384
+ for (const p of Object.keys(searchParams)) {
385
+ searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${encodeURIComponent(p)}=${encodeURIComponent(searchParams[p])}`;
386
+ }
387
+ searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}q=${encodeURIComponent(this.searchText)}`;
388
+ this.searching = true;
389
+ this.resourceService.getByPath(searchUrl).subscribe((results) => {
390
+ showSearchresults(results);
391
+ }, (error) => {
392
+ delete this.searching;
393
+ this.searchResults = [];
394
+ this.searchError = error.error ? error.error.message || error.error : error.message || error;
395
+ if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
396
+ this.showDropdown();
397
+ }
398
+ });
399
+ }
400
+ else {
401
+ if (!this.vr) {
402
+ this.vr = this.metaResource.new({
403
+ integrationCode: this.integrationCode,
404
+ resourceType: null
405
+ });
406
+ }
407
+ this.vr.searchIntegration(this.searchText, this.searchResourceType.name || this.searchResourceTypesScope).subscribe((results) => {
408
+ showSearchresults(results);
409
+ }, (error) => {
410
+ this.searching = false;
411
+ this.searchResults = [];
412
+ this.searchError = error.error ? error.error.message || error.error : error.message || error;
413
+ if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
414
+ this.showDropdown();
415
+ }
416
+ });
417
+ }
418
+ }
419
+ onActivated(ev) {
420
+ // ev.preventDefault();
421
+ // ev.stopPropagation();
422
+ this.input = ev.srcElement;
423
+ if (!this.dropdown) {
424
+ // this.dropdown = ev.srcElement.parentNode.parentNode;
425
+ this.dropdown = this.elementRef.nativeElement.querySelector('.dropdown-wrapper');
426
+ }
427
+ this.showDropdown();
428
+ }
429
+ onBlur(ev) {
430
+ let internalControl = false;
431
+ if (ev.relatedTarget) {
432
+ if (!this.elementRef.nativeElement.contains(ev.relatedTarget)) {
433
+ this.dismissDropdown();
434
+ }
435
+ else {
436
+ internalControl = true;
437
+ }
438
+ }
439
+ if (this.keyListenerActive && !internalControl) {
440
+ this.input.removeEventListener('keydown', this.keydown);
441
+ setTimeout(() => {
442
+ if (!this.keyListenerActive) {
443
+ document.removeEventListener('click', this.clickout);
444
+ }
445
+ }, 400);
446
+ delete this.keyListenerActive;
447
+ }
448
+ }
449
+ removeSelection() {
450
+ this.metaTracker.emit(this.buildTrackEvent('REMOVE'));
451
+ this.clear();
452
+ }
453
+ onSuggestionSelect(ev, suggestion) {
454
+ if (!suggestion) {
455
+ return;
456
+ }
457
+ ev.preventDefault();
458
+ ev.stopPropagation();
459
+ this.focus();
460
+ this.metaTracker.emit(this.buildTrackEvent('SELECT'));
461
+ if (this.multiple) {
462
+ if (!this.model) {
463
+ this.model = [];
464
+ }
465
+ let existingEntry;
466
+ for (const entry of this.model) {
467
+ if (suggestion.id && (entry.id === suggestion.id)) {
468
+ existingEntry = entry;
469
+ break;
470
+ }
471
+ else if (suggestion.label === entry.label) { // create new (google emails)
472
+ existingEntry = entry;
473
+ break;
474
+ }
475
+ }
476
+ if (!existingEntry) {
477
+ this.model.push(suggestion);
478
+ }
479
+ this.onModelChange(this.model);
480
+ delete this.searchText;
481
+ this.searchTextChanged.next();
482
+ }
483
+ else {
484
+ this.model = suggestion;
485
+ this.externalLink = suggestion.externalLink;
486
+ this.onModelChange(suggestion);
487
+ this.searchText = suggestion.label;
488
+ }
489
+ this.dismissDropdown();
490
+ // if (this.isPolymorphic) {
491
+ // this.searchResourceType = this.meta.reference.find((rt)=> {
492
+ // return rt.name === suggestion.type;
493
+ // });
494
+ // }
495
+ }
496
+ showDropdown() {
497
+ this.dropdownVisible = true;
498
+ this.dropdown.classList.add('Vlt-dropdown--expanded');
499
+ if (!this.keyListenerActive) {
500
+ this.input.addEventListener('keydown', this.keydown);
501
+ setTimeout(() => {
502
+ document.addEventListener('click', this.clickout);
503
+ }, 200);
504
+ this.keyListenerActive = true;
505
+ if (this.searchResults && this.parent[this.meta.name]) {
506
+ for (let suggestionIndex = 0; suggestionIndex < (this.searchResults || this.meta.suggestions || []).length; suggestionIndex++) {
507
+ if (this.parent[this.meta.name] === (this.searchResults || this.meta.suggestions || [])[suggestionIndex]) {
508
+ this.activeSuggestionIndex = suggestionIndex;
509
+ break;
510
+ }
511
+ }
512
+ }
513
+ }
514
+ this.ensureDropdownIsVisible();
515
+ }
516
+ dismissDropdown(event) {
517
+ this.dropdownVisible = false;
518
+ if (event) {
519
+ this.focus();
520
+ }
521
+ if (this.dropdown) {
522
+ this.dropdown.classList.remove('Vlt-dropdown--expanded');
523
+ }
524
+ }
525
+ clear() {
526
+ this.prevModel = this.model;
527
+ delete this.searchText;
528
+ delete this.searchResults;
529
+ delete this.model;
530
+ this.onModelChange(this.model);
531
+ this.onSearchTextChanged(this.searchText);
532
+ this.focus();
533
+ }
534
+ revert() {
535
+ this.model = this.prevModel;
536
+ delete this.prevModel;
537
+ this.onModelChange(this.model);
538
+ this.focus();
539
+ }
540
+ remove(ev, item) {
541
+ ev.preventDefault();
542
+ ev.stopPropagation();
543
+ const optionIndex = this.model.indexOf(item);
544
+ if (optionIndex !== -1) {
545
+ this.model.splice(optionIndex, 1);
546
+ if (!this.model.length) {
547
+ delete this.model;
548
+ delete this.value;
549
+ }
550
+ this.onModelChange(this.model);
551
+ }
552
+ }
553
+ openResource(model) {
554
+ this.keyListenerActive = true; // suppress dropdown in this case
555
+ setTimeout(() => {
556
+ this.dismissDropdown();
557
+ });
558
+ const refDialogFactory = this.componentFactoryResolver.resolveComponentFactory(MetaRefDialog);
559
+ this.metaTracker.emit(this.buildTrackEvent(model ? 'EDIT' : 'NEW'));
560
+ let theme = this.elementRef.nativeElement.dataset.theme;
561
+ if (!theme || theme === 'inherit') {
562
+ let parentComponent = this.elementRef.nativeElement.closest('vgip-meta-layout');
563
+ if (parentComponent) {
564
+ theme = parentComponent.dataset.theme;
565
+ }
566
+ if (!theme || theme === 'inherit') {
567
+ parentComponent = this.elementRef.nativeElement.closest('vgip-meta-resource');
568
+ if (parentComponent) {
569
+ theme = parentComponent.dataset.theme;
570
+ }
571
+ }
572
+ }
573
+ this.referenceService.openDialog(refDialogFactory, this.metaResource, this.integrationCode, this.meta.reference, model, null, this.searchResourceType.resourceType, theme).subscribe((result) => {
574
+ if (result) {
575
+ this.parent[this.meta.name] = result;
576
+ const existingSuggestion = (this.meta.suggestions || []).find((s) => (s.id === result.id && s.type === result.type));
577
+ if (existingSuggestion) {
578
+ existingSuggestion.label = result.label;
579
+ }
580
+ else {
581
+ if (!this.meta.suggestions) {
582
+ this.meta.suggestions = [];
583
+ }
584
+ this.meta.suggestions.unshift(result);
585
+ }
586
+ this.metaTracker.emit(this.buildTrackEvent(model ? 'UPDATE' : 'CREATE', result.type || result.resourceType));
587
+ }
588
+ else {
589
+ this.metaTracker.emit(this.buildTrackEvent(model ? 'CANCEL_EDIT' : 'CANCEL_UPDATE'));
590
+ }
591
+ });
592
+ }
593
+ ensureDropdownIsVisible() {
594
+ setTimeout(() => {
595
+ const holder = this.dropdown.closest('.Vlt-card__content');
596
+ if (holder) {
597
+ const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');
598
+ const elRect = el.getBoundingClientRect();
599
+ const holderRect = holder.getBoundingClientRect();
600
+ if (holderRect.top + holderRect.height < elRect.top + elRect.height) {
601
+ el.scrollIntoView({ block: 'end' });
602
+ }
603
+ }
604
+ }, 400);
605
+ }
606
+ ensureDropdownOptionIsVisible() {
607
+ if (!this.dropdownScrollContainer) {
608
+ this.dropdownScrollContainer = this.dropdown.querySelector('.Vlt-dropdown__scroll');
609
+ }
610
+ if (this.dropdownScrollContainer && typeof (this.activeSuggestionIndex) === 'number') {
611
+ const scrollTop = 44 * this.activeSuggestionIndex;
612
+ const scrollBottom = 44 * (this.activeSuggestionIndex - 7);
613
+ if (scrollTop < this.dropdownScrollContainer.scrollTop) {
614
+ this.dropdownScrollContainer.scrollTop = scrollTop;
615
+ }
616
+ else if (scrollBottom > this.dropdownScrollContainer.scrollTop) {
617
+ this.dropdownScrollContainer.scrollTop = scrollBottom;
618
+ }
619
+ }
620
+ }
621
+ buildTrackEvent(action, value) {
622
+ const e = {
623
+ integration: this.integrationCode,
624
+ resource: this.model ? (this.model.type || this.model.resourceType) : this.searchResourceType.resourceType,
625
+ field: this.meta.name,
626
+ action
627
+ };
628
+ if (this.meta.$isContactable) {
629
+ e.isContactable = true;
630
+ }
631
+ if (typeof (value) !== 'undefined') {
632
+ e.value = value;
633
+ }
634
+ return e;
635
+ }
636
+ buildPlaceholderLabel() {
637
+ this.placeHolderLabel = this.meta.label;
638
+ if (this.multiple && !this.isPolymorphic) {
639
+ this.placeHolderLabel = '+Add ';
640
+ }
641
+ else {
642
+ this.placeHolderLabel = (this.isSearchable && (this.multiple || !this.isPolymorphic)) ? 'Search ' : '';
643
+ }
644
+ this.placeHolderLabel += this.searchResourceType.resourceType ? this.searchResourceType.resourceType : this.searchResourceTypesScope;
645
+ }
646
+ buildExternalLink() {
647
+ if (this.model) {
648
+ if (this.model.externalLink) {
649
+ this.externalLink = this.model.externalLink;
650
+ }
651
+ else if (this.metaContext.profiles[this.integrationCode.toUpperCase()]) {
652
+ delete this.externalLink;
653
+ this.metaMsgService.sendMessage(this.integrationCode.toUpperCase(), {
654
+ action: 'buildExternalLink',
655
+ integrationCode: this.integrationCode,
656
+ ref: this.model,
657
+ profile: this.metaContext.profiles[this.integrationCode.toUpperCase()]
658
+ }, (response) => {
659
+ if (!response.error) {
660
+ this.externalLink = response.externalLink;
661
+ }
662
+ else {
663
+ console.warn('No external link support for', this.integrationCode, this.model.resourceType || this.model.type);
664
+ }
665
+ });
666
+ }
667
+ }
668
+ else {
669
+ delete this.externalLink;
670
+ }
671
+ }
672
+ get disabled() {
673
+ const superDisabled = this.logicalDisabled || this.validations.disabled || this.meta.disabled === true
674
+ || (this.meta.updatable === false && this.isPersistedParent);
675
+ this.searchResourceTypeMeta.disabled = superDisabled;
676
+ return superDisabled;
677
+ }
678
+ get showTypes() {
679
+ return (typeof (this.meta.showTypes) !== 'undefined') ? this.meta.showTypes : true;
680
+ }
681
+ get suggestions() {
682
+ return !this.searchResourceType.resourceType ?
683
+ // eslint-disable-next-line arrow-body-style
684
+ (this.asyncSuggestions || this.meta.suggestions || []) : (this.asyncSuggestions || this.meta.suggestions || []).filter((s) => {
685
+ return s.type === this.searchResourceType.resourceType;
686
+ });
687
+ }
688
+ get hasAppendButton() {
689
+ if (!this.multiple && this.model) {
690
+ if (this.isPolymorphic) {
691
+ for (const ref of this.meta.reference) {
692
+ if ((ref.name || ref.resourceType) === (this.model.type || this.model.resourceType)) {
693
+ return ref.updatable !== false;
694
+ }
695
+ }
696
+ }
697
+ else {
698
+ return this.meta.reference.updatable !== false;
699
+ }
700
+ }
701
+ else if (this.meta.reference instanceof Array) {
702
+ // setTimeout(() => {
703
+ // this.searchResourceTypesScope = this.meta.reference.map(rt => rt.name).join(',');
704
+ // }, 0);
705
+ for (const rt of this.meta.reference) {
706
+ if (rt.creatable) {
707
+ return true;
708
+ }
709
+ }
710
+ }
711
+ else {
712
+ return this.meta.reference.creatable;
713
+ }
714
+ }
715
+ searchSuggestions(params) {
716
+ let searchUrl = `/suggestions/${this.meta.name}/search`;
717
+ if (this.meta.search) {
718
+ if (this.meta.search.url) {
719
+ searchUrl = this.meta.search.url.replace(/\${\s*([\w\.]+)\s*}/g, (match, key) => {
720
+ if (params.hasOwnProperty(key)) {
721
+ const val = params[key];
722
+ delete params[key];
723
+ return val;
724
+ }
725
+ return '';
726
+ });
727
+ }
728
+ for (const p of Object.keys(params)) {
729
+ searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${encodeURIComponent(p)}=${encodeURIComponent(params[p])}`;
730
+ }
731
+ this.searching = true;
732
+ this.resourceService.getByPath(searchUrl).subscribe((result) => {
733
+ delete this.searching;
734
+ if (result) {
735
+ let suggestions;
736
+ suggestions = result;
737
+ if (this.meta.search.extract) {
738
+ suggestions = result[this.meta.search.extract];
739
+ }
740
+ if (suggestions instanceof Array !== true) {
741
+ suggestions = [suggestions];
742
+ }
743
+ const asyncSuggestions = [];
744
+ suggestions.forEach((s) => {
745
+ if (s && s.id && s.type) { // TOOD check the type is acceptable
746
+ asyncSuggestions.push({
747
+ id: s.id,
748
+ label: s.label || `${s.type}#${s.id}`,
749
+ type: s.type
750
+ });
751
+ }
752
+ });
753
+ if (asyncSuggestions.length) {
754
+ if (asyncSuggestions.length === 1) {
755
+ this.parent[this.meta.name] = asyncSuggestions[0];
756
+ }
757
+ else {
758
+ delete this.asyncSuggestions;
759
+ }
760
+ }
761
+ this.asyncSuggestions = asyncSuggestions;
762
+ }
763
+ }, (err) => {
764
+ delete this.searching;
765
+ });
766
+ }
767
+ }
768
+ get resourceService() {
769
+ if (!this.metaResourceService) {
770
+ const metaResourceConfig = {
771
+ integrationCode: this.integrationCode,
772
+ resourceType: this.resourceType
773
+ };
774
+ this.metaResourceService = this.metaResource.new(metaResourceConfig);
775
+ }
776
+ return this.metaResourceService;
777
+ }
778
+ }
779
+ FieldReference.decorators = [
780
+ { type: Component, args: [{
781
+ template: "<div class='vgip-meta-field-preview' *ngIf='preview && model && (!multiple || (multiple && model.length))'>\n <div class='vgip-meta-field-label'>{{meta.label}}</div>\n <div *ngIf='!multiple' class='vgip-meta-field-value __gu'>\n <svg class=\"Vlt-icon Vlt-icon--smaller\" style='margin-top: -3px;'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n {{model.label || model.id}} <span class='Vlt-grey'>({{model.type}})</span>\n </div>\n <div *ngIf='multiple' class='vgip-meta-field-value __gu'>\n <span *ngFor='let m of (model || [])' class='Vlt-badge Vlt-badge--app'>\n {{m.label || m.id || m}} <span class='Vlt-grey-dark' *ngIf='isPolymorphic'>({{m.type}})</span>\n </span>\n </div>\n</div>\n<div *ngIf='!preview' class=\"meta-field-reference Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{ 'Vlt-form__element--error': (searchError && keyListenerActive) || (f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched)), 'multiple': multiple, 'has-value': model, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container' [ngClass]='{ creatable: isCreatable }'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()' style='width: 100%;'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\" [ngClass]=\"{ grid: (item.label || item.id || '').length > 56}\">\n <span class='Vlt-truncate'>{{item.label || item.id || item }} <span *ngIf='isPolymorphic' class='Vlt-grey-dark' style='font-weight: normal;'>({{item.type}})</span></span>\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)' style='position: absolute; right: 12px; top: 8px;' aria-label='Remove'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite\">\n <div class='dropdown-wrapper Vlt-dropdown' style='width: 100%; position: absolute; top: 48px;'>\n <div class=\"Vlt-dropdown__panel\">\n <div *ngIf='searchError'>\n <div class=\"Vlt-callout Vlt-callout--critical keep-focus\">\n <i></i>\n <div class=\"Vlt-callout__content\">{{searchError}}</div>\n </div>\n </div>\n <div *ngIf='!searchError && (suggestions.length || searchResults)' [ngClass]=\"{ suggestions: !searchResults}\" class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\" style='padding: 0;'>\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='!searchResults' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <div *ngIf='searchResults' class=\"Vlt-dropdown__scroll\">\n <div *ngIf='!searchResults.length' class='Vlt-dropdown__block'> No records matching '<b style='pointer-events: none;'>{{searchText}}</b>' were found.</div>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of searchResults; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <!-- <div *ngIf='searchResults' class=\"Vlt-dropdown__block\" style='text-align: right; padding-top: 0;'>\n <small>\n {{ searchResults ? searchResults.length+' results' : 'Suggestions' }} <span style='font-style: italic; font-weight: normal;' *ngIf='searchResults'>~{{ model ? 'last search' : searchText}}</span>\n </small>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite__prepend\" *ngIf='isPolymorphic && showTypes && (multiple || !model || (dropdownVisible && ((suggestions || searchResults || []).length || searchResourceType.resourceType)))'>\n <div class=\"search-scope\" [ngClass]=\"{ 'has-value': searchResourceType.resourceType }\">\n <vgip-meta-field class='shown' [meta]='searchResourceTypeMeta' [parent]='searchResourceType' (onChange)='onSearchResourceTypeChanged($event)' (onLeave)='onBlur($event)' [integrationCode]='integrationCode' theme='inherit'></vgip-meta-field>\n <svg class='Vlt-icon Vlt-grey Vlt-icon--smaller visible-mobile mobile-icon' style='position: absolute; top: 15px; left: 14px; pointer-events: none;'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-menu\"/>\n </svg>\n <label class='mobile-label hidden-mobile hidden-desktop'>Search</label>\n </div>\n </div>\n <div *ngIf='!(isPolymorphic && showTypes && (multiple || !model || dropdownVisible))'><!-- required by css --></div>\n <div class=\"Vlt-composite__wrapper Vlt-input\" style='overflow: hidden;' [ngClass]=\"{ 'has-append-button': hasAppendButton && !disabled }\">\n <label class='wrapper'>\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\" style='top: 0; padding-top: 15px;'>\n <div class=\"Vlt-composite__icon\">\n <svg *ngIf='isSearchable && (!model || multiple)' class='Vlt-grey'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ multiple ? 'stack' : 'search'}}\"/></svg>\n <svg *ngIf='!isSearchable || (model && !multiple)' [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n </div>\n <div *ngIf='suggestions.length' class=\"Vlt-badge Vlt-badge--small Vlt-badge--purple\" style='padding: 0px 4px; position: absolute; top: 26px; left: 4px; pointer-events: none; min-width: 14px;'>{{suggestions.length}}</div>\n </div>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <input class='main' [readonly]='!isSearchable || (model && !multiple)' [ngModel]='searchText' #ft='ngModel' (ngModelChange)='onSearchTextChanged($event)' [ngModelOptions]=\"{standalone: true}\" type=\"text\" placeholder=\"{{ placeHolderLabel || ' ' }}\" style='padding-left: 38px;' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)' [disabled]='disabled'/>\n <label class='Vlt-truncate hidden-mobile' style='padding-left: 25px; padding-right: 42px;'>{{ (multiple && isPolymorphic) ? '+Add ' : ((model || !isPolymorphic) ? meta.label : ( meta.searchLabel || 'Search')) }}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n <label class='Vlt-truncate hidden-desktop' style='padding-left: 25px; padding-right: 42px;'>{{meta.label}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n </label>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <!-- <div *ngIf='prevModel && !model' class=\"Vlt-composite__append--icon\" (click)='revert()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-reply\"/></svg>\n </div>\n </div> -->\n <div *ngIf='model && !multiple' class=\"Vlt-composite__append--icon\" (click)='removeSelection()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n </div>\n </div>\n <!-- <span *ngIf='hasCreatables'>\n <button type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--primary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </span> -->\n <div *ngIf='hasAppendButton && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Add new'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Edit'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.pattern\">Should match '{{validations.pattern}}' pattern</span>\n </small>\n <small *ngIf='meta.helpText || meta.hint' class=\"Vlt-form__element__hint\">{{meta.helpText || meta.hint}}</small>\n</div>\n",
782
+ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],
783
+ entryComponents: [
784
+ MetaRefDialog
785
+ ],
786
+ styles: [".Vlt-form__element--big .Vlt-input input:-moz-placeholder-shown:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big .Vlt-input input:-ms-input-placeholder:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big .Vlt-input input:placeholder-shown:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-right:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active .Vlt-composite__append button,.Vlt-form__element--big.active ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:hover ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button,.Vlt-form__element--big.Vlt-form__element--error ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:#f25a6b}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;padding:6px 4px 3px 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%;position:relative;padding-right:30px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge.grid{display:grid}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button,.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-left-radius:0;border-top-right-radius:0;height:48px}.Vlt-form__element--big.multiple.has-value .main:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone:not(.Vlt-btn--icon){border-top:0}.Vlt-form__element--big.multiple.has-value .Vlt-composite__prepend ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-right-radius:6px}.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button{border-top-left-radius:6px;border-top:0}.Vlt-composite__prepend{z-index:auto}.Vlt-composite__prepend--icon{top:0;padding-top:15px;left:3px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:0}.Vlt-input.has-append-button .Vlt-composite__append.right-actions .Vlt-composite__append--icon:last-child{width:36px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:5px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{outline:none;position:static;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-composite__append button{height:48px;padding-right:16px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-input input{text-overflow:ellipsis;padding-right:36px}.Vlt-input input.ext{padding-right:72px}.Vlt-composite__wrapper.has-append-button input.main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-input input{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);font-weight:700}.Vlt-dropdown__panel{max-width:100%;width:100%;min-width:280px}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel .Vlt-dropdown__link>div{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.Vlt-dropdown__panel .Vlt-dropdown__link>svg{margin-right:8px}.vgip-meta-field-preview .Vlt-badge{margin:1px 3px 1px 0;overflow:hidden;max-width:100%}:host .search-scope{width:130px}:host .search-scope ::ng-deep .Vlt-form__element.has-value .Vlt-select:after{display:none}:host .search-scope ::ng-deep .Vlt-form__element .right-actions{right:12px}:host .search-scope ::ng-deep .Vlt-form__element label.Vlt-truncate{padding-right:48px}:host .search-scope .mobile-icon{display:none}@media only screen and (max-width:575px){:host .search-scope{width:60px}:host .search-scope.has-value .mobile-label,:host .search-scope:not(.has-value) .mobile-icon{display:block}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-composite__append{display:none}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-select:after{margin-right:-7px}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big label.Vlt-truncate{visibility:hidden}}:host .search-scope ::ng-deep vgip-meta-field .Vlt-input input.main.standalone{padding-right:0;background:var(--vgip-meta-input-accent-bg-color);border-color:var(--vgip-meta-input-border-color)}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element{padding:0}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element .Vlt-dropdown__panel{width:auto}"]
787
+ },] }
788
+ ];
789
+ FieldReference.ctorParameters = () => [
790
+ { type: ComponentFactoryResolver },
791
+ { type: MetaReferenceService },
792
+ { type: MetaResourceService },
793
+ { type: MetaMsgService },
794
+ { type: MetaContextService },
795
+ { type: MetaTrackerService }
796
+ ];
797
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRSZWZlcmVuY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQXVCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3Qyw2REFBNkQ7QUFXN0QsTUFBTSxPQUFPLGNBQWUsU0FBUSxhQUFhO0lBK0IvQyxZQUNVLHdCQUFrRCxFQUNsRCxnQkFBc0MsRUFDdEMsWUFBaUMsRUFDakMsY0FBOEIsRUFDOUIsV0FBK0IsRUFDL0IsV0FBK0I7UUFFdkMsS0FBSyxFQUFFLENBQUM7UUFQQSw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBc0I7UUFDdEMsaUJBQVksR0FBWixZ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LENBQUM7SUFDbEMsQ0FBQzs7O1lBbHlCRixTQUFTLFNBQUM7Z0JBQ1QsK2dWQUEwQjtnQkFFMUIsYUFBYSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUNuRSxlQUFlLEVBQUU7b0JBQ2YsYUFBYTtpQkFDZDs7YUFDRjs7O1lBeEJtQix3QkFBd0I7WUFLbkMsb0JBQW9CO1lBQ3BCLG1CQUFtQjtZQUNuQixjQUFjO1lBQ2Qsa0JBQWtCO1lBQ2xCLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAQXV0aG9yOiBBbGV4YW5kZXIuVmFuZ2Vsb3ZAdm9uYWdlLmNvbVxuICogQERhdGU6IDIwMTktMDktMTkgMTc6MzQ6NTlcbiAqIEBMYXN0IE1vZGlmaWVkIGJ5OiBBbGV4YW5kZXIuVmFuZ2Vsb3ZAdm9uYWdlLmNvbVxuICogQExhc3QgTW9kaWZpZWQgdGltZTogMjAyMC0wNS0wNCAwOToyNDowMVxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1ldGFSZWZlcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YVJlZmVyZW5jZSc7XG5pbXBvcnQgeyBNZXRhUmVzb3VyY2VTZXJ2aWNlLCBJTWV0YVJlc291cmNlQ29uZmlnIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YVJlc291cmNlJztcbmltcG9ydCB7IE1ldGFNc2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YU1zZyc7XG5pbXBvcnQgeyBNZXRhQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXRhQ29udGV4dCc7XG5pbXBvcnQgeyBNZXRhVHJhY2tlclNlcnZpY2UsIElNZXRhVHJhY2tlckV2ZW50IH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YVRyYWNrZXInO1xuXG5pbXBvcnQgeyBGaWVsZEFic3RyYWN0IH0gZnJvbSAnLi4vZmllbGRBYnN0cmFjdCc7XG5pbXBvcnQgeyBNZXRhUmVmRGlhbG9nIH0gZnJvbSAnLi4vcmVmRGlhbG9nJztcbmltcG9ydCB7IGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IgfSBmcm9tICdyeGpzL2ludGVybmFsL29ic2VydmFibGUvQ29ubmVjdGFibGVPYnNlcnZhYmxlJztcbi8vIGltcG9ydCB7IHRNZXRhRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tZXRhVHlwZXMvdE1ldGFGaWVsZCdcblxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXcuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XSxcbiAgZW50cnlDb21wb25lbnRzOiBbXG4gICAgTWV0YVJlZkRpYWxvZ1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkUmVmZXJlbmNlIGV4dGVuZHMgRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGlucHV0OiBhbnk7XG4gIGRyb3Bkb3duOiBIVE1MRWxlbWVudDtcbiAgZHJvcGRvd25TY3JvbGxDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBzZWFyY2hpbmc6IGJvb2xlYW47XG4gIHNlYXJjaFJlc291cmNlVHlwZTogYW55ID0ge307XG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgc2VhcmNoUmVzdWx0czogQXJyYXk8YW55PjtcbiAgc2VhcmNoRXJyb3I6IGFueTtcbiAgYWN0aXZlU3VnZ2VzdGlvbkluZGV4OiBudW1iZXI7XG4gIHNlYXJjaFJlc291cmNlVHlwZXNTY29wZTogc3RyaW5nO1xuICBzZWFyY2hUZXh0Q2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBpc0NyZWF0YWJsZSA9IGZhbHNlO1xuICB2YWx1ZTogYW55O1xuICBpc1BvbHltb3JwaGljOiBib29sZWFuO1xuICBpc1NlYXJjaGFibGU6IGJvb2xlYW47XG4gIG11bHRpcGxlOiBib29sZWFuO1xuICB2cjogTWV0YVJlc291cmNlU2VydmljZTtcbiAgZXh0ZXJuYWxMaW5rOiBzdHJpbmc7XG4gIGRyb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICBzZWFyY2hSZXNvdXJjZVR5cGVNZXRhOiBhbnkgPSB7XG4gICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgbmFtZTogJ3Jlc291cmNlVHlwZScsXG4gICAgbGFiZWw6ICdUeXBlJyxcbiAgICBvcHRpb25zOiBbXSwgLy8geyBsYWJlbDogJy0tIEFsbCB0eXBlcyAtLScgfV0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxuICB9O1xuICBmaWx0ZXJlZFN1Z2dlc3Rpb25zOiBBcnJheTxhbnk+ID0gW107XG4gIHBsYWNlSG9sZGVyTGFiZWw6IHN0cmluZztcbiAgYXN5bmNTdWdnZXN0aW9uczogQXJyYXk8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVmZXJlbmNlU2VydmljZTogTWV0YVJlZmVyZW5jZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhUmVzb3VyY2U6IE1ldGFSZXNvdXJjZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhTXNnU2VydmljZTogTWV0YU1zZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhQ29udGV4dDogTWV0YUNvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YVRyYWNrZXI6IE1ldGFUcmFja2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tdWx0aXBsZSA9ICh0aGlzLm1ldGEudHlwZSA9PT0gJ211bHRpcmVmZXJlbmNlJykgfHwgdGhpcy5tZXRhLm11bHRpcGxlO1xuICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlTWV0YS5sYWJlbCA9IHRoaXMubWV0YS5sYWJlbDtcbiAgICBpZiAoIXRoaXMubWV0YS52YWx1ZVR5cGUpIHtcbiAgICAgIC8vIHRoaXMubWV0YS52YWx1ZVR5cGUgPSAnb2JqZWN0JztcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLm1ldGEsICd2YWx1ZVR5cGUnLCB7XG4gICAgICAgIHZhbHVlOiAnb2JqZWN0J1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1ldGEucmVmZXJlbmNlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRoaXMuaXNQb2x5bW9ycGhpYyA9IHRydWU7XG4gICAgICB0aGlzLmlzU2VhcmNoYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZSA9IHRoaXMubWV0YS5yZWZlcmVuY2UubWFwKHJ0ID0+IHJ0Lm5hbWUpLmpvaW4oJywnKTtcbiAgICAgIGZvciAoY29uc3QgcnQgb2YgdGhpcy5tZXRhLnJlZmVyZW5jZSkge1xuICAgICAgICBpZiAocnQuY3JlYXRhYmxlKSB7XG4gICAgICAgICAgdGhpcy5pc0NyZWF0YWJsZSA9IHRydWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiAocnQuc2VhcmNoYWJsZSkgIT09ICd1bmRlZmluZWQnICYmICFydC5zZWFyY2hhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2VhcmNoYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5tZXRhLnJlZmVyZW5jZS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlTWV0YS5vcHRpb25zLnB1c2goeyBpZDogci5uYW1lLCBsYWJlbDogci5sYWJlbCB8fCByLm5hbWUgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1NlYXJjaGFibGUgPSB0eXBlb2YgKHRoaXMubWV0YS5yZWZlcmVuY2Uuc2VhcmNoYWJsZSkgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMubWV0YS5yZWZlcmVuY2Uuc2VhcmNoYWJsZTtcbiAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlID0gdGhpcy5tZXRhLnJlZmVyZW5jZTtcbiAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlc1Njb3BlID0gdGhpcy5tZXRhLnJlZmVyZW5jZS5uYW1lIHx8IHRoaXMubWV0YS5yZWZlcmVuY2UucmVzb3VyY2VUeXBlO1xuICAgICAgdGhpcy5pc0NyZWF0YWJsZSA9IHRoaXMubWV0YS5yZWZlcmVuY2UuY3JlYXRhYmxlO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkUGxhY2Vob2xkZXJMYWJlbCgpO1xuICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZWQucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2VhcmNoKCk7XG4gICAgfSk7XG4gICAgY29uc3Qgb3JpZ1ZhbHVlID0gdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdO1xuXG4gICAgLy8gdGhpcy5zdWdnZXN0aW9ucyA9IHRoaXMubWV0YS5zdWdnZXN0aW9uczsgLy8gVE9ETyBmaWx0ZXIgYnkgZGVmYXVsdCB0eXBlXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMuc3VnZ2VzdGlvbnMnLCB0aGlzLnN1Z2dlc3Rpb25zKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnBhcmVudCwgdGhpcy5tZXRhLm5hbWUsIHtcbiAgICAgIHNldDogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodikgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlkOiB2LFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHYsXG4gICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm1ldGEucmVmZXJlbmNlLm5hbWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICBsYWJlbDogdmFsdWUsIC8vIGNvdWxkIGJlIGZvdW5kIHdpdGggZXh0cmEgY2FsbFxuICAgICAgICAgICAgICB0eXBlOiB0aGlzLm1ldGEucmVmZXJlbmNlLm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlID8gKCghdmFsdWUubGFiZWwgfHwgdmFsdWUubGFiZWwgPT09ICcgJykgPyBgTi9BICgke3ZhbHVlLnR5cGV9IyR7dmFsdWUuaWR9KWAgOiB2YWx1ZS5sYWJlbCB8fCB2YWx1ZSkgOiAnJztcbiAgICAgICAgICAvLyBpZiAodGhpcy5pc1BvbHltb3JwaGljICYmIHRoaXMubW9kZWwpIHsgLy9UT0RPIHNob3cgb3Igbm90P1xuICAgICAgICAgIC8vICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUgPSB0aGlzLm1ldGEucmVmZXJlbmNlLmZpbmQoKHJ0KT0+IHtcbiAgICAgICAgICAvLyAgICAgcmV0dXJuIHJ0Lm5hbWUgPT09IHRoaXMubW9kZWwudHlwZTtcbiAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5idWlsZEV4dGVybmFsTGluaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0YS4kb3B0aW9uYWwgPSB0aGlzLmlzT3B0aW9uYWw7XG4gICAgICB9LFxuICAgICAgZ2V0OiAoKSA9PiB0aGlzLnZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdGhpcy5zZW5kVG9TZXJ2ZXIsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBpZiAob3JpZ1ZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPSBvcmlnVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlZmF1bHQgJiYgIXRoaXMubW9kZWwpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZHYgb2YgdGhpcy5kZWZhdWx0KSB7XG4gICAgICAgICAgICBpZiAoKGR2LmlkIHx8IGR2LnZhbHVlKSAmJiBkdi50eXBlKSB7XG4gICAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogZHYuaWQgfHwgZHYudmFsdWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGR2LmxhYmVsIHx8IGR2LmlkIHx8IGR2LnZhbHVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IGR2LnR5cGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdC5pZCAmJiB0aGlzLmRlZmF1bHQubGFiZWwgJiYgdGhpcy5kZWZhdWx0LnR5cGUpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuZGVmYXVsdC5pZCxcbiAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuZGVmYXVsdC5sYWJlbCxcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy5kZWZhdWx0LnR5cGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCchISFkZWZhdWx0IHZhbHVlIGlzIG5vdCB2YWxpZCBmb3JtYXQnLCB0aGlzLm1ldGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZih0aGlzLm1ldGEuZGlzYWJsZWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YodGhpcy5tZXRhLmRpc2FibGVkKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIE9iamVjdC5rZXlzKHRoaXMubWV0YS5kaXNhYmxlZCkpIHtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHAuc3BsaXQoJy4nKTtcbiAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLnBhcmVudFtwcm9wc1swXV0pICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICAgIHZhbCA9IHZhbFtwcm9wXTtcbiAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gdGhpcy5tZXRhLmRpc2FibGVkW3BdKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9naWNhbERpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnBhcmVudENoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KHByb3BzWzBdKSkge1xuICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHZhbFtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWwgPT09IHRoaXMubWV0YS5kaXNhYmxlZFtwXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9naWNhbERpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9naWNhbERpc2FibGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXRhLnNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5tZXRhLnNlYXJjaC5wYXJhbXM7XG4gICAgICBpZiAoc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFyIG9mIE9iamVjdC5rZXlzKHNlYXJjaFBhcmFtcykpIHtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHNlYXJjaFBhcmFtc1twYXJdLnNwbGl0KCcjJyk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBwcm9wc1swXTtcbiAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbMV07XG4gICAgICAgICAgbGV0IHBhclZhbHVlID0gdGhpcy5wYXJlbnRbZmllbGRdO1xuICAgICAgICAgIGlmIChwYXJWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgcGFyVmFsdWUgPSBwYXJWYWx1ZVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJWYWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgcGFyYW1zW3Bhcl0gPSBwYXJWYWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTdWdnZXN0aW9ucyhwYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnBhcmVudENoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICAgICAgICBpZiAodmFsdWVbZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlW2ZpZWxkXSA9IHZhbHVlW2ZpZWxkXVtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICAgICAgICAgICAgcGFyYW1zW3Bhcl0gPSB2YWx1ZVtmaWVsZF07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTdWdnZXN0aW9ucyhwYXJhbXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbGVhclNlYXJjaFJlc291cmNlVHlwZSgpIHtcbiAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZSA9IHt9O1xuICAgIHRoaXMub25TZWFyY2hSZXNvdXJjZVR5cGVDaGFuZ2VkKCk7XG4gIH1cblxuICBvblNlYXJjaFJlc291cmNlVHlwZUNoYW5nZWQocmVzb3VyY2VUeXBlPykge1xuICAgIGlmICghcmVzb3VyY2VUeXBlIHx8ICFyZXNvdXJjZVR5cGUuaWQpIHtcbiAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSA9IG51bGw7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZSA9ICh0aGlzLm1ldGEucmVmZXJlbmNlIHx8IFtdKS5tYXAocnQgPT4gcnQubmFtZSkuam9pbignLCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGUuaWQ7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZSA9IHJlc291cmNlVHlwZS5pZDtcbiAgICB9XG4gICAgdGhpcy5idWlsZFBsYWNlaG9sZGVyTGFiZWwoKTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgaWYgKCF0aGlzLm1vZGVsICYmICF0aGlzLnNlYXJjaFRleHQpIHsgLy8gZmlsdGVyIHN1Z2dlc3Rpb25zIGJ5IHR5cGVcbiAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9ICFyZXNvdXJjZVR5cGUgPyAodGhpcy5tZXRhLnN1Z2dlc3Rpb25zIHx8IFtdKSA6ICh0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmZpbHRlcihcbiAgICAgICAgKHMpID0+IHMudHlwZSA9PT0gcmVzb3VyY2VUeXBlLmlkXG4gICAgICApO1xuICAgIH0gZWxzZSB7IC8vIHJlZ3VsYXIgc2VhcmNoIChyZXR1cm4gc2NvcGVkIHJlc3VsdHMpXG4gICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hSZXN1bHRzICYmIHJlc291cmNlVHlwZSkge1xuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSB0aGlzLnNlYXJjaFJlc3VsdHMuZmlsdGVyKChzKSA9PiBzLnR5cGUgPT09IHJlc291cmNlVHlwZS5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnNlYXJjaEVycm9yO1xuICB9XG5cbiAgb25TZWFyY2hUZXh0Q2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlZC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG4gICAgLy8gdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXg7XG4gICAgaWYgKCF0aGlzLnNlYXJjaFRleHQgfHwgdGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICBkZWxldGUgdGhpcy5zZWFyY2hSZXN1bHRzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93U2VhcmNocmVzdWx0cyA9IChyZXN1bHRzKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoRXJyb3I7XG4gICAgICBpZiAoIXJlc3VsdHMgfHwgIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1ldGEuYWNjZXB0TmV3ICYmIHRoaXMubWV0YS5hY2NlcHROZXcudHlwZSAmJiB0aGlzLm1ldGEuYWNjZXB0TmV3LnBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHRoaXMubWV0YS5hY2NlcHROZXcucGF0dGVybik7XG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMuc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICByZXN1bHRzLnVuc2hpZnQoeyBpZDogbnVsbCwgbGFiZWw6IHRoaXMuc2VhcmNoVGV4dCwgdHlwZTogdGhpcy5tZXRhLmFjY2VwdE5ldy50eXBlIH0pIDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gcmVzdWx0cy5tYXAoKHIpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBhcnJvdy1ib2R5LXN0eWxlXG4gICAgICAgIHJldHVybiB7IGlkOiByLmlkLCBsYWJlbDogci5sYWJlbCwgdHlwZTogci50eXBlIHx8IHIucmVzb3VyY2VUeXBlIHx8IHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLm5hbWUsIGV4dGVybmFsTGluazogci5leHRlcm5hbExpbmsgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCEvVmx0LWRyb3Bkb3duLS1leHBhbmRlZC8udGVzdCh0aGlzLmRyb3Bkb3duLmNsYXNzTmFtZSkpIHtcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlYXJjaFJlc3VsdHMubGVuZ3RoICYmICF0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IDA7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodGhpcy5tZXRhLnNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5tZXRhLnNlYXJjaC5wYXJhbXMgfHwge307XG4gICAgICBsZXQgc2VhcmNoVXJsID0gYC9maWVsZHMvJHt0aGlzLm1ldGEubmFtZX0vc2VhcmNoYDtcbiAgICAgIGlmICh0aGlzLm1ldGEuc2VhcmNoLnVybCkge1xuICAgICAgICBzZWFyY2hVcmwgPSB0aGlzLm1ldGEuc2VhcmNoLnVybC5yZXBsYWNlKC9cXCR7XFxzKihbXFx3XFwuXSspXFxzKn0vZywgKG1hdGNoLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2VhcmNoUGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHNlYXJjaFBhcmFtc1trZXldO1xuICAgICAgICAgICAgZGVsZXRlIHNlYXJjaFBhcmFtc1trZXldO1xuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcCBvZiBPYmplY3Qua2V5cyhzZWFyY2hQYXJhbXMpKSB7XG4gICAgICAgIHNlYXJjaFVybCArPSBgJHtzZWFyY2hVcmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJ30ke2VuY29kZVVSSUNvbXBvbmVudChwKX09JHtlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoUGFyYW1zW3BdKX1gO1xuICAgICAgfVxuICAgICAgc2VhcmNoVXJsICs9IGAke3NlYXJjaFVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnfXE9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5zZWFyY2hUZXh0KX1gO1xuICAgICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZ2V0QnlQYXRoKHNlYXJjaFVybCkuc3Vic2NyaWJlKChyZXN1bHRzKSA9PiB7XG4gICAgICAgIHNob3dTZWFyY2hyZXN1bHRzKHJlc3VsdHMpO1xuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuc2VhcmNoRXJyb3IgPSBlcnJvci5lcnJvciA/IGVycm9yLmVycm9yLm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgOiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgICAgICBpZiAoIS9WbHQtZHJvcGRvd24tLWV4cGFuZGVkLy50ZXN0KHRoaXMuZHJvcGRvd24uY2xhc3NOYW1lKSkge1xuICAgICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudnIpIHtcbiAgICAgICAgdGhpcy52ciA9IHRoaXMubWV0YVJlc291cmNlLm5ldyh7XG4gICAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnZyLnNlYXJjaEludGVncmF0aW9uKFxuICAgICAgICB0aGlzLnNlYXJjaFRleHQsXG4gICAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLm5hbWUgfHwgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGVcbiAgICAgICkuc3Vic2NyaWJlKChyZXN1bHRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgIHNob3dTZWFyY2hyZXN1bHRzKHJlc3VsdHMpO1xuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaEVycm9yID0gZXJyb3IuZXJyb3IgPyBlcnJvci5lcnJvci5tZXNzYWdlIHx8IGVycm9yLmVycm9yIDogZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICAgICAgaWYgKCEvVmx0LWRyb3Bkb3duLS1leHBhbmRlZC8udGVzdCh0aGlzLmRyb3Bkb3duLmNsYXNzTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkFjdGl2YXRlZChldikge1xuICAgIC8vIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pbnB1dCA9IGV2LnNyY0VsZW1lbnQ7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duKSB7XG4gICAgICAvLyB0aGlzLmRyb3Bkb3duID0gZXYuc3JjRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICB0aGlzLmRyb3Bkb3duID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRyb3Bkb3duLXdyYXBwZXInKTtcbiAgICB9XG4gICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgfVxuXG4gIG9uQmx1cihldikge1xuICAgIGxldCBpbnRlcm5hbENvbnRyb2wgPSBmYWxzZTtcbiAgICBpZiAoZXYucmVsYXRlZFRhcmdldCkge1xuICAgICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldi5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICB0aGlzLmRpc21pc3NEcm9wZG93bigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxDb250cm9sID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMua2V5TGlzdGVuZXJBY3RpdmUgJiYgIWludGVybmFsQ29udHJvbCkge1xuICAgICAgdGhpcy5pbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMua2V5TGlzdGVuZXJBY3RpdmUpIHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2tvdXQpO1xuICAgICAgICB9XG4gICAgICB9LCA0MDApO1xuICAgICAgZGVsZXRlIHRoaXMua2V5TGlzdGVuZXJBY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlU2VsZWN0aW9uKCkge1xuICAgIHRoaXMubWV0YVRyYWNrZXIuZW1pdCh0aGlzLmJ1aWxkVHJhY2tFdmVudCgnUkVNT1ZFJykpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIG9uU3VnZ2VzdGlvblNlbGVjdChldiwgc3VnZ2VzdGlvbikge1xuICAgIGlmICghc3VnZ2VzdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQoJ1NFTEVDVCcpKTtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgIH1cbiAgICAgIGxldCBleGlzdGluZ0VudHJ5O1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLm1vZGVsKSB7XG4gICAgICAgIGlmIChzdWdnZXN0aW9uLmlkICYmIChlbnRyeS5pZCA9PT0gc3VnZ2VzdGlvbi5pZCkpIHtcbiAgICAgICAgICBleGlzdGluZ0VudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoc3VnZ2VzdGlvbi5sYWJlbCA9PT0gZW50cnkubGFiZWwpIHsgLy8gY3JlYXRlIG5ldyAoZ29vZ2xlIGVtYWlscylcbiAgICAgICAgICBleGlzdGluZ0VudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXhpc3RpbmdFbnRyeSkge1xuICAgICAgICB0aGlzLm1vZGVsLnB1c2goc3VnZ2VzdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5tb2RlbCk7XG4gICAgICBkZWxldGUgdGhpcy5zZWFyY2hUZXh0O1xuICAgICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlZC5uZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kZWwgPSBzdWdnZXN0aW9uO1xuICAgICAgdGhpcy5leHRlcm5hbExpbmsgPSBzdWdnZXN0aW9uLmV4dGVybmFsTGluaztcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZShzdWdnZXN0aW9uKTtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHN1Z2dlc3Rpb24ubGFiZWw7XG4gICAgfVxuICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgLy8gaWYgKHRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgIC8vICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUgPSB0aGlzLm1ldGEucmVmZXJlbmNlLmZpbmQoKHJ0KT0+IHtcbiAgICAvLyAgICAgcmV0dXJuIHJ0Lm5hbWUgPT09IHN1Z2dlc3Rpb24udHlwZTtcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIHNob3dEcm9wZG93bigpIHtcbiAgICB0aGlzLmRyb3Bkb3duVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5kcm9wZG93bi5jbGFzc0xpc3QuYWRkKCdWbHQtZHJvcGRvd24tLWV4cGFuZGVkJyk7XG4gICAgaWYgKCF0aGlzLmtleUxpc3RlbmVyQWN0aXZlKSB7XG4gICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd24pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja291dCk7XG4gICAgICB9LCAyMDApO1xuICAgICAgdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSA9IHRydWU7XG4gICAgICBpZiAodGhpcy5zZWFyY2hSZXN1bHRzICYmIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSkge1xuICAgICAgICBmb3IgKGxldCBzdWdnZXN0aW9uSW5kZXggPSAwOyBzdWdnZXN0aW9uSW5kZXggPCAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkubGVuZ3RoOyBzdWdnZXN0aW9uSW5kZXgrKykge1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPT09ICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zIHx8IFtdKVtzdWdnZXN0aW9uSW5kZXhdKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IHN1Z2dlc3Rpb25JbmRleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVuc3VyZURyb3Bkb3duSXNWaXNpYmxlKCk7XG4gIH1cblxuICBkaXNtaXNzRHJvcGRvd24oZXZlbnQ/KSB7XG4gICAgdGhpcy5kcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMucHJldk1vZGVsID0gdGhpcy5tb2RlbDtcbiAgICBkZWxldGUgdGhpcy5zZWFyY2hUZXh0O1xuICAgIGRlbGV0ZSB0aGlzLnNlYXJjaFJlc3VsdHM7XG4gICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgIHRoaXMub25TZWFyY2hUZXh0Q2hhbmdlZCh0aGlzLnNlYXJjaFRleHQpO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIHJldmVydCgpIHtcbiAgICB0aGlzLm1vZGVsID0gdGhpcy5wcmV2TW9kZWw7XG4gICAgZGVsZXRlIHRoaXMucHJldk1vZGVsO1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLm1vZGVsKTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICByZW1vdmUoZXYsIGl0ZW0pIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IG9wdGlvbkluZGV4ID0gdGhpcy5tb2RlbC5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChvcHRpb25JbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMubW9kZWwuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICAgIGlmICghdGhpcy5tb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5SZXNvdXJjZShtb2RlbD8pIHtcbiAgICB0aGlzLmtleUxpc3RlbmVyQWN0aXZlID0gdHJ1ZTsgLy8gc3VwcHJlc3MgZHJvcGRvd24gaW4gdGhpcyBjYXNlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRpc21pc3NEcm9wZG93bigpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlZkRpYWxvZ0ZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShNZXRhUmVmRGlhbG9nKTtcbiAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQobW9kZWwgPyAnRURJVCcgOiAnTkVXJykpO1xuICAgIGxldCB0aGVtZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRhdGFzZXQudGhlbWU7XG4gICAgaWYgKCF0aGVtZSB8fCB0aGVtZSA9PT0gJ2luaGVyaXQnKSB7XG4gICAgICBsZXQgcGFyZW50Q29tcG9uZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgndmdpcC1tZXRhLWxheW91dCcpO1xuICAgICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgICB0aGVtZSA9IHBhcmVudENvbXBvbmVudC5kYXRhc2V0LnRoZW1lO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGVtZSB8fCB0aGVtZSA9PT0gJ2luaGVyaXQnKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3ZnaXAtbWV0YS1yZXNvdXJjZScpO1xuICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICAgICAgdGhlbWUgPSBwYXJlbnRDb21wb25lbnQuZGF0YXNldC50aGVtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZmVyZW5jZVNlcnZpY2Uub3BlbkRpYWxvZyhcbiAgICAgIHJlZkRpYWxvZ0ZhY3RvcnksIHRoaXMubWV0YVJlc291cmNlLCB0aGlzLmludGVncmF0aW9uQ29kZSwgdGhpcy5tZXRhLnJlZmVyZW5jZSwgbW9kZWwsIG51bGwsIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSxcbiAgICAgIHRoZW1lXG4gICAgKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IHJlc3VsdDtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTdWdnZXN0aW9uID0gKHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkuZmluZCgocykgPT4gKHMuaWQgPT09IHJlc3VsdC5pZCAmJiBzLnR5cGUgPT09IHJlc3VsdC50eXBlKSk7XG4gICAgICAgIGlmIChleGlzdGluZ1N1Z2dlc3Rpb24pIHtcbiAgICAgICAgICBleGlzdGluZ1N1Z2dlc3Rpb24ubGFiZWwgPSByZXN1bHQubGFiZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF0aGlzLm1ldGEuc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YS5zdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMudW5zaGlmdChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0YVRyYWNrZXIuZW1pdCh0aGlzLmJ1aWxkVHJhY2tFdmVudChtb2RlbCA/ICdVUERBVEUnIDogJ0NSRUFURScsIHJlc3VsdC50eXBlIHx8IHJlc3VsdC5yZXNvdXJjZVR5cGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWV0YVRyYWNrZXIuZW1pdCh0aGlzLmJ1aWxkVHJhY2tFdmVudChtb2RlbCA/ICdDQU5DRUxfRURJVCcgOiAnQ0FOQ0VMX1VQREFURScpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlRHJvcGRvd25Jc1Zpc2libGUoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBob2xkZXIgPSB0aGlzLmRyb3Bkb3duLmNsb3Nlc3QoJy5WbHQtY2FyZF9fY29udGVudCcpO1xuICAgICAgaWYgKGhvbGRlcikge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5WbHQtZHJvcGRvd25fX3BhbmVsJyk7XG4gICAgICAgIGNvbnN0IGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBob2xkZXJSZWN0ID0gaG9sZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoaG9sZGVyUmVjdC50b3AgKyBob2xkZXJSZWN0LmhlaWdodCA8IGVsUmVjdC50b3AgKyBlbFJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCA0MDApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVEcm9wZG93bk9wdGlvbklzVmlzaWJsZSgpIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIgPSB0aGlzLmRyb3Bkb3duLnF1ZXJ5U2VsZWN0b3IoJy5WbHQtZHJvcGRvd25fX3Njcm9sbCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kcm9wZG93blNjcm9sbENvbnRhaW5lciAmJiB0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IDQ0ICogdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXg7XG4gICAgICBjb25zdCBzY3JvbGxCb3R0b20gPSA0NCAqICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCAtIDcpO1xuICAgICAgaWYgKHNjcm9sbFRvcCA8IHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgfSBlbHNlIGlmIChzY3JvbGxCb3R0b20gPiB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbEJvdHRvbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsaWNrb3V0ID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgaW50ZXJuYWxDb250cm9sID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcbiAgICBpZiAoaW50ZXJuYWxDb250cm9sICYmIFsnVmx0LWRyb3Bkb3duX19saW5rJywgJ1ZsdC1kcm9wZG93bl9fYmxvY2snXS5pbmRleE9mKGV2ZW50LnRhcmdldC5jbGFzc05hbWUpICE9PSAtMSApIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKCFpbnRlcm5hbENvbnRyb2wgJiYgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmlucHV0ICYmIGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT09ICdWbHQtZHJvcGRvd25fX3RpdGxlJykge1xuICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpbnRlcm5hbENvbnRyb2wgJiYgaW50ZXJuYWxDb250cm9sLnRhZ05hbWUgIT09ICdJTlBVVCcpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGJ1aWxkVHJhY2tFdmVudChhY3Rpb246IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBlOiBJTWV0YVRyYWNrZXJFdmVudCA9IHtcbiAgICAgIGludGVncmF0aW9uOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgIHJlc291cmNlOiB0aGlzLm1vZGVsID8gKHRoaXMubW9kZWwudHlwZSB8fCB0aGlzLm1vZGVsLnJlc291cmNlVHlwZSkgOiB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUsXG4gICAgICBmaWVsZDogdGhpcy5tZXRhLm5hbWUsXG4gICAgICBhY3Rpb25cbiAgICB9O1xuICAgIGlmICh0aGlzLm1ldGEuJGlzQ29udGFjdGFibGUpIHtcbiAgICAgIGUuaXNDb250YWN0YWJsZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQbGFjZWhvbGRlckxhYmVsKCkge1xuICAgIHRoaXMucGxhY2VIb2xkZXJMYWJlbCA9IHRoaXMubWV0YS5sYWJlbDtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiAhdGhpcy5pc1BvbHltb3JwaGljKSB7XG4gICAgICB0aGlzLnBsYWNlSG9sZGVyTGFiZWwgPSAnK0FkZCAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYWNlSG9sZGVyTGFiZWwgPSAodGhpcy5pc1NlYXJjaGFibGUgJiYgKHRoaXMubXVsdGlwbGUgfHwgIXRoaXMuaXNQb2x5bW9ycGhpYykpID8gJ1NlYXJjaCAnIDogJyc7XG4gICAgfVxuICAgIHRoaXMucGxhY2VIb2xkZXJMYWJlbCArPSB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgPyB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgOiB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZTtcbiAgfVxuXG4gIHByaXZhdGUga2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgrKztcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPj0gKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuc3VyZURyb3Bkb3duT3B0aW9uSXNWaXNpYmxlKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0Fycm93VXAnOiB7XG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9ICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zIHx8IFtdKS5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4LS07XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkubGVuZ3RoIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnN1cmVEcm9wZG93bk9wdGlvbklzVmlzaWJsZSgpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdTcGFjZSc6XG4gICAgICBjYXNlICdFbnRlcic6IHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3QoZXZlbnQsICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zIHx8IFtdKVt0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleF0pO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzoge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgYnVpbGRFeHRlcm5hbExpbmsoKSB7XG4gICAgaWYgKHRoaXMubW9kZWwpIHtcbiAgICAgIGlmICh0aGlzLm1vZGVsLmV4dGVybmFsTGluaykge1xuICAgICAgICB0aGlzLmV4dGVybmFsTGluayA9IHRoaXMubW9kZWwuZXh0ZXJuYWxMaW5rO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1ldGFDb250ZXh0LnByb2ZpbGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmV4dGVybmFsTGluaztcbiAgICAgICAgdGhpcy5tZXRhTXNnU2VydmljZS5zZW5kTWVzc2FnZShcbiAgICAgICAgICB0aGlzLmludGVncmF0aW9uQ29kZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2J1aWxkRXh0ZXJuYWxMaW5rJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uQ29kZTogdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICAgICAgICByZWY6IHRoaXMubW9kZWwsXG4gICAgICAgICAgICBwcm9maWxlOiB0aGlzLm1ldGFDb250ZXh0LnByb2ZpbGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlLnRvVXBwZXJDYXNlKCldXG4gICAgICAgICAgfSxcbiAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5leHRlcm5hbExpbmsgPSByZXNwb25zZS5leHRlcm5hbExpbms7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGV4dGVybmFsIGxpbmsgc3VwcG9ydCBmb3InLCB0aGlzLmludGVncmF0aW9uQ29kZSwgdGhpcy5tb2RlbC5yZXNvdXJjZVR5cGUgfHwgdGhpcy5tb2RlbC50eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmV4dGVybmFsTGluaztcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgY29uc3Qgc3VwZXJEaXNhYmxlZCA9IHRoaXMubG9naWNhbERpc2FibGVkIHx8IHRoaXMudmFsaWRhdGlvbnMuZGlzYWJsZWQgfHwgdGhpcy5tZXRhLmRpc2FibGVkID09PSB0cnVlXG4gICAgICB8fCAodGhpcy5tZXRhLnVwZGF0YWJsZSA9PT0gZmFsc2UgJiYgdGhpcy5pc1BlcnNpc3RlZFBhcmVudCk7XG4gICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVNZXRhLmRpc2FibGVkID0gc3VwZXJEaXNhYmxlZDtcbiAgICByZXR1cm4gc3VwZXJEaXNhYmxlZDtcbiAgfVxuXG4gIGdldCBzaG93VHlwZXMoKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgKHRoaXMubWV0YS5zaG93VHlwZXMpICE9PSAndW5kZWZpbmVkJykgPyB0aGlzLm1ldGEuc2hvd1R5cGVzIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBzdWdnZXN0aW9ucygpIHtcbiAgICByZXR1cm4gIXRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSA/XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYXJyb3ctYm9keS1zdHlsZVxuICAgICAgKHRoaXMuYXN5bmNTdWdnZXN0aW9ucyB8fCB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pIDogKHRoaXMuYXN5bmNTdWdnZXN0aW9ucyB8fCB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmZpbHRlcigocykgPT4ge1xuICAgICAgcmV0dXJuIHMudHlwZSA9PT0gdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGhhc0FwcGVuZEJ1dHRvbigpIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5tb2RlbCkge1xuICAgICAgaWYgKHRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzLm1ldGEucmVmZXJlbmNlKSB7XG4gICAgICAgICAgaWYgKChyZWYubmFtZSB8fCByZWYucmVzb3VyY2VUeXBlKSA9PT0gKHRoaXMubW9kZWwudHlwZSB8fCB0aGlzLm1vZGVsLnJlc291cmNlVHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWYudXBkYXRhYmxlICE9PSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGEucmVmZXJlbmNlLnVwZGF0YWJsZSAhPT0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm1ldGEucmVmZXJlbmNlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZSA9IHRoaXMubWV0YS5yZWZlcmVuY2UubWFwKHJ0ID0+IHJ0Lm5hbWUpLmpvaW4oJywnKTtcbiAgICAgIC8vIH0sIDApO1xuICAgICAgZm9yIChjb25zdCBydCBvZiB0aGlzLm1ldGEucmVmZXJlbmNlKSB7XG4gICAgICAgIGlmIChydC5jcmVhdGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhLnJlZmVyZW5jZS5jcmVhdGFibGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWdnZXN0aW9ucyhwYXJhbXM/KSB7XG4gICAgbGV0IHNlYXJjaFVybCA9IGAvc3VnZ2VzdGlvbnMvJHt0aGlzLm1ldGEubmFtZX0vc2VhcmNoYDtcbiAgICBpZiAodGhpcy5tZXRhLnNlYXJjaCkge1xuICAgICAgaWYgKHRoaXMubWV0YS5zZWFyY2gudXJsKSB7XG4gICAgICAgIHNlYXJjaFVybCA9IHRoaXMubWV0YS5zZWFyY2gudXJsLnJlcGxhY2UoL1xcJHtcXHMqKFtcXHdcXC5dKylcXHMqfS9nLCAobWF0Y2gsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zW2tleV07XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwIG9mIE9iamVjdC5rZXlzKHBhcmFtcykpIHtcbiAgICAgICAgc2VhcmNoVXJsICs9IGAke3NlYXJjaFVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnfSR7ZW5jb2RlVVJJQ29tcG9uZW50KHApfT0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXNbcF0pfWA7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG4gICAgICB0aGlzLnJlc291cmNlU2VydmljZS5nZXRCeVBhdGgoc2VhcmNoVXJsKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zZWFyY2hpbmc7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBsZXQgc3VnZ2VzdGlvbnM7XG4gICAgICAgICAgc3VnZ2VzdGlvbnMgPSByZXN1bHQ7XG4gICAgICAgICAgaWYgKHRoaXMubWV0YS5zZWFyY2guZXh0cmFjdCkge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbnMgPSByZXN1bHRbdGhpcy5tZXRhLnNlYXJjaC5leHRyYWN0XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zIGluc3RhbmNlb2YgQXJyYXkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gW3N1Z2dlc3Rpb25zXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXN5bmNTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICAgIHN1Z2dlc3Rpb25zLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgIGlmIChzICYmIHMuaWQgJiYgcy50eXBlKSB7IC8vIFRPT0QgY2hlY2sgdGhlIHR5cGUgaXMgYWNjZXB0YWJsZVxuICAgICAgICAgICAgICBhc3luY1N1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBzLmlkLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzLmxhYmVsIHx8IGAke3MudHlwZX0jJHtzLmlkfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogcy50eXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChhc3luY1N1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGFzeW5jU3VnZ2VzdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IGFzeW5jU3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hc3luY1N1Z2dlc3Rpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFzeW5jU3VnZ2VzdGlvbnMgPSBhc3luY1N1Z2dlc3Rpb25zO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZXNvdXJjZVNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2UpIHtcbiAgICAgIGNvbnN0IG1ldGFSZXNvdXJjZUNvbmZpZzogSU1ldGFSZXNvdXJjZUNvbmZpZyA9IHtcbiAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiB0aGlzLnJlc291cmNlVHlwZVxuICAgICAgfTtcbiAgICAgIHRoaXMubWV0YVJlc291cmNlU2VydmljZSA9IHRoaXMubWV0YVJlc291cmNlLm5ldyhtZXRhUmVzb3VyY2VDb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhUmVzb3VyY2VTZXJ2aWNlO1xuICB9XG59XG4iXX0=