angular-odata 0.130.0 → 0.131.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 (159) hide show
  1. package/fesm2022/angular-odata.mjs +2298 -2162
  2. package/fesm2022/angular-odata.mjs.map +1 -1
  3. package/lib/api.d.ts +10 -11
  4. package/lib/cache/cache.d.ts +2 -2
  5. package/lib/cache/memory.d.ts +2 -2
  6. package/lib/cache/storage.d.ts +2 -2
  7. package/lib/loaders.d.ts +8 -8
  8. package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
  9. package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
  10. package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
  11. package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
  12. package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
  13. package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
  14. package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
  15. package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
  16. package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
  17. package/lib/metadata/metadata.d.ts +2 -2
  18. package/lib/models/options.d.ts +2 -2
  19. package/lib/module.d.ts +3 -3
  20. package/lib/options.d.ts +3 -3
  21. package/lib/resources/query/expressions/apply.d.ts +1 -1
  22. package/lib/resources/query/expressions/compute.d.ts +1 -1
  23. package/lib/resources/query/expressions/count.d.ts +1 -1
  24. package/lib/resources/query/expressions/expand.d.ts +4 -3
  25. package/lib/resources/query/expressions/filter.d.ts +2 -1
  26. package/lib/resources/query/expressions/orderby.d.ts +2 -1
  27. package/lib/resources/query/expressions/search.d.ts +2 -1
  28. package/lib/resources/query/expressions/select.d.ts +2 -1
  29. package/lib/resources/query/handlers.d.ts +17 -5
  30. package/lib/resources/resource.d.ts +5 -5
  31. package/lib/resources/types/action.d.ts +2 -2
  32. package/lib/resources/types/entity-set.d.ts +2 -2
  33. package/lib/resources/types/navigation-property.d.ts +2 -2
  34. package/lib/resources/types/property.d.ts +2 -2
  35. package/lib/schema/annotation.d.ts +3 -3
  36. package/lib/schema/callable.d.ts +3 -3
  37. package/lib/schema/element.d.ts +3 -3
  38. package/lib/schema/entity-container.d.ts +2 -2
  39. package/lib/schema/entity-set.d.ts +2 -2
  40. package/lib/schema/enum-type.d.ts +2 -2
  41. package/lib/schema/parsers/callable.d.ts +4 -4
  42. package/lib/schema/parsers/enum-type.d.ts +3 -3
  43. package/lib/schema/parsers/structured-type.d.ts +4 -4
  44. package/lib/schema/schema.d.ts +3 -3
  45. package/lib/schema/singleton.d.ts +2 -2
  46. package/lib/schema/structured-type.d.ts +3 -3
  47. package/lib/services/entity.d.ts +1 -1
  48. package/lib/settings.d.ts +2 -2
  49. package/lib/types.d.ts +76 -74
  50. package/lib/utils/odata.d.ts +2 -2
  51. package/package.json +3 -5
  52. package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
  53. package/esm2022/angular-odata.mjs +0 -5
  54. package/esm2022/lib/annotations.mjs +0 -146
  55. package/esm2022/lib/api.mjs +0 -439
  56. package/esm2022/lib/cache/cache.mjs +0 -177
  57. package/esm2022/lib/cache/index.mjs +0 -4
  58. package/esm2022/lib/cache/memory.mjs +0 -30
  59. package/esm2022/lib/cache/storage.mjs +0 -57
  60. package/esm2022/lib/client.mjs +0 -215
  61. package/esm2022/lib/constants.mjs +0 -95
  62. package/esm2022/lib/helper.mjs +0 -288
  63. package/esm2022/lib/index.mjs +0 -22
  64. package/esm2022/lib/loaders.mjs +0 -43
  65. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
  66. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
  67. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
  68. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
  69. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
  70. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
  71. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
  72. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
  73. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
  74. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
  75. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
  76. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
  77. package/esm2022/lib/metadata/index.mjs +0 -3
  78. package/esm2022/lib/metadata/metadata.mjs +0 -41
  79. package/esm2022/lib/metadata/parser.mjs +0 -564
  80. package/esm2022/lib/models/collection.mjs +0 -816
  81. package/esm2022/lib/models/index.mjs +0 -4
  82. package/esm2022/lib/models/model.mjs +0 -577
  83. package/esm2022/lib/models/options.mjs +0 -1227
  84. package/esm2022/lib/module.mjs +0 -55
  85. package/esm2022/lib/options.mjs +0 -91
  86. package/esm2022/lib/resources/index.mjs +0 -7
  87. package/esm2022/lib/resources/options.mjs +0 -66
  88. package/esm2022/lib/resources/path/handlers.mjs +0 -81
  89. package/esm2022/lib/resources/path/index.mjs +0 -3
  90. package/esm2022/lib/resources/path/segments.mjs +0 -149
  91. package/esm2022/lib/resources/query/builder.mjs +0 -645
  92. package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
  93. package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
  94. package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
  95. package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
  96. package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
  97. package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
  98. package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
  99. package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
  100. package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
  101. package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
  102. package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
  103. package/esm2022/lib/resources/query/handlers.mjs +0 -423
  104. package/esm2022/lib/resources/query/index.mjs +0 -5
  105. package/esm2022/lib/resources/query/options.mjs +0 -140
  106. package/esm2022/lib/resources/request.mjs +0 -210
  107. package/esm2022/lib/resources/resource.mjs +0 -316
  108. package/esm2022/lib/resources/response.mjs +0 -180
  109. package/esm2022/lib/resources/types/action.mjs +0 -118
  110. package/esm2022/lib/resources/types/batch.mjs +0 -428
  111. package/esm2022/lib/resources/types/count.mjs +0 -33
  112. package/esm2022/lib/resources/types/entity-set.mjs +0 -131
  113. package/esm2022/lib/resources/types/entity.mjs +0 -112
  114. package/esm2022/lib/resources/types/function.mjs +0 -149
  115. package/esm2022/lib/resources/types/index.mjs +0 -15
  116. package/esm2022/lib/resources/types/media.mjs +0 -44
  117. package/esm2022/lib/resources/types/metadata.mjs +0 -35
  118. package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
  119. package/esm2022/lib/resources/types/options.mjs +0 -2
  120. package/esm2022/lib/resources/types/property.mjs +0 -187
  121. package/esm2022/lib/resources/types/reference.mjs +0 -87
  122. package/esm2022/lib/resources/types/singleton.mjs +0 -125
  123. package/esm2022/lib/resources/types/value.mjs +0 -48
  124. package/esm2022/lib/schema/annotation.mjs +0 -44
  125. package/esm2022/lib/schema/callable.mjs +0 -69
  126. package/esm2022/lib/schema/element.mjs +0 -70
  127. package/esm2022/lib/schema/entity-container.mjs +0 -13
  128. package/esm2022/lib/schema/entity-set.mjs +0 -11
  129. package/esm2022/lib/schema/enum-type.mjs +0 -69
  130. package/esm2022/lib/schema/index.mjs +0 -9
  131. package/esm2022/lib/schema/parsers/callable.mjs +0 -123
  132. package/esm2022/lib/schema/parsers/edm.mjs +0 -101
  133. package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
  134. package/esm2022/lib/schema/parsers/index.mjs +0 -5
  135. package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
  136. package/esm2022/lib/schema/schema.mjs +0 -52
  137. package/esm2022/lib/schema/singleton.mjs +0 -11
  138. package/esm2022/lib/schema/structured-type.mjs +0 -220
  139. package/esm2022/lib/services/base.mjs +0 -32
  140. package/esm2022/lib/services/entity-set.mjs +0 -161
  141. package/esm2022/lib/services/entity.mjs +0 -12
  142. package/esm2022/lib/services/factory.mjs +0 -39
  143. package/esm2022/lib/services/index.mjs +0 -5
  144. package/esm2022/lib/services/singleton.mjs +0 -55
  145. package/esm2022/lib/settings.mjs +0 -113
  146. package/esm2022/lib/types.mjs +0 -118
  147. package/esm2022/lib/utils/arraybuffers.mjs +0 -46
  148. package/esm2022/lib/utils/arrays.mjs +0 -10
  149. package/esm2022/lib/utils/dates.mjs +0 -18
  150. package/esm2022/lib/utils/durations.mjs +0 -40
  151. package/esm2022/lib/utils/enums.mjs +0 -61
  152. package/esm2022/lib/utils/http.mjs +0 -95
  153. package/esm2022/lib/utils/index.mjs +0 -10
  154. package/esm2022/lib/utils/objects.mjs +0 -204
  155. package/esm2022/lib/utils/odata.mjs +0 -22
  156. package/esm2022/lib/utils/strings.mjs +0 -20
  157. package/esm2022/lib/utils/types.mjs +0 -136
  158. package/esm2022/lib/utils/urls.mjs +0 -24
  159. package/esm2022/public-api.mjs +0 -5
@@ -1,118 +0,0 @@
1
- import { map } from 'rxjs/operators';
2
- import { PathSegment } from '../../types';
3
- import { ODataPathSegments } from '../path';
4
- import { ODataResource } from '../resource';
5
- export class ODataActionResource extends ODataResource {
6
- //#region Factory
7
- static factory(api, { path, outgoingType, incomingType, bindingType, segments, }) {
8
- segments = segments ?? new ODataPathSegments();
9
- const segment = segments.add(PathSegment.action, path);
10
- if (outgoingType !== undefined) {
11
- segment.outgoingType(outgoingType);
12
- }
13
- if (incomingType !== undefined) {
14
- segment.incomingType(incomingType);
15
- }
16
- if (bindingType !== undefined) {
17
- segment.bindingType(bindingType);
18
- }
19
- return new ODataActionResource(api, { segments });
20
- }
21
- static fromResource(resource, path) {
22
- const baseType = resource.outgoingType();
23
- const callable = resource.api.findCallable(path, baseType);
24
- const outgoingType = callable?.type();
25
- const bindingType = callable?.binding()?.type;
26
- const incomingType = callable?.returnType();
27
- const action = ODataActionResource.factory(resource.api, {
28
- path,
29
- outgoingType,
30
- bindingType,
31
- incomingType,
32
- segments: resource.cloneSegments(),
33
- });
34
- // Switch entitySet to binding type if available
35
- if (bindingType !== undefined && bindingType !== baseType) {
36
- let entitySet = resource.api.findEntitySet(bindingType);
37
- if (entitySet !== undefined) {
38
- action.segment((s) => s.entitySet().path(entitySet.name));
39
- }
40
- }
41
- return action;
42
- }
43
- clone() {
44
- return super.clone();
45
- }
46
- //#endregion
47
- //#region Requests
48
- post(params, options) {
49
- return super.post(params, options);
50
- }
51
- call(params, options = {}) {
52
- return this.clone().post(params, options);
53
- }
54
- /**
55
- * Execute the action and return the result as a property
56
- * @param params Parameters for the action
57
- * @param options Options for the request
58
- * @returns Observable of the result of the action
59
- */
60
- callProperty(params, options = {}) {
61
- return this.call(params, { responseType: 'property', ...options }).pipe(map(({ property }) => property));
62
- }
63
- /**
64
- * Execute the action and return the result as a entity
65
- * @param params Parameters for the action
66
- * @param options Options for the request
67
- * @returns Observable of the result of the action
68
- */
69
- callEntity(params, options = {}) {
70
- return this.call(params, { responseType: 'entity', ...options }).pipe(map(({ entity }) => entity));
71
- }
72
- /**
73
- * Execute the action and return the result as a model
74
- * @param params Parameters for the action
75
- * @param options Options for the request
76
- * @returns Observable of the result of the action
77
- */
78
- callModel(params, options = {}) {
79
- return this.call(params, { responseType: 'entity', ...options }).pipe(map(({ entity, annots }) => entity
80
- ? this.asModel(entity, { annots, ModelType: options?.ModelType })
81
- : null));
82
- }
83
- /**
84
- * Execute the action and return the result as a entities
85
- * @param params Parameters for the action
86
- * @param options Options for the request
87
- * @returns Observable of the result of the action
88
- */
89
- callEntities(params, options = {}) {
90
- return this.call(params, { responseType: 'entities', ...options }).pipe(map(({ entities }) => entities));
91
- }
92
- /**
93
- * Execute the action and return the result as a collection
94
- * @param params Parameters for the action
95
- * @param options Options for the request
96
- * @returns Observable of the result of the action
97
- */
98
- callCollection(params, options = {}) {
99
- return this.call(params, { responseType: 'entities', ...options }).pipe(map(({ entities, annots }) => entities
100
- ? this.asCollection(entities, {
101
- annots,
102
- CollectionType: options?.CollectionType,
103
- })
104
- : null));
105
- }
106
- //#endregion
107
- callArraybuffer(params, { alias, ...options } = {}) {
108
- return this.call(params, {
109
- responseType: 'arraybuffer',
110
- alias,
111
- ...options,
112
- });
113
- }
114
- callBlob(params, { alias, ...options } = {}) {
115
- return this.call(params, { responseType: 'blob', alias, ...options });
116
- }
117
- }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy90eXBlcy9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFTNUMsTUFBTSxPQUFPLG1CQUEwQixTQUFRLGFBQWdCO0lBQzdELGlCQUFpQjtJQUNqQixNQUFNLENBQUMsT0FBTyxDQUNaLEdBQWEsRUFDYixFQUNFLElBQUksRUFDSixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxRQUFRLEdBT1Q7UUFFRCxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUUvQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLG1CQUFtQixDQUFPLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFB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QyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FDTixNQUFnQixFQUNoQixFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sS0FBeUMsRUFBRTtRQUU5RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiwgT0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBQYXRoU2VnbWVudCB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhUGF0aFNlZ21lbnRzIH0gZnJvbSAnLi4vcGF0aCc7XG5pbXBvcnQgeyBPRGF0YVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdGllc09wdGlvbnMsXG4gIE9EYXRhRW50aXR5T3B0aW9ucyxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5T3B0aW9ucyxcbn0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IE9EYXRhRW50aXRpZXMsIE9EYXRhRW50aXR5LCBPRGF0YVByb3BlcnR5IH0gZnJvbSAnLi4vcmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPiBleHRlbmRzIE9EYXRhUmVzb3VyY2U8Uj4ge1xuICAvLyNyZWdpb24gRmFjdG9yeVxuICBzdGF0aWMgZmFjdG9yeTxQLCBSPihcbiAgICBhcGk6IE9EYXRhQXBpLFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBvdXRnb2luZ1R5cGUsXG4gICAgICBpbmNvbWluZ1R5cGUsXG4gICAgICBiaW5kaW5nVHlwZSxcbiAgICAgIHNlZ21lbnRzLFxuICAgIH06IHtcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG91dGdvaW5nVHlwZT86IHN0cmluZztcbiAgICAgIGluY29taW5nVHlwZT86IHN0cmluZztcbiAgICAgIGJpbmRpbmdUeXBlPzogc3RyaW5nO1xuICAgICAgc2VnbWVudHM/OiBPRGF0YVBhdGhTZWdtZW50cztcbiAgICB9LFxuICApIHtcbiAgICBzZWdtZW50cyA9IHNlZ21lbnRzID8/IG5ldyBPRGF0YVBhdGhTZWdtZW50cygpO1xuXG4gICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzLmFkZChQYXRoU2VnbWVudC5hY3Rpb24sIHBhdGgpO1xuICAgIGlmIChvdXRnb2luZ1R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudC5vdXRnb2luZ1R5cGUob3V0Z29pbmdUeXBlKTtcbiAgICB9XG4gICAgaWYgKGluY29taW5nVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50LmluY29taW5nVHlwZShpbmNvbWluZ1R5cGUpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudC5iaW5kaW5nVHlwZShiaW5kaW5nVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPihhcGksIHsgc2VnbWVudHMgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVJlc291cmNlPFAsIFI+KHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sIHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VUeXBlID0gcmVzb3VyY2Uub3V0Z29pbmdUeXBlKCk7XG4gICAgY29uc3QgY2FsbGFibGUgPSByZXNvdXJjZS5hcGkuZmluZENhbGxhYmxlPFI+KHBhdGgsIGJhc2VUeXBlKTtcblxuICAgIGNvbnN0IG91dGdvaW5nVHlwZSA9IGNhbGxhYmxlPy50eXBlKCk7XG4gICAgY29uc3QgYmluZGluZ1R5cGUgPSBjYWxsYWJsZT8uYmluZGluZygpPy50eXBlO1xuICAgIGNvbnN0IGluY29taW5nVHlwZSA9IGNhbGxhYmxlPy5yZXR1cm5UeXBlKCk7XG5cbiAgICBjb25zdCBhY3Rpb24gPSBPRGF0YUFjdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4ocmVzb3VyY2UuYXBpLCB7XG4gICAgICBwYXRoLFxuICAgICAgb3V0Z29pbmdUeXBlLFxuICAgICAgYmluZGluZ1R5cGUsXG4gICAgICBpbmNvbWluZ1R5cGUsXG4gICAgICBzZWdtZW50czogcmVzb3VyY2UuY2xvbmVTZWdtZW50cygpLFxuICAgIH0pO1xuXG4gICAgLy8gU3dpdGNoIGVudGl0eVNldCB0byBiaW5kaW5nIHR5cGUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgJiYgYmluZGluZ1R5cGUgIT09IGJhc2VUeXBlKSB7XG4gICAgICBsZXQgZW50aXR5U2V0ID0gcmVzb3VyY2UuYXBpLmZpbmRFbnRpdHlTZXQoYmluZGluZ1R5cGUpO1xuICAgICAgaWYgKGVudGl0eVNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGlvbi5zZWdtZW50KChzKSA9PiBzLmVudGl0eVNldCgpLnBhdGgoZW50aXR5U2V0IS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFJlcXVlc3RzXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwb3N0KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXR5T3B0aW9ucyAmIE9EYXRhRW50aXRpZXNPcHRpb25zICYgT0RhdGFQcm9wZXJ0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHN1cGVyLnBvc3QocGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2hvcnRjdXRzXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdG8gdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKi9cbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBPRGF0YUVudGl0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXRpZXNPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhUHJvcGVydHlPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUHJvcGVydHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuOyByZXNwb25zZVR5cGU/OiAnYmxvYicgfSAmIE9EYXRhT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbjsgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB9ICYgT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbjsgcmVzcG9uc2VUeXBlPzogJ25vbmUnIH0gJiBPRGF0YU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8bnVsbD47XG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YUVudGl0eU9wdGlvbnMgJlxuICAgICAgT0RhdGFFbnRpdGllc09wdGlvbnMgJlxuICAgICAgT0RhdGFQcm9wZXJ0eU9wdGlvbnMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnBvc3QocGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgcHJvcGVydHlcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsUHJvcGVydHkocGFyYW1zOiBQIHwgbnVsbCwgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBwcm9wZXJ0eSB9KSA9PiBwcm9wZXJ0eSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgZW50aXR5XG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbEVudGl0eShwYXJhbXM6IFAgfCBudWxsLCBvcHRpb25zOiBPRGF0YU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHkgfSkgPT4gZW50aXR5KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBtb2RlbFxuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBhY3Rpb25cbiAgICovXG4gIGNhbGxNb2RlbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHsgTW9kZWxUeXBlPzogdHlwZW9mIE9EYXRhTW9kZWwgfSA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT5cbiAgICAgICAgZW50aXR5XG4gICAgICAgICAgPyB0aGlzLmFzTW9kZWwoZW50aXR5LCB7IGFubm90cywgTW9kZWxUeXBlOiBvcHRpb25zPy5Nb2RlbFR5cGUgfSlcbiAgICAgICAgICA6IG51bGwsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGVudGl0aWVzXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbEVudGl0aWVzKHBhcmFtczogUCB8IG51bGwsIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMgfSkgPT4gZW50aXRpZXMpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsQ29sbGVjdGlvbihcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHsgQ29sbGVjdGlvblR5cGU/OiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uIH0gPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PlxuICAgICAgICBlbnRpdGllc1xuICAgICAgICAgID8gdGhpcy5hc0NvbGxlY3Rpb24oZW50aXRpZXMsIHtcbiAgICAgICAgICAgICAgYW5ub3RzLFxuICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZTogb3B0aW9ucz8uQ29sbGVjdGlvblR5cGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjYWxsQXJyYXlidWZmZXIoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICB7IGFsaWFzLCAuLi5vcHRpb25zIH06IHsgYWxpYXM/OiBib29sZWFuIH0gJiBPRGF0YU9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGxCbG9iKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgeyBhbGlhcywgLi4ub3B0aW9ucyB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ICYgT0RhdGFPcHRpb25zID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBhbGlhcywgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuIl19
@@ -1,428 +0,0 @@
1
- import { HttpErrorResponse, HttpHeaders, HttpResponse, } from '@angular/common/http';
2
- import { map, Subject } from 'rxjs';
3
- import { $BATCH, ACCEPT, APPLICATION_HTTP, APPLICATION_JSON, BATCH_PREFIX, BINARY, BOUNDARY_PREFIX_SUFFIX, CHANGESET_PREFIX, CONTENT_ID, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, HTTP11, MULTIPART_MIXED, MULTIPART_MIXED_BOUNDARY, NEWLINE, NEWLINE_REGEXP, ODATA_VERSION, VERSION_4_0, XSSI_PREFIX, } from '../../constants';
4
- import { PathSegment } from '../../types';
5
- import { Arrays } from '../../utils/arrays';
6
- import { Http } from '../../utils/http';
7
- import { Strings } from '../../utils/strings';
8
- import { ODataPathSegments } from '../path';
9
- import { ODataResource } from '../resource';
10
- export class ODataBatchRequest extends Subject {
11
- request;
12
- id;
13
- group;
14
- constructor(request) {
15
- super();
16
- this.request = request;
17
- this.id = Strings.uniqueId({ prefix: 'r' });
18
- this.group = Strings.uniqueId({ prefix: 'g' });
19
- }
20
- toString() {
21
- return this.toLegacy();
22
- }
23
- toLegacy({ relativeUrls } = {}) {
24
- //TODO: Relative or Absolute url ?
25
- let res = [
26
- `${this.request.method} ${relativeUrls ? this.request.pathWithParams : this.request.urlWithParams} ${HTTP11}`,
27
- ];
28
- if (this.request.method === 'POST' ||
29
- this.request.method === 'PATCH' ||
30
- this.request.method === 'PUT') {
31
- res.push(`${CONTENT_TYPE}: ${APPLICATION_JSON}`);
32
- }
33
- if (this.request.headers instanceof HttpHeaders) {
34
- let headers = this.request.headers;
35
- res = [
36
- ...res,
37
- ...headers
38
- .keys()
39
- .map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`),
40
- ];
41
- }
42
- if (this.request.method === 'GET' || this.request.method === 'DELETE') {
43
- res.push(NEWLINE);
44
- }
45
- else {
46
- res.push(`${NEWLINE}${JSON.stringify(this.request.body)}`);
47
- }
48
- return res.join(NEWLINE);
49
- }
50
- toJson({ relativeUrls } = {}) {
51
- let res = {
52
- id: this.id,
53
- method: this.request.method,
54
- url: relativeUrls
55
- ? this.request.pathWithParams
56
- : this.request.urlWithParams,
57
- //'atomicityGroup': this.group
58
- //"dependsOn": ["g1", "g2", "r2"]
59
- };
60
- if (this.request.headers instanceof HttpHeaders) {
61
- let headers = this.request.headers;
62
- res['headers'] = headers
63
- .keys()
64
- .map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`);
65
- }
66
- if (!(this.request.method === 'GET' || this.request.method === 'DELETE')) {
67
- res['body'] = this.request.body;
68
- }
69
- return res;
70
- }
71
- onLoad(response) {
72
- if (response.ok) {
73
- this.next(response);
74
- this.complete();
75
- }
76
- else {
77
- // An unsuccessful request is delivered on the error channel.
78
- this.error(response);
79
- }
80
- }
81
- onError(response) {
82
- this.error(response);
83
- }
84
- }
85
- /**
86
- * OData Batch Resource
87
- * https://www.odata.org/getting-started/advanced-tutorial/#batch
88
- */
89
- export class ODataBatchResource extends ODataResource {
90
- // VARIABLES
91
- _requests = [];
92
- requests() {
93
- return this._requests.map((r) => r.request);
94
- }
95
- _responses = null;
96
- responses() {
97
- return this._responses;
98
- }
99
- //#region Factory
100
- static factory(api) {
101
- let segments = new ODataPathSegments();
102
- segments.add(PathSegment.batch, $BATCH);
103
- return new ODataBatchResource(api, { segments });
104
- }
105
- clone() {
106
- const batch = super.clone();
107
- batch._requests = [...this._requests];
108
- return batch;
109
- }
110
- //#endregion
111
- storeRequester() {
112
- const current = this.api.requester;
113
- // Switch to the batch requester
114
- this.api.requester = (req) => {
115
- if (req.api !== this.api)
116
- throw new Error('Batch Request are for the same api.');
117
- if (req.observe === 'events')
118
- throw new Error("Batch Request does not allows observe == 'events'.");
119
- this._requests.push(new ODataBatchRequest(req));
120
- return this._requests[this._requests.length - 1];
121
- };
122
- return current;
123
- }
124
- restoreRequester(handler) {
125
- this.api.requester = handler;
126
- }
127
- /**
128
- * Add to batch request
129
- * @param ctx The context for the request
130
- * @returns The result of execute the context
131
- */
132
- add(ctx) {
133
- // Store original requester
134
- var handler = this.storeRequester();
135
- // Execute the context
136
- const result = ctx(this);
137
- // Restore original requester
138
- this.restoreRequester(handler);
139
- return result;
140
- }
141
- send(options) {
142
- if (this.api.options.jsonBatchFormat) {
143
- return this.sendJson(options);
144
- }
145
- else {
146
- return this.sendLegacy(options);
147
- }
148
- }
149
- sendJson(options) {
150
- const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
151
- [ODATA_VERSION]: VERSION_4_0,
152
- });
153
- return this.api
154
- .request('POST', this, {
155
- body: ODataBatchResource.buildJsonBody(this._requests, this.api.options),
156
- responseType: 'json',
157
- observe: 'response',
158
- headers: headers,
159
- params: options ? options.params : undefined,
160
- withCredentials: options ? options.withCredentials : undefined,
161
- })
162
- .pipe(map((response) => {
163
- if (this._responses == null) {
164
- this._responses = [];
165
- }
166
- this._responses = [
167
- ...this._responses,
168
- ...ODataBatchResource.parseJsonResponse(this._requests, response),
169
- ];
170
- //HACK: tuple[1] === undefined
171
- Arrays.zip(this._requests, this._responses).forEach((tuple) => {
172
- if (!tuple[0].isStopped && tuple[1])
173
- tuple[0].onLoad(tuple[1]);
174
- });
175
- return response;
176
- }));
177
- }
178
- sendLegacy(options) {
179
- const bound = Strings.uniqueId({ prefix: BATCH_PREFIX });
180
- const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
181
- [ODATA_VERSION]: VERSION_4_0,
182
- [CONTENT_TYPE]: MULTIPART_MIXED_BOUNDARY + bound,
183
- [ACCEPT]: MULTIPART_MIXED,
184
- });
185
- return this.api
186
- .request('POST', this, {
187
- body: ODataBatchResource.buildLegacyBody(bound, this._requests, this.api.options),
188
- responseType: 'text',
189
- observe: 'response',
190
- headers: headers,
191
- params: options ? options.params : undefined,
192
- withCredentials: options ? options.withCredentials : undefined,
193
- })
194
- .pipe(map((response) => {
195
- if (this._responses == null) {
196
- this._responses = [];
197
- }
198
- this._responses = [
199
- ...this._responses,
200
- ...ODataBatchResource.parseLegacyResponse(this._requests, response),
201
- ];
202
- Arrays.zip(this._requests, this._responses).forEach((tuple) => {
203
- if (!tuple[0].isStopped && tuple[1])
204
- tuple[0].onLoad(tuple[1]);
205
- });
206
- return response;
207
- }));
208
- }
209
- /**
210
- * Execute the batch request
211
- * @param ctx The context for the request
212
- * @param options The options of the batch request
213
- * @returns The result of execute the context
214
- */
215
- exec(ctx, options) {
216
- let result = this.add(ctx);
217
- return this.send(options).pipe(map((response) => [result, response]));
218
- }
219
- body() {
220
- return ODataBatchResource.buildLegacyBody(Strings.uniqueId({ prefix: BATCH_PREFIX }), this._requests, this.api.options);
221
- }
222
- json() {
223
- return ODataBatchResource.buildJsonBody(this._requests, this.api.options);
224
- }
225
- static buildLegacyBody(batchBoundary, requests, options) {
226
- let res = [];
227
- let changesetBoundary = null;
228
- let changesetId = 1;
229
- for (const request of requests) {
230
- // if method is GET and there is a changeset boundary open then close it
231
- if (request.request.method === 'GET' && changesetBoundary !== null) {
232
- res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
233
- changesetBoundary = null;
234
- }
235
- // if there is no changeset boundary open then open a batch boundary
236
- if (changesetBoundary === null) {
237
- res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}`);
238
- }
239
- // if method is not GET and there is no changeset boundary open then open a changeset boundary
240
- if (request.request.method !== 'GET') {
241
- if (changesetBoundary === null) {
242
- changesetBoundary = Strings.uniqueId({ prefix: CHANGESET_PREFIX });
243
- res.push(`${CONTENT_TYPE}: ${MULTIPART_MIXED_BOUNDARY}${changesetBoundary}`);
244
- res.push(NEWLINE);
245
- }
246
- res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}`);
247
- }
248
- res.push(`${CONTENT_TYPE}: ${APPLICATION_HTTP}`);
249
- res.push(`${CONTENT_TRANSFER_ENCODING}: ${BINARY}`);
250
- if (request.request.method !== 'GET') {
251
- res.push(`${CONTENT_ID}: ${changesetId++}`);
252
- }
253
- res.push(NEWLINE);
254
- res.push(`${request.toLegacy(options)}`);
255
- }
256
- if (res.length) {
257
- if (changesetBoundary !== null) {
258
- res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
259
- changesetBoundary = null;
260
- }
261
- res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
262
- }
263
- return res.join(NEWLINE);
264
- }
265
- static buildJsonBody(requests, options) {
266
- return {
267
- requests: requests.map((request) => request.toJson(options)),
268
- };
269
- }
270
- static parseLegacyResponse(requests, response) {
271
- let chunks = [];
272
- const contentType = response.headers.get(CONTENT_TYPE) || '';
273
- const batchBoundary = Http.boundaryDelimiter(contentType);
274
- const endLine = Http.boundaryEnd(batchBoundary);
275
- const lines = (response.body || '').split(NEWLINE_REGEXP);
276
- let changesetResponses = null;
277
- let contentId = null;
278
- let changesetBoundary = null;
279
- let changesetEndLine = null;
280
- let startIndex = null;
281
- for (let index = 0; index < lines.length; index++) {
282
- const line = lines[index];
283
- if (line.startsWith(CONTENT_TYPE)) {
284
- const contentTypeValue = Http.headerValue(line);
285
- if (contentTypeValue === MULTIPART_MIXED) {
286
- changesetResponses = [];
287
- contentId = null;
288
- changesetBoundary = Http.boundaryDelimiter(line);
289
- changesetEndLine = Http.boundaryEnd(changesetBoundary);
290
- startIndex = null;
291
- }
292
- continue;
293
- }
294
- else if (changesetResponses !== null && line.startsWith(CONTENT_ID)) {
295
- contentId = Number(Http.headerValue(line));
296
- }
297
- else if (line.startsWith(HTTP11)) {
298
- startIndex = index;
299
- }
300
- else if (line === batchBoundary ||
301
- line === changesetBoundary ||
302
- line === endLine ||
303
- line === changesetEndLine) {
304
- if (!startIndex) {
305
- continue;
306
- }
307
- const chunk = lines.slice(startIndex, index);
308
- if (changesetResponses !== null && contentId !== null) {
309
- changesetResponses[contentId] = chunk;
310
- }
311
- else {
312
- chunks.push(chunk);
313
- }
314
- if (line === batchBoundary || line === changesetBoundary) {
315
- startIndex = index + 1;
316
- }
317
- else if (line === endLine || line === changesetEndLine) {
318
- if (changesetResponses !== null) {
319
- for (const response of changesetResponses) {
320
- if (response) {
321
- chunks.push(response);
322
- }
323
- }
324
- }
325
- changesetResponses = null;
326
- changesetBoundary = null;
327
- changesetEndLine = null;
328
- startIndex = null;
329
- }
330
- }
331
- }
332
- return chunks.map((chunk, index) => {
333
- let request = requests[index].request;
334
- let { code, message } = Http.parseResponseStatus(chunk[0]);
335
- chunk = chunk.slice(1);
336
- let headers = new HttpHeaders();
337
- var index = 1;
338
- for (; index < chunk.length; index++) {
339
- const batchBodyLine = chunk[index];
340
- if (batchBodyLine === '') {
341
- break;
342
- }
343
- const batchBodyLineParts = batchBodyLine.split(': ');
344
- headers = headers.append(batchBodyLineParts[0].trim(), batchBodyLineParts[1].trim());
345
- }
346
- let body = '';
347
- for (; index < chunk.length; index++) {
348
- body += chunk[index];
349
- }
350
- if (code === 0) {
351
- code = !!body ? 200 : 0;
352
- }
353
- let ok = code >= 200 && code < 300;
354
- if (request.responseType === 'json' && typeof body === 'string') {
355
- const originalBody = body;
356
- body = body.replace(XSSI_PREFIX, '');
357
- try {
358
- body = body !== '' ? JSON.parse(body) : null;
359
- }
360
- catch (error) {
361
- body = originalBody;
362
- if (ok) {
363
- ok = false;
364
- body = { error, text: body };
365
- }
366
- }
367
- }
368
- return ok
369
- ? new HttpResponse({
370
- body,
371
- headers,
372
- status: code,
373
- statusText: message,
374
- url: request.urlWithParams,
375
- })
376
- : new HttpErrorResponse({
377
- // The error in this case is the response body (error from the server).
378
- error: body,
379
- headers,
380
- status: code,
381
- statusText: message,
382
- url: request.urlWithParams,
383
- });
384
- });
385
- }
386
- static parseJsonResponse(requests, response) {
387
- const responses = (response.body ? response.body : {})['responses'] ?? [];
388
- return responses.map((response, index) => {
389
- let request = requests[index].request;
390
- let code = response['status'];
391
- let headers = new HttpHeaders(response['headers']);
392
- let body = response['body'];
393
- if (code === 0) {
394
- code = !!body ? 200 : 0;
395
- }
396
- let ok = code >= 200 && code < 300;
397
- if (request.responseType === 'json' && typeof body === 'string') {
398
- const originalBody = body;
399
- body = body.replace(XSSI_PREFIX, '');
400
- try {
401
- body = body !== '' ? JSON.parse(body) : null;
402
- }
403
- catch (error) {
404
- body = originalBody;
405
- if (ok) {
406
- ok = false;
407
- body = { error, text: body };
408
- }
409
- }
410
- }
411
- return ok
412
- ? new HttpResponse({
413
- body,
414
- headers,
415
- status: code,
416
- url: request.urlWithParams,
417
- })
418
- : new HttpErrorResponse({
419
- // The error in this case is the response body (error from the server).
420
- error: body,
421
- headers,
422
- status: code,
423
- url: request.urlWithParams,
424
- });
425
- });
426
- }
427
- }
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLFlBQVksR0FFYixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE1BQU0sRUFDTixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxjQUFjLEVBQ2QsYUFBYSxFQUNiLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVDLE1BQU0sT0FBTyxpQkFBcUIsU0FBUSxPQUF5QjtJQUc5QztJQUZuQixFQUFFLENBQVM7SUFDWCxLQUFLLENBQVM7SUFDZCxZQUFtQixPQUEwQjtRQUMzQyxLQUFLLEVBQUUsQ0FBQztRQURTLFlBQU8sR0FBUCxPQUFPLENB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QUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxNQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUM7b0JBQ0gsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDL0MsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksR0FBRyxZQUFZLENBQUM7b0JBRXBCLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ1AsRUFBRSxHQUFHLEtBQUssQ0FBQzt3QkFDWCxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO29CQUMvQixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxFQUFFO2dCQUNQLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBTTtvQkFDcEIsSUFBSTtvQkFDSixPQUFPO29CQUNQLE1BQU0sRUFBRSxJQUFJO29CQUNaLEdBQUcsRUFBRSxPQUFPLENBQUMsYUFBYTtpQkFDM0IsQ0FBQztnQkFDSixDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQztvQkFDcEIsdUVBQXVFO29CQUN2RSxLQUFLLEVBQUUsSUFBSTtvQkFDWCxPQUFPO29CQUNQLE1BQU0sRUFBRSxJQUFJO29CQUNaLEdBQUcsRUFBRSxPQUFPLENBQUMsYUFBYTtpQkFDM0IsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgSHR0cEhlYWRlcnMsXG4gIEh0dHBSZXNwb25zZSxcbiAgSHR0cFJlc3BvbnNlQmFzZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPRGF0YUFwaSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQge1xuICAkQkFUQ0gsXG4gIEFDQ0VQVCxcbiAgQVBQTElDQVRJT05fSFRUUCxcbiAgQVBQTElDQVRJT05fSlNPTixcbiAgQkFUQ0hfUFJFRklYLFxuICBCSU5BUlksXG4gIEJPVU5EQVJZX1BSRUZJWF9TVUZGSVgsXG4gIENIQU5HRVNFVF9QUkVGSVgsXG4gIENPTlRFTlRfSUQsXG4gIENPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcsXG4gIENPTlRFTlRfVFlQRSxcbiAgSFRUUDExLFxuICBNVUxUSVBBUlRfTUlYRUQsXG4gIE1VTFRJUEFSVF9NSVhFRF9CT1VOREFSWSxcbiAgTkVXTElORSxcbiAgTkVXTElORV9SRUdFWFAsXG4gIE9EQVRBX1ZFUlNJT04sXG4gIFZFUlNJT05fNF8wLFxuICBYU1NJX1BSRUZJWCxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBhdGhTZWdtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXJyYXlzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXJyYXlzJztcbmltcG9ydCB7IEh0dHAgfSBmcm9tICcuLi8uLi91dGlscy9odHRwJztcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdzJztcbmltcG9ydCB7IE9EYXRhUGF0aFNlZ21lbnRzIH0gZnJvbSAnLi4vcGF0aCc7XG5pbXBvcnQgeyBPRGF0YVJlcXVlc3QgfSBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7IE9EYXRhUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBPRGF0YU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFBcGlPcHRpb25zIH0gZnJvbSAnLi4vLi4vb3B0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFCYXRjaFJlcXVlc3Q8VD4gZXh0ZW5kcyBTdWJqZWN0PEh0dHBSZXNwb25zZUJhc2U+IHtcbiAgaWQ6IHN0cmluZztcbiAgZ3JvdXA6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIHJlcXVlc3Q6IE9EYXRhUmVxdWVzdDxhbnk+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogJ3InIH0pO1xuICAgIHRoaXMuZ3JvdXAgPSBTdHJpbmdzLnVuaXF1ZUlkKHsgcHJlZml4OiAnZycgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0xlZ2FjeSgpO1xuICB9XG5cbiAgdG9MZWdhY3koeyByZWxhdGl2ZVVybHMgfTogeyByZWxhdGl2ZVVybHM/OiBib29sZWFuIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgLy9UT0RPOiBSZWxhdGl2ZSBvciBBYnNvbHV0ZSB1cmwgP1xuICAgIGxldCByZXMgPSBbXG4gICAgICBgJHt0aGlzLnJlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICByZWxhdGl2ZVVybHMgPyB0aGlzLnJlcXVlc3QucGF0aFdpdGhQYXJhbXMgOiB0aGlzLnJlcXVlc3QudXJsV2l0aFBhcmFtc1xuICAgICAgfSAke0hUVFAxMX1gLFxuICAgIF07XG4gICAgaWYgKFxuICAgICAgdGhpcy5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUEFUQ0gnIHx8XG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUFVUJ1xuICAgICkge1xuICAgICAgcmVzLnB1c2goYCR7Q09OVEVOVF9UWVBFfTogJHtBUFBMSUNBVElPTl9KU09OfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QuaGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSB7XG4gICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgcmVzID0gW1xuICAgICAgICAuLi5yZXMsXG4gICAgICAgIC4uLmhlYWRlcnNcbiAgICAgICAgICAua2V5cygpXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAkeyhoZWFkZXJzLmdldEFsbChrZXkpIHx8IFtdKS5qb2luKCcsJyl9YCksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnREVMRVRFJykge1xuICAgICAgcmVzLnB1c2goTkVXTElORSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5wdXNoKGAke05FV0xJTkV9JHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlcXVlc3QuYm9keSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5qb2luKE5FV0xJTkUpO1xuICB9XG5cbiAgdG9Kc29uKHsgcmVsYXRpdmVVcmxzIH06IHsgcmVsYXRpdmVVcmxzPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgcmVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgbWV0aG9kOiB0aGlzLnJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZWxhdGl2ZVVybHNcbiAgICAgICAgPyB0aGlzLnJlcXVlc3QucGF0aFdpdGhQYXJhbXNcbiAgICAgICAgOiB0aGlzLnJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgIC8vJ2F0b21pY2l0eUdyb3VwJzogdGhpcy5ncm91cFxuICAgICAgLy9cImRlcGVuZHNPblwiOiBbXCJnMVwiLCBcImcyXCIsIFwicjJcIl1cbiAgICB9O1xuICAgIGlmICh0aGlzLnJlcXVlc3QuaGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSB7XG4gICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgcmVzWydoZWFkZXJzJ10gPSBoZWFkZXJzXG4gICAgICAgIC5rZXlzKClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAkeyhoZWFkZXJzLmdldEFsbChrZXkpIHx8IFtdKS5qb2luKCcsJyl9YCk7XG4gICAgfVxuICAgIGlmICghKHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdERUxFVEUnKSkge1xuICAgICAgcmVzWydib2R5J10gPSB0aGlzLnJlcXVlc3QuYm9keTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgb25Mb2FkKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICB0aGlzLm5leHQocmVzcG9uc2UpO1xuICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbiB1bnN1Y2Nlc3NmdWwgcmVxdWVzdCBpcyBkZWxpdmVyZWQgb24gdGhlIGVycm9yIGNoYW5uZWwuXG4gICAgICB0aGlzLmVycm9yKHJlc3BvbnNlIGFzIEh0dHBFcnJvclJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgIHRoaXMuZXJyb3IocmVzcG9uc2UpO1xuICB9XG59XG5cbi8qKlxuICogT0RhdGEgQmF0Y2ggUmVzb3VyY2VcbiAqIGh0dHBzOi8vd3d3Lm9kYXRhLm9yZy9nZXR0aW5nLXN0YXJ0ZWQvYWR2YW5jZWQtdHV0b3JpYWwvI2JhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBPRGF0YUJhdGNoUmVzb3VyY2UgZXh0ZW5kcyBPRGF0YVJlc291cmNlPGFueT4ge1xuICAvLyBWQVJJQUJMRVNcbiAgcHJpdmF0ZSBfcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSA9IFtdO1xuICByZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMubWFwKChyKSA9PiByLnJlcXVlc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzcG9uc2VzOiBIdHRwUmVzcG9uc2VCYXNlW10gfCBudWxsID0gbnVsbDtcbiAgcmVzcG9uc2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZXM7XG4gIH1cblxuICAvLyNyZWdpb24gRmFjdG9yeVxuICBzdGF0aWMgZmFjdG9yeShhcGk6IE9EYXRhQXBpKSB7XG4gICAgbGV0IHNlZ21lbnRzID0gbmV3IE9EYXRhUGF0aFNlZ21lbnRzKCk7XG4gICAgc2VnbWVudHMuYWRkKFBhdGhTZWdtZW50LmJhdGNoLCAkQkFUQ0gpO1xuICAgIHJldHVybiBuZXcgT0RhdGFCYXRjaFJlc291cmNlKGFwaSwgeyBzZWdtZW50cyB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IE9EYXRhQmF0Y2hSZXNvdXJjZSB7XG4gICAgY29uc3QgYmF0Y2ggPSBzdXBlci5jbG9uZSgpIGFzIE9EYXRhQmF0Y2hSZXNvdXJjZTtcbiAgICBiYXRjaC5fcmVxdWVzdHMgPSBbLi4udGhpcy5fcmVxdWVzdHNdO1xuICAgIHJldHVybiBiYXRjaDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwcml2YXRlIHN0b3JlUmVxdWVzdGVyKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmFwaS5yZXF1ZXN0ZXI7XG4gICAgLy8gU3dpdGNoIHRvIHRoZSBiYXRjaCByZXF1ZXN0ZXJcbiAgICB0aGlzLmFwaS5yZXF1ZXN0ZXIgPSAocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8YW55PiA9PiB7XG4gICAgICBpZiAocmVxLmFwaSAhPT0gdGhpcy5hcGkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQmF0Y2ggUmVxdWVzdCBhcmUgZm9yIHRoZSBzYW1lIGFwaS4nKTtcbiAgICAgIGlmIChyZXEub2JzZXJ2ZSA9PT0gJ2V2ZW50cycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhdGNoIFJlcXVlc3QgZG9lcyBub3QgYWxsb3dzIG9ic2VydmUgPT0gJ2V2ZW50cycuXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaChuZXcgT0RhdGFCYXRjaFJlcXVlc3Q8YW55PihyZXEpKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0c1t0aGlzLl9yZXF1ZXN0cy5sZW5ndGggLSAxXTtcbiAgICB9O1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUmVxdWVzdGVyKFxuICAgIGhhbmRsZXI6ICgocmVxOiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+KSB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgdGhpcy5hcGkucmVxdWVzdGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdG8gYmF0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0gY3R4IFRoZSBjb250ZXh0IGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV4ZWN1dGUgdGhlIGNvbnRleHRcbiAgICovXG4gIGFkZDxSPihjdHg6IChiYXRjaDogdGhpcykgPT4gUik6IFIge1xuICAgIC8vIFN0b3JlIG9yaWdpbmFsIHJlcXVlc3RlclxuICAgIHZhciBoYW5kbGVyID0gdGhpcy5zdG9yZVJlcXVlc3RlcigpO1xuICAgIC8vIEV4ZWN1dGUgdGhlIGNvbnRleHRcbiAgICBjb25zdCByZXN1bHQgPSBjdHgodGhpcyk7XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCByZXF1ZXN0ZXJcbiAgICB0aGlzLnJlc3RvcmVSZXF1ZXN0ZXIoaGFuZGxlcik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc2VuZChvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPGFueT4+IHtcbiAgICBpZiAodGhpcy5hcGkub3B0aW9ucy5qc29uQmF0Y2hGb3JtYXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRKc29uKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kTGVnYWN5KG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZEpzb24ob3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxPYmplY3Q+PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IEh0dHAubWVyZ2VIdHRwSGVhZGVycygob3B0aW9ucyAmJiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9LCB7XG4gICAgICBbT0RBVEFfVkVSU0lPTl06IFZFUlNJT05fNF8wLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgLnJlcXVlc3Q8b2JqZWN0PignUE9TVCcsIHRoaXMsIHtcbiAgICAgICAgYm9keTogT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkSnNvbkJvZHkoXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMsXG4gICAgICAgICAgdGhpcy5hcGkub3B0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIHBhcmFtczogb3B0aW9ucyA/IG9wdGlvbnMucGFyYW1zIDogdW5kZWZpbmVkLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMgPyBvcHRpb25zLndpdGhDcmVkZW50aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogT0RhdGFSZXNwb25zZTxPYmplY3Q+KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3BvbnNlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZXMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fcmVzcG9uc2VzLFxuICAgICAgICAgICAgLi4uT0RhdGFCYXRjaFJlc291cmNlLnBhcnNlSnNvblJlc3BvbnNlKHRoaXMuX3JlcXVlc3RzLCByZXNwb25zZSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICAvL0hBQ0s6IHR1cGxlWzFdID09PSB1bmRlZmluZWRcbiAgICAgICAgICBBcnJheXMuemlwKHRoaXMuX3JlcXVlc3RzLCB0aGlzLl9yZXNwb25zZXMpLmZvckVhY2goKHR1cGxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR1cGxlWzBdLmlzU3RvcHBlZCAmJiB0dXBsZVsxXSkgdHVwbGVbMF0ub25Mb2FkKHR1cGxlWzFdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZExlZ2FjeShcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj4ge1xuICAgIGNvbnN0IGJvdW5kID0gU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogQkFUQ0hfUFJFRklYIH0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBIdHRwLm1lcmdlSHR0cEhlYWRlcnMoKG9wdGlvbnMgJiYgb3B0aW9ucy5oZWFkZXJzKSB8fCB7fSwge1xuICAgICAgW09EQVRBX1ZFUlNJT05dOiBWRVJTSU9OXzRfMCxcbiAgICAgIFtDT05URU5UX1RZUEVdOiBNVUxUSVBBUlRfTUlYRURfQk9VTkRBUlkgKyBib3VuZCxcbiAgICAgIFtBQ0NFUFRdOiBNVUxUSVBBUlRfTUlYRUQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAucmVxdWVzdDxPRGF0YVJlc3BvbnNlPHN0cmluZz4+KCdQT1NUJywgdGhpcywge1xuICAgICAgICBib2R5OiBPRGF0YUJhdGNoUmVzb3VyY2UuYnVpbGRMZWdhY3lCb2R5KFxuICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLFxuICAgICAgICAgIHRoaXMuYXBpLm9wdGlvbnMsXG4gICAgICAgICksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBwYXJhbXM6IG9wdGlvbnMgPyBvcHRpb25zLnBhcmFtcyA6IHVuZGVmaW5lZCxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zID8gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IE9EYXRhUmVzcG9uc2U8c3RyaW5nPikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9yZXNwb25zZXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX3Jlc3BvbnNlcyxcbiAgICAgICAgICAgIC4uLk9EYXRhQmF0Y2hSZXNvdXJjZS5wYXJzZUxlZ2FjeVJlc3BvbnNlKHRoaXMuX3JlcXVlc3RzLCByZXNwb25zZSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICBBcnJheXMuemlwKHRoaXMuX3JlcXVlc3RzLCB0aGlzLl9yZXNwb25zZXMpLmZvckVhY2goKHR1cGxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR1cGxlWzBdLmlzU3RvcHBlZCAmJiB0dXBsZVsxXSkgdHVwbGVbMF0ub25Mb2FkKHR1cGxlWzFdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBiYXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSBjdHggVGhlIGNvbnRleHQgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBiYXRjaCByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXhlY3V0ZSB0aGUgY29udGV4dFxuICAgKi9cbiAgZXhlYzxSPihcbiAgICBjdHg6IChiYXRjaDogdGhpcykgPT4gUixcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPFtSLCBPRGF0YVJlc3BvbnNlPHN0cmluZz5dPiB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuYWRkKGN0eCk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZChvcHRpb25zKS5waXBlKG1hcCgocmVzcG9uc2UpID0+IFtyZXN1bHQsIHJlc3BvbnNlXSkpO1xuICB9XG5cbiAgYm9keSgpIHtcbiAgICByZXR1cm4gT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkTGVnYWN5Qm9keShcbiAgICAgIFN0cmluZ3MudW5pcXVlSWQoeyBwcmVmaXg6IEJBVENIX1BSRUZJWCB9KSxcbiAgICAgIHRoaXMuX3JlcXVlc3RzLFxuICAgICAgdGhpcy5hcGkub3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAganNvbigpIHtcbiAgICByZXR1cm4gT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkSnNvbkJvZHkodGhpcy5fcmVxdWVzdHMsIHRoaXMuYXBpLm9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkTGVnYWN5Qm9keShcbiAgICBiYXRjaEJvdW5kYXJ5OiBzdHJpbmcsXG4gICAgcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSxcbiAgICBvcHRpb25zOiBPRGF0YUFwaU9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGxldCBjaGFuZ2VzZXRCb3VuZGFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNoYW5nZXNldElkID0gMTtcblxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgLy8gaWYgbWV0aG9kIGlzIEdFVCBhbmQgdGhlcmUgaXMgYSBjaGFuZ2VzZXQgYm91bmRhcnkgb3BlbiB0aGVuIGNsb3NlIGl0XG4gICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcgJiYgY2hhbmdlc2V0Qm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2NoYW5nZXNldEJvdW5kYXJ5fSR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH1gLFxuICAgICAgICApO1xuICAgICAgICBjaGFuZ2VzZXRCb3VuZGFyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGNoYW5nZXNldCBib3VuZGFyeSBvcGVuIHRoZW4gb3BlbiBhIGJhdGNoIGJvdW5kYXJ5XG4gICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgPT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2JhdGNoQm91bmRhcnl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG1ldGhvZCBpcyBub3QgR0VUIGFuZCB0aGVyZSBpcyBubyBjaGFuZ2VzZXQgYm91bmRhcnkgb3BlbiB0aGVuIG9wZW4gYSBjaGFuZ2VzZXQgYm91bmRhcnlcbiAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3QubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgPT09IG51bGwpIHtcbiAgICAgICAgICBjaGFuZ2VzZXRCb3VuZGFyeSA9IFN0cmluZ3MudW5pcXVlSWQoeyBwcmVmaXg6IENIQU5HRVNFVF9QUkVGSVggfSk7XG4gICAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgICBgJHtDT05URU5UX1RZUEV9OiAke01VTFRJUEFSVF9NSVhFRF9CT1VOREFSWX0ke2NoYW5nZXNldEJvdW5kYXJ5fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXMucHVzaChORVdMSU5FKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChgJHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfSR7Y2hhbmdlc2V0Qm91bmRhcnl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfVFlQRX06ICR7QVBQTElDQVRJT05fSFRUUH1gKTtcbiAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkd9OiAke0JJTkFSWX1gKTtcblxuICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdC5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfSUR9OiAke2NoYW5nZXNldElkKyt9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKE5FV0xJTkUpO1xuICAgICAgcmVzLnB1c2goYCR7cmVxdWVzdC50b0xlZ2FjeShvcHRpb25zKX1gKTtcbiAgICB9XG5cbiAgICBpZiAocmVzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoYW5nZXNldEJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgIGAke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9JHtjaGFuZ2VzZXRCb3VuZGFyeX0ke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmVzLnB1c2goXG4gICAgICAgIGAke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9JHtiYXRjaEJvdW5kYXJ5fSR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qb2luKE5FV0xJTkUpO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkSnNvbkJvZHkoXG4gICAgcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSxcbiAgICBvcHRpb25zOiBPRGF0YUFwaU9wdGlvbnMsXG4gICk6IE9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RzOiByZXF1ZXN0cy5tYXAoKHJlcXVlc3QpID0+IHJlcXVlc3QudG9Kc29uKG9wdGlvbnMpKSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlTGVnYWN5UmVzcG9uc2UoXG4gICAgcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSxcbiAgICByZXNwb25zZTogT0RhdGFSZXNwb25zZTxzdHJpbmc+LFxuICApOiBIdHRwUmVzcG9uc2VCYXNlW10ge1xuICAgIGxldCBjaHVua3M6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBjb250ZW50VHlwZTogc3RyaW5nID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoQ09OVEVOVF9UWVBFKSB8fCAnJztcbiAgICBjb25zdCBiYXRjaEJvdW5kYXJ5OiBzdHJpbmcgPSBIdHRwLmJvdW5kYXJ5RGVsaW1pdGVyKGNvbnRlbnRUeXBlKTtcbiAgICBjb25zdCBlbmRMaW5lOiBzdHJpbmcgPSBIdHRwLmJvdW5kYXJ5RW5kKGJhdGNoQm91bmRhcnkpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gKHJlc3BvbnNlLmJvZHkgfHwgJycpLnNwbGl0KE5FV0xJTkVfUkVHRVhQKTtcblxuICAgIGxldCBjaGFuZ2VzZXRSZXNwb25zZXM6IHN0cmluZ1tdW10gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY29udGVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY2hhbmdlc2V0Qm91bmRhcnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjaGFuZ2VzZXRFbmRMaW5lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc3RhcnRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2luZGV4XTtcblxuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChDT05URU5UX1RZUEUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlVmFsdWU6IHN0cmluZyA9IEh0dHAuaGVhZGVyVmFsdWUobGluZSk7XG4gICAgICAgIGlmIChjb250ZW50VHlwZVZhbHVlID09PSBNVUxUSVBBUlRfTUlYRUQpIHtcbiAgICAgICAgICBjaGFuZ2VzZXRSZXNwb25zZXMgPSBbXTtcbiAgICAgICAgICBjb250ZW50SWQgPSBudWxsO1xuICAgICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gSHR0cC5ib3VuZGFyeURlbGltaXRlcihsaW5lKTtcbiAgICAgICAgICBjaGFuZ2VzZXRFbmRMaW5lID0gSHR0cC5ib3VuZGFyeUVuZChjaGFuZ2VzZXRCb3VuZGFyeSk7XG4gICAgICAgICAgc3RhcnRJbmRleCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNldFJlc3BvbnNlcyAhPT0gbnVsbCAmJiBsaW5lLnN0YXJ0c1dpdGgoQ09OVEVOVF9JRCkpIHtcbiAgICAgICAgY29udGVudElkID0gTnVtYmVyKEh0dHAuaGVhZGVyVmFsdWUobGluZSkpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoSFRUUDExKSkge1xuICAgICAgICBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBsaW5lID09PSBiYXRjaEJvdW5kYXJ5IHx8XG4gICAgICAgIGxpbmUgPT09IGNoYW5nZXNldEJvdW5kYXJ5IHx8XG4gICAgICAgIGxpbmUgPT09IGVuZExpbmUgfHxcbiAgICAgICAgbGluZSA9PT0gY2hhbmdlc2V0RW5kTGluZVxuICAgICAgKSB7XG4gICAgICAgIGlmICghc3RhcnRJbmRleCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNodW5rID0gbGluZXMuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXgpO1xuICAgICAgICBpZiAoY2hhbmdlc2V0UmVzcG9uc2VzICE9PSBudWxsICYmIGNvbnRlbnRJZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNoYW5nZXNldFJlc3BvbnNlc1tjb250ZW50SWRdID0gY2h1bms7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmUgPT09IGJhdGNoQm91bmRhcnkgfHwgbGluZSA9PT0gY2hhbmdlc2V0Qm91bmRhcnkpIHtcbiAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmUgPT09IGVuZExpbmUgfHwgbGluZSA9PT0gY2hhbmdlc2V0RW5kTGluZSkge1xuICAgICAgICAgIGlmIChjaGFuZ2VzZXRSZXNwb25zZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgY2hhbmdlc2V0UmVzcG9uc2VzKSB7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFuZ2VzZXRSZXNwb25zZXMgPSBudWxsO1xuICAgICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gbnVsbDtcbiAgICAgICAgICBjaGFuZ2VzZXRFbmRMaW5lID0gbnVsbDtcbiAgICAgICAgICBzdGFydEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2h1bmtzLm1hcCgoY2h1bms6IHN0cmluZ1tdLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgcmVxdWVzdCA9IHJlcXVlc3RzW2luZGV4XS5yZXF1ZXN0O1xuICAgICAgbGV0IHsgY29kZSwgbWVzc2FnZSB9ID0gSHR0cC5wYXJzZVJlc3BvbnNlU3RhdHVzKGNodW5rWzBdKTtcbiAgICAgIGNodW5rID0gY2h1bmsuc2xpY2UoMSk7XG5cbiAgICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgICAgdmFyIGluZGV4ID0gMTtcbiAgICAgIGZvciAoOyBpbmRleCA8IGNodW5rLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBiYXRjaEJvZHlMaW5lOiBzdHJpbmcgPSBjaHVua1tpbmRleF07XG5cbiAgICAgICAgaWYgKGJhdGNoQm9keUxpbmUgPT09ICcnKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXRjaEJvZHlMaW5lUGFydHM6IHN0cmluZ1tdID0gYmF0Y2hCb2R5TGluZS5zcGxpdCgnOiAnKTtcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFxuICAgICAgICAgIGJhdGNoQm9keUxpbmVQYXJ0c1swXS50cmltKCksXG4gICAgICAgICAgYmF0Y2hCb2R5TGluZVBhcnRzWzFdLnRyaW0oKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IHsgZXJyb3I6IGFueTsgdGV4dDogc3RyaW5nIH0gPSAnJztcbiAgICAgIGZvciAoOyBpbmRleCA8IGNodW5rLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBib2R5ICs9IGNodW5rW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgY29kZSA9ICEhYm9keSA/IDIwMCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBvayA9IGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDA7XG4gICAgICBpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUgPT09ICdqc29uJyAmJiB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gYm9keTtcbiAgICAgICAgYm9keSA9IGJvZHkucmVwbGFjZShYU1NJX1BSRUZJWCwgJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBib2R5ICE9PSAnJyA/IEpTT04ucGFyc2UoYm9keSkgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGJvZHkgPSBvcmlnaW5hbEJvZHk7XG5cbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgICBib2R5ID0geyBlcnJvciwgdGV4dDogYm9keSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2tcbiAgICAgICAgPyBuZXcgSHR0cFJlc3BvbnNlPGFueT4oe1xuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiBtZXNzYWdlLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybFdpdGhQYXJhbXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBuZXcgSHR0cEVycm9yUmVzcG9uc2Uoe1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGluIHRoaXMgY2FzZSBpcyB0aGUgcmVzcG9uc2UgYm9keSAoZXJyb3IgZnJvbSB0aGUgc2VydmVyKS5cbiAgICAgICAgICAgIGVycm9yOiBib2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IG1lc3NhZ2UsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpzb25SZXNwb25zZShcbiAgICByZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdLFxuICAgIHJlc3BvbnNlOiBPRGF0YVJlc3BvbnNlPGFueT4sXG4gICk6IEh0dHBSZXNwb25zZUJhc2VbXSB7XG4gICAgY29uc3QgcmVzcG9uc2VzOiBPYmplY3RbXSA9XG4gICAgICAocmVzcG9uc2UuYm9keSA/IHJlc3BvbnNlLmJvZHkgOiB7fSlbJ3Jlc3BvbnNlcyddID8/IFtdO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlcy5tYXAoKHJlc3BvbnNlOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGxldCByZXF1ZXN0ID0gcmVxdWVzdHNbaW5kZXhdLnJlcXVlc3Q7XG4gICAgICBsZXQgY29kZSA9IHJlc3BvbnNlWydzdGF0dXMnXTtcblxuICAgICAgbGV0IGhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHJlc3BvbnNlWydoZWFkZXJzJ10pO1xuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IHsgZXJyb3I6IGFueTsgdGV4dDogc3RyaW5nIH0gPSByZXNwb25zZVsnYm9keSddO1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgY29kZSA9ICEhYm9keSA/IDIwMCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBvayA9IGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDA7XG4gICAgICBpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUgPT09ICdqc29uJyAmJiB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gYm9keTtcbiAgICAgICAgYm9keSA9IGJvZHkucmVwbGFjZShYU1NJX1BSRUZJWCwgJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBib2R5ICE9PSAnJyA/IEpTT04ucGFyc2UoYm9keSkgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGJvZHkgPSBvcmlnaW5hbEJvZHk7XG5cbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgICBib2R5ID0geyBlcnJvciwgdGV4dDogYm9keSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2tcbiAgICAgICAgPyBuZXcgSHR0cFJlc3BvbnNlPGFueT4oe1xuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgICAgICB9KVxuICAgICAgICA6IG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgaW4gdGhpcyBjYXNlIGlzIHRoZSByZXNwb25zZSBib2R5IChlcnJvciBmcm9tIHRoZSBzZXJ2ZXIpLlxuICAgICAgICAgICAgZXJyb3I6IGJvZHksXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybFdpdGhQYXJhbXMsXG4gICAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==