@rosoftlab/core 0.0.100

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. package/README.md +6 -0
  2. package/esm2020/lib/base-components/base-form-edit.component.mjs +242 -0
  3. package/esm2020/lib/base-components/field-error-display/field-error-display.component.mjs +15 -0
  4. package/esm2020/lib/base-components/generic-table/generic-table.component.mjs +431 -0
  5. package/esm2020/lib/base-components/index.mjs +5 -0
  6. package/esm2020/lib/base-components/page-not-found/page-not-found.component.mjs +15 -0
  7. package/esm2020/lib/base-components/searchable-dropdown/searchable-dropdown.component.mjs +231 -0
  8. package/esm2020/lib/base-components/under-construction/under-construction.component.mjs +12 -0
  9. package/esm2020/lib/constants/symbols.mjs +3 -0
  10. package/esm2020/lib/converters/date/date.converter.mjs +12 -0
  11. package/esm2020/lib/decorators/attribute.decorator.mjs +85 -0
  12. package/esm2020/lib/decorators/base-datastore-config.decorator.mjs +7 -0
  13. package/esm2020/lib/decorators/base-model-config.decorator.mjs +10 -0
  14. package/esm2020/lib/decorators/custom.type.decorator.mjs +11 -0
  15. package/esm2020/lib/decorators/grid-layout.decorator.mjs +23 -0
  16. package/esm2020/lib/directives/translated-content.directive.mjs +96 -0
  17. package/esm2020/lib/directives/translated-element.directive.mjs +20 -0
  18. package/esm2020/lib/index.mjs +29 -0
  19. package/esm2020/lib/interfaces/attribute-decorator-options.interface.mjs +2 -0
  20. package/esm2020/lib/interfaces/datastore-config.interface.mjs +2 -0
  21. package/esm2020/lib/interfaces/model-config.interface.mjs +2 -0
  22. package/esm2020/lib/interfaces/overrides.interface.mjs +2 -0
  23. package/esm2020/lib/interfaces/property-converter.interface.mjs +2 -0
  24. package/esm2020/lib/material.mjs +94 -0
  25. package/esm2020/lib/models/base-meta.model.mjs +7 -0
  26. package/esm2020/lib/models/base-query-data.mjs +13 -0
  27. package/esm2020/lib/models/base.model.mjs +171 -0
  28. package/esm2020/lib/models/error-response.model.mjs +9 -0
  29. package/esm2020/lib/models/grid-layout-format.enum.mjs +15 -0
  30. package/esm2020/lib/models/grid-layout.mjs +18 -0
  31. package/esm2020/lib/models/rule.mjs +6 -0
  32. package/esm2020/lib/module.mjs +55 -0
  33. package/esm2020/lib/pipes/Nl2brPipe.pipe.mjs +21 -0
  34. package/esm2020/lib/pipes/input-error.pipe.mjs +37 -0
  35. package/esm2020/lib/providers.mjs +10 -0
  36. package/esm2020/lib/services/base-datastore.service.mjs +333 -0
  37. package/esm2020/lib/services/base.service.mjs +95 -0
  38. package/esm2020/lib/services/dialog.service.mjs +150 -0
  39. package/esm2020/lib/services/grid-layout.service.mjs +21 -0
  40. package/esm2020/lib/services/index.mjs +5 -0
  41. package/esm2020/lib/validators/pattern-validator.mjs +15 -0
  42. package/esm2020/public-api.mjs +12 -0
  43. package/esm2020/rosoftlab-core.mjs +5 -0
  44. package/fesm2015/rosoftlab-core.mjs +2217 -0
  45. package/fesm2015/rosoftlab-core.mjs.map +1 -0
  46. package/fesm2020/rosoftlab-core.mjs +2210 -0
  47. package/fesm2020/rosoftlab-core.mjs.map +1 -0
  48. package/lib/base-components/base-form-edit.component.d.ts +58 -0
  49. package/lib/base-components/field-error-display/field-error-display.component.d.ts +7 -0
  50. package/lib/base-components/generic-table/generic-table.component.d.ts +93 -0
  51. package/lib/base-components/index.d.ts +4 -0
  52. package/lib/base-components/page-not-found/page-not-found.component.d.ts +8 -0
  53. package/lib/base-components/searchable-dropdown/searchable-dropdown.component.d.ts +62 -0
  54. package/lib/base-components/under-construction/under-construction.component.d.ts +6 -0
  55. package/lib/constants/symbols.d.ts +1 -0
  56. package/lib/converters/date/date.converter.d.ts +5 -0
  57. package/lib/decorators/attribute.decorator.d.ts +2 -0
  58. package/lib/decorators/base-datastore-config.decorator.d.ts +1 -0
  59. package/lib/decorators/base-model-config.decorator.d.ts +1 -0
  60. package/lib/decorators/custom.type.decorator.d.ts +1 -0
  61. package/lib/decorators/grid-layout.decorator.d.ts +2 -0
  62. package/lib/directives/translated-content.directive.d.ts +21 -0
  63. package/lib/directives/translated-element.directive.d.ts +10 -0
  64. package/lib/index.d.ts +27 -0
  65. package/lib/interfaces/attribute-decorator-options.interface.d.ts +8 -0
  66. package/lib/interfaces/datastore-config.interface.d.ts +8 -0
  67. package/lib/interfaces/model-config.interface.d.ts +8 -0
  68. package/lib/interfaces/overrides.interface.d.ts +5 -0
  69. package/lib/interfaces/property-converter.interface.d.ts +4 -0
  70. package/lib/material.d.ts +42 -0
  71. package/lib/models/base-meta.model.d.ts +5 -0
  72. package/lib/models/base-query-data.d.ts +7 -0
  73. package/lib/models/base.model.d.ts +33 -0
  74. package/lib/models/error-response.model.d.ts +17 -0
  75. package/lib/models/grid-layout-format.enum.d.ts +12 -0
  76. package/lib/models/grid-layout.d.ts +13 -0
  77. package/lib/models/rule.d.ts +5 -0
  78. package/lib/module.d.ts +14 -0
  79. package/lib/pipes/Nl2brPipe.pipe.d.ts +7 -0
  80. package/lib/pipes/input-error.pipe.d.ts +10 -0
  81. package/lib/providers.d.ts +2 -0
  82. package/lib/services/base-datastore.service.d.ts +45 -0
  83. package/lib/services/base.service.d.ts +26 -0
  84. package/lib/services/dialog.service.d.ts +21 -0
  85. package/lib/services/grid-layout.service.d.ts +9 -0
  86. package/lib/services/index.d.ts +4 -0
  87. package/lib/validators/pattern-validator.d.ts +4 -0
  88. package/package.json +53 -0
  89. package/public-api.d.ts +7 -0
  90. package/rosoftlab-core.d.ts +5 -0
@@ -0,0 +1,37 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@ngx-translate/core";
4
+ export class InputErrorPipe {
5
+ constructor(translate) {
6
+ this.translate = translate;
7
+ }
8
+ transform(value, filedTranslationKey) {
9
+ let rvalue = '';
10
+ if (value !== null) {
11
+ if (value['invalid'] === true) {
12
+ rvalue = 'ERROR.INVALID';
13
+ }
14
+ if (value['mustMatch'] === true) {
15
+ rvalue = 'Account.Password.MustMach';
16
+ }
17
+ if (value['required'] === true) {
18
+ const field = this.translate.instant(filedTranslationKey.field);
19
+ rvalue = this.translate.instant('General.Field.Required', { field });
20
+ }
21
+ if (value['minlength']) {
22
+ const field = this.translate.instant(filedTranslationKey.field);
23
+ rvalue = this.translate.instant('General.Field.MinLength', { field, requiredLength: value.minlength.requiredLength });
24
+ }
25
+ }
26
+ return rvalue;
27
+ }
28
+ }
29
+ InputErrorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: InputErrorPipe, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe });
30
+ InputErrorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: InputErrorPipe, name: "inputError" });
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: InputErrorPipe, decorators: [{
32
+ type: Pipe,
33
+ args: [{
34
+ name: 'inputError'
35
+ }]
36
+ }], ctorParameters: function () { return [{ type: i1.TranslateService }]; } });
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZXJyb3IucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jvc29mdGxhYi9jb3JlL3NyYy9saWIvcGlwZXMvaW5wdXQtZXJyb3IucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7O0FBTXBELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQXNCLFNBQTJCO1FBQTNCLGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBRWpELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBVSxFQUFFLG1CQUF3QjtRQUM1QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDN0IsTUFBTSxHQUFHLGVBQWUsQ0FBQzthQUMxQjtZQUNELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDL0IsTUFBTSxHQUFHLDJCQUEyQixDQUFDO2FBQ3RDO1lBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUN0RTtZQUNELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7YUFDdkg7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OzJHQXZCVSxjQUFjO3lHQUFkLGNBQWM7MkZBQWQsY0FBYztrQkFIMUIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsWUFBWTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnaW5wdXRFcnJvcidcclxufSlcclxuZXhwb3J0IGNsYXNzIElucHV0RXJyb3JQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge1xyXG5cclxuICB9XHJcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGZpbGVkVHJhbnNsYXRpb25LZXk6IGFueSk6IHN0cmluZyB7XHJcbiAgICBsZXQgcnZhbHVlID0gJyc7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHZhbHVlWydpbnZhbGlkJ10gPT09IHRydWUpIHtcclxuICAgICAgICBydmFsdWUgPSAnRVJST1IuSU5WQUxJRCc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbHVlWydtdXN0TWF0Y2gnXSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJ2YWx1ZSA9ICdBY2NvdW50LlBhc3N3b3JkLk11c3RNYWNoJztcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWVbJ3JlcXVpcmVkJ10gPT09IHRydWUpIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZmlsZWRUcmFuc2xhdGlvbktleS5maWVsZCk7XHJcbiAgICAgICAgcnZhbHVlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnR2VuZXJhbC5GaWVsZC5SZXF1aXJlZCcsIHsgZmllbGQgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbHVlWydtaW5sZW5ndGgnXSkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChmaWxlZFRyYW5zbGF0aW9uS2V5LmZpZWxkKTtcclxuICAgICAgICBydmFsdWUgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdHZW5lcmFsLkZpZWxkLk1pbkxlbmd0aCcsIHsgZmllbGQsIHJlcXVpcmVkTGVuZ3RoOiB2YWx1ZS5taW5sZW5ndGgucmVxdWlyZWRMZW5ndGggfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBydmFsdWU7XHJcbiAgfVxyXG5cclxufSJdfQ==
@@ -0,0 +1,10 @@
1
+ import { DatePipe, DecimalPipe, PercentPipe } from '@angular/common';
2
+ import { BaseDatastore } from './services/base-datastore.service';
3
+ export * from './services';
4
+ export const PROVIDERS = [
5
+ BaseDatastore,
6
+ DatePipe,
7
+ DecimalPipe,
8
+ PercentPipe,
9
+ ];
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcm9zb2Z0bGFiL2NvcmUvc3JjL2xpYi9wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLGNBQWMsWUFBWSxDQUFDO0FBRTNCLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBVTtJQUM5QixhQUFhO0lBQ2IsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0NBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSwgUGVyY2VudFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCYXNlRGF0YXN0b3JlIH0gZnJvbSAnLi9zZXJ2aWNlcy9iYXNlLWRhdGFzdG9yZS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcyc7XHJcblxyXG5leHBvcnQgY29uc3QgUFJPVklERVJTOiBhbnlbXSA9IFtcclxuICBCYXNlRGF0YXN0b3JlLFxyXG4gIERhdGVQaXBlLFxyXG4gIERlY2ltYWxQaXBlLFxyXG4gIFBlcmNlbnRQaXBlLFxyXG5dO1xyXG4iXX0=
@@ -0,0 +1,333 @@
1
+ import { HttpHeaders, HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { compare } from 'fast-json-patch';
4
+ import * as qs from 'qs';
5
+ import { Observable, throwError } from 'rxjs';
6
+ import { catchError, map } from 'rxjs/operators';
7
+ import { BaseQueryData } from '../models/base-query-data';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common/http";
10
+ export class BaseDatastore {
11
+ constructor(httpClient) {
12
+ this.httpClient = httpClient;
13
+ // tslint:disable-next-line:variable-name
14
+ this._store = {};
15
+ // tslint:enable:max-line-length
16
+ // tslint:disable-next-line:ban-types
17
+ this.toQueryString = this.datastoreConfig.overrides
18
+ && this.datastoreConfig.overrides.toQueryString ?
19
+ this.datastoreConfig.overrides.toQueryString : this._toQueryString;
20
+ }
21
+ // tslint:enable:max-line-length
22
+ get getDirtyAttributes() {
23
+ if (this.datastoreConfig.overrides
24
+ && this.datastoreConfig.overrides.getDirtyAttributes) {
25
+ return this.datastoreConfig.overrides.getDirtyAttributes;
26
+ }
27
+ else {
28
+ return BaseDatastore.getDirtyAttributes;
29
+ }
30
+ }
31
+ get getAllAttributes() {
32
+ if (this.datastoreConfig.overrides
33
+ && this.datastoreConfig.overrides.getAllAttributes) {
34
+ return this.datastoreConfig.overrides.getAllAttributes;
35
+ }
36
+ else {
37
+ return BaseDatastore.getAllAttributes;
38
+ }
39
+ }
40
+ // protected config: DatastoreConfig;
41
+ static getDirtyAttributes(attributesMetadata) {
42
+ const dirtyData = {};
43
+ for (const propertyName in attributesMetadata) {
44
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
45
+ const metadata = attributesMetadata[propertyName];
46
+ if (metadata.hasDirtyAttributes) {
47
+ const attributeName = metadata.serializedName != null ? metadata.serializedName : propertyName;
48
+ dirtyData[attributeName] = metadata.serialisationValue ? metadata.serialisationValue : metadata.newValue;
49
+ }
50
+ }
51
+ }
52
+ return dirtyData;
53
+ }
54
+ static getAllAttributes(attributesMetadata) {
55
+ const dirtyData = {};
56
+ for (const propertyName in attributesMetadata) {
57
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
58
+ const metadata = attributesMetadata[propertyName];
59
+ const attributeName = metadata.serializedName != null ? metadata.serializedName : propertyName;
60
+ dirtyData[attributeName] = metadata.serialisationValue ? metadata.serialisationValue : metadata.newValue;
61
+ }
62
+ }
63
+ return dirtyData;
64
+ }
65
+ findAll(modelType, params, headers, customUrl) {
66
+ const customHeadhers = this.buildHeaders(headers);
67
+ const htmlParams = this.buildParams(params);
68
+ const url = this.buildUrl(modelType, customUrl);
69
+ const response = this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true })
70
+ .pipe(map(res => this.extractQueryData(res, modelType)), catchError(this.handleError));
71
+ return response;
72
+ }
73
+ findRecord(modelType, id, params, headers, customUrl) {
74
+ const customHeadhers = this.buildHeaders(headers);
75
+ let url = this.buildUrl(modelType, customUrl);
76
+ if (id) {
77
+ url += '/' + id;
78
+ }
79
+ const htmlParams = this.buildParams(params, undefined);
80
+ return this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true })
81
+ .pipe(map(res => this.entityToModel(res, modelType, undefined)), catchError(this.handleError));
82
+ }
83
+ getCustom(modelType, params, headers, customUrl, customResponseType) {
84
+ const customHeadhers = this.buildHeaders(headers);
85
+ const url = this.buildUrl(modelType, customUrl);
86
+ const htmlParams = this.buildParams(params, undefined);
87
+ if (!customResponseType)
88
+ customResponseType = 'json';
89
+ return this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true, responseType: customResponseType });
90
+ }
91
+ postCustom(modelType, body, params, headers, customUrl) {
92
+ const customHeadhers = this.buildHeaders(headers);
93
+ const url = this.buildUrl(modelType, customUrl);
94
+ const htmlParams = this.buildParams(params, undefined);
95
+ return this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, reportProgress: true, withCredentials: true });
96
+ }
97
+ patchCustom(modelType, body, params, headers, customUrl) {
98
+ const customHeadhers = this.buildHeaders(headers);
99
+ const url = this.buildUrl(modelType, customUrl);
100
+ const htmlParams = this.buildParams(params, undefined);
101
+ return this.httpClient.patch(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
102
+ }
103
+ createRecord(modelType, data) {
104
+ return new modelType(this, data);
105
+ }
106
+ saveRecord(attributesMetadata, model, params, headers, customUrl, customBody) {
107
+ const modelType = model.constructor;
108
+ const modelConfig = model.modelConfig;
109
+ const customHeadhers = this.buildHeaders(headers);
110
+ const url = this.buildUrl(modelType, customUrl);
111
+ const htmlParams = this.buildParams(params);
112
+ let httpCall;
113
+ const body = customBody || this.modelToEntity(model, attributesMetadata);
114
+ if (model.id) {
115
+ // tslint:disable-next-line:max-line-length
116
+ httpCall = this.httpClient.patch(url + '/' + model.id, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
117
+ }
118
+ else {
119
+ httpCall = this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
120
+ }
121
+ return httpCall
122
+ .pipe(map(res => {
123
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
124
+ return this.entityToModel(data, modelType);
125
+ }), catchError(this.handleError));
126
+ }
127
+ patchRecord(attributesMetadata, model, origModel, params, headers, customUrl) {
128
+ const modelType = model.constructor;
129
+ const modelConfig = model.modelConfig;
130
+ const customHeadhers = this.buildHeaders(headers);
131
+ const url = this.buildUrl(modelType, customUrl);
132
+ const htmlParams = this.buildParams(params);
133
+ let httpCall;
134
+ let origData = { id: '' };
135
+ if (origModel)
136
+ origData = this.modelToEntity(origModel, origModel.attributeMetadata, true);
137
+ const newData = this.modelToEntity(model, attributesMetadata, true);
138
+ newData.id = origData.id;
139
+ const patch = compare(origData, newData);
140
+ if (patch.length > 0) {
141
+ httpCall = this.httpClient.patch(url + '/' + model.id, patch, { headers: customHeadhers, params: htmlParams, withCredentials: true });
142
+ return httpCall
143
+ .pipe(map(res => {
144
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
145
+ return this.entityToModel(data, modelType);
146
+ }), catchError(this.handleError));
147
+ }
148
+ else {
149
+ return new Observable((observer) => {
150
+ observer.next(model);
151
+ observer.complete();
152
+ });
153
+ }
154
+ }
155
+ // getPatch<T extends BaseModel>(
156
+ // model: T,
157
+ // origModel: T): any {
158
+ // }
159
+ replaceRecord(attributesMetadata, model, params, headers, customUrl, customBody) {
160
+ const modelType = model.constructor;
161
+ const modelConfig = model.modelConfig;
162
+ const customHeadhers = this.buildHeaders(headers);
163
+ const url = this.buildUrl(modelType, customUrl);
164
+ const htmlParams = this.buildParams(params);
165
+ let httpCall;
166
+ const body = customBody || this.modelToEntity(model, attributesMetadata, true);
167
+ if (model.id) {
168
+ httpCall = this.httpClient.put(url + '/' + model.id, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
169
+ }
170
+ else {
171
+ httpCall = this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
172
+ }
173
+ return httpCall
174
+ .pipe(map(res => {
175
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
176
+ return this.entityToModel(data, modelType);
177
+ }), catchError(this.handleError));
178
+ }
179
+ deleteRecord(modelType, id, headers, customUrl) {
180
+ const customHeadhers = this.buildHeaders(headers);
181
+ let url = this.buildUrl(modelType, customUrl);
182
+ if (!url.includes('share')) {
183
+ url = url + '/' + id;
184
+ }
185
+ // const idParam = new HttpParams().set('id', id);
186
+ return this.httpClient.delete(url, { headers: customHeadhers, withCredentials: true })
187
+ .pipe(catchError(this.handleError));
188
+ }
189
+ buildUrl(modelType, customUrl) {
190
+ if (customUrl) {
191
+ return customUrl;
192
+ }
193
+ const modelConfig = Reflect.getMetadata('BaseModelConfig', modelType);
194
+ const baseUrl = modelConfig.baseUrl || this.datastoreConfig.baseUrl;
195
+ const apiVersion = modelConfig.apiVersion || this.datastoreConfig.apiVersion;
196
+ const modelEndpointUrl = modelConfig.modelEndpointUrl || modelConfig.type;
197
+ const url = [baseUrl, apiVersion, modelEndpointUrl].filter((x) => x).join('/');
198
+ return url;
199
+ }
200
+ extractQueryData(res, modelType) {
201
+ let result;
202
+ const body = res;
203
+ const models = [];
204
+ for (const data of body.data) {
205
+ const model = this.entityToModel(data, modelType, undefined);
206
+ models.push(model);
207
+ }
208
+ result = new BaseQueryData(models, this.parseMeta(body, modelType));
209
+ return result;
210
+ }
211
+ deserializeModel(modelType, data) {
212
+ data = this.transformSerializedNamesToPropertyNames(modelType, data);
213
+ return new modelType(this, data);
214
+ }
215
+ handleError(error) {
216
+ if (error.error instanceof ErrorEvent) {
217
+ // A client-side or network error occurred. Handle it accordingly.
218
+ // console.error('An error occurred:', error.error.message);
219
+ }
220
+ else {
221
+ // The backend returned an unsuccessful response code.
222
+ // The response body may contain clues as to what went wrong,
223
+ // console.error(
224
+ // 'Backend returned code ${error.status}, ' +
225
+ // 'body was: ${error.error}');
226
+ }
227
+ // return an observable with a user-facing error message
228
+ return throwError(error);
229
+ }
230
+ parseMeta(body, modelType) {
231
+ const metaModel = Reflect.getMetadata('BaseModelConfig', modelType).meta;
232
+ return new metaModel(body);
233
+ }
234
+ resetMetadataAttributes(res, attributesMetadata, modelType) {
235
+ // TODO check why is attributesMetadata from the arguments never used
236
+ for (const propertyName in attributesMetadata) {
237
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
238
+ const metadata = attributesMetadata[propertyName];
239
+ if (metadata.hasDirtyAttributes) {
240
+ metadata.hasDirtyAttributes = false;
241
+ }
242
+ }
243
+ }
244
+ if (res) {
245
+ res.attributeMetadata = attributesMetadata;
246
+ }
247
+ return res;
248
+ }
249
+ get datastoreConfig() {
250
+ const configFromDecorator = Reflect.getMetadata('BaseDatastoreConfig', this.constructor);
251
+ return Object.assign(configFromDecorator, this.config);
252
+ }
253
+ transformSerializedNamesToPropertyNames(modelType, attributes) {
254
+ const serializedNameToPropertyName = this.getModelPropertyNames(modelType.prototype);
255
+ const properties = {};
256
+ Object.keys(serializedNameToPropertyName).forEach((serializedName) => {
257
+ if (attributes[serializedName] !== null && attributes[serializedName] !== undefined) {
258
+ properties[serializedNameToPropertyName[serializedName]] = attributes[serializedName];
259
+ }
260
+ });
261
+ return properties;
262
+ }
263
+ getModelPropertyNames(model) {
264
+ return Reflect.getMetadata('AttributeMapping', model);
265
+ }
266
+ buildHeaders(customHeaders) {
267
+ const headers = {
268
+ Accept: 'application/json-patch+json',
269
+ // 'Content-Type': 'application/vnd.api+json',
270
+ 'Content-Type': 'application/json-patch+json'
271
+ };
272
+ if (customHeaders && customHeaders.keys().length) {
273
+ // tslint:disable-next-line:variable-name
274
+ Object.assign({}, headers, customHeaders.keys().map(header_name => {
275
+ headers['' + header_name] = customHeaders.get(header_name);
276
+ }));
277
+ }
278
+ return new HttpHeaders(headers);
279
+ }
280
+ buildParams(params, id) {
281
+ let httpParams = new HttpParams();
282
+ if (id) {
283
+ httpParams = httpParams.set('id', id);
284
+ }
285
+ if (params) {
286
+ Object.keys(params)
287
+ .filter(key => {
288
+ const v = params[key];
289
+ return (Array.isArray(v) || typeof v === 'string') ?
290
+ (v.length > 0) :
291
+ (v !== null && v !== undefined);
292
+ })
293
+ .forEach(key => {
294
+ httpParams = httpParams.set(key, params[key]);
295
+ });
296
+ }
297
+ return httpParams;
298
+ }
299
+ entityToModel(res, modelType, model) {
300
+ return this.extractRecordDataJson(res, modelType, model);
301
+ }
302
+ extractRecordDataJson(res, modelType, model) {
303
+ const body = res;
304
+ if (!body) {
305
+ throw new Error('no body in response');
306
+ }
307
+ if (model) {
308
+ Object.assign(model, body);
309
+ }
310
+ const deserializedModel = model || this.deserializeModel(modelType, body.data || body);
311
+ return deserializedModel;
312
+ }
313
+ modelToEntity(model, attributesMetadata, allAttributes = false) {
314
+ let attributes;
315
+ if (allAttributes) {
316
+ attributes = this.getAllAttributes(attributesMetadata, model);
317
+ }
318
+ else {
319
+ attributes = this.getDirtyAttributes(attributesMetadata, model);
320
+ }
321
+ // this.getRelationships(model, attributes);
322
+ return attributes;
323
+ }
324
+ _toQueryString(params) {
325
+ return qs.stringify(params, { arrayFormat: 'brackets' });
326
+ }
327
+ }
328
+ BaseDatastore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseDatastore, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
329
+ BaseDatastore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseDatastore });
330
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseDatastore, decorators: [{
331
+ type: Injectable
332
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRhc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jvc29mdGxhYi9jb3JlL3NyYy9saWIvc2VydmljZXMvYmFzZS1kYXRhc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEVBQUUsVUFBVSxFQUFZLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBSzFELE1BQU0sT0FBTyxhQUFhO0lBNER4QixZQUFzQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBMUQ1Qyx5Q0FBeUM7UUFDakMsV0FBTSxHQUFvRCxFQUFFLENBQUM7UUFDckUsZ0NBQWdDO1FBQ2hDLHFDQUFxQztRQUM3QixrQkFBYSxHQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUztlQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFxRHJFLENBQUM7SUFwREQsZ0NBQWdDO0lBRWhDLElBQVksa0JBQWtCO1FBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTO2VBQzdCLElBQUks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VCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDeEM7UUFDRCxJQUFJLEtBQUssRUFBRTtZQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVNLGFBQWEsQ0FDbEIsS0FBUSxFQUNSLGtCQUF1QixFQUN2QixnQkFBeUIsS0FBSztRQUU5QixJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksYUFBYSxFQUFFO1lBQ2pCLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakU7UUFDRCw0Q0FBNEM7UUFDNUMsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUNPLGNBQWMsQ0FBQyxNQUFXO1FBQ2hDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDOzswR0E5YlUsYUFBYTs4R0FBYixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tcGFyZSB9IGZyb20gJ2Zhc3QtanNvbi1wYXRjaCc7XHJcbmltcG9ydCAqIGFzIHFzIGZyb20gJ3FzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRhc3RvcmVDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2RhdGFzdG9yZS1jb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTW9kZWxDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL21vZGVsLWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCYXNlUXVlcnlEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2Jhc2UtcXVlcnktZGF0YSc7XHJcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4uL21vZGVscy9iYXNlLm1vZGVsJztcclxuZXhwb3J0IHR5cGUgTW9kZWxUeXBlPFQgZXh0ZW5kcyBCYXNlTW9kZWw+ID0gbmV3IChkYXRhc3RvcmU6IEJhc2VEYXRhc3RvcmUsIGRhdGE6IGFueSkgPT4gVDtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJhc2VEYXRhc3RvcmUge1xyXG4gIHByb3RlY3RlZCBjb25maWchOiBEYXRhc3RvcmVDb25maWc7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9zdG9yZTogeyBbdHlwZTogc3RyaW5nXTogeyBbaWQ6IHN0cmluZ106IEJhc2VNb2RlbCB9IH0gPSB7fTtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpiYW4tdHlwZXNcclxuICBwcml2YXRlIHRvUXVlcnlTdHJpbmc6IEZ1bmN0aW9uID0gdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzXHJcbiAgICAmJiB0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXMudG9RdWVyeVN0cmluZyA/XHJcbiAgICB0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXMudG9RdWVyeVN0cmluZyA6IHRoaXMuX3RvUXVlcnlTdHJpbmc7XHJcbiAgLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcclxuXHJcbiAgcHJpdmF0ZSBnZXQgZ2V0RGlydHlBdHRyaWJ1dGVzKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YXN0b3JlQ29uZmlnLm92ZXJyaWRlc1xyXG4gICAgICAmJiB0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXMuZ2V0RGlydHlBdHRyaWJ1dGVzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXMuZ2V0RGlydHlBdHRyaWJ1dGVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIEJhc2VEYXRhc3RvcmUuZ2V0RGlydHlBdHRyaWJ1dGVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBnZXRBbGxBdHRyaWJ1dGVzKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YXN0b3JlQ29uZmlnLm92ZXJyaWRlc1xyXG4gICAgICAmJiB0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXMuZ2V0QWxsQXR0cmlidXRlcykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzLmdldEFsbEF0dHJpYnV0ZXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gQmFzZURhdGFzdG9yZS5nZXRBbGxBdHRyaWJ1dGVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGNvbmZpZzogRGF0YXN0b3JlQ29uZmlnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXREaXJ0eUF0dHJpYnV0ZXMoYXR0cmlidXRlc01ldGFkYXRhOiBhbnkpOiB7IHN0cmluZzogYW55IH0ge1xyXG4gICAgY29uc3QgZGlydHlEYXRhOiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBhdHRyaWJ1dGVzTWV0YWRhdGEpIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZXNNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XHJcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IGFueSA9IGF0dHJpYnV0ZXNNZXRhZGF0YVtwcm9wZXJ0eU5hbWVdO1xyXG5cclxuICAgICAgICBpZiAobWV0YWRhdGEuaGFzRGlydHlBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gbWV0YWRhdGEuc2VyaWFsaXplZE5hbWUgIT0gbnVsbCA/IG1ldGFkYXRhLnNlcmlhbGl6ZWROYW1lIDogcHJvcGVydHlOYW1lO1xyXG4gICAgICAgICAgZGlydHlEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbWV0YWRhdGEuc2VyaWFsaXNhdGlvblZhbHVlID8gbWV0YWRhdGEuc2VyaWFsaXNhdGlvblZhbHVlIDogbWV0YWRhdGEubmV3VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlydHlEYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0QWxsQXR0cmlidXRlcyhhdHRyaWJ1dGVzTWV0YWRhdGE6IGFueSk6IHsgc3RyaW5nOiBhbnkgfSB7XHJcbiAgICBjb25zdCBkaXJ0eURhdGE6IGFueSA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIGF0dHJpYnV0ZXNNZXRhZGF0YSkge1xyXG4gICAgICBpZiAoYXR0cmlidXRlc01ldGFkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcclxuICAgICAgICBjb25zdCBtZXRhZGF0YTogYW55ID0gYXR0cmlidXRlc01ldGFkYXRhW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IG1ldGFkYXRhLnNlcmlhbGl6ZWROYW1lICE9IG51bGwgPyBtZXRhZGF0YS5zZXJpYWxpemVkTmFtZSA6IHByb3BlcnR5TmFtZTtcclxuICAgICAgICBkaXJ0eURhdGFbYXR0cmlidXRlTmFtZV0gPSBtZXRhZGF0YS5zZXJpYWxpc2F0aW9uVmFsdWUgPyBtZXRhZGF0YS5zZXJpYWxpc2F0aW9uVmFsdWUgOiBtZXRhZGF0YS5uZXdWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRpcnR5RGF0YTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7XHJcbiAgfVxyXG5cclxuICBmaW5kQWxsPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gICAgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPEJhc2VRdWVyeURhdGE8VD4+IHtcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMocGFyYW1zKTtcclxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gdGhpcy5idWlsZFVybChtb2RlbFR5cGUsIGN1c3RvbVVybCk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmh0dHBDbGllbnQuZ2V0KHVybCxcclxuICAgICAgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHJlcyA9PiB0aGlzLmV4dHJhY3RRdWVyeURhdGEocmVzLCBtb2RlbFR5cGUpKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBmaW5kUmVjb3JkPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gICAgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBpZD86IHN0cmluZyxcclxuICAgIHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuICAgIGlmIChpZCkge1xyXG4gICAgICB1cmwgKz0gJy8nICsgaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMocGFyYW1zLCB1bmRlZmluZWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQodXJsLCB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCBwYXJhbXM6IGh0bWxQYXJhbXMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxyXG4gICAgICAucGlwZShtYXAocmVzID0+IHRoaXMuZW50aXR5VG9Nb2RlbChyZXMsIG1vZGVsVHlwZSwgdW5kZWZpbmVkKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuICBnZXRDdXN0b208VSwgVCBleHRlbmRzIEJhc2VNb2RlbD4obW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmcsXHJcbiAgICBjdXN0b21SZXNwb25zZVR5cGU/OiBhbnkpOiBPYnNlcnZhYmxlPFU+IHtcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuICAgIGNvbnN0IGh0bWxQYXJhbXMgPSB0aGlzLmJ1aWxkUGFyYW1zKHBhcmFtcywgdW5kZWZpbmVkKTtcclxuICAgIGlmICghY3VzdG9tUmVzcG9uc2VUeXBlKVxyXG4gICAgICBjdXN0b21SZXNwb25zZVR5cGUgPSAnanNvbic7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxVPih1cmwsIHsgaGVhZGVyczogY3VzdG9tSGVhZGhlcnMsIHBhcmFtczogaHRtbFBhcmFtcywgd2l0aENyZWRlbnRpYWxzOiB0cnVlLCByZXNwb25zZVR5cGU6IGN1c3RvbVJlc3BvbnNlVHlwZSB9KTtcclxuICB9XHJcblxyXG4gIHBvc3RDdXN0b208VSwgVCBleHRlbmRzIEJhc2VNb2RlbD4obW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBib2R5OiBhbnksXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFU+IHtcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuICAgIGNvbnN0IGh0bWxQYXJhbXMgPSB0aGlzLmJ1aWxkUGFyYW1zKHBhcmFtcywgdW5kZWZpbmVkKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxVPih1cmwsIGJvZHksIHsgaGVhZGVyczogY3VzdG9tSGVhZGhlcnMsIHBhcmFtczogaHRtbFBhcmFtcywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuICB9XHJcblxyXG4gIHBhdGNoQ3VzdG9tPFUsIFQgZXh0ZW5kcyBCYXNlTW9kZWw+KG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LFxyXG4gICAgYm9keTogYW55LFxyXG4gICAgcGFyYW1zPzogYW55LFxyXG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzLFxyXG4gICAgY3VzdG9tVXJsPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxVPiB7XHJcbiAgICBjb25zdCBjdXN0b21IZWFkaGVyczogSHR0cEhlYWRlcnMgPSB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzKTtcclxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gdGhpcy5idWlsZFVybChtb2RlbFR5cGUsIGN1c3RvbVVybCk7XHJcbiAgICBjb25zdCBodG1sUGFyYW1zID0gdGhpcy5idWlsZFBhcmFtcyhwYXJhbXMsIHVuZGVmaW5lZCk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBhdGNoPFU+KHVybCwgYm9keSwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XHJcbiAgfVxyXG4gIGNyZWF0ZVJlY29yZDxUIGV4dGVuZHMgQmFzZU1vZGVsPihtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPiwgZGF0YT86IGFueSk6IFQge1xyXG4gICAgcmV0dXJuIG5ldyBtb2RlbFR5cGUodGhpcywgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBzYXZlUmVjb3JkPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gICAgYXR0cmlidXRlc01ldGFkYXRhOiBhbnksIG1vZGVsOiBULFxyXG4gICAgcGFyYW1zPzogYW55LFxyXG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzLFxyXG4gICAgY3VzdG9tVXJsPzogc3RyaW5nLFxyXG4gICAgY3VzdG9tQm9keT86IGFueVxyXG4gICk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgbW9kZWxUeXBlID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWxUeXBlPFQ+O1xyXG4gICAgY29uc3QgbW9kZWxDb25maWc6IE1vZGVsQ29uZmlnID0gbW9kZWwubW9kZWxDb25maWc7XHJcbiAgICBjb25zdCBjdXN0b21IZWFkaGVyczogSHR0cEhlYWRlcnMgPSB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzKTtcclxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gdGhpcy5idWlsZFVybChtb2RlbFR5cGUsIGN1c3RvbVVybCk7XHJcbiAgICBjb25zdCBodG1sUGFyYW1zID0gdGhpcy5idWlsZFBhcmFtcyhwYXJhbXMpO1xyXG5cclxuICAgIGxldCBodHRwQ2FsbDogT2JzZXJ2YWJsZTxhbnk+O1xyXG5cclxuICAgIGNvbnN0IGJvZHkgPSBjdXN0b21Cb2R5IHx8IHRoaXMubW9kZWxUb0VudGl0eShtb2RlbCwgYXR0cmlidXRlc01ldGFkYXRhKTtcclxuXHJcbiAgICBpZiAobW9kZWwuaWQpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICBodHRwQ2FsbCA9IHRoaXMuaHR0cENsaWVudC5wYXRjaCh1cmwgKyAnLycgKyBtb2RlbC5pZCwgYm9keSwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBodHRwQ2FsbCA9IHRoaXMuaHR0cENsaWVudC5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGh0dHBDYWxsXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVzZXRNZXRhZGF0YUF0dHJpYnV0ZXMocmVzLCBhdHRyaWJ1dGVzTWV0YWRhdGEsIG1vZGVsVHlwZSk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlUb01vZGVsKGRhdGEsIG1vZGVsVHlwZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hSZWNvcmQ8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICBhdHRyaWJ1dGVzTWV0YWRhdGE6IGFueSwgbW9kZWw6IFQsXHJcbiAgICBvcmlnTW9kZWw6IFQsXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsVHlwZTxUPjtcclxuICAgIGNvbnN0IG1vZGVsQ29uZmlnOiBNb2RlbENvbmZpZyA9IG1vZGVsLm1vZGVsQ29uZmlnO1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMocGFyYW1zKTtcclxuXHJcbiAgICBsZXQgaHR0cENhbGw6IE9ic2VydmFibGU8YW55PjtcclxuICAgIGxldCBvcmlnRGF0YSA9IHsgaWQ6ICcnIH07XHJcbiAgICBpZiAob3JpZ01vZGVsKVxyXG4gICAgICBvcmlnRGF0YSA9IHRoaXMubW9kZWxUb0VudGl0eShvcmlnTW9kZWwsIG9yaWdNb2RlbC5hdHRyaWJ1dGVNZXRhZGF0YSwgdHJ1ZSk7XHJcbiAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5tb2RlbFRvRW50aXR5KG1vZGVsLCBhdHRyaWJ1dGVzTWV0YWRhdGEsIHRydWUpO1xyXG4gICAgbmV3RGF0YS5pZCA9IG9yaWdEYXRhLmlkO1xyXG4gICAgY29uc3QgcGF0Y2ggPSBjb21wYXJlKG9yaWdEYXRhLCBuZXdEYXRhKTtcclxuICAgIGlmIChwYXRjaC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGh0dHBDYWxsID0gdGhpcy5odHRwQ2xpZW50LnBhdGNoKHVybCArICcvJyArIG1vZGVsLmlkLCBwYXRjaCwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XHJcblxyXG4gICAgICByZXR1cm4gaHR0cENhbGxcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZXNldE1ldGFkYXRhQXR0cmlidXRlcyhyZXMsIGF0dHJpYnV0ZXNNZXRhZGF0YSwgbW9kZWxUeXBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5VG9Nb2RlbChkYXRhLCBtb2RlbFR5cGUpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChtb2RlbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIGdldFBhdGNoPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gIC8vICAgbW9kZWw6IFQsXHJcbiAgLy8gICBvcmlnTW9kZWw6IFQpOiBhbnkge1xyXG5cclxuICAvLyB9XHJcbiAgcmVwbGFjZVJlY29yZDxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIGF0dHJpYnV0ZXNNZXRhZGF0YTogYW55LCBtb2RlbDogVCxcclxuICAgIHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZyxcclxuICAgIGN1c3RvbUJvZHk/OiBhbnlcclxuICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsVHlwZTxUPjtcclxuICAgIGNvbnN0IG1vZGVsQ29uZmlnOiBNb2RlbENvbmZpZyA9IG1vZGVsLm1vZGVsQ29uZmlnO1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMocGFyYW1zKTtcclxuXHJcbiAgICBsZXQgaHR0cENhbGw6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgICBjb25zdCBib2R5ID0gY3VzdG9tQm9keSB8fCB0aGlzLm1vZGVsVG9FbnRpdHkobW9kZWwsIGF0dHJpYnV0ZXNNZXRhZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKG1vZGVsLmlkKSB7XHJcbiAgICAgIGh0dHBDYWxsID0gdGhpcy5odHRwQ2xpZW50LnB1dCh1cmwgKyAnLycgKyBtb2RlbC5pZCwgYm9keSwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBodHRwQ2FsbCA9IHRoaXMuaHR0cENsaWVudC5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGh0dHBDYWxsXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVzZXRNZXRhZGF0YUF0dHJpYnV0ZXMocmVzLCBhdHRyaWJ1dGVzTWV0YWRhdGEsIG1vZGVsVHlwZSk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlUb01vZGVsKGRhdGEsIG1vZGVsVHlwZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIGRlbGV0ZVJlY29yZDxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LFxyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8e30+IHtcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5idWlsZFVybChtb2RlbFR5cGUsIGN1c3RvbVVybCk7XHJcbiAgICBpZiAoIXVybC5pbmNsdWRlcygnc2hhcmUnKSkge1xyXG4gICAgICB1cmwgPSB1cmwgKyAnLycgKyBpZDtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IGlkUGFyYW0gPSBuZXcgSHR0cFBhcmFtcygpLnNldCgnaWQnLCBpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZSh1cmwsIHsgaGVhZGVyczogY3VzdG9tSGVhZGhlcnMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxyXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFVybDxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LFxyXG4gICAgY3VzdG9tVXJsPzogc3RyaW5nXHJcbiAgKTogc3RyaW5nIHtcclxuXHJcbiAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgIHJldHVybiBjdXN0b21Vcmw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbW9kZWxDb25maWc6IE1vZGVsQ29uZmlnID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgnQmFzZU1vZGVsQ29uZmlnJywgbW9kZWxUeXBlKTtcclxuXHJcbiAgICBjb25zdCBiYXNlVXJsID0gbW9kZWxDb25maWcuYmFzZVVybCB8fCB0aGlzLmRhdGFzdG9yZUNvbmZpZy5iYXNlVXJsO1xyXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IG1vZGVsQ29uZmlnLmFwaVZlcnNpb24gfHwgdGhpcy5kYXRhc3RvcmVDb25maWcuYXBpVmVyc2lvbjtcclxuICAgIGNvbnN0IG1vZGVsRW5kcG9pbnRVcmw6IHN0cmluZyA9IG1vZGVsQ29uZmlnLm1vZGVsRW5kcG9pbnRVcmwgfHwgbW9kZWxDb25maWcudHlwZTtcclxuXHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IFtiYXNlVXJsLCBhcGlWZXJzaW9uLCBtb2RlbEVuZHBvaW50VXJsXS5maWx0ZXIoKHgpID0+IHgpLmpvaW4oJy8nKTtcclxuXHJcbiAgICByZXR1cm4gdXJsO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGV4dHJhY3RRdWVyeURhdGE8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICByZXM6IGFueSxcclxuICAgIG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+XHJcbiAgKTogQmFzZVF1ZXJ5RGF0YTxUPiB7XHJcbiAgICBsZXQgcmVzdWx0O1xyXG4gICAgY29uc3QgYm9keTogYW55ID0gcmVzO1xyXG4gICAgY29uc3QgbW9kZWxzOiBUW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRhdGEgb2YgYm9keS5kYXRhKSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5lbnRpdHlUb01vZGVsKGRhdGEsIG1vZGVsVHlwZSwgdW5kZWZpbmVkKTtcclxuICAgICAgbW9kZWxzLnB1c2gobW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdCA9IG5ldyBCYXNlUXVlcnlEYXRhKG1vZGVscywgdGhpcy5wYXJzZU1ldGEoYm9keSwgbW9kZWxUeXBlKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplTW9kZWw8VCBleHRlbmRzIEJhc2VNb2RlbD4obW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sIGRhdGE6IGFueSkge1xyXG4gICAgZGF0YSA9IHRoaXMudHJhbnNmb3JtU2VyaWFsaXplZE5hbWVzVG9Qcm9wZXJ0eU5hbWVzKG1vZGVsVHlwZSwgZGF0YSk7XHJcbiAgICByZXR1cm4gbmV3IG1vZGVsVHlwZSh0aGlzLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICAgIGlmIChlcnJvci5lcnJvciBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcclxuICAgICAgLy8gQSBjbGllbnQtc2lkZSBvciBuZXR3b3JrIGVycm9yIG9jY3VycmVkLiBIYW5kbGUgaXQgYWNjb3JkaW5nbHkuXHJcbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkOicsIGVycm9yLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVGhlIGJhY2tlbmQgcmV0dXJuZWQgYW4gdW5zdWNjZXNzZnVsIHJlc3BvbnNlIGNvZGUuXHJcbiAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IG1heSBjb250YWluIGNsdWVzIGFzIHRvIHdoYXQgd2VudCB3cm9uZyxcclxuICAgICAgLy8gY29uc29sZS5lcnJvcihcclxuICAgICAgLy8gICAnQmFja2VuZCByZXR1cm5lZCBjb2RlICR7ZXJyb3Iuc3RhdHVzfSwgJyArXHJcbiAgICAgIC8vICAgJ2JvZHkgd2FzOiAke2Vycm9yLmVycm9yfScpO1xyXG4gICAgfVxyXG4gICAgLy8gcmV0dXJuIGFuIG9ic2VydmFibGUgd2l0aCBhIHVzZXItZmFjaW5nIGVycm9yIG1lc3NhZ2VcclxuICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwYXJzZU1ldGEoYm9keTogYW55LCBtb2RlbFR5cGU6IE1vZGVsVHlwZTxCYXNlTW9kZWw+KTogYW55IHtcclxuICAgIGNvbnN0IG1ldGFNb2RlbDogYW55ID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgnQmFzZU1vZGVsQ29uZmlnJywgbW9kZWxUeXBlKS5tZXRhO1xyXG4gICAgcmV0dXJuIG5ldyBtZXRhTW9kZWwoYm9keSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVzZXRNZXRhZGF0YUF0dHJpYnV0ZXM8VCBleHRlbmRzIEJhc2VNb2RlbD4ocmVzOiBULCBhdHRyaWJ1dGVzTWV0YWRhdGE6IGFueSwgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4pIHtcclxuICAgIC8vIFRPRE8gY2hlY2sgd2h5IGlzIGF0dHJpYnV0ZXNNZXRhZGF0YSBmcm9tIHRoZSBhcmd1bWVudHMgbmV2ZXIgdXNlZFxyXG5cclxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIGF0dHJpYnV0ZXNNZXRhZGF0YSkge1xyXG4gICAgICBpZiAoYXR0cmlidXRlc01ldGFkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcclxuICAgICAgICBjb25zdCBtZXRhZGF0YTogYW55ID0gYXR0cmlidXRlc01ldGFkYXRhW3Byb3BlcnR5TmFtZV07XHJcblxyXG4gICAgICAgIGlmIChtZXRhZGF0YS5oYXNEaXJ0eUF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIG1ldGFkYXRhLmhhc0RpcnR5QXR0cmlidXRlcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXMpIHtcclxuICAgICAgcmVzLmF0dHJpYnV0ZU1ldGFkYXRhID0gYXR0cmlidXRlc01ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGF0YXN0b3JlQ29uZmlnKCk6IERhdGFzdG9yZUNvbmZpZyB7XHJcbiAgICBjb25zdCBjb25maWdGcm9tRGVjb3JhdG9yOiBEYXRhc3RvcmVDb25maWcgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCdCYXNlRGF0YXN0b3JlQ29uZmlnJywgdGhpcy5jb25zdHJ1Y3Rvcik7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb25maWdGcm9tRGVjb3JhdG9yLCB0aGlzLmNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdHJhbnNmb3JtU2VyaWFsaXplZE5hbWVzVG9Qcm9wZXJ0eU5hbWVzPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LCBhdHRyaWJ1dGVzOiBhbnkpIHtcclxuICAgIGNvbnN0IHNlcmlhbGl6ZWROYW1lVG9Qcm9wZXJ0eU5hbWUgPSB0aGlzLmdldE1vZGVsUHJvcGVydHlOYW1lcyhtb2RlbFR5cGUucHJvdG90eXBlKTtcclxuICAgIGNvbnN0IHByb3BlcnRpZXM6IGFueSA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHNlcmlhbGl6ZWROYW1lVG9Qcm9wZXJ0eU5hbWUpLmZvckVhY2goKHNlcmlhbGl6ZWROYW1lKSA9PiB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVzW3NlcmlhbGl6ZWROYW1lXSAhPT0gbnVsbCAmJiBhdHRyaWJ1dGVzW3NlcmlhbGl6ZWROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcHJvcGVydGllc1tzZXJpYWxpemVkTmFtZVRvUHJvcGVydHlOYW1lW3NlcmlhbGl6ZWROYW1lXV0gPSBhdHRyaWJ1dGVzW3NlcmlhbGl6ZWROYW1lXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TW9kZWxQcm9wZXJ0eU5hbWVzKG1vZGVsOiBCYXNlTW9kZWwpIHtcclxuICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhKCdBdHRyaWJ1dGVNYXBwaW5nJywgbW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1aWxkSGVhZGVycyhjdXN0b21IZWFkZXJzPzogSHR0cEhlYWRlcnMpOiBIdHRwSGVhZGVycyB7XHJcbiAgICBjb25zdCBoZWFkZXJzOiBhbnkgPSB7XHJcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXHJcbiAgICAgIC8vICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vdm5kLmFwaStqc29uJyxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nXHJcbiAgICB9O1xyXG4gICAgaWYgKGN1c3RvbUhlYWRlcnMgJiYgY3VzdG9tSGVhZGVycy5rZXlzKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIGhlYWRlcnMsIGN1c3RvbUhlYWRlcnMua2V5cygpLm1hcChoZWFkZXJfbmFtZSA9PiB7XHJcbiAgICAgICAgaGVhZGVyc1snJyArIGhlYWRlcl9uYW1lXSA9IGN1c3RvbUhlYWRlcnMuZ2V0KGhlYWRlcl9uYW1lKTtcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFBhcmFtcyhwYXJhbXM6IGFueSwgaWQ/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcclxuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChpZCkge1xyXG4gICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ2lkJywgaWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpXHJcbiAgICAgICAgLmZpbHRlcihrZXkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdiA9IHBhcmFtc1trZXldO1xyXG4gICAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHYpIHx8IHR5cGVvZiB2ID09PSAnc3RyaW5nJykgP1xyXG4gICAgICAgICAgICAodi5sZW5ndGggPiAwKSA6XHJcbiAgICAgICAgICAgICh2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KGtleSwgcGFyYW1zW2tleV0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGh0dHBQYXJhbXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJvdGVjdGVkIGVudGl0eVRvTW9kZWw8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICByZXM6IGFueSxcclxuICAgIG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LFxyXG4gICAgbW9kZWw/OiBUXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5leHRyYWN0UmVjb3JkRGF0YUpzb24ocmVzLCBtb2RlbFR5cGUsIG1vZGVsKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGV4dHJhY3RSZWNvcmREYXRhSnNvbjxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIHJlczogUmVzcG9uc2UsXHJcbiAgICBtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPixcclxuICAgIG1vZGVsPzogVFxyXG4gICk6IFQge1xyXG4gICAgY29uc3QgYm9keTogYW55ID0gcmVzO1xyXG4gICAgaWYgKCFib2R5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gYm9keSBpbiByZXNwb25zZScpO1xyXG4gICAgfVxyXG4gICAgaWYgKG1vZGVsKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24obW9kZWwsIGJvZHkpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTW9kZWwgPSBtb2RlbCB8fCB0aGlzLmRlc2VyaWFsaXplTW9kZWwobW9kZWxUeXBlLCBib2R5LmRhdGEgfHwgYm9keSk7XHJcbiAgICByZXR1cm4gZGVzZXJpYWxpemVkTW9kZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW9kZWxUb0VudGl0eTxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIG1vZGVsOiBULFxyXG4gICAgYXR0cmlidXRlc01ldGFkYXRhOiBhbnksXHJcbiAgICBhbGxBdHRyaWJ1dGVzOiBib29sZWFuID0gZmFsc2VcclxuICApOiBhbnkge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM7XHJcbiAgICBpZiAoYWxsQXR0cmlidXRlcykge1xyXG4gICAgICBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBbGxBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNNZXRhZGF0YSwgbW9kZWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXR0cmlidXRlcyA9IHRoaXMuZ2V0RGlydHlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNNZXRhZGF0YSwgbW9kZWwpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5nZXRSZWxhdGlvbnNoaXBzKG1vZGVsLCBhdHRyaWJ1dGVzKTtcclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuICBwcml2YXRlIF90b1F1ZXJ5U3RyaW5nKHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBxcy5zdHJpbmdpZnkocGFyYW1zLCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,95 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./base-datastore.service";
5
+ export class BaseService {
6
+ constructor(datastore) {
7
+ this.datastore = datastore;
8
+ }
9
+ setModelType(modelType) {
10
+ this.modelType = modelType;
11
+ }
12
+ get(id, customInclude = '') {
13
+ const response = this.datastore.findRecord(this.modelType, id, { customInclude });
14
+ return response;
15
+ }
16
+ getAll(page, pageSize, sort = '', filters = '', customInclude = '') {
17
+ const response = this.datastore.findAll(this.modelType, {
18
+ Page: page,
19
+ PageSize: pageSize,
20
+ Sorts: sort,
21
+ Filters: filters,
22
+ customInclude
23
+ });
24
+ return response;
25
+ }
26
+ delete(id) {
27
+ const response = this.datastore.deleteRecord(this.modelType, id);
28
+ return response;
29
+ }
30
+ getCustom(params, headers, customUrl, customResponseType) {
31
+ return this.datastore.getCustom(this.modelType, params, headers, customUrl, customResponseType);
32
+ }
33
+ postCustom(body, params, headers, customUrl) {
34
+ return this.datastore.postCustom(this.modelType, body, params, headers, customUrl);
35
+ }
36
+ patchCustom(body, params, headers, customUrl) {
37
+ return this.datastore.patchCustom(this.modelType, body, params, headers, customUrl);
38
+ }
39
+ // checkIfPropertyUnique(property: string, value: any): Observable<boolean> {
40
+ // }
41
+ save(docTypeOrFormGroup, id, origModel) {
42
+ if (id == null) {
43
+ let fromModel;
44
+ if (docTypeOrFormGroup instanceof FormGroup) {
45
+ fromModel = this.fromFormGroup(docTypeOrFormGroup, id);
46
+ }
47
+ else {
48
+ fromModel = docTypeOrFormGroup;
49
+ }
50
+ const data = this.datastore.createRecord(this.modelType, fromModel);
51
+ return data.save();
52
+ }
53
+ else {
54
+ return this.patch(docTypeOrFormGroup, origModel, id);
55
+ }
56
+ }
57
+ patch(docTypeOrFormGroup, origModel, id) {
58
+ let fromModel;
59
+ if (docTypeOrFormGroup instanceof FormGroup) {
60
+ fromModel = this.fromFormGroup(docTypeOrFormGroup, id);
61
+ }
62
+ else {
63
+ fromModel = docTypeOrFormGroup;
64
+ }
65
+ const data = this.datastore.createRecord(this.modelType, fromModel);
66
+ return data.patch(origModel);
67
+ }
68
+ newModel(data) {
69
+ return new this.modelType(this.datastore, data);
70
+ }
71
+ toFormGroup(fb, fromModel) {
72
+ if (fromModel === undefined) {
73
+ fromModel = this.newModel();
74
+ }
75
+ return fromModel.getFromGroup(fb);
76
+ }
77
+ fromFormGroup(formGroup, id) {
78
+ // const saveModel = this.newModel(formGroup.getRawValue());
79
+ // saveModel.id = id ? id : null;
80
+ // return saveModel;
81
+ const saveModel = this.newModel();
82
+ saveModel.getModelFromFormGroup(formGroup);
83
+ saveModel.id = id ? id : null;
84
+ return saveModel;
85
+ }
86
+ }
87
+ BaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseService, deps: [{ token: i1.BaseDatastore }], target: i0.ɵɵFactoryTarget.Injectable });
88
+ BaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseService, providedIn: 'root' });
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseService, decorators: [{
90
+ type: Injectable,
91
+ args: [{
92
+ providedIn: 'root'
93
+ }]
94
+ }], ctorParameters: function () { return [{ type: i1.BaseDatastore }]; } });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcm9zb2Z0bGFiL2NvcmUvc3JjL2xpYi9zZXJ2aWNlcy9iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVV4RCxNQUFNLE9BQWdCLFdBQVc7SUFFL0IsWUFBbUIsU0FBd0I7UUFBeEIsY0FBUyxHQUFULFNBQVMsQ0FBZTtJQUMzQyxDQUFDO0lBQ0QsWUFBWSxDQUFDLFNBQXVCO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxHQUFHLENBQUMsRUFBUSxFQUFFLGdCQUF3QixFQUFFO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNsRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVksRUFDakIsUUFBZ0IsRUFDaEIsT0FBZSxFQUFFLEVBQ2pCLFVBQWtCLEVBQUUsRUFDcEIsZ0JBQXdCLEVBQUU7UUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDcEQ7WUFDRSxJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLEtBQUssRUFBRSxJQUFJO1lBQ1gsT0FBTyxFQUFFLE9BQU87WUFDaEIsYUFBYTtTQUNkLENBQUMsQ0FBQztRQUNMLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxNQUFNLENBQUMsRUFBTztRQUNaLE1BQU0sUUFBUSxH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QUMsUUFBUSxFQUFFLENBQUM7UUFDbEMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOzt3R0FyR21CLFdBQVc7NEdBQVgsV0FBVyxjQUZuQixNQUFNOzJGQUVFLFdBQVc7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCYXNlUXVlcnlEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2Jhc2UtcXVlcnktZGF0YSc7XHJcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4uL21vZGVscy9iYXNlLm1vZGVsJztcclxuaW1wb3J0IHsgQmFzZURhdGFzdG9yZSwgTW9kZWxUeXBlIH0gZnJvbSAnLi9iYXNlLWRhdGFzdG9yZS5zZXJ2aWNlJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2VydmljZTxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XHJcbiAgcHVibGljIG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+O1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhc3RvcmU6IEJhc2VEYXRhc3RvcmUpIHtcclxuICB9XHJcbiAgc2V0TW9kZWxUeXBlKG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+KSB7XHJcbiAgICB0aGlzLm1vZGVsVHlwZSA9IG1vZGVsVHlwZTtcclxuICB9XHJcblxyXG4gIGdldChpZD86IGFueSwgY3VzdG9tSW5jbHVkZTogc3RyaW5nID0gJycpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kYXRhc3RvcmUuZmluZFJlY29yZCh0aGlzLm1vZGVsVHlwZSwgaWQsIHsgY3VzdG9tSW5jbHVkZSB9KTtcclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIGdldEFsbChwYWdlOiBudW1iZXIsXHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyLFxyXG4gICAgc29ydDogc3RyaW5nID0gJycsXHJcbiAgICBmaWx0ZXJzOiBzdHJpbmcgPSAnJyxcclxuICAgIGN1c3RvbUluY2x1ZGU6IHN0cmluZyA9ICcnKTogT2JzZXJ2YWJsZTxCYXNlUXVlcnlEYXRhPFQ+PiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZGF0YXN0b3JlLmZpbmRBbGwodGhpcy5tb2RlbFR5cGUsXHJcbiAgICAgIHtcclxuICAgICAgICBQYWdlOiBwYWdlLFxyXG4gICAgICAgIFBhZ2VTaXplOiBwYWdlU2l6ZSxcclxuICAgICAgICBTb3J0czogc29ydCxcclxuICAgICAgICBGaWx0ZXJzOiBmaWx0ZXJzLFxyXG4gICAgICAgIGN1c3RvbUluY2x1ZGVcclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG4gIGRlbGV0ZShpZDogYW55KTogT2JzZXJ2YWJsZTx7fT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmRhdGFzdG9yZS5kZWxldGVSZWNvcmQodGhpcy5tb2RlbFR5cGUsIGlkKTtcclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcbiAgZ2V0Q3VzdG9tPFU+KHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZyxcclxuICAgIGN1c3RvbVJlc3BvbnNlVHlwZT86IGFueSk6IE9ic2VydmFibGU8VT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YXN0b3JlLmdldEN1c3RvbTxVLCBUPih0aGlzLm1vZGVsVHlwZSwgcGFyYW1zLCBoZWFkZXJzLCBjdXN0b21VcmwsIGN1c3RvbVJlc3BvbnNlVHlwZSk7XHJcbiAgfVxyXG4gIHBvc3RDdXN0b208VT4oXHJcbiAgICBib2R5OiBhbnksXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFU+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFzdG9yZS5wb3N0Q3VzdG9tPFUsIFQ+KHRoaXMubW9kZWxUeXBlLCBib2R5LCBwYXJhbXMsIGhlYWRlcnMsIGN1c3RvbVVybCk7XHJcbiAgfVxyXG4gIHBhdGNoQ3VzdG9tPFU+KFxyXG4gICAgYm9keTogYW55LFxyXG4gICAgcGFyYW1zPzogYW55LFxyXG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzLFxyXG4gICAgY3VzdG9tVXJsPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxVPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhc3RvcmUucGF0Y2hDdXN0b208VSwgVD4odGhpcy5tb2RlbFR5cGUsIGJvZHksIHBhcmFtcywgaGVhZGVycywgY3VzdG9tVXJsKTtcclxuICB9XHJcbiAgLy8gY2hlY2tJZlByb3BlcnR5VW5pcXVlKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuXHJcbiAgLy8gfVxyXG5cclxuICBzYXZlKGRvY1R5cGVPckZvcm1Hcm91cDogVCB8IEZvcm1Hcm91cCwgaWQ/OiBhbnksIG9yaWdNb2RlbD86IFQpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGlmIChpZCA9PSBudWxsKSB7XHJcbiAgICAgIGxldCBmcm9tTW9kZWw6IFQ7XHJcbiAgICAgIGlmIChkb2NUeXBlT3JGb3JtR3JvdXAgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgICBmcm9tTW9kZWwgPSB0aGlzLmZyb21Gb3JtR3JvdXAoZG9jVHlwZU9yRm9ybUdyb3VwLCBpZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZnJvbU1vZGVsID0gZG9jVHlwZU9yRm9ybUdyb3VwO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFzdG9yZS5jcmVhdGVSZWNvcmQodGhpcy5tb2RlbFR5cGUsIGZyb21Nb2RlbCk7XHJcbiAgICAgIHJldHVybiBkYXRhLnNhdmUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBhdGNoKGRvY1R5cGVPckZvcm1Hcm91cCwgb3JpZ01vZGVsLCBpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYXRjaChkb2NUeXBlT3JGb3JtR3JvdXA6IFQgfCBGb3JtR3JvdXAsIG9yaWdNb2RlbDogVCwgaWQ/OiBhbnkpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGxldCBmcm9tTW9kZWw6IFQ7XHJcbiAgICBpZiAoZG9jVHlwZU9yRm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgIGZyb21Nb2RlbCA9IHRoaXMuZnJvbUZvcm1Hcm91cChkb2NUeXBlT3JGb3JtR3JvdXAsIGlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZyb21Nb2RlbCA9IGRvY1R5cGVPckZvcm1Hcm91cDtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFzdG9yZS5jcmVhdGVSZWNvcmQodGhpcy5tb2RlbFR5cGUsIGZyb21Nb2RlbCk7XHJcbiAgICByZXR1cm4gZGF0YS5wYXRjaChvcmlnTW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgbmV3TW9kZWwoZGF0YT86IGFueSk6IFQge1xyXG4gICAgcmV0dXJuIG5ldyB0aGlzLm1vZGVsVHlwZSh0aGlzLmRhdGFzdG9yZSwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICB0b0Zvcm1Hcm91cChmYjogRm9ybUJ1aWxkZXIsIGZyb21Nb2RlbD86IFQpOiBGb3JtR3JvdXAge1xyXG4gICAgaWYgKGZyb21Nb2RlbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZyb21Nb2RlbCA9IHRoaXMubmV3TW9kZWwoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tTW9kZWwuZ2V0RnJvbUdyb3VwKGZiKTtcclxuICB9XHJcblxyXG4gIGZyb21Gb3JtR3JvdXAoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGlkPzogYW55KTogVCB7XHJcbiAgICAvLyBjb25zdCBzYXZlTW9kZWwgPSB0aGlzLm5ld01vZGVsKGZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpKTtcclxuICAgIC8vIHNhdmVNb2RlbC5pZCA9IGlkID8gaWQgOiBudWxsO1xyXG4gICAgLy8gcmV0dXJuIHNhdmVNb2RlbDtcclxuICAgIGNvbnN0IHNhdmVNb2RlbCA9IHRoaXMubmV3TW9kZWwoKTtcclxuICAgIHNhdmVNb2RlbC5nZXRNb2RlbEZyb21Gb3JtR3JvdXAoZm9ybUdyb3VwKVxyXG4gICAgc2F2ZU1vZGVsLmlkID0gaWQgPyBpZCA6IG51bGw7ICAgIFxyXG4gICAgcmV0dXJuIHNhdmVNb2RlbDtcclxuICB9XHJcbn0iXX0=