@ngqp/core
Version:
108 lines • 16.9 kB
JavaScript
import { Injectable } from '@angular/core';
import { DEFAULT_BOOLEAN_DESERIALIZER, DEFAULT_BOOLEAN_SERIALIZER, DEFAULT_NUMBER_DESERIALIZER, DEFAULT_NUMBER_SERIALIZER, DEFAULT_STRING_DESERIALIZER, DEFAULT_STRING_SERIALIZER } from './serializers';
import { LOOSE_IDENTITY_COMPARATOR } from './util';
import { MultiQueryParam, QueryParam, PartitionedQueryParam } from './model/query-param';
import { QueryParamGroup } from './model/query-param-group';
import * as i0 from "@angular/core";
function isMultiOpts(opts) {
return opts.multi === true;
}
/**
* Service to create parameters and groups.
*
* This service provides a simple API to create {@link QueryParamGroup} and {@link QueryParam}
* instances and is the recommended way to set them up.
*/
export class QueryParamBuilder {
/**
* Creates a new {@link QueryParamGroup}.
*
* This is the primary method to create a new group of parameters. Pass a list of
* {@link QueryParam} instances by using the `xxxParam` methods.
*
* @param queryParams List of {@link QueryParam}s keyed by a unique name.
* @param extras Additional parameters for this group, overriding global configuration.
* @returns The new {@link QueryParamGroup}.
*/
group(queryParams, extras = {}) {
// TODO Maybe we should first validate that no two queryParams defined the same "param".
return new QueryParamGroup(queryParams, extras);
}
/**
* Partition a query parameter into multiple others.
*
* Partitioning is useful if you need to bind a single form control to multiple query parameters.
* For example, consider a {@code <select>} which represents both a field to sort by and the
* direction to sort in. If you want to encode these two information on separate URL parameters,
* you can define a single query parameter that is partitioned into two others.
*
* @param queryParams The query parameters making up this partition.
* @param opts See {@link PartitionedQueryParamOpts}.
*/
partition(queryParams, opts) {
return new PartitionedQueryParam(queryParams, opts);
}
/**
* Create a new parameter of type `string`.
*
* See {@link QueryParamOpts}.
*/
stringParam(urlParam, opts = {}) {
opts = Object.assign({ serialize: DEFAULT_STRING_SERIALIZER, deserialize: DEFAULT_STRING_DESERIALIZER, compareWith: LOOSE_IDENTITY_COMPARATOR }, opts);
if (isMultiOpts(opts)) {
return new MultiQueryParam(urlParam, opts);
}
else {
return new QueryParam(urlParam, opts);
}
}
/**
* Create a new parameter of type `number`.
*
* See {@link QueryParamOpts}.
*/
numberParam(urlParam, opts = {}) {
opts = Object.assign({ serialize: DEFAULT_NUMBER_SERIALIZER, deserialize: DEFAULT_NUMBER_DESERIALIZER, compareWith: LOOSE_IDENTITY_COMPARATOR }, opts);
if (isMultiOpts(opts)) {
return new MultiQueryParam(urlParam, opts);
}
else {
return new QueryParam(urlParam, opts);
}
}
/**
* Create a new parameter of type `boolean`.
*
* See {@link QueryParamOpts}.
*/
booleanParam(urlParam, opts = {}) {
opts = Object.assign({ serialize: DEFAULT_BOOLEAN_SERIALIZER, deserialize: DEFAULT_BOOLEAN_DESERIALIZER, compareWith: LOOSE_IDENTITY_COMPARATOR }, opts);
if (isMultiOpts(opts)) {
return new MultiQueryParam(urlParam, opts);
}
else {
return new QueryParam(urlParam, opts);
}
}
/**
* Create a new parameter for a complex type.
*
* See {@link QueryParamOpts}.
*/
param(urlParam, opts = {}) {
opts = Object.assign({ compareWith: LOOSE_IDENTITY_COMPARATOR }, opts);
if (isMultiOpts(opts)) {
return new MultiQueryParam(urlParam, opts);
}
else {
return new QueryParam(urlParam, opts);
}
}
}
QueryParamBuilder.ɵprov = i0.ɵɵdefineInjectable({ factory: function QueryParamBuilder_Factory() { return new QueryParamBuilder(); }, token: QueryParamBuilder, providedIn: "root" });
QueryParamBuilder.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW0tYnVpbGRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3Byb2plY3RzL25ncXAvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvcXVlcnktcGFyYW0tYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNILDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQzVCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFRNUQsU0FBUyxXQUFXLENBQUksSUFBZ0Q7SUFDcEUsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBRTFCOzs7Ozs7Ozs7T0FTRztJQUNJLEtBQUssQ0FDUixXQUFzRyxFQUN0RyxTQUE4QyxFQUFFO1FBRWhELHdGQUF3RjtRQUN4RixPQUFPLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBaUJEOzs7Ozs7Ozs7O09BVUc7SUFDSSxTQUFTLENBQ1osV0FBbUUsRUFDbkUsSUFBcUM7UUFFckMsT0FBTyxJQUFJLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBTUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FDZCxRQUFnQixFQUNoQixPQUE2RCxFQUFFO1FBRS9ELElBQUksbUJBQ0EsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxXQUFXLEVBQUUsMkJBQTJCLEVBQ3hDLFdBQVcsRUFBRSx5QkFBeUIsSUFDbkMsSUFBSSxDQUNWLENBQUM7UUFFRixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixPQUFPLElBQUksZUFBZSxDQUFTLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBUyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7SUFDTCxDQUFDO0lBTUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FDZCxRQUFnQixFQUNoQixPQUE2RCxFQUFFO1FBRS9ELElBQUksbUJBQ0EsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxXQUFXLEVBQUUsMkJBQTJCLEVBQ3hDLFdBQVcsRUFBRSx5QkFBeUIsSUFDbkMsSUFBSSxDQUNWLENBQUM7UUFFRixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixPQUFPLElBQUksZUFBZSxDQUFTLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBUyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7SUFDTCxDQUFDO0lBTUQ7Ozs7T0FJRztJQUNJLFlBQVksQ0FDZixRQUFnQixFQUNoQixPQUErRCxFQUFFO1FBRWpFLElBQUksbUJBQ0EsU0FBUyxFQUFFLDBCQUEwQixFQUNyQyxXQUFXLEVBQUUsNEJBQTRCLEVBQ3pDLFdBQVcsRUFBRSx5QkFBeUIsSUFDbkMsSUFBSSxDQUNWLENBQUM7UUFFRixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixPQUFPLElBQUksZUFBZSxDQUFVLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBVSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbEQ7SUFDTCxDQUFDO0lBTUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FDUixRQUFnQixFQUNoQixPQUFtRCxFQUFFO1FBRXJELElBQUksbUJBQ0EsV0FBVyxFQUFFLHlCQUF5QixJQUNuQyxJQUFJLENBQ1YsQ0FBQztRQUVGLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLE9BQU8sSUFBSSxlQUFlLENBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pEO2FBQU07WUFDSCxPQUFPLElBQUksVUFBVSxDQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUM7Ozs7WUFoS0osVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBERUZBVUxUX0JPT0xFQU5fREVTRVJJQUxJWkVSLFxuICAgIERFRkFVTFRfQk9PTEVBTl9TRVJJQUxJWkVSLFxuICAgIERFRkFVTFRfTlVNQkVSX0RFU0VSSUFMSVpFUixcbiAgICBERUZBVUxUX05VTUJFUl9TRVJJQUxJWkVSLFxuICAgIERFRkFVTFRfU1RSSU5HX0RFU0VSSUFMSVpFUixcbiAgICBERUZBVUxUX1NUUklOR19TRVJJQUxJWkVSXG59IGZyb20gJy4vc2VyaWFsaXplcnMnO1xuaW1wb3J0IHsgTE9PU0VfSURFTlRJVFlfQ09NUEFSQVRPUiB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBSb3V0ZXJPcHRpb25zIH0gZnJvbSAnLi9yb3V0ZXItYWRhcHRlci9yb3V0ZXItYWRhcHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTXVsdGlRdWVyeVBhcmFtLCBRdWVyeVBhcmFtLCBQYXJ0aXRpb25lZFF1ZXJ5UGFyYW0gfSBmcm9tICcuL21vZGVsL3F1ZXJ5LXBhcmFtJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1Hcm91cCB9IGZyb20gJy4vbW9kZWwvcXVlcnktcGFyYW0tZ3JvdXAnO1xuaW1wb3J0IHtcbiAgICBNdWx0aVF1ZXJ5UGFyYW1PcHRzLFxuICAgIFBhcnRpdGlvbmVkUXVlcnlQYXJhbU9wdHMsXG4gICAgUXVlcnlQYXJhbUdyb3VwT3B0cyxcbiAgICBRdWVyeVBhcmFtT3B0c1xufSBmcm9tICcuL21vZGVsL3F1ZXJ5LXBhcmFtLW9wdHMnO1xuXG5mdW5jdGlvbiBpc011bHRpT3B0czxUPihvcHRzOiBRdWVyeVBhcmFtT3B0czxUPiB8IE11bHRpUXVlcnlQYXJhbU9wdHM8VD4pOiBvcHRzIGlzIE11bHRpUXVlcnlQYXJhbU9wdHM8VD4ge1xuICAgIHJldHVybiBvcHRzLm11bHRpID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFNlcnZpY2UgdG8gY3JlYXRlIHBhcmFtZXRlcnMgYW5kIGdyb3Vwcy5cbiAqXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgYSBzaW1wbGUgQVBJIHRvIGNyZWF0ZSB7QGxpbmsgUXVlcnlQYXJhbUdyb3VwfSBhbmQge0BsaW5rIFF1ZXJ5UGFyYW19XG4gKiBpbnN0YW5jZXMgYW5kIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gc2V0IHRoZW0gdXAuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJhbUJ1aWxkZXIge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUXVlcnlQYXJhbUdyb3VwfS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIHByaW1hcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBncm91cCBvZiBwYXJhbWV0ZXJzLiBQYXNzIGEgbGlzdCBvZlxuICAgICAqIHtAbGluayBRdWVyeVBhcmFtfSBpbnN0YW5jZXMgYnkgdXNpbmcgdGhlIGB4eHhQYXJhbWAgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWVyeVBhcmFtcyBMaXN0IG9mIHtAbGluayBRdWVyeVBhcmFtfXMga2V5ZWQgYnkgYSB1bmlxdWUgbmFtZS5cbiAgICAgKiBAcGFyYW0gZXh0cmFzIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBncm91cCwgb3ZlcnJpZGluZyBnbG9iYWwgY29uZmlndXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHtAbGluayBRdWVyeVBhcmFtR3JvdXB9LlxuICAgICAqL1xuICAgIHB1YmxpYyBncm91cChcbiAgICAgICAgcXVlcnlQYXJhbXM6IHsgWyBuYW1lOiBzdHJpbmcgXTogUXVlcnlQYXJhbTxhbnk+IHwgTXVsdGlRdWVyeVBhcmFtPGFueT4gfCBQYXJ0aXRpb25lZFF1ZXJ5UGFyYW08YW55PiB9LFxuICAgICAgICBleHRyYXM6IFJvdXRlck9wdGlvbnMgJiBRdWVyeVBhcmFtR3JvdXBPcHRzID0ge31cbiAgICApOiBRdWVyeVBhcmFtR3JvdXAge1xuICAgICAgICAvLyBUT0RPIE1heWJlIHdlIHNob3VsZCBmaXJzdCB2YWxpZGF0ZSB0aGF0IG5vIHR3byBxdWVyeVBhcmFtcyBkZWZpbmVkIHRoZSBzYW1lIFwicGFyYW1cIi5cbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeVBhcmFtR3JvdXAocXVlcnlQYXJhbXMsIGV4dHJhcyk7XG4gICAgfVxuXG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBwdWJsaWMgcGFydGl0aW9uPFQsIEcxPihcbiAgICAgICAgcXVlcnlQYXJhbXM6IFtRdWVyeVBhcmFtPEcxPiB8IE11bHRpUXVlcnlQYXJhbTxHMT5dLFxuICAgICAgICBvcHRzOiBQYXJ0aXRpb25lZFF1ZXJ5UGFyYW1PcHRzPFQsIFtHMV0+XG4gICAgKTogUGFydGl0aW9uZWRRdWVyeVBhcmFtPFQsIFtHMV0+O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIHBhcnRpdGlvbjxULCBHMSwgRzI+KFxuICAgICAgICBxdWVyeVBhcmFtczogW1F1ZXJ5UGFyYW08RzE+IHwgTXVsdGlRdWVyeVBhcmFtPEcxPiwgUXVlcnlQYXJhbTxHMj4gfCBNdWx0aVF1ZXJ5UGFyYW08RzI+XSxcbiAgICAgICAgb3B0czogUGFydGl0aW9uZWRRdWVyeVBhcmFtT3B0czxULCBbRzEsIEcyXT5cbiAgICApOiBQYXJ0aXRpb25lZFF1ZXJ5UGFyYW08VCwgW0cxLCBHMl0+O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIHBhcnRpdGlvbjxULCBHMSwgRzIsIEczPihcbiAgICAgICAgcXVlcnlQYXJhbXM6IFtRdWVyeVBhcmFtPEcxPiB8IE11bHRpUXVlcnlQYXJhbTxHMT4sIFF1ZXJ5UGFyYW08RzI+IHwgTXVsdGlRdWVyeVBhcmFtPEcyPiwgUXVlcnlQYXJhbTxHMz4gfCBNdWx0aVF1ZXJ5UGFyYW08RzM+XSxcbiAgICAgICAgb3B0czogUGFydGl0aW9uZWRRdWVyeVBhcmFtT3B0czxULCBbRzEsIEcyLCBHM10+XG4gICAgKTogUGFydGl0aW9uZWRRdWVyeVBhcmFtPFQsIFtHMSwgRzIsIEczXT47XG4gICAgLyoqXG4gICAgICogUGFydGl0aW9uIGEgcXVlcnkgcGFyYW1ldGVyIGludG8gbXVsdGlwbGUgb3RoZXJzLlxuICAgICAqXG4gICAgICogUGFydGl0aW9uaW5nIGlzIHVzZWZ1bCBpZiB5b3UgbmVlZCB0byBiaW5kIGEgc2luZ2xlIGZvcm0gY29udHJvbCB0byBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEZvciBleGFtcGxlLCBjb25zaWRlciBhIHtAY29kZSA8c2VsZWN0Pn0gd2hpY2ggcmVwcmVzZW50cyBib3RoIGEgZmllbGQgdG8gc29ydCBieSBhbmQgdGhlXG4gICAgICogZGlyZWN0aW9uIHRvIHNvcnQgaW4uIElmIHlvdSB3YW50IHRvIGVuY29kZSB0aGVzZSB0d28gaW5mb3JtYXRpb24gb24gc2VwYXJhdGUgVVJMIHBhcmFtZXRlcnMsXG4gICAgICogeW91IGNhbiBkZWZpbmUgYSBzaW5nbGUgcXVlcnkgcGFyYW1ldGVyIHRoYXQgaXMgcGFydGl0aW9uZWQgaW50byB0d28gb3RoZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIG1ha2luZyB1cCB0aGlzIHBhcnRpdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0cyBTZWUge0BsaW5rIFBhcnRpdGlvbmVkUXVlcnlQYXJhbU9wdHN9LlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0aXRpb248VCwgRyBleHRlbmRzIHVua25vd25bXT4oXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiAoUXVlcnlQYXJhbTxHW251bWJlcl0+IHwgTXVsdGlRdWVyeVBhcmFtPEdbbnVtYmVyXT4pW10sXG4gICAgICAgIG9wdHM6IFBhcnRpdGlvbmVkUXVlcnlQYXJhbU9wdHM8VCwgRz5cbiAgICApOiBQYXJ0aXRpb25lZFF1ZXJ5UGFyYW08VCwgRz4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvbmVkUXVlcnlQYXJhbShxdWVyeVBhcmFtcywgb3B0cyk7XG4gICAgfVxuXG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBwdWJsaWMgc3RyaW5nUGFyYW0odXJsUGFyYW06IHN0cmluZywgb3B0czogTXVsdGlRdWVyeVBhcmFtT3B0czxzdHJpbmc+KTogTXVsdGlRdWVyeVBhcmFtPHN0cmluZz47XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBwdWJsaWMgc3RyaW5nUGFyYW0odXJsUGFyYW06IHN0cmluZywgb3B0cz86IFF1ZXJ5UGFyYW1PcHRzPHN0cmluZz4pOiBRdWVyeVBhcmFtPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHBhcmFtZXRlciBvZiB0eXBlIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBRdWVyeVBhcmFtT3B0c30uXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ1BhcmFtKFxuICAgICAgICB1cmxQYXJhbTogc3RyaW5nLFxuICAgICAgICBvcHRzOiBRdWVyeVBhcmFtT3B0czxzdHJpbmc+IHwgTXVsdGlRdWVyeVBhcmFtT3B0czxzdHJpbmc+ID0ge31cbiAgICApOiBRdWVyeVBhcmFtPHN0cmluZz4gfCBNdWx0aVF1ZXJ5UGFyYW08c3RyaW5nPiB7XG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgICBzZXJpYWxpemU6IERFRkFVTFRfU1RSSU5HX1NFUklBTElaRVIsXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZTogREVGQVVMVF9TVFJJTkdfREVTRVJJQUxJWkVSLFxuICAgICAgICAgICAgY29tcGFyZVdpdGg6IExPT1NFX0lERU5USVRZX0NPTVBBUkFUT1IsXG4gICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpc011bHRpT3B0cyhvcHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVF1ZXJ5UGFyYW08c3RyaW5nPih1cmxQYXJhbSwgb3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5UGFyYW08c3RyaW5nPih1cmxQYXJhbSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHB1YmxpYyBudW1iZXJQYXJhbSh1cmxQYXJhbTogc3RyaW5nLCBvcHRzOiBNdWx0aVF1ZXJ5UGFyYW1PcHRzPG51bWJlcj4pOiBNdWx0aVF1ZXJ5UGFyYW08bnVtYmVyPjtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHB1YmxpYyBudW1iZXJQYXJhbSh1cmxQYXJhbTogc3RyaW5nLCBvcHRzPzogUXVlcnlQYXJhbU9wdHM8bnVtYmVyPik6IFF1ZXJ5UGFyYW08bnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgcGFyYW1ldGVyIG9mIHR5cGUgYG51bWJlcmAuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIFF1ZXJ5UGFyYW1PcHRzfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbnVtYmVyUGFyYW0oXG4gICAgICAgIHVybFBhcmFtOiBzdHJpbmcsXG4gICAgICAgIG9wdHM6IFF1ZXJ5UGFyYW1PcHRzPG51bWJlcj4gfCBNdWx0aVF1ZXJ5UGFyYW1PcHRzPG51bWJlcj4gPSB7fVxuICAgICk6IFF1ZXJ5UGFyYW08bnVtYmVyPiB8IE11bHRpUXVlcnlQYXJhbTxudW1iZXI+IHtcbiAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZTogREVGQVVMVF9OVU1CRVJfU0VSSUFMSVpFUixcbiAgICAgICAgICAgIGRlc2VyaWFsaXplOiBERUZBVUxUX05VTUJFUl9ERVNFUklBTElaRVIsXG4gICAgICAgICAgICBjb21wYXJlV2l0aDogTE9PU0VfSURFTlRJVFlfQ09NUEFSQVRPUixcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGlzTXVsdGlPcHRzKG9wdHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpUXVlcnlQYXJhbTxudW1iZXI+KHVybFBhcmFtLCBvcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJhbTxudW1iZXI+KHVybFBhcmFtLCBvcHRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIGJvb2xlYW5QYXJhbSh1cmxQYXJhbTogc3RyaW5nLCBvcHRzOiBNdWx0aVF1ZXJ5UGFyYW1PcHRzPGJvb2xlYW4+KTogTXVsdGlRdWVyeVBhcmFtPGJvb2xlYW4+O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIGJvb2xlYW5QYXJhbSh1cmxQYXJhbTogc3RyaW5nLCBvcHRzPzogUXVlcnlQYXJhbU9wdHM8Ym9vbGVhbj4pOiBRdWVyeVBhcmFtPGJvb2xlYW4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBwYXJhbWV0ZXIgb2YgdHlwZSBgYm9vbGVhbmAuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIFF1ZXJ5UGFyYW1PcHRzfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYm9vbGVhblBhcmFtKFxuICAgICAgICB1cmxQYXJhbTogc3RyaW5nLFxuICAgICAgICBvcHRzOiBRdWVyeVBhcmFtT3B0czxib29sZWFuPiB8IE11bHRpUXVlcnlQYXJhbU9wdHM8Ym9vbGVhbj4gPSB7fVxuICAgICk6IFF1ZXJ5UGFyYW08Ym9vbGVhbj4gfCBNdWx0aVF1ZXJ5UGFyYW08Ym9vbGVhbj4ge1xuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgc2VyaWFsaXplOiBERUZBVUxUX0JPT0xFQU5fU0VSSUFMSVpFUixcbiAgICAgICAgICAgIGRlc2VyaWFsaXplOiBERUZBVUxUX0JPT0xFQU5fREVTRVJJQUxJWkVSLFxuICAgICAgICAgICAgY29tcGFyZVdpdGg6IExPT1NFX0lERU5USVRZX0NPTVBBUkFUT1IsXG4gICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpc011bHRpT3B0cyhvcHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVF1ZXJ5UGFyYW08Ym9vbGVhbj4odXJsUGFyYW0sIG9wdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeVBhcmFtPGJvb2xlYW4+KHVybFBhcmFtLCBvcHRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIHBhcmFtPFQ+KHVybFBhcmFtOiBzdHJpbmcsIG9wdHM6IE11bHRpUXVlcnlQYXJhbU9wdHM8VD4pOiBNdWx0aVF1ZXJ5UGFyYW08VD47XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBwdWJsaWMgcGFyYW08VD4odXJsUGFyYW06IHN0cmluZywgb3B0cz86IFF1ZXJ5UGFyYW1PcHRzPFQ+KTogUXVlcnlQYXJhbTxUPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgcGFyYW1ldGVyIGZvciBhIGNvbXBsZXggdHlwZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgUXVlcnlQYXJhbU9wdHN9LlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJhbTxUPihcbiAgICAgICAgdXJsUGFyYW06IHN0cmluZyxcbiAgICAgICAgb3B0czogUXVlcnlQYXJhbU9wdHM8VD4gfCBNdWx0aVF1ZXJ5UGFyYW1PcHRzPFQ+ID0ge31cbiAgICApOiBRdWVyeVBhcmFtPFQ+IHwgTXVsdGlRdWVyeVBhcmFtPFQ+IHtcbiAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICAgIGNvbXBhcmVXaXRoOiBMT09TRV9JREVOVElUWV9DT01QQVJBVE9SLFxuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaXNNdWx0aU9wdHMob3B0cykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlRdWVyeVBhcmFtPFQ+KHVybFBhcmFtLCBvcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJhbTxUPih1cmxQYXJhbSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==