ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
201 lines • 19.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { BelongsToMetadata } from './symboles';
import { ResourceBase } from '../resource-base.model';
import { TypesStore } from '../types-store';
/**
* @param {?=} options
* @return {?}
*/
export function BelongsTo(options) {
if (options === void 0) { options = {}; }
return (/**
* @param {?} target
* @param {?} propertyName
* @return {?}
*/
function (target, propertyName) {
/** @type {?} */
var setupMetadata = (/**
* @return {?}
*/
function () {
/** @type {?} */
var belongsTos = Reflect.getMetadata(BelongsToMetadata, target) || [];
belongsTos.push({
propertyName: propertyName,
backendName: options.backendName || propertyName,
readonly: !!options.readonly,
sidepostable: !!options.sidepostable,
});
Reflect.defineMetadata(BelongsToMetadata, belongsTos, target);
});
/** @type {?} */
var getClass = (/**
* @param {?=} fromVal
* @return {?}
*/
function (fromVal) {
// const klass = options.class();
if (!Array.isArray(options.class)) {
return TypesStore.find(options.class);
}
/** @type {?} */
var klasses = options.class.map((/**
* @param {?} klass
* @return {?}
*/
function (klass) { return TypesStore.find(klass); }));
if (!fromVal) {
return klasses[0];
}
/** @type {?} */
var type = fromVal.type;
if (!type) {
throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!');
}
/** @type {?} */
var prop = klasses.find((/**
* @param {?} k
* @return {?}
*/
function (k) {
/** @type {?} */
var obj = new k();
return obj.type === type;
}));
if (!prop) {
throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!');
}
return prop;
});
/** @type {?} */
var updateSideload = (/**
* @param {?} propClass
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
function (propClass, oldValue, newValue) {
/** @type {?} */
var noOldId = !(oldValue && oldValue.id);
/** @type {?} */
var noNewId = !(newValue && newValue.id);
/** @type {?} */
var noIds = noOldId && noNewId;
/** @type {?} */
var eqIds = noOldId || noNewId ? false : oldValue.id === newValue.id;
// no ids: can't create a resource. This is a sideload!
if (noIds) {
return null;
}
// new don't exist: disassociate old from the resource
if (noNewId || newValue.deleteRelation) {
oldValue.disassociate();
return oldValue;
}
// same ids: can't update a resource. This is a sideload!
if (eqIds) {
/** @type {?} */
var type1 = oldValue.type;
/** @type {?} */
var type2 = newValue.type;
if (!type2 || type1 === type2) {
return oldValue;
}
}
// no old or different IDs: create new relationship
return ResourceBase.getAsRelationship(propClass, newValue, { method: 'update' });
});
/** @type {?} */
var updateSidepost = (/**
* @param {?} propClass
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
function (propClass, oldValue, newValue) {
/** @type {?} */
var oldHaveId = !!(oldValue && oldValue.id);
/** @type {?} */
var newHaveId = !!(newValue && newValue.id);
/** @type {?} */
var newHaveVal = !!(newValue && Object.keys(newValue).filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return key !== 'id' && key !== 'type'; })).length > 0);
/** @type {?} */
var eqIds = oldHaveId && newHaveId ? oldValue.id === newValue.id : false;
// equal ids: update old
if (eqIds) {
if (newValue.deleteRelation) {
oldValue.disassociate();
}
if (newValue.destroyRelation) {
oldValue.destroy();
}
oldValue.assign(newValue);
return oldValue;
}
// new have an id: change old by new
if (newHaveId) {
return ResourceBase.getAsRelationship(propClass, newValue, { method: 'update' });
}
// new don't have id but have value: create new
if (newHaveVal) {
return ResourceBase.getAsRelationship(propClass, newValue, { method: 'create' });
}
// new empty and old null: return null;
if (!oldValue) {
return null;
}
// new empty: disassociate old from the resource
oldValue.disassociate();
return oldValue;
});
/** @type {?} */
var getter = (/**
* @return {?}
*/
function () {
if (!this["_" + propertyName] && !this.modelSerialization) {
/** @type {?} */
var propClass = getClass();
this["_" + propertyName] = ResourceBase.getAsRelationship(propClass, (/** @type {?} */ ({})));
}
return this["_" + propertyName];
});
/** @type {?} */
var setter = (/**
* @param {?} newVal
* @return {?}
*/
function (newVal) {
/** @type {?} */
var propClass = getClass(newVal);
if (this.isModelInitialization()) {
this["_" + propertyName] = ResourceBase.getAsRelationship(propClass, newVal, { modelInit: true });
}
else {
/** @type {?} */
var oldVal = this["_" + propertyName];
this["_" + propertyName] = options.sidepostable ?
updateSidepost(propClass, oldVal, newVal) :
updateSideload(propClass, oldVal, newVal);
}
});
if (delete target[propertyName]) {
setupMetadata();
Object.defineProperty(target, propertyName, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVsb25ncy10by5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvZGVjb3JhdG9ycy9iZWxvbmdzLXRvLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRzVDLE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBMEM7SUFBMUMsd0JBQUEsRUFBQSxZQUEwQztJQUNoRTs7Ozs7SUFBTyxVQUFDLE1BQVcsRUFBRSxZQUFvQjs7WUFFakMsYUFBYTs7O1FBQUc7O2dCQUNkLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFFdkUsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDZCxZQUFZLGNBQUE7Z0JBQ1osV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksWUFBWTtnQkFDaEQsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFDNUIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWTthQUNyQyxDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUE7O1lBRUssUUFBUTs7OztRQUFHLFVBQUMsT0FBYTtZQUM3QixpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZDOztn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QU07Ozs7UUFBRyxVQUFTLE1BQVc7O2dCQUMzQixTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsTUFBSSxZQUFjLENBQUMsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQU0sU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQ3RHO2lCQUFNOztvQkFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQUksWUFBYyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsTUFBSSxZQUFjLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMvQixhQUFhLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUU7Z0JBQzFDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNO2dCQUNYLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbnNoaXBEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9vcHRpb24uaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBCZWxvbmdzVG9NZXRhZGF0YSB9IGZyb20gJy4vc3ltYm9sZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VCYXNlIH0gZnJvbSAnLi4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBUeXBlc1N0b3JlIH0gZnJvbSAnLi4vdHlwZXMtc3RvcmUnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBCZWxvbmdzVG8ob3B0aW9uczogUmVsYXRpb25zaGlwRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgY29uc3Qgc2V0dXBNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYmVsb25nc1RvcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoQmVsb25nc1RvTWV0YWRhdGEsIHRhcmdldCkgfHwgW107XG5cbiAgICAgICAgYmVsb25nc1Rvcy5wdXNoKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgYmFja2VuZE5hbWU6IG9wdGlvbnMuYmFja2VuZE5hbWUgfHwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlYWRvbmx5OiAhIW9wdGlvbnMucmVhZG9ubHksXG4gICAgICAgICAgc2lkZXBvc3RhYmxlOiAhIW9wdGlvbnMuc2lkZXBvc3RhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEJlbG9uZ3NUb01ldGFkYXRhLCBiZWxvbmdzVG9zLCB0YXJnZXQpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q2xhc3MgPSAoZnJvbVZhbD86IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zdCBrbGFzcyA9IG9wdGlvbnMuY2xhc3MoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuY2xhc3MpKSB7XG4gICAgICAgICAgcmV0dXJuIFR5cGVzU3RvcmUuZmluZChvcHRpb25zLmNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrbGFzc2VzID0gb3B0aW9ucy5jbGFzcy5tYXAoa2xhc3MgPT4gVHlwZXNTdG9yZS5maW5kKGtsYXNzKSk7XG5cbiAgICAgICAgaWYgKCFmcm9tVmFsKSB7IHJldHVybiBrbGFzc2VzWzBdOyB9XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmcm9tVmFsLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZiBSZXNvdXJjZUJhc2Ugb3Igc2hvdWxkIGhhdmUgYSB0eXBlIGF0dHJpYnV0ZSEnKTsgfVxuXG4gICAgICAgIGNvbnN0IHByb3AgPSBrbGFzc2VzLmZpbmQoayA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqID0gbmV3IGsoKTtcbiAgICAgICAgICByZXR1cm4gb2JqLnR5cGUgPT09IHR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3ApIHsgdGhyb3cgbmV3IEVycm9yKCdPYmplY3Qgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgUmVzb3VyY2VCYXNlIG9yIHNob3VsZCBoYXZlIGEgdHlwZSBhdHRyaWJ1dGUhJyk7IH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVTaWRlbG9hZCA9IChwcm9wQ2xhc3M6IGFueSwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBub09sZElkID0gIShvbGRWYWx1ZSAmJiBvbGRWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5vTmV3SWQgPSAhKG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlkKTtcbiAgICAgICAgY29uc3Qgbm9JZHMgPSBub09sZElkICYmIG5vTmV3SWQ7XG4gICAgICAgIGNvbnN0IGVxSWRzID0gbm9PbGRJZCB8fCBub05ld0lkID8gZmFsc2UgOiBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gbm8gaWRzOiBjYW4ndCBjcmVhdGUgYSByZXNvdXJjZS4gVGhpcyBpcyBhIHNpZGVsb2FkIVxuICAgICAgICBpZiAobm9JZHMpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgLy8gbmV3IGRvbid0IGV4aXN0OiBkaXNhc3NvY2lhdGUgb2xkIGZyb20gdGhlIHJlc291cmNlXG4gICAgICAgIGlmIChub05ld0lkIHx8IG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyByZXR1cm4gb2xkVmFsdWU7IH1cbiAgICAgICAgLy8gc2FtZSBpZHM6IGNhbid0IHVwZGF0ZSBhIHJlc291cmNlLiBUaGlzIGlzIGEgc2lkZWxvYWQhXG4gICAgICAgIGlmIChlcUlkcykge1xuICAgICAgICAgIGNvbnN0IHR5cGUxID0gb2xkVmFsdWUudHlwZTtcbiAgICAgICAgICBjb25zdCB0eXBlMiA9IG5ld1ZhbHVlLnR5cGU7XG4gICAgICAgICAgaWYgKCF0eXBlMiB8fCB0eXBlMSA9PT0gdHlwZTIpIHsgcmV0dXJuIG9sZFZhbHVlOyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gb2xkIG9yIGRpZmZlcmVudCBJRHM6IGNyZWF0ZSBuZXcgcmVsYXRpb25zaGlwXG4gICAgICAgIHJldHVybiBSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIG5ld1ZhbHVlLCB7bWV0aG9kOiAndXBkYXRlJ30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdXBkYXRlU2lkZXBvc3QgPSAocHJvcENsYXNzOiBhbnksIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkSGF2ZUlkID0gISEob2xkVmFsdWUgJiYgb2xkVmFsdWUuaWQpO1xuICAgICAgICBjb25zdCBuZXdIYXZlSWQgPSAhIShuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5ld0hhdmVWYWwgPSAhIShuZXdWYWx1ZSAmJiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdpZCcgJiYga2V5ICE9PSAndHlwZScpLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBlcUlkcyA9IG9sZEhhdmVJZCAmJiBuZXdIYXZlSWQgPyBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQgOiBmYWxzZTtcblxuICAgICAgICAvLyBlcXVhbCBpZHM6IHVwZGF0ZSBvbGRcbiAgICAgICAgaWYgKGVxSWRzKSB7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyB9XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlc3Ryb3lSZWxhdGlvbikgeyBvbGRWYWx1ZS5kZXN0cm95KCk7IH1cbiAgICAgICAgICBvbGRWYWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXcgaGF2ZSBhbiBpZDogY2hhbmdlIG9sZCBieSBuZXdcbiAgICAgICAgaWYgKG5ld0hhdmVJZCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ3VwZGF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZG9uJ3QgaGF2ZSBpZCBidXQgaGF2ZSB2YWx1ZTogY3JlYXRlIG5ld1xuICAgICAgICBpZiAobmV3SGF2ZVZhbCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ2NyZWF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZW1wdHkgYW5kIG9sZCBudWxsOiByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFvbGRWYWx1ZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICAvLyBuZXcgZW1wdHk6IGRpc2Fzc29jaWF0ZSBvbGQgZnJvbSB0aGUgcmVzb3VyY2VcbiAgICAgICAgb2xkVmFsdWUuZGlzYXNzb2NpYXRlKCk7XG4gICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSAmJiAhdGhpcy5tb2RlbFNlcmlhbGl6YXRpb24pIHtcbiAgICAgICAgICBjb25zdCBwcm9wQ2xhc3MgPSBnZXRDbGFzcygpO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywge30gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2V0dGVyID0gZnVuY3Rpb24obmV3VmFsOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcHJvcENsYXNzID0gZ2V0Q2xhc3MobmV3VmFsKTtcblxuICAgICAgICBpZiAodGhpcy5pc01vZGVsSW5pdGlhbGl6YXRpb24oKSkge1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywgbmV3VmFsLCB7bW9kZWxJbml0OiB0cnVlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IG9wdGlvbnMuc2lkZXBvc3RhYmxlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaWRlcG9zdChwcm9wQ2xhc3MsIG9sZFZhbCwgbmV3VmFsKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2lkZWxvYWQocHJvcENsYXNzLCBvbGRWYWwsIG5ld1ZhbCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChkZWxldGUgdGFyZ2V0W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgc2V0dXBNZXRhZGF0YSgpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBnZXQ6IGdldHRlcixcbiAgICAgICAgICBzZXQ6IHNldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4iXX0=