@po-ui/ng-sync 18.23.0 → 19.0.0-next.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.
- package/fesm2022/po-ui-ng-sync.mjs +37 -19
- package/fesm2022/po-ui-ng-sync.mjs.map +1 -1
- package/lib/services/po-http-client/po-http-client.service.d.ts +8 -8
- package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +1 -1
- package/package.json +13 -15
- package/po-ui-ng-sync-19.0.0-next.0.tgz +0 -0
- package/schematics/collection.json +5 -0
- package/schematics/migrations.json +6 -1
- package/schematics/ng-add/index.d.ts +1 -5
- package/schematics/ng-add/index.js +3 -37
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/setup-project.d.ts +2 -0
- package/schematics/ng-add/setup-project.js +179 -0
- package/schematics/ng-add/setup-project.js.map +1 -0
- package/schematics/ng-generate/schema/index.js +1 -1
- package/schematics/ng-generate/schema/index.js.map +1 -1
- package/schematics/ng-update/v14/index.js +2 -2
- package/schematics/ng-update/v14/index.js.map +1 -1
- package/schematics/ng-update/v15/index.js +2 -2
- package/schematics/ng-update/v15/index.js.map +1 -1
- package/schematics/ng-update/v16/index.js +2 -2
- package/schematics/ng-update/v16/index.js.map +1 -1
- package/schematics/ng-update/v17/index.js +2 -2
- package/schematics/ng-update/v17/index.js.map +1 -1
- package/schematics/ng-update/v18/index.js +2 -2
- package/schematics/ng-update/v18/index.js.map +1 -1
- package/schematics/ng-update/v19/changes.d.ts +2 -0
- package/schematics/ng-update/v19/changes.js +14 -0
- package/schematics/ng-update/v19/changes.js.map +1 -0
- package/schematics/ng-update/v19/index.d.ts +1 -0
- package/schematics/ng-update/v19/index.js +16 -0
- package/schematics/ng-update/v19/index.js.map +1 -0
- package/schematics/ng-update/v2/index.js +3 -4
- package/schematics/ng-update/v2/index.js.map +1 -1
- package/schematics/ng-update/v3/index.js +2 -3
- package/schematics/ng-update/v3/index.js.map +1 -1
- package/schematics/ng-update/v4/index.js +2 -2
- package/schematics/ng-update/v4/index.js.map +1 -1
- package/schematics/ng-update/v5/index.js +2 -2
- package/schematics/ng-update/v5/index.js.map +1 -1
- package/schematics/ng-update/v6/index.js +2 -2
- package/schematics/ng-update/v6/index.js.map +1 -1
- package/esm2022/lib/index.mjs +0 -15
- package/esm2022/lib/models/index.mjs +0 -6
- package/esm2022/lib/models/po-data-message.model.mjs +0 -57
- package/esm2022/lib/models/po-data-transform.model.mjs +0 -23
- package/esm2022/lib/models/po-entity/po-entity.model.mjs +0 -217
- package/esm2022/lib/models/po-event-sourcing-error-response.model.mjs +0 -21
- package/esm2022/lib/models/po-network-status.model.mjs +0 -45
- package/esm2022/lib/models/po-network-type.enum.mjs +0 -30
- package/esm2022/lib/models/po-query-builder/po-query-builder.model.mjs +0 -246
- package/esm2022/lib/models/po-request-type.enum.mjs +0 -16
- package/esm2022/lib/po-sync.module.mjs +0 -40
- package/esm2022/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +0 -17
- package/esm2022/lib/services/po-event-sourcing/index.mjs +0 -4
- package/esm2022/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +0 -2
- package/esm2022/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +0 -2
- package/esm2022/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +0 -379
- package/esm2022/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +0 -11
- package/esm2022/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +0 -2
- package/esm2022/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +0 -2
- package/esm2022/lib/services/po-http-client/po-http-client.service.mjs +0 -149
- package/esm2022/lib/services/po-http-client/po-http-request-type.enum.mjs +0 -25
- package/esm2022/lib/services/po-network/po-network.service.mjs +0 -59
- package/esm2022/lib/services/po-schema/index.mjs +0 -4
- package/esm2022/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +0 -78
- package/esm2022/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +0 -124
- package/esm2022/lib/services/po-schema/po-schema.service.mjs +0 -176
- package/esm2022/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +0 -2
- package/esm2022/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +0 -2
- package/esm2022/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +0 -2
- package/esm2022/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +0 -2
- package/esm2022/lib/services/po-sync/po-sync.service.mjs +0 -336
- package/esm2022/lib/utils/utils.mjs +0 -63
- package/esm2022/po-ui-ng-sync.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
- package/po-ui-ng-sync-18.23.0.tgz +0 -0
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { PoSchemaUtil } from './po-schema-util/po-schema-util.model';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./po-schema-definition/po-schema-definition.service";
|
|
5
|
-
import * as i2 from "@po-ui/ng-storage";
|
|
6
|
-
/**
|
|
7
|
-
* @docsPrivate
|
|
8
|
-
*
|
|
9
|
-
* @description
|
|
10
|
-
*
|
|
11
|
-
* Serviço que realiza as operações nos `schemas`.
|
|
12
|
-
*/
|
|
13
|
-
export class PoSchemaService {
|
|
14
|
-
poSchemaDefinitionService;
|
|
15
|
-
poStorage;
|
|
16
|
-
constructor(poSchemaDefinitionService, poStorage) {
|
|
17
|
-
this.poSchemaDefinitionService = poSchemaDefinitionService;
|
|
18
|
-
this.poStorage = poStorage;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Retorna o id a partir de uma chave de um *schema*.
|
|
22
|
-
*
|
|
23
|
-
* @param {string} schemaKey Chave do *schema* em que será realizada a busca do id.
|
|
24
|
-
*/
|
|
25
|
-
static getIdByRecordKey(schemaKey) {
|
|
26
|
-
return schemaKey.split(':')[1];
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Retorna a chave do *schema* informado.
|
|
30
|
-
*
|
|
31
|
-
* @param {string} schemaName Nome do *schema*.
|
|
32
|
-
* @param {any} recordId Id do registro.
|
|
33
|
-
* @param {boolean} isLocalKey Indica se é uma chave local.
|
|
34
|
-
*/
|
|
35
|
-
static getRecordKey(schemaName, recordId, isLocalKey = false) {
|
|
36
|
-
return isLocalKey ? `${schemaName}_local:${recordId}` : `${schemaName}:${recordId}`;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Verifica se o dado informado é uma chave de um *schema*.
|
|
40
|
-
*
|
|
41
|
-
* @param {string} data Dado que será verificado se é uma chave de um *schema*.
|
|
42
|
-
* @param {string} schemaName Nome do *schema*.
|
|
43
|
-
*/
|
|
44
|
-
static isSchemaKey(data, schemaName) {
|
|
45
|
-
return data ? data.startsWith(`${schemaName}:`) : false;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Cria um novo registro para o *schema* informado.
|
|
49
|
-
*
|
|
50
|
-
* @param {PoSyncSchema} schema **Schema* em que será criado o registro.
|
|
51
|
-
* @param {object} newRecord Registro que será criado.
|
|
52
|
-
*/
|
|
53
|
-
async create(schema, newRecord) {
|
|
54
|
-
const id = PoSchemaUtil.getRecordId(newRecord, schema);
|
|
55
|
-
return this.save(schema, newRecord, id);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Destrói as chaves do *storage* que contém os registros dos *schemas*.
|
|
59
|
-
*
|
|
60
|
-
* @returns {Promise<void>} Promessa que é resolvida quando as chaves referentes aos *schemas* forem destruídas.
|
|
61
|
-
*/
|
|
62
|
-
async destroySchemasRecords() {
|
|
63
|
-
const schemas = await this.poSchemaDefinitionService.getAll();
|
|
64
|
-
const storageKeys = await this.poStorage.keys();
|
|
65
|
-
for (const key of storageKeys) {
|
|
66
|
-
const schemaKey = schemas.find(schema => PoSchemaService.isSchemaKey(key, schema.name));
|
|
67
|
-
if (schemaKey) {
|
|
68
|
-
const id = PoSchemaService.getIdByRecordKey(key);
|
|
69
|
-
await this.remove(schemaKey.name, id);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Retorna o registro referente ao *schema* informado.
|
|
75
|
-
*
|
|
76
|
-
* @param {string} schemaName Nome do *schema*.
|
|
77
|
-
* @param {any} recordId Id do registro.
|
|
78
|
-
*/
|
|
79
|
-
async get(schemaName, recordId) {
|
|
80
|
-
const isLocalRecord = true;
|
|
81
|
-
const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);
|
|
82
|
-
const record = await this.getRecord(schemaName, recordId);
|
|
83
|
-
return Object.assign(record, localRecord);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Retorna todos os registros referente ao *schema* informado.
|
|
87
|
-
*
|
|
88
|
-
* @param {string} schemaName Nome do *schema*.
|
|
89
|
-
*/
|
|
90
|
-
async getAll(schemaName) {
|
|
91
|
-
const storageKeys = await this.poStorage.keys();
|
|
92
|
-
const schemaRecords = [];
|
|
93
|
-
for (const key of storageKeys) {
|
|
94
|
-
if (PoSchemaService.isSchemaKey(key, schemaName)) {
|
|
95
|
-
const id = PoSchemaService.getIdByRecordKey(key);
|
|
96
|
-
schemaRecords.push(await this.get(schemaName, id));
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return schemaRecords;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Aguarda a liberação do recurso limitado, posteriormente o envolve em um comportamento
|
|
103
|
-
* de bloqueio e desbloqueio.
|
|
104
|
-
*
|
|
105
|
-
* @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.
|
|
106
|
-
*/
|
|
107
|
-
limitedCallWrap(limitedResource) {
|
|
108
|
-
return this.poStorage.limitedCallWrap(limitedResource);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Remove um registro de um *schema* informado.
|
|
112
|
-
*
|
|
113
|
-
* @param {string} schemaName Nome do *schema*.
|
|
114
|
-
* @param {any} recordId Id do registro.
|
|
115
|
-
*/
|
|
116
|
-
async remove(schemaName, recordId) {
|
|
117
|
-
const recordKey = PoSchemaService.getRecordKey(schemaName, recordId);
|
|
118
|
-
const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);
|
|
119
|
-
await this.poStorage.remove(recordKey);
|
|
120
|
-
await this.poStorage.remove(localRecordKey);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Atualiza um registro de um *schema* informado.
|
|
124
|
-
*
|
|
125
|
-
* @param {PoSyncSchema} schema **Schema* referente ao registro que será alterado.
|
|
126
|
-
* @param {object} record Registro que será atualizado.
|
|
127
|
-
* @param {any} recordId Id do registro que deseja ser alterado. Deve ser utilizado em casos em que o id foi alterado.
|
|
128
|
-
*/
|
|
129
|
-
async update(schema, record, recordId) {
|
|
130
|
-
const id = PoSchemaUtil.getRecordId(record, schema);
|
|
131
|
-
if (recordId) {
|
|
132
|
-
record = await this.updateRecordId(schema.name, record, recordId);
|
|
133
|
-
}
|
|
134
|
-
return this.save(schema, record, id);
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Atualiza todos os registros de um *schema*.
|
|
138
|
-
*
|
|
139
|
-
* @param {PoSyncSchema} schema **Schema* referente aos registros que serão alterados.
|
|
140
|
-
* @param {Array<object>} records Lista de registros que serão alterados.
|
|
141
|
-
*/
|
|
142
|
-
async updateAll(schema, records) {
|
|
143
|
-
for (const record of records) {
|
|
144
|
-
await this.update(schema, record);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
async getRecord(schemaName, recordId, isLocalRecord = false) {
|
|
148
|
-
return (await this.poStorage.get(PoSchemaService.getRecordKey(schemaName, recordId, isLocalRecord))) || {};
|
|
149
|
-
}
|
|
150
|
-
async save(schema, record, recordId) {
|
|
151
|
-
const { serverRecord, localRecord } = PoSchemaUtil.separateSchemaFields(schema, record);
|
|
152
|
-
const recordKey = PoSchemaService.getRecordKey(schema.name, recordId);
|
|
153
|
-
await this.poStorage.set(recordKey, serverRecord);
|
|
154
|
-
await this.saveLocalFields(schema.name, localRecord, recordId);
|
|
155
|
-
return record;
|
|
156
|
-
}
|
|
157
|
-
async saveLocalFields(schemaName, localFields, recordId) {
|
|
158
|
-
const containsLocalFields = Object.keys(localFields).length;
|
|
159
|
-
if (containsLocalFields) {
|
|
160
|
-
const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);
|
|
161
|
-
await this.poStorage.set(localRecordKey, localFields);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async updateRecordId(schemaName, record, recordId) {
|
|
165
|
-
const isLocalRecord = true;
|
|
166
|
-
const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);
|
|
167
|
-
await this.remove(schemaName, recordId);
|
|
168
|
-
return Object.assign(record, localRecord);
|
|
169
|
-
}
|
|
170
|
-
static ɵfac = function PoSchemaService_Factory(t) { return new (t || PoSchemaService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoStorageService)); };
|
|
171
|
-
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSchemaService, factory: PoSchemaService.ɵfac });
|
|
172
|
-
}
|
|
173
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSchemaService, [{
|
|
174
|
-
type: Injectable
|
|
175
|
-
}], () => [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoStorageService }], null); })();
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc2NoZW1hLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvc2VydmljZXMvcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7O0FBR3JFOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBRWhCO0lBQ0E7SUFGVixZQUNVLHlCQUFvRCxFQUNwRCxTQUEyQjtRQUQzQiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBQ2xDLENBQUM7SUFFSjs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQWlCO1FBQy9DLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLFFBQWEsRUFBRSxhQUFzQixLQUFLO1FBQ3hGLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsVUFBVSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDekQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFD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IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQb1N0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQHBvLXVpL25nLXN0b3JhZ2UnO1xuXG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wby1zY2hlbWEtZGVmaW5pdGlvbi9wby1zY2hlbWEtZGVmaW5pdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvU2NoZW1hVXRpbCB9IGZyb20gJy4vcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRvY3NQcml2YXRlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2VydmnDp28gcXVlIHJlYWxpemEgYXMgb3BlcmHDp8O1ZXMgbm9zIGBzY2hlbWFzYC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBvU2NoZW1hU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcG9TY2hlbWFEZWZpbml0aW9uU2VydmljZTogUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBvU3RvcmFnZTogUG9TdG9yYWdlU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgbyBpZCBhIHBhcnRpciBkZSB1bWEgY2hhdmUgZGUgdW0gKnNjaGVtYSouXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFLZXkgQ2hhdmUgZG8gKnNjaGVtYSogZW0gcXVlIHNlcsOhIHJlYWxpemFkYSBhIGJ1c2NhIGRvIGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWRCeVJlY29yZEtleShzY2hlbWFLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNjaGVtYUtleS5zcGxpdCgnOicpWzFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgYSBjaGF2ZSBkbyAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cbiAgICogQHBhcmFtIHtib29sZWFufSBpc0xvY2FsS2V5IEluZGljYSBzZSDDqSB1bWEgY2hhdmUgbG9jYWwuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWNvcmRLZXkoc2NoZW1hTmFtZTogc3RyaW5nLCByZWNvcmRJZDogYW55LCBpc0xvY2FsS2V5OiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0xvY2FsS2V5ID8gYCR7c2NoZW1hTmFtZX1fbG9jYWw6JHtyZWNvcmRJZH1gIDogYCR7c2NoZW1hTmFtZX06JHtyZWNvcmRJZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNlIG8gZGFkbyBpbmZvcm1hZG8gw6kgdW1hIGNoYXZlIGRlIHVtICpzY2hlbWEqLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBEYWRvIHF1ZSBzZXLDoSB2ZXJpZmljYWRvIHNlIMOpIHVtYSBjaGF2ZSBkZSB1bSAqc2NoZW1hKi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYU5hbWUgTm9tZSBkbyAqc2NoZW1hKi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGlzU2NoZW1hS2V5KGRhdGE6IHN0cmluZywgc2NoZW1hTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGEgPyBkYXRhLnN0YXJ0c1dpdGgoYCR7c2NoZW1hTmFtZX06YCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmlhIHVtIG5vdm8gcmVnaXN0cm8gcGFyYSBvICpzY2hlbWEqIGluZm9ybWFkby5cbiAgICpcbiAgICogQHBhcmFtIHtQb1N5bmNTY2hlbWF9IHNjaGVtYSAqKlNjaGVtYSogZW0gcXVlIHNlcsOhIGNyaWFkbyBvIHJlZ2lzdHJvLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSBjcmlhZG8uXG4gICAqL1xuICBhc3luYyBjcmVhdGUoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIG5ld1JlY29yZDogb2JqZWN0KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCBpZCA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChuZXdSZWNvcmQsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZShzY2hlbWEsIG5ld1JlY29yZCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryw7NpIGFzIGNoYXZlcyBkbyAqc3RvcmFnZSogcXVlIGNvbnTDqW0gb3MgcmVnaXN0cm9zIGRvcyAqc2NoZW1hcyouXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhcyBjaGF2ZXMgcmVmZXJlbnRlcyBhb3MgKnNjaGVtYXMqIGZvcmVtIGRlc3RydcOtZGFzLlxuICAgKi9cbiAgYXN5bmMgZGVzdHJveVNjaGVtYXNSZWNvcmRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgY29uc3Qgc3RvcmFnZUtleXMgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5rZXlzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzdG9yYWdlS2V5cykge1xuICAgICAgY29uc3Qgc2NoZW1hS2V5ID0gc2NoZW1hcy5maW5kKHNjaGVtYSA9PiBQb1NjaGVtYVNlcnZpY2UuaXNTY2hlbWFLZXkoa2V5LCBzY2hlbWEubmFtZSkpO1xuXG4gICAgICBpZiAoc2NoZW1hS2V5KSB7XG4gICAgICAgIGNvbnN0IGlkID0gUG9TY2hlbWFTZXJ2aWNlLmdldElkQnlSZWNvcmRLZXkoa2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUoc2NoZW1hS2V5Lm5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBvIHJlZ2lzdHJvIHJlZmVyZW50ZSBhbyAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cbiAgICovXG4gIGFzeW5jIGdldChzY2hlbWFOYW1lOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlzTG9jYWxSZWNvcmQgPSB0cnVlO1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkID0gYXdhaXQgdGhpcy5nZXRSZWNvcmQoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIGlzTG9jYWxSZWNvcmQpO1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHRoaXMuZ2V0UmVjb3JkKHNjaGVtYU5hbWUsIHJlY29yZElkKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlY29yZCwgbG9jYWxSZWNvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdG9kb3Mgb3MgcmVnaXN0cm9zIHJlZmVyZW50ZSBhbyAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqL1xuICBhc3luYyBnZXRBbGwoc2NoZW1hTmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxvYmplY3Q+PiB7XG4gICAgY29uc3Qgc3RvcmFnZUtleXMgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5rZXlzKCk7XG4gICAgY29uc3Qgc2NoZW1hUmVjb3JkcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmFnZUtleXMpIHtcbiAgICAgIGlmIChQb1NjaGVtYVNlcnZpY2UuaXNTY2hlbWFLZXkoa2V5LCBzY2hlbWFOYW1lKSkge1xuICAgICAgICBjb25zdCBpZCA9IFBvU2NoZW1hU2VydmljZS5nZXRJZEJ5UmVjb3JkS2V5KGtleSk7XG4gICAgICAgIHNjaGVtYVJlY29yZHMucHVzaChhd2FpdCB0aGlzLmdldChzY2hlbWFOYW1lLCBpZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFSZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFndWFyZGEgYSBsaWJlcmHDp8OjbyBkbyByZWN1cnNvIGxpbWl0YWRvLCBwb3N0ZXJpb3JtZW50ZSBvIGVudm9sdmUgZW0gdW0gY29tcG9ydGFtZW50b1xuICAgKiBkZSBibG9xdWVpbyBlIGRlc2Jsb3F1ZWlvLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaW1pdGVkUmVzb3VyY2UgRnVuw6fDo28gcXVlIHNlcsOhIGVudm9sdmlkYSBubyBjb21wb3J0YW1lbnRvIGRlIGJsb3F1ZWlvIGUgZGVzYmxvcXVlaW8uXG4gICAqL1xuICBsaW1pdGVkQ2FsbFdyYXAobGltaXRlZFJlc291cmNlOiBGdW5jdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9TdG9yYWdlLmxpbWl0ZWRDYWxsV3JhcChsaW1pdGVkUmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1bSByZWdpc3RybyBkZSB1bSAqc2NoZW1hKiBpbmZvcm1hZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cbiAgICovXG4gIGFzeW5jIHJlbW92ZShzY2hlbWFOYW1lOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IFBvU2NoZW1hU2VydmljZS5nZXRSZWNvcmRLZXkoc2NoZW1hTmFtZSwgcmVjb3JkSWQpO1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkS2V5ID0gUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWFOYW1lLCByZWNvcmRJZCwgdHJ1ZSk7XG5cbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5yZW1vdmUocmVjb3JkS2V5KTtcbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5yZW1vdmUobG9jYWxSZWNvcmRLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dWFsaXphIHVtIHJlZ2lzdHJvIGRlIHVtICpzY2hlbWEqIGluZm9ybWFkby5cbiAgICpcbiAgICogQHBhcmFtIHtQb1N5bmNTY2hlbWF9IHNjaGVtYSAqKlNjaGVtYSogcmVmZXJlbnRlIGFvIHJlZ2lzdHJvIHF1ZSBzZXLDoSBhbHRlcmFkby5cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlY29yZCBSZWdpc3RybyBxdWUgc2Vyw6EgYXR1YWxpemFkby5cbiAgICogQHBhcmFtIHthbnl9IHJlY29yZElkIElkIGRvIHJlZ2lzdHJvIHF1ZSBkZXNlamEgc2VyIGFsdGVyYWRvLiBEZXZlIHNlciB1dGlsaXphZG8gZW0gY2Fzb3MgZW0gcXVlIG8gaWQgZm9pIGFsdGVyYWRvLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKHNjaGVtYTogUG9TeW5jU2NoZW1hLCByZWNvcmQ6IG9iamVjdCwgcmVjb3JkSWQ/OiBhbnkpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlkID0gUG9TY2hlbWFVdGlsLmdldFJlY29yZElkKHJlY29yZCwgc2NoZW1hKTtcblxuICAgIGlmIChyZWNvcmRJZCkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy51cGRhdGVSZWNvcmRJZChzY2hlbWEubmFtZSwgcmVjb3JkLCByZWNvcmRJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2F2ZShzY2hlbWEsIHJlY29yZCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dWFsaXphIHRvZG9zIG9zIHJlZ2lzdHJvcyBkZSB1bSAqc2NoZW1hKi5cbiAgICpcbiAgICogQHBhcmFtIHtQb1N5bmNTY2hlbWF9IHNjaGVtYSAqKlNjaGVtYSogcmVmZXJlbnRlIGFvcyByZWdpc3Ryb3MgcXVlIHNlcsOjbyBhbHRlcmFkb3MuXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVjb3JkcyBMaXN0YSBkZSByZWdpc3Ryb3MgcXVlIHNlcsOjbyBhbHRlcmFkb3MuXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIHJlY29yZHM6IEFycmF5PG9iamVjdD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZShzY2hlbWEsIHJlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZWNvcmQoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIGlzTG9jYWxSZWNvcmQgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnBvU3RvcmFnZS5nZXQoUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCkpKSB8fCB7fTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZShzY2hlbWE6IFBvU3luY1NjaGVtYSwgcmVjb3JkOiBvYmplY3QsIHJlY29yZElkOiBhbnkpIHtcbiAgICBjb25zdCB7IHNlcnZlclJlY29yZCwgbG9jYWxSZWNvcmQgfSA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyhzY2hlbWEsIHJlY29yZCk7XG4gICAgY29uc3QgcmVjb3JkS2V5ID0gUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWEubmFtZSwgcmVjb3JkSWQpO1xuXG4gICAgYXdhaXQgdGhpcy5wb1N0b3JhZ2Uuc2V0KHJlY29yZEtleSwgc2VydmVyUmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbEZpZWxkcyhzY2hlbWEubmFtZSwgbG9jYWxSZWNvcmQsIHJlY29yZElkKTtcblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVMb2NhbEZpZWxkcyhzY2hlbWFOYW1lOiBzdHJpbmcsIGxvY2FsRmllbGRzOiBvYmplY3QsIHJlY29yZElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGFpbnNMb2NhbEZpZWxkcyA9IE9iamVjdC5rZXlzKGxvY2FsRmllbGRzKS5sZW5ndGg7XG5cbiAgICBpZiAoY29udGFpbnNMb2NhbEZpZWxkcykge1xuICAgICAgY29uc3QgbG9jYWxSZWNvcmRLZXkgPSBQb1NjaGVtYVNlcnZpY2UuZ2V0UmVjb3JkS2V5KHNjaGVtYU5hbWUsIHJlY29yZElkLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMucG9TdG9yYWdlLnNldChsb2NhbFJlY29yZEtleSwgbG9jYWxGaWVsZHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmVjb3JkSWQoc2NoZW1hTmFtZSwgcmVjb3JkLCByZWNvcmRJZCkge1xuICAgIGNvbnN0IGlzTG9jYWxSZWNvcmQgPSB0cnVlO1xuXG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBhd2FpdCB0aGlzLmdldFJlY29yZChzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5yZW1vdmUoc2NoZW1hTmFtZSwgcmVjb3JkSWQpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvRGF0YVRyYW5zZm9ybSB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL3BvLWRhdGEtdHJhbnNmb3JtLm1vZGVsJztcbmltcG9ydCB7IFBvTmV0d29ya1R5cGUgfSBmcm9tICcuLy4uLy4uLy4uL21vZGVscy9wby1uZXR3b3JrLXR5cGUuZW51bSc7XG5cbi8qKlxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogSW50ZXJmYWNlIHBhcmEgYSBkZWZpbmnDp8OjbyBkYXMgY29uZmlndXJhw6fDtWVzIGRvIHNpbmNyb25pc21vLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9TeW5jQ29uZmlnIHtcbiAgLyoqXG4gICAqIENsYXNzZSB1c2FkYSBwYXJhIGEgdHJhc2Zvcm1hw6fDo28gZG9zIGRhZG9zIG5hcyByZXF1aXNpw6fDtWVzLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEFkYXB0YW5kbyBhIHJlc3Bvc3RhIGRhIEFQSSBwYXJhIG8gcGFkcsOjbyBkbyBQTyBVSV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqL1xuICBkYXRhVHJhbnNmb3JtPzogUG9EYXRhVHJhbnNmb3JtO1xuXG4gIC8qKlxuICAgKiBUZW1wbyBlbSBzZWd1bmRvcyBkbyBzaWNyb25pc21vIHBlcmnDs2RpY28uXG4gICAqIENhc28gbsOjbyBzZWphIGRlZmluaWRvLCBvIHNpbmNyb25pc21vIHBlcmnDs2RpY28gZXN0YXLDoSBkZXNhYmlsaXRhZG8uXG4gICAqL1xuICBwZXJpb2Q/OiBudW1iZXI7XG5cbiAgLyoqIFRpcG9zIGRlIGNvbmV4w7VlcyBwZXJtaXRpZGFzIHBhcmEgbyBzaW5jcm9uaXNtby4gKi9cbiAgdHlwZTogUG9OZXR3b3JrVHlwZSB8IEFycmF5PFBvTmV0d29ya1R5cGU+O1xufVxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdXNlZEJ5IFBvU3luY1NlcnZpY2VcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBJbnRlcmZhY2UgcXVlIGlyw6EgbWFwZWFyIGFzIGNvbmZpZ3VyYcOnw7VlcyBkb3MgY2FtcG9zIGRvIGBQb1N5bmNTY2hlbWFgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY0ZpZWxkT3B0aW9ucyB7XG4gIC8qKiBQcm9wcmllZGFkZSBxdWUgaW5mb3JtYSBvIG5vbWUgZG8gY2FtcG8uICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogUHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgc2UgbyBjYW1wbyBzZXLDoSBhcGVuYXMgcGFyYSBhcm1hemVuYW1lbnRvIGxvY2FsXG4gICAqIG91IHNlIGRldmUgc2VyIGVudmlhZG8gcGFyYSBvIHNlcnZpZG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWw/OiBib29sZWFuO1xufVxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvc2VydmljZXMvcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsJztcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3REYXRhIH0gZnJvbSAnLi4vLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLXJlcXVlc3QtZGF0YS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEB1c2VkQnkgUG9TeW5jU2VydmljZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIERlZmluZSBhIHJlc3Bvc3RhIGRvcyBldmVudG9zIGVudmlhZG9zIGFvIHNlcnZpZG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY1Jlc3BvbnNlIHtcbiAgLyoqIElkZW50aWZpY2Fkb3IgZG8gZXZlbnRvIG5hIGZpbGEuICovXG4gIGlkOiBudW1iZXI7XG5cbiAgLyoqIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZG8gcmVnaXN0cm8uICovXG4gIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZztcblxuICAvKiogRGFkb3MgZGEgcmVxdWlzacOnw6NvLiAqL1xuICByZXF1ZXN0OiBQb0h0dHBSZXF1ZXN0RGF0YTtcblxuICAvKiogUmVzcG9zdGEgcmV0b3JuYWRhIGFww7NzIGEgdGVudGF0aXZhIGRlIGVudmlvIHBhcmEgbyBzZXJ2aWRvci4gKi9cbiAgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTxPYmplY3Q+IHwgSHR0cEVycm9yUmVzcG9uc2UgfCBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlO1xufVxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvU3luY0ZpZWxkT3B0aW9ucyB9IGZyb20gJy4vcG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZSc7XG5cbi8qKlxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogSW50ZXJmYWNlIHF1ZSBpcsOhIG1hcGVhciBhcyBpbmZvcm1hw6fDtWVzIGRvcyByZWN1cnNvcywgcHJpbmNpcGFsbWVudGUgc3VhIG9yaWdlbSBlIGFzIGluZm9ybWHDp8O1ZXMgcXVlIHNlcsOjbyByZXRvcm5hZGFzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY1NjaGVtYSB7XG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIGEgZGF0YSBkZSBjcmlhw6fDo28gZG8gcmVnaXN0cm8uICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdEZpZWxkPzogc3RyaW5nO1xuXG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIGEgZGF0YSBkZSBkZWxlw6fDo28uICovXG4gIHJlYWRvbmx5IGRlbGV0ZWRBdEZpZWxkPzogc3RyaW5nO1xuXG4gIC8qKiBOb21lIGRhIHByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIHNlIG8gcmVnaXN0cm8gZm9pIGV4Y2x1w61kby4gKi9cbiAgcmVhZG9ubHkgZGVsZXRlZEZpZWxkOiBzdHJpbmc7XG5cbiAgLyoqIEVuZGVyZcOnbyBkbyBlbmRwb2ludCBwYXJhIGV4Y2x1aXIgcmVnaXN0cm9zLiAqL1xuICByZWFkb25seSBkZWxldGVVcmxBcGk/OiBzdHJpbmc7XG5cbiAgLyoqIEVuZGVyZcOnbyBkbyBlbmRwb2ludCBxdWUgcHJvdmVyw6EgYXBlbmFzIGRhZG9zIGFsdGVyYWRvcyBubyBzZXJ2aWRvci4gKi9cbiAgcmVhZG9ubHkgZGlmZlVybEFwaTogc3RyaW5nO1xuXG4gIC8qKiBDYW1wb3MgcXVlIHNlcsOjbyByZXRvcm5hZG9zIHBlbGEgQVBJLiAqL1xuICByZWFkb25seSBmaWVsZHM6IEFycmF5PHN0cmluZyB8IFBvU3luY0ZpZWxkT3B0aW9ucz47XG5cbiAgLyoqIEVuZGVyZcOnbyBkbyBlbmRwb2ludCBxdWUgdXRpbGl6YSBvIG3DqXRvZG8gR0VUIHF1ZSBwcm92ZXLDoSBvcyBkYWRvcy4gKi9cbiAgcmVhZG9ubHkgZ2V0VXJsQXBpOiBzdHJpbmc7XG5cbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcmVmZXJlbnRlIGFvIGlkZW50aWZpY2Fkb3Igw7puaWNvIHBhcmEgb3MgaXRlbnMgZG8gKnNjaGVtYSouICovXG4gIHJlYWRvbmx5IGlkRmllbGQ6IHN0cmluZztcblxuICAvKiogSWRlbnRpZmnDp8OjbyBwYXJhIHJlcHJlc2VudGFyIG8gKnNjaGVtYSouICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogUXVhbnRpZGFkZSBkZSBpdGVucyBwb3IgcMOhZ2luYSBxdWUgc2Vyw6EgZW52aWFkbyBwZWxhIEFQSS4gKi9cbiAgcmVhZG9ubHkgcGFnZVNpemU6IG51bWJlcjtcblxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHF1ZSB1dGlsaXphIG8gbcOpdG9kbyBQVVQgcGFyYSBhdHVhbGl6YXIgcmVnaXN0cm9zLiAqL1xuICByZWFkb25seSBwYXRjaFVybEFwaT86IHN0cmluZztcblxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHF1ZSB1dGlsaXphIG8gbcOpdG9kbyBQT1NUIHBhcmEgaW5jbHVpciBvcyByZWdpc3Ryb3MuICovXG4gIHJlYWRvbmx5IHBvc3RVcmxBcGk/OiBzdHJpbmc7XG5cbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgYSBkYXRhIGRlIGF0dWFsaXphw6fDo28gZG8gcmVnaXN0cm8uICovXG4gIHJlYWRvbmx5IHVwZGF0ZWRBdEZpZWxkPzogc3RyaW5nO1xuXG4gIC8vIERhdGEvSG9yYSBkYSDDumx0aW1hIHZleiBxdWUgYSBzaW5jcm9uaWEgYWNvbnRlY2V1IHBhcmEgZXNzZSAqc2NoZW1hKi5cbiAgbGFzdFN5bmM/OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
|
|
3
|
-
import { expand, map, mergeMap, reduce } from 'rxjs/operators';
|
|
4
|
-
import { validateParameter, validateArray } from '../../utils/utils';
|
|
5
|
-
import { PoDataMessage, PoEntity } from '../../models';
|
|
6
|
-
import { PoRequestType } from '../../models/po-request-type.enum';
|
|
7
|
-
import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "../po-event-sourcing/po-event-sourcing.service";
|
|
10
|
-
import * as i2 from "../po-http-client/po-http-client.service";
|
|
11
|
-
import * as i3 from "../po-network/po-network.service";
|
|
12
|
-
import * as i4 from "./../po-schema/po-schema-definition/po-schema-definition.service";
|
|
13
|
-
import * as i5 from "./../po-schema/po-schema.service";
|
|
14
|
-
/**
|
|
15
|
-
* @description
|
|
16
|
-
*
|
|
17
|
-
* O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão
|
|
18
|
-
* armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por
|
|
19
|
-
* cada consulta.
|
|
20
|
-
*/
|
|
21
|
-
export class PoSyncService {
|
|
22
|
-
poEventSourcingService;
|
|
23
|
-
poHttpClient;
|
|
24
|
-
poNetworkService;
|
|
25
|
-
poSchemaDefinitionService;
|
|
26
|
-
poSchemaService;
|
|
27
|
-
models = [];
|
|
28
|
-
config;
|
|
29
|
-
emitter;
|
|
30
|
-
eventSub;
|
|
31
|
-
finishSyncSubject = new Subject();
|
|
32
|
-
isSyncEnabled = true;
|
|
33
|
-
schemas;
|
|
34
|
-
subscription;
|
|
35
|
-
syncing = false;
|
|
36
|
-
timer;
|
|
37
|
-
constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
|
|
38
|
-
this.poEventSourcingService = poEventSourcingService;
|
|
39
|
-
this.poHttpClient = poHttpClient;
|
|
40
|
-
this.poNetworkService = poNetworkService;
|
|
41
|
-
this.poSchemaDefinitionService = poSchemaDefinitionService;
|
|
42
|
-
this.poSchemaService = poSchemaService;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
|
|
46
|
-
* as definições dos *schemas*, os registros de cada *schema* e a fila
|
|
47
|
-
* de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
|
|
48
|
-
*
|
|
49
|
-
* > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
|
|
50
|
-
* recomenda-se utilizar o método `prepare()` em seguida.
|
|
51
|
-
*
|
|
52
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
|
|
53
|
-
*
|
|
54
|
-
* @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
|
|
55
|
-
*/
|
|
56
|
-
async destroy() {
|
|
57
|
-
const destroyFunction = async () => {
|
|
58
|
-
await this.poSchemaService.destroySchemasRecords();
|
|
59
|
-
await this.poSchemaDefinitionService.destroy();
|
|
60
|
-
await this.poEventSourcingService.destroyEventSourcingQueue();
|
|
61
|
-
};
|
|
62
|
-
return this.poSchemaService.limitedCallWrap(destroyFunction);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
|
|
66
|
-
*
|
|
67
|
-
* > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
|
|
68
|
-
*/
|
|
69
|
-
disableSync() {
|
|
70
|
-
this.isSyncEnabled = false;
|
|
71
|
-
if (this.timer && this.subscription) {
|
|
72
|
-
this.subscription.unsubscribe();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* <a id="enable-sync"></a>
|
|
77
|
-
* Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
|
|
78
|
-
*
|
|
79
|
-
* Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
|
|
80
|
-
*/
|
|
81
|
-
enableSync() {
|
|
82
|
-
this.isSyncEnabled = true;
|
|
83
|
-
this.createSubscribe();
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
|
|
87
|
-
* foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
|
|
88
|
-
* deste método.
|
|
89
|
-
*
|
|
90
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
|
|
91
|
-
*
|
|
92
|
-
* @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
|
|
93
|
-
*/
|
|
94
|
-
getResponses() {
|
|
95
|
-
return this.poEventSourcingService.responsesSubject();
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Retorna uma instância de `PoEntity` para um determinado *schema*.
|
|
99
|
-
*
|
|
100
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
|
|
101
|
-
*
|
|
102
|
-
* @param {string} schemaName Nome do *schema*.
|
|
103
|
-
* @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
|
|
104
|
-
*/
|
|
105
|
-
getModel(schemaName) {
|
|
106
|
-
const model = this.models[schemaName];
|
|
107
|
-
if (!model) {
|
|
108
|
-
throw new Error('Model not found: ' + schemaName);
|
|
109
|
-
}
|
|
110
|
-
return model;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Insere uma requisição HTTP na fila de eventos do `po-sync`.
|
|
114
|
-
*
|
|
115
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
|
|
116
|
-
*
|
|
117
|
-
* @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
|
|
118
|
-
* @param {string} customRequestId Identificador customizado da requisição HTTP.
|
|
119
|
-
* @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
|
|
120
|
-
*/
|
|
121
|
-
insertHttpCommand(requestData, customRequestId) {
|
|
122
|
-
validateParameter({ requestData });
|
|
123
|
-
return this.poEventSourcingService.httpCommand(requestData, customRequestId);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
|
|
127
|
-
* na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
|
|
128
|
-
*
|
|
129
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
|
|
130
|
-
*
|
|
131
|
-
* @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
|
|
132
|
-
* carga inicial for concluída.
|
|
133
|
-
*/
|
|
134
|
-
loadData() {
|
|
135
|
-
const loads = [];
|
|
136
|
-
this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
|
|
137
|
-
return forkJoin(loads);
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Responsável por notificar sempre que houver sincronismo.
|
|
141
|
-
*
|
|
142
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
|
|
143
|
-
*
|
|
144
|
-
* @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
|
|
145
|
-
*/
|
|
146
|
-
onSync() {
|
|
147
|
-
if (!this.eventSub) {
|
|
148
|
-
this.eventSub = Observable.create(e => {
|
|
149
|
-
this.emitter = e;
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
return this.eventSub;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Prepara a aplicação criando os schemas e aplica as configurações.
|
|
156
|
-
*
|
|
157
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
|
|
158
|
-
*
|
|
159
|
-
* @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
|
|
160
|
-
* @param {PoSyncConfig} config Configurações adicionais.
|
|
161
|
-
* @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
|
|
162
|
-
*/
|
|
163
|
-
prepare(schemas, config) {
|
|
164
|
-
validateArray({ schemas });
|
|
165
|
-
const defaultSyncConfig = {
|
|
166
|
-
type: this.poNetworkService.getConnectionStatus().type,
|
|
167
|
-
period: 60,
|
|
168
|
-
dataTransform: new PoDataMessage()
|
|
169
|
-
};
|
|
170
|
-
this.schemas = schemas;
|
|
171
|
-
this.config = config || defaultSyncConfig;
|
|
172
|
-
this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
|
|
173
|
-
this.poEventSourcingService.config = this.config;
|
|
174
|
-
this.startTimer(this.config.period);
|
|
175
|
-
this.reactiveSync();
|
|
176
|
-
this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
|
|
177
|
-
return this.saveSchemas().then(() => {
|
|
178
|
-
this.schemas.forEach(schema => {
|
|
179
|
-
this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
|
|
180
|
-
});
|
|
181
|
-
return Promise.resolve();
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Remove um item da fila de eventos que espera a sincronização.
|
|
186
|
-
*
|
|
187
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
|
|
188
|
-
*
|
|
189
|
-
* @param {any} idEventSourcing Identificador do item da fila de eventos.
|
|
190
|
-
* @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
|
|
191
|
-
*/
|
|
192
|
-
removeItemOfSync(idEventSourcing) {
|
|
193
|
-
return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
|
|
197
|
-
*
|
|
198
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
|
|
199
|
-
*
|
|
200
|
-
* @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
|
|
201
|
-
*/
|
|
202
|
-
resumeSync() {
|
|
203
|
-
if (!this.canSync()) {
|
|
204
|
-
const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
|
|
205
|
-
finishSyncSubscription.unsubscribe();
|
|
206
|
-
return this.sync();
|
|
207
|
-
});
|
|
208
|
-
return Promise.resolve();
|
|
209
|
-
}
|
|
210
|
-
return this.sync();
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
|
|
214
|
-
*
|
|
215
|
-
* O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
|
|
216
|
-
*
|
|
217
|
-
* > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
|
|
218
|
-
*
|
|
219
|
-
* @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
|
|
220
|
-
*/
|
|
221
|
-
async sync() {
|
|
222
|
-
if (this.canSync()) {
|
|
223
|
-
this.startSync();
|
|
224
|
-
try {
|
|
225
|
-
await this.poEventSourcingService.syncSend();
|
|
226
|
-
await this.poEventSourcingService.syncGet();
|
|
227
|
-
if (this.emitter) {
|
|
228
|
-
this.emitter.next();
|
|
229
|
-
}
|
|
230
|
-
this.finishSync();
|
|
231
|
-
}
|
|
232
|
-
catch (error) {
|
|
233
|
-
this.syncError();
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
canSync() {
|
|
238
|
-
if (this.syncing || !this.isSyncEnabled) {
|
|
239
|
-
return false;
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
const currentConnection = this.poNetworkService.getConnectionStatus();
|
|
243
|
-
const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
|
|
244
|
-
const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
|
|
245
|
-
return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
createSubscribe() {
|
|
249
|
-
if (this.timer) {
|
|
250
|
-
this.subscription = this.timer.subscribe(() => {
|
|
251
|
-
this.sync().then(() => {
|
|
252
|
-
this.subscription.unsubscribe();
|
|
253
|
-
this.subscription = null;
|
|
254
|
-
this.timer = null;
|
|
255
|
-
this.startTimer(this.config.period);
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
finishSync() {
|
|
261
|
-
this.syncing = false;
|
|
262
|
-
this.finishSyncSubject.next(null);
|
|
263
|
-
}
|
|
264
|
-
getOnePage(schema, page = 1) {
|
|
265
|
-
const params = [];
|
|
266
|
-
params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
|
|
267
|
-
params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
|
|
268
|
-
const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
|
|
269
|
-
return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
|
|
270
|
-
const now = new Date().getTime();
|
|
271
|
-
responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
|
|
272
|
-
item.SyncInsertedDateTime = now;
|
|
273
|
-
item.SyncUpdatedDateTime = null;
|
|
274
|
-
item.SyncExclusionDateTime = null;
|
|
275
|
-
item.SyncDeleted = false;
|
|
276
|
-
item.SyncStatus = 2;
|
|
277
|
-
});
|
|
278
|
-
return this.poSchemaService
|
|
279
|
-
.updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
|
|
280
|
-
.then(() => responseBody);
|
|
281
|
-
}));
|
|
282
|
-
}
|
|
283
|
-
loadEntityData(schema) {
|
|
284
|
-
let page = 1;
|
|
285
|
-
return this.getOnePage(schema, page).pipe(expand(data => {
|
|
286
|
-
this.config.dataTransform.transform(data);
|
|
287
|
-
const hasNext = this.config.dataTransform.hasNext();
|
|
288
|
-
if (hasNext) {
|
|
289
|
-
return this.getOnePage(schema, ++page);
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
return of();
|
|
293
|
-
}
|
|
294
|
-
}), reduce((acc, obj) => {
|
|
295
|
-
acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
|
|
296
|
-
return acc;
|
|
297
|
-
}, {
|
|
298
|
-
entity: schema.name,
|
|
299
|
-
data: []
|
|
300
|
-
}));
|
|
301
|
-
}
|
|
302
|
-
reactiveSync() {
|
|
303
|
-
this.poNetworkService.onChange().subscribe(networkStatus => {
|
|
304
|
-
if (networkStatus.status) {
|
|
305
|
-
this.startTimer(this.config.period);
|
|
306
|
-
return this.sync();
|
|
307
|
-
}
|
|
308
|
-
if (this.subscription) {
|
|
309
|
-
this.subscription.unsubscribe();
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
async saveSchemas() {
|
|
314
|
-
const storageSchemas = await this.poSchemaDefinitionService.getAll();
|
|
315
|
-
this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
|
|
316
|
-
return this.poSchemaDefinitionService.saveAll(this.schemas);
|
|
317
|
-
}
|
|
318
|
-
startSync() {
|
|
319
|
-
this.syncing = true;
|
|
320
|
-
}
|
|
321
|
-
startTimer(period) {
|
|
322
|
-
if (period && this.isSyncEnabled) {
|
|
323
|
-
this.timer = timer(period * 1000);
|
|
324
|
-
this.createSubscribe();
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
syncError() {
|
|
328
|
-
this.finishSync();
|
|
329
|
-
}
|
|
330
|
-
static ɵfac = function PoSyncService_Factory(t) { return new (t || PoSyncService)(i0.ɵɵinject(i1.PoEventSourcingService), i0.ɵɵinject(i2.PoHttpClientService), i0.ɵɵinject(i3.PoNetworkService), i0.ɵɵinject(i4.PoSchemaDefinitionService), i0.ɵɵinject(i5.PoSchemaService)); };
|
|
331
|
-
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSyncService, factory: PoSyncService.ɵfac });
|
|
332
|
-
}
|
|
333
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSyncService, [{
|
|
334
|
-
type: Injectable
|
|
335
|
-
}], () => [{ type: i1.PoEventSourcingService }, { type: i2.PoHttpClientService }, { type: i3.PoNetworkService }, { type: i4.PoSchemaDefinitionService }, { type: i5.PoSchemaService }], null); })();
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFLdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQUtsRjs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sYUFBYTtJQWNkO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFqQlYsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFFckIsTUFBTSxDQUFlO0lBQ3JCLE9BQU8sQ0FBTTtJQUNiLFFBQVEsQ0FBa0I7SUFDMUIsaUJBQWlCLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7SUFDdkQsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixPQUFPLENBQXNCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBcUI7SUFFbEMsWUFDVSxzQkFBOEMsRUFDOUMsWUFBaUMsRUFDakMsZ0JBQWtDLEVBQ2xDLHlCQUFvRCxFQUNw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LEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO3VFQTVWVSxhQUFhO2dFQUFiLGFBQWEsV0FBYixhQUFhOztpRkFBYixhQUFhO2NBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZXhwYW5kLCBtYXAsIG1lcmdlTWFwLCByZWR1Y2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBhcmFtZXRlciwgdmFsaWRhdGVBcnJheSB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHsgUG9EYXRhTWVzc2FnZSwgUG9FbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nU2VydmljZSB9IGZyb20gJy4uL3BvLWV2ZW50LXNvdXJjaW5nL3BvLWV2ZW50LXNvdXJjaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9IdHRwQ2xpZW50U2VydmljZSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9IdHRwUmVxdWVzdERhdGEgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtcmVxdWVzdC1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb05ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vcG8tbmV0d29yay9wby1uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9SZXF1ZXN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9wby1yZXF1ZXN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLWRlZmluaXRpb24vcG8tc2NoZW1hLWRlZmluaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQb1NjaGVtYVNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBQb1NjaGVtYVV0aWwgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtdXRpbC9wby1zY2hlbWEtdXRpbC5tb2RlbCc7XG5pbXBvcnQgeyBQb1N5bmNDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tc3luYy1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvU3luY1Jlc3BvbnNlIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvU3luY1NjaGVtYSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gYFBvU3luY1NlcnZpY2VgIMOpIHV0aWxpemFkbyBwYXJhIGNvbmZpZ3VyYXIgdG9kYSBhIGJhc2UgZGUgZGFkb3MgcXVlIHJlY2ViZXLDoSBhcyBpbmZvcm1hw6fDtWVzIHF1ZSBzZXLDo29cbiAqIGFybWF6ZW5hZGFzICpvZmZsaW5lKiB2aW5kYXMgZG8gc2Vydmlkb3IuIE5lbGUgb2NvcnJlIHRvZGEgYSBwcmVwYXJhw6fDo28gZG9zIG1vZGVsb3MgZGUgZGFkb3MgcmV0b3JuYWRvcyBwb3JcbiAqIGNhZGEgY29uc3VsdGEuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb1N5bmNTZXJ2aWNlIHtcbiAgbW9kZWxzOiBBcnJheTxQb0VudGl0eT4gPSBbXTtcblxuICBwcml2YXRlIGNvbmZpZzogUG9TeW5jQ29uZmlnO1xuICBwcml2YXRlIGVtaXR0ZXI6IGFueTtcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxhbnk+O1xuICBwcml2YXRlIGZpbmlzaFN5bmNTdWJqZWN0OiBTdWJqZWN0PG51bGw+ID0gbmV3IFN1YmplY3Q8bnVsbD4oKTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHN5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0aW1lcjogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcG9FdmVudFNvdXJjaW5nU2VydmljZTogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHBvSHR0cENsaWVudDogUG9IdHRwQ2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIHBvTmV0d29ya1NlcnZpY2U6IFBvTmV0d29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlOiBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9TY2hlbWFTZXJ2aWNlOiBQb1NjaGVtYVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBEZXN0csOzaSB0b2RhcyBhcyBjaGF2ZXMgZG8gKnN0b3JhZ2UqIHJlZmVyZW50ZXMgYW8gYHBvLXN5bmNgLCBvdSBzZWphLFxuICAgKiBhcyBkZWZpbmnDp8O1ZXMgZG9zICpzY2hlbWFzKiwgb3MgcmVnaXN0cm9zIGRlIGNhZGEgKnNjaGVtYSogZSBhIGZpbGFcbiAgICogZGUgZXZlbnRvcyBxdWUgZXN0w6NvIHBhcmEgc2VyIGVudmlhZG9zIGFvIHNlcnZpZG9yICooRXZlbnRTb3VyY2luZykqLlxuICAgKlxuICAgKiA+IFBhcmEgcXVlIG7Do28gdmVuaGFtIG9jb3JyZXIgZXJyb3MgZW0gYcOnw7VlcyBxdWUgZGVwZW5kYW0gZGFzIGRlZmluacOnw7VlcyBkb3MgKnNjaGVtYXMqLFxuICAgKiByZWNvbWVuZGEtc2UgdXRpbGl6YXIgbyBtw6l0b2RvIGBwcmVwYXJlKClgIGVtIHNlZ3VpZGEuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQWx0ZXJhbmRvIGFzIGRlZmluacOnw7VlcyBkb3Mgc2NoZW1hc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGFzIGNoYXZlcyByZWZlcmVudGVzIGFvIGBwby1zeW5jYCBmb3JlbSBkZXN0cnXDrWRhcy5cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBkZXN0cm95RnVuY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5kZXN0cm95U2NoZW1hc1JlY29yZHMoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZGVzdHJveUV2ZW50U291cmNpbmdRdWV1ZSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKGRlc3Ryb3lGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxuICAgKlxuICAgKiA+IFBhcmEgaGFiaWxpdGFyIG5vdmFtZW50ZSBhIHNpbmNyb25pemHDp8OjbyB1dGlsaXplIG8gbcOpdG9kbyBbYFBvU3luY1NlcnZpY2UuZW5hYmxlU3luYygpYF0oZG9jdW1lbnRhdGlvbi9wby1zeW5jI2VuYWJsZS1zeW5jKS5cbiAgICovXG4gIGRpc2FibGVTeW5jKCkge1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMudGltZXIgJiYgdGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIDxhIGlkPVwiZW5hYmxlLXN5bmNcIj48L2E+XG4gICAqIEhhYmlsaXRhIHRvZG9zIG9zIHRpcG9zIGRlIHNpbmNyb25pemHDp8OjbyBkZSBkYWRvcyAocGVyacOzZGljYSwgcmVhdGl2YSBlIG1hbnVhbCkuXG4gICAqXG4gICAqIFBvciBwYWRyw6NvLCBzZW1wcmUgcXVlIHNlIGluaWNpYWxpemEgdW1hIGFwbGljYcOnw6NvIGNvbSBQTyBTeW5jIGFzIHNpbmNyb25pemHDp8O1ZXMgasOhIGVzdMOjbyBoYWJpbGl0YWRhcy5cbiAgICovXG4gIGVuYWJsZVN5bmMoKSB7XG4gICAgdGhpcy5pc1N5bmNFbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gcXVlIGRpc3BvbmliaWxpemEgYSBwYXJ0aXIgZGUgc3VhIGluc2NyacOnw6NvIG8gZXZlbnRvIGRlIHJldG9ybm8gZGFzIG9wZXJhw6fDtWVzIGRhIGZpbGEgZGUgZXZlbnRvcyBxdWVcbiAgICogZm9yYW0gZW52aWFkYXMgYW8gc2Vydmlkb3IuIEEgY2FkYSBvcGVyYcOnw6NvIGVudmlhZGEgcGFyYSBvIHNlcnZpZG9yLCBzZXLDoSBkaXNwYXJhZG8gdW0gZXZlbnRvIHBhcmEgYSBpbnNjcmnDp8Ojb1xuICAgKiBkZXN0ZSBtw6l0b2RvLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPn0gT2JzZXJ2YWJsZSBjb20gdW0gb2JqZXRvIGRvIHRpcG8gYFBvU3luY1Jlc3BvbnNlYC5cbiAgICovXG4gIGdldFJlc3BvbnNlcygpOiBPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5yZXNwb25zZXNTdWJqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSB1bWEgaW5zdMOibmNpYSBkZSBgUG9FbnRpdHlgIHBhcmEgdW0gZGV0ZXJtaW5hZG8gKnNjaGVtYSouXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gTWFuaXB1bGFuZG8gb3MgcmVnaXN0cm9zIGRlIHVtIHNjaGVtYV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXG4gICAqIEByZXR1cm5zIHtQb0VudGl0eX0gT2JqZXRvIHBhcmEgZWZldHVhciBjb25zdWx0YXMgZSBhbHRlcmHDp8O1ZXMgbm9zIGRhZG9zLlxuICAgKi9cbiAgZ2V0TW9kZWwoc2NoZW1hTmFtZTogc3RyaW5nKTogUG9FbnRpdHkge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHNbc2NoZW1hTmFtZV07XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBub3QgZm91bmQ6ICcgKyBzY2hlbWFOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VyZSB1bWEgcmVxdWlzacOnw6NvIEhUVFAgbmEgZmlsYSBkZSBldmVudG9zIGRvIGBwby1zeW5jYC5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBJbnNlcmluZG8gcmVxdWlzacOnw7VlcyBIVFRQIG5hIGZpbGEgZGUgZXZlbnRvc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7UG9IdHRwUmVxdWVzdERhdGF9IHBvSHR0cFJlcXVlc3REYXRhIERhZG9zIGRhIHJlcXVpc2nDp8OjbyBIVFRQLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tUmVxdWVzdElkIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZGEgcmVxdWlzacOnw6NvIEhUVFAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFByb21lc3NhIGNvbSBvIGlkZW50aWZpY2Fkb3IgZGEgcmVxdWlzacOnw6NvIEhUVFAgY3JpYWRhLlxuICAgKi9cbiAgaW5zZXJ0SHR0cENvbW1hbmQocmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhLCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyKHsgcmVxdWVzdERhdGEgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmh0dHBDb21tYW5kKHJlcXVlc3REYXRhLCBjdXN0b21SZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVmZXR1YSB1bWEgY2hhbWFkYSBuYSBBUEkgZG8gc2Vydmlkb3IgcGFyYSByZWFsaXphciBhIGNhcmdhIGluaWNpYWwgZG9zIGRhZG9zLiBEZXZlIHNlciBjaGFtYWRvIGFwZW5hcyB1bWEgdmV6XG4gICAqIG5hIGFwbGljYcOnw6NvLCBhcMOzcyBhIHByZXBhcmHDp8OjbyBkb3MgKnNjaGVtYXMqIHJlYWxpemFkYSBhdHJhdsOpcyBkbyBtw6l0b2RvIGBQb1N5bmNTZXJ2aWNlLnByZXBhcmUoKWAuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FyZ2EgaW5pY2lhbCBkb3MgZGFkb3NdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxBcnJheTx7IGVudGl0eTogc3RyaW5nLCBkYXRhOiBBcnJheTxhbnk+IH0+Pn0gT2JzZXJ2YWJsZSBxdWUgbm90aWZpY2Fyw6EgcXVhbmRvIGFcbiAgICogY2FyZ2EgaW5pY2lhbCBmb3IgY29uY2x1w61kYS5cbiAgICovXG4gIGxvYWREYXRhKCk6IE9ic2VydmFibGU8QXJyYXk8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogQXJyYXk8YW55PiB9Pj4ge1xuICAgIGNvbnN0IGxvYWRzOiBBcnJheTxPYnNlcnZhYmxlPHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4+ID0gW107XG4gICAgdGhpcy5zY2hlbWFzLmZvckVhY2goZWwgPT4gbG9hZHMucHVzaCh0aGlzLmxvYWRFbnRpdHlEYXRhKGVsKSkpO1xuICAgIHJldHVybiBmb3JrSm9pbihsb2Fkcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzcG9uc8OhdmVsIHBvciBub3RpZmljYXIgc2VtcHJlIHF1ZSBob3V2ZXIgc2luY3JvbmlzbW8uXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gTm90aWZpY2HDp8OjbyBww7NzLXNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGFueT59IE9ic2VydmFibGUgcXVlIMOpIGRpc3BhcmFkbyBhIGNhZGEgc2luY3JvbmlzbW8gcmVhbGl6YWRvLlxuICAgKi9cbiAgb25TeW5jKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKCF0aGlzLmV2ZW50U3ViKSB7XG4gICAgICB0aGlzLmV2ZW50U3ViID0gT2JzZXJ2YWJsZS5jcmVhdGUoZSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRTdWI7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYSBhIGFwbGljYcOnw6NvIGNyaWFuZG8gb3Mgc2NoZW1hcyBlIGFwbGljYSBhcyBjb25maWd1cmHDp8O1ZXMuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gUHJlcGFyYW5kbyBhIGFwbGljYcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxQb1N5bmNTY2hlbWE+fSBzY2hlbWFzIExpc3RhIGRlICpzY2hlbWFzKiBhIHNlcmVtIHByZXBhcmFkb3MuXG4gICAqIEBwYXJhbSB7UG9TeW5jQ29uZmlnfSBjb25maWcgQ29uZmlndXJhw6fDtWVzIGFkaWNpb25haXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgYXBsaWNhw6fDo28gZXN0aXZlciBwcmVwYXJhZGEgcGFyYSBhIHV0aWxpemHDp8OjbyBkbyBgcG8tc3luY2AuXG4gICAqL1xuICBwcmVwYXJlKHNjaGVtYXM6IEFycmF5PFBvU3luY1NjaGVtYT4sIGNvbmZpZz86IFBvU3luY0NvbmZpZyk6IFByb21pc2U8YW55PiB7XG4gICAgdmFsaWRhdGVBcnJheSh7IHNjaGVtYXMgfSk7XG5cbiAgICBjb25zdCBkZWZhdWx0U3luY0NvbmZpZzogUG9TeW5jQ29uZmlnID0ge1xuICAgICAgdHlwZTogdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKS50eXBlLFxuICAgICAgcGVyaW9kOiA2MCxcbiAgICAgIGRhdGFUcmFuc2Zvcm06IG5ldyBQb0RhdGFNZXNzYWdlKClcbiAgICB9O1xuXG4gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hcztcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0U3luY0NvbmZpZztcbiAgICB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtID0gdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybSB8fCBuZXcgUG9EYXRhTWVzc2FnZSgpO1xuICAgIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5jb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcbiAgICB0aGlzLnJlYWN0aXZlU3luYygpO1xuICAgIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5vblNhdmVEYXRhKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luYygpKTtcblxuICAgIHJldHVybiB0aGlzLnNhdmVTY2hlbWFzKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4ge1xuICAgICAgICB0aGlzLm1vZGVsc1tzY2hlbWEubmFtZV0gPSBuZXcgUG9FbnRpdHkodGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLCBzY2hlbWEsIHRoaXMucG9TY2hlbWFTZXJ2aWNlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1bSBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcyBxdWUgZXNwZXJhIGEgc2luY3Jvbml6YcOnw6NvLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBpZEV2ZW50U291cmNpbmcgSWRlbnRpZmljYWRvciBkbyBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gbyBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcyDDqSByZW1vdmlkby5cbiAgICovXG4gIHJlbW92ZUl0ZW1PZlN5bmMoaWRFdmVudFNvdXJjaW5nOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UucmVtb3ZlRXZlbnRTb3VyY2luZ0l0ZW0oaWRFdmVudFNvdXJjaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWVudmlhIG9zIGNvbWFuZG9zIHBlbmRlbnRlcyBuYSBmaWxhIChpbmNsdXPDo28sIGFsdGVyYcOnw6NvIGUgZXhjbHVzw6NvKSBlIGJ1c2NhIG5vdm9zIGRhZG9zIGRvIHNlcnZpZG9yLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSByZXNvbHZlIG8gc2luY3JvbmlzbW8gZGlzcGFyYWRvLlxuICAgKi9cbiAgcmVzdW1lU3luYygpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5jYW5TeW5jKCkpIHtcbiAgICAgIGNvbnN0IGZpbmlzaFN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLmZpbmlzaFN5bmNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFN5bmNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhcmEgbyBzaW5jcm9uaXNtbyBlbnZpYW5kbyBvcyBldmVudG9zIHBlbmRlbnRlcyAoaW5jbHVzw6NvLCBhbHRlcmHDp8OjbyBlIGV4Y2x1c8OjbykgZSBidXNjYW5kbyBub3ZvcyBkYWRvcyBkbyBzZXJ2aWRvci5cbiAgICpcbiAgICogTyBzaW5jcm9uaXNtbyBzb21lbnRlIHNlcsOhIGV4ZWN1dGFkbyBkZXBvaXMgcXVlIG8gYWNlc3NvIGEgYmFzZSBkZSBkYWRvcyBsb2NhbCBkbyBkaXNwb3NpdGl2byBmb3IgbGliZXJhZGEuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gU2luY3Jvbml6YcOnw6NvIG1hbnVhbF0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIG8gc2luY3JvbmlzbW8gZm9yIGZpbmFsaXphZG8uXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY2FuU3luYygpKSB7XG4gICAgICB0aGlzLnN0YXJ0U3luYygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY1NlbmQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnN5bmNHZXQoKTtcblxuICAgICAgICBpZiAodGhpcy5lbWl0dGVyKSB7XG4gICAgICAgICAgdGhpcy5lbWl0dGVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmluaXNoU3luYygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zeW5jRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhblN5bmMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3luY2luZyB8fCAhdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0aW9uID0gdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICAgIGNvbnN0IGlzQ29uZmlndXJlZENvbm5lY3Rpb24gPSB0aGlzLmNvbmZpZyAmJiBjdXJyZW50Q29ubmVjdGlvbi50eXBlID09PSB0aGlzLmNvbmZpZy50eXBlO1xuICAgICAgY29uc3QgaXNDb25maWdJbmNsdWRlc1R5cGUgPVxuICAgICAgICB0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy50eXBlIGluc3RhbmNlb2YgQXJyYXkgJiYgdGhpcy5jb25maWcudHlwZS5pbmNsdWRlcyhjdXJyZW50Q29ubmVjdGlvbi50eXBlKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnRDb25uZWN0aW9uLnN0YXR1cyAmJiAoIXRoaXMuY29uZmlnIHx8IGlzQ29uZmlndXJlZENvbm5lY3Rpb24gfHwgaXNDb25maWdJbmNsdWRlc1R5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMudGltZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5zdGFydFRpbWVyKHRoaXMuY29uZmlnLnBlcmlvZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZmluaXNoU3luY1N1YmplY3QubmV4dChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T25lUGFnZShzY2hlbWE6IFBvU3luY1NjaGVtYSwgcGFnZTogbnVtYmVyID0gMSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlU2l6ZVBhcmFtTmFtZSgpfT0ke3NjaGVtYS5wYWdlU2l6ZX1gKTtcbiAgICBwYXJhbXMucHVzaChgJHt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldFBhZ2VQYXJhbU5hbWUoKX09JHtwYWdlfWApO1xuXG4gICAgY29uc3QgdXJsID0gYCR7UG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuR0VUKX0/JHtwYXJhbXMuam9pbignJicpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5wb0h0dHBDbGllbnQuZ2V0KHVybCkucGlwZShcbiAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5KSxcbiAgICAgIG1lcmdlTWFwKHJlc3BvbnNlQm9keSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICByZXNwb25zZUJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgaXRlbS5TeW5jSW5zZXJ0ZWREYXRlVGltZSA9IG5vdztcbiAgICAgICAgICBpdGVtLlN5bmNVcGRhdGVkRGF0ZVRpbWUgPSBudWxsO1xuICAgICAgICAgIGl0ZW0uU3luY0V4Y2x1c2lvbkRhdGVUaW1lID0gbnVsbDtcbiAgICAgICAgICBpdGVtLlN5bmNEZWxldGVkID0gZmFsc2U7XG4gICAgICAgICAgaXRlbS5TeW5jU3RhdHVzID0gMjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZVxuICAgICAgICAgIC51cGRhdGVBbGwoc2NoZW1hLCByZXNwb25zZUJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXSlcbiAgICAgICAgICAudGhlbigoKSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRW50aXR5RGF0YShzY2hlbWE6IFBvU3luY1NjaGVtYSk6IE9ic2VydmFibGU8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogQXJyYXk8YW55PiB9PiB7XG4gICAgbGV0IHBhZ2UgPSAxO1xuICAgIHJldHVybiB0aGlzLmdldE9uZVBhZ2Uoc2NoZW1hLCBwYWdlKS5waXBlKFxuICAgICAgZXhwYW5kKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLnRyYW5zZm9ybShkYXRhKTtcbiAgICAgICAgY29uc3QgaGFzTmV4dCA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uaGFzTmV4dCgpO1xuICAgICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldE9uZVBhZ2Uoc2NoZW1hLCArK3BhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBvZigpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHJlZHVjZShcbiAgICAgICAgKGFjYywgb2JqKSA9PiB7XG4gICAgICAgICAgYWNjLmRhdGEgPSBhY2MuZGF0YS5jb25jYXQob2JqW3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBlbnRpdHk6IHNjaGVtYS5uYW1lLFxuICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFjdGl2ZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5wb05ldHdvcmtTZXJ2aWNlLm9uQ2hhbmdlKCkuc3Vic2NyaWJlKG5ldHdvcmtTdGF0dXMgPT4ge1xuICAgICAgaWYgKG5ldHdvcmtTdGF0dXMuc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmNvbmZpZy5wZXJpb2QpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlU2NoZW1hcygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN0b3JhZ2VTY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+ID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLmdldEFsbCgpO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiAoc2NoZW1hLmxhc3RTeW5jID0gUG9TY2hlbWFVdGlsLmdldExhc3RTeW5jKHN0b3JhZ2VTY2hlbWFzLCBzY2hlbWEubmFtZSkpKTtcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLnNhdmVBbGwodGhpcy5zY2hlbWFzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY2luZyA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGltZXIocGVyaW9kKTogdm9pZCB7XG4gICAgaWYgKHBlcmlvZCAmJiB0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHRoaXMudGltZXIgPSB0aW1lcihwZXJpb2QgKiAxMDAwKTtcbiAgICAgIHRoaXMuY3JlYXRlU3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5maW5pc2hTeW5jKCk7XG4gIH1cbn1cbiJdfQ==
|