@veloceapps/api 4.0.21-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +3 -0
  2. package/bundles/veloceapps-api.umd.js +2950 -0
  3. package/bundles/veloceapps-api.umd.js.map +1 -0
  4. package/esm2015/index.js +25 -0
  5. package/esm2015/lib/api.module.js +89 -0
  6. package/esm2015/lib/services/account-api.service.js +50 -0
  7. package/esm2015/lib/services/catalog-admin-api.service.js +159 -0
  8. package/esm2015/lib/services/catalog-api.service.js +90 -0
  9. package/esm2015/lib/services/configuration-api.service.js +73 -0
  10. package/esm2015/lib/services/configuration-settings-api.service.js +52 -0
  11. package/esm2015/lib/services/context-api.service.js +26 -0
  12. package/esm2015/lib/services/delta-api.service.js +27 -0
  13. package/esm2015/lib/services/document-attachment-api.service.js +66 -0
  14. package/esm2015/lib/services/document-templates-api.service.js +284 -0
  15. package/esm2015/lib/services/flows-api.service.js +24 -0
  16. package/esm2015/lib/services/picklists-api.service.js +38 -0
  17. package/esm2015/lib/services/price-api.service.js +63 -0
  18. package/esm2015/lib/services/procedures-api.service.js +93 -0
  19. package/esm2015/lib/services/product-api.service.js +153 -0
  20. package/esm2015/lib/services/product-model-api.service.js +232 -0
  21. package/esm2015/lib/services/quote-api.service.js +48 -0
  22. package/esm2015/lib/services/ramp-api.service.js +21 -0
  23. package/esm2015/lib/services/rule-groups-api.service.js +62 -0
  24. package/esm2015/lib/services/rules-api.service.js +81 -0
  25. package/esm2015/lib/services/salesforce-api.service.js +40 -0
  26. package/esm2015/lib/services/scripts-api.service.js +76 -0
  27. package/esm2015/lib/services/ui-templates-api.service.js +282 -0
  28. package/esm2015/lib/types/clone-request.types.js +2 -0
  29. package/esm2015/lib/types/delta-request.types.js +2 -0
  30. package/esm2015/lib/types/dto/attribute-dto.types.js +21 -0
  31. package/esm2015/lib/types/dto/charge-group-item-dto.types.js +49 -0
  32. package/esm2015/lib/types/dto/charge-item-dto.types.js +78 -0
  33. package/esm2015/lib/types/dto/configuration-dto.types.js +19 -0
  34. package/esm2015/lib/types/dto/configuration-settings-dto.types.js +22 -0
  35. package/esm2015/lib/types/dto/domain-type-dto.types.js +27 -0
  36. package/esm2015/lib/types/dto/line-item-dto.types.js +103 -0
  37. package/esm2015/lib/types/dto/port-domain-dto.types.js +22 -0
  38. package/esm2015/lib/types/dto/price-adjustment-dto.types.js +15 -0
  39. package/esm2015/lib/types/dto/price-dto.types.js +25 -0
  40. package/esm2015/lib/types/dto/recommended-price-dto.types.js +25 -0
  41. package/esm2015/lib/types/dto/ui-template-dto.types.js +2 -0
  42. package/esm2015/lib/types/index.js +5 -0
  43. package/esm2015/lib/types/price.types.js +2 -0
  44. package/esm2015/lib/types/ramp-request.types.js +2 -0
  45. package/esm2015/lib/types/search-request.types.js +2 -0
  46. package/esm2015/lib/utils/ui-template.utils.js +13 -0
  47. package/esm2015/veloceapps-api.js +5 -0
  48. package/fesm2015/veloceapps-api.js +2420 -0
  49. package/fesm2015/veloceapps-api.js.map +1 -0
  50. package/index.d.ts +24 -0
  51. package/lib/api.module.d.ts +7 -0
  52. package/lib/services/account-api.service.d.ts +22 -0
  53. package/lib/services/catalog-admin-api.service.d.ts +34 -0
  54. package/lib/services/catalog-api.service.d.ts +20 -0
  55. package/lib/services/configuration-api.service.d.ts +18 -0
  56. package/lib/services/configuration-settings-api.service.d.ts +17 -0
  57. package/lib/services/context-api.service.d.ts +11 -0
  58. package/lib/services/delta-api.service.d.ts +12 -0
  59. package/lib/services/document-attachment-api.service.d.ts +16 -0
  60. package/lib/services/document-templates-api.service.d.ts +47 -0
  61. package/lib/services/flows-api.service.d.ts +13 -0
  62. package/lib/services/picklists-api.service.d.ts +17 -0
  63. package/lib/services/price-api.service.d.ts +16 -0
  64. package/lib/services/procedures-api.service.d.ts +27 -0
  65. package/lib/services/product-api.service.d.ts +31 -0
  66. package/lib/services/product-model-api.service.d.ts +30 -0
  67. package/lib/services/quote-api.service.d.ts +25 -0
  68. package/lib/services/ramp-api.service.d.ts +13 -0
  69. package/lib/services/rule-groups-api.service.d.ts +18 -0
  70. package/lib/services/rules-api.service.d.ts +21 -0
  71. package/lib/services/salesforce-api.service.d.ts +17 -0
  72. package/lib/services/scripts-api.service.d.ts +21 -0
  73. package/lib/services/ui-templates-api.service.d.ts +49 -0
  74. package/lib/types/clone-request.types.d.ts +5 -0
  75. package/lib/types/delta-request.types.d.ts +5 -0
  76. package/lib/types/dto/attribute-dto.types.d.ts +11 -0
  77. package/lib/types/dto/charge-group-item-dto.types.d.ts +26 -0
  78. package/lib/types/dto/charge-item-dto.types.d.ts +41 -0
  79. package/lib/types/dto/configuration-dto.types.d.ts +18 -0
  80. package/lib/types/dto/configuration-settings-dto.types.d.ts +9 -0
  81. package/lib/types/dto/domain-type-dto.types.d.ts +15 -0
  82. package/lib/types/dto/line-item-dto.types.d.ts +55 -0
  83. package/lib/types/dto/port-domain-dto.types.d.ts +13 -0
  84. package/lib/types/dto/price-adjustment-dto.types.d.ts +8 -0
  85. package/lib/types/dto/price-dto.types.d.ts +13 -0
  86. package/lib/types/dto/recommended-price-dto.types.d.ts +14 -0
  87. package/lib/types/dto/ui-template-dto.types.d.ts +6 -0
  88. package/lib/types/index.d.ts +4 -0
  89. package/lib/types/price.types.d.ts +5 -0
  90. package/lib/types/ramp-request.types.d.ts +13 -0
  91. package/lib/types/search-request.types.d.ts +8 -0
  92. package/lib/utils/ui-template.utils.d.ts +3 -0
  93. package/package.json +37 -0
  94. package/veloceapps-api.d.ts +5 -0
@@ -0,0 +1,63 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@veloceapps/core";
4
+ export class PriceApiService {
5
+ constructor(httpService) {
6
+ this.httpService = httpService;
7
+ this.SERVICE_URL = '/price';
8
+ }
9
+ calculate(request) {
10
+ return this.httpService.api({
11
+ method: 'post',
12
+ url: `${this.SERVICE_URL}/calculate`,
13
+ body: request,
14
+ skipErrorHandler: true,
15
+ });
16
+ }
17
+ getPriceLists() {
18
+ return this.httpService.api({
19
+ method: 'get',
20
+ url: '/price-lists',
21
+ });
22
+ }
23
+ getPriceList(id) {
24
+ return this.httpService.api({
25
+ method: 'get',
26
+ url: `/price-lists/${id}`,
27
+ });
28
+ }
29
+ getSellingTermByEndDate(planId, offeringId, startDate, endDate, frequencyUnit, frequencyDuration) {
30
+ return this.httpService.api({
31
+ method: 'post',
32
+ url: `${this.SERVICE_URL}/selling-term-by-end-date`,
33
+ body: {
34
+ planId: planId,
35
+ offeringId: offeringId,
36
+ startDate: startDate,
37
+ endDate: endDate,
38
+ frequencyUnit: frequencyUnit,
39
+ frequencyDuration: frequencyDuration,
40
+ },
41
+ });
42
+ }
43
+ getSellingTermByTerm(planId, offeringId, startDate, term, frequencyUnit, frequencyDuration) {
44
+ return this.httpService.api({
45
+ method: 'post',
46
+ url: `${this.SERVICE_URL}/selling-term-by-term`,
47
+ body: {
48
+ planId: planId,
49
+ offeringId: offeringId,
50
+ startDate: startDate,
51
+ term: term,
52
+ frequencyUnit: frequencyUnit,
53
+ frequencyDuration: frequencyDuration,
54
+ },
55
+ });
56
+ }
57
+ }
58
+ PriceApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PriceApiService, deps: [{ token: i1.BaseHttpService }], target: i0.ɵɵFactoryTarget.Injectable });
59
+ PriceApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PriceApiService });
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PriceApiService, decorators: [{
61
+ type: Injectable
62
+ }], ctorParameters: function () { return [{ type: i1.BaseHttpService }]; } });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpY2UtYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9zcmMvbGliL3NlcnZpY2VzL3ByaWNlLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU0zQyxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFvQixXQUE0QjtRQUE1QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFGL0IsZ0JBQVcsR0FBRyxRQUFRLENBQUM7SUFFVyxDQUFDO0lBRXBELFNBQVMsQ0FBQyxPQUE4QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQzFCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsWUFBWTtZQUNwQyxJQUFJLEVBQUUsT0FBTztZQUNiLGdCQUFnQixFQUFFLElBQUk7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQzFCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsR0FBRyxFQUFFLGNBQWM7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxFQUFVO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDMUIsTUFBTSxFQUFFLEtBQUs7WUFDYixHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUJBQXVCLENBQ3JCLE1BQWUsRUFDZixVQUFtQixFQUNuQixTQUFrQixFQUNsQixPQUFnQixFQUNoQixhQUFzQixFQUN0QixpQkFBMEI7UUFFMUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUMxQixNQUFNLEVBQUUsTUFBTTtZQUNkLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLDJCQUEyQjtZQUNuRCxJQUFJLEVBQUU7Z0JBQ0osTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixPQUFPLEVBQUUsT0FBTztnQkFDaEIsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLGlCQUFpQixFQUFFLGlCQUFpQjthQUNyQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxvQkFBb0IsQ0FDbEIsTUFBZSxFQUNmLFVBQW1CLEVBQ25CLFNBQWtCLEVBQ2xCLElBQWEsRUFDYixhQUFzQixFQUN0QixpQkFBMEI7UUFFMUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUMxQixNQUFNLEVBQUUsTUFBTTtZQUNkLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLHVCQUF1QjtZQUMvQyxJQUFJLEVBQUU7Z0JBQ0osTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixJQUFJLEVBQUUsSUFBSTtnQkFDVixhQUFhLEVBQUUsYUFBYTtnQkFDNUIsaUJBQWlCLEVBQUUsaUJBQWlCO2FBQ3JDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NkdBdEVVLGVBQWU7aUhBQWYsZUFBZTs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUh0dHBTZXJ2aWNlLCBQcmljZUxpc3QsIFByaWNlU3VtbWFyeSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJpY2VDYWxjdWxhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMvcHJpY2UudHlwZXMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJpY2VBcGlTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBTRVJWSUNFX1VSTCA9ICcvcHJpY2UnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cFNlcnZpY2U6IEJhc2VIdHRwU2VydmljZSkge31cblxuICBjYWxjdWxhdGUocmVxdWVzdDogUHJpY2VDYWxjdWxhdGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxQcmljZVN1bW1hcnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9L2NhbGN1bGF0ZWAsXG4gICAgICBib2R5OiByZXF1ZXN0LFxuICAgICAgc2tpcEVycm9ySGFuZGxlcjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFByaWNlTGlzdHMoKTogT2JzZXJ2YWJsZTxQcmljZUxpc3RbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgdXJsOiAnL3ByaWNlLWxpc3RzJyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFByaWNlTGlzdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxQcmljZUxpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgIHVybDogYC9wcmljZS1saXN0cy8ke2lkfWAsXG4gICAgfSk7XG4gIH1cblxuICBnZXRTZWxsaW5nVGVybUJ5RW5kRGF0ZShcbiAgICBwbGFuSWQ/OiBzdHJpbmcsXG4gICAgb2ZmZXJpbmdJZD86IHN0cmluZyxcbiAgICBzdGFydERhdGU/OiBzdHJpbmcsXG4gICAgZW5kRGF0ZT86IHN0cmluZyxcbiAgICBmcmVxdWVuY3lVbml0Pzogc3RyaW5nLFxuICAgIGZyZXF1ZW5jeUR1cmF0aW9uPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vc2VsbGluZy10ZXJtLWJ5LWVuZC1kYXRlYCxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcGxhbklkOiBwbGFuSWQsXG4gICAgICAgIG9mZmVyaW5nSWQ6IG9mZmVyaW5nSWQsXG4gICAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlLFxuICAgICAgICBlbmREYXRlOiBlbmREYXRlLFxuICAgICAgICBmcmVxdWVuY3lVbml0OiBmcmVxdWVuY3lVbml0LFxuICAgICAgICBmcmVxdWVuY3lEdXJhdGlvbjogZnJlcXVlbmN5RHVyYXRpb24sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2VsbGluZ1Rlcm1CeVRlcm0oXG4gICAgcGxhbklkPzogc3RyaW5nLFxuICAgIG9mZmVyaW5nSWQ/OiBzdHJpbmcsXG4gICAgc3RhcnREYXRlPzogc3RyaW5nLFxuICAgIHRlcm0/OiBudW1iZXIsXG4gICAgZnJlcXVlbmN5VW5pdD86IHN0cmluZyxcbiAgICBmcmVxdWVuY3lEdXJhdGlvbj86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9L3NlbGxpbmctdGVybS1ieS10ZXJtYCxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcGxhbklkOiBwbGFuSWQsXG4gICAgICAgIG9mZmVyaW5nSWQ6IG9mZmVyaW5nSWQsXG4gICAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlLFxuICAgICAgICB0ZXJtOiB0ZXJtLFxuICAgICAgICBmcmVxdWVuY3lVbml0OiBmcmVxdWVuY3lVbml0LFxuICAgICAgICBmcmVxdWVuY3lEdXJhdGlvbjogZnJlcXVlbmN5RHVyYXRpb24sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,93 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { Expression, } from '@veloceapps/core';
4
+ import { map } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@veloceapps/core";
7
+ export class ProceduresApiService {
8
+ constructor(baseHttpService) {
9
+ this.baseHttpService = baseHttpService;
10
+ this.ADMIN_SERVICE_URL = '/admin/procedures';
11
+ this.SERVICE_URL = '/procedures';
12
+ this.fetchProcedures$ = () => {
13
+ return this.searchProcedures$(new Expression(), 0, 100);
14
+ };
15
+ this.searchProcedures$ = (expression, skip, count) => {
16
+ let params = new HttpParams();
17
+ params = params.set('skip', '' + skip);
18
+ params = params.set('count', '' + count);
19
+ return this.baseHttpService.api({
20
+ method: 'post',
21
+ url: `${this.ADMIN_SERVICE_URL}/search`,
22
+ params,
23
+ body: expression,
24
+ });
25
+ };
26
+ this.createProcedure$ = (newProcedure) => {
27
+ return this.baseHttpService.api({
28
+ url: `${this.ADMIN_SERVICE_URL}`,
29
+ method: 'post',
30
+ body: newProcedure,
31
+ });
32
+ };
33
+ this.updateProcedure$ = (procedure) => {
34
+ return this.baseHttpService.api({
35
+ url: `${this.ADMIN_SERVICE_URL}/${procedure.id}`,
36
+ method: 'put',
37
+ body: procedure,
38
+ });
39
+ };
40
+ this.duplicateProcedure$ = (body) => {
41
+ return this.baseHttpService
42
+ .api({
43
+ url: `${this.ADMIN_SERVICE_URL}/${body.id}/clone`,
44
+ method: 'post',
45
+ body,
46
+ })
47
+ .pipe(map(response => response.clonedRecordId));
48
+ };
49
+ this.removeProcedure$ = (id) => {
50
+ return this.baseHttpService.api({
51
+ url: `${this.ADMIN_SERVICE_URL}/${id}`,
52
+ method: 'delete',
53
+ });
54
+ };
55
+ this.restoreProcedure$ = (id) => {
56
+ return this.baseHttpService.api({
57
+ url: `${this.ADMIN_SERVICE_URL}/${id}/restore`,
58
+ method: 'patch',
59
+ });
60
+ };
61
+ }
62
+ fetchProcedure$(id) {
63
+ return this.baseHttpService.api({
64
+ url: `${this.ADMIN_SERVICE_URL}/${id}`,
65
+ method: 'get',
66
+ });
67
+ }
68
+ execute$(body) {
69
+ return this.baseHttpService.api({
70
+ url: `${this.SERVICE_URL}/execute`,
71
+ method: 'post',
72
+ body,
73
+ });
74
+ }
75
+ /**
76
+ * Run active procedure against QuoteDraft
77
+ * @param body
78
+ * @returns
79
+ */
80
+ apply$(body) {
81
+ return this.baseHttpService.api({
82
+ url: `${this.SERVICE_URL}/apply`,
83
+ method: 'post',
84
+ body,
85
+ });
86
+ }
87
+ }
88
+ ProceduresApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProceduresApiService, deps: [{ token: i1.BaseHttpService }], target: i0.ɵɵFactoryTarget.Injectable });
89
+ ProceduresApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProceduresApiService });
90
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProceduresApiService, decorators: [{
91
+ type: Injectable
92
+ }], ctorParameters: function () { return [{ type: i1.BaseHttpService }]; } });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL3NyYy9saWIvc2VydmljZXMvcHJvY2VkdXJlcy1hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsVUFBVSxHQUtYLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFJckMsTUFBTSxPQUFPLG9CQUFvQjtJQUkvQixZQUFvQixlQUFnQztRQUFoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFIbkMsc0JBQWlCLEdBQVcsbUJBQW1CLENBQUM7UUFDaEQsZ0JBQVcsR0FBVyxhQUFhLENBQUM7UUFJckQscUJBQWdCLEdBQUcsR0FBNEIsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUM7UUFFRixzQkFBaUIsR0FBRyxDQUFDLFVBQXNCLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFBMkIsRUFBRTtZQUNuRyxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDdkMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO2dCQUM5QixNQUFNLEVBQUUsTUFBTTtnQkFD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O1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUh0dHBTZXJ2aWNlLFxuICBFeHByZXNzaW9uLFxuICBOZXdQcm9jZWR1cmUsXG4gIFByb2NlZHVyZSxcbiAgUHJvY2VkdXJlRXhlY3V0ZVJlcXVlc3QsXG4gIFF1b3RlRHJhZnQsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2xvbmVSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMvY2xvbmUtcmVxdWVzdC50eXBlcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQcm9jZWR1cmVzQXBpU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgQURNSU5fU0VSVklDRV9VUkw6IHN0cmluZyA9ICcvYWRtaW4vcHJvY2VkdXJlcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0VSVklDRV9VUkw6IHN0cmluZyA9ICcvcHJvY2VkdXJlcyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXNlSHR0cFNlcnZpY2U6IEJhc2VIdHRwU2VydmljZSkge31cblxuICBmZXRjaFByb2NlZHVyZXMkID0gKCk6IE9ic2VydmFibGU8UHJvY2VkdXJlW10+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hQcm9jZWR1cmVzJChuZXcgRXhwcmVzc2lvbigpLCAwLCAxMDApO1xuICB9O1xuXG4gIHNlYXJjaFByb2NlZHVyZXMkID0gKGV4cHJlc3Npb246IEV4cHJlc3Npb24sIHNraXA6IG51bWJlciwgY291bnQ6IG51bWJlcik6IE9ic2VydmFibGU8UHJvY2VkdXJlW10+ID0+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdza2lwJywgJycgKyBza2lwKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb3VudCcsICcnICsgY291bnQpO1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6IGAke3RoaXMuQURNSU5fU0VSVklDRV9VUkx9L3NlYXJjaGAsXG4gICAgICBwYXJhbXMsXG4gICAgICBib2R5OiBleHByZXNzaW9uLFxuICAgIH0pO1xuICB9O1xuXG4gIGNyZWF0ZVByb2NlZHVyZSQgPSAobmV3UHJvY2VkdXJlOiBOZXdQcm9jZWR1cmUpOiBPYnNlcnZhYmxlPFByb2NlZHVyZT4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGk8UHJvY2VkdXJlPih7XG4gICAgICB1cmw6IGAke3RoaXMuQURNSU5fU0VSVklDRV9VUkx9YCxcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgYm9keTogbmV3UHJvY2VkdXJlLFxuICAgIH0pO1xuICB9O1xuXG4gIHVwZGF0ZVByb2NlZHVyZSQgPSAocHJvY2VkdXJlOiBQcm9jZWR1cmUpOiBPYnNlcnZhYmxlPFByb2NlZHVyZT4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGk8UHJvY2VkdXJlPih7XG4gICAgICB1cmw6IGAke3RoaXMuQURNSU5fU0VSVklDRV9VUkx9LyR7cHJvY2VkdXJlLmlkfWAsXG4gICAgICBtZXRob2Q6ICdwdXQnLFxuICAgICAgYm9keTogcHJvY2VkdXJlLFxuICAgIH0pO1xuICB9O1xuXG4gIGR1cGxpY2F0ZVByb2NlZHVyZSQgPSAoYm9keTogQ2xvbmVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSHR0cFNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICB1cmw6IGAke3RoaXMuQURNSU5fU0VSVklDRV9VUkx9LyR7Ym9keS5pZH0vY2xvbmVgLFxuICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuY2xvbmVkUmVjb3JkSWQpKTtcbiAgfTtcblxuICByZW1vdmVQcm9jZWR1cmUkID0gKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGk8c3RyaW5nPih7XG4gICAgICB1cmw6IGAke3RoaXMuQURNSU5fU0VSVklDRV9VUkx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH07XG5cbiAgcmVzdG9yZVByb2NlZHVyZSQgPSAoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaTxzdHJpbmc+KHtcbiAgICAgIHVybDogYCR7dGhpcy5BRE1JTl9TRVJWSUNFX1VSTH0vJHtpZH0vcmVzdG9yZWAsXG4gICAgICBtZXRob2Q6ICdwYXRjaCcsXG4gICAgfSk7XG4gIH07XG5cbiAgZmV0Y2hQcm9jZWR1cmUkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFByb2NlZHVyZT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGk8UHJvY2VkdXJlPih7XG4gICAgICB1cmw6IGAke3RoaXMuQURNSU5fU0VSVklDRV9VUkx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgfSk7XG4gIH1cblxuICBleGVjdXRlJChib2R5OiBQcm9jZWR1cmVFeGVjdXRlUmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGk8c3RyaW5nW10+KHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vZXhlY3V0ZWAsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFjdGl2ZSBwcm9jZWR1cmUgYWdhaW5zdCBRdW90ZURyYWZ0XG4gICAqIEBwYXJhbSBib2R5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhcHBseSQoYm9keTogUXVvdGVEcmFmdCk6IE9ic2VydmFibGU8UXVvdGVEcmFmdD4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGk8UXVvdGVEcmFmdD4oe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS9hcHBseWAsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,153 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { noop } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@veloceapps/core";
6
+ export class ProductApiService {
7
+ constructor(baseHttpService) {
8
+ this.baseHttpService = baseHttpService;
9
+ this.serviceUrl = '/products';
10
+ this.fetchProducts$ = (payload) => {
11
+ let params = new HttpParams();
12
+ params = params.append('count', payload.count);
13
+ params = params.append('skip', payload.skip);
14
+ if (payload.name) {
15
+ params = params.append('name', payload.name);
16
+ }
17
+ return this.baseHttpService.api({ url: `${this.serviceUrl}`, params });
18
+ };
19
+ this.searchProducts$ = (expression, skip, count) => {
20
+ let params = new HttpParams();
21
+ params = params.set('skip', '' + skip);
22
+ params = params.set('count', '' + count);
23
+ return this.baseHttpService.api({
24
+ method: 'post',
25
+ url: `${this.serviceUrl}/search`,
26
+ params: params,
27
+ body: expression,
28
+ });
29
+ };
30
+ this.fetchProduct$ = (id) => this.baseHttpService.api({ url: `${this.serviceUrl}/${id}` });
31
+ this.fetchAttributes$ = () => {
32
+ return this.baseHttpService.api({ url: `${this.serviceUrl}/attributes/definition` });
33
+ };
34
+ this.searchAttributes$ = (expression, skip, count) => {
35
+ let params = new HttpParams();
36
+ params = params.set('skip', '' + skip);
37
+ params = params.set('count', '' + count);
38
+ return this.baseHttpService.api({
39
+ method: 'post',
40
+ url: `${this.serviceUrl}/attributes/definition/search`,
41
+ params: params,
42
+ body: expression,
43
+ });
44
+ };
45
+ this.fetchAttributesByModel = (modelId) => {
46
+ return this.baseHttpService.api({ url: `${this.serviceUrl}/attributes/definition/forModel/${modelId}` });
47
+ };
48
+ this.createNewProduct$ = (productData) => {
49
+ return this.baseHttpService.api({
50
+ url: `${this.serviceUrl}`,
51
+ method: 'post',
52
+ body: productData,
53
+ });
54
+ };
55
+ this.updateProduct$ = (body) => {
56
+ return this.baseHttpService.api({
57
+ url: `${this.serviceUrl}/${body.id}`,
58
+ method: 'put',
59
+ body,
60
+ });
61
+ };
62
+ this.removeProduct$ = (id) => {
63
+ return this.baseHttpService.api({
64
+ url: `${this.serviceUrl}/${id}`,
65
+ method: 'delete',
66
+ });
67
+ };
68
+ this.restoreProduct$ = (id) => {
69
+ return this.baseHttpService.api({
70
+ url: `${this.serviceUrl}/${id}/restore`,
71
+ method: 'patch',
72
+ });
73
+ };
74
+ this.createProductAttribute$ = (attributeData) => {
75
+ return this.baseHttpService.api({
76
+ url: `${this.serviceUrl}/attributes`,
77
+ method: 'post',
78
+ body: attributeData,
79
+ });
80
+ };
81
+ this.updateProductAttribute$ = (attributeData) => {
82
+ return this.baseHttpService.api({
83
+ url: `${this.serviceUrl}/attributes/${attributeData.id}`,
84
+ method: 'put',
85
+ body: attributeData,
86
+ });
87
+ };
88
+ this.removeProductAttribute$ = (id) => {
89
+ return this.baseHttpService.api({
90
+ url: `${this.serviceUrl}/attributes/${id}`,
91
+ method: 'delete',
92
+ });
93
+ };
94
+ this.createNewAttribute$ = (attributeData) => {
95
+ return this.baseHttpService.api({
96
+ url: `${this.serviceUrl}/attributes/definition`,
97
+ method: 'post',
98
+ body: attributeData,
99
+ });
100
+ };
101
+ this.updateAttribute$ = (body) => {
102
+ return this.baseHttpService.api({
103
+ url: `${this.serviceUrl}/attributes/definition/${body.id}`,
104
+ method: 'put',
105
+ body,
106
+ });
107
+ };
108
+ this.removeAttribute$ = (id) => {
109
+ return this.baseHttpService.api({
110
+ url: `${this.serviceUrl}/attributes/definition/${id}`,
111
+ method: 'delete',
112
+ });
113
+ };
114
+ this.restoreAttribute$ = (id) => {
115
+ return this.baseHttpService.api({
116
+ url: `${this.serviceUrl}/attributes/definition/${id}/restore`,
117
+ method: 'patch',
118
+ });
119
+ };
120
+ }
121
+ attachImage$(productId, file) {
122
+ const data = new FormData();
123
+ data.append('image', file);
124
+ return this.baseHttpService.upload({
125
+ method: 'post',
126
+ url: `${this.serviceUrl}/${productId}/image`,
127
+ body: data,
128
+ });
129
+ }
130
+ removeImage$(productId) {
131
+ return this.baseHttpService.api({
132
+ method: 'delete',
133
+ url: `${this.serviceUrl}/${productId}/image`,
134
+ });
135
+ }
136
+ fetchImage$(productId) {
137
+ return this.baseHttpService.api({
138
+ url: this.getImageUrl(productId),
139
+ method: 'get',
140
+ responseType: 'blob',
141
+ errorHandler: noop,
142
+ });
143
+ }
144
+ getImageUrl(productId) {
145
+ return `${this.serviceUrl}/${productId}/image`;
146
+ }
147
+ }
148
+ ProductApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductApiService, deps: [{ token: i1.BaseHttpService }], target: i0.ɵɵFactoryTarget.Injectable });
149
+ ProductApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductApiService });
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductApiService, decorators: [{
151
+ type: Injectable
152
+ }], ctorParameters: function () { return [{ type: i1.BaseHttpService }]; } });
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL3NyYy9saWIvc2VydmljZXMvcHJvZHVjdC1hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVkzQyxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7QUFHeEMsTUFBTSxPQUFPLGlCQUFpQjtJQUc1QixZQUFvQixlQUFnQztRQUFoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFGbkMsZUFBVSxHQUFXLFdBQVcsQ0FBQztRQUlsRCxtQkFBYyxHQUFHLENBQUMsT0FBeUIsRUFBeUIsRUFBRTtZQUNwRSxJQUFJLE1BQU0sR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDOUM7WUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDO1FBRUYsb0JBQWUsR0FBRyxDQUFDLFVBQXNCLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFBeUIsRUFBRTtZQUMv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QVMsUUFBUTtZQUM1QyxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBaUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUM5QixNQUFNLEVBQUUsUUFBUTtZQUNoQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLFNBQVMsUUFBUTtTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLFNBQWlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7WUFDOUIsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQ2hDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsWUFBWSxFQUFFLE1BQU07WUFDcEIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFpQjtRQUMzQixPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLFFBQVEsQ0FBQztJQUNqRCxDQUFDOzsrR0FqS1UsaUJBQWlCO21IQUFqQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVEZWZpbml0aW9uLFxuICBCYXNlSHR0cFNlcnZpY2UsXG4gIEV4cHJlc3Npb24sXG4gIExhenlDaHVua1JlcXVlc3QsXG4gIE5ld0F0dHJpYnV0ZURlZmluaXRpb24sXG4gIE5ld1Byb2R1Y3QsXG4gIE5ld1Byb2R1Y3RBdHRyaWJ1dGUsXG4gIFByb2R1Y3QsXG4gIFByb2R1Y3RBdHRyaWJ1dGUsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgbm9vcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvZHVjdEFwaVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VVcmw6IHN0cmluZyA9ICcvcHJvZHVjdHMnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmFzZUh0dHBTZXJ2aWNlOiBCYXNlSHR0cFNlcnZpY2UpIHt9XG5cbiAgZmV0Y2hQcm9kdWN0cyQgPSAocGF5bG9hZDogTGF6eUNodW5rUmVxdWVzdCk6IE9ic2VydmFibGU8UHJvZHVjdFtdPiA9PiB7XG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnY291bnQnLCBwYXlsb2FkLmNvdW50KTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdza2lwJywgcGF5bG9hZC5za2lwKTtcbiAgICBpZiAocGF5bG9hZC5uYW1lKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCduYW1lJywgcGF5bG9hZC5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7IHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfWAsIHBhcmFtcyB9KTtcbiAgfTtcblxuICBzZWFyY2hQcm9kdWN0cyQgPSAoZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgc2tpcDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogT2JzZXJ2YWJsZTxQcm9kdWN0W10+ID0+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdza2lwJywgJycgKyBza2lwKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb3VudCcsICcnICsgY291bnQpO1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6IGAke3RoaXMuc2VydmljZVVybH0vc2VhcmNoYCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgYm9keTogZXhwcmVzc2lvbixcbiAgICB9KTtcbiAgfTtcblxuICBmZXRjaFByb2R1Y3QkID0gKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFByb2R1Y3Q+ID0+IHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7IHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfS8ke2lkfWAgfSk7XG5cbiAgZmV0Y2hBdHRyaWJ1dGVzJCA9ICgpOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZURlZmluaXRpb25bXT4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoeyB1cmw6IGAke3RoaXMuc2VydmljZVVybH0vYXR0cmlidXRlcy9kZWZpbml0aW9uYCB9KTtcbiAgfTtcblxuICBzZWFyY2hBdHRyaWJ1dGVzJCA9IChleHByZXNzaW9uOiBFeHByZXNzaW9uLCBza2lwOiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiBPYnNlcnZhYmxlPEF0dHJpYnV0ZURlZmluaXRpb25bXT4gPT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3NraXAnLCAnJyArIHNraXApO1xuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvdW50JywgJycgKyBjb3VudCk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfS9hdHRyaWJ1dGVzL2RlZmluaXRpb24vc2VhcmNoYCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgYm9keTogZXhwcmVzc2lvbixcbiAgICB9KTtcbiAgfTtcblxuICBmZXRjaEF0dHJpYnV0ZXNCeU1vZGVsID0gKG1vZGVsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXR0cmlidXRlRGVmaW5pdGlvbltdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7IHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfS9hdHRyaWJ1dGVzL2RlZmluaXRpb24vZm9yTW9kZWwvJHttb2RlbElkfWAgfSk7XG4gIH07XG5cbiAgY3JlYXRlTmV3UHJvZHVjdCQgPSAocHJvZHVjdERhdGE6IE5ld1Byb2R1Y3QpOiBPYnNlcnZhYmxlPFByb2R1Y3Q+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSHR0cFNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfWAsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHk6IHByb2R1Y3REYXRhLFxuICAgIH0pO1xuICB9O1xuXG4gIHVwZGF0ZVByb2R1Y3QkID0gKGJvZHk6IFByb2R1Y3QpOiBPYnNlcnZhYmxlPFByb2R1Y3Q+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSHR0cFNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfS8ke2JvZHkuaWR9YCxcbiAgICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICB9O1xuXG4gIHJlbW92ZVByb2R1Y3QkID0gKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLnNlcnZpY2VVcmx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH07XG5cbiAgcmVzdG9yZVByb2R1Y3QkID0gKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSHR0cFNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5zZXJ2aWNlVXJsfS8ke2lkfS9yZXN0b3JlYCxcbiAgICAgIG1ldGhvZDogJ3BhdGNoJyxcbiAgICB9KTtcbiAgfTtcblxuICBjcmVhdGVQcm9kdWN0QXR0cmlidXRlJCA9IChhdHRyaWJ1dGVEYXRhOiBOZXdQcm9kdWN0QXR0cmlidXRlKTogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVEZWZpbml0aW9uPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuc2VydmljZVVybH0vYXR0cmlidXRlc2AsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHk6IGF0dHJpYnV0ZURhdGEsXG4gICAgfSk7XG4gIH07XG5cbiAgdXBkYXRlUHJvZHVjdEF0dHJpYnV0ZSQgPSAoYXR0cmlidXRlRGF0YTogUHJvZHVjdEF0dHJpYnV0ZSk6IE9ic2VydmFibGU8QXR0cmlidXRlRGVmaW5pdGlvbj4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLnNlcnZpY2VVcmx9L2F0dHJpYnV0ZXMvJHthdHRyaWJ1dGVEYXRhLmlkfWAsXG4gICAgICBtZXRob2Q6ICdwdXQnLFxuICAgICAgYm9keTogYXR0cmlidXRlRGF0YSxcbiAgICB9KTtcbiAgfTtcblxuICByZW1vdmVQcm9kdWN0QXR0cmlidXRlJCA9IChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuc2VydmljZVVybH0vYXR0cmlidXRlcy8ke2lkfWAsXG4gICAgICBtZXRob2Q6ICdkZWxldGUnLFxuICAgIH0pO1xuICB9O1xuXG4gIGNyZWF0ZU5ld0F0dHJpYnV0ZSQgPSAoYXR0cmlidXRlRGF0YTogTmV3QXR0cmlidXRlRGVmaW5pdGlvbik6IE9ic2VydmFibGU8QXR0cmlidXRlRGVmaW5pdGlvbj4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLnNlcnZpY2VVcmx9L2F0dHJpYnV0ZXMvZGVmaW5pdGlvbmAsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHk6IGF0dHJpYnV0ZURhdGEsXG4gICAgfSk7XG4gIH07XG5cbiAgdXBkYXRlQXR0cmlidXRlJCA9IChib2R5OiBBdHRyaWJ1dGVEZWZpbml0aW9uKTogT2JzZXJ2YWJsZTxBdHRyaWJ1dGVEZWZpbml0aW9uPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuc2VydmljZVVybH0vYXR0cmlidXRlcy9kZWZpbml0aW9uLyR7Ym9keS5pZH1gLFxuICAgICAgbWV0aG9kOiAncHV0JyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gIH07XG5cbiAgcmVtb3ZlQXR0cmlidXRlJCA9IChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuc2VydmljZVVybH0vYXR0cmlidXRlcy9kZWZpbml0aW9uLyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH07XG5cbiAgcmVzdG9yZUF0dHJpYnV0ZSQgPSAoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4gPT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLnNlcnZpY2VVcmx9L2F0dHJpYnV0ZXMvZGVmaW5pdGlvbi8ke2lkfS9yZXN0b3JlYCxcbiAgICAgIG1ldGhvZDogJ3BhdGNoJyxcbiAgICB9KTtcbiAgfTtcblxuICBhdHRhY2hJbWFnZSQocHJvZHVjdElkOiBzdHJpbmcsIGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZGF0YS5hcHBlbmQoJ2ltYWdlJywgZmlsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5iYXNlSHR0cFNlcnZpY2UudXBsb2FkKHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgdXJsOiBgJHt0aGlzLnNlcnZpY2VVcmx9LyR7cHJvZHVjdElkfS9pbWFnZWAsXG4gICAgICBib2R5OiBkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlSW1hZ2UkKHByb2R1Y3RJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdkZWxldGUnLFxuICAgICAgdXJsOiBgJHt0aGlzLnNlcnZpY2VVcmx9LyR7cHJvZHVjdElkfS9pbWFnZWAsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaEltYWdlJChwcm9kdWN0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RmlsZT4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VIdHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiB0aGlzLmdldEltYWdlVXJsKHByb2R1Y3RJZCksXG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXG4gICAgICBlcnJvckhhbmRsZXI6IG5vb3AsXG4gICAgfSk7XG4gIH1cblxuICBnZXRJbWFnZVVybChwcm9kdWN0SWQ6IHN0cmluZykge1xuICAgIHJldHVybiBgJHt0aGlzLnNlcnZpY2VVcmx9LyR7cHJvZHVjdElkfS9pbWFnZWA7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,232 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { EntityUtil, ModelTranslatorUtils, ModelUtils, ProductModelsContainer, } from '@veloceapps/core';
3
+ import { forkJoin } from 'rxjs';
4
+ import { catchError, map } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@veloceapps/core";
7
+ export class ProductModelApiService {
8
+ constructor(httpService) {
9
+ this.httpService = httpService;
10
+ this.SERVICE_URL = '/models';
11
+ }
12
+ addModel(model) {
13
+ return this.httpService
14
+ .api({
15
+ method: 'post',
16
+ url: this.SERVICE_URL,
17
+ body: model,
18
+ errorHandler: this.httpService.handleValidationError,
19
+ })
20
+ .pipe(map(result => {
21
+ if (result.successful) {
22
+ return result;
23
+ }
24
+ else {
25
+ throw new Error(result.message);
26
+ }
27
+ }));
28
+ }
29
+ releaseModel(model) {
30
+ return this.httpService
31
+ .api({
32
+ method: 'put',
33
+ url: `${this.SERVICE_URL}/${model.id}/release`,
34
+ body: model,
35
+ errorHandler: this.httpService.handleValidationError,
36
+ })
37
+ .pipe(map(result => {
38
+ if (result.successful) {
39
+ return '';
40
+ }
41
+ else {
42
+ throw new Error(result.message);
43
+ }
44
+ }));
45
+ }
46
+ removeModel(modelId, successFn, failureFn) {
47
+ const observable = this.httpService
48
+ .api({
49
+ method: 'delete',
50
+ url: `${this.SERVICE_URL}/${modelId}`,
51
+ errorHandler: this.httpService.handleValidationError,
52
+ })
53
+ .pipe(map(result => {
54
+ if (result.successful) {
55
+ return '';
56
+ }
57
+ else {
58
+ throw new Error(result.message);
59
+ }
60
+ }));
61
+ observable.subscribe(() => {
62
+ successFn && successFn.apply();
63
+ }, () => {
64
+ failureFn && failureFn.apply();
65
+ });
66
+ }
67
+ getModelVersions(modelId, count = 100, skip = 0) {
68
+ return this.httpService.api({
69
+ method: 'post',
70
+ url: `${this.SERVICE_URL}/${modelId}/versions`,
71
+ body: {
72
+ skipCount: skip,
73
+ count: count,
74
+ },
75
+ });
76
+ }
77
+ getModel(id, version) {
78
+ let url = `${this.SERVICE_URL}/${id}`;
79
+ if (version) {
80
+ url += `/versions/${version}`;
81
+ }
82
+ return this.httpService.api({ url });
83
+ }
84
+ getModels(skipCount, searchText) {
85
+ return this.httpService.api({
86
+ method: 'post',
87
+ url: `${this.SERVICE_URL}/search`,
88
+ body: {
89
+ nameRegex: searchText,
90
+ skipCount: skipCount.toString(),
91
+ count: ProductModelApiService.MAX_RESULTS,
92
+ },
93
+ });
94
+ }
95
+ getLinkedModels(id, version) {
96
+ let url = `${this.SERVICE_URL}/${id}`;
97
+ if (version) {
98
+ url += `/versions/${version}`;
99
+ }
100
+ url += '/linked';
101
+ return this.httpService.api({ url }).pipe(map((linkedModels) => {
102
+ if (linkedModels) {
103
+ linkedModels.forEach(model => ModelTranslatorUtils.toLocalModel(model));
104
+ }
105
+ return linkedModels;
106
+ }));
107
+ }
108
+ load(id, version) {
109
+ return forkJoin([this.getModel(id, version), this.getLinkedModels(id, version)]).pipe(map(([model, linkedModels]) => {
110
+ const container = new ProductModelsContainer(model, linkedModels !== null && linkedModels !== void 0 ? linkedModels : []);
111
+ ModelUtils.override(container.main, container.linked);
112
+ ModelTranslatorUtils.toLocalModel(container.main, container.linked);
113
+ return container;
114
+ }));
115
+ }
116
+ getPML(modelId, version) {
117
+ let url = `${this.SERVICE_URL}/${modelId}/pml/${version}`;
118
+ if (version) {
119
+ url += `/versions/${version}`;
120
+ }
121
+ return this.httpService.api({
122
+ url,
123
+ responseType: 'text',
124
+ });
125
+ }
126
+ savePML(modelId, pml, comment) {
127
+ return this.httpService
128
+ .api({
129
+ method: 'put',
130
+ url: `${this.SERVICE_URL}/${modelId}/pml`,
131
+ body: {
132
+ id: modelId,
133
+ pml: pml,
134
+ comment: comment,
135
+ },
136
+ })
137
+ .pipe(map(result => {
138
+ if (result.successful) {
139
+ return '';
140
+ }
141
+ else {
142
+ throw new Error(result.message);
143
+ }
144
+ }), catchError(this.httpService.handleValidationError));
145
+ }
146
+ generateProducts(modelId) {
147
+ return this.httpService.api({
148
+ url: `${this.SERVICE_URL}/${modelId}/generate-products`,
149
+ });
150
+ }
151
+ saveModel(productModel, comment) {
152
+ const model = EntityUtil.clone(productModel);
153
+ model.comment = comment;
154
+ ModelTranslatorUtils.toServerModel(model);
155
+ return this.httpService
156
+ .api({
157
+ method: 'put',
158
+ url: `${this.SERVICE_URL}/${model.id}`,
159
+ body: model,
160
+ })
161
+ .pipe(map(result => {
162
+ if (result.successful) {
163
+ return '';
164
+ }
165
+ else {
166
+ throw new Error(result.message);
167
+ }
168
+ }), catchError(this.httpService.handleValidationError));
169
+ }
170
+ validateModel(productModel) {
171
+ return this.httpService
172
+ .api({
173
+ method: 'post',
174
+ url: `${this.SERVICE_URL}/validate`,
175
+ body: productModel,
176
+ errorHandler: this.httpService.handleValidationError,
177
+ })
178
+ .pipe(map(result => {
179
+ if (result.successful) {
180
+ return '';
181
+ }
182
+ else {
183
+ throw new Error(result.message);
184
+ }
185
+ }));
186
+ }
187
+ renameModel(productModel, name) {
188
+ const model = EntityUtil.clone(productModel);
189
+ model.name = name;
190
+ ModelTranslatorUtils.toServerModel(model);
191
+ return this.httpService
192
+ .api({
193
+ method: 'patch',
194
+ url: `${this.SERVICE_URL}/${model.id}`,
195
+ body: model,
196
+ })
197
+ .pipe(catchError(this.httpService.handleValidationError));
198
+ }
199
+ uploadPmlFile(file, modelId) {
200
+ const formData = new FormData();
201
+ formData.append('file', file, file.name);
202
+ return this.httpService.upload({
203
+ url: `${this.SERVICE_URL}/${modelId}/pml/upload`,
204
+ body: formData,
205
+ });
206
+ }
207
+ runPml(modelId, pml, rootType, configurationMode) {
208
+ return this.httpService.api({
209
+ method: 'post',
210
+ url: `${this.SERVICE_URL}/${modelId}/pml/run`,
211
+ body: {
212
+ pml,
213
+ rootType,
214
+ configurationMode,
215
+ },
216
+ responseType: 'text',
217
+ });
218
+ }
219
+ evictAllCache() {
220
+ return this.httpService.api({
221
+ method: 'get',
222
+ url: '/cache/evict/environment-variables',
223
+ });
224
+ }
225
+ }
226
+ ProductModelApiService.MAX_RESULTS = 200;
227
+ ProductModelApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductModelApiService, deps: [{ token: i1.BaseHttpService }], target: i0.ɵɵFactoryTarget.Injectable });
228
+ ProductModelApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductModelApiService });
229
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ProductModelApiService, decorators: [{
230
+ type: Injectable
231
+ }], ctorParameters: function () { return [{ type: i1.BaseHttpService }]; } });
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tb2RlbC1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL3NyYy9saWIvc2VydmljZXMvcHJvZHVjdC1tb2RlbC1hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFFTCxVQUFVLEVBRVYsb0JBQW9CLEVBQ3BCLFVBQVUsRUFHVixzQkFBc0IsR0FFdkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUdqRCxNQUFNLE9BQU8sc0JBQXNCO0lBS2pDLFlBQW9CLFdBQTRCO1FBQTVCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUYvQixnQkFBVyxHQUFHLFNBQVMsQ0FBQztJQUVVLENBQUM7SUFFcEQsUUFBUSxDQUFDLEtBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDcEIsR0FBRyxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU07WUFDZCxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDckIsSUFBSSxFQUFFLEtBQUs7WUFDWCxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUI7U0FDckQsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JCLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELFlBQVksQ0FBQyxLQUEw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O2dCQUNKLEdBQUc7Z0JBQ0gsUUFBUTtnQkFDUixpQkFBaUI7YUFDbEI7WUFDRCxZQUFZLEVBQUUsTUFBTTtTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDMUIsTUFBTSxFQUFFLEtBQUs7WUFDYixHQUFHLEVBQUUsb0NBQW9DO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdFFhLGtDQUFXLEdBQUcsR0FBRyxDQUFDO29IQURyQixzQkFBc0I7d0hBQXRCLHNCQUFzQjs0RkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUh0dHBTZXJ2aWNlLFxuICBFbnRpdHlVdGlsLFxuICBNb2RlbFJlbGVhc2VSZXF1ZXN0LFxuICBNb2RlbFRyYW5zbGF0b3JVdGlscyxcbiAgTW9kZWxVdGlscyxcbiAgUG1sQ29uZmlndXJhdGlvbk1vZGUsXG4gIFByb2R1Y3RNb2RlbCxcbiAgUHJvZHVjdE1vZGVsc0NvbnRhaW5lcixcbiAgUHJvZHVjdE1vZGVsVmVyc2lvbixcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvZHVjdE1vZGVsQXBpU2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMgTUFYX1JFU1VMVFMgPSAyMDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRVJWSUNFX1VSTCA9ICcvbW9kZWxzJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBTZXJ2aWNlOiBCYXNlSHR0cFNlcnZpY2UpIHt9XG5cbiAgYWRkTW9kZWwobW9kZWw6IFByb2R1Y3RNb2RlbCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgdXJsOiB0aGlzLlNFUlZJQ0VfVVJMLFxuICAgICAgICBib2R5OiBtb2RlbCxcbiAgICAgICAgZXJyb3JIYW5kbGVyOiB0aGlzLmh0dHBTZXJ2aWNlLmhhbmRsZVZhbGlkYXRpb25FcnJvcixcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcmVsZWFzZU1vZGVsKG1vZGVsOiBNb2RlbFJlbGVhc2VSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxuICAgICAgLmFwaSh7XG4gICAgICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHttb2RlbC5pZH0vcmVsZWFzZWAsXG4gICAgICAgIGJvZHk6IG1vZGVsLFxuICAgICAgICBlcnJvckhhbmRsZXI6IHRoaXMuaHR0cFNlcnZpY2UuaGFuZGxlVmFsaWRhdGlvbkVycm9yLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHJlbW92ZU1vZGVsKG1vZGVsSWQ6IHN0cmluZywgc3VjY2Vzc0ZuPzogYW55LCBmYWlsdXJlRm4/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gdGhpcy5odHRwU2VydmljZVxuICAgICAgLmFwaSh7XG4gICAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHttb2RlbElkfWAsXG4gICAgICAgIGVycm9ySGFuZGxlcjogdGhpcy5odHRwU2VydmljZS5oYW5kbGVWYWxpZGF0aW9uRXJyb3IsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHN1Y2Nlc3NGbiAmJiBzdWNjZXNzRm4uYXBwbHkoKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGZhaWx1cmVGbiAmJiBmYWlsdXJlRm4uYXBwbHkoKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIGdldE1vZGVsVmVyc2lvbnMobW9kZWxJZDogc3RyaW5nLCBjb3VudDogbnVtYmVyID0gMTAwLCBza2lwOiBudW1iZXIgPSAwKTogT2JzZXJ2YWJsZTxQcm9kdWN0TW9kZWxWZXJzaW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7bW9kZWxJZH0vdmVyc2lvbnNgLFxuICAgICAgYm9keToge1xuICAgICAgICBza2lwQ291bnQ6IHNraXAsXG4gICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBnZXRNb2RlbChpZDogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxQcm9kdWN0TW9kZWw+IHtcbiAgICBsZXQgdXJsID0gYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH1gO1xuXG4gICAgaWYgKHZlcnNpb24pIHtcbiAgICAgIHVybCArPSBgL3ZlcnNpb25zLyR7dmVyc2lvbn1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmFwaSh7IHVybCB9KTtcbiAgfVxuXG4gIGdldE1vZGVscyhza2lwQ291bnQ6IG51bWJlciwgc2VhcmNoVGV4dDogc3RyaW5nKTogT2JzZXJ2YWJsZTxQcm9kdWN0TW9kZWxbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vc2VhcmNoYCxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgbmFtZVJlZ2V4OiBzZWFyY2hUZXh0LFxuICAgICAgICBza2lwQ291bnQ6IHNraXBDb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb3VudDogUHJvZHVjdE1vZGVsQXBpU2VydmljZS5NQVhfUkVTVUxUUyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBnZXRMaW5rZWRNb2RlbHMoaWQ6IHN0cmluZywgdmVyc2lvbj86IHN0cmluZyk6IE9ic2VydmFibGU8UHJvZHVjdE1vZGVsW10+IHtcbiAgICBsZXQgdXJsID0gYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH1gO1xuXG4gICAgaWYgKHZlcnNpb24pIHtcbiAgICAgIHVybCArPSBgL3ZlcnNpb25zLyR7dmVyc2lvbn1gO1xuICAgIH1cblxuICAgIHVybCArPSAnL2xpbmtlZCc7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoeyB1cmwgfSkucGlwZShcbiAgICAgIG1hcCgobGlua2VkTW9kZWxzOiBQcm9kdWN0TW9kZWxbXSkgPT4ge1xuICAgICAgICBpZiAobGlua2VkTW9kZWxzKSB7XG4gICAgICAgICAgbGlua2VkTW9kZWxzLmZvckVhY2gobW9kZWwgPT4gTW9kZWxUcmFuc2xhdG9yVXRpbHMudG9Mb2NhbE1vZGVsKG1vZGVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmtlZE1vZGVscztcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBsb2FkKGlkOiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFByb2R1Y3RNb2RlbHNDb250YWluZXI+IHtcbiAgICByZXR1cm4gZm9ya0pvaW4oW3RoaXMuZ2V0TW9kZWwoaWQsIHZlcnNpb24pLCB0aGlzLmdldExpbmtlZE1vZGVscyhpZCwgdmVyc2lvbildKS5waXBlKFxuICAgICAgbWFwKChbbW9kZWwsIGxpbmtlZE1vZGVsc10pID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IFByb2R1Y3RNb2RlbHNDb250YWluZXIobW9kZWwsIGxpbmtlZE1vZGVscyA/PyBbXSk7XG5cbiAgICAgICAgTW9kZWxVdGlscy5vdmVycmlkZShjb250YWluZXIubWFpbiwgY29udGFpbmVyLmxpbmtlZCk7XG4gICAgICAgIE1vZGVsVHJhbnNsYXRvclV0aWxzLnRvTG9jYWxNb2RlbChjb250YWluZXIubWFpbiwgY29udGFpbmVyLmxpbmtlZCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBnZXRQTUwobW9kZWxJZDogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHttb2RlbElkfS9wbWwvJHt2ZXJzaW9ufWA7XG5cbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgdXJsICs9IGAvdmVyc2lvbnMvJHt2ZXJzaW9ufWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuYXBpKHtcbiAgICAgIHVybCxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgIH0pO1xuICB9XG5cbiAgc2F2ZVBNTChtb2RlbElkOiBzdHJpbmcsIHBtbDogc3RyaW5nLCBjb21tZW50OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXG4gICAgICAuYXBpKHtcbiAgICAgICAgbWV0aG9kOiAncHV0JyxcbiAgICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke21vZGVsSWR9L3BtbGAsXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBpZDogbW9kZWxJZCxcbiAgICAgICAgICBwbWw6IHBtbCxcbiAgICAgICAgICBjb21tZW50OiBjb21tZW50LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaHR0cFNlcnZpY2UuaGFuZGxlVmFsaWRhdGlvbkVycm9yKSxcbiAgICAgICk7XG4gIH1cblxuICBnZW5lcmF0ZVByb2R1Y3RzKG1vZGVsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8UHJvZHVjdE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHttb2RlbElkfS9nZW5lcmF0ZS1wcm9kdWN0c2AsXG4gICAgfSk7XG4gIH1cblxuICBzYXZlTW9kZWwocHJvZHVjdE1vZGVsOiBQcm9kdWN0TW9kZWwsIGNvbW1lbnQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgbW9kZWwgPSBFbnRpdHlVdGlsLmNsb25lKHByb2R1Y3RNb2RlbCk7XG4gICAgbW9kZWwuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgTW9kZWxUcmFuc2xhdG9yVXRpbHMudG9TZXJ2ZXJNb2RlbChtb2RlbCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxuICAgICAgLmFwaSh7XG4gICAgICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHttb2RlbC5pZH1gLFxuICAgICAgICBib2R5OiBtb2RlbCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmh0dHBTZXJ2aWNlLmhhbmRsZVZhbGlkYXRpb25FcnJvciksXG4gICAgICApO1xuICB9XG5cbiAgdmFsaWRhdGVNb2RlbChwcm9kdWN0TW9kZWw6IFByb2R1Y3RNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS92YWxpZGF0ZWAsXG4gICAgICAgIGJvZHk6IHByb2R1Y3RNb2RlbCxcbiAgICAgICAgZXJyb3JIYW5kbGVyOiB0aGlzLmh0dHBTZXJ2aWNlLmhhbmRsZVZhbGlkYXRpb25FcnJvcixcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICByZW5hbWVNb2RlbChwcm9kdWN0TW9kZWw6IFByb2R1Y3RNb2RlbCwgbmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBtb2RlbCA9IEVudGl0eVV0aWwuY2xvbmUocHJvZHVjdE1vZGVsKTtcbiAgICBtb2RlbC5uYW1lID0gbmFtZTtcbiAgICBNb2RlbFRyYW5zbGF0b3JVdGlscy50b1NlcnZlck1vZGVsKG1vZGVsKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXG4gICAgICAuYXBpKHtcbiAgICAgICAgbWV0aG9kOiAncGF0Y2gnLFxuICAgICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7bW9kZWwuaWR9YCxcbiAgICAgICAgYm9keTogbW9kZWwsXG4gICAgICB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmh0dHBTZXJ2aWNlLmhhbmRsZVZhbGlkYXRpb25FcnJvcikpO1xuICB9XG5cbiAgdXBsb2FkUG1sRmlsZShmaWxlOiBGaWxlLCBtb2RlbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS51cGxvYWQoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke21vZGVsSWR9L3BtbC91cGxvYWRgLFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgfSk7XG4gIH1cblxuICBydW5QbWwobW9kZWxJZDogc3RyaW5nLCBwbWw6IHN0cmluZywgcm9vdFR5cGU6IHN0cmluZywgY29uZmlndXJhdGlvbk1vZGU6IFBtbENvbmZpZ3VyYXRpb25Nb2RlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7bW9kZWxJZH0vcG1sL3J1bmAsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHBtbCxcbiAgICAgICAgcm9vdFR5cGUsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25Nb2RlLFxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgIH0pO1xuICB9XG5cbiAgZXZpY3RBbGxDYWNoZSgpOiBPYnNlcnZhYmxlPHsgcmVzdWx0OiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgdXJsOiAnL2NhY2hlL2V2aWN0L2Vudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==