@po-ui/ng-sync 5.22.1 → 6.0.0-rc.1

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 (145) hide show
  1. package/README.md +22 -22
  2. package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +15 -15
  3. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +6 -6
  4. package/{esm2015/lib/models/po-data-message.model.js → esm2020/lib/models/po-data-message.model.mjs} +57 -57
  5. package/esm2020/lib/models/po-data-transform.model.mjs +22 -0
  6. package/esm2020/lib/models/po-entity/po-entity.model.mjs +214 -0
  7. package/{esm2015/lib/models/po-event-sourcing-error-response.model.js → esm2020/lib/models/po-event-sourcing-error-response.model.mjs} +17 -17
  8. package/{esm2015/lib/models/po-network-status.model.js → esm2020/lib/models/po-network-status.model.mjs} +44 -44
  9. package/{esm2015/lib/models/po-network-type.enum.js → esm2020/lib/models/po-network-type.enum.mjs} +30 -30
  10. package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +238 -0
  11. package/{esm2015/lib/models/po-request-type.enum.js → esm2020/lib/models/po-request-type.enum.mjs} +16 -16
  12. package/esm2020/lib/po-sync.module.mjs +45 -0
  13. package/{esm2015/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.js → esm2020/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs} +17 -17
  14. package/{esm2015/lib/services/po-event-sourcing/index.js → esm2020/lib/services/po-event-sourcing/index.mjs} +4 -4
  15. package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +2 -0
  16. package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +2 -0
  17. package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +372 -0
  18. package/{esm2015/lib/services/po-http-client/interfaces/po-http-header-option.interface.js → esm2020/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs} +11 -11
  19. package/esm2020/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +2 -0
  20. package/esm2020/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +2 -0
  21. package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +148 -0
  22. package/{esm2015/lib/services/po-http-client/po-http-request-type.enum.js → esm2020/lib/services/po-http-client/po-http-request-type.enum.mjs} +25 -25
  23. package/esm2020/lib/services/po-network/po-network.service.mjs +58 -0
  24. package/{esm2015/lib/services/po-schema/index.js → esm2020/lib/services/po-schema/index.mjs} +4 -4
  25. package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +77 -0
  26. package/{esm2015/lib/services/po-schema/po-schema-util/po-schema-util.model.js → esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs} +124 -124
  27. package/esm2020/lib/services/po-schema/po-schema.service.mjs +174 -0
  28. package/esm2020/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +2 -0
  29. package/esm2020/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +2 -0
  30. package/esm2020/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +2 -0
  31. package/esm2020/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +2 -0
  32. package/esm2020/lib/services/po-sync/po-sync.service.mjs +325 -0
  33. package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +63 -63
  34. package/esm2020/po-ui-ng-sync.mjs +5 -0
  35. package/{esm2015/public-api.js → esm2020/public-api.mjs} +2 -2
  36. package/fesm2015/{po-ui-ng-sync.js → po-ui-ng-sync.mjs} +2075 -2059
  37. package/fesm2015/po-ui-ng-sync.mjs.map +1 -0
  38. package/fesm2020/po-ui-ng-sync.mjs +2018 -0
  39. package/fesm2020/po-ui-ng-sync.mjs.map +1 -0
  40. package/lib/index.d.ts +14 -14
  41. package/lib/models/index.d.ts +5 -5
  42. package/lib/models/po-data-message.model.d.ts +46 -46
  43. package/lib/models/po-data-transform.model.d.ts +52 -52
  44. package/lib/models/po-entity/po-entity.model.d.ts +122 -122
  45. package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
  46. package/lib/models/po-network-status.model.d.ts +25 -25
  47. package/lib/models/po-network-type.enum.d.ts +28 -28
  48. package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
  49. package/lib/models/po-request-type.enum.d.ts +14 -14
  50. package/lib/po-sync.module.d.ts +12 -7
  51. package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
  52. package/lib/services/po-event-sourcing/index.d.ts +3 -3
  53. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
  54. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
  55. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -71
  56. package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
  57. package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
  58. package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
  59. package/lib/services/po-http-client/po-http-client.service.d.ts +78 -75
  60. package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
  61. package/lib/services/po-network/po-network.service.d.ts +36 -33
  62. package/lib/services/po-schema/index.d.ts +3 -3
  63. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -48
  64. package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
  65. package/lib/services/po-schema/po-schema.service.d.ts +98 -95
  66. package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
  67. package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
  68. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
  69. package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
  70. package/lib/services/po-sync/po-sync.service.d.ts +162 -159
  71. package/lib/utils/utils.d.ts +36 -36
  72. package/package.json +26 -14
  73. package/po-ui-ng-sync-6.0.0-rc.1.tgz +0 -0
  74. package/po-ui-ng-sync.d.ts +5 -8
  75. package/public-api.d.ts +1 -1
  76. package/schematics/README.md +169 -169
  77. package/schematics/collection.json +15 -15
  78. package/schematics/migrations.json +30 -25
  79. package/schematics/ng-add/index.d.ts +7 -7
  80. package/schematics/ng-add/index.js +33 -33
  81. package/schematics/ng-add/index.js.map +1 -1
  82. package/schematics/ng-add/index.spec.d.ts +1 -1
  83. package/schematics/ng-add/index.spec.js +62 -62
  84. package/schematics/ng-add/index.spec.js.map +1 -1
  85. package/schematics/ng-add/schema.json +7 -7
  86. package/schematics/ng-generate/schema/files/__path__/__name@dasherize__/__name@dasherize__.constants.ts.template +13 -13
  87. package/schematics/ng-generate/schema/index.d.ts +4 -4
  88. package/schematics/ng-generate/schema/index.js +12 -12
  89. package/schematics/ng-generate/schema/index.js.map +1 -1
  90. package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
  91. package/schematics/ng-generate/schema/index.spec.js +44 -44
  92. package/schematics/ng-generate/schema/index.spec.js.map +1 -1
  93. package/schematics/ng-generate/schema/schema.d.ts +3 -3
  94. package/schematics/ng-generate/schema/schema.js +2 -2
  95. package/schematics/ng-generate/schema/schema.json +31 -31
  96. package/schematics/ng-update/v2/changes.d.ts +8 -8
  97. package/schematics/ng-update/v2/changes.js +20 -20
  98. package/schematics/ng-update/v2/index.d.ts +5 -5
  99. package/schematics/ng-update/v2/index.js +101 -101
  100. package/schematics/ng-update/v2/index.js.map +1 -1
  101. package/schematics/ng-update/v3/changes.d.ts +2 -2
  102. package/schematics/ng-update/v3/changes.js +14 -14
  103. package/schematics/ng-update/v3/index.d.ts +1 -1
  104. package/schematics/ng-update/v3/index.js +16 -16
  105. package/schematics/ng-update/v3/index.js.map +1 -1
  106. package/schematics/ng-update/v4/changes.d.ts +2 -2
  107. package/schematics/ng-update/v4/changes.js +14 -14
  108. package/schematics/ng-update/v4/index.d.ts +1 -1
  109. package/schematics/ng-update/v4/index.js +15 -15
  110. package/schematics/ng-update/v4/index.js.map +1 -1
  111. package/schematics/ng-update/v5/changes.d.ts +2 -2
  112. package/schematics/ng-update/v5/changes.js +13 -13
  113. package/schematics/ng-update/v5/index.d.ts +1 -1
  114. package/schematics/ng-update/v5/index.js +15 -15
  115. package/schematics/ng-update/v5/index.js.map +1 -1
  116. package/schematics/ng-update/v6/changes.d.ts +2 -0
  117. package/schematics/ng-update/v6/changes.js +14 -0
  118. package/schematics/ng-update/v6/changes.js.map +1 -0
  119. package/schematics/ng-update/v6/index.d.ts +1 -0
  120. package/schematics/ng-update/v6/index.js +16 -0
  121. package/schematics/ng-update/v6/index.js.map +1 -0
  122. package/bundles/po-ui-ng-sync.umd.js +0 -3002
  123. package/bundles/po-ui-ng-sync.umd.js.map +0 -1
  124. package/esm2015/lib/models/po-data-transform.model.js +0 -22
  125. package/esm2015/lib/models/po-entity/po-entity.model.js +0 -229
  126. package/esm2015/lib/models/po-query-builder/po-query-builder.model.js +0 -241
  127. package/esm2015/lib/po-sync.module.js +0 -31
  128. package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.js +0 -2
  129. package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.js +0 -2
  130. package/esm2015/lib/services/po-event-sourcing/po-event-sourcing.service.js +0 -411
  131. package/esm2015/lib/services/po-http-client/interfaces/po-http-request-data.interface.js +0 -2
  132. package/esm2015/lib/services/po-http-client/interfaces/po-response-api.interface.js +0 -2
  133. package/esm2015/lib/services/po-http-client/po-http-client.service.js +0 -147
  134. package/esm2015/lib/services/po-network/po-network.service.js +0 -58
  135. package/esm2015/lib/services/po-schema/po-schema-definition/po-schema-definition.service.js +0 -80
  136. package/esm2015/lib/services/po-schema/po-schema.service.js +0 -198
  137. package/esm2015/lib/services/po-sync/interfaces/po-sync-config.interface.js +0 -2
  138. package/esm2015/lib/services/po-sync/interfaces/po-sync-field-options.interface.js +0 -2
  139. package/esm2015/lib/services/po-sync/interfaces/po-sync-response.interface.js +0 -2
  140. package/esm2015/lib/services/po-sync/interfaces/po-sync-schema.interface.js +0 -2
  141. package/esm2015/lib/services/po-sync/po-sync.service.js +0 -336
  142. package/esm2015/po-ui-ng-sync.js +0 -9
  143. package/fesm2015/po-ui-ng-sync.js.map +0 -1
  144. package/po-ui-ng-sync-5.22.1.tgz +0 -0
  145. package/po-ui-ng-sync.metadata.json +0 -1
@@ -0,0 +1,372 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as HttpStatus from 'http-status-codes';
3
+ import { Observable, of, Subject } from 'rxjs';
4
+ import { expand, map, reduce } from 'rxjs/operators';
5
+ import { toBase64, toFile } from '../../utils/utils';
6
+ import { PoEventSourcingErrorResponse } from '../../models/po-event-sourcing-error-response.model';
7
+ import { PoEventSourcingOperation } from './enums/po-event-sourcing-operation.enum';
8
+ import { PoHttpRequestType } from '../po-http-client/po-http-request-type.enum';
9
+ import { PoRequestType } from '../../models/po-request-type.enum';
10
+ import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
+ import * as i2 from "./../po-schema/po-schema.service";
14
+ import * as i3 from "@po-ui/ng-storage";
15
+ import * as i4 from "./../po-http-client/po-http-client.service";
16
+ export class PoEventSourcingService {
17
+ constructor(poSchemaDefinition, poSchemaService, poStorage, poHttpClient) {
18
+ this.poSchemaDefinition = poSchemaDefinition;
19
+ this.poSchemaService = poSchemaService;
20
+ this.poStorage = poStorage;
21
+ this.poHttpClient = poHttpClient;
22
+ this.stoppedQueueEventSourcing = false;
23
+ this.responseSubject = new Subject();
24
+ this.schemasSyncConfig = {};
25
+ }
26
+ static getUrl(eventSourcingItem, schema, requestType) {
27
+ const schemaUrl = PoSchemaUtil.getUrl(schema, requestType);
28
+ const schemaId = eventSourcingItem.record[schema.idField];
29
+ if (requestType === PoRequestType.GET) {
30
+ return schemaUrl;
31
+ }
32
+ if ([PoRequestType.DELETE, PoRequestType.PATCH].includes(requestType)) {
33
+ return schemaUrl ? `${schemaUrl}/${schemaId}` : `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}/${schemaId}`;
34
+ }
35
+ if (requestType === PoRequestType.POST) {
36
+ return schemaUrl ? schemaUrl : PoSchemaUtil.getUrl(schema, PoRequestType.GET);
37
+ }
38
+ }
39
+ create(schemaName, newItem, customRequestId) {
40
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Insert, newItem, schemaName, customRequestId);
41
+ return this.insertEventSourcingQueue(eventSourcingItem);
42
+ }
43
+ async createBatchEvents(schemaName, eventList) {
44
+ const eventSourcingList = this.createEventSourcingList(schemaName, eventList);
45
+ await this.poStorage.appendArrayToArray(PoEventSourcingService.event_sourcing_name, eventSourcingList);
46
+ this.notifyEventCreation();
47
+ }
48
+ /**
49
+ * Destrói a chave do *storage* que contém a fila de dados que estão esperando para serem enviados ao
50
+ * servidor *(EventSourcing)*.
51
+ *
52
+ * @returns {Promise<void>} Promessa que é resolvida quando a chave referente a fila de *EventSourcing* for destruída.
53
+ */
54
+ destroyEventSourcingQueue() {
55
+ return this.poStorage.remove(PoEventSourcingService.event_sourcing_name);
56
+ }
57
+ async httpCommand(httpOperationData, customRequestId) {
58
+ httpOperationData = await this.serializeBody(httpOperationData);
59
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Http, httpOperationData, undefined, customRequestId);
60
+ await this.insertEventSourcingQueue(eventSourcingItem);
61
+ return eventSourcingItem.id;
62
+ }
63
+ responsesSubject() {
64
+ return this.responseSubject.asObservable();
65
+ }
66
+ onSaveData() {
67
+ if (!this.eventSub) {
68
+ this.eventSub = Observable.create(subscriber => (this.emitter = subscriber));
69
+ }
70
+ return this.eventSub;
71
+ }
72
+ remove(schemaName, itemToDelete, customRequestId) {
73
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Delete, itemToDelete, schemaName, customRequestId);
74
+ return this.insertEventSourcingQueue(eventSourcingItem);
75
+ }
76
+ removeEventSourcingItem(idEventSourcingItem) {
77
+ return this.poStorage.removeItemFromArray(PoEventSourcingService.event_sourcing_name, 'id', idEventSourcingItem);
78
+ }
79
+ syncGet() {
80
+ const syncGetFunction = async () => this.poSchemaDefinition.getAll().then(schemas => {
81
+ const schemaPromises = this.updateStorageSchemas(schemas);
82
+ return Promise.all(schemaPromises);
83
+ });
84
+ return this.poSchemaService.limitedCallWrap(syncGetFunction);
85
+ }
86
+ async syncSend() {
87
+ const syncSendFunction = async () => {
88
+ const itemOfQueue = await this.poStorage.getFirstItem(PoEventSourcingService.event_sourcing_name);
89
+ if (itemOfQueue) {
90
+ await this.selectOperation(itemOfQueue);
91
+ }
92
+ if (this.stoppedQueueEventSourcing || !itemOfQueue) {
93
+ this.stoppedQueueEventSourcing = false;
94
+ return Promise.resolve();
95
+ }
96
+ return syncSendFunction();
97
+ };
98
+ return this.poSchemaService.limitedCallWrap(syncSendFunction);
99
+ }
100
+ update(schemaName, itemUpdated, customRequestId) {
101
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Update, itemUpdated, schemaName, customRequestId);
102
+ return this.insertEventSourcingQueue(eventSourcingItem);
103
+ }
104
+ /* Avalia se o body é do tipo File e se for converte para base64 */
105
+ async serializeBody(requestData) {
106
+ let { body, mimeType, bodyType, fileName } = requestData;
107
+ if (body instanceof File) {
108
+ bodyType = 'File';
109
+ mimeType = body.type;
110
+ fileName = body.name;
111
+ body = await toBase64(body);
112
+ }
113
+ return { ...requestData, body, mimeType, bodyType, fileName };
114
+ }
115
+ buildUrlParams(schema, baseUrl, pageNumber) {
116
+ const params = [];
117
+ params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
118
+ params.push(`${this.config.dataTransform.getPageParamName()}=${pageNumber}`);
119
+ return `${baseUrl}?${params.join('&')}`;
120
+ }
121
+ checkRecordIdExists(recordId, operation) {
122
+ if (!recordId) {
123
+ const error = {
124
+ message: 'Identifier not defined',
125
+ operation: operation
126
+ };
127
+ throw new PoEventSourcingErrorResponse(error);
128
+ }
129
+ }
130
+ concatPageItems(pageAcumulator, requestBody) {
131
+ if (requestBody[this.config.dataTransform.getItemsFieldName()]) {
132
+ pageAcumulator.data = [...pageAcumulator.data, ...requestBody[this.config.dataTransform.getItemsFieldName()]];
133
+ }
134
+ return pageAcumulator;
135
+ }
136
+ createEventSourcingItem(operation, newItem, schemaName, customRequestId, id) {
137
+ if (!schemaName && operation !== PoEventSourcingOperation.Http) {
138
+ throw new Error('PoSyncSchema is not defined.');
139
+ }
140
+ return {
141
+ id: id ? id : new Date().getTime(),
142
+ dateTime: new Date().getTime(),
143
+ schema: schemaName,
144
+ operation: operation,
145
+ record: newItem,
146
+ customRequestId: customRequestId
147
+ };
148
+ }
149
+ createEventSourcingList(schemaName, eventList) {
150
+ return eventList.map((eventItem, index) => {
151
+ const id = new Date().getTime() + index;
152
+ return this.createEventSourcingItem(eventItem.operation, eventItem.record, schemaName, eventItem.customRequestId, id);
153
+ });
154
+ }
155
+ createSchemaSyncConfig(schemaName) {
156
+ this.schemasSyncConfig[schemaName] = {
157
+ page: undefined,
158
+ currentUrlDiff: undefined,
159
+ responseDate: undefined
160
+ };
161
+ }
162
+ async deleteOperation(eventSourcingItem) {
163
+ try {
164
+ const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
165
+ const recordId = eventSourcingItem.record[schema.idField];
166
+ this.checkRecordIdExists(recordId, PoEventSourcingOperation.Delete);
167
+ const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.DELETE);
168
+ const response = await this.sendServerItem(url, PoHttpRequestType.DELETE);
169
+ await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
170
+ return await this.sendResponseSubject(eventSourcingItem, response);
171
+ }
172
+ catch (errorResponse) {
173
+ return this.sendResponseSubject(eventSourcingItem, errorResponse, true);
174
+ }
175
+ }
176
+ diffServerItems(currentUrlDiff) {
177
+ return this.poHttpClient.get(currentUrlDiff);
178
+ }
179
+ getBodyAndDate(schemaName, response) {
180
+ const getDateFieldName = this.config.dataTransform.getDateFieldName();
181
+ const responseSyncDate = response.body[getDateFieldName];
182
+ this.schemasSyncConfig[schemaName]['responseDate'] = responseSyncDate;
183
+ return response.body;
184
+ }
185
+ async getServerDiffRecords(schema, baseUrl) {
186
+ const initialAcumulatorPage = { entity: schema.name, data: [] };
187
+ const diffUrl = this.schemasSyncConfig[schema.name]['currentUrlDiff'];
188
+ const serverResponse = await this.diffServerItems(diffUrl)
189
+ .pipe(map(response => this.getBodyAndDate(schema.name, response)), expand(data => this.paginateSchemaData(data, schema, baseUrl)), reduce((pageAcumulator, requestBody) => this.concatPageItems(pageAcumulator, requestBody), initialAcumulatorPage))
190
+ .toPromise();
191
+ return serverResponse.data;
192
+ }
193
+ async httpOperation(eventSourcingItem) {
194
+ try {
195
+ const requestData = await this.createPoHttpRequestData(eventSourcingItem.record.url, eventSourcingItem.record.method, eventSourcingItem.record, eventSourcingItem.record.headers);
196
+ const response = await this.poHttpClient.createRequest(requestData).toPromise();
197
+ const poHttpCommandResponse = {
198
+ id: eventSourcingItem.id,
199
+ customRequestId: eventSourcingItem.customRequestId,
200
+ request: eventSourcingItem.record,
201
+ response: response
202
+ };
203
+ this.responseSubject.next(poHttpCommandResponse);
204
+ return this.removeEventSourcingValidItem(response.status, eventSourcingItem);
205
+ }
206
+ catch (errorHttpClient) {
207
+ return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
208
+ }
209
+ }
210
+ async insertEventSourcingQueue(eventSourcingItem) {
211
+ const eventSourcingUpdatedQueue = await this.poStorage.appendItemToArray(PoEventSourcingService.event_sourcing_name, eventSourcingItem);
212
+ this.notifyEventCreation();
213
+ return Promise.resolve(eventSourcingUpdatedQueue);
214
+ }
215
+ async insertOperation(currentEventSourcingItem) {
216
+ const schema = await this.poSchemaDefinition.get(currentEventSourcingItem.schema);
217
+ const url = PoEventSourcingService.getUrl(currentEventSourcingItem, schema, PoRequestType.POST);
218
+ try {
219
+ const response = await this.sendServerItem(url, PoHttpRequestType.POST, currentEventSourcingItem.record);
220
+ const recordUpdatedByServer = response.body;
221
+ await this.removeEventSourcingValidItem(response.status, currentEventSourcingItem);
222
+ const id = currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
223
+ await this.poSchemaService.update(schema, recordUpdatedByServer, id);
224
+ const eventSourcingItems = await this.poStorage.get(PoEventSourcingService.event_sourcing_name);
225
+ await this.updatePendingEventSourcing(currentEventSourcingItem, schema.idField, recordUpdatedByServer, eventSourcingItems);
226
+ return this.sendResponseSubject(currentEventSourcingItem, response);
227
+ }
228
+ catch (errorHttpClient) {
229
+ return this.sendResponseSubject(currentEventSourcingItem, errorHttpClient, true);
230
+ }
231
+ }
232
+ isValidStatus(status) {
233
+ return PoEventSourcingService.VALID_HTTP_STATUS_CODES.includes(status);
234
+ }
235
+ notifyEventCreation() {
236
+ if (this.emitter) {
237
+ this.emitter.next();
238
+ }
239
+ }
240
+ paginateSchemaData(data, schema, baseUrl) {
241
+ this.config.dataTransform.transform(data);
242
+ if (this.config.dataTransform.hasNext()) {
243
+ this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, ++this.schemasSyncConfig[schema.name]['page']);
244
+ return this.diffServerItems(this.schemasSyncConfig[schema.name]['currentUrlDiff']).pipe(map(response => this.getBodyAndDate(schema.name, response)));
245
+ }
246
+ return of();
247
+ }
248
+ removeEventSourcingValidItem(status, eventSourcingItem) {
249
+ if (this.isValidStatus(status) || eventSourcingItem.operation === PoEventSourcingOperation.Http) {
250
+ return this.removeEventSourcingItem(eventSourcingItem.id);
251
+ }
252
+ }
253
+ selectOperation(eventSourcingItem) {
254
+ switch (eventSourcingItem.operation) {
255
+ case PoEventSourcingOperation.Insert:
256
+ return this.insertOperation(eventSourcingItem);
257
+ case PoEventSourcingOperation.Update:
258
+ return this.updateOperation(eventSourcingItem);
259
+ case PoEventSourcingOperation.Delete:
260
+ return this.deleteOperation(eventSourcingItem);
261
+ case PoEventSourcingOperation.Http:
262
+ return this.httpOperation(eventSourcingItem);
263
+ }
264
+ }
265
+ sendResponseSubject(eventSourcingItem, response, isSubjectError = false) {
266
+ const poSyncResponse = {
267
+ id: eventSourcingItem.id,
268
+ customRequestId: eventSourcingItem.customRequestId,
269
+ request: eventSourcingItem.record,
270
+ response: response
271
+ };
272
+ this.stoppedQueueEventSourcing = isSubjectError;
273
+ this.responseSubject.next(poSyncResponse);
274
+ return Promise.resolve();
275
+ }
276
+ async sendServerItem(url, method, body) {
277
+ const requestData = await this.createPoHttpRequestData(url, method, body);
278
+ return this.poHttpClient.createRequest(requestData).toPromise();
279
+ }
280
+ async createPoHttpRequestData(url, method, record, headers) {
281
+ let body = record.body ?? record;
282
+ if (record.bodyType === 'File') {
283
+ body = await this.createFormData(body, record.fileName, record.mimeType, record.formField);
284
+ }
285
+ return { url, method, body, headers };
286
+ }
287
+ async createFormData(body, fileName, mimeType, formField = 'file') {
288
+ const file = await toFile(body, fileName, mimeType);
289
+ const formData = new FormData();
290
+ formData.append(formField, file, fileName);
291
+ return formData;
292
+ }
293
+ async updateOperation(eventSourcingItem) {
294
+ const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
295
+ const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.PATCH);
296
+ try {
297
+ const recordId = eventSourcingItem.record[schema.idField];
298
+ this.checkRecordIdExists(recordId, PoEventSourcingOperation.Update);
299
+ const response = await this.sendServerItem(url, PoHttpRequestType.PUT, eventSourcingItem.record);
300
+ await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
301
+ return await this.sendResponseSubject(eventSourcingItem, response);
302
+ }
303
+ catch (errorHttpClient) {
304
+ return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
305
+ }
306
+ }
307
+ updatePendingEventSourcing(currentEventSourcingItem, idFieldSchema, inserted, eventSourcingItems) {
308
+ if (currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName]) {
309
+ eventSourcingItems.forEach((eventSourcingItem, position) => {
310
+ const isCurrentEventSourcingItem = !eventSourcingItem.record[idFieldSchema] &&
311
+ eventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName] ===
312
+ currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
313
+ if (isCurrentEventSourcingItem) {
314
+ eventSourcingItems[position].record[idFieldSchema] = inserted[idFieldSchema];
315
+ }
316
+ });
317
+ return this.poStorage.set(PoEventSourcingService.event_sourcing_name, eventSourcingItems);
318
+ }
319
+ else {
320
+ return Promise.resolve();
321
+ }
322
+ }
323
+ async updateRecords(serverRecords, schema) {
324
+ for (const serverRecord of serverRecords) {
325
+ await this.updateRecordByServerRecord(serverRecord, schema);
326
+ }
327
+ }
328
+ async updateRecordByServerRecord(serverRecord, schema) {
329
+ const recordId = serverRecord[schema.idField];
330
+ const storageRecord = await this.poSchemaService.get(schema.name, recordId);
331
+ const existsStorageRecord = !!Object.keys(storageRecord).length;
332
+ if (existsStorageRecord && serverRecord[schema.deletedField]) {
333
+ return await this.poSchemaService.remove(schema.name, serverRecord[schema.idField]);
334
+ }
335
+ if (existsStorageRecord && !serverRecord[schema.deletedField]) {
336
+ return await this.poSchemaService.update(schema, serverRecord);
337
+ }
338
+ if (!existsStorageRecord && !serverRecord[schema.deletedField]) {
339
+ return await this.poSchemaService.create(schema, serverRecord);
340
+ }
341
+ }
342
+ async updateStorageBySchema(schema) {
343
+ this.createSchemaSyncConfig(schema.name);
344
+ this.schemasSyncConfig[schema.name]['page'] = 1;
345
+ const baseUrl = `${PoSchemaUtil.getUrl(schema, PoRequestType.DIFF)}/${schema.lastSync}`;
346
+ this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, this.schemasSyncConfig[schema.name]['page']);
347
+ const serverRecords = await this.getServerDiffRecords(schema, baseUrl);
348
+ await this.updateRecords(serverRecords, schema);
349
+ schema.lastSync = this.schemasSyncConfig[schema.name]['responseDate'];
350
+ await this.poSchemaDefinition.update(schema);
351
+ }
352
+ updateStorageSchemas(schemas) {
353
+ return schemas.map((schema) => this.updateStorageBySchema(schema));
354
+ }
355
+ }
356
+ PoEventSourcingService.event_sourcing_name = 'EventSourcing';
357
+ PoEventSourcingService.VALID_HTTP_STATUS_CODES = [
358
+ HttpStatus.OK,
359
+ HttpStatus.CREATED,
360
+ HttpStatus.ACCEPTED,
361
+ HttpStatus.NON_AUTHORITATIVE_INFORMATION,
362
+ HttpStatus.NO_CONTENT,
363
+ HttpStatus.RESET_CONTENT,
364
+ HttpStatus.PARTIAL_CONTENT,
365
+ HttpStatus.MULTI_STATUS // 207
366
+ ];
367
+ PoEventSourcingService.ɵfac = function PoEventSourcingService_Factory(t) { return new (t || PoEventSourcingService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoSchemaService), i0.ɵɵinject(i3.PoStorageService), i0.ɵɵinject(i4.PoHttpClientService)); };
368
+ PoEventSourcingService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoEventSourcingService, factory: PoEventSourcingService.ɵfac });
369
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoEventSourcingService, [{
370
+ type: Injectable
371
+ }], function () { return [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoSchemaService }, { type: i3.PoStorageService }, { type: i4.PoHttpClientService }]; }, null); })();
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUVuRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUtwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7QUFNbEYsTUFBTSxPQUFPLHNCQUFzQjtJQXVCakMsWUFDVSxrQkFBNkMsRUFDN0MsZUFBZ0MsRUFDaEMsU0FBMkIsRUFDM0IsWUFBaUM7UUFIakMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBWjNDLDhCQUF5QixHQUFZLEtBQUssQ0FB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QyxDQUFDLENBQUM7SUFDbkYsQ0FBQzs7QUE5aEJlLDBDQUFtQixHQUFXLGVBQWdCLENBQUE7QUFFdEMsOENBQXVCLEdBQUc7SUFDaEQsVUFBVSxDQUFDLEVBQUU7SUFDYixVQUFVLENBQUMsT0FBTztJQUNsQixVQUFVLENBQUMsUUFBUTtJQUNuQixVQUFVLENBQUMsNkJBQTZCO0lBQ3hDLFVBQVUsQ0FBQyxVQUFVO0lBQ3JCLFVBQVUsQ0FBQyxhQUFhO0lBQ3hCLFVBQVUsQ0FBQyxlQUFlO0lBQzFCLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTTtDQUM5QixDQUFBOzRGQVpTLHNCQUFzQjs0RUFBdEIsc0JBQXNCLFdBQXRCLHNCQUFzQjt1RkFBdEIsc0JBQXNCO2NBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwUmVzcG9uc2UsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgKiBhcyBIdHRwU3RhdHVzIGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZXhwYW5kLCBtYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFBvU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAcG8tdWkvbmctc3RvcmFnZSc7XHJcblxyXG5pbXBvcnQgeyB0b0Jhc2U2NCwgdG9GaWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVscy9wby1ldmVudC1zb3VyY2luZy1lcnJvci1yZXNwb25zZS5tb2RlbCc7XHJcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ0l0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tZXZlbnQtc291cmNpbmctaXRlbS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24gfSBmcm9tICcuL2VudW1zL3BvLWV2ZW50LXNvdXJjaW5nLW9wZXJhdGlvbi5lbnVtJztcclxuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nU3VtbWFyeUl0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tZXZlbnQtc291cmNpbmctc3VtbWFyeS1pdGVtLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvSHR0cEhlYWRlck9wdGlvbiB9IGZyb20gJy4vLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLWhlYWRlci1vcHRpb24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9IdHRwQ2xpZW50U2VydmljZSB9IGZyb20gJy4vLi4vcG8taHR0cC1jbGllbnQvcG8taHR0cC1jbGllbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3REYXRhIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLXJlcXVlc3QtZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0VHlwZSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtcmVxdWVzdC10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBQb1JlcXVlc3RUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvLXJlcXVlc3QtdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS1kZWZpbml0aW9uL3BvLXNjaGVtYS1kZWZpbml0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb1NjaGVtYVNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvU2NoZW1hVXRpbCB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS11dGlsL3BvLXNjaGVtYS11dGlsLm1vZGVsJztcclxuaW1wb3J0IHsgUG9TeW5jQ29uZmlnIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtY29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvU3luY1Jlc3BvbnNlIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi8uLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBldmVudF9zb3VyY2luZ19uYW1lOiBzdHJpbmcgPSAnRXZlbnRTb3VyY2luZyc7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFZBTElEX0hUVFBfU1RBVFVTX0NPREVTID0gW1xyXG4gICAgSHR0cFN0YXR1cy5PSywgLy8gMjAwXHJcbiAgICBIdHRwU3RhdHVzLkNSRUFURUQsIC8vIDIwMVxyXG4gICAgSHR0cFN0YXR1cy5BQ0NFUFRFRCwgLy8gMjAyXHJcbiAgICBIdHRwU3RhdHVzLk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OLCAvLyAyMDNcclxuICAgIEh0dHBTdGF0dXMuTk9fQ09OVEVOVCwgLy8gMjA0XHJcbiAgICBIdHRwU3RhdHVzLlJFU0VUX0NPTlRFTlQsIC8vIDIwNVxyXG4gICAgSHR0cFN0YXR1cy5QQVJUSUFMX0NPTlRFTlQsIC8vIDIwNlxyXG4gICAgSHR0cFN0YXR1cy5NVUxUSV9TVEFUVVMgLy8gMjA3XHJcbiAgXTtcclxuXHJcbiAgY29uZmlnOiBQb1N5bmNDb25maWc7XHJcbiAgc3RvcHBlZFF1ZXVlRXZlbnRTb3VyY2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVtaXR0ZXI6IGFueTtcclxuICBwcml2YXRlIGV2ZW50U3ViOiBPYnNlcnZhYmxlPG51bGw+O1xyXG4gIHByaXZhdGUgcmVzcG9uc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8UG9TeW5jUmVzcG9uc2U+KCk7XHJcblxyXG4gIHByaXZhdGUgc2NoZW1hc1N5bmNDb25maWcgPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHBvU2NoZW1hRGVmaW5pdGlvbjogUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9TY2hlbWFTZXJ2aWNlOiBQb1NjaGVtYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvU3RvcmFnZTogUG9TdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9IdHRwQ2xpZW50OiBQb0h0dHBDbGllbnRTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRVcmwoZXZlbnRTb3VyY2luZ0l0ZW0sIHNjaGVtYSwgcmVxdWVzdFR5cGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2NoZW1hVXJsID0gUG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIHJlcXVlc3RUeXBlKTtcclxuICAgIGNvbnN0IHNjaGVtYUlkID0gZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW3NjaGVtYS5pZEZpZWxkXTtcclxuXHJcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFBvUmVxdWVzdFR5cGUuR0VUKSB7XHJcbiAgICAgIHJldHVybiBzY2hlbWFVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFtQb1JlcXVlc3RUeXBlLkRFTEVURSwgUG9SZXF1ZXN0VHlwZS5QQVRDSF0uaW5jbHVkZXMocmVxdWVzdFR5cGUpKSB7XHJcbiAgICAgIHJldHVybiBzY2hlbWFVcmwgPyBgJHtzY2hlbWFVcmx9LyR7c2NoZW1hSWR9YCA6IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCl9LyR7c2NoZW1hSWR9YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFBvUmVxdWVzdFR5cGUuUE9TVCkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hVXJsID8gc2NoZW1hVXJsIDogUG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuR0VUKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZShzY2hlbWFOYW1lOiBzdHJpbmcsIG5ld0l0ZW06IGFueSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGV2ZW50U291cmNpbmdJdGVtID0gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkluc2VydCxcclxuICAgICAgbmV3SXRlbSxcclxuICAgICAgc2NoZW1hTmFtZSxcclxuICAgICAgY3VzdG9tUmVxdWVzdElkXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZUJhdGNoRXZlbnRzKHNjaGVtYU5hbWU6IHN0cmluZywgZXZlbnRMaXN0OiBBcnJheTxQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbT4pIHtcclxuICAgIGNvbnN0IGV2ZW50U291cmNpbmdMaXN0ID0gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nTGlzdChzY2hlbWFOYW1lLCBldmVudExpc3QpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMucG9TdG9yYWdlLmFwcGVuZEFycmF5VG9BcnJheShQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsIGV2ZW50U291cmNpbmdMaXN0KTtcclxuXHJcbiAgICB0aGlzLm5vdGlmeUV2ZW50Q3JlYXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc3Ryw7NpIGEgY2hhdmUgZG8gKnN0b3JhZ2UqIHF1ZSBjb250w6ltIGEgZmlsYSBkZSBkYWRvcyBxdWUgZXN0w6NvIGVzcGVyYW5kbyBwYXJhIHNlcmVtIGVudmlhZG9zIGFvXHJcbiAgICogc2Vydmlkb3IgKihFdmVudFNvdXJjaW5nKSouXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gYSBjaGF2ZSByZWZlcmVudGUgYSBmaWxhIGRlICpFdmVudFNvdXJjaW5nKiBmb3IgZGVzdHJ1w61kYS5cclxuICAgKi9cclxuICBkZXN0cm95RXZlbnRTb3VyY2luZ1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucG9TdG9yYWdlLnJlbW92ZShQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaHR0cENvbW1hbmQoaHR0cE9wZXJhdGlvbkRhdGE6IFBvSHR0cFJlcXVlc3REYXRhLCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgaHR0cE9wZXJhdGlvbkRhdGEgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUJvZHkoaHR0cE9wZXJhdGlvbkRhdGEpO1xyXG5cclxuICAgIGNvbnN0IGV2ZW50U291cmNpbmdJdGVtID0gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkh0dHAsXHJcbiAgICAgIGh0dHBPcGVyYXRpb25EYXRhLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgICByZXR1cm4gZXZlbnRTb3VyY2luZ0l0ZW0uaWQ7XHJcbiAgfVxyXG5cclxuICByZXNwb25zZXNTdWJqZWN0KCk6IE9ic2VydmFibGU8UG9TeW5jUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIG9uU2F2ZURhdGEoKTogT2JzZXJ2YWJsZTxudWxsPiB7XHJcbiAgICBpZiAoIXRoaXMuZXZlbnRTdWIpIHtcclxuICAgICAgdGhpcy5ldmVudFN1YiA9IE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4gKHRoaXMuZW1pdHRlciA9IHN1YnNjcmliZXIpKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmV2ZW50U3ViO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKHNjaGVtYU5hbWU6IHN0cmluZywgaXRlbVRvRGVsZXRlOiBhbnksIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICAgIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5EZWxldGUsXHJcbiAgICAgIGl0ZW1Ub0RlbGV0ZSxcclxuICAgICAgc2NoZW1hTmFtZSxcclxuICAgICAgY3VzdG9tUmVxdWVzdElkXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUV2ZW50U291cmNpbmdJdGVtKGlkRXZlbnRTb3VyY2luZ0l0ZW0pIHtcclxuICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5yZW1vdmVJdGVtRnJvbUFycmF5KFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSwgJ2lkJywgaWRFdmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICBzeW5jR2V0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzeW5jR2V0RnVuY3Rpb24gPSBhc3luYyAoKSA9PlxyXG4gICAgICB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXRBbGwoKS50aGVuKHNjaGVtYXMgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYVByb21pc2VzID0gdGhpcy51cGRhdGVTdG9yYWdlU2NoZW1hcyhzY2hlbWFzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHNjaGVtYVByb21pc2VzKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChzeW5jR2V0RnVuY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc3luY1NlbmQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHN5bmNTZW5kRnVuY3Rpb24gPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICAgICAgY29uc3QgaXRlbU9mUXVldWUgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5nZXRGaXJzdEl0ZW0oUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lKTtcclxuXHJcbiAgICAgIGlmIChpdGVtT2ZRdWV1ZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0T3BlcmF0aW9uKGl0ZW1PZlF1ZXVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc3RvcHBlZFF1ZXVlRXZlbnRTb3VyY2luZyB8fCAhaXRlbU9mUXVldWUpIHtcclxuICAgICAgICB0aGlzLnN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzeW5jU2VuZEZ1bmN0aW9uKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAoc3luY1NlbmRGdW5jdGlvbik7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoc2NoZW1hTmFtZTogc3RyaW5nLCBpdGVtVXBkYXRlZDogYW55LCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxyXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlLFxyXG4gICAgICBpdGVtVXBkYXRlZCxcclxuICAgICAgc2NoZW1hTmFtZSxcclxuICAgICAgY3VzdG9tUmVxdWVzdElkXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTtcclxuICB9XHJcblxyXG4gIC8qIEF2YWxpYSBzZSBvIGJvZHkgw6kgZG8gdGlwbyBGaWxlIGUgc2UgZm9yIGNvbnZlcnRlIHBhcmEgYmFzZTY0ICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXJpYWxpemVCb2R5KHJlcXVlc3REYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSk6IFByb21pc2U8UG9IdHRwUmVxdWVzdERhdGE+IHtcclxuICAgIGxldCB7IGJvZHksIG1pbWVUeXBlLCBib2R5VHlwZSwgZmlsZU5hbWUgfSA9IHJlcXVlc3REYXRhO1xyXG5cclxuICAgIGlmIChib2R5IGluc3RhbmNlb2YgRmlsZSkge1xyXG4gICAgICBib2R5VHlwZSA9ICdGaWxlJztcclxuICAgICAgbWltZVR5cGUgPSBib2R5LnR5cGU7XHJcbiAgICAgIGZpbGVOYW1lID0gYm9keS5uYW1lO1xyXG4gICAgICBib2R5ID0gYXdhaXQgdG9CYXNlNjQoYm9keSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgLi4ucmVxdWVzdERhdGEsIGJvZHksIG1pbWVUeXBlLCBib2R5VHlwZSwgZmlsZU5hbWUgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRVcmxQYXJhbXMoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIGJhc2VVcmw6IHN0cmluZywgcGFnZU51bWJlcjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xyXG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlU2l6ZVBhcmFtTmFtZSgpfT0ke3NjaGVtYS5wYWdlU2l6ZX1gKTtcclxuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVBhcmFtTmFtZSgpfT0ke3BhZ2VOdW1iZXJ9YCk7XHJcbiAgICByZXR1cm4gYCR7YmFzZVVybH0/JHtwYXJhbXMuam9pbignJicpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrUmVjb3JkSWRFeGlzdHMocmVjb3JkSWQsIG9wZXJhdGlvbikge1xyXG4gICAgaWYgKCFyZWNvcmRJZCkge1xyXG4gICAgICBjb25zdCBlcnJvciA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnSWRlbnRpZmllciBub3QgZGVmaW5lZCcsXHJcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRocm93IG5ldyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uY2F0UGFnZUl0ZW1zKHBhZ2VBY3VtdWxhdG9yLCByZXF1ZXN0Qm9keSk6IHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfSB7XHJcbiAgICBpZiAocmVxdWVzdEJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXSkge1xyXG4gICAgICBwYWdlQWN1bXVsYXRvci5kYXRhID0gWy4uLnBhZ2VBY3VtdWxhdG9yLmRhdGEsIC4uLnJlcXVlc3RCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV1dO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhZ2VBY3VtdWxhdG9yO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgIG9wZXJhdGlvbjogUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLFxyXG4gICAgbmV3SXRlbTogYW55IHwgUG9IdHRwUmVxdWVzdERhdGEsXHJcbiAgICBzY2hlbWFOYW1lPzogc3RyaW5nLFxyXG4gICAgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nLFxyXG4gICAgaWQ/OiBudW1iZXJcclxuICApOiBQb0V2ZW50U291cmNpbmdJdGVtIHtcclxuICAgIGlmICghc2NoZW1hTmFtZSAmJiBvcGVyYXRpb24gIT09IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUG9TeW5jU2NoZW1hIGlzIG5vdCBkZWZpbmVkLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiBpZCA/IGlkIDogbmV3IERhdGUoKS5nZXRUaW1lKCksXHJcbiAgICAgIGRhdGVUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcclxuICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxyXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcclxuICAgICAgcmVjb3JkOiBuZXdJdGVtLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWQ6IGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRTb3VyY2luZ0xpc3QoXHJcbiAgICBzY2hlbWFOYW1lOiBzdHJpbmcsXHJcbiAgICBldmVudExpc3Q6IEFycmF5PFBvRXZlbnRTb3VyY2luZ1N1bW1hcnlJdGVtPlxyXG4gICk6IEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+IHtcclxuICAgIHJldHVybiBldmVudExpc3QubWFwKChldmVudEl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGlkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBpbmRleDtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxyXG4gICAgICAgIGV2ZW50SXRlbS5vcGVyYXRpb24sXHJcbiAgICAgICAgZXZlbnRJdGVtLnJlY29yZCxcclxuICAgICAgICBzY2hlbWFOYW1lLFxyXG4gICAgICAgIGV2ZW50SXRlbS5jdXN0b21SZXF1ZXN0SWQsXHJcbiAgICAgICAgaWRcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTY2hlbWFTeW5jQ29uZmlnKHNjaGVtYU5hbWUpIHtcclxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hTmFtZV0gPSB7XHJcbiAgICAgIHBhZ2U6IHVuZGVmaW5lZCxcclxuICAgICAgY3VycmVudFVybERpZmY6IHVuZGVmaW5lZCxcclxuICAgICAgcmVzcG9uc2VEYXRlOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXQoZXZlbnRTb3VyY2luZ0l0ZW0uc2NoZW1hKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlY29yZElkID0gZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW3NjaGVtYS5pZEZpZWxkXTtcclxuICAgICAgdGhpcy5jaGVja1JlY29yZElkRXhpc3RzKHJlY29yZElkLCBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlKTtcclxuXHJcbiAgICAgIGNvbnN0IHVybCA9IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZ2V0VXJsKGV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIFBvUmVxdWVzdFR5cGUuREVMRVRFKTtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2ZXJJdGVtKHVybCwgUG9IdHRwUmVxdWVzdFR5cGUuREVMRVRFKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ1ZhbGlkSXRlbShyZXNwb25zZS5zdGF0dXMsIGV2ZW50U291cmNpbmdJdGVtKTtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChldmVudFNvdXJjaW5nSXRlbSwgZXJyb3JSZXNwb25zZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpZmZTZXJ2ZXJJdGVtcyhjdXJyZW50VXJsRGlmZik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPE9iamVjdD4+IHtcclxuICAgIHJldHVybiB0aGlzLnBvSHR0cENsaWVudC5nZXQoY3VycmVudFVybERpZmYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCb2R5QW5kRGF0ZShzY2hlbWFOYW1lLCByZXNwb25zZSk6IGFueSB7XHJcbiAgICBjb25zdCBnZXREYXRlRmllbGROYW1lID0gdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXREYXRlRmllbGROYW1lKCk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VTeW5jRGF0ZSA9IHJlc3BvbnNlLmJvZHlbZ2V0RGF0ZUZpZWxkTmFtZV07XHJcblxyXG4gICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWFOYW1lXVsncmVzcG9uc2VEYXRlJ10gPSByZXNwb25zZVN5bmNEYXRlO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFNlcnZlckRpZmZSZWNvcmRzKHNjaGVtYTogUG9TeW5jU2NoZW1hLCBiYXNlVXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgaW5pdGlhbEFjdW11bGF0b3JQYWdlID0geyBlbnRpdHk6IHNjaGVtYS5uYW1lLCBkYXRhOiBbXSB9O1xyXG4gICAgY29uc3QgZGlmZlVybCA9IHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddO1xyXG5cclxuICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5kaWZmU2VydmVySXRlbXMoZGlmZlVybClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuZ2V0Qm9keUFuZERhdGUoc2NoZW1hLm5hbWUsIHJlc3BvbnNlKSksXHJcbiAgICAgICAgZXhwYW5kKGRhdGEgPT4gdGhpcy5wYWdpbmF0ZVNjaGVtYURhdGEoZGF0YSwgc2NoZW1hLCBiYXNlVXJsKSksXHJcbiAgICAgICAgcmVkdWNlKFxyXG4gICAgICAgICAgKHBhZ2VBY3VtdWxhdG9yLCByZXF1ZXN0Qm9keSkgPT4gdGhpcy5jb25jYXRQYWdlSXRlbXMocGFnZUFjdW11bGF0b3IsIHJlcXVlc3RCb2R5KSxcclxuICAgICAgICAgIGluaXRpYWxBY3VtdWxhdG9yUGFnZVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHNlcnZlclJlc3BvbnNlLmRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGh0dHBPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+IHwgbnVtYmVyPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEgPSBhd2FpdCB0aGlzLmNyZWF0ZVBvSHR0cFJlcXVlc3REYXRhKFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZC51cmwsXHJcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLm1ldGhvZCxcclxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQsXHJcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLmhlYWRlcnNcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnBvSHR0cENsaWVudC5jcmVhdGVSZXF1ZXN0KHJlcXVlc3REYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgY29uc3QgcG9IdHRwQ29tbWFuZFJlc3BvbnNlOiBQb1N5bmNSZXNwb25zZSA9IHtcclxuICAgICAgICBpZDogZXZlbnRTb3VyY2luZ0l0ZW0uaWQsXHJcbiAgICAgICAgY3VzdG9tUmVxdWVzdElkOiBldmVudFNvdXJjaW5nSXRlbS5jdXN0b21SZXF1ZXN0SWQsXHJcbiAgICAgICAgcmVxdWVzdDogZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxyXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5yZXNwb25zZVN1YmplY3QubmV4dChwb0h0dHBDb21tYW5kUmVzcG9uc2UpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ1ZhbGlkSXRlbShyZXNwb25zZS5zdGF0dXMsIGV2ZW50U291cmNpbmdJdGVtKTtcclxuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCBlcnJvckh0dHBDbGllbnQsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbnNlcnRFdmVudFNvdXJjaW5nUXVldWUoZXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+PiB7XHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nVXBkYXRlZFF1ZXVlID0gYXdhaXQgdGhpcy5wb1N0b3JhZ2UuYXBwZW5kSXRlbVRvQXJyYXkoXHJcbiAgICAgIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSxcclxuICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5ub3RpZnlFdmVudENyZWF0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShldmVudFNvdXJjaW5nVXBkYXRlZFF1ZXVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0T3BlcmF0aW9uKGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXQoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnNjaGVtYSk7XHJcbiAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sIHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5QT1NUKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFNlcnZlckl0ZW0odXJsLCBQb0h0dHBSZXF1ZXN0VHlwZS5QT1NULCBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkKTtcclxuICAgICAgY29uc3QgcmVjb3JkVXBkYXRlZEJ5U2VydmVyID0gcmVzcG9uc2UuYm9keTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ1ZhbGlkSXRlbShyZXNwb25zZS5zdGF0dXMsIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSk7XHJcblxyXG4gICAgICBjb25zdCBpZCA9IGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbUG9TY2hlbWFVdGlsLnN5bmNJbnRlcm5hbElkRmllbGROYW1lXTtcclxuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UudXBkYXRlKHNjaGVtYSwgcmVjb3JkVXBkYXRlZEJ5U2VydmVyLCBpZCk7XHJcblxyXG4gICAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbXM6IEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+ID0gYXdhaXQgdGhpcy5wb1N0b3JhZ2UuZ2V0KFxyXG4gICAgICAgIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVBlbmRpbmdFdmVudFNvdXJjaW5nKFxyXG4gICAgICAgIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSxcclxuICAgICAgICBzY2hlbWEuaWRGaWVsZCxcclxuICAgICAgICByZWNvcmRVcGRhdGVkQnlTZXJ2ZXIsXHJcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSwgcmVzcG9uc2UpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3JIdHRwQ2xpZW50KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLCBlcnJvckh0dHBDbGllbnQsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbGlkU3RhdHVzKHN0YXR1czogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gUG9FdmVudFNvdXJjaW5nU2VydmljZS5WQUxJRF9IVFRQX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhzdGF0dXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3RpZnlFdmVudENyZWF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZW1pdHRlcikge1xyXG4gICAgICB0aGlzLmVtaXR0ZXIubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWdpbmF0ZVNjaGVtYURhdGEoZGF0YSwgc2NoZW1hLCBiYXNlVXJsKTogT2JzZXJ2YWJsZTxudWxsPiB7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLnRyYW5zZm9ybShkYXRhKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5oYXNOZXh0KCkpIHtcclxuICAgICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ2N1cnJlbnRVcmxEaWZmJ10gPSB0aGlzLmJ1aWxkVXJsUGFyYW1zKFxyXG4gICAgICAgIHNjaGVtYSxcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgICsrdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ3BhZ2UnXVxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuZGlmZlNlcnZlckl0ZW1zKHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddKS5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLmdldEJvZHlBbmREYXRlKHNjaGVtYS5uYW1lLCByZXNwb25zZSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0oXHJcbiAgICBzdGF0dXMsXHJcbiAgICBldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbVxyXG4gICk6IFByb21pc2U8QXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT4+IHtcclxuICAgIGlmICh0aGlzLmlzVmFsaWRTdGF0dXMoc3RhdHVzKSB8fCBldmVudFNvdXJjaW5nSXRlbS5vcGVyYXRpb24gPT09IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdJdGVtKGV2ZW50U291cmNpbmdJdGVtLmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0T3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHN3aXRjaCAoZXZlbnRTb3VyY2luZ0l0ZW0ub3BlcmF0aW9uKSB7XHJcbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkluc2VydDpcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG5cclxuICAgICAgY2FzZSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XHJcblxyXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5EZWxldGU6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtKTtcclxuXHJcbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkh0dHA6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cE9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRSZXNwb25zZVN1YmplY3QoXHJcbiAgICBldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSxcclxuICAgIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8T2JqZWN0PiB8IEh0dHBFcnJvclJlc3BvbnNlIHwgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZSxcclxuICAgIGlzU3ViamVjdEVycm9yOiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcG9TeW5jUmVzcG9uc2U6IFBvU3luY1Jlc3BvbnNlID0ge1xyXG4gICAgICBpZDogZXZlbnRTb3VyY2luZ0l0ZW0uaWQsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZDogZXZlbnRTb3VyY2luZ0l0ZW0uY3VzdG9tUmVxdWVzdElkLFxyXG4gICAgICByZXF1ZXN0OiBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQsXHJcbiAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmcgPSBpc1N1YmplY3RFcnJvcjtcclxuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0Lm5leHQocG9TeW5jUmVzcG9uc2UpO1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2VuZFNlcnZlckl0ZW0odXJsOiBzdHJpbmcsIG1ldGhvZDogUG9IdHRwUmVxdWVzdFR5cGUsIGJvZHk/OiBQb0V2ZW50U291cmNpbmdJdGVtWydyZWNvcmQnXSkge1xyXG4gICAgY29uc3QgcmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVQb0h0dHBSZXF1ZXN0RGF0YSh1cmwsIG1ldGhvZCwgYm9keSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9IdHRwQ2xpZW50LmNyZWF0ZVJlcXVlc3QocmVxdWVzdERhdGEpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQb0h0dHBSZXF1ZXN0RGF0YShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgbWV0aG9kOiBQb0h0dHBSZXF1ZXN0VHlwZSxcclxuICAgIHJlY29yZD86IFBvRXZlbnRTb3VyY2luZ0l0ZW1bJ3JlY29yZCddLFxyXG4gICAgaGVhZGVycz86IEFycmF5PFBvSHR0cEhlYWRlck9wdGlvbj5cclxuICApOiBQcm9taXNlPFBvSHR0cFJlcXVlc3REYXRhPiB7XHJcbiAgICBsZXQgYm9keSA9IHJlY29yZC5ib2R5ID8/IHJlY29yZDtcclxuXHJcbiAgICBpZiAocmVjb3JkLmJvZHlUeXBlID09PSAnRmlsZScpIHtcclxuICAgICAgYm9keSA9IGF3YWl0IHRoaXMuY3JlYXRlRm9ybURhdGEoYm9keSwgcmVjb3JkLmZpbGVOYW1lLCByZWNvcmQubWltZVR5cGUsIHJlY29yZC5mb3JtRmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHVybCwgbWV0aG9kLCBib2R5LCBoZWFkZXJzIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUZvcm1EYXRhKFxyXG4gICAgYm9keTogc3RyaW5nLFxyXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcclxuICAgIG1pbWVUeXBlOiBzdHJpbmcsXHJcbiAgICBmb3JtRmllbGQ6IHN0cmluZyA9ICdmaWxlJ1xyXG4gICk6IFByb21pc2U8Rm9ybURhdGE+IHtcclxuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0b0ZpbGUoYm9keSwgZmlsZU5hbWUsIG1pbWVUeXBlKTtcclxuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIGZvcm1EYXRhLmFwcGVuZChmb3JtRmllbGQsIGZpbGUsIGZpbGVOYW1lKTtcclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxhbnk+IHwgbnVtYmVyPiB7XHJcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXQoZXZlbnRTb3VyY2luZ0l0ZW0uc2NoZW1hKTtcclxuICAgIGNvbnN0IHVybCA9IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZ2V0VXJsKGV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIFBvUmVxdWVzdFR5cGUuUEFUQ0gpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlY29yZElkID0gZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW3NjaGVtYS5pZEZpZWxkXTtcclxuICAgICAgdGhpcy5jaGVja1JlY29yZElkRXhpc3RzKHJlY29yZElkLCBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kU2VydmVySXRlbSh1cmwsIFBvSHR0cFJlcXVlc3RUeXBlLlBVVCwgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkKTtcclxuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKHJlc3BvbnNlLnN0YXR1cywgZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG5cclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChldmVudFNvdXJjaW5nSXRlbSwgcmVzcG9uc2UpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3JIdHRwQ2xpZW50KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIGVycm9ySHR0cENsaWVudCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBlbmRpbmdFdmVudFNvdXJjaW5nKFxyXG4gICAgY3VycmVudEV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtLFxyXG4gICAgaWRGaWVsZFNjaGVtYTogc3RyaW5nLFxyXG4gICAgaW5zZXJ0ZWQ6IG9iamVjdCxcclxuICAgIGV2ZW50U291cmNpbmdJdGVtczogQXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT5cclxuICApIHtcclxuICAgIGlmIChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV0pIHtcclxuICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1zLmZvckVhY2goKGV2ZW50U291cmNpbmdJdGVtLCBwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzQ3VycmVudEV2ZW50U291cmNpbmdJdGVtID1cclxuICAgICAgICAgICFldmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbaWRGaWVsZFNjaGVtYV0gJiZcclxuICAgICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdID09PVxyXG4gICAgICAgICAgICBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV07XHJcblxyXG4gICAgICAgIGlmIChpc0N1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSkge1xyXG4gICAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1zW3Bvc2l0aW9uXS5yZWNvcmRbaWRGaWVsZFNjaGVtYV0gPSBpbnNlcnRlZFtpZEZpZWxkU2NoZW1hXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMucG9TdG9yYWdlLnNldChQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsIGV2ZW50U291cmNpbmdJdGVtcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVJlY29yZHMoc2VydmVyUmVjb3JkczogQXJyYXk8YW55Piwgc2NoZW1hOiBQb1N5bmNTY2hlbWEpIHtcclxuICAgIGZvciAoY29uc3Qgc2VydmVyUmVjb3JkIG9mIHNlcnZlclJlY29yZHMpIHtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVSZWNvcmRCeVNlcnZlclJlY29yZChzZXJ2ZXJSZWNvcmQsIHNjaGVtYSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVJlY29yZEJ5U2VydmVyUmVjb3JkKHNlcnZlclJlY29yZCwgc2NoZW1hKSB7XHJcbiAgICBjb25zdCByZWNvcmRJZCA9IHNlcnZlclJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcbiAgICBjb25zdCBzdG9yYWdlUmVjb3JkID0gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UuZ2V0KHNjaGVtYS5uYW1lLCByZWNvcmRJZCk7XHJcbiAgICBjb25zdCBleGlzdHNTdG9yYWdlUmVjb3JkID0gISFPYmplY3Qua2V5cyhzdG9yYWdlUmVjb3JkKS5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGV4aXN0c1N0b3JhZ2VSZWNvcmQgJiYgc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5yZW1vdmUoc2NoZW1hLm5hbWUsIHNlcnZlclJlY29yZFtzY2hlbWEuaWRGaWVsZF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChleGlzdHNTdG9yYWdlUmVjb3JkICYmICFzZXJ2ZXJSZWNvcmRbc2NoZW1hLmRlbGV0ZWRGaWVsZF0pIHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnVwZGF0ZShzY2hlbWEsIHNlcnZlclJlY29yZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFleGlzdHNTdG9yYWdlUmVjb3JkICYmICFzZXJ2ZXJSZWNvcmRbc2NoZW1hLmRlbGV0ZWRGaWVsZF0pIHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLmNyZWF0ZShzY2hlbWEsIHNlcnZlclJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVN0b3JhZ2VCeVNjaGVtYShzY2hlbWE6IFBvU3luY1NjaGVtYSk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmNyZWF0ZVNjaGVtYVN5bmNDb25maWcoc2NoZW1hLm5hbWUpO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydwYWdlJ10gPSAxO1xyXG4gICAgY29uc3QgYmFzZVVybCA9IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkRJRkYpfS8ke3NjaGVtYS5sYXN0U3luY31gO1xyXG4gICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ2N1cnJlbnRVcmxEaWZmJ10gPSB0aGlzLmJ1aWxkVXJsUGFyYW1zKFxyXG4gICAgICBzY2hlbWEsXHJcbiAgICAgIGJhc2VVcmwsXHJcbiAgICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydwYWdlJ11cclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgc2VydmVyUmVjb3JkcyA9IGF3YWl0IHRoaXMuZ2V0U2VydmVyRGlmZlJlY29yZHMoc2NoZW1hLCBiYXNlVXJsKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVJlY29yZHMoc2VydmVyUmVjb3Jkcywgc2NoZW1hKTtcclxuXHJcbiAgICBzY2hlbWEubGFzdFN5bmMgPSB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncmVzcG9uc2VEYXRlJ107XHJcbiAgICBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi51cGRhdGUoc2NoZW1hKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZVNjaGVtYXMoc2NoZW1hcyk6IEFycmF5PFByb21pc2U8QXJyYXk8YW55Pj4+IHtcclxuICAgIHJldHVybiBzY2hlbWFzLm1hcCgoc2NoZW1hOiBQb1N5bmNTY2hlbWEpID0+IHRoaXMudXBkYXRlU3RvcmFnZUJ5U2NoZW1hKHNjaGVtYSkpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,11 +1,11 @@
1
- /**
2
- * @docsPrivate
3
- *
4
- * @usedBy PoHttpClientService
5
- *
6
- * @description
7
- *
8
- * Define o cabeçalho da requisição HTTP.
9
- */
10
- export {};
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1oZWFkZXItb3B0aW9uLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkb2NzUHJpdmF0ZVxuICpcbiAqIEB1c2VkQnkgUG9IdHRwQ2xpZW50U2VydmljZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIERlZmluZSBvIGNhYmXDp2FsaG8gZGEgcmVxdWlzacOnw6NvIEhUVFAuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBQb0h0dHBIZWFkZXJPcHRpb24ge1xuICAvKiogTm9tZSBkbyBjYWJlw6dhbGhvLiAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFZhbG9yIGRvIGNhYmXDp2FsaG8uICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG4iXX0=
1
+ /**
2
+ * @docsPrivate
3
+ *
4
+ * @usedBy PoHttpClientService
5
+ *
6
+ * @description
7
+ *
8
+ * Define o cabeçalho da requisição HTTP.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1oZWFkZXItb3B0aW9uLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGRvY3NQcml2YXRlXHJcbiAqXHJcbiAqIEB1c2VkQnkgUG9IdHRwQ2xpZW50U2VydmljZVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogRGVmaW5lIG8gY2FiZcOnYWxobyBkYSByZXF1aXNpw6fDo28gSFRUUC5cclxuICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBvSHR0cEhlYWRlck9wdGlvbiB7XHJcbiAgLyoqIE5vbWUgZG8gY2FiZcOnYWxoby4gKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBWYWxvciBkbyBjYWJlw6dhbGhvLiAqL1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb0h0dHBIZWFkZXJPcHRpb24gfSBmcm9tICcuL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0VHlwZSB9IGZyb20gJy4vLi4vcG8taHR0cC1yZXF1ZXN0LXR5cGUuZW51bSc7XHJcblxyXG4vKipcclxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBJbnRlcmZhY2UgcGFyYSBkZWZpbmnDp8OjbyBkZSB1bWEgcmVxdWlzacOnw6NvIEhUVFAuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvSHR0cFJlcXVlc3REYXRhIHtcclxuICAvKiogVVJMIHF1ZSBzZXLDoSB1dGlsaXphZGEgbmEgcmVxdWlzacOnw6NvLiAqL1xyXG4gIHVybDogc3RyaW5nO1xyXG5cclxuICAvKiogQ2FiZcOnYWxobyBkYSByZXF1aXNpw6fDo28uICovXHJcbiAgaGVhZGVycz86IEFycmF5PFBvSHR0cEhlYWRlck9wdGlvbj47XHJcblxyXG4gIC8qKiBNw6l0b2RvIEhUVFAgcXVlIHNlcsOhIHV0aWxpemFkby4gKi9cclxuICBtZXRob2Q6IFBvSHR0cFJlcXVlc3RUeXBlO1xyXG5cclxuICAvKiogQ29ycG8gZGEgcmVxdWlzacOnw6NvLiAqL1xyXG4gIGJvZHk/OiBhbnk7XHJcblxyXG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBjb250ZXLDoSBvIGFycXVpdm8gZW52aWFkbyBwYXJhIG8gc2Vydmlkb3IgKi9cclxuICBmb3JtRmllbGQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIFRpcG8gZG8gYm9keVxyXG4gIGJvZHlUeXBlPzogc3RyaW5nO1xyXG5cclxuICAvLyBNaW1lVHlwZSBkYSByZXF1aXNpw6fDo28gY2FzbyBzZWphIHVtIGFycXVpdm9cclxuICBtaW1lVHlwZT86IHN0cmluZztcclxuXHJcbiAgLy8gTm9tZSBkbyBhcnF1aXZvXHJcbiAgZmlsZU5hbWU/OiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcmVzcG9uc2UtYXBpLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLXJlc3BvbnNlLWFwaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAdXNlZEJ5IFBvUXVlcnlCdWlsZGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBJbnRlcmZhY2UgcXVlIHJlcHJlc2VudGEgYSBlc3RydXR1cmEgZGUgcmVzcG9zdGEgZGUgdW1hIGNvbGXDp8OjbyBkZSBpdGVucy5cclxuICpcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUG9SZXNwb25zZUFwaSB7XHJcbiAgLyoqIExpc3RhIGRlIGl0ZW5zIHJldG9ybmFkb3MuICovXHJcbiAgaXRlbXM6IEFycmF5PG9iamVjdD47XHJcblxyXG4gIC8qKiBJbmRpY2Egc2UgZXhpc3RlIHVtYSBwcsOzeGltYSBww6FnaW5hIGNvbSBtYWlzIHJlZ2lzdHJvcyBwYXJhIGFxdWVsYSBjb2xlw6fDo28gZGUgaXRlbnMuICovXHJcbiAgaGFzTmV4dDogYm9vbGVhbjtcclxufVxyXG4iXX0=