UNPKG

@orbit/jsonapi

Version:

JSON:API support for Orbit.

445 lines 61.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JSONAPISerializer = void 0; const utils_1 = require("@orbit/utils"); const core_1 = require("@orbit/core"); const serializers_1 = require("@orbit/serializers"); const jsonapi_serializer_builder_1 = require("./serializers/jsonapi-serializer-builder"); const jsonapi_serializers_1 = require("./serializers/jsonapi-serializers"); const { deprecate } = core_1.Orbit; /** * @deprecated since v0.17, remove in v0.18 */ class JSONAPISerializer { constructor(settings) { deprecate("The 'JSONAPISerializer' class has deprecated. Use 'serializerFor' instead."); const { schema, keyMap, serializers } = settings; let serializerFor; if (serializers) { serializerFor = (type) => serializers[type]; } const serializerSettingsFor = (0, serializers_1.buildSerializerSettingsFor)({ settingsByType: { [jsonapi_serializers_1.JSONAPISerializers.ResourceField]: { serializationOptions: { inflectors: ['dasherize'] } }, [jsonapi_serializers_1.JSONAPISerializers.ResourceType]: { serializationOptions: { inflectors: ['pluralize', 'dasherize'] } } } }); this._schema = schema; this._keyMap = keyMap; this._serializerFor = (0, jsonapi_serializer_builder_1.buildJSONAPISerializerFor)({ schema, keyMap, serializerFor, serializerSettingsFor }); } get schema() { return this._schema; } get keyMap() { return this._keyMap; } get serializerFor() { return this._serializerFor; } /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ resourceKey(type) { return 'id'; } resourceType(type) { return this.typeSerializer.serialize(type); } resourceRelationship(type, relationship) { return this.fieldSerializer.serialize(relationship, { type }); } resourceAttribute(type, attr) { return this.fieldSerializer.serialize(attr, { type }); } resourceIdentity(identity) { return { type: this.resourceType(identity.type), id: this.resourceId(identity.type, identity.id) }; } resourceIds(type, ids) { return ids.map((id) => this.resourceId(type, id)); } resourceId(type, id) { let resourceKey = this.resourceKey(type); if (resourceKey === 'id') { return id; } else if (this.keyMap) { return this.keyMap.idToKey(type, resourceKey, id); } else { throw new core_1.Assertion(`A keyMap is required to determine an id from the key '${resourceKey}'`); } } recordId(type, resourceId) { let resourceKey = this.resourceKey(type); if (resourceKey === 'id') { return resourceId; } let existingId; if (this.keyMap) { existingId = this.keyMap.keyToId(type, resourceKey, resourceId); if (existingId) { return existingId; } } else { throw new core_1.Assertion(`A keyMap is required to determine an id from the key '${resourceKey}'`); } return this._generateNewId(type, resourceKey, resourceId); } recordType(resourceType) { return this.typeSerializer.deserialize(resourceType); } recordIdentity(resourceIdentity) { let type = this.recordType(resourceIdentity.type); let id = this.recordId(type, resourceIdentity.id); return { type, id }; } recordAttribute(type, resourceAttribute) { return this.fieldSerializer.deserialize(resourceAttribute); } recordRelationship(type, resourceRelationship) { return this.fieldSerializer.deserialize(resourceRelationship); } serialize(document) { let data = document.data; return { data: Array.isArray(data) ? this.serializeRecords(data) : this.serializeRecord(data) }; } serializeAtomicOperationsDocument(document) { return { 'atomic:operations': this.serializeAtomicOperations(document.operations) }; } serializeAtomicOperations(operations) { return operations.map((operation) => this.serializeAtomicOperation(operation)); } serializeAtomicOperation(operation) { return this.atomicOperationSerializer.serialize(operation); } serializeRecords(records) { return records.map((record) => this.serializeRecord(record)); } serializeRecord(record) { const resource = { type: this.resourceType(record.type) }; const model = this._schema.getModel(record.type); this.serializeId(resource, record, model); this.serializeAttributes(resource, record, model); this.serializeRelationships(resource, record, model); return resource; } serializeIdentity(record) { return { type: this.resourceType(record.type), id: this.resourceId(record.type, record.id) }; } serializeId(resource, record, /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ model) { let value = this.resourceId(record.type, record.id); if (value !== undefined) { resource.id = value; } } serializeAttributes(resource, record, model) { if (record.attributes) { Object.keys(record.attributes).forEach((attr) => { this.serializeAttribute(resource, record, attr, model); }); } } serializeAttribute(resource, record, attr, model) { var _a, _b, _c; let value = (_a = record.attributes) === null || _a === void 0 ? void 0 : _a[attr]; if (value === undefined) { return; } const attrOptions = (_b = model.attributes) === null || _b === void 0 ? void 0 : _b[attr]; if (attrOptions === undefined) { return; } const serializer = this.serializerFor(attrOptions.type || 'unknown'); if (serializer) { const serializationOptions = (_c = attrOptions.serialization) !== null && _c !== void 0 ? _c : attrOptions.serializationOptions; if (attrOptions.serializationOptions !== undefined) { deprecate(`The attribute '${attr}' for '${record.type}' has been assigned \`serializationOptions\` in the schema. Use \`serialization\` instead.`); } value = value === null ? null : serializer.serialize(value, serializationOptions); } (0, utils_1.deepSet)(resource, ['attributes', this.resourceAttribute(record.type, attr)], value); } serializeRelationships(resource, record, model) { if (record.relationships) { Object.keys(record.relationships).forEach((relationship) => { this.serializeRelationship(resource, record, relationship, model); }); } } serializeRelationship(resource, record, relationship, model) { var _a, _b; const value = (_a = record.relationships) === null || _a === void 0 ? void 0 : _a[relationship].data; if (value === undefined) { return; } if (((_b = model.relationships) === null || _b === void 0 ? void 0 : _b[relationship]) === undefined) { return; } let data; if (Array.isArray(value)) { data = value.map((id) => this.resourceIdentity(id)); } else if (value !== null) { data = this.resourceIdentity(value); } else { data = null; } const resourceRelationship = this.resourceRelationship(record.type, relationship); (0, utils_1.deepSet)(resource, ['relationships', resourceRelationship, 'data'], data); } deserialize(document, options) { let result; let data; if (Array.isArray(document.data)) { let primaryRecords = options === null || options === void 0 ? void 0 : options.primaryRecords; if (primaryRecords) { data = document.data.map((entry, i) => { return this.deserializeResource(entry, primaryRecords === null || primaryRecords === void 0 ? void 0 : primaryRecords[i]); }); } else { data = document.data.map((entry) => this.deserializeResource(entry)); } } else if (document.data !== null) { let primaryRecord = options && options.primaryRecord; if (primaryRecord) { data = this.deserializeResource(document.data, primaryRecord); } else { data = this.deserializeResource(document.data); } } else { data = null; } result = { data }; if (document.included) { result.included = document.included.map((e) => this.deserializeResource(e)); } if (document.links) { result.links = document.links; } if (document.meta) { result.meta = document.meta; } return result; } deserializeAtomicOperationsDocument(document) { const result = { operations: this.deserializeAtomicOperations(document['atomic:operations']) }; if (document.links) { result.links = document.links; } if (document.meta) { result.meta = document.meta; } return result; } deserializeAtomicOperations(operations) { return operations.map((operation) => this.deserializeAtomicOperation(operation)); } deserializeAtomicOperation(operation) { return this.atomicOperationSerializer.deserialize(operation); } deserializeResourceIdentity(resource, primaryRecord) { let record; const type = this.recordType(resource.type); const resourceKey = this.resourceKey(type); if (resourceKey === 'id') { if (resource.id) { record = { type, id: resource.id }; } else { throw new core_1.Assertion(`A resource has been enountered without an id`); } } else if (this.keyMap) { let id; let keys; if (resource.id) { keys = { [resourceKey]: resource.id }; id = (primaryRecord && primaryRecord.id) || this.keyMap.idFromKeys(type, keys) || this.schema.generateId(type); } else { id = (primaryRecord && primaryRecord.id) || this.schema.generateId(type); } record = { type, id }; if (keys) { record.keys = keys; } } else { throw new core_1.Assertion(`A keyMap is required to determine an id from the key '${resourceKey}'`); } if (this.keyMap) { this.keyMap.pushRecord(record); } return record; } deserializeResource(resource, primaryRecord) { const record = this.deserializeResourceIdentity(resource, primaryRecord); const model = this._schema.getModel(record.type); this.deserializeAttributes(record, resource, model); this.deserializeRelationships(record, resource, model); this.deserializeLinks(record, resource, model); this.deserializeMeta(record, resource, model); return record; } deserializeAttributes(record, resource, model) { if (resource.attributes) { Object.keys(resource.attributes).forEach((resourceAttribute) => { var _a; let attribute = this.recordAttribute(record.type, resourceAttribute); if (this.schema.hasAttribute(record.type, attribute)) { let value = (_a = resource.attributes) === null || _a === void 0 ? void 0 : _a[resourceAttribute]; if (value !== undefined) { this.deserializeAttribute(record, attribute, value, model); } } }); } } deserializeAttribute(record, attr, value, model) { var _a, _b; record.attributes = record.attributes || {}; if (value !== undefined && value !== null) { const attrOptions = (_a = model.attributes) === null || _a === void 0 ? void 0 : _a[attr]; if (attrOptions === undefined) { return; } const serializer = this.serializerFor((attrOptions === null || attrOptions === void 0 ? void 0 : attrOptions.type) || 'unknown'); if (serializer) { const deserializationOptions = (_b = attrOptions.deserialization) !== null && _b !== void 0 ? _b : attrOptions.deserializationOptions; if (attrOptions.deserializationOptions !== undefined) { deprecate(`The attribute '${attr}' for '${record.type}' has been assigned \`deserializationOptions\` in the schema. Use \`deserialization\` instead.`); } value = serializer.deserialize(value, deserializationOptions); } } record.attributes[attr] = value; } deserializeRelationships(record, resource, model) { if (resource.relationships) { Object.keys(resource.relationships).forEach((resourceRel) => { var _a; let relationship = this.recordRelationship(record.type, resourceRel); if (this.schema.hasRelationship(record.type, relationship)) { let value = (_a = resource.relationships) === null || _a === void 0 ? void 0 : _a[resourceRel]; if (value !== undefined) { this.deserializeRelationship(record, relationship, value, model); } } }); } } deserializeRelationship(record, relationship, value, /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ model) { let resourceData = value.data; if (resourceData !== undefined) { let data; if (resourceData === null) { data = null; } else if (Array.isArray(resourceData)) { data = resourceData.map((resourceIdentity) => this.recordIdentity(resourceIdentity)); } else { data = this.recordIdentity(resourceData); } (0, utils_1.deepSet)(record, ['relationships', relationship, 'data'], data); } let { links, meta } = value; if (links !== undefined) { (0, utils_1.deepSet)(record, ['relationships', relationship, 'links'], links); } if (meta !== undefined) { (0, utils_1.deepSet)(record, ['relationships', relationship, 'meta'], meta); } } deserializeLinks(record, resource, /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ model) { if (resource.links) { record.links = resource.links; } } deserializeMeta(record, resource, /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ model) { if (resource.meta) { record.meta = resource.meta; } } // Protected / Private get resourceSerializer() { return this.serializerFor(jsonapi_serializers_1.JSONAPISerializers.Resource); } get identitySerializer() { return this.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceIdentity); } get typeSerializer() { return this.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceType); } get fieldSerializer() { return this.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceField); } get atomicOperationSerializer() { return this.serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceAtomicOperation); } _generateNewId(type, keyName, keyValue) { let id = this.schema.generateId(type); if (this.keyMap) { this.keyMap.pushRecord({ type, id, keys: { [keyName]: keyValue } }); } else { throw new core_1.Assertion(`A keyMap is required to generate ids for resource type '${type}'`); } return id; } } exports.JSONAPISerializer = JSONAPISerializer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2pzb25hcGktc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBNkM7QUFDN0Msc0NBQStDO0FBUy9DLG9EQUs0QjtBQWU1Qix5RkFBcUY7QUFDckYsMkVBQXVFO0FBSXZFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxZQUFLLENBQUM7QUFhNUI7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQVk1QixZQUFZLFFBQW1DO1FBQzdDLFNBQVMsQ0FDUCw0RUFBNEUsQ0FDN0UsQ0FBQztRQUVGLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUVqRCxJQUFJLGFBQTBDLENBQUM7UUFDL0MsSUFBSSxXQUFXLEVBQUU7WUFDZixhQUFhLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyRDtRQUNELE1BQU0scUJBQXFCLEdBQUcsSUFBQSx3Q0FBMEIsRUFBQztZQUN2RCxjQUFjLEVBQUU7Z0JBQ2QsQ0FBQyx3Q0FBa0IsQ0FBQyxhQUFhLENBQUMsRUFBRTtvQkFDbEMsb0JBQW9CLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtpQkFDcEQ7Z0JBQ0QsQ0FBQyx3Q0FBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDakMsb0JBQW9CLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUU7aUJBQ2pFO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUEsc0RBQXlCLEVBQUM7WUFDOUMsTUFBTTtZQUNOLE1BQU07WUFDTixhQUFhO1lBQ2IscUJBQXFCO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsV0FBVyxDQUFDLElBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVk7UUFDdkIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQVcsQ0FBQztJQUN2RCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBd0IsRUFBRSxZQUFvQjtRQUNqRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFXLENBQUM7SUFDMUUsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQXdCLEVBQUUsSUFBWTtRQUN0RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFXLENBQUM7SUFDbEUsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQXdCO1FBQ3ZDLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3RDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBYTtRQUNyQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZLEVBQUUsRUFBVTtRQUNqQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpDLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUN4QixPQUFPLEVBQUUsQ0FBQztTQUNYO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsTUFBTSxJQUFJLGdCQUFTLENBQ2pCLHlEQUF5RCxXQUFXLEdBQUcsQ0FDeEUsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDdkMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFFRCxJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksVUFBVSxFQUFFO2dCQUNkLE9BQU8sVUFBVSxDQUFDO2FBQ25CO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sSUFBSSxnQkFBUyxDQUNqQix5REFBeUQsV0FBVyxHQUFHLENBQ3hFLENBQUM7U0FDSDtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxVQUFVLENBQUMsWUFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQVcsQ0FBQztJQUNqRSxDQUFDO0lBRUQsY0FBYyxDQUFDLGdCQUFrQztRQUMvQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFZLEVBQUUsaUJBQXlCO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQVcsQ0FBQztJQUN2RSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBWSxFQUFFLG9CQUE0QjtRQUMzRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFXLENBQUM7SUFDMUUsQ0FBQztJQUVELFNBQVMsQ0FBQyxRQUF3QjtRQUNoQyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBRXpCLE9BQU87WUFDTCxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBMkIsQ0FBQztnQkFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBeUIsQ0FBQztTQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUVELGlDQUFpQyxDQUMvQixRQUFrQztRQUVsQyxPQUFPO1lBQ0wsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7U0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRCx5QkFBeUIsQ0FDdkIsVUFBNkI7UUFFN0IsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUN6QyxDQUFDO0lBQ0osQ0FBQztJQUVELHdCQUF3QixDQUN0QixTQUEwQjtRQUUxQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQTRCO1FBQzNDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxlQUFlLENBQUMsTUFBeUI7UUFDdkMsTUFBTSxRQUFRLEdBQWE7WUFDekIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNyQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFckQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQXlCO1FBQ3pDLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3BDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FDVCxRQUFrQixFQUNsQixNQUFzQjtJQUN0QixnRUFBZ0U7SUFDaEUsS0FBc0I7UUFFdEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsUUFBUSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLFFBQWtCLEVBQ2xCLE1BQXlCLEVBQ3pCLEtBQXNCO1FBRXRCLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQ2hCLFFBQWtCLEVBQ2xCLE1BQXlCLEVBQ3pCLElBQVksRUFDWixLQUFzQjs7UUFFdEIsSUFBSSxLQUFLLEdBQVEsTUFBQSxNQUFNLENBQUMsVUFBVSwwQ0FBRyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsT0FBTztTQUNSO1FBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBQSxLQUFLLENBQUMsVUFBVSwwQ0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDN0IsT0FBTztTQUNSO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksVUFBVSxFQUFFO1lBQ2QsTUFBTSxvQkFBb0IsR0FDeEIsTUFBQSxXQUFXLENBQUMsYUFBYSxtQ0FBSyxXQUFtQixDQUFDLG9CQUFvQixDQUFDO1lBRXpFLElBQUssV0FBbUIsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7Z0JBQzNELFNBQVMsQ0FDUCxrQkFBa0IsSUFBSSxVQUFVLE1BQU0sQ0FBQyxJQUFJLDRGQUE0RixDQUN4SSxDQUFDO2FBQ0g7WUFFRCxLQUFLO2dCQUNILEtBQUssS0FBSyxJQUFJO29CQUNaLENBQUMsQ0FBQyxJQUFJO29CQUNOLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBQSxlQUFPLEVBQ0wsUUFBUSxFQUNSLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3pELEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUVELHNCQUFzQixDQUNwQixRQUFrQixFQUNsQixNQUF5QixFQUN6QixLQUFzQjtRQUV0QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUNuQixRQUFrQixFQUNsQixNQUF5QixFQUN6QixZQUFvQixFQUNwQixLQUFzQjs7UUFFdEIsTUFBTSxLQUFLLEdBQUcsTUFBQSxNQUFNLENBQUMsYUFBYSwwQ0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDO1FBRXhELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUEsTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRyxZQUFZLENBQUMsTUFBSyxTQUFTLEVBQUU7WUFDckQsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUM7UUFFVCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxHQUFJLEtBQTBCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMzRTthQUFNLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQXVCLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ3BELE1BQU0sQ0FBQyxJQUFJLEVBQ1gsWUFBWSxDQUNiLENBQUM7UUFFRixJQUFBLGVBQU8sRUFBQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELFdBQVcsQ0FDVCxRQUEwQixFQUMxQixPQUFxQztRQUVyQyxJQUFJLE1BQXNCLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUM7UUFFVCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLElBQUksY0FBYyxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLENBQUM7WUFDN0MsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLElBQUksR0FBSSxRQUFRLENBQUMsSUFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3BELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxJQUFJLEdBQUksUUFBUSxDQUFDLElBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDakQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUNoQyxDQUFDO2FBQ0g7U0FDRjthQUFNLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDakMsSUFBSSxhQUFhLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDckQsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLFFBQVEsQ0FBQyxJQUFnQixFQUN6QixhQUFhLENBQ2QsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQWdCLENBQUMsQ0FBQzthQUM1RDtTQUNGO2FBQU07WUFDTCxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUVsQixJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDckIsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztTQUNIO1FBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMvQjtRQUVELElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtZQUNqQixNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsbUNBQW1DLENBQ2pDLFFBQTBDO1FBRTFDLE1BQU0sTUFBTSxHQUE2QjtZQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUMxQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FDOUI7U0FDRixDQUFDO1FBRUYsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMvQjtRQUVELElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtZQUNqQixNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsMkJBQTJCLENBQ3pCLFVBQXFDO1FBRXJDLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ2xDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsQ0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCwwQkFBMEIsQ0FDeEIsU0FBa0M7UUFFbEMsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCwyQkFBMkIsQ0FDekIsUUFBa0IsRUFDbEIsYUFBaUM7UUFFakMsSUFBSSxNQUF5QixDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDZixNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzthQUNwQztpQkFBTTtnQkFDTCxNQUFNLElBQUksZ0JBQVMsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsSUFBSSxFQUFVLENBQUM7WUFDZixJQUFJLElBQThCLENBQUM7WUFFbkMsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFO2dCQUNmLElBQUksR0FBRztvQkFDTCxDQUFDLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2lCQUMzQixDQUFDO2dCQUVGLEVBQUU7b0JBQ0EsQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7aUJBQU07Z0JBQ0wsRUFBRTtvQkFDQSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdkU7WUFFRCxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFFdEIsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDcEI7U0FDRjthQUFNO1lBQ0wsTUFBTSxJQUFJLGdCQUFTLENBQ2pCLHlEQUF5RCxXQUFXLEdBQUcsQ0FDeEUsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLFFBQWtCLEVBQ2xCLGFBQWlDO1FBRWpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekUsTUFBTSxLQUFLLEdBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHFCQUFxQixDQUNuQixNQUF5QixFQUN6QixRQUFrQixFQUNsQixLQUFzQjtRQUV0QixJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTs7Z0JBQzdELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7b0JBQ3BELElBQUksS0FBSyxHQUFHLE1BQUEsUUFBUSxDQUFDLFVBQVUsMENBQUcsaUJBQWlCLENBQUMsQ0FBQztvQkFDckQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO3dCQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzVEO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FDbEIsTUFBeUIsRUFDekIsSUFBWSxFQUNaLEtBQWMsRUFDZCxLQUFzQjs7UUFFdEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM1QyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFBLEtBQUssQ0FBQyxVQUFVLDBDQUFHLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtnQkFDN0IsT0FBTzthQUNSO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxJQUFJLEtBQUksU0FBUyxDQUFDLENBQUM7WUFDdEUsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsTUFBTSxzQkFBc0IsR0FDMUIsTUFBQSxXQUFXLENBQUMsZUFBZSxtQ0FDMUIsV0FBbUIsQ0FBQyxzQkFBc0IsQ0FBQztnQkFFOUMsSUFBSyxXQUFtQixDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTtvQkFDN0QsU0FBUyxDQUNQLGtCQUFrQixJQUFJLFVBQVUsTUFBTSxDQUFDLElBQUksZ0dBQWdHLENBQzVJLENBQUM7aUJBQ0g7Z0JBRUQsS0FBSyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDLENBQUM7YUFDL0Q7U0FDRjtRQUNELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3QkFBd0IsQ0FDdEIsTUFBeUIsRUFDekIsUUFBa0IsRUFDbEIsS0FBc0I7UUFFdEIsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFOztnQkFDMUQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3JFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRTtvQkFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBQSxRQUFRLENBQUMsYUFBYSwwQ0FBRyxXQUFXLENBQUMsQ0FBQztvQkFDbEQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO3dCQUN2QixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ2xFO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCx1QkFBdUIsQ0FDckIsTUFBeUIsRUFDekIsWUFBb0IsRUFDcEIsS0FBMkI7SUFDM0IsZ0VBQWdFO0lBQ2hFLEtBQXNCO1FBRXRCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFOUIsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDO1lBRVQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO2dCQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLEdBQUksWUFBbUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FDdEMsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQWdDLENBQUMsQ0FBQzthQUM5RDtZQUVELElBQUEsZUFBTyxFQUFDLE1BQU0sRUFBRSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDaEU7UUFFRCxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsSUFBQSxlQUFPLEVBQUMsTUFBTSxFQUFFLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRTtRQUVELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixJQUFBLGVBQU8sRUFBQyxNQUFNLEVBQUUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hFO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUNkLE1BQXlCLEVBQ3pCLFFBQWtCO0lBQ2xCLGdFQUFnRTtJQUNoRSxLQUFzQjtRQUV0QixJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDbEIsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FDYixNQUF5QixFQUN6QixRQUFrQjtJQUNsQixnRUFBZ0U7SUFDaEUsS0FBc0I7UUFFdEIsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxzQkFBc0I7SUFFdEIsSUFBYyxrQkFBa0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUN2Qix3Q0FBa0IsQ0FBQyxRQUFRLENBQ0MsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBYyxrQkFBa0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUN2Qix3Q0FBa0IsQ0FBQyxnQkFBZ0IsQ0FDQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFjLGNBQWM7UUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUN2Qix3Q0FBa0IsQ0FBQyxZQUFZLENBQ1osQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FDdkIsd0NBQWtCLENBQUMsYUFBYSxDQUNDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQWMseUJBQXlCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FDdkIsd0NBQWtCLENBQUMsdUJBQXVCLENBQ1AsQ0FBQztJQUN4QyxDQUFDO0lBRVMsY0FBYyxDQUN0QixJQUFZLEVBQ1osT0FBZSxFQUNmLFFBQWdCO1FBRWhCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUNyQixJQUFJO2dCQUNKLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFO29CQUNKLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUTtpQkFDcEI7YUFDRixDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsTUFBTSxJQUFJLGdCQUFTLENBQ2pCLDJEQUEyRCxJQUFJLEdBQUcsQ0FDbkUsQ0FBQztTQUNIO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0NBQ0Y7QUFwbkJELDhDQW9uQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWVwU2V0LCBEaWN0IH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IE9yYml0LCBBc3NlcnRpb24gfSBmcm9tICdAb3JiaXQvY29yZSc7XG5pbXBvcnQge1xuICBSZWNvcmRTY2hlbWEsXG4gIFJlY29yZEtleU1hcCxcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIE1vZGVsRGVmaW5pdGlvblxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQge1xuICBTZXJpYWxpemVyLFxuICBTZXJpYWxpemVyRm9yRm4sXG4gIFN0cmluZ1NlcmlhbGl6ZXIsXG4gIGJ1aWxkU2VyaWFsaXplclNldHRpbmdzRm9yXG59IGZyb20gJ0BvcmJpdC9zZXJpYWxpemVycyc7XG5pbXBvcnQge1xuICBSZXNvdXJjZSxcbiAgUmVzb3VyY2VEb2N1bWVudCxcbiAgUmVzb3VyY2VJZGVudGl0eSxcbiAgUmVzb3VyY2VSZWxhdGlvbnNoaXBcbn0gZnJvbSAnLi9yZXNvdXJjZS1kb2N1bWVudCc7XG5pbXBvcnQge1xuICBSZXNvdXJjZUF0b21pY09wZXJhdGlvbixcbiAgUmVjb3JkT3BlcmF0aW9uc0RvY3VtZW50XG59IGZyb20gJy4vcmVzb3VyY2Utb3BlcmF0aW9ucyc7XG5pbXBvcnQgeyBSZXNvdXJjZUF0b21pY09wZXJhdGlvbnNEb2N1bWVudCB9IGZyb20gJy4vcmVzb3VyY2Utb3BlcmF0aW9ucyc7XG5pbXBvcnQgeyBSZWNvcmREb2N1bWVudCB9IGZyb20gJy4vcmVjb3JkLWRvY3VtZW50JztcbmltcG9ydCB7IEpTT05BUElSZXNvdXJjZVNlcmlhbGl6ZXIgfSBmcm9tICcuL3NlcmlhbGl6ZXJzL2pzb25hcGktcmVzb3VyY2Utc2VyaWFsaXplcic7XG5pbXBvcnQgeyBKU09OQVBJUmVzb3VyY2VJZGVudGl0eVNlcmlhbGl6ZXIgfSBmcm9tICcuL3NlcmlhbGl6ZXJzL2pzb25hcGktcmVzb3VyY2UtaWRlbnRpdHktc2VyaWFsaXplcic7XG5pbXBvcnQgeyBidWlsZEpTT05BUElTZXJpYWxpemVyRm9yIH0gZnJvbSAnLi9zZXJpYWxpemVycy9qc29uYXBpLXNlcmlhbGl6ZXItYnVpbGRlcic7XG5pbXBvcnQgeyBKU09OQVBJU2VyaWFsaXplcnMgfSBmcm9tICcuL3NlcmlhbGl6ZXJzL2pzb25hcGktc2VyaWFsaXplcnMnO1xuaW1wb3J0IHsgSlNPTkFQSUF0b21pY09wZXJhdGlvblNlcmlhbGl6ZXIgfSBmcm9tICcuL3NlcmlhbGl6ZXJzL2pzb25hcGktYXRvbWljLW9wZXJhdGlvbi1zZXJpYWxpemVyJztcbmltcG9ydCB7IEpTT05BUElSZXNvdXJjZUZpZWxkU2VyaWFsaXplciB9IGZyb20gJy4vc2VyaWFsaXplcnMvanNvbmFwaS1yZXNvdXJjZS1maWVsZC1zZXJpYWxpemVyJztcblxuY29uc3QgeyBkZXByZWNhdGUgfSA9IE9yYml0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEpTT05BUElTZXJpYWxpemF0aW9uT3B0aW9ucyB7XG4gIHByaW1hcnlSZWNvcmQ/OiBJbml0aWFsaXplZFJlY29yZDtcbiAgcHJpbWFyeVJlY29yZHM/OiBJbml0aWFsaXplZFJlY29yZFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpTT05BUElTZXJpYWxpemVyU2V0dGluZ3Mge1xuICBzY2hlbWE6IFJlY29yZFNjaGVtYTtcbiAga2V5TWFwPzogUmVjb3JkS2V5TWFwO1xuICBzZXJpYWxpemVycz86IERpY3Q8U2VyaWFsaXplcj47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgc2luY2UgdjAuMTcsIHJlbW92ZSBpbiB2MC4xOFxuICovXG5leHBvcnQgY2xhc3MgSlNPTkFQSVNlcmlhbGl6ZXJcbiAgaW1wbGVtZW50c1xuICAgIFNlcmlhbGl6ZXI8XG4gICAgICBSZWNvcmREb2N1bWVudCxcbiAgICAgIFJlc291cmNlRG9jdW1lbnQsXG4gICAgICBKU09OQVBJU2VyaWFsaXphdGlvbk9wdGlvbnMsXG4gICAgICBKU09OQVBJU2VyaWFsaXphdGlvbk9wdGlvbnNcbiAgICA+IHtcbiAgcHJvdGVjdGVkIF9zY2hlbWE6IFJlY29yZFNjaGVtYTtcbiAgcHJvdGVjdGVkIF9rZXlNYXA/OiBSZWNvcmRLZXlNYXA7XG4gIHByb3RlY3RlZCBfc2VyaWFsaXplckZvcjogU2VyaWFsaXplckZvckZuO1xuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBKU09OQVBJU2VyaWFsaXplclNldHRpbmdzKSB7XG4gICAgZGVwcmVjYXRlKFxuICAgICAgXCJUaGUgJ0pTT05BUElTZXJpYWxpemVyJyBjbGFzcyBoYXMgZGVwcmVjYXRlZC4gVXNlICdzZXJpYWxpemVyRm9yJyBpbnN0ZWFkLlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2NoZW1hLCBrZXlNYXAsIHNlcmlhbGl6ZXJzIH0gPSBzZXR0aW5ncztcblxuICAgIGxldCBzZXJpYWxpemVyRm9yOiBTZXJpYWxpemVyRm9yRm4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlcmlhbGl6ZXJzKSB7XG4gICAgICBzZXJpYWxpemVyRm9yID0gKHR5cGU6IHN0cmluZykgPT4gc2VyaWFsaXplcnNbdHlwZV07XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZXJTZXR0aW5nc0ZvciA9IGJ1aWxkU2VyaWFsaXplclNldHRpbmdzRm9yKHtcbiAgICAgIHNldHRpbmdzQnlUeXBlOiB7XG4gICAgICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VGaWVsZF06IHtcbiAgICAgICAgICBzZXJpYWxpemF0aW9uT3B0aW9uczogeyBpbmZsZWN0b3JzOiBbJ2Rhc2hlcml6ZSddIH1cbiAgICAgICAgfSxcbiAgICAgICAgW0pTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZVR5cGVdOiB7XG4gICAgICAgICAgc2VyaWFsaXphdGlvbk9wdGlvbnM6IHsgaW5mbGVjdG9yczogWydwbHVyYWxpemUnLCAnZGFzaGVyaXplJ10gfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5fa2V5TWFwID0ga2V5TWFwO1xuICAgIHRoaXMuX3NlcmlhbGl6ZXJGb3IgPSBidWlsZEpTT05BUElTZXJpYWxpemVyRm9yKHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIGtleU1hcCxcbiAgICAgIHNlcmlhbGl6ZXJGb3IsXG4gICAgICBzZXJpYWxpemVyU2V0dGluZ3NGb3JcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzY2hlbWEoKTogUmVjb3JkU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZW1hO1xuICB9XG5cbiAgZ2V0IGtleU1hcCgpOiBSZWNvcmRLZXlNYXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9rZXlNYXA7XG4gIH1cblxuICBnZXQgc2VyaWFsaXplckZvcigpOiBTZXJpYWxpemVyRm9yRm4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVyRm9yO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICByZXNvdXJjZUtleSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnaWQnO1xuICB9XG5cbiAgcmVzb3VyY2VUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplKHR5cGUpIGFzIHN0cmluZztcbiAgfVxuXG4gIHJlc291cmNlUmVsYXRpb25zaGlwKHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVsYXRpb25zaGlwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpZWxkU2VyaWFsaXplci5zZXJpYWxpemUocmVsYXRpb25zaGlwLCB7IHR5cGUgfSkgYXMgc3RyaW5nO1xuICB9XG5cbiAgcmVzb3VyY2VBdHRyaWJ1dGUodHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBhdHRyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpZWxkU2VyaWFsaXplci5zZXJpYWxpemUoYXR0ciwgeyB0eXBlIH0pIGFzIHN0cmluZztcbiAgfVxuXG4gIHJlc291cmNlSWRlbnRpdHkoaWRlbnRpdHk6IFJlY29yZElkZW50aXR5KTogUmVzb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnJlc291cmNlVHlwZShpZGVudGl0eS50eXBlKSxcbiAgICAgIGlkOiB0aGlzLnJlc291cmNlSWQoaWRlbnRpdHkudHlwZSwgaWRlbnRpdHkuaWQpXG4gICAgfTtcbiAgfVxuXG4gIHJlc291cmNlSWRzKHR5cGU6IHN0cmluZywgaWRzOiBzdHJpbmdbXSk6IChzdHJpbmcgfCB1bmRlZmluZWQpW10ge1xuICAgIHJldHVybiBpZHMubWFwKChpZCkgPT4gdGhpcy5yZXNvdXJjZUlkKHR5cGUsIGlkKSk7XG4gIH1cblxuICByZXNvdXJjZUlkKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlc291cmNlS2V5ID0gdGhpcy5yZXNvdXJjZUtleSh0eXBlKTtcblxuICAgIGlmIChyZXNvdXJjZUtleSA9PT0gJ2lkJykge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5rZXlNYXApIHtcbiAgICAgIHJldHVybiB0aGlzLmtleU1hcC5pZFRvS2V5KHR5cGUsIHJlc291cmNlS2V5LCBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb24oXG4gICAgICAgIGBBIGtleU1hcCBpcyByZXF1aXJlZCB0byBkZXRlcm1pbmUgYW4gaWQgZnJvbSB0aGUga2V5ICcke3Jlc291cmNlS2V5fSdgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZElkKHR5cGU6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzb3VyY2VLZXkgPSB0aGlzLnJlc291cmNlS2V5KHR5cGUpO1xuXG4gICAgaWYgKHJlc291cmNlS2V5ID09PSAnaWQnKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VJZDtcbiAgICB9XG5cbiAgICBsZXQgZXhpc3RpbmdJZDtcbiAgICBpZiAodGhpcy5rZXlNYXApIHtcbiAgICAgIGV4aXN0aW5nSWQgPSB0aGlzLmtleU1hcC5rZXlUb0lkKHR5cGUsIHJlc291cmNlS2V5LCByZXNvdXJjZUlkKTtcbiAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0lkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uKFxuICAgICAgICBgQSBrZXlNYXAgaXMgcmVxdWlyZWQgdG8gZGV0ZXJtaW5lIGFuIGlkIGZyb20gdGhlIGtleSAnJHtyZXNvdXJjZUtleX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVOZXdJZCh0eXBlLCByZXNvdXJjZUtleSwgcmVzb3VyY2VJZCk7XG4gIH1cblxuICByZWNvcmRUeXBlKHJlc291cmNlVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50eXBlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNvdXJjZVR5cGUpIGFzIHN0cmluZztcbiAgfVxuXG4gIHJlY29yZElkZW50aXR5KHJlc291cmNlSWRlbnRpdHk6IFJlc291cmNlSWRlbnRpdHkpOiBSZWNvcmRJZGVudGl0eSB7XG4gICAgbGV0IHR5cGUgPSB0aGlzLnJlY29yZFR5cGUocmVzb3VyY2VJZGVudGl0eS50eXBlKTtcbiAgICBsZXQgaWQgPSB0aGlzLnJlY29yZElkKHR5cGUsIHJlc291cmNlSWRlbnRpdHkuaWQpO1xuICAgIHJldHVybiB7IHR5cGUsIGlkIH07XG4gIH1cblxuICByZWNvcmRBdHRyaWJ1dGUodHlwZTogc3RyaW5nLCByZXNvdXJjZUF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzb3VyY2VBdHRyaWJ1dGUpIGFzIHN0cmluZztcbiAgfVxuXG4gIHJlY29yZFJlbGF0aW9uc2hpcCh0eXBlOiBzdHJpbmcsIHJlc291cmNlUmVsYXRpb25zaGlwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpZWxkU2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNvdXJjZVJlbGF0aW9uc2hpcCkgYXMgc3RyaW5nO1xuICB9XG5cbiAgc2VyaWFsaXplKGRvY3VtZW50OiBSZWNvcmREb2N1bWVudCk6IFJlc291cmNlRG9jdW1lbnQge1xuICAgIGxldCBkYXRhID0gZG9jdW1lbnQuZGF0YTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBBcnJheS5pc0FycmF5KGRhdGEpXG4gICAgICAgID8gdGhpcy5zZXJpYWxpemVSZWNvcmRzKGRhdGEgYXMgSW5pdGlhbGl6ZWRSZWNvcmRbXSlcbiAgICAgICAgOiB0aGlzLnNlcmlhbGl6ZVJlY29yZChkYXRhIGFzIEluaXRpYWxpemVkUmVjb3JkKVxuICAgIH07XG4gIH1cblxuICBzZXJpYWxpemVBdG9taWNPcGVyYXRpb25zRG9jdW1lbnQoXG4gICAgZG9jdW1lbnQ6IFJlY29yZE9wZXJhdGlvbnNEb2N1bWVudFxuICApOiBSZXNvdXJjZUF0b21pY09wZXJhdGlvbnNEb2N1bWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdhdG9taWM6b3BlcmF0aW9ucyc6IHRoaXMuc2VyaWFsaXplQXRvbWljT3BlcmF0aW9ucyhkb2N1bWVudC5vcGVyYXRpb25zKVxuICAgIH07XG4gIH1cblxuICBzZXJpYWxpemVBdG9taWNPcGVyYXRpb25zKFxuICAgIG9wZXJhdGlvbnM6IFJlY29yZE9wZXJhdGlvbltdXG4gICk6IFJlc291cmNlQXRvbWljT3BlcmF0aW9uW10ge1xuICAgIHJldHVybiBvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PlxuICAgICAgdGhpcy5zZXJpYWxpemVBdG9taWNPcGVyYXRpb24ob3BlcmF0aW9uKVxuICAgICk7XG4gIH1cblxuICBzZXJpYWxpemVBdG9taWNPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb25cbiAgKTogUmVzb3VyY2VBdG9taWNPcGVyYXRpb24ge1xuICAgIHJldHVybiB0aGlzLmF0b21pY09wZXJhdGlvblNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wZXJhdGlvbik7XG4gIH1cblxuICBzZXJpYWxpemVSZWNvcmRzKHJlY29yZHM6IEluaXRpYWxpemVkUmVjb3JkW10pOiBSZXNvdXJjZVtdIHtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gdGhpcy5zZXJpYWxpemVSZWNvcmQocmVjb3JkKSk7XG4gIH1cblxuICBzZXJpYWxpemVSZWNvcmQocmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCk6IFJlc291cmNlIHtcbiAgICBjb25zdCByZXNvdXJjZTogUmVzb3VyY2UgPSB7XG4gICAgICB0eXBlOiB0aGlzLnJlc291cmNlVHlwZShyZWNvcmQudHlwZSlcbiAgICB9O1xuICAgIGNvbnN0IG1vZGVsOiBNb2RlbERlZmluaXRpb24gPSB0aGlzLl9zY2hlbWEuZ2V0TW9kZWwocmVjb3JkLnR5cGUpO1xuXG4gICAgdGhpcy5zZXJpYWxpemVJZChyZXNvdXJjZSwgcmVjb3JkLCBtb2RlbCk7XG4gICAgdGhpcy5zZXJpYWxpemVBdHRyaWJ1dGVzKHJlc291cmNlLCByZWNvcmQsIG1vZGVsKTtcbiAgICB0aGlzLnNlcmlhbGl6ZVJlbGF0aW9uc2hpcHMocmVzb3VyY2UsIHJlY29yZCwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgc2VyaWFsaXplSWRlbnRpdHkocmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCk6IFJlc291cmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy5yZXNvdXJjZVR5cGUocmVjb3JkLnR5cGUpLFxuICAgICAgaWQ6IHRoaXMucmVzb3VyY2VJZChyZWNvcmQudHlwZSwgcmVjb3JkLmlkKVxuICAgIH07XG4gIH1cblxuICBzZXJpYWxpemVJZChcbiAgICByZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnJlc291cmNlSWQocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc291cmNlLmlkID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc2VyaWFsaXplQXR0cmlidXRlcyhcbiAgICByZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCxcbiAgICBtb2RlbDogTW9kZWxEZWZpbml0aW9uXG4gICk6IHZvaWQge1xuICAgIGlmIChyZWNvcmQuYXR0cmlidXRlcykge1xuICAgICAgT2JqZWN0LmtleXMocmVjb3JkLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVBdHRyaWJ1dGUocmVzb3VyY2UsIHJlY29yZCwgYXR0ciwgbW9kZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2VyaWFsaXplQXR0cmlidXRlKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIGF0dHI6IHN0cmluZyxcbiAgICBtb2RlbDogTW9kZWxEZWZpbml0aW9uXG4gICk6IHZvaWQge1xuICAgIGxldCB2YWx1ZTogYW55ID0gcmVjb3JkLmF0dHJpYnV0ZXM/LlthdHRyXTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhdHRyT3B0aW9ucyA9IG1vZGVsLmF0dHJpYnV0ZXM/LlthdHRyXTtcbiAgICBpZiAoYXR0ck9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVyID0gdGhpcy5zZXJpYWxpemVyRm9yKGF0dHJPcHRpb25zLnR5cGUgfHwgJ3Vua25vd24nKTtcbiAgICBpZiAoc2VyaWFsaXplcikge1xuICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9wdGlvbnMgPVxuICAgICAgICBhdHRyT3B0aW9ucy5zZXJpYWxpemF0aW9uID8/IChhdHRyT3B0aW9ucyBhcyBhbnkpLnNlcmlhbGl6YXRpb25PcHRpb25zO1xuXG4gICAgICBpZiAoKGF0dHJPcHRpb25zIGFzIGFueSkuc2VyaWFsaXphdGlvbk9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXByZWNhdGUoXG4gICAgICAgICAgYFRoZSBhdHRyaWJ1dGUgJyR7YXR0cn0nIGZvciAnJHtyZWNvcmQudHlwZX0nIGhhcyBiZWVuIGFzc2lnbmVkIFxcYHNlcmlhbGl6YXRpb25PcHRpb25zXFxgIGluIHRoZSBzY2hlbWEuIFVzZSBcXGBzZXJpYWxpemF0aW9uXFxgIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9XG4gICAgICAgIHZhbHVlID09PSBudWxsXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXphdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgICBkZWVwU2V0KFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBbJ2F0dHJpYnV0ZXMnLCB0aGlzLnJlc291cmNlQXR0cmlidXRlKHJlY29yZC50eXBlLCBhdHRyKV0sXG4gICAgICB2YWx1ZVxuICAgICk7XG4gIH1cblxuICBzZXJpYWxpemVSZWxhdGlvbnNoaXBzKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIG1vZGVsOiBNb2RlbERlZmluaXRpb25cbiAgKTogdm9pZCB7XG4gICAgaWYgKHJlY29yZC5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICBPYmplY3Qua2V5cyhyZWNvcmQucmVsYXRpb25zaGlwcykuZm9yRWFjaCgocmVsYXRpb25zaGlwKSA9PiB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplUmVsYXRpb25zaGlwKHJlc291cmNlLCByZWNvcmQsIHJlbGF0aW9uc2hpcCwgbW9kZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2VyaWFsaXplUmVsYXRpb25zaGlwKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIG1vZGVsOiBNb2RlbERlZmluaXRpb25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmQucmVsYXRpb25zaGlwcz8uW3JlbGF0aW9uc2hpcF0uZGF0YTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtb2RlbC5yZWxhdGlvbnNoaXBzPy5bcmVsYXRpb25zaGlwXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGRhdGEgPSAodmFsdWUgYXMgUmVjb3JkSWRlbnRpdHlbXSkubWFwKChpZCkgPT4gdGhpcy5yZXNvdXJjZUlkZW50aXR5KGlkKSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgZGF0YSA9IHRoaXMucmVzb3VyY2VJZGVudGl0eSh2YWx1ZSBhcyBSZWNvcmRJZGVudGl0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlUmVsYXRpb25zaGlwID0gdGhpcy5yZXNvdXJjZVJlbGF0aW9uc2hpcChcbiAgICAgIHJlY29yZC50eXBlLFxuICAgICAgcmVsYXRpb25zaGlwXG4gICAgKTtcblxuICAgIGRlZXBTZXQocmVzb3VyY2UsIFsncmVsYXRpb25zaGlwcycsIHJlc291cmNlUmVsYXRpb25zaGlwLCAnZGF0YSddLCBkYXRhKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKFxuICAgIGRvY3VtZW50OiBSZXNvdXJjZURvY3VtZW50LFxuICAgIG9wdGlvbnM/OiBKU09OQVBJU2VyaWFsaXphdGlvbk9wdGlvbnNcbiAgKTogUmVjb3JkRG9jdW1lbnQge1xuICAgIGxldCByZXN1bHQ6IFJlY29yZERvY3VtZW50O1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZG9jdW1lbnQuZGF0YSkpIHtcbiAgICAgIGxldCBwcmltYXJ5UmVjb3JkcyA9IG9wdGlvbnM/LnByaW1hcnlSZWNvcmRzO1xuICAgICAgaWYgKHByaW1hcnlSZWNvcmRzKSB7XG4gICAgICAgIGRhdGEgPSAoZG9jdW1lbnQuZGF0YSBhcyBSZXNvdXJjZVtdKS5tYXAoKGVudHJ5LCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemVSZXNvdXJjZShlbnRyeSwgcHJpbWFyeVJlY29yZHM/LltpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IChkb2N1bWVudC5kYXRhIGFzIFJlc291cmNlW10pLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZVJlc291cmNlKGVudHJ5KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHByaW1hcnlSZWNvcmQgPSBvcHRpb25zICYmIG9wdGlvbnMucHJpbWFyeVJlY29yZDtcbiAgICAgIGlmIChwcml