@pebula/metap
Version:
meta-programming tools
129 lines • 14.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { targetStore, BaseSerializer, BaseDeserializer } from '@pebula/metap/internal';
import { Model } from '../decorators/model';
import { directMapper } from './direct-mapper';
import { serializeTargetMeta, deserializeTargetMeta } from './mapping/index';
var PlainObject = /** @class */ (function () {
function PlainObject() {
}
PlainObject = tslib_1.__decorate([
Model({ resName: 'InternalPlainObject' })
], PlainObject);
return PlainObject;
}());
/**
* @param {?} mapper
* @param {?} instanceOrTarget
* @param {?=} target
* @return {?}
*/
export function serialize(mapper, instanceOrTarget, target) {
if (mapper instanceof BaseSerializer) {
/** @type {?} */
var meta = targetStore.getTargetMeta(instanceOrTarget);
if (meta) {
return serializeTargetMeta(meta, mapper);
}
}
else {
/** @type {?} */
var meta = targetStore.getTargetMeta(target || instanceOrTarget.constructor);
if (meta) {
return serializeTargetMeta(meta, mapper.serializer(instanceOrTarget));
}
}
}
/**
* Automatically serialize an instance.
* This method will serialize an instance by first trying to locate the target using the `constructor` function.
* If a target is found and if it's a model target (i.e. ModelMetadata) it will try to get the mapper assign for that
* model.
*
* If no target, model or mapper was found it will use the fallbackMapper mapper provided, or `directMapper`
* if no fallback is provided provided.
*
* Note that when provided a fallback mapper, make sure it is able to serialize unknown targets. (plain objects)
* @param {?} instance
* @param {?=} fallbackMapper
* @return {?}
*/
export function autoSerialize(instance, fallbackMapper) {
/** @type {?} */
var tMeta = targetStore.getTargetMeta((/** @type {?} */ (instance.constructor)));
/** @type {?} */
var mapper = (tMeta && tMeta.hasModel && tMeta.model().mapper) || fallbackMapper || directMapper;
return serialize(mapper, instance);
}
/**
* @param {?} mapper
* @param {?=} plainObject
* @param {?=} type
* @param {?=} instance
* @return {?}
*/
export function deserialize(mapper, plainObject, type, instance) {
/** @type {?} */
var deserializer;
if (mapper instanceof BaseDeserializer) {
instance = plainObject;
deserializer = mapper;
}
else {
deserializer = mapper.deserializer(plainObject, type);
}
if (targetStore.hasTarget(deserializer.sourceType)) {
/** @type {?} */
var meta = targetStore.getTargetMeta(deserializer.sourceType);
/** @type {?} */
var result = instance || meta.model().factory(deserializer.isCollection);
deserializeTargetMeta(meta, deserializer, result);
return result;
}
else {
/** @type {?} */
var meta = targetStore.getTargetMeta(PlainObject);
/** @type {?} */
var result = instance || deserializer.isCollection ? [] : {};
deserializeTargetMeta(meta, deserializer, result, true);
return result;
}
}
/**
* Automatically de-serialize an object to/into an instance.
* This method will de-serialize an object by first trying to locate a model (i.e. ModelMetadata) for the target.
* If a model is found it will try to get the mapper assign for that model.
*
* If no model or mapper was found it will use the fallbackMapper mapper provided, or `directMapper`
* if no fallback is provided provided.
*
* @template T, Z
* @param {?} plainObject
* @param {?} type
* @param {?=} instance
* @param {?=} fallbackMapper
* @return {?}
*/
export function autoDeserialize(plainObject, type, instance, fallbackMapper) {
if (instance === void 0) { instance = null; }
/** @type {?} */
var tMeta = targetStore.getTargetMeta(type);
/** @type {?} */
var mapper = (tMeta && tMeta.hasModel && tMeta.model().mapper) || fallbackMapper || directMapper;
return deserialize(mapper, plainObject, type, instance);
}
/**
* Performs a deep clone to the resource using serialization and deserialization, which means that all rules apply (i.e \@Exclude)
*
* @template T
* @param {?} resource the resource (instance) to clone
* @param {?=} serializationFactory Optional, The [[SerializationFactory]] to use, defaults to [[directMapper]].
* @return {?}
*/
export function clone(resource, serializationFactory) {
return autoDeserialize(autoSerialize(resource, serializationFactory), (/** @type {?} */ (resource.constructor)), null, serializationFactory);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BwZWJ1bGEvbWV0YXAvIiwic291cmNlcyI6WyJsaWIvc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUF3QixXQUFXLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0csT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0lBRzFELENBQUM7SUFBZCxXQUFXO1FBRGhCLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO09BQ3BDLFdBQVcsQ0FBRztJQUFELGtCQUFDO0NBQUEsSUFBQTs7Ozs7OztBQVdwQixNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQTZDLEVBQUUsZ0JBQXFCLEVBQUUsTUFBeUI7SUFDdkgsSUFBSSxNQUFNLFlBQVksY0FBYyxFQUFFOztZQUM5QixJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4RCxJQUFJLElBQUksRUFBRTtZQUNSLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzFDO0tBQ0Y7U0FBTTs7WUFDQyxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQzlFLElBQUksSUFBSSxFQUFFO1lBQ1IsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7U0FDdkU7S0FDRjtBQUNILENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWFELE1BQU0sVUFBVSxhQUFhLENBQUMsUUFBYSxFQUFFLGNBQXFDOztRQUMxRSxLQUFLLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxtQkFBQSxRQUFRLENBQUMsV0FBVyxFQUFPLENBQUM7O1FBQzlELE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLElBQUksWUFBWTtJQUNsRyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckMsQ0FBQzs7Ozs7Ozs7QUFPRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQStDLEVBQUUsV0FBaUIsRUFBRSxJQUFVLEVBQUUsUUFBYzs7UUFDcEgsWUFBOEI7SUFDbEMsSUFBSSxNQUFNLFlBQVksZ0JBQWdCLEVBQUU7UUFDdEMsUUFBUSxHQUFHLFdBQVcsQ0FBQztRQUN2QixZQUFZLEdBQUcsTUFBTSxDQUFDO0tBQ3ZCO1NBQU07UUFDTCxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDdkQ7SUFFRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFOztZQUM1QyxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDOztZQUN6RCxNQUFNLEdBQVEsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUUvRSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7U0FBTTs7WUFDQyxJQUFJLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7O1lBQzdDLE1BQU0sR0FBUSxRQUFRLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25FLHFCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBV0QsTUFBTSxVQUFVLGVBQWUsQ0FBTyxXQUFnQixFQUFFLElBQXdCLEVBQUUsUUFBb0IsRUFBRSxjQUFxQztJQUEzRCx5QkFBQSxFQUFBLGVBQW9COztRQUM5RixLQUFLLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7O1FBQ3ZDLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLElBQUksWUFBWTtJQUNsRyxPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxRCxDQUFDOzs7Ozs7Ozs7QUFRRCxNQUFNLFVBQVUsS0FBSyxDQUFJLFFBQVcsRUFBRSxvQkFBMkM7SUFDL0UsT0FBTyxlQUFlLENBQ3BCLGFBQWEsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsRUFDN0MsbUJBQUEsUUFBUSxDQUFDLFdBQVcsRUFBTyxFQUMzQixJQUFJLEVBQ0osb0JBQW9CLENBQ3JCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tICdAcGVidWxhL3V0aWxzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25GYWN0b3J5LCB0YXJnZXRTdG9yZSwgQmFzZVNlcmlhbGl6ZXIsIEJhc2VEZXNlcmlhbGl6ZXIgfSBmcm9tICdAcGVidWxhL21ldGFwL2ludGVybmFsJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9tb2RlbCc7XG5pbXBvcnQgeyBkaXJlY3RNYXBwZXIgfSBmcm9tICcuL2RpcmVjdC1tYXBwZXInO1xuaW1wb3J0IHsgc2VyaWFsaXplVGFyZ2V0TWV0YSwgZGVzZXJpYWxpemVUYXJnZXRNZXRhIH0gZnJvbSAnLi9tYXBwaW5nL2luZGV4JztcblxuQE1vZGVsKHsgcmVzTmFtZTogJ0ludGVybmFsUGxhaW5PYmplY3QnIH0pXG5jbGFzcyBQbGFpbk9iamVjdCB7fVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIGNsYXNzIGluc3RhbmNlIGludG8gYSBwbGFpbiBvYmplY3QuXG4gKiBAcGFyYW0gbWFwcGVyXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSB0eXBlIG9wdGlvbmFsLCBpZiBub3Qgc2V0IHRha2VuIGZyb20gaW5zdGFuY2UuY29uc3RydWN0b3JcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemU8VCwgWj4oc2VyaWFsaXplcjogQmFzZVNlcmlhbGl6ZXIsIHRhcmdldDogWiAmIENvbnN0cnVjdG9yPFQ+KTogYW55O1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZTxULCBaPihtYXBwZXI6IFNlcmlhbGl6YXRpb25GYWN0b3J5LCBpbnN0YW5jZTogVCwgdGFyZ2V0PzogWiAmIENvbnN0cnVjdG9yPFQ+KTogYW55O1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShtYXBwZXI6IFNlcmlhbGl6YXRpb25GYWN0b3J5IHwgQmFzZVNlcmlhbGl6ZXIsIGluc3RhbmNlT3JUYXJnZXQ6IGFueSwgdGFyZ2V0PzogQ29uc3RydWN0b3I8YW55Pik6IGFueSB7XG4gIGlmIChtYXBwZXIgaW5zdGFuY2VvZiBCYXNlU2VyaWFsaXplcikge1xuICAgIGNvbnN0IG1ldGEgPSB0YXJnZXRTdG9yZS5nZXRUYXJnZXRNZXRhKGluc3RhbmNlT3JUYXJnZXQpO1xuICAgIGlmIChtZXRhKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplVGFyZ2V0TWV0YShtZXRhLCBtYXBwZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZXRhID0gdGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YSh0YXJnZXQgfHwgaW5zdGFuY2VPclRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVUYXJnZXRNZXRhKG1ldGEsIG1hcHBlci5zZXJpYWxpemVyKGluc3RhbmNlT3JUYXJnZXQpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IHNlcmlhbGl6ZSBhbiBpbnN0YW5jZS5cbiAqIFRoaXMgbWV0aG9kIHdpbGwgc2VyaWFsaXplIGFuIGluc3RhbmNlIGJ5IGZpcnN0IHRyeWluZyB0byBsb2NhdGUgdGhlIHRhcmdldCB1c2luZyB0aGUgYGNvbnN0cnVjdG9yYCBmdW5jdGlvbi5cbiAqIElmIGEgdGFyZ2V0IGlzIGZvdW5kIGFuZCBpZiBpdCdzIGEgbW9kZWwgdGFyZ2V0IChpLmUuIE1vZGVsTWV0YWRhdGEpIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgbWFwcGVyIGFzc2lnbiBmb3IgdGhhdFxuICogbW9kZWwuXG4gKlxuICogSWYgbm8gdGFyZ2V0LCBtb2RlbCBvciBtYXBwZXIgd2FzIGZvdW5kIGl0IHdpbGwgdXNlIHRoZSBmYWxsYmFja01hcHBlciBtYXBwZXIgcHJvdmlkZWQsIG9yIGBkaXJlY3RNYXBwZXJgXG4gKiBpZiBubyBmYWxsYmFjayBpcyBwcm92aWRlZCBwcm92aWRlZC5cbiAqXG4gKiBOb3RlIHRoYXQgd2hlbiBwcm92aWRlZCBhIGZhbGxiYWNrIG1hcHBlciwgbWFrZSBzdXJlIGl0IGlzIGFibGUgdG8gc2VyaWFsaXplIHVua25vd24gdGFyZ2V0cy4gKHBsYWluIG9iamVjdHMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvU2VyaWFsaXplKGluc3RhbmNlOiBhbnksIGZhbGxiYWNrTWFwcGVyPzogU2VyaWFsaXphdGlvbkZhY3RvcnkpOiBhbnkge1xuICBjb25zdCB0TWV0YSA9IHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEoaW5zdGFuY2UuY29uc3RydWN0b3IgYXMgYW55KTtcbiAgY29uc3QgbWFwcGVyID0gKHRNZXRhICYmIHRNZXRhLmhhc01vZGVsICYmIHRNZXRhLm1vZGVsKCkubWFwcGVyKSB8fCBmYWxsYmFja01hcHBlciB8fCBkaXJlY3RNYXBwZXI7XG4gIHJldHVybiBzZXJpYWxpemUobWFwcGVyLCBpbnN0YW5jZSk7XG59XG5cbi8qKlxuICogRGUtc2VyaWFsaXplIGEgcGxhaW4gb2JqZWN0IGludG8gYSB0aGUgcHJvdmlkZWQgaW5zdGFuY2Ugb3IsIHdoZW4gbm8gaW5zdGFuY2UgaXMgcHJvdmlkZWQsIHRvIGEgbmV3IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VCwgWiBleHRlbmRzIENvbnN0cnVjdG9yPFQ+PihkZXNlcmlhbGl6ZXI6IEJhc2VEZXNlcmlhbGl6ZXI8VCwgWj4sIGluc3RhbmNlPzogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VCwgWj4obWFwcGVyOiBTZXJpYWxpemF0aW9uRmFjdG9yeSwgcGxhaW5PYmplY3Q6IGFueSwgdHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+LCBpbnN0YW5jZT86IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKG1hcHBlcjogU2VyaWFsaXphdGlvbkZhY3RvcnkgfCBCYXNlRGVzZXJpYWxpemVyLCBwbGFpbk9iamVjdD86IGFueSwgdHlwZT86IGFueSwgaW5zdGFuY2U/OiBhbnkpOiBhbnkge1xuICBsZXQgZGVzZXJpYWxpemVyOiBCYXNlRGVzZXJpYWxpemVyO1xuICBpZiAobWFwcGVyIGluc3RhbmNlb2YgQmFzZURlc2VyaWFsaXplcikge1xuICAgIGluc3RhbmNlID0gcGxhaW5PYmplY3Q7XG4gICAgZGVzZXJpYWxpemVyID0gbWFwcGVyO1xuICB9IGVsc2Uge1xuICAgIGRlc2VyaWFsaXplciA9IG1hcHBlci5kZXNlcmlhbGl6ZXIocGxhaW5PYmplY3QsIHR5cGUpO1xuICB9XG5cbiAgaWYgKHRhcmdldFN0b3JlLmhhc1RhcmdldChkZXNlcmlhbGl6ZXIuc291cmNlVHlwZSkpIHtcbiAgICBjb25zdCBtZXRhID0gdGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YShkZXNlcmlhbGl6ZXIuc291cmNlVHlwZSk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBpbnN0YW5jZSB8fCBtZXRhLm1vZGVsKCkuZmFjdG9yeShkZXNlcmlhbGl6ZXIuaXNDb2xsZWN0aW9uKTtcblxuICAgIGRlc2VyaWFsaXplVGFyZ2V0TWV0YShtZXRhLCBkZXNlcmlhbGl6ZXIsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZXRhID0gdGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YShQbGFpbk9iamVjdCk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBpbnN0YW5jZSB8fCBkZXNlcmlhbGl6ZXIuaXNDb2xsZWN0aW9uID8gW10gOiB7fTtcbiAgICBkZXNlcmlhbGl6ZVRhcmdldE1ldGEobWV0YSwgZGVzZXJpYWxpemVyLCByZXN1bHQsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IGRlLXNlcmlhbGl6ZSBhbiBvYmplY3QgdG8vaW50byBhbiBpbnN0YW5jZS5cbiAqIFRoaXMgbWV0aG9kIHdpbGwgZGUtc2VyaWFsaXplIGFuIG9iamVjdCBieSBmaXJzdCB0cnlpbmcgdG8gbG9jYXRlIGEgbW9kZWwgKGkuZS4gTW9kZWxNZXRhZGF0YSkgZm9yIHRoZSB0YXJnZXQuXG4gKiBJZiBhIG1vZGVsIGlzIGZvdW5kIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgbWFwcGVyIGFzc2lnbiBmb3IgdGhhdCBtb2RlbC5cbiAqXG4gKiBJZiBubyBtb2RlbCBvciBtYXBwZXIgd2FzIGZvdW5kIGl0IHdpbGwgdXNlIHRoZSBmYWxsYmFja01hcHBlciBtYXBwZXIgcHJvdmlkZWQsIG9yIGBkaXJlY3RNYXBwZXJgXG4gKiBpZiBubyBmYWxsYmFjayBpcyBwcm92aWRlZCBwcm92aWRlZC5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvRGVzZXJpYWxpemU8VCwgWj4ocGxhaW5PYmplY3Q6IGFueSwgdHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+LCBpbnN0YW5jZTogYW55ID0gbnVsbCwgZmFsbGJhY2tNYXBwZXI/OiBTZXJpYWxpemF0aW9uRmFjdG9yeSk6IFQge1xuICBjb25zdCB0TWV0YSA9IHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEodHlwZSk7XG4gIGNvbnN0IG1hcHBlciA9ICh0TWV0YSAmJiB0TWV0YS5oYXNNb2RlbCAmJiB0TWV0YS5tb2RlbCgpLm1hcHBlcikgfHwgZmFsbGJhY2tNYXBwZXIgfHwgZGlyZWN0TWFwcGVyO1xuICByZXR1cm4gZGVzZXJpYWxpemUobWFwcGVyLCBwbGFpbk9iamVjdCwgdHlwZSwgaW5zdGFuY2UpO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgZGVlcCBjbG9uZSB0byB0aGUgcmVzb3VyY2UgdXNpbmcgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLCB3aGljaCBtZWFucyB0aGF0IGFsbCBydWxlcyBhcHBseSAoaS5lIEBFeGNsdWRlKVxuICpcbiAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgKGluc3RhbmNlKSB0byBjbG9uZVxuICogQHBhcmFtIHNlcmlhbGl6YXRpb25GYWN0b3J5IE9wdGlvbmFsLCBUaGUgW1tTZXJpYWxpemF0aW9uRmFjdG9yeV1dIHRvIHVzZSwgZGVmYXVsdHMgdG8gW1tkaXJlY3RNYXBwZXJdXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQ+KHJlc291cmNlOiBULCBzZXJpYWxpemF0aW9uRmFjdG9yeT86IFNlcmlhbGl6YXRpb25GYWN0b3J5KTogVCB7XG4gIHJldHVybiBhdXRvRGVzZXJpYWxpemUoXG4gICAgYXV0b1NlcmlhbGl6ZShyZXNvdXJjZSwgc2VyaWFsaXphdGlvbkZhY3RvcnkpLFxuICAgIHJlc291cmNlLmNvbnN0cnVjdG9yIGFzIGFueSxcbiAgICBudWxsLFxuICAgIHNlcmlhbGl6YXRpb25GYWN0b3J5XG4gICk7XG59XG4iXX0=